llm_translator 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/llm_translator +2 -12
  3. data/lib/llm_translator.rb +190 -94
  4. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4ba8b71b3fbec395856782c1d39551cd6c0aae45f929acea782bebff7725b402
4
- data.tar.gz: 336658ba8016e367826971801cd1ec80f5c0ccac741cbe8bced4ad15b6d137ce
3
+ metadata.gz: f3f1b58e414568d0d96d6955c6b0cb92fd9a4e15da6c2164ba27404c5ffffd79
4
+ data.tar.gz: 75210c017e5cfd1e89f6fba9730a29bc00d875b071a74db187578d361fcbbe89
5
5
  SHA512:
6
- metadata.gz: 18a70a5da904a92d758923f935fc0678dd8a8ea8bce9cd84c21c00c43bc766bfb096fb8bc04c3723c348e908f6d0f9a61e6834706cca0a9da4b1a83309f565d5
7
- data.tar.gz: 163cb0170971b850c49df6a3a1231e623be192ba8211cafd7a0dc804c82ee81c9c39a45f6ae6a67fa42bdec78a5f8d415f4e4fbb481f060488dfbd5669d010ba
6
+ metadata.gz: a868ed54d37c22b4913c45a41b907f935f7fc4830198dfa30a6f0f8da9b01b3fc3bad62b0828a0529114fd9fa1333ccf2b0fd9aa91d9998e0c4a1b1bd84ac021
7
+ data.tar.gz: 00cb71780f92b061628260cbc8cc4a69662c2e519ceddb3ce7e0e1cc3f38c3b40c4c7d60a71d4c6fcf4e8ebc5a7fe65c49f5d2aa7968208631ae995cb6a4f60a
data/bin/llm_translator CHANGED
@@ -1,15 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  require 'llm_translator'
4
3
 
5
- config = {
6
- :appkey => '0b53e81a10846a3a',
7
- :appscr => 'JLKxQO22jBft6w3PgLBh5as5iNJ1w5wS'
8
- }
9
-
10
- translator = LlmTranslator.new(config[:appkey], config[:appscr])
11
- if ARGV[0] == '-f'
12
- puts(translator.translate_mix_w File::readlines(ARGV[1]).join)
13
- else
14
- puts(translator.translate_mix_w ARGV[0])
15
- end
4
+ llm = LlmTranslator.new nil
5
+ pp llm.command(ARGV)
@@ -3,114 +3,210 @@ require 'digest'
3
3
  require 'net/http'
4
4
  require 'securerandom'
5
5
  require 'json'
6
+ require 'optparse'
7
+
8
+ LANG_CODE = %|
9
+ 中文 zh-CHS
10
+ 中文繁体 zh-CHT
11
+ 英文 en
12
+ 日文 ja
13
+ 韩文 ko
14
+ 法文 fr
15
+ 西班牙文 es
16
+ 葡萄牙文 pt
17
+ 意大利文 it
18
+ 俄文 ru
19
+ 越南文 vi
20
+ 德文 de
21
+ 阿拉伯文 ar
22
+ 印尼文 id
23
+ 南非荷兰语 af
24
+ 波斯尼亚语 bs
25
+ 保加利亚语 bg
26
+ 粤语 yue
27
+ 加泰隆语 ca
28
+ 克罗地亚语 hr
29
+ 捷克语 cs
30
+ 丹麦语 da
31
+ 荷兰语 nl
32
+ 爱沙尼亚语 et
33
+ 斐济语 fj
34
+ 芬兰语 fi
35
+ 希腊语 el
36
+ 海地克里奥尔语 ht
37
+ 希伯来语 he
38
+ 印地语 hi
39
+ 白苗语 mww
40
+ 匈牙利语 hu
41
+ 斯瓦希里语 sw
42
+ 克林贡语 tlh
43
+ 拉脱维亚语 lv
44
+ 立陶宛语 lt
45
+ 马来语 ms
46
+ 马耳他语 mt
47
+ 挪威语 no
48
+ 波斯语 fa
49
+ 波兰语 pl
50
+ 克雷塔罗奥托米语 otq
51
+ 罗马尼亚语 ro
52
+ 塞尔维亚语(西里尔文) sr-Cyrl
53
+ 塞尔维亚语(拉丁文) sr-Latn
54
+ 斯洛伐克语 sk
55
+ 斯洛文尼亚语 sl
56
+ 瑞典语 sv
57
+ 塔希提语 ty
58
+ 泰语 th
59
+ 汤加语 to
60
+ 土耳其语 tr
61
+ 乌克兰语 uk
62
+ 乌尔都语 ur
63
+ 威尔士语 cy
64
+ 尤卡坦玛雅语 yua
65
+ 阿尔巴尼亚语 sq
66
+ 阿姆哈拉语 am
67
+ 亚美尼亚语 hy
68
+ 阿塞拜疆语 az
69
+ 孟加拉语 bn
70
+ 巴斯克语 eu
71
+ 白俄罗斯语 be
72
+ 宿务语 ceb
73
+ 科西嘉语 co
74
+ 世界语 eo
75
+ 菲律宾语 tl
76
+ 弗里西语 fy
77
+ 加利西亚语 gl
78
+ 格鲁吉亚语 ka
79
+ 古吉拉特语 gu
80
+ 豪萨语 ha
81
+ 夏威夷语 haw
82
+ 冰岛语 is
83
+ 伊博语 ig
84
+ 爱尔兰语 ga
85
+ 爪哇语 jw
86
+ 卡纳达语 kn
87
+ 哈萨克语 kk
88
+ 高棉语 km
89
+ 库尔德语 ku
90
+ 柯尔克孜语 ky
91
+ 老挝语 lo
92
+ 拉丁语 la
93
+ 卢森堡语 lb
94
+ 马其顿语 mk
95
+ 马尔加什语 mg
96
+ 马拉雅拉姆语 ml
97
+ 毛利语 mi
98
+ 马拉地语 mr
99
+ 蒙古语 mn
100
+ 缅甸语 my
101
+ 尼泊尔语 ne
102
+ 齐切瓦语 ny
103
+ 普什图语 ps
104
+ 旁遮普语 pa
105
+ 萨摩亚语 sm
106
+ 苏格兰盖尔语 gd
107
+ 塞索托语 st
108
+ 修纳语 sn
109
+ 信德语 sd
110
+ 僧伽罗语 si
111
+ 索马里语 so
112
+ 巽他语 su
113
+ 塔吉克语 tg
114
+ 泰米尔语 ta
115
+ 泰卢固语 te
116
+ 乌兹别克语 uz
117
+ 南非科萨语 xh
118
+ 意第绪语 yi
119
+ 约鲁巴语 yo
120
+ 南非祖鲁语 zu|
6
121
 
