Какой лучший способ получить локализацию устройства в среде native (iOS)?

Что-то похожее на [NSLocale currentLocale] в Objective-C.

Ответы

Ответ 1

Там нет необходимости во внешней библиотеке. Вы можете найти то, что вы ищете, в React Собственные модули

import { NativeModules } from 'react-native'

// iOS:
const locale = NativeModules.SettingsManager.settings.AppleLocale // "fr_FR"

// Android:
const locale = NativeModules.I18nManager.localeIdentifier // "fr_FR"

Чтобы проверить это, я изменил язык на своем устройстве на французский. Вот пример того, что вы найдете в объекте NativeModules.SettingsManager.settings, связанном с локалью:

{
    ...
    AppleKeyboards: [
        "[email protected]=US;sw=QWERTY",
        "[email protected]=QWERTY;hw=Automatic",
        "[email protected]=QWERTY-Spanish;hw=Automatic",
        "[email protected]=Emoji"
    ]
    AppleLanguages: ["fr-US", "en-US", "es-US", "en"]
    AppleLanguagesDidMigrate: "9.2"
    AppleLocale: "fr_FR"
    NSLanguages: ["fr-US", "en-US", "es-US", "en"]
    ...
}

Ответ 2

import { Platform, NativeModules } from 'react-native'

const deviceLanguage =
      Platform.OS === 'ios'
        ? NativeModules.SettingsManager.settings.AppleLocale
        : NativeModules.I18nManager.localeIdentifier;

console.log(deviceLanguage); //en_US

Ответ 3

Я использую пакет i18n (response-native-i18n). И тогда это просто:

I18n = require('react-native-i18n')
locale = I18n.currentLocale()

Ответ 4

Ничто из вышеперечисленного не работает для меня, но этот компонент.

console.log("Device Locale", DeviceInfo.getDeviceLocale()); // e.g en-US

Ответ 5

function getLocale() {
  if (React.Platform.OS === 'android') {
    return I18n.locale;
  } else {
    return NativeModules.SettingsManager.settings.AppleLocale.replace(/_/, '-');
  }
}

Ответ 6

Обходной путь iOS 13 здесь:

locale = NativeModules.SettingsManager.settings.AppleLocale // "fr_FR"
console.log(" ==> Current settings: ", NativeModules.SettingsManager.settings)
if (locale === undefined) {
    // iOS 13 workaround, take first of AppleLanguages array 
    locale = NativeModules.SettingsManager.settings.AppleLanguages[0]
    if (locale == undefined) {
          return "en" // default language
    }
}

Ответ 7

Возможно, вам понадобится продлить реакцию самостоятельно, чтобы получить эту информацию. Но, в зависимости от вашего варианта использования, этот компонент локализации (stefalda/ReactNativeLocalization) может работать на вас.

Ответ 8

Вы можете установить react-native-i18n и использовать эту функцию:

import React, { NativeModules } from 'react-native'
...
function getLocale () {
  if (React.Platform.OS === 'android') {
    return NativeModules.RNI18n.getCurrentLocale(locale => locale.replace(/_/, '-'))
  } else {
    return NativeModules.RNI18n.locale.replace(/_/, '-')
  }
}

Работает как под Android, так и с iOS.

Ответ 9

Я нашел это решение для Android и iOS (RN 0.35)

import React, {NativeModules} from 'react-native';

if (NativeModules.I18nManager) {
    const {localeIdentifier, isRTL} = NativeModules.I18nManager;
}

Может быть, это поможет кому-то, но iOS не показывает свойство локали. Теперь он показывает только поддержку rtl.

Ответ 10

если вы развиваетесь над Экспо... вы можете использовать:

console.log(await NativeModules.ExponentUtil.getCurrentLocaleAsync());
console.log(await NativeModules.ExponentUtil.getCurrentDeviceCountryAsync());
console.log(await NativeModules.ExponentUtil.getCurrentTimeZoneAsync());

Ответ 11

Решение NativeModules со временем может быть изменено разработчиками Facebook.
По этой причине я подготовил компонент. (Сейчас он работает только на Android)

Использование образца:

import SystemSettings from 'react-native-system-settings'

SystemSettings.get(
    settings => console.log('settings: ', settings)
)

Также можно использовать обещание:

SystemSettings.get().then(settings => console.log('settings: ', settings)).done()

Также можно использовать метод ASIN async-wait!

class App extends React.Component {
    componentWillMount() {
        this._loadInitialState()
    }

    _loadInitialState = async () => {
        try {
            let settings = await SystemSettings.get()
            // Now settings variable would be filled and can be used!
        } catch (error) {}
    };
}

Образец результата:

{
    densityDpi: 320,
    fontScale: 1,
    hardKeyboardHidden: "no",
    keyboard: "qwerty",
    keyboardHidden: "no",
    localization: {
        country: "US",
        displayCountry: "United States",
        displayLanguage: "English",
        displayName: "English (United States)",
        is24HourFormat: false,
        language: "en",
        locale: "en_US",
        networkCountry: "US",
        simCountry: "US",
        timeZone: {
            ID: "Europe/Amsterdam",
            displayName: {
                long: "Amsterdam Standard Time",
                short: "GMT+01:00",
            },
            offset: 3600000
        }
    },
    orientation: "portrait",
    screenHeightDp: 615,
    screenLayout: "normal",
    screenWidthDp: 360,
    smallestScreenWidthDp: 360,
    uiModeType: "normal"
}

Ответ 12

Лично я предпочитаю использовать реакцию-native-i18n. то вы можете использовать это в документации.

import { getLanguages } from 'react-native-i18n'

getLanguages().then(languages => {
  console.log(languages) // ['en-US', 'en']
})

ссылка: https://github.com/AlexanderZaytsev/react-native-i18n

Ответ 13

Я использую action-native-i18n

для доступа к языку устройства, которое я использовал:

import { getLanguages } from 'react-native-i18n';

getLanguages().then(languages => {
  console.log(languages); // ['en-US', 'en']
});

Все это в документации.

Ответ 14

Этот код рассчитан на будущее

import {NativeModules} from 'react-native';

function getSystemLocale(): string {
  let locale: string;
  // iOS
  if (
    NativeModules.SettingsManager &&
    NativeModules.SettingsManager.settings &&
    NativeModules.SettingsManager.settings.AppleLanguages
  ) {
    locale = NativeModules.SettingsManager.settings.AppleLanguages[0];
    // Android
  } else if (NativeModules.I18nManager) {
    locale = NativeModules.I18nManager.localeIdentifier;
  }

  if (typeof locale === 'undefined') {
    console.log('Couldnt get locale');
    return 'en';
  }

  return locale;
}

export default {
  getSystemLocale,
};