
开发工具【免费下载链接】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点击查看免费下载WordForm是 .NET 文本与本地化库 Humanizer 中的一个核心枚举用于在多语言环境下指定同一单词的不同书写形态完整形式Normal、缩写形式Abbreviation以及卢森堡语特有的 Eifeler 规则形态Eifeler。本指南围绕该枚举的三个成员展开结合 WordForm.cs、OrdinalizeExtensions.cs、NumberToWordsExtension.cs 等源码与测试说明它的定位、取值、实际调用链与使用场景读完即可在自己的项目中正确选择词形参数。WordForm 枚举的定义与定位WordForm定义在 WordForm.cs 中是 Humanizer 公共 API 的一部分namespace Humanizer; public enum WordForm { Normal, // 0 Abbreviation, // 1 Eifeler, // 2 }它解决的问题是同一个词在不同语言、不同语法环境下存在多种合法变体。例如西班牙语中第一的完整写法是primero置于名词前时则缩写为primer卢森堡语中数词/序数词受Eifeler 规则影响会丢失末尾的n。当 Humanizer 需要把数字转换为序数词如1st、1.º、primer或数量词时必须知道调用方想要哪种词形——这正是WordForm枚举存在的意义。从源码结构看WordForm被广泛用于两大扩展入口OrdinalizeExtensions.csOrdinalize()系列重载NumberToWordsExtension.csToWords()、ToOrdinalWords()系列重载。此外WordForm还被传递给底层转换器接口包括 IOrdinalizer.cs 中的Convert(int, string, WordForm)与Convert(int, string, GrammaticalGender, WordForm)以及INumberToWordsConverter中带wordForm参数的Convert方法——即词形选择最终会贯穿到各个语言转换器的核心逻辑中。三个成员的语义成员数值语义典型场景Normal0单词的完整/常规书写形态独立成句、需要完整词形时如primero、veintiunoAbbreviation1单词的缩短书写形态置于名词前作定语时如primer piso、tercer piso、veintiún cochesEifeler2受卢森堡语 Eifeler 规则影响的词形详见下文卢森堡语lb / lb-LU环境下的词形处理词形如何进入调用链以 Ordinalize 与 ToWords 为例WordForm不是孤立存在的常量它通过扩展方法重载被传入本地化转换器。以序数词为例OrdinalizeExtensions.cs 中的核心重载如下public static string Ordinalize(this string numberString, WordForm wordForm) Configurator.Ordinalizer.Convert(int.Parse(numberString), NormalizeOrdinalNumberString(numberString), wordForm);也就是说调用1.Ordinalize(WordForm.Abbreviation)时字符串被解析为整数后连同词形一起交给当前区域性对应的IOrdinalizer。当词形语义真正影响输出时实际工作由语言专用转换器完成。以西班牙语序数词为例测试用例见 OrdinalizeTests.cs// es-ES 环境下 1.Ordinalize(WordForm.Normal) - 1.º 1.Ordinalize(WordForm.Abbreviation)- 1.er // 英文环境两种词形结果一致 1.Ordinalize(WordForm.Normal) - 1st 1.Ordinalize(WordForm.Abbreviation)- 1st再叠加语法性别时OrdinalizeTests.cs// es-ES 环境下 1.Ordinalize(WordForm.Normal, GrammaticalGender.Masculine) - 1.º 1.Ordinalize(WordForm.Abbreviation, GrammaticalGender.Masculine)- 1.er 1.Ordinalize(WordForm.Normal, GrammaticalGender.Feminine) - 1.ª 1.Ordinalize(WordForm.Abbreviation, GrammaticalGender.Feminine) - 1.ª在单词形态word-form层面NumberToWordsExtension.cs 给出的西班牙语示例更直观// 西班牙语环境下 21.ToWords(WordForm.Normal) - veintiuno // Mi número favorito es el veintiuno 21.ToWords(WordForm.Abbreviation) - veintiún // En total, conté veintiún coches词形选择同样可以叠加语法性别NumberToWordsExtension.cs21.ToWords(WordForm.Abbreviation, GrammaticalGender.Masculine) - veintiún 21.ToWords(WordForm.Normal, GrammaticalGender.Feminine) - veintiuna // veintiuna personas这些能力的关键点是WordForm与GrammaticalGender是两个独立维度。前者控制完整 vs 缩写或 Eifeler 变体的形态后者控制阳性/阴性/中性的性别一致二者可以任意组合且每个组合都由对应语言转换器的模板决定是否产生差异。三个成员各自的底层实现从枚举值到输出文本Normal默认词形也是无参重载的隐式取值源码中所有不带wordForm参数的Convert重载都会落到WordForm.Normal。例如 WordFormTemplateOrdinalizer.cs 中public override string Convert(long number, string numberString) Convert(number, numberString, GrammaticalGender.Masculine, WordForm.Normal); public override string Convert(long number, string numberString, GrammaticalGender gender) Convert(number, numberString, gender, WordForm.Normal);也就是说Normal就是 Humanizer 的默认词形——不指定时永远按完整书写形态输出这也是1.Ordinalize()与1.Ordinalize(WordForm.Normal)结果一致的原因。从仓库的 API 兼容性测试PublicApiApprovalTest.DotNet8_0.verified.txt 等四个目标框架的 verified 文件可以确认WordForm及其Normal/Abbreviation/Eifeler成员是稳定的公共 API 契约。Abbreviation模板序数器中按性别选择缩写模式在 WordFormTemplateOrdinalizer.cs 中可以看到词形是如何驱动模式选择的Pattern GetPattern(GrammaticalGender gender, WordForm wordForm) { var set gender switch { GrammaticalGender.Feminine options.Feminine, GrammaticalGender.Neuter options.Neuter, _ options.Masculine }; return wordForm WordForm.Abbreviation ? set.Abbreviation : set.Normal; }每个语法性别维护一对PatternNormal 与 Abbreviation各自携带Prefix、DefaultSuffix、ExactReplacements、ExactSuffixes、LastDigitSuffixes等规则。Format方法按精确替换 → 精确后缀 → 末位数字后缀 → 默认后缀的优先级拼接输出。这解释了为何缩写词形只对真正区分的语言生效——英文的PatternSet中 Normal 与 Abbreviation 往往相同而西班牙语等语言则不同。Eifeler卢森堡语的末尾 n 消音规则Eifeler是WordForm中语义最特殊的一个成员它对应卢森堡语的 Eifeler 规则Eifeler Regel。该规则的实现位于 EifelerRule.csconst char Suffix n; // 阻止规则生效的首字母集合unitedzohay static readonly SearchValueschar BlockingCharacters SearchValues.Create(unitedzohay); public static string Apply(string word) word.TrimEnd(Suffix); public static string ApplyIfNeeded(string word, string nextWord) DoesApply(nextWord.AsSpan()) ? word.TrimEnd(Suffix) : word; public static bool DoesApply(ReadOnlySpanchar nextWord) { var trimmed nextWord.Trim(); return !trimmed.IsEmpty !BlockingCharacters.Contains(trimmed[0]); }简单来说当某个词如数词eent/zwee/dräi或序数词的末尾以n结尾而紧随其后的下一个词以u、n、i、t、e、d、z、o、h、a、y之外的字母开头时末尾的n会被省略若下一个词以这些阻塞字母之一开头则保留n。因此Eifeler词形与Normal/Abbreviation不同它通常不是由调用方直接指定给单个数字的而是 Humanizer 在生成卢森堡语短语时内部使用的形态例如 lb.yml 中出现了secondaryPlaceholderMode: luxembourgish-eifeler-n tensJoinerTransform: eifeler supportsEifelerRule: true这些配置表明卢森堡语区域不仅声明支持 Eifeler 规则还会在数十位连接tens joiner阶段应用eifeler变换并在占位符模式下使用luxembourgish-eifeler-n规则来决定末尾n的保留或去除。词形参数的传递路径与选择原则传递路径扩展方法 → 转换器 → 模式表一个典型的完整调用链可以概括为调用扩展方法如number.ToOrdinalWords(WordForm.Abbreviation)或1.Ordinalize(WordForm.Normal)扩展方法通过Configurator.Ordinalizers/Configurator.NumberToWords解析当前线程区域性或显式传入的CultureInfo对应的转换器WordForm作为参数传入IOrdinalizer/INumberToWordsConverter的Convert(...)重载语言专用实现如 WordFormTemplateOrdinalizer.cs按gender与wordForm双键选取Pattern并完成格式化输出。因此WordForm的取值只有结合具体区域性才有意义英文环境下Abbreviation与Normal输出相同西班牙语、卢森堡语等语言环境下才会产生可见差异。选择原则速查需要完整词形、独立使用选WordForm.Normal这也是缺省行为需要置于名词前作定语、追求自然表达选WordForm.Abbreviation如西语1.er piso、tercer piso、veintiún coches处理卢森堡语文本且需要符合 Eifeler 规则交由转换器内部处理WordForm.Eifeler一般不需要调用方手动指定拿不准语言是否区分词形可以先查看对应语言的 yml 配置如 lb.yml 中的supportsEifelerRule或直接运行测试矩阵中该语言的行验证输出。总结WordForm是 Humanizer 本地化体系中词形维度的入口Normal是默认的完整形态Abbreviation是名词前使用的缩短形态Eifeler则专为卢森堡语的 Eifeler 规则而生。它在 WordForm.cs 定义经由 OrdinalizeExtensions.cs 与 NumberToWordsExtension.cs 的扩展方法进入各语言转换器最终由模式表如 WordFormTemplateOrdinalizer.cs和规则类如 EifelerRule.cs落实为具体文本。理解词形 × 语法性别 × 区域性三者之间的关系就能在多语言应用中正确输出地道、符合语法习惯的序数词与数量词。赞分享开发工具【免费下载链接】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 WordForm 枚举全解析Normal、Abbreviation 与 Eifeler 词形选择指南Humanizer WordForm 枚举全解析Normal、Abbreviation 与 Eifeler 词形选择指南 WordForm 是 Humaniz开发工具Humanizer 词形WordForm枚举完全指南Normal、Abbreviation 与 Eifeler 的用法与底层原理Humanizer 词形WordForm枚举完全指南Normal、Abbreviation 与 Eifeler 的用法与底层原理 本篇技术指南围绕 Hum开发工具Humanizer 语法格GrammaticalCase枚举详解多语言词形变格与本地化输出指南Humanizer 语法格GrammaticalCase枚举详解多语言词形变格与本地化输出指南 GrammaticalCase 是 Humanizer 中开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考