我遇到了在我的世博會應用程序中實例化I18n的問題。問題的TL; DR是需要翻譯的組件在之前呈現如何在React Native Expo應用程序中集成i18n-js
Expo.Util.getLocaleAsync()
返回並設置區域設置。我無法弄清楚如何最好地設置它。到目前爲止,我有一個I18n實例的文件,然後導入到我的應用程序的其他任何地方。它看起來是這樣的:
import Expo from 'expo';
import I18n from 'i18n-js';
import english from './resources/strings/en';
import danish from './resources/strings/da';
I18n.defaultLocale = 'en-GB';
I18n.fallbacks = true;
I18n.initAsync = async() => {
var locale = 'en-GB';
try {
locale = await Expo.Util.getCurrentLocaleAsync();
} catch (error) {
console.log('Error getting locale: ' + error);
}
I18n.locale = locale ? locale.replace(/_/, '-') : '';
};
I18n.translations = {
en: english,
da: danish,
};
export default I18n;
然後,在我的根應用程序組件,我做到以下幾點:從 './src/i18n'
進口的I18n;
class App extends React.Component {
async componentWillMount() {
console.log('Current locale (main1): ' + I18n.currentLocale());
try {
await I18n.initAsync();
} catch (error) {
console.log('Error setting locale ' + error);
}
console.log('Current locale (main2): ' + I18n.currentLocale());
}
render() {
return <AppContainer />;
}
}
Expo.registerRootComponent(App);
日誌聲明預期值 - 首先是默認語言環境,然後是main2中更新的語言環境。問題是在做出更改之前,第一個語言環境呈現了子視圖,我不明白爲什麼?
我想不出更好的方式來做到這一點,任何想法/提示將非常:-)
後一些更多的搜索,似乎使componentWillMount()一個同步並不一定等待等待返回,正如Flow爲我指示的那樣。請參閱此問題中的討論:https://github.com/facebook/flow/issues/1803。這意味着這種策略是不可行的,否則就不得不做。如何,我還不知道:-) – jhm