ICU 時區資料

本文件說明 Fuchsia 從 ICU 資料檔案 (icudtl.dat) 載入 ICU 時區資料的支援。程式會根據最適合應用程式的資源,動態載入時區資料。

如要進一步瞭解 Fuchsia 中 ICU API 的一般使用情形,請參閱「福奇尼亞州萬國碼 (Unicode) 中的國際元件」一文

提供 ICU 資料

為了讓系統預設的 ICU 資料檔案可供 Fuuchsia 的程式查看,您必須在套件中加入資源依附元件:

"//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",
      ]
    }
    
    
    中找到 C++ 程式庫原始碼。

    Rust

    deps = [ "//src/lib/icu_data/rust/icu_data" ]
    non_rust_deps = [ "//src/lib/icu:lib" ]
    
    
    找到 Rust 程式庫原始碼。
  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");

附錄

修改系統時區資訊

在開發期間,針對 Fuchsia 目標,使用 ffx setui 外掛程式檢查或設定目前的時區 ID。如要進一步瞭解可用選項,請執行下列指令:

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