2

我正在尝试使用 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;
};

我不知道该去哪里。任何意见,将不胜感激!

4

0 回答 0