在 Android React Native 应用程序中正确使用 Intl

Using Intl properly in Android React Native app

我正在尝试使用 Intl 的数字格式化程序,它在 iOS 上完美运行,并且当调试器附加到 iOS 或 Android 时,但仅由于 Android.

中的 JSC 过时,在未附加调试器的情况下 Android 失败

经过一番研究,我找到了两种可能的解决方案:

我在使用 yarn 安装 intlreact-intl 之后首先尝试 Intl polyfill:

//in my app's index.js
if (!global.Intl) {
    global.Intl = require('intl');
}

尽管它仍然显示 ReferenceError: Can't find variable: Intl

然后我放弃并尝试包含自定义 JSC(我已经确认正确引用了自定义 AAR),但我仍然遇到相同的错误。无论我做什么,如果没有附加调试器,我都无法让 Intl 在 Android 上获得 运行。

我做错了什么? (我正在使用 React Native 0.59.9)

如果您使用的是自定义 JSC,请不要忘记将国际版本导入为 explained in the read me of JSC Android Buildscripts:

For React Native version 0.59, replace original artifact id with android-jsc-intl

dependencies {
+   // Make sure to put android-jsc at the the first
+   implementation "org.webkit:android-jsc-intl:r241213"
+
    compile fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
    implementation "com.facebook.react:react-native:+"  // From node_modules
}

我想删除这个问题,但我不能,因为已经有另一个答案了。


与JSC无关。我认为我的构建脚本没有正确更新 APK,我一遍又一遍地尝试使用旧的伪造 APK。否则,显然我做的一切都很好,因为它现在可以使用新的 APK。

小更新,从 React Native v0.60+ 开始,您可以定义 intl+ 版本的库。

在你的app/build.gradle中:

def jscFlavor = 'org.webkit:android-jsc-intl:+'

并在您的依赖项中实现它:

dependencies {
    ...
    if (enableHermes) {
        ...
    } else {
        implementation jscFlavor
    }
}

如果在您的 app/build.gradle 中禁用 Hermes 不是一个选项,并且您不能使用 org.webkit:android-jsc-intl:+ 那么 Intl polyfill 可以解决问题:

npm install intl

代码中:

import 'intl';
import 'intl/locale-data/jsonp/en'; // or any other locale you need
npm i intl

导入之后

import "intl";

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

然后使用Intl

例如:-

{new Intl.NumberFormat("en-IN", {
                  style: "currency",
                  currency: "INR",
                }).format(
                  (travelTimeInformation?.duration.value *
                    SURGE_CHARGE_RATE *
                    multiplier) /
                    100
                )}