applocale 0.3.1 → 0.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: f95ade74b4e2369217664efb0025c0f52644ebc06827febed2a6db64cf02c5a1
4
- data.tar.gz: 824da18da0ec106873135501d91bdc3ac56c7c7689fa766ba302cb20187a17d5
2
+ SHA1:
3
+ metadata.gz: 2a97e66f54bd439a61cf20ed5f4437b25f2ff105
4
+ data.tar.gz: d407f1d876105f666af854f3e8f276edc7c3ff47
5
5
  SHA512:
6
- metadata.gz: 97f11063db3d637f52c79aa60e4af2900e604e2adc2c2eb3d21b4526f97d27f04eb68cd97c8c9db66bae10f7f0689f7f22883c73d0ca6eed38db21839329b302
7
- data.tar.gz: 54810e8306223226e46bb89028fadbf97bec7b72c4f410f4d604bb75a90b74a9fa8f93fdff64b15131f9e5092e25d5f9ff619a9d61f38cc6b5b15bbe23865966
6
+ metadata.gz: dcfb679486adde4bd7a8b494f43cc562b7dcb5c516e52d821916f5afbfc3728eec7809e11a582b7d35986fb713c797a6f57f3528d12a4d88acf5d6201ef1da98
7
+ data.tar.gz: 78bc79fe9ed3f26817c4940a70b8c88d60f9413b5dba5c518c45eb62ff266f2e6e1c4ba66d8b32fde91d03aeb0d2152579d2a2844232f4f9a3374ed4437255d1
@@ -1,5 +1,6 @@
1
1
  link: "https://docs.google.com/spreadsheets/d/1Wy2gN_DSw-TCU2gPCzqvYxLfFG5fyK5rodXs5MLUy8w"
2
2
  platform: "#{platform}"
3
+ resource_folder: "#{resource_folder}"
3
4
  xlsxpath: "#{xlsxpath}"
4
5
  export_format: "#{export_format}"
5
6
  #google_credentials_path: "#{google_credentials_path}"
@@ -25,33 +26,4 @@ sheetname:
25
26
  zh_TW: "C"
26
27
  zh_CN: "D"
27
28
  isSkipEmptyKey: true
28
-
29
-
30
- # def convent_to_locale(lang, key, value)
31
- # return value
32
- # end
33
-
34
- # def before_convent_to_locale(lang, key, value)
35
- # return value
36
- # end
37
-
38
- # def after_convent_to_locale(lang, key, value)
39
- # return value
40
- # end
41
-
42
- # def parse_from_locale(lang, key, value)
43
- # return value
44
- # end
45
-
46
- # def before_parse_from_locale(lang, key, value)
47
- # return value
48
- # end
49
-
50
- # def after_parse_from_locale(lang, key, value)
51
- # return value
52
- # end
53
-
54
- # def is_skip_by_key(sheetname, key)
55
- # return true
56
- # end
57
-
29
+ # convertFile: "convert.rb"
@@ -14,28 +14,32 @@ module Applocale
14
14
  class Init < Thor
15
15
  desc "init [platform]", "Create Config File, platform: ios | android | json"
16
16
  option :path, :desc => "Project dir path"
17
+ option :config_file, :desc => "the filename of config, default AppLocaleFile"
17
18
  def init(platform = nil)
18
- Applocale.create_config_file(platform, options[:path])
19
+ Applocale.create_config_file(platform, options[:path], options[:config_file])
19
20
  end
20
21
 
21
22
  desc "update", "Download xlsx and convert to localization string file"
22
23
  option :path, :desc => "Project dir path"
24
+ option :config_file, :desc => "the filename of config, default AppLocaleFile"
23
25
  def update()
24
- Applocale.start_update(options[:path])
26
+ Applocale.start_update(options[:path],options[:config_file])
25
27
  end
26
28
 
27
29
  desc "update_local", "Convert local xlsx file to localization string file"
28
30
  option :path, :desc => "Project dir path"
31
+ option :config_file, :desc => "the filename of config, default AppLocaleFile"
29
32
  def update_local()
30
- Applocale.start_local_update(nil,options[:path])
33
+ Applocale.start_local_update(nil,options[:path], options[:config_file])
31
34
  end
32
35
 
33
36
  desc "reverse", "Convert localization string file to xlsx"
34
37
  option :skip, :desc => "Skip Error"
35
38
  option :path, :desc => "Project dir path"
39
+ option :config_file, :desc => "the filename of config, default AppLocaleFile"
36
40
  def reverse()
37
41
  is_skip = !options[:skip].nil?
38
- Applocale::start_reverse(is_skip, options[:path])
42
+ Applocale::start_reverse(is_skip, options[:path],options[:config_file])
39
43
  end
