ETLane 0.1.42 → 0.1.43

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,180 @@
1
+ module Fastlane
2
+ module Actions
3
+ class LokaliseAction < Action
4
+ def self.run(params)
5
+ require 'net/http'
6
+
7
+ token = params[:api_token]
8
+ project_identifier = params[:project_identifier]
9
+ destination = params[:destination]
10
+ clean_destination = params[:clean_destination]
11
+ include_comments = params[:include_comments] ? 1 : 0
12
+ use_original = params[:use_original] ? 1 : 0
13
+
14
+ request_data = {
15
+ original_filenames: true,
16
+ export_sort: "first_added",
17
+ format: "strings",
18
+ directory_prefix: "",
19
+ }
20
+ languages = params[:languages]
21
+ if languages.kind_of? Array then
22
+ request_data["langs"] = languages.to_json
23
+ end
24
+
25
+ tags = params[:tags]
26
+ if tags.kind_of? Array then
27
+ request_data["include_tags"] = tags.to_json
28
+ end
29
+
30
+ uri = URI("https://api.lokalise.com/api2/projects/#{project_identifier}/files/download")
31
+ request = Net::HTTP::Post.new(uri)
32
+ request.body = request_data.to_json
33
+ request['X-Api-Token'] = token
34
+ request['Content-Type'] = 'application/json'
35
+ http = Net::HTTP.new(uri.host, uri.port)
36
+ http.use_ssl = true
37
+ response = http.request(request)
38
+
39
+ jsonResponse = JSON.parse(response.body)
40
+ puts(jsonResponse.to_s)
41
+ UI.error "Bad response 🉐\n#{response.body}" unless jsonResponse.kind_of? Hash
42
+ fileURL = jsonResponse["bundle_url"]
43
+ if fileURL.kind_of?(String) then
44
+ UI.message "Downloading localizations archive 📦"
45
+ FileUtils.mkdir_p("lokalisetmp")
46
+ uri = URI(fileURL)
47
+ http = Net::HTTP.new(uri.host, uri.port)
48
+ http.use_ssl = true
49
+ zipRequest = Net::HTTP::Get.new(uri)
50
+ response = http.request(zipRequest)
51
+ if response.content_type == "application/zip" or response.content_type == "application/octet-stream" then
52
+ FileUtils.mkdir_p("lokalisetmp")
53
+ open("lokalisetmp/a.zip", "wb") { |file|
54
+ file.write(response.body)
55
+ }
56
+ unzip_file("lokalisetmp/a.zip", destination, clean_destination)
57
+ FileUtils.remove_dir("lokalisetmp")
58
+ UI.success "Localizations extracted to #{destination} 📗 📕 📘"
59
+ copy_fr_folder(File.join(destination, "Fitness/Resources"))
60
+ copy_fr_folder(File.join(destination, "Watch Extension/Resources"))
61
+ else
62
+ UI.error "Response did not include ZIP"
63
+ end
64
+ elsif jsonResponse["response"]["status"] == "error"
65
+ code = jsonResponse["response"]["code"]
66
+ message = jsonResponse["response"]["message"]
67
+ UI.error "Response error code #{code} (#{message}) 📟"
68
+ else
69
+ UI.error "Bad response 🉐\n#{jsonResponse}"
70
+ end
71
+ end
72
+
73
+ def self.copy_fr_folder(destination)
74
+ fr_path = File.join(destination, "fr.lproj")
75
+ puts fr_path
76
+ if File.exist?(fr_path)
77
+ FileUtils.copy_entry(fr_path, File.join(destination, "fr-CA.lproj"))
78
+ end
79
+ end
80
+
81
+ def self.unzip_file(file, destination, clean_destination)
82
+ require 'zip'
83
+ require 'rubygems'
84
+ Zip::File.open(file) { |zip_file|
85
+ if clean_destination then
86
+ UI.message "Cleaning destination folder ♻️"
87
+ FileUtils.remove_dir(destination)
88
+ FileUtils.mkdir_p(destination)
89
+ end
90
+ UI.message "Unarchiving localizations to destination 📚"
91
+ zip_file.each { |f|
92
+ f_path= File.join(destination, f.name)
93
+ FileUtils.mkdir_p(File.dirname(f_path))
94
+ FileUtils.rm(f_path) if File.file? f_path
95
+ zip_file.extract(f, f_path)
96
+ }
97
+ }
98
+ end
99
+
100
+
101
+ #####################################################
102
+ # @!group Documentation
103
+ #####################################################
104
+
105
+ def self.description
106
+ "Download Lokalise localization"
107
+ end
108
+
109
+ def self.available_options
110
+ [
111
+ FastlaneCore::ConfigItem.new(key: :api_token,
112
+ env_name: "LOKALISE_API_TOKEN",
113
+ description: "API Token for Lokalise",
114
+ verify_block: proc do |value|
115
+ UI.user_error! "No API token for Lokalise given, pass using `api_token: 'token'`" unless (value and not value.empty?)
116
+ end),
117
+ FastlaneCore::ConfigItem.new(key: :project_identifier,
118
+ env_name: "LOKALISE_PROJECT_ID",
119
+ description: "Lokalise Project ID",
120
+ verify_block: proc do |value|
121
+ UI.user_error! "No Project Identifier for Lokalise given, pass using `project_identifier: 'identifier'`" unless (value and not value.empty?)
122
+ end),
123
+ FastlaneCore::ConfigItem.new(key: :destination,
124
+ description: "Localization destination",
125
+ verify_block: proc do |value|
126
+ UI.user_error! "Things are pretty bad" unless (value and not value.empty?)
127
+ UI.user_error! "Directory you passed is in your imagination" unless File.directory?(value)
128
+ end),
129
+ FastlaneCore::ConfigItem.new(key: :clean_destination,
130
+ description: "Clean destination folder",
131
+ optional: true,
132
+ is_string: false,
133
+ default_value: false,
134
+ verify_block: proc do |value|
135
+ UI.user_error! "Clean destination should be true or false" unless [true, false].include? value
136
+ end),
137
+ FastlaneCore::ConfigItem.new(key: :languages,
138
+ description: "Languages to download",
139
+ optional: true,
140
+ is_string: false,
141
+ verify_block: proc do |value|
142
+ UI.user_error! "Language codes should be passed as array" unless value.kind_of? Array
143
+ end),
144
+ FastlaneCore::ConfigItem.new(key: :include_comments,
145
+ description: "Include comments in exported files",
146
+ optional: true,
147
+ is_string: false,
148
+ default_value: false,
149
+ verify_block: proc do |value|
150
+ UI.user_error! "Include comments should be true or false" unless [true, false].include? value
151
+ end),
152
+ FastlaneCore::ConfigItem.new(key: :use_original,
153
+ description: "Use original filenames/formats (bundle_structure parameter is ignored then)",
154
+ optional: true,
155
+ is_string: false,
156
+ default_value: false,
157
+ verify_block: proc do |value|
158
+ UI.user_error! "Use original should be true of false." unless [true, false].include?(value)
159
+ end),
160
+ FastlaneCore::ConfigItem.new(key: :tags,
161
+ description: "Include only the keys tagged with a given set of tags",
162
+ optional: true,
163
+ is_string: false,
164
+ verify_block: proc do |value|
165
+ UI.user_error! "Tags should be passed as array" unless value.kind_of? Array
166
+ end),
167
+
168
+ ]
169
+ end
170
+
171
+ def self.authors
172
+ "Fedya-L"
173
+ end
174
+
175
+ def self.is_supported?(platform)
176
+ [:ios, :mac].include? platform
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,624 @@
1
+ module Fastlane
2
+ module Actions
3
+
4
+ class LokaliseMetadataAction < Action
5
+ @params
6
+ def self.run(params)
7
+ @params = params
8
+ action = params[:action]
9
+
10
+ case action
11
+ when "update_itunes"
12
+ key_file = metadata_key_file_itunes()
13
+ metadata = get_metadata_from_lokalise_itunes()
14
+ run_deliver_action(metadata)
15
+ when "update_googleplay"
16
+ release_number = params[:release_number]
17
+ UI.user_error! "Release number is required when using `update_googleplay` action (should be an integer and greater that 0)" unless (release_number and release_number.is_a?(Integer) and release_number > 0)
18
+ key_file = metadata_key_file_googleplay
19
+ metadata = get_metadata_from_lokalise_googleplay()
20
+ save_metadata_to_files(metadata, release_number)
21
+ run_supply_action(params[:validate_only])
22
+ when "update_lokalise_itunes"
23
+ metadata = get_metadata_itunes_connect()
24
+ add_languages = params[:add_languages]
25
+ override_translation = params[:override_translation]
26
+ if add_languages == true
27
+ create_languages(metadata.keys, true)
28
+ end
29
+ if override_translation == true
30
+ upload_metadata_itunes(metadata) unless metadata.empty?
31
+ else
32
+ lokalise_metadata = get_metadata_from_lokalise_itunes()
33
+ filtered_metadata = filter_metadata(metadata, lokalise_metadata)
34
+ upload_metadata_itunes(filtered_metadata) unless filtered_metadata.empty?
35
+ end
36
+ when "update_lokalise_googleplay"
37
+ metadata = get_metadata_google_play()
38
+ add_languages = params[:add_languages]
39
+ override_translation = params[:override_translation]
40
+ if add_languages == true
41
+ create_languages(metadata.keys, false)
42
+ end
43
+ if override_translation == true
44
+ upload_metadata_google_play(metadata) unless metadata.empty?
45
+ else
46
+ lokalise_metadata = get_metadata_from_lokalise_googleplay()
47
+ filtered_metadata = filter_metadata(metadata, lokalise_metadata)
48
+ upload_metadata_google_play(filtered_metadata) unless filtered_metadata.empty?
49
+ end
50
+ end
51
+ end
52
+
53
+ def self.create_languages(languages, for_itunes)
54
+ data = {
55
+ iso: languages.map { |language| fix_language_name(language, for_itunes, true) } .to_json
56
+ }
57
+ make_request("language/add", data)
58
+ end
59
+
60
+ def self.filter_metadata(metadata, other_metadata)
61
+ filtered_metadata = {}
62
+ metadata.each { |language, translations|
63
+ other_translations = other_metadata[language]
64
+ filtered_translations = {}
65
+
66
+ if other_translations != nil && other_translations.empty? == false
67
+ translations.each { |key, value|
68
+ other_value = other_translations[key]
69
+ filtered_translations[key] = value unless other_value != nil && other_value.empty? == false
70
+ }
71
+ else
72
+ filtered_translations = translations
73
+ end
74
+
75
+ filtered_metadata[language] = filtered_translations unless filtered_translations.empty?
76
+ }
77
+ return filtered_metadata
78
+ end
79
+
80
+
81
+ def self.run_deliver_action(metadata)
82
+ config = FastlaneCore::Configuration.create(Actions::DeliverAction.available_options, {})
83
+ config.load_configuration_file("Deliverfile")
84
+ config[:metadata_path] = "./fastlane/no_metadata"
85
+ config[:screenshots_path] = "./fastlane/no_screenshot"
86
+ config[:skip_screenshots] = true
87
+ config[:run_precheck_before_submit] = false
88
+ config[:skip_binary_upload] = true
89
+ config[:skip_app_version_update] = true
90
+ config[:force] = true
91
+
92
+ metadata_key_file_itunes().each { |key, parameter|
93
+ final_translations = {}
94
+
95
+ metadata.each { |lang, translations|
96
+ if translations.empty? == false
97
+ translation = translations[key]
98
+ final_translations[lang] = translation if translation != nil && translation.empty? == false
99
+ end
100
+ }
101
+
102
+ config[parameter.to_sym] = final_translations
103
+ }
104
+
105
+ Actions::DeliverAction.run(config)
106
+ end
107
+
108
+ def self.run_supply_action(validate_only)
109
+ config = FastlaneCore::Configuration.create(Actions::SupplyAction.available_options, {})
110
+ config[:skip_upload_apk] = true
111
+ config[:skip_upload_aab] = true
112
+ config[:skip_upload_screenshots] = true
113
+ config[:skip_upload_images] = true
114
+ config[:validate_only] = validate_only
115
+
116
+ Actions::SupplyAction.run(config)
117
+ end
118
+
119
+ def self.save_metadata_to_files(metadata, release_number)
120
+
121
+ translations = {}
122
+
123
+ metadata_key_file_googleplay().each { |key, parameter|
124
+ final_translations = {}
125
+
126
+ metadata.each { |lang, translations|
127
+ if translations.empty? == false
128
+ translation = translations[key]
129
+ final_translations[lang] = translation if translation != nil && translation.empty? == false
130
+ end
131
+ }
132
+
133
+ translations[parameter.to_sym] = final_translations
134
+ }
135
+
136
+ FileUtils.rm_rf(Dir['fastlane/metadata/android/*'])
137
+
138
+ translations.each { |key, parameter|
139
+ parameter.each { |lang, text|
140
+ path = "fastlane/metadata/android/#{lang}/#{key}.txt"
141
+ if "#{key}" == "changelogs"
142
+ path = "fastlane/metadata/android/#{lang}/changelogs/#{release_number}.txt"
143
+ end
144
+ dirname = File.dirname(path)
145
+ unless File.directory?(dirname)
146
+ FileUtils.mkdir_p(dirname)
147
+ end
148
+ File.write(path, text)
149
+ }
150
+ }
151
+
152
+ end
153
+
154
+ def self.make_request(path, data)
155
+ require 'net/http'
156
+
157
+ request_data = {
158
+ api_token: @params[:api_token],
159
+ id: @params[:project_identifier]
160
+ }.merge(data)
161
+
162
+ uri = URI("https://api.lokalise.com/api/#{path}")
163
+ request = Net::HTTP::Post.new(uri)
164
+ request.set_form_data(request_data)
165
+
166
+ http = Net::HTTP.new(uri.host, uri.port)
167
+ http.use_ssl = true
168
+ response = http.request(request)
169
+
170
+ jsonResponse = JSON.parse(response.body)
171
+ raise "Bad response 🉐\n#{response.body}" unless jsonResponse.kind_of? Hash
172
+ if jsonResponse["response"]["status"] == "success" then
173
+ UI.success "Response #{jsonResponse} 🚀"
174
+ elsif jsonResponse["response"]["status"] == "error"
175
+ code = jsonResponse["response"]["code"]
176
+ message = jsonResponse["response"]["message"]
177
+ raise "Response error code #{code} (#{message}) 📟"
178
+ else
179
+ raise "Bad response 🉐\n#{jsonResponse}"
180
+ end
181
+ return jsonResponse
182
+ end
183
+
184
+ def self.upload_metadata(metadata_keys, for_itunes, metadata)
185
+
186
+ keys = []
187
+
188
+ metadata_keys.each do |key, value|
189
+ key = make_key_object_from_metadata(key, metadata, for_itunes)
190
+ if key
191
+ keys << key
192
+ end
193
+ end
194
+
195
+ data = {
196
+ data: keys.to_json
197
+ }
198
+
199
+ make_request("string/set", data)
200
+ end
201
+
202
+ def self.upload_metadata_itunes(metadata)
203
+ upload_metadata(metadata_key_file_itunes, true, metadata)
204
+ end
205
+
206
+ def self.upload_metadata_google_play(metadata)
207
+ upload_metadata(metadata_key_file_googleplay, false, metadata)
208
+ end
209
+
210
+ def self.make_key_object_from_metadata(key, metadata, for_itunes)
211
+ key_data = {
212
+ "key" => key,
213
+ "platform_mask" => 16,
214
+ "translations" => {}
215
+ }
216
+ metadata.each { |iso_code, data|
217
+ translation = data[key]
218
+ unless translation == nil || translation.empty?
219
+ key_data["translations"][fix_language_name(iso_code, for_itunes, true)] = translation
220
+ end
221
+ }
222
+ unless key_data["translations"].empty?
223
+ return key_data
224
+ else
225
+ return nil
226
+ end
227
+ end
228
+
229
+ def self.get_metadata_google_play()
230
+ available_languages = google_play_languages
231
+ return get_metadata(available_languages, "fastlane/metadata/android/", false)
232
+ end
233
+
234
+ def self.get_metadata_itunes_connect()
235
+ available_languages = itunes_connect_languages
236
+ return get_metadata(available_languages, "fastlane/metadata/", true)
237
+ end
238
+
239
+ def self.get_metadata(available_languages, folder, for_itunes)
240
+ complete_metadata = {}
241
+
242
+ available_languages.each { |iso_code|
243
+ language_directory = "#{folder}#{iso_code}"
244
+ if Dir.exist? language_directory
245
+ language_metadata = {}
246
+ if for_itunes
247
+ metadata_key_file_itunes().each { |key, file|
248
+ populate_hash_key_from_file(language_metadata, key, language_directory + "/#{file}.txt")
249
+ }
250
+ else
251
+ metadata_key_file_googleplay().each { |key, file|
252
+ if file == "changelogs"
253
+ changelog_directory = "#{folder}#{iso_code}/changelogs"
254
+ files = Dir.entries("#{changelog_directory}")
255
+ collectedFiles = files.collect { |s| s.partition(".").first.to_i }
256
+ sortedFiles = collectedFiles.sort
257
+ populate_hash_key_from_file(language_metadata, key, language_directory + "/changelogs/#{sortedFiles.last}.txt")
258
+ else
259
+ populate_hash_key_from_file(language_metadata, key, language_directory + "/#{file}.txt")
260
+ end
261
+ }
262
+ end
263
+ complete_metadata[iso_code] = language_metadata
264
+ end
265
+ }
266
+
267
+ return complete_metadata
268
+ end
269
+
270
+ def self.get_metadata_from_lokalise(valid_keys, for_itunes)
271
+
272
+ data = {
273
+ platform_mask: 16,
274
+ keys: valid_keys.to_json,
275
+ }
276
+
277
+ response = make_request("string/list", data)
278
+
279
+ if for_itunes
280
+ valid_languages = itunes_connect_languages_in_lokalise()
281
+ else
282
+ valid_languages = google_play_languages_in_lokalise()
283
+ end
284
+ metadata = {}
285
+
286
+ response["strings"].each { |lang, translation_objects|
287
+ if valid_languages.include?(lang)
288
+ translations = {}
289
+ translation_objects.each { |object|
290
+ key = object["key"]
291
+ translation = object["translation"]
292
+ if valid_keys.include?(key) && translation != nil && translation.empty? == false
293
+ translations[key] = translation
294
+ end
295
+ }
296
+ if translations.empty? == false
297
+ metadata[fix_language_name(lang, for_itunes)] = translations
298
+ end
299
+ end
300
+ }
301
+ return metadata
302
+
303
+ end
304
+
305
+ def self.get_metadata_from_lokalise_itunes()
306
+
307
+ valid_keys = metadata_keys_itunes()
308
+ return get_metadata_from_lokalise(valid_keys, true)
309
+
310
+ end
311
+
312
+ def self.get_metadata_from_lokalise_googleplay()
313
+
314
+ valid_keys = metadata_keys_googleplay()
315
+ return get_metadata_from_lokalise(valid_keys, false)
316
+
317
+ end
318
+
319
+ def self.populate_hash_key_from_file(hash, key, filepath)
320
+ begin
321
+ text = File.read filepath
322
+ text.chomp!
323
+ hash[key] = text unless text.empty?
324
+ rescue => exception
325
+ raise exception
326
+ end
327
+ end
328
+
329
+ def self.metadata_keys_itunes()
330
+ return metadata_key_file_itunes().keys
331
+ end
332
+
333
+ def self.metadata_keys_googleplay()
334
+ return metadata_key_file_googleplay().keys
335
+ end
336
+
337
+ def self.metadata_key_file_itunes()
338
+ return {
339
+ "appstore.app.name" => "name",
340
+ "appstore.app.description" => "description",
341
+ "appstore.app.keywords" => "keywords",
342
+ "appstore.app.promotional_text" => "promotional_text",
343
+ "appstore.app.release_notes" => "release_notes",
344
+ "appstore.app.subtitle" => "subtitle",
345
+ }
346
+ end
347
+
348
+ def self.metadata_key_file_googleplay()
349
+ return {
350
+ "googleplay.app.title" => "title",
351
+ "googleplay.app.full_description" => "full_description",
352
+ "googleplay.app.short_description" => "short_description",
353
+ "googleplay.app.changelogs" => "changelogs",
354
+ }
355
+ end
356
+
357
+ def self.itunes_connect_languages_in_lokalise()
358
+ return itunes_connect_languages().map { |lang|
359
+ fix_language_name(lang, true, true)
360
+ }
361
+ end
362
+
363
+ def self.google_play_languages_in_lokalise()
364
+ return google_play_languages().map { |lang|
365
+ fix_language_name(lang, false, true)
366
+ }
367
+ end
368
+
369
+ def self.itunes_connect_languages()
370
+ return [
371
+ "en-US",
372
+ "zh-Hans",
373
+ "zh-Hant",
374
+ "da",
375
+ "nl-NL",
376
+ "en-AU",
377
+ "en-CA",
378
+ "en-GB",
379
+ "fi",
380
+ "fr-FR",
381
+ "fr-CA",
382
+ "de-DE",
383
+ "el",
384
+ "id",
385
+ "it",
386
+ "ja",
387
+ "ko",
388
+ "ms",
389
+ "no",
390
+ "pt-BR",
391
+ "pt-PT",
392
+ "ru",
393
+ "es-MX",
394
+ "es-ES",
395
+ "sv",
396
+ "th",
397
+ "tr",
398
+ "vi"
399
+ ]
400
+ end
401
+
402
+ def self.google_play_languages()
403
+ return [
404
+ 'af',
405
+ 'am',
406
+ 'ar',
407
+ 'hy',
408
+ 'az-AZ',
409
+ 'eu-ES',
410
+ 'be',
411
+ 'bn-BD',
412
+ 'bg',
413
+ 'my',
414
+ 'ca',
415
+ 'zh-CN',
416
+ 'zh-TW',
417
+ 'zh-HK',
418
+ 'hr',
419
+ 'cs',
420
+ 'da',
421
+ 'nl-NL',
422
+ 'en-AU',
423
+ 'en-CA',
424
+ 'en-IN',
425
+ 'en-SG',
426
+ 'en-ZA',
427
+ 'en-GB',
428
+ 'en-US',
429
+ 'et-EE',
430
+ 'fil',
431
+ 'fi',
432
+ 'fr-CA',
433
+ 'fr-FR',
434
+ 'gl-ES',
435
+ 'ka-GE',
436
+ 'de-DE',
437
+ 'el-GR',
438
+ 'he',
439
+ 'hi-IN',
440
+ 'hu',
441
+ 'is-IS',
442
+ 'id',
443
+ 'it-IT',
444
+ 'ja',
445
+ 'kn-IN',
446
+ 'km-KH',
447
+ 'ko',
448
+ 'ky',
449
+ 'lo',
450
+ 'lv-LV',
451
+ 'lt-LT',
452
+ 'mk-MK',
453
+ 'ms',
454
+ 'ml-IN',
455
+ 'mr',
456
+ 'mn-MN',
457
+ 'ne-NP',
458
+ 'no',
459
+ 'fa',
460
+ 'pl',
461
+ 'pt-BR',
462
+ 'pt-PT',
463
+ 'ro',
464
+ 'ru-RU',
465
+ 'sr',
466
+ 'si',
467
+ 'sk',
468
+ 'sl-SI',
469
+ 'es-419',
470
+ 'es-ES',
471
+ 'es-US',
472
+ 'sw',
473
+ 'sv-SE',
474
+ 'ta-IN',
475
+ 'te-IN',
476
+ 'th',
477
+ 'tr',
478
+ 'uk',
479
+ 'vi',
480
+ 'zu'
481
+ ]
482
+ end
483
+
484
+ def self.fix_language_name(name, for_itunes, for_lokalise = false)
485
+ if for_itunes
486
+ if for_lokalise
487
+ name = name.gsub("-","_")
488
+ name = "en" if name == "en_US"
489
+ name = "de" if name == "de_DE"
490
+ name = "es" if name == "es_ES"
491
+ name = "fr" if name == "fr_FR"
492
+ else
493
+ name = name.gsub("_","-")
494
+ name = "en-US" if name == "en"
495
+ name = "de-DE" if name == "de"
496
+ name = "es-ES" if name == "es"
497
+ name = "fr-FR" if name == "fr"
498
+ end
499
+ else
500
+ if for_lokalise
501
+ name = name.gsub("-","_")
502
+ name = "tr" if name == "tr_TR"
503
+ name = "hy" if name == "hy_AM"
504
+ name = "my" if name == "my_MM"
505
+ name = "ms" if name == "ms_MY"
506
+ name = "cs" if name == "cs_CZ"
507
+ name = "da" if name == "da_DK"
508
+ name = "et_EE" if name == "et"
509
+ name = "fi" if name == "fi_FI"
510
+ name = "he" if name == "iw_IL"
511
+ name = "hu" if name == "hu_HU"
512
+ name = "ja" if name == "ja_JP"
513
+ name = "ko" if name == "ko_KR"
514
+ name = "ky" if name == "ky_KG"
515
+ name = "lo" if name == "lo_LA"
516
+ name = "lv_LV" if name == "lv"
517
+ name = "lt_LT" if name == "lt"
518
+ name = "mr" if name == "mr_IN"
519
+ name = "no" if name == "no_NO"
520
+ name = "pl" if name == "pl_PL"
521
+ name = "si" if name == "si_LK"
522
+ name = "sl_SI" if name == "sl"
523
+ else
524
+ name = name.gsub("_","-")
525
+ name = "tr-TR" if name == "tr"
526
+ name = "hy-AM" if name == "hy"
527
+ name = "my-MM" if name == "my"
528
+ name = "ms-MY" if name == "ms"
529
+ name = "cs-CZ" if name == "cs"
530
+ name = "da-DK" if name == "da"
531
+ name = "et" if name == "et-EE"
532
+ name = "fi-FI" if name == "fi"
533
+ name = "iw-IL" if name == "he"
534
+ name = "hu-HU" if name == "hu"
535
+ name = "ja-JP" if name == "ja"
536
+ name = "ko-KR" if name == "ko"
537
+ name = "ky-KG" if name == "ky"
538
+ name = "lo-LA" if name == "lo"
539
+ name = "lv" if name == "lv-LV"
540
+ name = "lt" if name == "lt-LT"
541
+ name = "mr-IN" if name == "mr"
542
+ name = "no-NO" if name == "no"
543
+ name = "pl-PL" if name == "pl"
544
+ name = "si-LK" if name == "si"
545
+ name = "sl" if name == "sl-SI"
546
+ end
547
+ end
548
+ return name
549
+ end
550
+
551
+ #####################################################
552
+ # @!group Documentation
553
+ #####################################################
554
+
555
+ def self.description
556
+ "Upload metadata to lokalise."
557
+ end
558
+
559
+ def self.details
560
+ "This action scans fastlane/metadata folder and uploads metadata to lokalise.com"
561
+ end
562
+
563
+ def self.available_options
564
+ [
565
+ FastlaneCore::ConfigItem.new(key: :api_token,
566
+ env_name: "LOKALISE_API_TOKEN",
567
+ description: "API Token for Lokalise",
568
+ verify_block: proc do |value|
569
+ UI.user_error! "No API token for Lokalise given, pass using `api_token: 'token'`" unless (value and not value.empty?)
570
+ end),
571
+ FastlaneCore::ConfigItem.new(key: :project_identifier,
572
+ env_name: "LOKALISE_PROJECT_ID",
573
+ description: "Lokalise Project ID",
574
+ verify_block: proc do |value|
575
+ UI.user_error! "No Project Identifier for Lokalise given, pass using `project_identifier: 'identifier'`" unless (value and not value.empty?)
576
+ end),
577
+ FastlaneCore::ConfigItem.new(key: :add_languages,
578
+ description: "Add missing languages in lokalise",
579
+ optional: true,
580
+ is_string: false,
581
+ default_value: false,
582
+ verify_block: proc do |value|
583
+ UI.user_error! "Add languages should be true or false" unless [true, false].include? value
584
+ end),
585
+ FastlaneCore::ConfigItem.new(key: :override_translation,
586
+ description: "Override translations in lokalise",
587
+ optional: true,
588
+ is_string: false,
589
+ default_value: false,
590
+ verify_block: proc do |value|
591
+ UI.user_error! "Override translation should be true or false" unless [true, false].include? value
592
+ end),
593
+ FastlaneCore::ConfigItem.new(key: :action,
594
+ description: "Action to perform (can be update_lokalise_itunes or update_lokalise_googleplay or update_itunes or update_googleplay)",
595
+ optional: false,
596
+ is_string: true,
597
+ verify_block: proc do |value|
598
+ UI.user_error! "Action should be update_lokalise_googleplay or update_lokalise_itunes or update_itunes or update_googleplay" unless ["update_lokalise_itunes", "update_lokalise_googleplay", "update_itunes", "update_googleplay"].include? value
599
+ end),
600
+ FastlaneCore::ConfigItem.new(key: :release_number,
601
+ description: "Release number is required to update google play",
602
+ optional: true,
603
+ is_string: false),
604
+ FastlaneCore::ConfigItem.new(key: :validate_only,
605
+ description: "Only validate the metadata (works with only update_googleplay action)",
606
+ optional: true,
607
+ is_string: false,
608
+ default_value: false,
609
+ verify_block: proc do |value|
610
+ UI.user_error! "Validate only should be true or false" unless [true, false].include? value
611
+ end),
612
+ ]
613
+ end
614
+
615
+ def self.authors
616
+ ["Fedya-L"]
617
+ end
618
+
619
+ def self.is_supported?(platform)
620
+ platform == :ios
621
+ end
622
+ end
623
+ end
624
+ end