#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
}