7
122
  class LlmTranslator
8
- attr_accessor :q, :from, :to, :debug
9
- T_URL_PATH = "https://openapi.youdao.com/api"
10
- EN_REGEX = /\w+/
11
- ZH_REGEX = /[\u4e00-\u9fa5]+/
12
- MIX_EN_ZH_REGEX = /\w+|[^\w]+/
13
- MIX_ZH_EN_REGEX = /[\u4e00-\u9fa5]+|[^\u4e00-\u9fa5]+/
14
- ZH_SYMBOL = 'zh-CHS'
15
- EN_SYMBOL = 'en'
16
123
 
17
- def initialize(appkey, appscr, sign_type='v3')
18
- @appkey = appkey
19
- @appscr = appscr
20
- @sign_type = sign_type
21
- @dict_s_buffer = {}
22
- @dict_w_buffer = {}
23
- @debug = false
124
+ attr_accessor :text,
125
+ :auto, # 自动中英互译
126
+ :detail, # 详细翻译
127
+ :from, # 源语言
128
+ :to # 目标语言
129
+
130
+ def initialize(text)
131
+ @text = text
132
+ @url = 'https://openapi.youdao.com/api'
133
+ @appkey = '0b53e81a10846a3a'
134
+ @appscr = 'JLKxQO22jBft6w3PgLBh5as5iNJ1w5wS'
135
+ @sign_type = 'v3'
136
+ @auto = true
137
+ @detail= false
24
138
  end
25
139
 
26
- def translate_parsed(q, from=nil, to=nil, ext=nil, voice=nil, strict=nil, vocabld=nil)
27
- json = translate_request q, from, to
28
- begin
29
- JSON.parse json
30
- rescue => exception
31
- puts exception
32
- puts json if @debug
33
- end
140
+ def to_result
141
+ salt=SecureRandom::uuid
142
+ curtime = Time.now.utc.to_i.to_s
143
+ input = @text.length > 20 ? @text[0..10] + @text.length.to_s + @text[-10..-1] : @text
144
+ params = {
145
+ q: @text,
146
+ from: @from,
147
+ to: @to,
148
+ appKey: @appkey,
149
+ salt: salt,
150
+ sign: Digest::SHA256.hexdigest(@appkey + input + salt + curtime + @appscr),
151
+ signType: @sign_type,
152
+ curtime: curtime,
153
+ strict: !@auto
154
+ }
155
+ JSON.parse Net::HTTP.post_form(URI(@url), params).body
34
156
  end
35
157
 
36
- def translate_get_w(q, from=nil, to=nil, ext=nil, voice=nil, strict=nil, vocabld=nil)
37
- return @dict_w_buffer[q] if !@dict_w_buffer[q].nil?
38
- res = translate_parsed(q, from, to)
39
- begin
40
- @dict_w_buffer[q] = res['translation'][0]
41
- rescue => exception
42
- puts "havn't result for #{q}"
43
- puts res.to_json if @debug
44
- end
45
- end
158
+ def run
159
+ return to_result if @detail
46
160
 
