Kaynağa Gözat

feat(xtintin): 新增 trans 模块,提供翻译 API

dzp 1 yıl önce
ebeveyn
işleme
4a64656bc8

+ 1 - 0
plugins/lib/xtintin/__init__.tin

@@ -17,6 +17,7 @@ load-file plugins/lib/xtintin/list.tin;
 load-file plugins/lib/xtintin/table.tin;
 load-file plugins/lib/xtintin/slist.tin;
 load-file plugins/lib/xtintin/set.tin;
+load-file plugins/lib/xtintin/trans.tin;
 load-file plugins/lib/xtintin/queue.tin;
 load-file plugins/lib/xtintin/time.tin;
 load-file plugins/lib/xtintin/path.tin;

+ 13 - 0
plugins/lib/xtintin/string.tin

@@ -357,6 +357,19 @@ PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 
 
 #func {split} {#return {@str.Split{%0}}};
 
+///=== {
+// #@ str.Chars <字符串>
+//    把字符串拆成一系列单个的字符,结果是由组成它的每个字符构成的字符串列表。
+//    本函数也可以简写为 chars,两个名称用途和用法完全相同。
+// };
+#func {str.Chars} {
+    #local str {%0};
+    #list str {tokenize} {$str};
+    #return {@slist.FromList{$str}};
+};
+
+#func {chars} {#return {@str.Chars{%0}}};
+
 ///=== {
 // #@ util.ColorBar <字符串> <颜色1> <权重1> <颜色2> <权重2> [...]
 //    将字符串按照颜色及其对应的权重占比,渲染成彩色字符串。注意颜色参数须按顺序排列。

+ 103 - 0
plugins/lib/xtintin/trans.tin

@@ -0,0 +1,103 @@
+#nop vim: set filetype=tt:;
+
+/*
+本文件属于 PaoTin++ 的一部分。
+PaoTin++ © 2020~2024 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
+*/
+
+#nop 本文件是 xtintin 的一部分,实现了一些基于字典的翻译函数;
+
+#var {gDictC2D} {
+    {零}    {0}
+    {一}    {1}
+    {二}    {2}
+    {三}    {3}
+    {四}    {4}
+    {五}    {5}
+    {六}    {6}
+    {七}    {7}
+    {八}    {8}
+    {九}    {9}
+    {十}    {10}
+    {百}    {100}
+    {千}    {1000}
+    {万}    {10000}
+    {亿}    {100000000}
+};
+
+///=== {
+// #@ trans.Word <待翻译字符串> <字典名称> [<语言名称>]
+//    提供基本的字符串翻译功能。翻译字典由字典名称指定的表格变量来指定。
+//    如果同时提供了语言名称,则意味着字典中存在多种语言条目,那么应当选择指定的语言翻译结果。
+//    本函数是基础功能,实践中一般用 trans.String 或者 trans.Simple
+// };
+#func {trans.Word} {
+    #local input {%1};
+    #local trans-word-dict {%2};
+    #local sub {%3};
+
+    #local value {${${trans-word-dict}[$input]}};
+    #if { "$value" == "" } {
+        #return {$input};
+    };
+    #elseif { &value[] == 0 } {
+        #return {$value};
+    };
+    #elseif { "$sub" != "" } {
+        #return {$value[$sub]};
+    };
+    #else {
+        #return {$input};
+    };
+};
+
+///=== {
+// #@ trans.String <待翻译字符串> <字典名称> [<语言名称>]
+//    提供基本的字符串翻译功能。翻译字典由字典名称指定的表格变量来指定。
+//    如果同时提供了语言名称,则意味着字典中存在多种语言条目,那么应当选择指定的语言翻译结果。
+// };
+#func {trans.String} {
+    #local input {%1};
+    #local trans-string-dict {%2};
+    #local sub {%3};
+
+    #local output {@str.Replace{{$input};{{*UTF8}{.}};{@@trans.Word{{&1};$trans-string-dict}}}};
+
+    #return {$output};
+};
+
+///=== {
+// #@ trans.Simple <待翻译字符串> <源语言> <目标语言>
+//    提供基本的字符串翻译功能。将待翻译字符串中,每个源语言中的字符,替换成目标语言中对应的字符。
+// };
+#func {trans.Simple} {
+    #local input    {%1};
+    #local src      {@trans.expand-set{%2}};
+    #local dst      {@trans.expand-set{%3}};
+
+    #if { @slist.Size{$src} != @slist.Size{$dst} } {
+        warnLog 源语言和目标语言字典长度不同。;
+        #return {$input};
+    };
+
+    #list src create {@str.Chars{$src}};
+    #list dst create {@str.Chars{$dst}};
+    #local trans-helper-dict {@list.ZipAs{{{%s}{%s}};{$src};{$dst}}};
+    #local trans-helper-dict {@fp.Transform{{$trans-helper-dict};VALUE}};
+
+    #local output {@str.Replace{{$input};{{*UTF8}{.}};{@@trans.Word{{&1};trans-helper-dict}}}};
+    #return {$output};
+};
+
+///=== {
+// #@ trans.Number <中文数字串>
+//    将中文数字串翻译成阿拉伯字符串。
+//    注意这和 math.ParseCN 不同,并不会识别十进制。它只是对文字的简单翻译。
+// };
+#func {trans.Number} {
+    #local input {%1};
+
+    #local output {@str.Replace{{$input};{{*UTF8}{.}};{@@trans.Word{{&1};gDictC2D}}}};
+    #return {$output};
+};