fastlane-plugin-google_sheet_localize 0.2.07 → 0.2.08

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
2
  SHA256:
3
- metadata.gz: a52b64aade6414fcadefc0531632010a1d9b8f704815883020fa76ebd53444c1
4
- data.tar.gz: 496bcfe26b1720da5a550565d5eb129b4f48bc0084705eca842f57b12ff29c9b
3
+ metadata.gz: 4d7de3c4d7121b4e4951eedee63a9e52be35327ee78ad9b21596ef94a1ba7e98
4
+ data.tar.gz: fbf9f07fc2ccb22cb88132473e353bdbd07d51b81bbd79f968b259fa0e33488e
5
5
  SHA512:
6
- metadata.gz: a27daa868decf15d291a3258f27cee24ab67dfe075ebefc0cff398b9c6e7cb88d5a7da2c91c189341639fac4b4c659e3cb4c543e70164f8dff8f0cd4805ab71a
7
- data.tar.gz: 5322c1dc7cb45a0148122e38b8147cc5c712b2ba3ce2ccf3bae04ad0302bd3e46332c19432822d849e983e8d79999693c089913456216bc130f344da948e9ea1
6
+ metadata.gz: 71ba498f21335ec969a77a330e3f99301fd07cfeb4255b13751253a900f02f03d357429288f28bb6167e96c75d9aedc2998df2ca284f51a1781aeb4a62f7d4ff
7
+ data.tar.gz: 96f8197af3ffb73bc768932f79251ae5a28e8eee4ee833f04a6f58e06ab66f913f4df7acdcd28596f29f732713bf85f96a6d093894f9eba00e5873878ea94be7
@@ -18,6 +18,19 @@ module Fastlane
18
18
  default_language = params[:default_language]
19
19
  base_language = params[:base_language]
20
20
  code_generation_path = params[:code_generation_path]
21
+ identifier_name = params[:identifier_name]
22
+
23
+ if identifier_name.to_s.empty?
24
+ if platform == "ios"
25
+ identifier_name = "Identifier iOS"
26
+ end
27
+ if platform == "android"
28
+ identifier_name = "Identifier Android"
29
+ end
30
+ if platform == "web"
31
+ identifier_name = "Identifier Web"
32
+ end
33
+ end
21
34
 
22
35
  spreadsheet = session.spreadsheet_by_url(spreadsheet_id)
23
36
  worksheet = spreadsheet.worksheets.first
@@ -44,8 +57,16 @@ module Fastlane
44
57
  end
45
58
 
46
59
  filterdWorksheets.each { |worksheet|
60
+ identifierIndex = 0
61
+
62
+ for index in 0..worksheet.max_cols
63
+ if worksheet.rows[0][index] == identifier_name
64
+ identifierIndex = index
65
+ end
66
+ end
67
+
47
68
  contentRows = worksheet.rows.drop(1)
48
- language['items'].concat(self.generateJSONObject(contentRows, i))
69
+ language['items'].concat(self.generateJSONObject(contentRows, i, identifierIndex))
49
70
  }
50
71
 
51
72
  result.push(language)
@@ -54,12 +75,12 @@ module Fastlane
54
75
  self.createFiles(result, platform, path, default_language, base_language, code_generation_path)
55
76
  end
56
77
 
57
- def self.generateJSONObject(contentRows, index)
78
+ def self.generateJSONObject(contentRows, index, identifierIndex)
58
79
  result = Array.new
59
80
  for i in 0..contentRows.count - 1
60
- item = self.generateSingleObject(contentRows[i], index)
81
+ item = self.generateSingleObject(contentRows[i], index, identifierIndex)
61
82
 
62
- if item[:identifierIos] != "" && item[:identifierAndroid] != ""
83
+ if item[:identifier] != ""
63
84
  result.push(item)
64
85
  end
65
86
  end
@@ -68,33 +89,74 @@ module Fastlane
68
89
 
69
90
  end
70
91
 
71
- def self.generateSingleObject(row, column)
72
- identifierIos = row[0]
73
- identifierAndroid = row[1]
92
+ def self.generateSingleObject(row, column, identifierIndex)
93
+ identifier = row[identifierIndex]
74
94
 
75
95
  text = row[column]
76
96
  comment = row.last
77
97
 
