i18n не будет корректно переводиться внутри массива или объекта в React Native

#react-native #i18n-js #react-native-localize

#react-native #i18n-js #react-native-localize

Вопрос:

Я пытаюсь использовать 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;
};
  

Я понятия не имею, куда идти дальше. Любые советы будут оценены!

Комментарии:

1. У меня такая же проблема, вы нашли решение?

Ответ №1:

Здесь та же проблема, обходной путь заключается в возврате массива / объекта из функции:

Не работает

 export const translations = [i18.t('path')]
  

Работает

 export function getTranslations() {
  const translations = [i18.t('path')]
  return translations
}