llm_translator 0.0.1
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.
- checksums.yaml +7 -0
- data/bin/llm_translator +15 -0
- data/lib/llm_translator.rb +116 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4ba8b71b3fbec395856782c1d39551cd6c0aae45f929acea782bebff7725b402
|
4
|
+
data.tar.gz: 336658ba8016e367826971801cd1ec80f5c0ccac741cbe8bced4ad15b6d137ce
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 18a70a5da904a92d758923f935fc0678dd8a8ea8bce9cd84c21c00c43bc766bfb096fb8bc04c3723c348e908f6d0f9a61e6834706cca0a9da4b1a83309f565d5
|
7
|
+
data.tar.gz: 163cb0170971b850c49df6a3a1231e623be192ba8211cafd7a0dc804c82ee81c9c39a45f6ae6a67fa42bdec78a5f8d415f4e4fbb481f060488dfbd5669d010ba
|
data/bin/llm_translator
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'llm_translator'
|
4
|
+
|
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
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# test code
|
2
|
+
require 'digest'
|
3
|
+
require 'net/http'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
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
|
+
|
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
|
24
|
+
end
|
25
|
+
|
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
|
34
|
+
end
|
35
|
+
|
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
|
46
|
+
|
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
|
56
|
+
end
|
57
|
+
|
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
|
65
|
+
|
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
|
87
|
+
|
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
|
91
|
+
|
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
|
95
|
+
|
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
|
106
|
+
|
107
|
+
def camel_style(s)
|
108
|
+
s = s.split(' ').map! {|w| w.capitalize}.join
|
109
|
+
s[0] = s[0].downcase
|
110
|
+
s
|
111
|
+
end
|
112
|
+
|
113
|
+
def snake_style(s)
|
114
|
+
s.split(' ').map {|w| w.downcase}.join('_')
|
115
|
+
end
|
116
|
+
end
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: llm_translator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Liuliming
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-01-09 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: a simple translator!
|
14
|
+
email: 876475897@qq.com
|
15
|
+
executables:
|
16
|
+
- llm_translator
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/llm_translator
|
21
|
+
- lib/llm_translator.rb
|
22
|
+
homepage: https://github.com/Beginner125/ruby-center/tree/main/LlmTranslator
|
23
|
+
licenses:
|
24
|
+
- MIT
|
25
|
+
metadata:
|
26
|
+
source_code_uri: https://github.com/Beginner125/ruby-center/tree/main/LlmTranslator
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubygems_version: 3.1.4
|
43
|
+
signing_key:
|
44
|
+
specification_version: 4
|
45
|
+
summary: a simple translator!
|
46
|
+
test_files: []
|