78
- object = { 'identifierIos' => identifierIos,
79
- 'identifierAndroid' => identifierAndroid,
98
+ object = { 'identifier' => identifier,
80
99
  'text' => text,
81
100
  'comment' => comment
82
101
  }
83
-
84
102
  return object
85
103
 
86
104
  end
87
105
 
88
- def self.filterUnusedRows(items, identifier)
89
- return items.select { |item|
106
+ def self.filterUnusedRows(items, identifier, filterComment)
107
+ filtered = items.select { |item|
90
108
  currentIdentifier = item[identifier]
91
109
  currentIdentifier != "NR" && currentIdentifier != "" && currentIdentifier != "TBD"
92
110
  }
111
+
112
+ if filterComment == "false"
113
+ return filtered
114
+ end
115
+
116
+ return filtered.select { |item|
117
+ !item[identifier].include?('//')
118
+ }
93
119
  end
94
120
 
95
121
  def self.createFiles(languages, platform, destinationPath, defaultLanguage, base_language, codeGenerationPath)
96
122
  self.createFilesForLanguages(languages, platform, destinationPath, defaultLanguage, base_language)
97
123
 
124
+ if platform == "web"
125
+ jsonFileName = "Localization.json"
126
+
127
+ jsonFilepath = "#{destinationPath}/#{jsonFileName}"
128
+
129
+ File.open(jsonFilepath, "w") do |f|
130
+
131
+ jsonItem = {}
132
+
133
+ languages.each { |language|
134
+ filteredItems = self.filterUnusedRows(language["items"],'identifier', "true")
135
+
136
+ allKeys = {}
137
+
138
+ filteredItems.each { |item|
139
+ identifier = item['identifier']
140
+
141
+ text = item['text']
142
+
143
+ matches = text.scan(/%[0-9][sdf]/)
144
+ matches.each { |match|
145
+ text = text.gsub(match, "{#{match[1]}}")
146
+ }
147
+
148
+ if !identifier.include?('//')
149
+ allKeys[identifier] = text
150
+ end
151
+ }
152
+ jsonItem[language["language"]] = allKeys
153
+ }
154
+
155
+ jsonString = JSON.pretty_generate(jsonItem)
156
+ f.write(jsonString)
157
+ end
158
+ end
159
+
98
160
  if platform == "ios"
99
161
 
100
162
  swiftFilename = "Localization.swift"
@@ -105,18 +167,15 @@ module Fastlane
105
167
  swiftPath = destinationPath
106
168
  end
107
169
 
108
- swiftFilepath = "#{swiftPath}/#{swiftFilename}"
170
+ filteredItems = self.filterUnusedRows(languages[0]["items"],'identifier', "true")
109
171
 
110
- filteredItems = languages[0]["items"].select { |item|
111
- iosIdentifier = item['identifierIos']
112
- iosIdentifier != "NR" && iosIdentifier != "" && !iosIdentifier.include?('//') && iosIdentifier != "TBD"
113
- }
172
+ swiftFilepath = "#{swiftPath}/#{swiftFilename}"
114
173
 
115
174
  File.open(swiftFilepath, "w") do |f|
116
175
  f.write("import Foundation\n\n// swiftlint:disable all\npublic struct Localization {\n")
117
176
  filteredItems.each { |item|
118
177
 
119
- identifier = item['identifierIos']
178
+ identifier = item['identifier']
120
179
 
121
180
  values = identifier.dup.split(".")
122
181
 
@@ -163,7 +222,7 @@ module Fastlane
163
222
 
164
223
  if platform == "ios"
165
224
 
166
- filteredItems = self.filterUnusedRows(language["items"],'identifierIos')
225
+ filteredItems = self.filterUnusedRows(language["items"],'identifier', "false")
167
226
 
168
227
  stringFileName = "Localizable.strings"
169
228
  pluralsFileName = "Localizable.stringsdict"
@@ -183,7 +242,7 @@ module Fastlane
183
242
 
184
243
  text = self.mapInvalidPlaceholder(item['text'])
185
244
  comment = item['comment']
186
- identifier = item['identifierIos']
245
+ identifier = item['identifier']
187
246
 
188
247
  line = ""
189
248
  if identifier.include?('//')
@@ -194,13 +253,19 @@ module Fastlane
194
253
 
195
254
  if (text == "" || text == "TBD") && !defaultLanguage.to_s.empty?
196
255
  default_language_object = languages.select { |languageItem| languageItem['language'] == defaultLanguage }.first["items"]
197
- default_language_object = self.filterUnusedRows(default_language_object,'identifierIos')
256
+ default_language_object = self.filterUnusedRows(default_language_object,'identifier', "false")
198
257
 
199
258
  defaultLanguageText = default_language_object[index]['text']
200
259
  puts "found empty text for:\n\tidentifier: #{identifier}\n\tlanguage:#{language['language']}\n\treplacing it with: #{defaultLanguageText}"
201
260
  text = self.mapInvalidPlaceholder(defaultLanguageText)
202
261
  end
203
262
 
263
+ matches = text.scan(/%[0-9][sdf]/)
264
+
265
+ matches.each { |match|
266
+ text = text.gsub(match, "%#{match[1]}$#{match[2].gsub("s","@")}")
267
+ }
268
+
204
269
  line = "\"#{identifier}\" = \"#{text}\";"
205
270
  if !comment.to_s.empty?
206
271
  line = line + " //#{comment}\n"
@@ -223,12 +288,12 @@ module Fastlane
223
288
  filteredItems.each_with_index { |item, index|
224
289
 
225
290
  text = self.mapInvalidPlaceholder(item['text'])
226
- identifier = item['identifierIos']
291
+ identifier = item['identifier']
227
292
 
228
293
  if !identifier.include?('//') && text.include?("one|")
229
294
  if (text == "" || text == "TBD") && !defaultLanguage.to_s.empty?
230
295
  default_language_object = languages.select { |languageItem| languageItem['language'] == defaultLanguage }.first["items"]
231
- default_language_object = self.filterUnusedRows(default_language_object,'identifierIos')
296
+ default_language_object = self.filterUnusedRows(default_language_object,'identifier', "false")
232
297
 
233
298
  defaultLanguageText = default_language_object[index]['text']
234
299
  puts "found empty text for:\n\tidentifier: #{identifier}\n\tlanguage:#{language['language']}\n\treplacing it with: #{defaultLanguageText}"
@@ -280,12 +345,12 @@ module Fastlane
280
345
  f.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
281
346
  f.write("<resources>\n")
282
347
 
283
- filteredItems = self.filterUnusedRows(language["items"],'identifierAndroid')
348
+ filteredItems = self.filterUnusedRows(language["items"],'identifier', "false")
284
349
 
285
350
  filteredItems.each_with_index { |item, index|
286
351
 
287
352
  comment = item['comment']
288
- identifier = item['identifierAndroid']
353
+ identifier = item['identifier']
289
354
  text = item['text']
290
355
 
291
356
  line = ""
@@ -296,7 +361,7 @@ module Fastlane
296
361
 
297
362
  if (text == "" || text == "TBD") && !defaultLanguage.to_s.empty?
298
363
  default_language_object = languages.select { |languageItem| languageItem['language'] == defaultLanguage }.first["items"]
299
- default_language_object = self.filterUnusedRows(default_language_object,'identifierAndroid')
364
+ default_language_object = self.filterUnusedRows(default_language_object,'identifier', "false")
300
365
 
301
366
  defaultLanguageText = default_language_object[index]['text']
302
367
  puts "found empty text for:\n\tidentifier: #{identifier}\n\tlanguage:#{language['language']}\n\treplacing it with: #{defaultLanguageText}"
@@ -380,10 +445,10 @@ module Fastlane
380
445
  result = Array.new
381
446
  filtered = self.mapInvalidPlaceholder(text)
382
447
 
383
- stringIndexes = (0 ... filtered.length).find_all { |i| filtered[i,2] == '%@' }
384
- intIndexes = (0 ... filtered.length).find_all { |i| filtered[i,2] == '%d' }
385
- floatIndexes = (0 ... filtered.length).find_all { |i| filtered[i,2] == '%f' }
386
- doubleIndexes = (0 ... filtered.length).find_all { |i| filtered[i,3] == '%ld' }
448
+ stringIndexes = filtered.scan(/%[0-9]?[s@]/)
449
+ intIndexes = filtered.scan(/%[0-9]?[d]/)
450
+ floatIndexes = filtered.scan(/%[0-9]?[f]/)
451
+ doubleIndexes = filtered.scan(/%[0-9]?[ld]/)
387
452
 
388
453
  if stringIndexes.count > 0
389
454
  result = result.concat(stringIndexes.map { |e| { "index": e, "type": "String" }})
@@ -440,7 +505,7 @@ module Fastlane
440
505
  type: String),
441
506
  FastlaneCore::ConfigItem.new(key: :platform,
442
507
  env_name: "PLATFORM",
443
- description: "Plaform, ios or android",
508
+ description: "Platform, ios or android",
444
509
  optional: true,
445
510
  default_value: Actions.lane_context[Actions::SharedValues::PLATFORM_NAME].to_s,
446
511
  default_value_dynamic: true,
@@ -471,6 +536,11 @@ module Fastlane
471
536
  description: "Output path",
472
537
  optional: false,
473
538
  type: String),
539
+ FastlaneCore::ConfigItem.new(key: :identifier_name,
540
+ env_name: "IDENTIFIER_NAME",
541
+ description: "Identifier for Platform",
542
+ optional: true,
543
+ type: String),
474
544
  FastlaneCore::ConfigItem.new(key: :code_generation_path,
475
545
  env_name: "CODEGENERATIONPATH",
476
546
  description: "Code generation path for the Swift file",
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module GoogleSheetLocalize
3
- VERSION = "0.2.07"
3
+ VERSION = "0.2.08"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-google_sheet_localize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.07
4
+ version: 0.2.08
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mario Hahn