llm_translator 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|