feat: add navigator language detector

pull/90/head
moonrailgun 2 years ago
parent fab38b22e1
commit ce1d7eec99

@ -9,7 +9,7 @@ import {
initReactI18next,
} from 'react-i18next';
import { crc32 } from 'crc';
import { languageDetector } from './language';
import { defaultLanguage, languageDetector } from './language';
import { useState, useEffect } from 'react';
import HttpApi from 'i18next-http-backend'; // https://github.com/i18next/i18next-http-backend
@ -23,13 +23,13 @@ i18next
.use(HttpApi)
.use(initReactI18next)
.init({
fallbackLng: 'zh-CN',
fallbackLng: defaultLanguage,
load: 'currentOnly',
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json',
allowMultiLoading: false,
addPath: (...args: any[]) => {
console.log('缺少翻译:', ...args);
console.log('Lost translate:', ...args);
},
},
react: {

@ -5,17 +5,25 @@ import { AllowedLanguage, setLanguage as setI18NLanguage } from './index';
import { getStorage, useStorage } from '../manager/storage';
import { LANGUAGE_KEY } from '../utils/consts';
const defaultLanguage = 'zh-CN';
export const defaultLanguage = 'en-US';
function getNavigatorLanguage(): AllowedLanguage {
if (!navigator.language) {
return defaultLanguage;
}
return navigator.language.startsWith('zh') ? 'zh-CN' : 'en-US';
}
/**
*
* Get current language
*/
async function getLanguage(): Promise<string> {
return await getStorage().get(LANGUAGE_KEY, defaultLanguage);
return await getStorage().get(LANGUAGE_KEY, getNavigatorLanguage());
}
/**
* hook
* Current language management hook
*/
export function useLanguage() {
const [language, { save }] = useStorage<AllowedLanguage>(
@ -49,15 +57,15 @@ export function useLanguage() {
}
/**
*
* @param lang
* Storage language
* @param lang Language Code
*/
export async function saveLanguage(lang: string) {
await getStorage().save(LANGUAGE_KEY, lang);
}
/**
* i18n
* i18n language detection middleware
*/
export const languageDetector: LanguageDetectorAsyncModule = {
type: 'languageDetector',

Loading…
Cancel
Save