40
44
 
41
45
  desc "version", "show the AppLocale verions"
@@ -50,9 +54,19 @@ module Applocale
50
54
 
51
55
  desc "findkey [key]", "findkey for ios and convert to xlsx"
52
56
  option :path, :desc => "Project dir path"
57
+ option :config_file, :desc => "the filename of config, default AppLocaleFile"
53
58
  def findkey(key)
54
- Applocale::findkey(key, options[:path])
59
+ Applocale::findkey(key, options[:path], options[:config_file])
55
60
  end
61
+
62
+
63
+ desc "compare two string file", "compare two string file"
64
+ option :file2, :desc => "second file path"
65
+ def compare(file1, file2)
66
+ Applocale::compare(file1, file2)
67
+ end
68
+
56
69
  end
57
70
  end
58
71
  end
72
+
@@ -0,0 +1,223 @@
1
+ require File.expand_path('../../../Util/platform.rb', __FILE__)
2
+
3
+ module Applocale
4
+ class CompareStringFile
5
+
6
+ attr_reader :in_multiline_comments, :platform, :file1, :file2, :errorlist
7
+
8
+ def initialize(platform, file1, file2)
9
+ @platform = platform
10
+ @file1 = file1
11
+ @file12 = file2
12
+
13
+
14
+ @errorlist = Array.new()
15
+ @platform = platform
16
+
17
+ obj1 = {}
18
+ obj2 = {}
19
+ if platform == Platform::IOS
20
+ obj1 = parse_ios_file(file1)
21
+ obj2 = parse_ios_file(file2)
22
+ elsif platform == Platform::ANDROID
23
+ obj1 = parse_aos_file(file1)
24
+ obj2 = parse_aos_file(file2)
25
+ end
26
+ compare(obj1,obj2)
27
+ end
28
+
29
+
30
+ def compare(obj1, obj2)
31
+ missingkeyInObj2 = Array.new
32
+ mismatch = Array.new
33
+ duplicateKey = Array.new
34
+ notSame = {}
35
+ nobj2 = obj2
36
+ obj1.each do |key, value|
37
+ if nobj2[key].nil?
38
+ missingkeyInObj2.push(key)
39
+ else
40
+ obj1Value = value
41
+ obj2Value = obj2[key]
42
+ if obj1Value.length != obj2Value.length
43
+ mismatch.push(key)
44
+ elsif obj1Value.length != 1
45
+ duplicateKey.push(key)
46
+ elsif obj1Value[0] != obj2Value[0]
47
+ notSame[key] = {obj1: obj1Value[0],obj2: obj2Value[0]}
48
+ end
49
+ end
50
+ nobj2.delete(key)
51
+ end
52
+ puts "==> not Same value:"
53
+ notSame.each do |key, value|
54
+ puts "key = #{key}"
55
+ puts "#{value[:obj1]}<"
56
+ puts "#{value[:obj2]}<"
57
+ end
58
+ puts "==> duplicateKey"
59
+ puts duplicateKey
60
+ puts "==> mismatch"
61
+ puts mismatch
62
+ puts "==> missingkeyInObj2"
63
+ puts missingkeyInObj2
64
+ puts "==> missingKeyInObj1"
65
+ puts nobj2
66
+ end
67
+
68
+
69
+
70
+ def parse_aos_file(strings_path)
71
+ strings_keys = {}
72
+
73
+ return if !File.exist? strings_path
74
+ puts "Start to Parse xml file: \"#{strings_path}\" ...".green
75
+
76
+ xml_doc = Nokogiri::XML(File.open(strings_path))
77
+ string_nodes = xml_doc.xpath("//string")
78
+ string_nodes.each do |node|
79
+ key = node["name"]
80
+ value = node.content
81
+ if !key.nil? && key.strip.length > 0
82
+ if strings_keys[key].nil?
83
+ strings_keys[key] = Array.new
84
+ end
85
+ strings_keys[key].push(value)
86
+
87
+ # if @strings_keys[key].nil?
88
+ # @strings_keys[key] = Hash.new
89
+ # @keys_list.push(key)
90
+ # end
91
+ # if @strings_keys[key][lang.to_s].nil?
92
+ # @strings_keys[key][lang.to_s] = Hash.new
93
+ # @strings_keys[key][lang.to_s][:value] = self.remove_escape(lang, key, value)
94
+ # else
95
+ # error = ErrorUtil::ParseLocalizedError::DuplicateKey.new(key, -1, strings_path, lang, -1).raise
96
+ # end
97
+ end
98
+ end
99
+ return strings_keys
100
+
101
+ end
102
+
103
+ def parse_ios_file(path)
104
+ strings_keys = {}
105
+ @in_multiline_comments = false
106
+ linenum = 0
107
+ begin
108
+ IO.foreach(path, mode: 'r:bom|utf-8') {|line|
109
+ linenum += 1
110
+ line.strip!
111
+ if !@in_multiline_comments
112
+ next if line.start_with?('#')
113
+ next if line.start_with?('//')
114
+ end
115
+ if line.length <= 0
116
+ next
117
+ end
118
+
119
+ while true
120
+ key, line = parse_token(linenum, line, "=", path)
121
+ line.strip!
122
+
123
+ if not line.start_with?("=")
124
+ if !@in_multiline_comments && line.length > 0
125
+ error = ErrorUtil::ParseLocalizedError::WrongFormat.new(path, "", linenum).raise
126
+ end
127
+ break
128
+ end
129
+ line.slice!(0)
130
+
131
+ value, line = parse_token(linenum, line, ";", path)
132
+ line.strip!
133
+
134
+ if line.start_with?(";")
135
+ line.slice!(0)
136
+ else
137
+ error = ErrorUtil::ParseLocalizedError::WrongFormat.new(path, "", linenum).raise
138
+ key = nil
139
+ value = nil
140
+ break
141
+ end
142
+ if strings_keys[key].nil?
143
+ strings_keys[key] = Array.new
144
+ end
145
+ strings_keys[key].push(value)
146
+ end
147
+ }
148
+ rescue Exception => e
149
+ puts e.message
150
+ ErrorUtil::ParseLocalizedError::InvalidFile.new(file1).raise
151
+ end
152
+
153
+ return strings_keys
154
+ end
155
+
156
+
157
+ def parse_token(linenum, line, sep, file)
158
+ n = 0
159
+ in_value = false
160
+ in_quote = false
161
+ in_escape = false
162
+ value = ""
163
+
164
+ for ch in line.chars
165
+ prech = ""
166
+ prech = line.chars[n-1] if n > 0
167
+ n += 1
168
+ if @in_multiline_comments
169
+ if "#{prech}#{ch}" == "*/"
170
+ @in_multiline_comments = false
171
+ in_value = false
172
+ value = ""
173
+ end
174
+ next
175
+ end
176
+
177
+ if not in_value
178
+ if ch == "\""
179
+ in_quote = true
180
+ in_value = true
181
+ elsif ch != " " and ch != "\t" and ch != sep
182
+ in_value = true
183
+ value << ch
184
+ end
185
+ next
186
+ end
187
+
188
+ if in_escape
189
+ value << prech
190
+ value << ch
191
+ in_escape = false
192
+ elsif ch == "\\"
193
+ in_escape = true
194
+ elsif in_quote
195
+ if ch == "\""
196
+ break
197
+ else
198
+ value << ch
199
+ end
200
+ else
201
+ if ch == " " or ch == "\t" or ch == sep
202
+ n -= 1
203
+ break
204
+ elsif "#{prech}#{ch}" == "/*"
205
+ @in_multiline_comments = true
206
+ elsif "#{prech}#{ch}" == "//"
207
+ return value, ""
208
+ elsif ch == "#"
209
+ return value, ""
210
+ elsif "#{prech}#{ch}".length > 1
211
+ error = ErrorUtil::ParseLocalizedError::WrongFormat.new(file, "", linenum)
212
+ @errorlist.push(error)
213
+ return value, ""
214
+ else
215
+ value << ch
216
+ end
217
+ end
218
+ end
219
+ return value, line[n..-1]
220
+ end
221
+
222
+ end
223
+ end
@@ -2,6 +2,7 @@ require File.expand_path('../../setting.rb', __FILE__)
2
2
  require File.expand_path('../../../Util/error_util.rb', __FILE__)