47
- def translate_get_web_info(q, from=nil, to=nil, ext=nil, voice=nil, strict=nil, vocabld=nil)
48
- return @dict_s_buffer[q] if !@dict_s_buffer[q].nil?
49
- res = translate_parsed(q, from, to)
50
- begin
51
- @dict_s_buffer[q] = res['web']
52
- rescue => exception
53
- puts "havn't result for #{q}"
54
- puts res.to_json if @debug
55
- end
161
+ to_result['translation'][0]
56
162
  end
57
163
 
58
- def translate_mix_w(q)
59
- if (from == EN_SYMBOL)
60
- q.scan(MIX_EN_ZH_REGEX).map { |w| w.match?(EN_REGEX) ? snake_style(translate_get_w(w)) : w }.join
61
- else
62
- q.scan(MIX_ZH_EN_REGEX).map { |w| w.match?(ZH_REGEX) ? snake_style(translate_get_w(w)) : w }.join
63
- end
64
- end
164
+ def command(args)
165
+ OptionParser.new do |parser|
166
+ parser.banner = "用法: llm_translator [options]"
167
+ parser.separator ""
168
+ parser.separator "指定选项:"
65
169
 
66
- def translate_request(q, from=nil, to=nil, ext=nil, voice=nil, strict=nil, vocabld=nil)
67
- @curtime = Time.now.to_i.to_s
68
- @q = q
69
- @from = from
70
- @to = to
71
- auto_from_to q if @from.nil? || @to.nil?
72
- @salt=SecureRandom::uuid
73
- params = {
74
- q: @q,
75
- from: @from,
76
- to: @to,
77
- appKey: @appkey,
78
- salt: @salt,
79
- sign: LlmTranslator::sign(@appkey, @appscr, LlmTranslator::input(q), @curtime, @salt),
80
- signType: @sign_type,
81
- curtime: @curtime
82
- }
83
- @uri = URI(T_URL_PATH)
84
- res = Net::HTTP.post_form(@uri, params)
85
- res.body if res.is_a?(Net::HTTPSuccess)
86
- end
170
+ parser.on('-d', '--detail', '显示详细翻译结果,默认false') do
171
+ self.detail = true
172
+ end
173
+ parser.on('-a', '--auto', '严格按照指定from和to进行,默认false') do
174
+ self.auto = true
175
+ end
87
176
 
88
- def self.sign(appkey, appscr, input, curtime=Time.now.utc.to_s, salt=SecureRandom::uuid)
89
- Digest::SHA256.hexdigest(appkey + input + salt + curtime + appscr)
90
- end
177
+ parser.on('-i TEXT', '--input=TEXT', '待翻译文本, 必填项') do |text|
178
+ self.text = text
179
+ end
180
+ parser.on('-f FROM', '--from=FROM', '源语言') do |from|
181
+ self.from = from
182
+ end
183
+ parser.on('-t TO', '--to=TO', '目标语言') do |to|
184
+ self.to = to
185
+ end
91
186
 
92
- def self.input(q)
93
- input = q.length > 20 ? q[0,10] + q.length.to_s + q.reverse[0, 10].reverse : q
94
- end
187
+ parser.separator ""
188
+ parser.separator "通用选项:"
189
+ parser.on_tail("-h", "--help", "帮助信息") do
190
+ puts parser
191
+ exit
192
+ end
193
+ parser.on_tail("--lang", "语言编码信息") do
194
+ puts LANG_CODE
195
+ exit
196
+ end
197
+ parser.on_tail("--version", "版本信息") do
198
+ puts '0.0.1'
199
+ exit
200
+ end
95
201
 
96
- private
97
- def auto_from_to(q)
98
- if q.match?ZH_REGEX
99
- @from = ZH_SYMBOL
100
- @to = EN_SYMBOL
101
- else
102
- @from = EN_SYMBOL
103
- @to = ZH_SYMBOL
104
- end
105
- end
202
+ end.parse!(args)
106
203
 
107
- def camel_style(s)
108
- s = s.split(' ').map! {|w| w.capitalize}.join
109
- s[0] = s[0].downcase
110
- s
111
- end
204
+ if self.text.nil?
205
+ puts '请输入文本'
206
+ puts '-i, --input=TEXT 待翻译文本, 必填项'
207
+ exit
208
+ end
112
209
 
113
- def snake_style(s)
114
- s.split(' ').map {|w| w.downcase}.join('_')
210
+ run
115
211
  end
116
- end
212
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: llm_translator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liuliming
@@ -39,7 +39,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  requirements: []
42
- rubygems_version: 3.1.4
42
+ rubyforge_project:
43
+ rubygems_version: 2.7.6.2
43
44
  signing_key:
44
45
  specification_version: 4
45
46
  summary: a simple translator!