Android 设备需要 React-Native 和 Intl polyfill

React-Native and Intl polyfill required on Android device

我最近更新了我的 Android Studio 和许多 components/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] Error formatting number. ReferenceError: No locale data has been provided for this object yet.

我不明白这是怎么回事。有人遇到同样的问题吗?

谢谢

我没有从 react-intl 导入 locale-data,而是解决了从 intl

导入 polyfill 和语言环境数据的问题

安装intl

npm install intl

将此添加到您的应用程序的最顶部:

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

注意,这现在只需在顶部执行 import 'intl'; 并仍然从 react-intl 加载 locale-data 即可。使用以下版本:

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

修改 "build.gradle"

在android上,您可以修改/android/app/build.gradle内的"build.gradle"文件。请记住,它不是 /android/app/gradle/build.gradle.

中的文件

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


      /**
     * The preferred build flavor of JavaScriptCore.
     *
     * For example, to use the international variant, you can use:
     * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
     *
     * The international variant includes ICU i18n library and necessary data
     * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
     * give correct results when using with locales other than en-US.  Note that
     * this variant is about 6MiB larger per architecture than default.
     */
     def jscFlavor = 'org.webkit:android-jsc:+'

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


      /**
     * The preferred build flavor of JavaScriptCore.
     *
     * For example, to use the international variant, you can use:
     * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
     *
     * The international variant includes ICU i18n library and necessary data
     * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
     * give correct results when using with locales other than en-US.  Note that
     * this variant is about 6MiB larger per architecture than default.
     */
     //def jscFlavor = 'org.webkit:android-jsc:+'
     def jscFlavor = 'org.webkit:android-jsc-intl:+'

更新到 React Native 0.65 或更新版本

“intl”终于包含在 Hermes 中,它随 React Native 0.65 或更新版本一起提供 - More in React Native Blog