3
3
  require File.expand_path('../../../Util/regex_util.rb', __FILE__)
4
4
  require File.expand_path('../../ParseModel/parse_model_module.rb', __FILE__)
5
+ require File.expand_path('../../../Util/convert_util.rb', __FILE__)
5
6
 
6
7
  require 'colorize'
7
8
  require 'csv'
@@ -18,7 +19,7 @@ module Applocale
18
19
  @langlist
19
20
  @sheetobj_list
20
21
  @is_skip_empty_key
21
- @injectobj
22
+ @convertFile
22
23
 
23
24
 
24
25
  def initialize(setting)
@@ -30,7 +31,7 @@ module Applocale
30
31
  @allkey_dict = {}
31
32
  @all_error = Array.new
32
33
  @is_skip_empty_key = setting.is_skip_empty_key
33
- @injectobj = setting.injection
34
+ @convertFile = setting.convert_file
34
35
  # puts "Start to Parse CSV: \"#{csv_directory}\" ...".green
35
36
  parse
36
37
  end
@@ -56,8 +57,8 @@ module Applocale
56
57
  row_content = parse_row(sheet_name, index, row, sheet_content.keyStr_with_colno, sheet_content.lang_with_colno_list)
57
58
  next if row_content.nil?
58
59
  toskip = false
59
- if @injectobj.has_is_skip_by_key
60
- is_skip_by_key = @injectobj.load_is_skip_by_key(sheet_name, row_content.key_str)
60
+ if @convertFile.has_is_skip_by_key
61
+ is_skip_by_key = @convertFile.load_is_skip_by_key(sheet_name, row_content.key_str)
61
62
  if is_skip_by_key.to_s.downcase == "true"
62
63
  toskip = true
63
64
  end
@@ -137,7 +138,19 @@ module Applocale
137
138
  end
138
139
  end
139
140
  rowinfo = ParseModelModule::RowInfo.new(sheet_name, index, key_str)
140
- rowinfo.content_dict = Hash[language_header_list.map { |language_header| [language_header.lang, ContentUtil.from_excel(row[language_header.colno] || '')] }]
141
+
142
+ arr = Array.new
143
+ language_header_list.each do |language_header|
144
+ value = row[language_header.colno] || ''
145
+ after_value = ContentUtil.from_excel(value)
146
+ if @convertFile.has_parse_from_excel_or_csv
147
+ value = @convertFile.load_parse_from_excel_or_csv(sheet_name, key_str, value, after_value)
148
+ else
149
+ value = after_value
150
+ end
151
+ arr.push([language_header.lang, value])
152
+ end
153
+ rowinfo.content_dict = Hash[arr]
141
154
  rowinfo
142
155
  end
143
156
 
@@ -3,6 +3,7 @@ require File.expand_path('../parse_xlsx_module.rb', __FILE__)
3
3
  require File.expand_path('../../../Util/error_util.rb', __FILE__)
4
4
  require File.expand_path('../../../Util/regex_util.rb', __FILE__)
5
5
  require File.expand_path('../../ParseModel/parse_model_module.rb', __FILE__)
6
+ require File.expand_path('../../../Util/convert_util.rb', __FILE__)
6
7
 
7
8
  require 'rubyXL'
8
9
  require 'colorize'
@@ -24,7 +25,7 @@ module Applocale
24
25
  @langlist
25
26
  @sheetobj_list
26
27
  @is_skip_empty_key
27
- @injectobj
28
+ @convert_file
28
29
 
29
30
  def initialize(setting)
30
31
  @platform = setting.platform
@@ -36,7 +37,7 @@ module Applocale
36
37
  @allkey_dict = {}
37
38
  @all_error = Array.new
38
39
  @is_skip_empty_key = setting.is_skip_empty_key
39
- @injectobj = setting.injection
40
+ @convert_file = setting.convert_file
40
41
  self.parse
41
42
  end
42
43
 
@@ -135,8 +136,8 @@ module Applocale
135
136
  end
136
137
 
137
138
  unless keystr.nil?
138
- if @injectobj.has_is_skip_by_key
139
- is_skip_by_key = @injectobj.load_is_skip_by_key(sheetname, keystr)
139
+ if @convert_file.has_is_skip_by_key
140
+ is_skip_by_key = @convert_file.load_is_skip_by_key(sheetname, keystr)
140
141
  if is_skip_by_key.to_s.downcase == "true"
141
142
  return nil
142
143
  end
@@ -147,7 +148,7 @@ module Applocale
147
148
  val = cell && cell.value
148
149
  cell_value = val.to_s
149
150
  lang_name = lang_with_colno.lang
150
- rowinfo.content_dict[lang_name] = convert_contect(cell_value)
151
+ rowinfo.content_dict[lang_name] = convert_contect(sheetname,keystr, cell_value)
151
152
  end
152
153
  return rowinfo
153
154
  end
@@ -165,11 +166,16 @@ module Applocale
165
166
  end
166
167
  end
167
168
 
168
- def convert_contect(cell_value)
169
+ def convert_contect(sheetname, key, cell_value)
169
170
  if cell_value.nil?
170
171
  return ''
171
172
  else
172
- return ContentUtil.from_excel(cell_value)
173
+ value = ContentUtil.from_excel(cell_value)
174
+ if @convert_file.has_parse_from_excel_or_csv
175
+ return @convert_file.load_parse_from_excel_or_csv(sheetname, key, cell_value, value)
176
+ else
177
+ return value
178
+ end
173
179
  end
174
180
  end
175
181