feat: add navigator language detector

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

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

@ -5,17 +5,25 @@ import { AllowedLanguage, setLanguage as setI18NLanguage } from './index';
import { getStorage, useStorage } from '../manager/storage'; import { getStorage, useStorage } from '../manager/storage';
import { LANGUAGE_KEY } from '../utils/consts'; 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> { 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() { export function useLanguage() {
const [language, { save }] = useStorage<AllowedLanguage>( const [language, { save }] = useStorage<AllowedLanguage>(
@ -49,15 +57,15 @@ export function useLanguage() {
} }
/** /**
* * Storage language
* @param lang * @param lang Language Code
*/ */
export async function saveLanguage(lang: string) { export async function saveLanguage(lang: string) {
await getStorage().save(LANGUAGE_KEY, lang); await getStorage().save(LANGUAGE_KEY, lang);
} }
/** /**
* i18n * i18n language detection middleware
*/ */
export const languageDetector: LanguageDetectorAsyncModule = { export const languageDetector: LanguageDetectorAsyncModule = {
type: 'languageDetector', type: 'languageDetector',

Loading…
Cancel
Save