For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/stage/unstaged/proposal-smart-unit-preferences.md.
  • 简体中文
  • Smart Unit Preferences in Intl.NumberFormat ?

    中文标题:Intl.NumberFormat 中的智能单位偏好

    提案概览
    提案速览

    该提案解决 Intl.NumberFormat 中需要根据上下文和值进行本地化单位的需求,因为简单的基于区域设置的映射是不够的。它建议添加一个 usage 参数来指导单位选择和精度,根据输入单位、用途、区域设置和数量,利用 CLDR 的单位偏好数据。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    Intl.NumberFormat 中的智能单位偏好

    阶段:1

    推动者:Ben Allen @ben-allen

    作者:Ben Allen @ben-allen

    幻灯片

    概述

    在本地化内容时,以本地化单位表示测量值是一种常见需求。最显著的是,美国在许多测量中使用了独特的英制单位,而世界上大多数其他地方使用公制单位。同样,美国的温度通常以华氏度测量,而世界上大多数温度测量使用摄氏度。

    然而,正确本地化测量值并不像“给美国使用英制,其他所有人使用公制”那么简单。这是因为在某些地区,有时会根据测量对象的类型、测量使用的上下文以及测量值本身而使用不同的测量标度。例如,尽管加拿大在测量长度方面主要使用公制,但加拿大人通常以英尺和英寸来给出身高。对于不同的道路距离,经常使用不同标度的单位;例如,使用英尺和英里的国家通常会以英尺给出较短的道路距离,而以英里或英里的分数给出较长的距离。表示距离测量时的精度程度也随测量大小而变化,通常精度随着距离增加而降低。

    大多数情况下,对上下文和值相关的测量本地化需求出现在以前是大英帝国一部分的地区。然而,这并非仅限于这些地区。例如,“斯堪的纳维亚英里”在瑞典的某些上下文中使用。这个单位相当于十公里,经常在口语化谈论行驶距离时使用。然而,它也在一些更正式的上下文中使用。车辆燃料消耗最常以升每斯堪的纳维亚英里来衡量,一些瑞典税务局表格在确定商务出行距离时使用斯堪的纳维亚英里进行测量。

    我们建议为 ECMAScript 的 Intl.NumberFormat 添加支持区域设置和使用场景的测量格式化,作为向用户提供以正确本地化标度表示的测量值的框架。我们打算利用 CLDR 的 补充文件 units.xml 中可用的数据。

    需求

    1. 本地化: 对于每个区域设置,应向用户展示适合他们的单位。例如:
      • 长度(距离):
        • en-US:超过半英里的距离用英里,较短距离用英尺
        • fr-FR:公里
      • 质量:
        • en-US:磅
        • fr-FR:公斤
      • 人的体重:
        • en-US:磅
        • fr-FR:公斤
        • en-GB:英石和磅
      • 人的身高:
        • en-US:英尺和英寸
        • fr-CA:英尺和英寸
        • fr-FR:米和厘米
        • de-DE:厘米
      • 降雨量(也是“长度”测量):
        • en-US:英寸
        • fr-FR:毫米

    所有测量值应处于适合测量值的精度。

    API 设计

    • Intl.NumberFormat 添加一个 usage 字符串参数,指示测量用例。

      • 示例:person-heightrainfallsnowfallroad
      • 输出单位和精度将取决于:
        • 输入单位(有助于消除用例歧义)
        • 用例
        • 区域设置
        • 数量
      • 我们建议支持 CLDR 的单位偏好,参见 CLDR 的 units.xml
    • 一个为 Int.NumberFormat 添加 usage 参数的代码示例:

      const inputValue = 1.8;
      const inputUnit = "meter";
      
      console.log(new Intl.NumberFormat('en-US', {
          style: 'unit',
          unit: inputUnit,
          usage: 'person-height',  // NEW parameter
          unitDisplay: 'long'
      }).format(inputValue));
      // 预期输出:"5 feet and 11 inches"
      // (1.8 meters = 5 feet 10.8661 inches")