ICU 时区数据

本文档介绍了 Fuchsia 对从 ICU 数据文件 (icudtl.dat) 加载 ICU 时区数据的支持。程序会根据最适合其应用的资源动态加载时区数据。

如需详细了解 ICU API 在 Fuchsia 中的常规用法,请参阅在 Fuchsia 中用于 Unicode 的国际组件

提供 ICU 数据

为了让 Fuchsia 中的程序可以看到系统默认 ICU 数据文件,您必须在软件包中添加资源依赖项:

"//src/intl:icudtl",

时区配置数据

如需为组件提供特定版本的时区数据文件,请在组件清单中请求相应的目录功能

// Capabilities used by this component.
use: [
    {
        directory: "tzdata-icu-44-le",
        rights: [ "r*" ],
        path: "/config/tzdata",
    },
],

加载 ICU 数据

必须在程序中加载 ICU 数据,才能提供语言区域数据。 否则,将没有可用的语言区域数据,并且您的 ICU 代码的行为将假定 i18n 数据集为空。

  1. BUILD.gn 文件中添加 ICU 数据库依赖项:

    C++

    third_party_icu_headers("icu_headers") {
      headers = [
        "third_party/icu/source/common/unicode/utypes.h",
        "third_party/icu/source/i18n/unicode/timezone.h",
      ]
    }
    
    executable("bin") {
      testonly = true
      output_name = "tz_version_parrot_cpp"
    
      sources = [ "test.cc" ]
    
      deps = [
        ":icu_headers",
        "//sdk/lib/sys/cpp",
        "//sdk/lib/syslog/cpp",
        "//src/lib/files",
        "//src/lib/fxl/test:gtest_main",
        "//src/lib/icu_data/cpp",
        "//third_party/googletest:gtest",
      ]
    }
    
    

    Rust

    deps = [ "//src/lib/icu_data/rust/icu_data" ]
    non_rust_deps = [ "//src/lib/icu:lib" ]
    
    
  2. 将 ICU 数据库导入源文件:

    C++

    #include "src/lib/icu_data/cpp/icu_data.h"
    

    Rust

    use icu_data::Loader;
    
  3. 初始化 ICU 数据加载器:

    C++

    const auto result = icu_data::Initialize();
    ASSERT_EQ(result, ZX_OK) << "icu_data::Initialize failed";
    

    Rust

    // Load the ICU data
    let _loader = Loader::new().expect("loader constructed successfully");
    

现在,您可以在程序中使用 ICU 数据。

从 tzdata 目录加载

如需加载 ICU 数据,请使用数据目录和修订版本文件的路径初始化加载器:

C++

// Default directory for timezone .res files
constexpr char kDefaultTzdataDir[] = "/config/tzdata";
// Path to file containing the expected time zone database revision ID.
constexpr char kDefaultTzRevisionFilePath[] = "/config/tzdata/revision.txt";
ASSERT_TRUE(files::IsDirectory(kDefaultTzdataDir))
    << "Error: tzdata directory \"" << kDefaultTzdataDir << "\" doesn't exist.";

const auto result = icu_data::InitializeWithTzResourceDirAndValidate(kDefaultTzdataDir,
                                                                     kDefaultTzRevisionFilePath);
ASSERT_EQ(result, ZX_OK) << "icu_data::InitializeWithTzResourceDirAndValidate failed";

Rust

const DEFAULT_TZDATA_DIR: &str = "/config/tzdata";
const DEFAULT_TZREVISION_FILE_PATH: &str = "/config/tzdata/revision.txt";

// Load the ICU data
let _loader = Loader::new_with_tz_resources_and_validation(
    DEFAULT_TZDATA_DIR,
    DEFAULT_TZREVISION_FILE_PATH,
)
.expect("loader constructed successfully");

附录

修改系统时区信息

在开发期间,请使用 ffx setui 插件检查或设置 Fuchsia 目标上的当前时区 ID。如需详细了解可用选项,请运行以下命令:

ffx config set setui true // only need to run once
ffx setui intl --help