#react-native #localization #expo #i18n-js
#react-native #локализация #expo #i18n-js
Вопрос:
в настоящее время я пытаюсь реализовать локализацию в зависимости от системного языка устройства, но что-то работает не так, как требуется.
Я следовал точно такому же коду в документации expo, например. для кнопки, которая у меня есть, я продолжаю получать [MISSING "EN-GB.LOGIN" TRANSLATION]
вместо LOGIN
.
Вот мой код:
welcomeScreen.js
import * as Localization from 'expo-localization';
import i18n from 'i18n-js';
i18n.translations = {
en: { login: 'LOGIN'},
ar: { login: 'تسجيل الدخول'},
};
i18n.locale = Localization.locale;
i18n.fallbacks = true;
function WelcomeScreen() {
return (
<Button
title={i18n.t('login')}
/>
)}
Поэтому вместо кода, приведенного выше, я решил использовать это:
i18n.js
import i18n from 'i18n-js';
import * as Localization from 'expo-localization';
import ar from './locales/ar';
import en from './locales/en';
i18n.translations = {
'en': en,
'ar': ar,
};
i18n.locale = Localization.locale.search(/-|_/) !== -1?
Localization.locale.slice(0, 2): Localization.locale;
i18n.fallbacks = true;
export default i18n;
en.js
const en = {
'SignUp':{
SignUp:"Sign Up"
}}
ar.js
const ar = {
'SignUp':{
SignUp:"الاشتراك"
}}
SignUpScreen.js
import I18n from '../config/i18n';
function RegisterScreen(props) {
return(
<Button title={I18n.t('SignUp.SignUp')}
)}
Ответ №1:
Если вы попытаетесь console.log(Localization.locale)
… это не будет просто en
(ключ в i18n.translations
expected by i18n
) … это было бы в виде en_countryCode
… итак, вам нужно нарезать эту часть
i18n.locale = Localization.locale.search(/-|_/) !== -1
? Localization.locale.slice(0, 2)
: Localization.locale;
Комментарии:
1. Привет, спасибо, что перезвонили мне, попробую. Вы предлагаете мне использовать
import i18n from 'i18n-js'
приведенный выше код или эту библиотекуimport I18n from 'ex-react-native-i18n'
?2. Я лично использую
i18next
3. есть ли разница между ними?
4. если я решу использовать i18next, нужно ли мне вносить много изменений в мой код?
5. Я работаю в ejected-проектах… что немного отличается от expo-проектов (я имею в виду, что извлеченные проекты дают вам больше гибкости в выборе модулей)… Я бы сказал, выберите тот, который будет работать плавно с expo..