我正在尝试从这两个选项中的一个检测区域设置: 1.如果用户选择了一个应用程序,至少打开一次;如果应用程序第一次打开,则为第一次使用设备区域设置。
我尝试使用这个指南和这个代码I18下一反应本机语言检测器。但没有人帮忙。我的i18n.js文件看起来如下:
import i18next from 'i18next';
import { AsyncStorage } from 'react-native';
(*) // import i18nextReactNative from 'i18next-react-native-language-detector';
import locale from 'react-native-locale-detector';
import en from './en';
import de from './de';
const languageDetector = {
init: Function.prototype,
type: 'languageDetector',
async: true, // flags below detection to be async
detect: () => AsyncStorage.getItem('APP:lnag')
.then((savedDataJSON) => {
const savedLocal = JSON.parse(savedDataJSON);
const selectLanguage = savedLocal || locale;
return selectLanguage;
}),
cacheUserLanguage: Function.prototype,
};
let translate;
i18next
(*)//.use(i18nextReactNative)
(**).use(languageDetector)
.init({
fallbackLng: 'en',
resources: {
en,
de,
},
react: {
wait: true,
},
// have a common namespace used around the full app
ns: ['common'],
defaultNS: 'common',
debug: true,
interpolation: {
escapeValue: false, // not needed for react!!
formatSeparator: ',',
format(value, format) {
if (format === 'uppercase') return value.toUpperCase();
return value;
},
},
}, (err, t) => {
translate = t;
});
export { translate as t };
export default i18next;但我得到了一个错误:TypeError: (0, _18n.t) is not a function。
当我使用默认的languageDetector时,从(*)行中删除注释,并注释自定义的languageDetector --它工作正常,但不是我想要的--总是采用设备区域设置
发布于 2018-04-03 06:14:32
我找到了一个解决办法:
import i18next from 'i18next';
import { AsyncStorage } from 'react-native';
import locale from 'react-native-locale-detector';
import en from './en';
import de from './de';
const languageDetector = {
init: Function.prototype,
type: 'languageDetector',
async: true, // flags below detection to be async
detect: async (callback) => {
const savedDataJSON = await AsyncStorage.getItem(STORAGE_KEY);
const lng = (savedDataJSON) ? JSON.parse(savedDataJSON): null;
const selectLanguage = lng || locale;
console.log('detect - selectLanguage:', selectLanguage);
callback(selectLanguage);
},
cacheUserLanguage: () => {}
}
let translate;
i18next
.use(languageDetector)
.init({
fallbackLng: 'en',
resources: { en, de},
react: { wait: false },
// have a common namespace used around the full app
ns: ['common'],
defaultNS: 'common',
debug: true,
interpolation: {
escapeValue: false, // not needed for react!!
formatSeparator: ',',
format(value, format) {
if (format === 'uppercase') return value.toUpperCase();
return value;
},
},
}, (err, t) => {
translate = t;
});
export { translate as t };
export default i18next;https://stackoverflow.com/questions/49612572
复制相似问题