Android 设备需要 React-Native 和 Intl polyfill

Posted

技术标签:

【中文标题】Android 设备需要 React-Native 和 Intl polyfill【英文标题】:React-Native and Intl polyfill required on Android device 【发布时间】:2017-06-03 20:29:16 【问题描述】:

我最近更新了我的 android Studio 和许多组件/sdk,从那时起 React-Intl 抱怨缺少 intl 库,尽管它之前工作正常。

我已经安装了intl polyfill,并将它导入到我的主文件App.js 的最顶部。我还从react-intl 导入localeData 并添加它。然后,我在IntlProvider 中呈现我的视图,指定locale 没有消息(我现在只使用FormattedNumber

这是我的代码的简化版本:

import 'intl';
import  IntlProvider, FormattedNumber, addLocaleData  from 'react-intl';
import en from 'react-intl/locale-data/en';

addLocaleData(en);

[...]

render() 
    return (
        <IntlProvider locale="en">
            <Text>
                <FormattedNumber value=123 />
            </Text>
        </IntlProvider>
    )

我收到以下错误:

[React Intl] 格式化数字错误。 ReferenceError:没有语言环境数据 尚未为此对象提供。

我不明白发生了什么。有人遇到同样的问题吗?

谢谢

【问题讨论】:

【参考方案1】:

我没有从react-intl 导入语言环境数据,而是解决了从intl 导入polyfill 和语言环境数据的问题

安装intl

npm install intl

在应用的最顶部添加:

import 'intl';
import 'intl/locale-data/jsonp/en';

【讨论】:

谢谢你拯救了我的一生。 你如何做 addLocaleData 部分?只是忽略它?还是从 'int/locale-data/jsonp/es' 导入 es ? 如果我们事先不知道语言环境怎么办?例如我希望 Intl 的行为取决于手机语言。 @kunambi 我放弃了那个解决方案。 @CanPoyrazoğlu 你找到解决方法了吗?我们必须做很多工作才能将金额显示为区域设置的函数,这很烦人。【参考方案2】:

请注意,现在只需在顶部执行 import 'intl'; 并仍然从 react-intl 加载语言环境数据即可。使用以下版本:

"intl": "^1.2.5",
"react-intl": "^2.2.2",

【讨论】:

【参考方案3】:

修改“build.gradle”

在android上,你可以修改/android/app/build.gradle里面的“build.gradle”文件。请记住,它不是 /android/app/gradle/build.gradle 中的文件。

然后,转到站点文件并搜索:

/** * javascriptCore 的首选构建风格。 * * 例如,要使用国际变体,您可以使用: *`def jscFlavor = 'org.webkit:android-jsc-intl:+'` * * 国际版本包括 ICU i18n 库和必要的数据 *允许使用例如`Date.toLocaleString` 和 `String.localeCompare` * 与 en-US 以外的语言环境一起使用时给出正确的结果。注意 * 此变体每个架构比默认值大约 6MiB。 */ def jscFlavor = 'org.webkit:android-jsc:+'

现在,修改最后一行,或者简单地将其注释掉并复制并粘贴上面类似的行。结果将是这样的:

/** * JavaScriptCore 的首选构建风格。 * * 例如,要使用国际变体,您可以使用: *`def jscFlavor = 'org.webkit:android-jsc-intl:+'` * * 国际版本包括 ICU i18n 库和必要的数据 *允许使用例如`Date.toLocaleString` 和 `String.localeCompare` * 与 en-US 以外的语言环境一起使用时给出正确的结果。注意 * 此变体每个架构比默认值大约 6MiB。 */ //def jscFlavor = 'org.webkit:android-jsc:+' def jscFlavor = 'org.webkit:android-jsc-intl:+'

【讨论】:

非常感谢,我终于解决了我的问题 :)

以上是关于Android 设备需要 React-Native 和 Intl polyfill的主要内容,如果未能解决你的问题,请参考以下文章

如何解决在 react-native 开发模式下授予的覆盖权限需要?

如何禁用 Android 上的设备后退按钮(react-native)?

如何检查android设备支持手电筒的`react-native`?

部署由React-Native开发的android和IOS应用程序

react-native run-android 失败:无法在设备上安装应用程序,请阅读上面的错误

React-native 应用程序在真正的 android 设备上崩溃