
开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载ResourceKeys.DateHumanize是 Humanizer 中负责为DateTime.Humanize()输出文本生成资源键Resource Key的公共静态类。它不直接返回 2 days ago 这样的文案而是产出诸如DateHumanize_SingleMinuteAgo的键名由本地化 Formatter 依据键名最终解析为具体语言的短语。本篇基于版本 3.0.1 的 API 文档结合仓库中 DefaultFormatter.cs、DateTimeHumanizeAlgorithms.cs 与 en.yml 等实现完整讲解该类的字段、GetResourceKey方法签名、键名命名约定以及从时间差计算 → 资源键 → 本地化短语的完整调用链帮助你理解并扩展 Humanizer 的日期人性化本地化能力。类概述ResourceKeys.DateHumanize 的职责边界文档对该类的定位一句话即可概括Encapsulates the logic required to get the resource keys for DateTime.Humanize封装了为DateTime.Humanize获取资源键所需的逻辑。public static class ResourceKeys.DateHumanize它继承自System.Object即普通静态类无显式基类。作为 3.0.x 版本公共 API 的一部分它出现在版本化 API 参考 Humanizer.ResourceKeys.DateHumanize.md 中与其并列的还有 Humanizer.ResourceKeys.md、Humanizer.ResourceKeys.TimeSpanHumanize.md 与 Humanizer.ResourceKeys.TimeUnitSymbol.md后两者分别对应 TimeSpan 人性化与时间单位符号的资源键管理。从命名空间演变看2.x 版本中该类型位于Humanizer.Localisation.ResourceKeys.DateHumanize见 version-2.10.1 的对应文档而 3.0.x 中迁移至Humanizer.ResourceKeys.DateHumanize。仓库内 NamespaceMigrationAnalyzer.cs 即为这一命名空间迁移提供编译期诊断与代码修复支持。静态常量字段Never 与 Now该类暴露两个const string字段分别对应两种特殊的相对时间语义——永不发生与当前时刻public const string Never DateHumanize_Never; public const string Now DateHumanize_Now;这两个字段的键名与 IFormatter 接口中的两个方法一一对应string DateHumanize_Now(); string DateHumanize_Never();其实现位于 DefaultFormatter.cspublic virtual string DateHumanize_Now() phraseTable.DateNow ?? now; public virtual string DateHumanize_Never() phraseTable.DateNever ?? never;可以看到在 3.x 的实现中这两个键已不再直接映射到资源文件而是从生成的短语表LocalePhraseTable由 LocalePhraseTable.cs 定义中读取缺失时回退到英文硬编码值now/never。短语表的数据源头则是 en.yml 等语言文件中的phrases.relativeDate段phrases: relativeDate: now: now today: today never: never实际应用场景Never键被可空日期类型的Humanize()重载直接使用。在 DateHumanizeExtensions.cs 中DateTime?、DateTimeOffset?、DateOnly?、TimeOnly?的Humanize扩展在输入为null时均返回Configurator.GetFormatter(culture).DateHumanize_Never()即从未发生输出never或对应语言文案。GetResourceKey 方法签名、参数与键名生成约定GetResourceKey是该类唯一的方法文档给出了完整签名public static string GetResourceKey(Humanizer.TimeUnit timeUnit, Humanizer.Tense timeUnitTense, int count1);参数说明参数类型含义timeUnitTimeUnit时间单位Millisecond / Second / Minute / Hour / Day / Week / Month / YeartimeUnitTenseTense时态表示该时间单位属于过去Past还是未来Futurecountint单位数量默认值为 1OneTimeUnit与Tense的定义见源码 TimeUnit.cs 与 Tense.cspublic enum TimeUnit { Millisecond, Second, Minute, Hour, Day, Week, Month, Year } public enum Tense { Future, // 未来引用如 in 2 days Past // 过去引用如 2 days ago }返回值约定方法返回一个字符串类型的资源键文档给出的示例返回值是DateHumanize_SingleMinuteAgo。从该示例键可以推断出命名约定由三部分拼接而成固定前缀DateHumanize_数量形态Single单数对应count 1或Multiple复数对应count ! 1时间单位 时态MinuteAgo过去时或形如MinuteFromNow未来时。即完整形态为DateHumanize_{Single|Multiple}{TimeUnit}{Ago|FromNow}。这与 DefaultFormatter.cs 中短语表的分支逻辑严格对应——TryFormatDateFromPhraseTable首先处理count 0返回 now、再处理count 1的phrase.Single、最后走phrase.Multiple的复数形态而count的默认值 1 也呼应了GetDatePhraseForm中Math.Abs(number) 1 ? Singular : Default的形态判定。count 参数的角色count决定输出单数还是复数短语。以 en.yml 的phrases.relativeDate.past段为例同一单位同时声明了single与multiple两种形态minute: single: a minute ago multiple: afterCount: ago forms: singular: minute default: minutes因此GetResourceKey(TimeUnit.Minute, Tense.Past, 1)走单数键对应a minute ago而GetResourceKey(TimeUnit.Minute, Tense.Past, 5)走复数键对应5 minutes ago。完整调用链从时间差到本地化短语资源键并非孤立存在它在DateTime.Humanize的完整流程中扮演中间契约角色。调用链如下入口DateHumanizeExtensions.cs 的Humanize(this DateTime input, ...)将输入时间与基准时间交给Configurator.DateTimeHumanizeStrategy.Humanize时间差计算DateTimeHumanizeAlgorithms.cs 的DefaultHumanize按阈值把时间差归约为某个TimeUnit与数量。例如ts.TotalSeconds 60时调用formatter.DateHumanize(TimeUnit.Second, tense, ts.Seconds)ts.TotalMinutes 60时调用formatter.DateHumanize(TimeUnit.Minute, tense, ts.Minutes)最终形成TimeUnit Tense count三元组格式化formatter.DateHumanize(timeUnit, tense, unit)依据该三元组从短语表解析出本地化短语DefaultFormatter.cs 第 51-54 行缺失时抛出InvalidOperationException资源键语义ResourceKeys.DateHumanize.GetResourceKey正是把第 2 步的三元组规范化为稳定键名的契约层供调试、日志与自定义本地化实现对照。其中第 3 步的短语解析遵循先单数后复数、count0 视为 now的顺序详见 DefaultFormatter.cs 的TryFormatDateFromPhraseTable第 396-441 行。实战基于资源键语义的自定义本地化理解了资源键的命名约定后即可按官方推荐方式定制日期文案。Humanizer 3.x 提供Configurator.Formatters注册表见 custom-localization.mdx可通过继承DefaultFormatter并覆写与资源键对应的方法来实现using System.Globalization; using Humanizer; Configurator.Formatters.Register( en-US, culture new ProductFormatter(culture)); var culture CultureInfo.GetCultureInfo(en-US); var formatter Configurator.Formatters.ResolveForCulture(culture); Console.WriteLine(formatter.DateHumanize_Now()); sealed class ProductFormatter(CultureInfo culture) : DefaultFormatter(culture) { public override string DateHumanize_Now() just now; }覆写点与ResourceKeys.DateHumanize的键一一对应DateHumanize_Now()对应Now字段DateHumanize_Never()对应Never字段DateHumanize(TimeUnit, Tense, int)对应GetResourceKey生成的各单复数键。此外需注意3.x 的LocaliserRegistry在首次解析后即冻结Register必须在启动阶段、任何业务代码调用 Humanizer 之前完成否则会抛异常。验证与兼容性仓库通过公共 API 审批测试锁定该契约。在 PublicApiApprovalTest.Approve_Public_Api.DotNet8_0.verified.txt 中可以确认DefaultFormatter暴露了DateHumanize(TimeUnit, Tense, int)、DateHumanize_Never()、DateHumanize_Now()三个虚方法与IFormatter接口及ResourceKeys.DateHumanize的字段/方法形成三方对应。若你自行实现IFormatter如文档所述针对罗马尼亚语5 days → 5 zile、阿拉伯语双数等复杂复数规则的语言DateHumanize三成员即是必须完整实现的契约面。小结ResourceKeys.DateHumanize是理解 Humanizer 日期人性化本地化架构的一把钥匙它定义了DateHumanize_Now、DateHumanize_Never两个特殊键和DateHumanize_{Single|Multiple}{TimeUnit}{Ago|FromNow}形式的常规键命名约定GetResourceKey(TimeUnit, Tense, int count 1)则把单位 时态 数量三元组规范化为稳定键名。在 3.x 实现中这些键名语义由 DefaultFormatter.cs 结合LocalePhraseTable短语表落地为具体语言的文案而 DateHumanizeExtensions.cs 与 DateTimeHumanizeAlgorithms.cs 提供了从时间差计算到三元组产出的完整上游链路。无论是排查本地化文案、编写自定义 Formatter还是为新的语言规则贡献代码均可从这套键名体系入手。赞分享开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载相关推荐Humanizer 资源键体系解析ResourceKeys.DateHumanize 与 DateTime.Humanize 的本地化键约定Humanizer 资源键体系解析ResourceKeys.DateHumanize 与 DateTime.Humanize 的本地化键约定 Humanize开发工具Humanizer 资源键机制解析深入 ResourceKeys.TimeSpanHumanize 与 TimeSpan.Humanize 的本地化约定Humanizer 资源键机制解析深入 ResourceKeys.TimeSpanHumanize 与 TimeSpan.Humanize 的本地化约定 本篇开发工具Humanizer 本地化资源键详解理解 ResourceKeys.DateHumanize 及其在日期人性化中的核心作用Humanizer 本地化资源键详解理解 ResourceKeys.DateHumanize 及其在日期人性化中的核心作用 本文围绕 Humanizer 中开发工具上一篇Apache NuttX 实时操作系统中的运行时栈统计技术解析下一篇在GraalVM Native Image中使用Alipay Fury序列化框架指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考