2015-11-02 11 views

Odpowiedz

0

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ć.

9

Używam pakietu i18n (react-native-i18n). A potem to tylko:

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

Błędy w nowszych wersjach reagować FYI nikogo. –

1

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.

+0

'NativeModules' nie ma' RNI18n' (przynajmniej domyślnie). Chyba dodałeś lib. – antoine129

+0

Domyślam się, że zainstalowałeś https://github.com/AlexanderZaytsev/react-native-i18n – antoine129

5

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 
} 
+1

To nie działa na Androida. –

+1

@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) –

+4

Użyj 'NativeModules.I18nManager.localeIdentifier' dla Androida –

0

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.

3

Nic z powyższych nie działało dla mnie, ale komponent this.

console.log("Device Locale", DeviceInfo.getDeviceLocale()); // e.g en-US 
3
function getLocale() { 
    if (React.Platform.OS === 'android') { 
    return I18n.locale; 
    } else { 
    return NativeModules.SettingsManager.settings.AppleLocale.replace(/_/, '-'); 
    } 
} 
1

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());

0

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" 
} 
0

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; 
} 
0

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'] 
}) 

Link: https://github.com/AlexanderZaytsev/react-native-i18n