2015-11-02 40 views

回答

0

您可能需要扩展自己的反应以获取此信息。但是,根据您的使用情况,此本地化组件(stefalda/ReactNativeLocalization)可能适合您。

9

我正在使用i18n软件包(react-native-i18n)。 然后它只是:

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

错误的反应FYI任何人的新版本。 –

1

您可以使用此功能:Android和iOS的下

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(/_/, '-') 
    } 
} 

作品。

+0

'NativeModules'没有'RNI18n'(至少默认)。我想你添加了一个lib。 – antoine129

+0

我想你安装了https://github.com/AlexanderZaytsev/react-native-i18n – antoine129

5

你会发现你所需要的已建成无需外部库阵营母语:

import {NativeModules} from 'react-native' 
locale = NativeModules.SettingsManager.settings.AppleLocale 

为了测试这个,我改变了应用程序语言和应用区的方案编辑器在Xcode法国/法国&我注意到一个变化。这可能是也可能不是你想要的,但NativeModules.SettingsManager.settings对象可能有些用处。

这里是什么,你会在设置中找到一个例子对象:

{ 
    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

它不适用于Android。 –

+1

@DanielSteigerwald Android上尚不支持以这种方式访问​​设置。请参阅[Settings.android.js](https://github.com/facebook/react-native/blob/94666f16c7da37e649316d40ea23d7a8054a04f9/Libraries/Settings/Settings.android.js) –

+4

Android版使用'NativeModules.I18nManager.localeIdentifier'' –

0

我发现这个解决方案为Android和iOS(RN 0.35)

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

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

可能这将有助于有人,但iOS不显示区域设置属性。它现在只显示rtl支持。

3

以上都不适用于我,但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

如果你开发了世博会......你可以使用:

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

0

NativeModules解决方案can be changed随着时间的推移由Facebook开发。
因为这个原因,我准备了a component。 (它仅适用于Android现在)

使用范例:

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

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

并可保证则可以使用:

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

也可用于ES7异步等待的方法!

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

以下函数会返回一个2字母语言代码。例如: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

我个人更喜欢使用react-native-i18n。 那么你可以使用这样的文档里面..

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

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

链接:https://github.com/AlexanderZaytsev/react-native-i18n

相关问题