rntpc_react-native-localize:基于 react-native-localize 的 OpenHarmony 适配版,获取设备本地化信息(语言、时区、货币等)

基于 react-native-localize 的 OpenHarmony 适配版,获取设备本地化信息(语言、时区、货币等)

分支4Tags8

文档模板:v0.4.2

react-native-localize

本项目基于 react-native-localize 开发。

该第三方库的仓库已迁移至 Gitcode,并支持直接从 npm 下载,新包名为:@react-native-ohos/react-native-localize。版本对应关系如下:

三方库名称 三方库版本(npm 地址) 发布信息 支持 RN 版本 Autolink 编译 API 版本 社区基线版本 源码地址
@react-native-ohos/react-native-localize ~ 3.7.0(开发中) Gitcode 发布 0.84.* 是 API12+ 3.7.0 master
@react-native-ohos/react-native-localize ~ 3.6.2 Gitcode 发布 0.82.* 否 API12+ 3.6.1 br_rnoh0.82
@react-native-ohos/react-native-localize ~ 3.4.2 Gitcode 发布 0.77.* 否 API12+ 3.4.1 br_rnoh0.77
@react-native-ohos/react-native-localize ~ 3.1.0 Gitcode 发布 0.72.* 是 API12+ 3.1.0 br_rnoh0.72
@react-native-oh-tpl/react-native-localize@deprecated <= 3.1.0-0.0.1 Github 发布(已弃用) 0.72.* 否 API12+ 3.1.0 sig

简介

react-native-localize 提供一套本地化工具 API,用于读取设备的语言、地区、货币、时区、数字格式等偏好设置,帮助应用实现语言匹配与本地化展示。

下载安装

进入工程目录并输入以下命令:

npm

npm install @react-native-ohos/react-native-localize

yarn

yarn add @react-native-ohos/react-native-localize

下面的代码展示了这个库的基本使用场景:

使用时 import 的库名不变。

import * as React from "react";
import { SafeAreaView, ScrollView, StyleSheet, Text, View } from "react-native";
import * as RNLocalize from "react-native-localize";

const Line = ({ name, value }: { name: string; value: unknown }) => (
  <View style={{ marginBottom: 16 }}>
    <Text style={{ textDecorationLine: "underline", fontWeight: "500" }}>{name}</Text>
    <Text>{JSON.stringify(value, null, 2)}</Text>
  </View>
);

export default function LocalizeDemo() {
  return (
    <SafeAreaView style={{ flex: 1, backgroundColor: "white" }}>
      <ScrollView contentContainerStyle={{ padding: 16 }}>
        <Line name="RNLocalize.getLocales()" value={RNLocalize.getLocales()} />
        <Line name="RNLocalize.getCurrencies()" value={RNLocalize.getCurrencies()} />
        <Line name="RNLocalize.getCountry()" value={RNLocalize.getCountry()} />
        <Line name="RNLocalize.getCalendar()" value={RNLocalize.getCalendar()} />
        <Line name="RNLocalize.getTimeZone()" value={RNLocalize.getTimeZone()} />
        <Line name="RNLocalize.uses24HourClock()" value={RNLocalize.uses24HourClock()} />
        <Line
          name="RNLocalize.findBestLanguageTag(['en-US', 'en', 'fr', 'zh'])"
          value={RNLocalize.findBestLanguageTag(["en-US", "en", "fr", "zh"])}
        />
      </ScrollView>
    </SafeAreaView>
  );
}

依赖链接

是否支持 autolink RN 框架版本
~3.7.0 (开发中) 是 0.84
~3.6.2 否 0.82
~3.4.2 否 0.77
~3.1.0 是 0.72
<= 3.1.0-0.0.1@deprecated 否 0.72

对于使用 AutoLink 的工程,需要根据 Autolink 框架指导文档 进行配置。

如果您使用的版本支持 Autolink,并且工程已经接入 Autolink,则可以跳过 ManualLink 配置。

