【问题标题】:How to get current locale with i18next / react-i18next?如何使用 i18next / react-i18next 获取当前语言环境?
【发布时间】:2023-04-12 17:11:01
【问题描述】:

我是 react-native 的新手,我正在尝试从用户的设备获取当前语言环境。目前,我的应用程序有 2 个版本:法语和英语。当我更改后备语言时它工作正常,我确实有两个版本的应用程序。但我无法直接从设备更改语言。

我们可以手动更改,但是如果我们在设备上设置了法语,则无法直接获取法语。

import i18next from 'i18next';
import {initReactI18next} from 'react-i18next';

const languageDetector = {
  type: 'languageDetector',
  async: true,
  detect: cb => cb('en'),
  init: () => {},
  cacheUserLanguage: () => {},
};

i18next
  .use(languageDetector)
  .use(initReactI18next)
  .init({
    fallbackLng: 'en',
    debug: true,
    resources: {
      en: {
        translation: {
          hello: 'Hello world',
          change: 'Change language',
        },
      },
      sv: {
        translation: {
          hello: 'Hallo!',
          change: 'Goedemorgen',
        },
      },
    },
  });

export default i18next;

App.js

import React from 'react';
import { Text, View, TouchableOpacity } from 'react-native';
import { useTranslation } from 'react-i18next';
import './src/Traslations'


export default function App() {
  const { t, i18n } = useTranslation();
  return (
    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
      <Text style={{ fontSize: 20, marginBottom: 20 }}>{t('hello')}</Text>
      <Text style={{ fontSize: 20, marginBottom: 20 }}>{t('change')}</Text>

      <TouchableOpacity style={{backgroundColor: 'pink'}} onPress={() => i18n.changeLanguage(i18n.language === 'nl' ? 'en' : 'nl')}>
        <Text>{t('change')}</Text>
      </TouchableOpacity>
    </View>
  );
  }

【问题讨论】:

  • 您希望您的应用检测到device-lang 中的更改...并自动刷新app-lang...您是这个意思吗?
  • 您可以查看上面的 gif 图像吗?我希望你能从中得到灵感。
  • 能否将代码包含在您的I18n/index.js
  • 我没有明白你的意思,我已经包含了两种语言的代码
  • 您的i18n 代码,您可以在其中检测到语言更改并设置您的fallback 语言...

标签: javascript react-native react-i18next


【解决方案1】:

您的languageDetector 使用en 作为fallback 语言...

确保您在设备中选择的语言前缀sv i18n 设置中拥有的密钥。 ..

const languageDetector = {
  type: 'languageDetector',
  async: true,
  detect: cb => cb('en'), // <<---- here
  init: () => {},
  cacheUserLanguage: () => {},
};

改为

你想通过 current-device-lang

import { Platform, NativeModules, Dimensions } from 'react-native';
const getDeviceLang = () => {
  const appLanguage =
    Platform.OS === 'ios'
      ? NativeModules.SettingsManager.settings.AppleLocale ||
        NativeModules.SettingsManager.settings.AppleLanguages[0]
      : NativeModules.I18nManager.localeIdentifier;

  return appLanguage.search(/-|_/g) !== -1
    ? appLanguage.slice(0, 2)
    : appLanguage;
};

detect: async callback => {
  const deviceLang = getDeviceLang();
  callback(appLanguage);
},

更多细节可以在here找到一个工作样本...

【讨论】:

  • 您的解决方案是最好的,但实际上我发现没有获取默认语言。似乎它也应该在图书馆中得到支持。无论如何。感谢您的回答。
【解决方案2】:

i18next.languagei18next.languages 可能会有所帮助。

【讨论】: