cocoapods-aqara-localzedLoader 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 49a023fe14fbf9ca4cfa935a7a5e47f6e9fcba70956b441010273085ae541f58
4
+ data.tar.gz: 98b59f8ba74e277b935e7e51894e9951cb1c29c7c0eaa0c6d4f4c1a687eb408c
5
+ SHA512:
6
+ metadata.gz: 99fb78c88a40cc9fa801044b2a1b21843bd84a37e9e1fe52bb0cda97d2f1c819299d1f1f3003c98efeb4c233dbfe6a0a14367328e76802f8344246f6296b279d
7
+ data.tar.gz: 469233d4e8861342c3b8fe5919d440316a1524fa5ba8728032efe8c29a01f0befb12b5a0672875cef7a026b8ee316a081bfd17f5705b44ce4ce846285b847a70
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+ pkg
3
+ .idea/
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cocoapods-aqara-localzedLoader.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem 'cocoapods'
8
+
9
+ gem 'mocha'
10
+ gem 'bacon'
11
+ gem 'mocha-on-bacon'
12
+ gem 'prettybacon'
13
+ gem 'colored2'
14
+ gem 'fileutils'
15
+ gem 'rubyzip'
16
+ gem 'httparty'
17
+ gem 'rubyXL'
18
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,178 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ cocoapods-aqara-localzedLoader (0.0.1)
5
+ claide (>= 1.0.2, < 2.0)
6
+ colored2
7
+ fileutils
8
+ httparty
9
+ rubyXL
10
+ rubyzip
11
+
12
+ GEM
13
+ remote: https://rubygems.org/
14
+ specs:
15
+ CFPropertyList (3.0.5)
16
+ rexml
17
+ activesupport (6.1.7)
18
+ concurrent-ruby (~> 1.0, >= 1.0.2)
19
+ i18n (>= 1.6, < 2)
20
+ minitest (>= 5.1)
21
+ tzinfo (~> 2.0)
22
+ zeitwerk (~> 2.3)
23
+ addressable (2.8.1)
24
+ public_suffix (>= 2.0.2, < 6.0)
25
+ algoliasearch (1.27.5)
26
+ httpclient (~> 2.8, >= 2.8.3)
27
+ json (>= 1.5.1)
28
+ atomos (0.1.3)
29
+ bacon (1.2.0)
30
+ claide (1.1.0)
31
+ cocoapods (1.15.2)
32
+ addressable (~> 2.8)
33
+ claide (>= 1.0.2, < 2.0)
34
+ cocoapods-core (= 1.15.2)
35
+ cocoapods-deintegrate (>= 1.0.3, < 2.0)
36
+ cocoapods-downloader (>= 2.1, < 3.0)
37
+ cocoapods-plugins (>= 1.0.0, < 2.0)
38
+ cocoapods-search (>= 1.0.0, < 2.0)
39
+ cocoapods-trunk (>= 1.6.0, < 2.0)
40
+ cocoapods-try (>= 1.1.0, < 2.0)
41
+ colored2 (~> 3.1)
42
+ escape (~> 0.0.4)
43
+ fourflusher (>= 2.3.0, < 3.0)
44
+ gh_inspector (~> 1.0)
45
+ molinillo (~> 0.8.0)
46
+ nap (~> 1.0)
47
+ ruby-macho (>= 2.3.0, < 3.0)
48
+ xcodeproj (>= 1.23.0, < 2.0)
49
+ cocoapods-core (1.15.2)
50
+ activesupport (>= 5.0, < 8)
51
+ addressable (~> 2.8)
52
+ algoliasearch (~> 1.0)
53
+ concurrent-ruby (~> 1.1)
54
+ fuzzy_match (~> 2.0.4)
55
+ nap (~> 1.0)
56
+ netrc (~> 0.11)
57
+ public_suffix (~> 4.0)
58
+ typhoeus (~> 1.0)
59
+ cocoapods-deintegrate (1.0.5)
60
+ cocoapods-downloader (2.1)
61
+ cocoapods-plugins (1.0.0)
62
+ nap
63
+ cocoapods-search (1.0.1)
64
+ cocoapods-trunk (1.6.0)
65
+ nap (>= 0.8, < 2.0)
66
+ netrc (~> 0.11)
67
+ cocoapods-try (1.2.0)
68
+ colored2 (3.1.2)
69
+ concurrent-ruby (1.3.3)
70
+ coveralls (0.8.23)
71
+ json (>= 1.8, < 3)
72
+ simplecov (~> 0.16.1)
73
+ term-ansicolor (~> 1.3)
74
+ thor (>= 0.19.4, < 2.0)
75
+ tins (~> 1.6)
76
+ csv (3.3.0)
77
+ diff-lcs (1.5.0)
78
+ docile (1.4.0)
79
+ escape (0.0.4)
80
+ ethon (0.16.0)
81
+ ffi (>= 1.15.0)
82
+ ffi (1.15.5)
83
+ fileutils (1.7.2)
84
+ fourflusher (2.3.1)
85
+ fuzzy_match (2.0.4)
86
+ gh_inspector (1.1.3)
87
+ httparty (0.22.0)
88
+ csv
89
+ mini_mime (>= 1.0.0)
90
+ multi_xml (>= 0.5.2)
91
+ httpclient (2.8.3)
92
+ i18n (1.12.0)
93
+ concurrent-ruby (~> 1.0)
94
+ json (2.6.2)
95
+ mini_mime (1.1.5)
96
+ minitest (5.16.3)
97
+ mocha (2.0.2)
98
+ ruby2_keywords (>= 0.0.5)
99
+ mocha-on-bacon (0.2.3)
100
+ mocha (>= 0.13.0)
101
+ molinillo (0.8.0)
102
+ multi_xml (0.6.0)
103
+ nanaimo (0.3.0)
104
+ nap (1.1.0)
105
+ netrc (0.11.0)
106
+ nokogiri (1.14.0-arm64-darwin)
107
+ racc (~> 1.4)
108
+ prettybacon (0.0.2)
109
+ bacon (~> 1.2)
110
+ public_suffix (4.0.7)
111
+ racc (1.6.2)
112
+ rake (13.0.6)
113
+ rexml (3.2.5)
114
+ rspec (3.12.0)
115
+ rspec-core (~> 3.12.0)
116
+ rspec-expectations (~> 3.12.0)
117
+ rspec-mocks (~> 3.12.0)
118
+ rspec-core (3.12.0)
119
+ rspec-support (~> 3.12.0)
120
+ rspec-expectations (3.12.0)
121
+ diff-lcs (>= 1.2.0, < 2.0)
122
+ rspec-support (~> 3.12.0)
123
+ rspec-mocks (3.12.0)
124
+ diff-lcs (>= 1.2.0, < 2.0)
125
+ rspec-support (~> 3.12.0)
126
+ rspec-support (3.12.0)
127
+ ruby-macho (2.5.1)
128
+ ruby2_keywords (0.0.5)
129
+ rubyXL (3.4.12)
130
+ nokogiri (>= 1.4.4)
131
+ rubyzip (>= 1.3.0)
132
+ rubyzip (2.3.2)
133
+ simplecov (0.16.1)
134
+ docile (~> 1.1)
135
+ json (>= 1.8, < 3)
136
+ simplecov-html (~> 0.10.0)
137
+ simplecov-html (0.10.2)
138
+ sync (0.5.0)
139
+ term-ansicolor (1.7.1)
140
+ tins (~> 1.0)
141
+ thor (1.2.1)
142
+ tins (1.31.1)
143
+ sync
144
+ typhoeus (1.4.0)
145
+ ethon (>= 0.9.0)
146
+ tzinfo (2.0.5)
147
+ concurrent-ruby (~> 1.0)
148
+ xcodeproj (1.24.0)
149
+ CFPropertyList (>= 2.3.3, < 4.0)
150
+ atomos (~> 0.1.3)
151
+ claide (>= 1.0.2, < 2.0)
152
+ colored2 (~> 3.1)
153
+ nanaimo (~> 0.3.0)
154
+ rexml (~> 3.2.4)
155
+ zeitwerk (2.6.6)
156
+
157
+ PLATFORMS
158
+ arm64-darwin-21
159
+
160
+ DEPENDENCIES
161
+ bacon
162
+ bundler (>= 2.1)
163
+ cocoapods
164
+ cocoapods-aqara-localzedLoader!
165
+ colored2
166
+ coveralls
167
+ fileutils
168
+ httparty
169
+ mocha
170
+ mocha-on-bacon
171
+ prettybacon
172
+ rake (>= 10.0)
173
+ rspec (>= 3.0)
174
+ rubyXL
175
+ rubyzip
176
+
177
+ BUNDLED WITH
178
+ 2.3.26
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 LuckZXF
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2024 zhaoxifan <179988305@qq.com>
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1 @@
1
+ # cocoapods-aqara-localzedLoader
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ def specs(dir)
4
+ FileList["spec/#{dir}/*_spec.rb"].shuffle.join(' ')
5
+ end
6
+
7
+ desc 'Runs all the specs'
8
+ task :specs do
9
+ sh "bundle exec bacon #{specs('**')}"
10
+ end
11
+
12
+ task :default => :specs
13
+
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'cocoapods-aqara-localzedLoader/gem_version.rb'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'cocoapods-aqara-localzedLoader'
8
+ spec.version = Localzedloader::VERSION
9
+ spec.authors = ['zhaoxifan']
10
+ spec.email = ['179988305@qq.com']
11
+ spec.description = %q{Aqara 多语言插件}
12
+ spec.summary = %q{Aqara 多语言从云端多语言平台下载并处理解析成Xcode需要的多语言文件}
13
+ spec.homepage = 'https://github.com/LuckZXF/cocoapods-aqara-localzedLoader'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '>= 2.1'
22
+ spec.add_development_dependency 'coveralls', '>= 0'
23
+ spec.add_development_dependency 'rake', '>= 10.0'
24
+ spec.add_development_dependency 'rspec', '>= 3.0'
25
+
26
+ spec.add_runtime_dependency 'claide', '>= 1.0.2', '< 2.0'
27
+ spec.add_runtime_dependency 'colored2'
28
+ spec.add_runtime_dependency 'fileutils'
29
+ spec.add_runtime_dependency 'rubyzip'
30
+ spec.add_runtime_dependency 'httparty'
31
+ spec.add_runtime_dependency 'rubyXL'
32
+ end
@@ -0,0 +1,102 @@
1
+ import shutil
2
+ import os, sys, stat
3
+ import requests
4
+ # import zipfile
5
+
6
+ # from __future__ import print_function
7
+
8
+ from volcengine.iam.IamService import IamService
9
+
10
+ from volcengine.ApiInfo import ApiInfo
11
+ from volcengine.Credentials import Credentials
12
+ from volcengine.base.Service import Service
13
+ from volcengine.ServiceInfo import ServiceInfo
14
+
15
+ from volcengine.auth.SignerV4 import SignerV4
16
+
17
+
18
+ # 浏览器登录后抓取的 cookie
19
+ myheader = '''
20
+ accept: application/json, text/plain, */*
21
+ accept-encoding: gzip, deflate, br
22
+ accept-language: zh
23
+ content-length: 155
24
+ content-type: application/json
25
+ cookie:experimentation_subject_id=IjZmOTJkNTAwLWRhNGQtNDllOS04NWJmLTViMDA3YWQyNzNmNSI%3D--ea0d856d9ab513dbab485429b3eb34d28baf575c; _ga_WF6G97Z3ZH=GS1.1.1655109583.7.0.1655109635.0; Hm_lvt_2df419cadb3951597d5f6df3a9e563d1=1677809958; __gads=ID=7b3f01c117b67f05-227ecfaf8fe20014:T=1688561915:RT=1695382086:S=ALNI_MZWfx6X7kl8bcHGz9c7kVOi5EJ97g; __gpi=UID=00000c96aea158eb:T=1688561915:RT=1695382086:S=ALNI_MaQoB1d1fZVX_-TNOZ9-FBy0AmJeQ; _ga_3EMB6JL0XV=GS1.1.1695897491.159.0.1695897491.60.0.0; _ga=GA1.1.726824286.1621481586; _ga_1MSMD2CRQ5=GS1.1.1695897492.25.0.1695897492.0.0.0; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%222698037175171e6d.824697002942386177%22%2C%22first_id%22%3A%2217954f52ff723e-046b05611aed99-113a6054-1296000-17954f52ff9e4c%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fuc.aqara.cn%2F%22%7D%2C%22%24device_id%22%3A%2217954f52ff723e-046b05611aed99-113a6054-1296000-17954f52ff9e4c%22%7D; Token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4MzcyOTA5NzQ3NmUwMmYyLjY0MjA2ODExMTgyMzk1MzkyMSIsImlzcyI6Imh0dHBzOi8vYWlvdC1ycGMuYXFhcmEuY24iLCJhY2NvdW50Ijoid2FuaHVhLnlhbkBhcWFyYS5jb20iLCJpYXRHbXQ4IjoxNjk2NjQ2MDYyLCJqdGkiOiI4ZjJlNDJiNTk1MTE0ODFmOTBiMDI3NWExZmE2OWNkZDlkMjVhZDY5NGUzMDQ4MGZhNDM3ZDM2NGI5YTFjZTIzIn0.FqpQfHNi--7FxAu4ytiGpQBwUdMVGDgdKaqZI4hLAus; Userid=83729097476e02f2.642068111823953921; currentSid=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4MzcyOTA5NzQ3NmUwMmYyLjY0MjA2ODExMTgyMzk1MzkyMSIsImlzcyI6Imh0dHBzOi8vYWlvdC1ycGMuYXFhcmEuY24iLCJpYXRHbXQ4IjoxNjk2NjQ2MDYyLCJqdGkiOiJhNDZlZjExOGE3YTk0ZTIwYTBkNmE5YTE5YjRiM2UxYjM0ZmMxNjYzZTUzYjQ1NzI4Zjk5YzhiYzRhZGUzMGE4In0.W_fWYx-B0kvj2uAUz0pw8vOhw5VKJ4SM5oCwpY_YZkk; currentAccount=wanhua.yan@aqara.com; userInfo=%7B%22accountCategory%22%3A%220%22%2C%22company%22%3A%7B%22companyId%22%3A1%2C%22companyName%22%3A%22%E7%BB%BF%E7%B1%B3%E8%81%94%E5%88%9B%22%7D%2C%22user%22%3A%7B%22avatarUrl%22%3A%22%22%2C%22companyId%22%3A1%2C%22email%22%3A%22wanhua.yan%40aqara.com%22%2C%22nickName%22%3A%22%22%2C%22userType%22%3A0%7D%7D; sidebarStatus=0
26
+ lang: zh
27
+ nonce: z7isblgw7hzfrlebmu7fzoukr20vpvs8
28
+ operate-platform: 40
29
+ origin: https://intl-lang.aqara.com
30
+ projectid: 5
31
+ referer: https://intl-lang.aqara.com/
32
+ sec-ch-ua: "Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"
33
+ sec-ch-ua-mobile: ?1
34
+ sec-ch-ua-platform: "Android"
35
+ sec-fetch-dest: empty
36
+ sec-fetch-mode: cors
37
+ sec-fetch-site: same-origin
38
+ time: 1690280776221
39
+ timestamp: 1690280776221
40
+ user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36
41
+ '''
42
+
43
+
44
+
45
+ def MakeHeader(headerText):
46
+ s = headerText.strip().split('\n')
47
+ s = {x.split(':', 1)[0].strip() :x.split(':', 1)[1].strip() for x in s}
48
+ return s
49
+
50
+ def DownLatestLocalizableSource(downloadPath):
51
+ iam_service = IamService()
52
+ ak123 = 'AKLTZTFjNzFjYTczMzJjNGQyMjg0NTRkZjQ2ZTA4MTE1Mjc'
53
+ sk = 'TkdRMU9HSTJZemt6Tmpkak5ERXhaVGt5WXpVNU5qSmxPVFkzWWpBM1pqRQ=='
54
+ iam_service.set_ak(ak123)
55
+ iam_service.set_sk(sk)
56
+
57
+ api_info = ApiInfo("GET", "/", {"serviceName": "i18n_openapi", "Action": "ProjectNamespaceTextDownload",
58
+ "Version": "2021-05-21"}, {}, {})
59
+ service_info = ServiceInfo("iam.volcengineapi.com", {'Accept': 'application/json'},
60
+ Credentials(ak123,sk, 'i18n_openapi', 'cn-north-1'),20,20)
61
+ iam_service.service_info = service_info
62
+
63
+ params = {'async': 0, 'projectId': 5788, 'namespaceId': 42835, 'format': 'xlsx'}
64
+
65
+ r = iam_service.prepare_request(api_info, params, 0)
66
+ SignerV4.sign(r, service_info.credentials)
67
+ url = r.build(0)
68
+ # print(r.headers)
69
+ # res = iam_service.projectNamespaceTextDownload(params)
70
+
71
+ resp = iam_service.session.get(url, headers=r.headers,
72
+ timeout=(service_info.connection_timeout,service_info.socket_timeout))
73
+ if resp.status_code == 200:
74
+ print('下载exccel成功')
75
+ with open(downloadPath+"/download.xlsx", "wb") as code:
76
+ # 将 response 保存成本地文件
77
+ code.write(resp.content)
78
+ code.close()
79
+ else:
80
+ raise Exception(resp.text)
81
+
82
+
83
+
84
+ # def Unzip():
85
+ # f = zipfile.ZipFile("./localizable.zip", 'r') # 压缩文件位置
86
+ # for file in f.namelist():
87
+ # f.extract(file, "../") # 解压位置
88
+ # f.close()
89
+ # os.remove('./localizable.zip')
90
+
91
+ def UpdateSource_language():
92
+ DownLatestLocalizableSource()
93
+ return './download.xlsx'
94
+
95
+ # Unzip()
96
+ # os.rename('./download.xlsx', '../hit_all_str.xlsx')
97
+ # shutil.copy('./download.xlsx', '../source_language/hit_all_str.xlsx')
98
+ # os.remove('./download.xlsx')
99
+
100
+ if __name__ == '__main__':
101
+ localizable_path = sys.argv[1]
102
+ DownLatestLocalizableSource(localizable_path)
@@ -0,0 +1,83 @@
1
+
2
+ # require 'file'
3
+ $LOAD_PATH << '.'
4
+ # -*- coding: UTF-8 -*-
5
+ require 'rubyXL'
6
+ require_relative './StringElement'
7
+
8
+ class File_util
9
+
10
+ attr_accessor :keys_hash
11
+ #读取excel 返回StringElement数组
12
+ def read_excel(filename)
13
+ unless filename != nil
14
+ puts "读取的excel为空"
15
+ return
16
+ end
17
+
18
+ workbook = RubyXL::Parser.parse filename
19
+ worksheet = workbook[0]
20
+ row1 = worksheet[0]
21
+ @key_hash = getkeyHash(row1)
22
+ lang_hash = {}
23
+ worksheet.each_with_index do |row,rowIndex|
24
+ next unless rowIndex>0
25
+ ele = StringElement.new
26
+ self_key = ''
27
+ # 设置StringElement的值
28
+ row.cells.each_with_index do |cell, i|
29
+ next unless cell.value
30
+ case i
31
+ when 0
32
+ self_key = cell.value
33
+ else
34
+ key = @key_hash[i]
35
+ if key
36
+ ele.langHash[key] = (cell.value || '')
37
+ end
38
+ end
39
+ end
40
+
41
+ lang_hash[self_key] = ele
42
+ end
43
+ lang_hash
44
+ end
45
+
46
+ #根据第一行来获取当前cell的key
47
+ # return {1:selfkey,2:en,3:zh....} 方便excel取
48
+ # Command+Option+L 对齐快捷键
49
+ def getkeyHash(row1,ios:true)
50
+ keys_hash = {}
51
+ key = ''
52
+ row1.cells.each_with_index do |cell, i|
53
+ next unless cell.value && i > 3
54
+ if cell.value === "zh-CN"
55
+ key = 'zh-Hans'
56
+ elsif cell.value == "zh-TW"
57
+ key = 'zh-Hant-TW'
58
+ elsif cell.value == "zh-HK"
59
+ key = 'zh-HK'
60
+ else
61
+ key = cell.value.split("-")[0]
62
+ end
63
+ # result = cell.value.scan(/.*?\[(.*)\]/)
64
+ keys_hash[i] = key
65
+ end
66
+ keys_hash
67
+ end
68
+
69
+ def getLangList
70
+ list = @key_hash.values
71
+ list.delete_if{|item| item.downcase === "keys"||item.downcase === "source" || item.downcase === "length limit" || item.downcase === "context"}
72
+ list
73
+ end
74
+ end
75
+
76
+ # hash = File_util.read_excel"hit_all.xls"
77
+ # puts hash.keys.size
78
+ # hash.each do |key,value|
79
+ # puts value
80
+ # end
81
+
82
+ # p "key-sname".split("-")[0]
83
+
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+ require 'httparty'
3
+ require 'zip'
4
+ require 'fileutils'
5
+ require 'colored2'
6
+
7
+ class LanguageDownloader
8
+
9
+ HeaderString = %Q{User-Agent: volc-sdk-python/v1.0.109
10
+ Accept-Encoding: gzip, deflate
11
+ Accept: application/json
12
+ Host: iam.volcengineapi.com
13
+ X-Date: 20231017T062815Z
14
+ X-Content-Sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
15
+ Authorization: HMAC-SHA256 Credential=AKLTZTFjNzFjYTczMzJjNGQyMjg0NTRkZjQ2ZTA4MTE1Mjc/20231017/cn-north-1/i18n_openapi/request, SignedHeaders=host;x-content-sha256;x-date, Signature=fb24f4211cf74f4e985cdd72f09156c288bd8e078d9867813327084204587b0a
16
+ Connection: keep-alive
17
+ }
18
+
19
+ def self.makeHeader
20
+ headerArray = HeaderString.split("\n")
21
+ header = {}
22
+ headerArray.each do |str|
23
+ header[str.split(":",2)[0].strip] = str.split(":",2)[1].strip
24
+ end
25
+ header
26
+ end
27
+ def self.download
28
+
29
+ # puts makeHeader
30
+ #下载文件
31
+
32
+ params = {"projectIdList":[5],"langIds":[1,2,3,9,10,11,12,13,14,15,16,17,18],"fileTypeList":["excel"],"auditState":1,"valueState":0,"userId":"","value":"","tagIds":nil,"bizUseTagIds":nil,"pkeys":[]}
33
+ response = HTTParty.post('https://intl-lang.aqara.com/v1.0/lumi/language/file/export', body: JSON.generate(params), headers:LanguageDownloader.makeHeader)
34
+ # puts response.body
35
+ unless response.body["code"] == nil
36
+ 3.times do
37
+ puts "资源包下载失败了!!!!! code:#{response.body}".red
38
+ end
39
+ return
40
+ end
41
+ destation_path = "./localize.zip"
42
+ if File.exist? destation_path
43
+ FileUtils.rm_rf destation_path
44
+ end
45
+ File.open(destation_path,"w") do |io|
46
+ io.binmode
47
+ io.write response.body
48
+ end
49
+
50
+ # 解压缩文件到指定目录
51
+ f_path = ''
52
+
53
+ Zip::File.open(destation_path) do |zip_file|
54
+ zip_file.each do |f|
55
+ f_path = File.join('./','hit_all.xls')
56
+ File.delete f_path if File.exist? f_path
57
+ # FileUtils.mkdir_p(File.dirname(f_path))
58
+ f.extract(f_path)
59
+ end
60
+
61
+ end
62
+ if File.exist? destation_path
63
+ FileUtils.rm_rf destation_path
64
+ end
65
+
66
+ f_path
67
+ end
68
+
69
+ end
70
+
71
+ #LanguageDownloader.download
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class StringElement
4
+ attr_accessor :langHash
5
+ attr_accessor :ios_list
6
+ attr_accessor :android_list
7
+
8
+ def initialize
9
+ @langHash = {}
10
+ @ios_list = []
11
+ @android_list = []
12
+ end
13
+
14
+ def to_s
15
+ @langHash.to_s
16
+ end
17
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../ios_bundle_generate'
2
+ module Pod
3
+ class Command
4
+ # This is an example of a cocoapods plugin adding a top-level subcommand
5
+ # to the 'pod' command.
6
+ #
7
+ # You can also create subcommands of existing or new commands. Say you
8
+ # wanted to add a subcommand to `list` to show newly deprecated pods,
9
+ # (e.g. `pod list deprecated`), there are a few things that would need
10
+ # to change.
11
+ #
12
+ # - move this file to `lib/pod/command/list/deprecated.rb` and update
13
+ # the class to exist in the the Pod::Command::List namespace
14
+ # - change this class to extend from `List` instead of `Command`. This
15
+ # tells the plugin system that it is a subcommand of `list`.
16
+ # - edit `lib/cocoapods_plugins.rb` to require this file
17
+ #
18
+ # @todo Create a PR to add your plugin to CocoaPods/cocoapods.org
19
+ # in the `plugins.json` file, once your plugin is released.
20
+ #
21
+ class Download < Command
22
+ self.summary = 'langDownnloader for user'
23
+
24
+ self.description = <<-DESC
25
+ help user downnloade language resource
26
+ DESC
27
+
28
+ self.arguments = []
29
+
30
+ def initialize(argv)
31
+ super
32
+ # puts "初始化:#{argv}"
33
+ project_directory = argv.option('project-directory')
34
+ puts project_directory
35
+ project_directory = Dir.pwd if project_directory.nil?
36
+ puts project_directory
37
+ @project_directory = Pathname.new(project_directory).expand_path
38
+ puts project_directory
39
+
40
+ end
41
+ def self.options
42
+ [
43
+ ['--project-directory=/project/dir/', 'The path to the root of the project directory']
44
+ ].concat(super)
45
+ end
46
+ def run
47
+ UI.puts "项目路径 #{@project_directory}"
48
+ BundleGenerater.generate(@project_directory)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1 @@
1
+ require 'cocoapods-aqara-localzedLoader/command/localzedLoader'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ExcelGenerate
4
+
5
+ end
@@ -0,0 +1,3 @@
1
+ module Localzedloader
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+ require_relative './LanguageDownloader'
3
+ require_relative './File_util'
4
+ require 'fileutils'
5
+ # require 'colored2'
6
+ class BundleGenerater
7
+
8
+ # INFO_PLIST_ARRAY = [NSAppleMusicUsageDescription","NSLocalNetworkUsageDescription"]
9
+ INFO_PLIST_MAP = {:common_app_name=>["CFBundleDisplayName"],other_perm_camera_permission_description:["NSCameraUsageDescription"],other_perm_location_permission_description:["NSLocationAlwaysAndWhenInUseUsageDescription","NSLocationWhenInUseUsageDescription","NSLocationAlwaysUsageDescription"],other_perm_bluetooth_permission_description:["NSBluetoothPeripheralUsageDescription","NSBluetoothAlwaysUsageDescription"],access_content_permssion_storage:["NSPhotoLibraryUsageDescription"],other_perm_mic_permission_description:["NSMicrophoneUsageDescription"],other_set_permissions_homedata_desc:["NSHomeKitUsageDescription"],other_set_permissions_asr_text:["NSSpeechRecognitionUsageDescription"],device_add_device:["Add_Device_Title"],automation_add:["Add_Automation_Title"],device_create_scene:["Add_Scene_Title"]}
10
+ def self.generate(project_path)
11
+ # 下载excel
12
+ system "cd #{File.dirname(__FILE__)};python3 DownloadNewLanguage.py #{project_path}"
13
+ f_path = "#{project_path}/download.xlsx"
14
+ print(f_path)
15
+
16
+ # 读取excel到内存
17
+ file_til = File_util.new
18
+ hash = file_til.read_excel f_path
19
+ if File.exist? f_path
20
+ FileUtils.rm_rf f_path
21
+ end
22
+ puts "一共有 #{hash.keys.size} 条文案".green
23
+
24
+ # 创建文件夹
25
+ file_til.getLangList.each do |lang|
26
+ # puts lang
27
+ localized_file = "./#{lang}.lproj/Localizable.strings"
28
+ dir = File.dirname localized_file
29
+ FileUtils.rm_rf localized_file
30
+ FileUtils.mkdir_p dir
31
+ new_file = File.new(localized_file, "w")
32
+ new_file.close
33
+
34
+ end
35
+
36
+ #生成资源文件
37
+ hash.each do |key, stringElement|
38
+ num = 0
39
+ stringElement.langHash.each do |lang, value|
40
+ # puts "#{lang}:#{value}"
41
+ next if lang.downcase === "selfkey" or value === nil or value === " " or value === ""
42
+ value = self.handleValue value,stringElement
43
+ value.scan(/%@/) do |match|
44
+ num = match.size if num == 0
45
+ if num != match.size
46
+ puts "key:#{key}中%@ 数量不一致,请检查".red
47
+ end
48
+ end
49
+ str = %Q|"#{key}" = "#{value}";\n|
50
+ localized_file = "./#{lang}.lproj/Localizable.strings"
51
+
52
+ if File.exist?(localized_file)
53
+ File.open(localized_file, "a") do |io|
54
+ io.write str
55
+ end
56
+ end
57
+
58
+ #如果是infoplist里的key,就写入指定的文件
59
+ if key === nil
60
+ puts "key值为空,#{stringElement.ios_list}"
61
+ elsif key === "NSAppleMusicUsageDescription" || key === "NSLocalNetworkUsageDescription"
62
+ file = "./#{lang}.lproj/InfoPlist.strings"
63
+ File.open(file, "a") do |io|
64
+ io.write str
65
+ end
66
+ elsif INFO_PLIST_MAP.has_key?(key.to_sym)
67
+ # puts "---key:#{key}"
68
+ keys = INFO_PLIST_MAP[key.to_sym]
69
+ keys.each do |info_key|
70
+ file = "./#{lang}.lproj/InfoPlist.strings"
71
+ str = %Q|"#{info_key}" = "#{value}";\n|
72
+ File.open(file, "a") do |io|
73
+ io.write str
74
+ end
75
+ end
76
+ end
77
+
78
+ end
79
+ end
80
+
81
+ #验证导出的多语言包格式是否正确
82
+ puts '开始校验多语言包格式'.red
83
+ # puts "\e[31m 开始校验多语言包格式\e[0m"
84
+ file_til.getLangList.each do |lang|
85
+ localized_file = "./#{lang}.lproj/Localizable.strings"
86
+ file = "./#{lang}.lproj/InfoPlist.strings"
87
+ if File.exist?(file)
88
+ system("plutil #{file}")
89
+ end
90
+ if File.exist?(localized_file)
91
+ system("plutil #{localized_file}")
92
+ end
93
+ end
94
+
95
+ #拷贝到代码仓库里
96
+ #查找bundle路径
97
+ bundPath = ""
98
+ info_plist_path = "./AqaraHome/Resource"
99
+ require 'find'
100
+ Find.find("./") do |filePath|
101
+ if filePath.end_with?("LMFramework.bundle")
102
+ bundPath = filePath
103
+ elsif filePath.end_with?("Resource")
104
+ end
105
+ end
106
+ unless bundPath != ""
107
+ puts '没有拷贝'
108
+ return
109
+ end
110
+
111
+ copy_info_plist = false
112
+ file_til.getLangList.each do |lang|
113
+ path = "./#{lang}.lproj/Localizable.strings"
114
+ dest = bundPath + "/#{lang}.lproj"
115
+ dest2 = "./AqaraHome/Resource/#{lang}.lproj"
116
+ FileUtils.mkdir_p dest
117
+ FileUtils.cp(path,dest2)
118
+ FileUtils.mv("#{path}",dest,force:true)
119
+
120
+ info_plist_file = "./#{lang}.lproj/InfoPlist.strings"
121
+ # puts "path::::::#{info_plist_file}"
122
+ if File.exist? info_plist_file
123
+ copy_info_plist = true
124
+ dest = "./AqaraHome/Resource/#{lang}.lproj"
125
+ FileUtils.mkdir_p dest
126
+ FileUtils.mv("#{info_plist_file}",dest,force:true)
127
+ end
128
+ FileUtils.rm_rf (File.dirname(path))
129
+ end
130
+ puts "多语言拷贝到目录:#{bundPath}"
131
+ if copy_info_plist
132
+ puts "InfoPlist多语言拷贝到目录:#{info_plist_path}"
133
+ end
134
+
135
+ end
136
+ #对多语言的value进行处理
137
+ def self.handleValue(value='',stringElement = nil)
138
+ #替换{=}
139
+ value = value.gsub(/{#}/,"%@")
140
+ value = value.gsub(/""/,'"')
141
+ value = value.gsub(/\\"/,'"')
142
+ value = value.gsub(/""/,'"')
143
+ value = value.gsub(/"/,'\"')
144
+ #fix "common_time_day_with_space" = "\ day \";
145
+ if value.end_with?"\\"
146
+ value = value.chop
147
+ end
148
+ if value.end_with?"\\"
149
+ value = value.chop
150
+ end
151
+ value
152
+ end
153
+
154
+ end
155
+
156
+
157
+ # BundleGenerater.generate
158
+ # map = {:common_app_name=>["CFBundleDisplayName"]}
159
+ # if map.has_key?("common_app_name".to_sym)
160
+ # puts map[:common_app_name]
161
+ # end
162
+ # BundleGenerater.generate
163
+ # ios_list = ["%@","%d"]
164
+ # str = "{#}盏灯开着,真的吗{#}"
165
+ # i = -1
166
+ # str = str.gsub(/{#}/) do |matched|
167
+ # i+=1
168
+ # ios_list[i]
169
+ # end
170
+ #
171
+ # p str
172
+ # puts "111".green
@@ -0,0 +1 @@
1
+ require 'cocoapods-aqara-localzedLoader/gem_version'
@@ -0,0 +1,8 @@
1
+ require 'cocoapods-aqara-localzedLoader/command'
2
+ require_relative 'cocoapods-aqara-localzedLoader/ios_bundle_generate'
3
+ module Pod
4
+ Pod::HooksManager.register('cocoapods-aqara-localzedLoader', :pre_install) do |context|
5
+ args = ['download', "--project-directory=#{Config.instance.installation_root}"]
6
+ Pod::Command.run(args)
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ module Pod
4
+ describe Command::Localzedloader do
5
+ describe 'CLAide' do
6
+ it 'registers it self' do
7
+ Command.parse(%w{ localzedLoader }).should.be.instance_of Command::Localzedloader
8
+ end
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,50 @@
1
+ require 'pathname'
2
+ ROOT = Pathname.new(File.expand_path('../../', __FILE__))
3
+ $:.unshift((ROOT + 'lib').to_s)
4
+ $:.unshift((ROOT + 'spec').to_s)
5
+
6
+ require 'bundler/setup'
7
+ require 'bacon'
8
+ require 'mocha-on-bacon'
9
+ require 'pretty_bacon'
10
+ require 'pathname'
11
+ require 'cocoapods'
12
+
13
+ Mocha::Configuration.prevent(:stubbing_non_existent_method)
14
+
15
+ require 'cocoapods_plugin'
16
+
17
+ #-----------------------------------------------------------------------------#
18
+
19
+ module Pod
20
+
21
+ # Disable the wrapping so the output is deterministic in the tests.
22
+ #
23
+ UI.disable_wrap = true
24
+
25
+ # Redirects the messages to an internal store.
26
+ #
27
+ module UI
28
+ @output = ''
29
+ @warnings = ''
30
+
31
+ class << self
32
+ attr_accessor :output
33
+ attr_accessor :warnings
34
+
35
+ def puts(message = '')
36
+ @output << "#{message}\n"
37
+ end
38
+
39
+ def warn(message = '', actions = [])
40
+ @warnings << "#{message}\n"
41
+ end
42
+
43
+ def print(message)
44
+ @output << message
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ #-----------------------------------------------------------------------------#
metadata ADDED
@@ -0,0 +1,212 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cocoapods-aqara-localzedLoader
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - zhaoxifan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-08-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: coveralls
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: claide
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 1.0.2
76
+ - - "<"
77
+ - !ruby/object:Gem::Version
78
+ version: '2.0'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: 1.0.2
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: colored2
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: fileutils
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubyzip
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: httparty
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rubyXL
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ description: Aqara 多语言插件
160
+ email:
161
+ - 179988305@qq.com
162
+ executables: []
163
+ extensions: []
164
+ extra_rdoc_files: []
165
+ files:
166
+ - ".gitignore"
167
+ - Gemfile
168
+ - Gemfile.lock
169
+ - LICENSE
170
+ - LICENSE.txt
171
+ - README.md
172
+ - Rakefile
173
+ - cocoapods-aqara-localzedLoader.gemspec
174
+ - lib/cocoapods-aqara-localzedLoader.rb
175
+ - lib/cocoapods-aqara-localzedLoader/DownloadNewLanguage.py
176
+ - lib/cocoapods-aqara-localzedLoader/File_util.rb
177
+ - lib/cocoapods-aqara-localzedLoader/LanguageDownloader.rb
178
+ - lib/cocoapods-aqara-localzedLoader/StringElement.rb
179
+ - lib/cocoapods-aqara-localzedLoader/command.rb
180
+ - lib/cocoapods-aqara-localzedLoader/command/localzedLoader.rb
181
+ - lib/cocoapods-aqara-localzedLoader/excel_generate.rb
182
+ - lib/cocoapods-aqara-localzedLoader/gem_version.rb
183
+ - lib/cocoapods-aqara-localzedLoader/ios_bundle_generate.rb
184
+ - lib/cocoapods_plugin.rb
185
+ - spec/command/localzedLoader_spec.rb
186
+ - spec/spec_helper.rb
187
+ homepage: https://github.com/LuckZXF/cocoapods-aqara-localzedLoader
188
+ licenses:
189
+ - MIT
190
+ metadata: {}
191
+ post_install_message:
192
+ rdoc_options: []
193
+ require_paths:
194
+ - lib
195
+ required_ruby_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ required_rubygems_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ requirements: []
206
+ rubygems_version: 3.3.26
207
+ signing_key:
208
+ specification_version: 4
209
+ summary: Aqara 多语言从云端多语言平台下载并处理解析成Xcode需要的多语言文件
210
+ test_files:
211
+ - spec/command/localzedLoader_spec.rb
212
+ - spec/spec_helper.rb