ManualLink:此步骤提供手动配置原生依赖项的指导

首先,请使用 DevEco Studio 打开项目中的 HarmonyOS 工程 harmony。

1. 通过 overrides 覆盖 RN SDK 版本

为了让工程依赖同一版本的 RN SDK,需要在工程根目录的 oh-package.json5 中添加 overrides 字段,并将其指向工程所需使用的 RN SDK 版本。被替换的版本既可以是明确的版本号,也可以是版本范围,还可以是本地已存在的 HAR 包或源码目录。

有关该字段的作用,请参阅官方说明

{
  "overrides": {
    "@rnoh/react-native-openharmony": "./react_native_openharmony"
  }
}

2. 引入原生端代码

目前有两种方式:

  • 通过 har 包引入;
  • 直接链接源码。

方法一:通过 har 包引入(推荐)

har 包位于三方库安装路径的 `harmony` 文件夹下。

打开 entry/oh-package.json5,添加以下依赖

"dependencies": {
    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",
    "@react-native-ohos/react-native-localize": "file:../../node_modules/@react-native-ohos/react-native-localize/harmony/rn_localize.har"
  }

点击右上角的 sync 按钮

或在命令行终端中执行:

cd entry
ohpm install

方法二:直接链接源码

如需使用直接链接源码,请参考[直接链接源码说明](https://gitcode.com/CPF-RN/usage-docs/blob/master/zh-cn/link-source-code.md)

3. 配置 CMakeLists 并引入 RNLocalizePackage

打开 entry/src/main/cpp/CMakeLists.txt,添加:

project(rnapp)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(NODE_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../node_modules")
+ set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../react-native-harmony/harmony/cpp")
set(LOG_VERBOSITY_LEVEL 1)
set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments")
set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie")
set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use
add_compile_definitions(WITH_HITRACE_SYSTRACE)

add_subdirectory("${RNOH_CPP_DIR}" ./rn)

# RNOH_BEGIN: manual_package_linking_1
add_subdirectory("../../../../sample_package/src/main/cpp" ./sample-package)
+ add_subdirectory("${OH_MODULES}/@react-native-ohos/react-native-localize/src/main/cpp" ./rn_localize)
# RNOH_END: manual_package_linking_1

file(GLOB GENERATED_CPP_FILES "./generated/*.cpp")

add_library(rnoh_app SHARED
    ${GENERATED_CPP_FILES}
    "./PackageProvider.cpp"
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)
target_link_libraries(rnoh_app PUBLIC rnoh)

# RNOH_BEGIN: manual_package_linking_2
target_link_libraries(rnoh_app PUBLIC rnoh_sample_package)
+ target_link_libraries(rnoh_app PUBLIC rnoh_localize)
# RNOH_END: manual_package_linking_2

打开 entry/src/main/cpp/PackageProvider.cpp,添加:

#include "RNOH/PackageProvider.h"
#include "SamplePackage.h"
+ #include "RNLocalizePackage.h"

using namespace rnoh;

std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
    return {
      std::make_shared<SamplePackage>(ctx),
+     std::make_shared<RNLocalizePackage>(ctx)
    };
}

4. 在 ArkTs 侧引入 RNLocalizePackage

打开 entry/src/main/ets/RNPackagesFactory.ts,添加:

  ...
+ import { RNLocalizePackage } from '@react-native-ohos/react-native-localize/ts';

export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
  return [
    new SamplePackage(ctx),
+   new RNLocalizePackage(ctx)
  ];
}

运行

点击右上角的 sync 按钮

或在命令行终端中执行:

cd entry
ohpm install

随后进行编译并运行即可。

约束与限制

兼容性

本文档内容已在以下版本上验证通过:

  1. RNOH: 0.84.2;SDK: HarmonyOS 6.x;IDE: DevEco Studio 6.x(example npm run dev 已验证通过)

权限要求

无额外系统权限要求。

