我正在尝试使用 i18n-js 将一些字符串翻译成其他语言。如果我的代码是普通代码,它可以工作。前任:
//Displays "Something" (no quotes) where I want it
<Text> translate("Something"); </Text>
但是如果我把它放在一个数组或对象中,然后再调用它,它就会停止工作并显示一条丢失的消息而不是我想要翻译的文本。前任:
const messages = {
something: translate("Something"),
// other translations...
}
// later on
// Displays "[missing "en.Something" translation]" (no quotes) where I want it
<Text> messages.something </Text>
以下是我的翻译功能代码,以及 i18n 的配置。我正在使用 lodash-memoize,但这与问题无关。我已经检查过传递给 i18n.t() 的文本是否相同(包括类型),无论它是在普通代码中还是在数组中,但它仍然没有返回正确的东西。我写了一些错误检查以避免在屏幕上显示丢失的消息,但这仍然不能解决它找不到翻译的问题。
export const translationGetters = ({
en: () => require('./translations/en.json'),
es: () => require('./translations/es.json')
});
export const translate = memoize(
(key, config) => {
text = i18n.t(key, config)
return text
},
(key, config) => (config ? key + JSON.stringify(config) : key)
);
export const setI18nConfig = () => {
// fallback if no available language fits
const fallback = { languageTag: "en", isRTL: false };
const { languageTag, isRTL } =
RNLocalize.findBestAvailableLanguage(Object.keys(translationGetters)) ||
fallback;
// clear translation cache
translate.cache.clear();
// update layout direction
I18nManager.forceRTL(isRTL);
// set i18n-js config
i18n.translations = { [languageTag]: translationGetters[languageTag]() };
i18n.locale = languageTag;
};
我不知道该去哪里。任何意见,将不胜感激!