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

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

分支4Tags8
文件最后提交记录最后更新时间
17 天前
17 天前
17 天前
2 个月前
2 年前
2 个月前
2 个月前
3 年前
17 天前
7 年前
2 个月前
7 年前
2 个月前
2 个月前
4 天前
4 天前
2 个月前
2 个月前
17 天前
17 天前
2 个月前

文档模板: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 Releases 0.84./0.86. 是 API12+ 3.7.0 master
@react-native-ohos/react-native-localize ~ 3.6.3 Gitcode Releases 0.82.* 是 API12+ 3.6.1 br_rnoh0.82
@react-native-ohos/react-native-localize ~ 3.6.2 Gitcode Releases 0.82.* 否 API12+ 3.6.1 br_rnoh0.82
@react-native-ohos/react-native-localize ~ 3.4.2 Gitcode Releases 0.77.* 否 API12+ 3.4.1 br_rnoh0.77
@react-native-ohos/react-native-localize ~ 3.1.0 Gitcode Releases 0.72.* 是 API12+ 3.1.0 br_rnoh0.72
@react-native-oh-tpl/react-native-localize@deprecated <= 3.1.0-0.0.1 Github Releases(deprecated) 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/0.86

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

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

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

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

1. 覆盖 RN SDK 版本

为了让工程依赖同一版本的 RN SDK,需要在工程根目录的 oh-package.json5 中添加 overrides 字段,指向工程需要使用的 RN SDK 版本。替换的版本可以是一个具体的版本号,也可以是一个模糊版本,还可以是本地存在的 HAR 包或源码目录。

关于该字段的作用请阅读官方说明

{
  "overrides": {
    "@rnoh/react-native-openharmony": "^0.86.1" // ohpm 在线版本
    // "@rnoh/react-native-openharmony" : "./react_native_openharmony.har" // 指向本地 har 包的路径
    // "@rnoh/react-native-openharmony" : "./react_native_openharmony" // 指向源码路径
  }
}

2. 引入原生端代码

目前有两种方法:

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

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

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

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

"dependencies": {
    "@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.ets,添加:

  ...
+ 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.1; SDK: HarmonyOS 6.0.1 Release SDK; IDE: DevEco Studio 6.0.1 Release; ROM:6.0.0.120 SP7;
  2. RNOH:0.86.1; SDK: HarmonyOS 26.0.0 Release SDK; IDE: DevEco Studio 26.0.0 Release; ROM:7.0.0.100 SP9;

权限要求

无额外系统权限要求。

编译运行 API 要求

当前三方库支持在 `API12+` 工程编译,及 `API12+` ROM 运行。

API

"Platform"列表示该属性在原三方库上支持的平台。

"OpenHarmony Support"列为 yes 表示 OpenHarmony平台支持 该属性;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() function / boolean No All Yes 如果用户喜欢24小时制则返回true,否则返回false。
usesMetricSystem() function / boolean No All Yes 如果用户喜欢公制单位则返回true,否则返回false。
usesAutoDateAndTime() function / boolean | undefined No Android No 告诉手机是否启用了自动日期和时间设置。仅限Android
usesAutoTimeZone() function / boolean | undefined No Android No 告诉手机是否启用了自动时区设置。仅限Android
findBestLanguageTag() function string[] { languageTag: string, isRTL: boolean } | undefined No All Yes 返回最佳的语言标签及其阅读方向
openAppLanguageSettings() function / Promise<void> No Android Yes 打开应用语言设置
ServerLanguagesProvider() function ServerLanguagesProviderProps ReactNode No Web No 服务端语言配置提供者组件,用于在服务端渲染场景下注入语言列表
useLocalize() function / LocalizeApi No All Yes 返回本地化相关的 API 集合

遗留问题

其他

无

目录结构

/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 适配版,获取设备本地化信息(语言、时区、货币等)

定制我的领域