Coś podobnego do [NSLocale currentLocale] w Objective-C.Jaki jest najlepszy sposób na zmianę ustawień regionalnych urządzenia (iOS)?
Odpowiedz
Aby uzyskać te informacje, konieczne może być przedłużenie reakcji natywnej. Ale w zależności od przypadku użycia ten składnik lokalizacji (stefalda/ReactNativeLocalization) może działać.
Używam pakietu i18n (react-native-i18n). A potem to tylko:
I18n = require('react-native-i18n')
locale = I18n.currentLocale()
Można użyć tej funkcji:
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(/_/, '-')
}
}
działa zarówno pod Androida i iOS.
'NativeModules' nie ma' RNI18n' (przynajmniej domyślnie). Chyba dodałeś lib. – antoine129
Domyślam się, że zainstalowałeś https://github.com/AlexanderZaytsev/react-native-i18n – antoine129
Można znaleźć co trzeba już budować w React Native bez zewnętrznej biblioteki:
import {NativeModules} from 'react-native'
locale = NativeModules.SettingsManager.settings.AppleLocale
Aby to sprawdzić, zmieniłem Język aplikacji i aplikacji Region w edytorze programu w Xcode do Francji/francuski & Zauważyłem zmianę. To może, ale nie musi być to, czego szukasz, ale obiekt NativeModules.SettingsManager.settings
może być przydatny.
Oto przykład tego, co znajdziesz w ustawieniach obiektu:
{
AddingEmojiKeybordHandled: true
AppleITunesStoreItemKinds: Array[20]
AppleKeyboards: [
"[email protected]=US;sw=QWERTY",
"[email protected]=Emoji",
"[email protected]=US;sw=QWERTY"
]
AppleKeyboardsExpanded: 1
AppleLanguages: ["en-US"]
AppleLanguagesDidMigrate: "9.2"
AppleLocale: "fr_FR"
ApplePasscodeKeyboards: Array[3]
MSVLoggingMasterSwitchEnabledKey: false
NSInterfaceStyle: "macintosh"
NSLanguages: ["en-US", "en"]
RCTDevMenu: Object
}
To nie działa na Androida. –
@DanielSteigerwald Uzyskiwanie dostępu do ustawień w ten sposób nie jest jeszcze obsługiwane w systemie Android. Zobacz [Settings.android.js] (https://github.com/facebook/react-native/blob/94666f16c7da37e649316d40ea23d7a8054a04f9/Libraries/Settings/Settings/Settings.android.js) –
Użyj 'NativeModules.I18nManager.localeIdentifier' dla Androida –
Znalazłem rozwiązanie dla Androida i iOS (RN 0,35)
import React, {NativeModules} from 'react-native';
if (NativeModules.I18nManager) {
const {localeIdentifier, isRTL} = NativeModules.I18nManager;
}
może być to pomoże ktoś, ale iOS nie pokazuje właściwości lokalizacji. Pokazuje teraz tylko obsługę rtl.
Nic z powyższych nie działało dla mnie, ale komponent this.
console.log("Device Locale", DeviceInfo.getDeviceLocale()); // e.g en-US
function getLocale() {
if (React.Platform.OS === 'android') {
return I18n.locale;
} else {
return NativeModules.SettingsManager.settings.AppleLocale.replace(/_/, '-');
}
}
jeśli wystąpią na Expo ... można użyć:
console.log(await NativeModules.ExponentUtil.getCurrentLocaleAsync());
console.log(await NativeModules.ExponentUtil.getCurrentDeviceCountryAsync());
console.log(await NativeModules.ExponentUtil.getCurrentTimeZoneAsync());
NativeModules rozwiązanie can be changed z czasem przez twórców Facebooka. Z tego powodu przygotowałem a component. (Działa tylko na Androida na razie) Wykorzystanie
Próbka:
import SystemSettings from 'react-native-system-settings'
SystemSettings.get(
settings => console.log('settings: ', settings)
)
także obiecać, wówczas można stosować:
SystemSettings.get().then(settings => console.log('settings: ', settings)).done()
także ES7 asynchroniczny-czekają metoda może być użyta!
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) {}
};
}
Wynik próbki:
{
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"
}
Poniżej funkcja zwróci kod języka 2 litery. Np .: en
function getLanguageCode() {
let systemLanguage = 'en';
if (Platform.OS === 'android') {
systemLanguage = NativeModules.I18nManager.localeIdentifier;
} else {
systemLanguage = NativeModules.SettingsManager.settings.AppleLocale;
}
const languageCode = systemLanguage.substring(0, 2);
return languageCode;
}
Osobiście wolę używać react-native-i18n. następnie można użyć tak wewnątrz dokumentacji ..
import { getLanguages } from 'react-native-i18n'
getLanguages().then(languages => {
console.log(languages) // ['en-US', 'en']
})
Błędy w nowszych wersjach reagować FYI nikogo. –