复数,性别,缩写数,序数,运行时语言变化,重叠和截断检查等等。
Soluling已为.NET,Angular和Delphi实施了国际化(I18N)API的集合。每个API均为平台的标准I18N API添加其他功能,例如,支持语法数字,语法性别,缩写数字和序数。库还包括用于执行应用程序运行时语言开关的API,或在运行时选择初始语言。该库还包含API,该API在运行时检查您的用户界面是否存在截断或重叠控件等问题。最后,Delphi库包含FireMonKey的适当本地化资源。
每个API为100%本地API。这意味着它包含完整的源代码,不需要其他文件。 .NET API仅包含C#代码,不需要其他库或数据文件。以同样的方式,Angular API仅包含打字稿代码,而Delphi API仅包含Delphi代码。代码使用的规则已从CLDR提取到属于API源代码的一部分的源代码文件中。您不需要ICU库或CLDR XML文件,但是将包括逻辑和规则在内的所有内容都编译到您的应用程序文件中。
大多数资源格式(例如,.net中的.RESX,Java中的Properties和Delphi中的资源字符串)仅支持普通字符串。语法数字和性别需要结构数据,其中一个字符串有几种与语言有关的变体。例如,用英语,“我有N车”需要两个变体:
| 语法数字 | 。网 | Delphi和Java |
|---|---|---|
| 单数 | 我有{0}汽车 | 我有%D车 |
| 复数 | 我有{0}汽车 | 我有%D车 |
一些平台(例如Android和Angular)对复数具有内置支持,这就是为什么它们还具有特殊的资源格式来容纳多种模式。但是,.NET,Delphi和Java没有这样的资源格式。该库使用ICU消息格式将所有相关模式存储到标准资源字符串中。语法是:
{parameter, kind, form1 {pattern1}[ form2 {pattern2}]...[ formN {patternN}]
在哪里
kind是plural , gender或select
form是语法数字形式或语法性别形式的代码。
下表包含可能的形式。
| 形式 | 与 | 描述 |
|---|---|---|
| 零 | 语法数字 | nullar |
| 一 | 语法数字 | 单数 |
| 二 | 语法数字 | 双重的 |
| 很少 | 语法数字 | Paucal,试用或类似 |
| 许多 | 语法数字 | 更大的paucal或类似 |
| 其他 | 语法数字 语法性别 | 复数 中性的 |
| 男性 | 语法性别 | 男性 |
| 女性 | 语法性别 | 女性 |
| 中性的 | 语法性别 | 中性的。和其他相同。 |
除上述表格外,您还可以使用具有语法数字的操作员。运营商是:
| 形式 | 例子 | 描述 |
|---|---|---|
| = n | = 1 | 平等的 |
| 〜n | 〜12 | 大约 |
| > n | > 5 | 大于 |
| <n | <10 | 少于 |
| > = n | > = 5 | 更大或等于 |
| <= n | <= 10 | 较少或等于 |
| n..m | 2..6 | 范围 |
.NET的汽车样品将是:
{plural, one {I have {0} car} other {I have {0} cars}}
芬兰版本将是
{plural, one {Minulla on {0} auto} other {Minulla on {0} autoa}}
日语版将是
{plural, other {{0}車持っています}}
日语只有一种形式,通用,因此字符串仅包含其他模式。
该模式可以包含多模式语法之前和之后的文本。以下示例包含“我有”和“我有”和“”。在多模式之后。
I have {plural, one {{0} car} other {{0} cars}}.
对于Delphi,样本将是
I have {plural, one {%d car} other {%d cars}}.
如果您的图案需要具有牙套({或}),则必须使用逃脱。 角色也必须逃脱。例如,“我喜欢滑雪{Alpine s},但是,我只有{0}滑雪板”是
other {I like skiing {alpine\s} however, I only have {0} pairs of skis}
请参阅SamplesDelphiVCLPatterns , SamplesDelphiFMXPatterns , SamplesWindowsFormsPatterns和SamplesWPFPatterns目录。
这些课程还支持旧版多模式格式
one;I have {0} car;other;I have {0} cars
但是,对这种遗产格式的支持已被贬低。 ICU消息格式是推荐格式。
API支持多个具有复数/性别的占位符。在这种情况下,您已经将字符串分成部分,每个部分包含一个占位符,然后将片段链接成一个逻辑句子。使用next表格启动新部分。例如,如果我想说“我有C车和S板”,您将创建以下包含两个部分的字符串:一个用于汽车,另一个用于滑雪。每个部分都包含两个模式:单数和复数。
I have {plural, one {{0} car} other {{0} cars}} and {plural, one {{0} ski} other {{0} skis}}.
该字符串包含两个多模式:汽车和滑雪板。
I have {plural, one {%d car} other {%d cars}} and {plural, one {%d ski} other {%d skis}}.
请参阅SamplesDelphiVCLPatternsMulti , SamplesDelphiFMXPatternsMulti , SamplesWindowsFormsPatternsMulti and SamplesWPFPatternsMulti samples。
如果我们需要在屏幕上显示大量数字,则用户可能很难轻松理解一个数字的大小。例如,如果我们有编号144563217,我们应该如何显示。我们可以根据用户区域的规则进行格式化。例如,在美国,它将为14,456,217。尽管这比未格式化的数字更容易理解,但它仍然几乎没有问题。第一个是需要一些努力来了解数字的幅度。其次,它需要很多空间。一种解决方案是将其像14,000,000一样。这更容易理解。为了使它更容易理解,我们也可以像14m一样缩写它。缩写形式越来越受欢迎。不幸的是,每种语言都是缩写的方式。大多数语言使用三位数。例如,英语:K,M,G,T等。但是,某些亚洲语言使用四位数。例如日语:万(10,000),亿(100,000,000),等。
CLDR包含缩写数字的规则。缩写数字API使用这些规则将数字(整数或浮点)作为字符串格式化。结果可以是一根长弦,例如1400万,短至1400万,或者是货币字符串,例如1400万美元。
CLDR不包含有关如何从数字创建序数的信息。我一直从各种来源收集规则。没有适当规则的语言仍然很多。以母语为母语的人将不胜感激。
某些平台(例如Angular)没有运行时翻译加载。此API实现了它。使用此API,您现在可以进行一个汇编,一个部署和一个为所有语言服务的URL。
运行时语言开关是一个功能,该应用程序可以在运行时更改其用户界面的语言。该库包含为此的代码。语言更改的实施方式没有形式或对话框重新加载,并且应用程序的当前状态保持不变。
运行时语言开关API适用于Delphi VCL,Delphi Firemonkey,.NET Windows表单和.NET WPF。
当我们将字符串翻译成另一种语言时,总是有可能将翻译比原始字符串更长。如果原始语言是英语,则尤其如此,因为英语是一种更紧凑的语言,例如德语或芬兰语。当翻译的字符串变长时,弦的一部分被截断或两个或更多字符串被重叠的风险。这样的情况很难找到。用户界面检查器API会有所帮助。您临时链接到代码是一个API,运行时,应用程序正在编写一个带有屏幕截图的报表文件,显示截断,并用清晰的颜色标记了重叠。您可以立即查看截断或重叠的位置。
用户界面检查器API适用于Delphi VCL,Delphi Firemonkey,.NET Windows表单和.NET WPF。
LibraryNET包含.NET API。 LibraryNETStandard包含一个.NET标准库,其中包含用于语法数字,语法性别,缩写数字和序数的API。将其编译并将其添加到您的解决方案中,最后将库添加到项目的参考中。由于库的无UI部分是.NET标准,因此它可以与Windows表单,WPF,ASP.NET,.NET CORE和XAMARIN一起使用。您还可以使用以.NET 2.0开头的任何.NET版本对其进行编译。
您可以通过Nuget获得API。
Install-Package Soluling
目前,我们有Windows表单和WPF的样本。我们将很快添加ASP.NET和ASP.NET核心样本。
LibraryAngular包含角度API。 API需要Angular 9或更高版本。使用它的最简单方法是通过NPM。
npm install @soluling/angular要了解有关此API的更多信息,请阅读其文档。
LibraryDelphi包含Delphi API。将它们包含在您的应用程序中的最简单方法是将项目的搜索路径添加到您的项目的搜索路径中。图书馆支持Delphi 7或更高版本。但是,要获得所有需要Delphi XE2或更高版本的功能。
FireMonKey没有适当的本地化资源。如果您的目标移动平台(例如iOS或Android),则不能使用资源DLL。包括本地化资源在内的所有内容都必须在主应用程序中。该库包含用于FireMonKey本地化的解决方案。它使用特殊的.ntres文件格式将单个.fmx文件存储在单个.ntres文件中。该文件包含您要支持的所有语言中的资源。最后,您将.ntres文件作为自定义资源添加到您的应用程序中,并使用库的API调用来访问资源。您不必修改现有应用程序,以便进行多种语言。唯一的例外是资源字符串。您不能使用。如果您具有硬编码字符串,并且要本地化,请将其包装在_t函数中。
procedure TForm1.UpdateStrings ;
begin
Label1.Text := _T( ' Hello world ' );
end ;如果您已经有一个现有资源字符串将其删除并使用_T函数。另外,您必须为每种形式致电_t。
procedure TForm1.FormCreate (Sender: TObject);
begin
_T(Self);
end ;请参阅SamplesDelphiFMXPatternsSimple样本。
您也可以在VCL应用程序中使用.ntres资源,但是建议将标准VCL本地化方法与资源字符串和资源DLL或本地化EXE文件一起使用。
C ++构建器没有正式支持。所有这些代码都应与C ++构建器一起使用,但从未进行过测试。
我们选择.NET,Angular和Delphi作为第一个平台,原因有一些。首先是我们喜欢Angular,C#和Delphi。其次,Delphi和.net都缺乏对几个I18N API的支持,例如复数和性别。第三个是Delphi和.NET也将从运行时语言开关中受益。第四是Delphi用于创建大小重要的移动应用程序。第五是我相信C# + .NET核心将有光明的未来。
我们正在考虑将类似的类实现为打字稿(JavaScript出现在此过程中)。但是,Typescript主要与已经具有很好的支持型复数和性别的Angular一起使用。我们实现了Angular的运行时翻译加载。我们可能仅对打字稿实现缩写数字API。
我们可以为Java实施类似的库。 Java已经有ICU实现,因此,如果您在服务器端上使用Java,则可以使用它。如果您在客户端上使用Java,则很可能是Android,并且支持多数,但不支持性别。我们仍在考虑Java支持。让我们知道它是否有用。
BinCldrToCode.exe是一种工具,可将CLDR XML文件的规则提取到C#和Delphi文件。通常,您不必使用它,因为该库已经包含所有CLDR语言中包含规则的提取的文件。但是,如果要创建仅包含某些语言的规则文件,则可以使用CldrToCode.exe创建自己的规则文件。例如,如果要创建仅包含英语,德语和法语的规则文件:
CldrToCode.exe -lang:en;de;fr D:CLDRcommon
这将创建NtPluralData.pas , NtNumberData.pas , PluralData.cs和NumberData.cs 。
几乎没有努力,我们也可以制作cldrtocode.exe来创建Java,Typescript和Python文件。
此存储库还包含国际化和本地化样本应用程序,文件和数据库。 Soluling有数十个样本涵盖了几个主要的编程平台和文件格式。样本是最新的,并使用其编程语言的最新版本。
Soluling包含以下平台的样本:
如果您打算使用多个模式字符串本地化应用程序,则最好使用一个支持语法数字和语法性别的本地化工具。 Soluling对多种模式有很好的支持,并且它支持ASP.NET,.NET,Angular,React,Blazor,Delphi,Python,Java,以及其他100多种其他文件和数据库格式。
Soluling支持连续本地化,机器翻译,交互式模糊匹配启用的翻译内存,交互式术语,导入/导出,构建工具和云翻译。

您可以从这里下载Soluling。
笔记!目前,Soluling和Solumake是Windows应用程序,仅在Windows上工作。但是,我们计划将未来的基于Web的版本发布到Linux和MacOS。