@baukit/localization-core
@baukit/localization-core 提供了无依赖的地块解析度,目录密钥比较,
稳定代码本地化,以及明确本地化 Intl 工厂。 产品供应
支持 locale 列表,倒置 locale, 翻译目录, 和复制 .
i18 ext and React community staying in the Convention app. i18 ext and React communications 互联网档案馆的存檔,存档日期2013-10-02. 互联网档案馆的存檔,存档日期2013-12-22. 解析并先水分 将本地化的UI 传递给这个软件包的产品工厂.
已打入目录部分
defineCatalogSegment 使用一个产品选择的参考语言来输入每个翻译。 这个
支持的地块 Tuple 留在产品中。 TypeScript 拒绝缺失或额外的本地密钥,
缺少或额外信件密钥,以及将字符串修改为复数信件的翻译.
import { defineCatalogSegment } from '@baukit/localization-core';
const accountCatalogs = defineCatalogSegment(
['en', 'de'] as const,
'en',
{ title: 'Account', devices: { one: '1 device', other: '{{count}} devices' } },
{
de: { title: 'Konto', devices: { one: '1 Gerät', other: '{{count}} Geräte' } },
},
);
已存在的目录对象可以一次移动一段. 通过当前区域列表, 引用
语言、参考部分和翻译到 defineCatalogSegment继续加载翻译,
i18next资源,取名空间,并在产品中复制. 函数冻结返回的地盘
地图,但不深解或检查信件文本.
民事日期
民事日期为 YYYY-MM-DD 页:1 日记,计划日,
记念日期为公用日期,并计算一个 Date.getDate() 或 ISO 字符串切片
给任何与主机有分歧的用户获取错误的答案 .
import { addCivilDays, civilDateForInstant, civilToday } from '@baukit/localization-core';
civilToday('Pacific/Auckland'); // '2026-08-25'
civilDateForInstant('2026-08-25T06:00:00Z', 'America/Los_Angeles'); // '2026-08-24'
addCivilDays('2026-03-07', 1); // '2026-03-08', DST does not shift a calendar day
parseCivilDate(date)返回时{ ok: true, value }或者说{ ok: false, code: 'invalid_civil_date' }。 。 。 .isCivilDate, (中文(简体) ),civilDateValidationCode,以及assertCivilDate是布尔,代码,和 抛出表格。 他们都拒绝不可能的日子2026-02-30。 。 。 .assertCivilTime(time | null)接受HH:MM财务报告和审定财务报表HH:MM:SS。 。 。 .addCivilDays(date, days), (中文(简体) ),civilDaysBetween(from, to),以及compareCivilDates(left, right)在日历上的工作,所以一个 DST 转换从不增加或减少一天.civilDateForInstant(instant, timeZone)接受一个Date, ISO 字符串, 或时代 毫秒长.civilToday(timeZone)现在的呼声是一样的isInstantOnCivilDate(instant, date, timeZone)解答时间戳是否属于本地 日报.assertTimeZone(zone)验证IANA区.resolvedTimeZone()读取主机区; 每 其他函数会明确地取用区,所以没有什么能默默地依赖于过程的运行位置.
本地时间
resolveZonedLocalTime 将民事日期、当地时间和IANA区变为一瞬间。 当地人
时间可以掉入间隙(春季前行,所以从不发生)或折叠(倒回后行,所以发生)
(两次) 呼叫者选择两种政策;也没有默认.
import { resolveZonedLocalTime } from '@baukit/localization-core';
resolveZonedLocalTime({
civilDate: '2026-03-29',
civilTime: '02:30',
timeZone: 'Europe/Berlin',
gap: 'shiftForward',
fold: 'earlier',
});
// { ok: true, epochMilliseconds: Date.parse('2026-03-29T01:30:00Z'), transition: 'gap' }
gap: 'reject'返回时{ ok: false, code: 'nonexistent_local_time' }。 。 。 .gap: 'shiftForward'读取空隙之前的相抵时间,所以当一个小时时,02:30变为03:30 跳过 RFC 5545是这样读取的TZID时间.fold: 'earlier'财务报告和审定财务报表fold: 'later'选择两个瞬间中的第一个或第二个.transition实值'none', (中文(简体) ),'gap',或'fold'并说什么是当地时间打击.- 无效的输入返回
invalid_civil_date, (中文(简体) ),invalid_civil_time(任何东西,但HH:MM或者说HH:MM:SS从00:00改为23:59:59),或invalid_time_zone。偏移字符串,例如+01:00不是区域,而是被拒绝。 未知的策略值是一个编程错误并丢出RangeError。 。 。 .
函数读取区域规则通过 Intl.DateTimeFormat 所以答案就取决于
运行时间的时区数据库。 共享向量在
fixtures/zoned-time/vectors-v1.json 覆盖空隙、折叠、半小时和45分钟相抵、跳出
日、规则更改和无效输入。 解决本地时间的粗口代码应该针对
同一个文件.
@baukit/localization-core/vectors 出口 zonedTimeVectorChecks(fixture),将文件翻转
输入带有标签的检查 expected 数值和一个 actual() 电话 包的维特套房
在节点上运行,和 examples/expo-notifications-conformance 在Hermes内部运行相同的检查
在Android模拟器上。 一种产品可以同样的方式运行它们自己的运行时间.
边界
软件包不包括翻译、产品目录ID、持久性、反应提供者、博览会
本地化,或者本地化图书馆. 它定义了字符串加 { one, other } 复数形状
已键入目录段,但应用程序仍然拥有复数规则和插值语法.
每一个依赖于一个地块或时区的函数都将其作为一个论据. resolvedTimeZone()
是东道国唯一的读者,这是你故意打的单独电话。 这就是保持
一个测试套房 从通过柏林 和失败在CI.