编译与运行 API 要求

当前第三方库支持在 `API12+` 工程中编译,并可在 `API12+` ROM 上运行。

API

“Platform”列表示该属性在原始第三方库中支持的平台。

“HarmonyOS Support”列取值为 yes 表示 HarmonyOS 平台支持该属性;no 表示不支持;partially 表示部分支持。各平台使用方法保持一致,效果与 iOS 或 Android 对齐。

自 5.1.0 (18) 起,支持 getTemperatureUnit 接口。

名称 描述 参数类型 返回值 必填 平台 OpenHarmony平台支持
getLocales() 按优先级顺序返回用户首选的语言环境。 function Locale[] No All Yes
getNumberFormatSettings() 返回数字格式化设置。 function NumberFormatSettings No All Yes
getCurrencies() 按优先级顺序返回用户首选的货币代码。 function string[] No All Yes
getCountry() 返回用户当前的国家代码(基于设备语言环境,而非地理位置)。 function string No All Yes
getCalendar() 返回用户首选的日历格式。 function Calendar No All Yes
getTemperatureUnit() 返回用户首选的温度单位。 function TemperatureUnit No All Yes
getTimeZone() 返回用户首选的时区(基于设备设置,而非地理位置)。 function string No All Yes
uses24HourClock() 若用户偏好 24 小时制,返回 true;否则返回 false。 function boolean No All Yes
usesMetricSystem() 若用户偏好公制单位,返回 true;否则返回 false。 function boolean No All Yes
usesAutoDateAndTime() 返回设备是否启用自动日期与时间设置。仅适用于 Android。 function boolean | undefined No Android No
usesAutoTimeZone() 返回设备是否启用自动时区设置。仅适用于 Android。 function boolean | undefined No Android No
findBestLanguageTag() 返回最佳语言标签及其阅读方向 function { languageTag: string, isRTL: boolean } | undefined No All Yes
openAppLanguageSettings 打开应用语言设置 function Promise<void> No Android Yes
ServerLanguagesProvider() 服务端语言配置提供者组件,用于在服务端渲染场景中注入语言列表 function ReactNode No Web No
useLocalize() 返回本地化相关 API 集合 function LocalizeApi No All Yes

遗留问题

其他

无

目录结构

/rntpc_react-native-localize  # 项目根目录
├── harmony              # 鸿蒙适配代码
│    ├─ rn_localize.har          # har 包
│    └─ rn_localize              # 鸿蒙适配核心代码
│          ├─ index.ets          # 鸿蒙适配代码入口
│          ├─ ts.ets             # ArkTS 导出入口
│          └─ src/main
│              ├─ cpp/                   # C++ 原生模块
│              └─ ets/
│                  ├─ RNLocalizeModule.ts   # 核心模块实现
│                  ├─ RNLocalizePackage.ets # Package 注册
│                  ├─ Logger.ts             # 日志工具
│                  ├─ config/               # 配置数据
│                  └─ generated/            # Codegen 生成代码
├── src                  # RN 代码
│    ├─ index.ts                 # 入口文件
│    ├─ module.ts                # 模块实现
│    ├─ module.native.ts         # Native 端模块实现
│    ├─ extras/                  # 扩展功能
│    │    ├─ expo.ts             # Expo 配置插件
│    ├─ utils.ts                 # 工具函数
│    ├─ constants.ts             # 常量定义
│    ├─ types.ts                 # 类型定义
│    └─ specs/                   # TurboModule 类型定义
├── README_en.md           # 英文文档
├── README.md              # 中文文档

贡献代码

在使用过程中,如您发现任何问题,欢迎提交 Issue;同时,也非常欢迎提交 PR。

开源协议

本项目基于 The MIT License (MIT) 发布,请自由使用并参与开源。

项目介绍

基于 react-native-localize 的 OpenHarmony 适配版,获取设备本地化信息(语言、时区、货币等)

定制我的领域