Какой лучший способ получить локализацию устройства в среде 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,
};