fastlane-plugin-lokalise 1.0.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +71 -4
- data/lib/fastlane/plugin/lokalise/actions/add_keys_to_lokalise_action.rb +1 -1
- data/lib/fastlane/plugin/lokalise/actions/lokalise_action.rb +1 -1
- data/lib/fastlane/plugin/lokalise/actions/lokalise_metadata_action.rb +189 -368
- data/lib/fastlane/plugin/lokalise/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b466bad5687613831754575de39a2d69618fe645c0113576b1457d5afa797ee
|
4
|
+
data.tar.gz: b5be9291d6707c64c2cb830bf33df02365a8a3a9c6680bddbbdc1701502bee5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a336dfac596785a46a36a073384bde98512c5f2aaeb6ef862c5800d856acf7f14edb8023fc4effe455f148ea43991ffd8ad9e6f79c825997a51c51ab0152c0e9
|
7
|
+
data.tar.gz: ab3469836a68162b9c8dccbf3915063d7cb0d57103616c70b297e72d82af948a3cc61b680bd9cada4456b635eed77ae0a86a697a6b81beb0ce190ed86c474454
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
This project is a port of the [lokalise-fastlane-actions](https://github.com/lokalise/lokalise-fastlane-actions) project. The goal is for it to be packaged as a Fastlane Plugin that can be imported as a gem.
|
4
4
|
|
5
|
+
**Note:** The commands in version 2.x are not compatible with version 1.x.
|
6
|
+
|
5
7
|
|
6
8
|
## Install
|
7
9
|
|
@@ -12,7 +14,7 @@ fastlane add_plugin lokalise
|
|
12
14
|
|
13
15
|
Or added to the Pluginfile as:
|
14
16
|
```
|
15
|
-
gem 'fastlane-plugin-lokalise'
|
17
|
+
gem 'fastlane-plugin-lokalise'
|
16
18
|
```
|
17
19
|
|
18
20
|
|
@@ -36,13 +38,13 @@ Parameters:
|
|
36
38
|
|
37
39
|
This action imports metadata from files generated by Deliver action and uploads iTunes Connect metadata using information from Lokalise.
|
38
40
|
|
41
|
+
- `platform`. The name of the platform you are generating metadata for (`android` or `ios`). Can be set up using enviromental parameter `FASTLANE_PLATFORM_NAME`
|
39
42
|
- `api_token`. Your API token. Can be set up using enviromental parameter `LOKALISE_API_TOKEN`
|
40
43
|
- `project_identifier`. Your Project ID. Can be set up using enviromental parameter `LOKALISE_PROJECT_ID`
|
41
|
-
- `action`. Action to perform *(can be `
|
44
|
+
- `action`. Action to perform *(can be `download_from_lokalise`, or `upload_to_lokalise`)*.
|
42
45
|
- `add_languages`. Add missing languages to lokalise *(`false` by default)*.
|
43
46
|
- `override_translation`. Override translations in lokalise.
|
44
|
-
- `release_number`. Application release number. Required
|
45
|
-
- `validate_only`. Only validate the metadata. Used with `update_googleplay` action *(`false` by default)*.
|
47
|
+
- `release_number`. Application release number. Required for Android actions.
|
46
48
|
|
47
49
|
### add_keys_to_lokalise
|
48
50
|
|
@@ -56,6 +58,71 @@ Parameters:
|
|
56
58
|
- `keys`. Keys to add *(must be passed as array of strings)*.
|
57
59
|
|
58
60
|
|
61
|
+
## How To
|
62
|
+
|
63
|
+
In this section we assume you know about Fastlane's Fastfile and how to interact with it. If you do not, please look over the Fastlane Documentation.
|
64
|
+
https://docs.fastlane.tools/
|
65
|
+
|
66
|
+
### Upload metadata to the App Store or Google Play
|
67
|
+
|
68
|
+
First you need to download the metadata from Lokalise into the `fastlane/metadata` directory:
|
69
|
+
```ruby
|
70
|
+
lokalise_metadata(
|
71
|
+
action: download_from_lokalise,
|
72
|
+
api_token: (string),
|
73
|
+
project_identifier: (number.number),
|
74
|
+
)
|
75
|
+
```
|
76
|
+
|
77
|
+
Then you can upload what is currently in the `fastlane/metadata` folder to the App Store using the deliver action:
|
78
|
+
https://docs.fastlane.tools/actions/deliver/
|
79
|
+
```ruby
|
80
|
+
deliver(
|
81
|
+
...
|
82
|
+
)
|
83
|
+
```
|
84
|
+
Or for Google Play the supply action:
|
85
|
+
https://docs.fastlane.tools/actions/supply/
|
86
|
+
```ruby
|
87
|
+
supply(
|
88
|
+
...
|
89
|
+
)
|
90
|
+
```
|
91
|
+
|
92
|
+
### Upload metadata to Lokalise
|
93
|
+
|
94
|
+
First you need to download the metadata from the App Store:
|
95
|
+
https://docs.fastlane.tools/actions/deliver/
|
96
|
+
```ruby
|
97
|
+
desc "Downloads metadata from App Store Connect"
|
98
|
+
lane :download_appstore_metadata do
|
99
|
+
ENV["DELIVER_FORCE_OVERWRITE"] = "1"
|
100
|
+
sh("fastlane deliver download_metadata")
|
101
|
+
ENV["DELIVER_FORCE_OVERWRITE"] = "0"
|
102
|
+
end
|
103
|
+
```
|
104
|
+
|
105
|
+
Or from Google Play:
|
106
|
+
https://docs.fastlane.tools/actions/supply/
|
107
|
+
```ruby
|
108
|
+
desc "Downloads metadata from Google Play"
|
109
|
+
lane :download_googleplay_metadata do
|
110
|
+
# Replace metadata_path if not in the default location
|
111
|
+
metadata_path = "fastlane/metadata/android"
|
112
|
+
sh("rm -rf #{metadata_path}")
|
113
|
+
sh("fastlane supply init")
|
114
|
+
end
|
115
|
+
```
|
116
|
+
|
117
|
+
Then you can upload what is currently in the `fastlane/metdata` folder to Lokalise using:
|
118
|
+
```ruby
|
119
|
+
lokalise_metadata(
|
120
|
+
action: "update_lokalise_itunes",
|
121
|
+
add_languages: true,
|
122
|
+
override_translation: true
|
123
|
+
)
|
124
|
+
```
|
125
|
+
|
59
126
|
## Development
|
60
127
|
|
61
128
|
This can be locally built and installed as a gem by doing the following on the repo:
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
|
3
|
+
|
3
4
|
module Fastlane
|
4
5
|
module Actions
|
5
6
|
class LokaliseMetadataAction < Action
|
@@ -7,59 +8,58 @@ module Fastlane
|
|
7
8
|
@params
|
8
9
|
def self.run(params)
|
9
10
|
@params = params
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
upload_metadata_google_play(filtered_metadata) unless filtered_metadata.empty?
|
55
|
-
end
|
11
|
+
|
12
|
+
case @params[:platform]
|
13
|
+
when "ios"
|
14
|
+
case @params[:action]
|
15
|
+
when "download_from_lokalise"
|
16
|
+
metadata = get_metadata_from_lokalise()
|
17
|
+
write_lokalise_translations_to_itunes_metadata(metadata)
|
18
|
+
when "upload_to_lokalise"
|
19
|
+
metadata = get_metadata()
|
20
|
+
add_languages = params[:add_languages]
|
21
|
+
override_translation = params[:override_translation]
|
22
|
+
if add_languages == true
|
23
|
+
create_languages(metadata.keys)
|
24
|
+
end
|
25
|
+
if override_translation == true
|
26
|
+
upload_metadata_itunes(metadata) unless metadata.empty?
|
27
|
+
else
|
28
|
+
lokalise_metadata = get_metadata_from_lokalise()
|
29
|
+
filtered_metadata = filter_metadata(metadata, lokalise_metadata)
|
30
|
+
upload_metadata_itunes(filtered_metadata) unless filtered_metadata.empty?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
when "android"
|
34
|
+
case @params[:action]
|
35
|
+
when "download_from_lokalise"
|
36
|
+
release_number = params[:release_number]
|
37
|
+
UI.user_error! "Release number is required for Android (should be an integer and greater that 0)" unless (release_number and release_number.is_a?(Integer) and release_number > 0)
|
38
|
+
metadata = get_metadata_from_lokalise()
|
39
|
+
write_lokalise_translations_to_googleplay_metadata(metadata, release_number)
|
40
|
+
when "upload_to_lokalise"
|
41
|
+
metadata = get_metadata()
|
42
|
+
add_languages = params[:add_languages]
|
43
|
+
override_translation = params[:override_translation]
|
44
|
+
if add_languages == true
|
45
|
+
create_languages(metadata.keys)
|
46
|
+
end
|
47
|
+
if override_translation == true
|
48
|
+
upload_metadata_google_play(metadata) unless metadata.empty?
|
49
|
+
else
|
50
|
+
lokalise_metadata = get_metadata_from_lokalise()
|
51
|
+
filtered_metadata = filter_metadata(metadata, lokalise_metadata)
|
52
|
+
upload_metadata_google_play(filtered_metadata) unless filtered_metadata.empty?
|
53
|
+
end
|
54
|
+
end
|
56
55
|
end
|
56
|
+
|
57
57
|
end
|
58
58
|
|
59
59
|
|
60
|
-
def self.create_languages(languages
|
60
|
+
def self.create_languages(languages)
|
61
61
|
data = {
|
62
|
-
iso: languages.map { |language| fix_language_name(language,
|
62
|
+
iso: languages.map { |language| fix_language_name(language, true) } .to_json
|
63
63
|
}
|
64
64
|
make_request("language/add", data)
|
65
65
|
end
|
@@ -93,7 +93,8 @@ module Fastlane
|
|
93
93
|
if translations.empty? == false
|
94
94
|
translation = translations[key]
|
95
95
|
final_translations[lang] = translation if translation != nil && translation.empty? == false
|
96
|
-
|
96
|
+
metadata_path = get_metadata_path()
|
97
|
+
path = File.join(metadata_path, lang)
|
97
98
|
filename = "#{parameter}.txt"
|
98
99
|
output_file = File.join(path, filename)
|
99
100
|
FileUtils.mkdir_p(path) unless File.exist?(path)
|
@@ -107,79 +108,30 @@ module Fastlane
|
|
107
108
|
end
|
108
109
|
|
109
110
|
|
110
|
-
def self.
|
111
|
-
config = FastlaneCore::Configuration.create(Actions::DeliverAction.available_options, {})
|
112
|
-
config.load_configuration_file("Deliverfile")
|
113
|
-
config[:metadata_path] = "./fastlane/no_metadata"
|
114
|
-
config[:screenshots_path] = "./fastlane/no_screenshot"
|
115
|
-
config[:skip_screenshots] = true
|
116
|
-
config[:run_precheck_before_submit] = false
|
117
|
-
config[:skip_binary_upload] = true
|
118
|
-
config[:skip_app_version_update] = true
|
119
|
-
config[:force] = true
|
120
|
-
|
121
|
-
metadata_key_file_itunes().each { |key, parameter|
|
122
|
-
final_translations = {}
|
123
|
-
|
124
|
-
metadata.each { |lang, translations|
|
125
|
-
if translations.empty? == false
|
126
|
-
translation = translations[key]
|
127
|
-
final_translations[lang] = translation if translation != nil && translation.empty? == false
|
128
|
-
end
|
129
|
-
}
|
130
|
-
|
131
|
-
config[parameter.to_sym] = final_translations
|
132
|
-
}
|
133
|
-
|
134
|
-
Actions::DeliverAction.run(config)
|
135
|
-
end
|
136
|
-
|
137
|
-
|
138
|
-
def self.run_supply_action(validate_only)
|
139
|
-
config = FastlaneCore::Configuration.create(Actions::SupplyAction.available_options, {})
|
140
|
-
config[:skip_upload_apk] = true
|
141
|
-
config[:skip_upload_aab] = true
|
142
|
-
config[:skip_upload_screenshots] = true
|
143
|
-
config[:skip_upload_images] = true
|
144
|
-
config[:validate_only] = validate_only
|
145
|
-
|
146
|
-
Actions::SupplyAction.run(config)
|
147
|
-
end
|
148
|
-
|
149
|
-
|
150
|
-
def self.save_metadata_to_files(metadata, release_number)
|
151
|
-
|
152
|
-
translations = {}
|
153
|
-
|
111
|
+
def self.write_lokalise_translations_to_googleplay_metadata(metadata, release_number)
|
154
112
|
metadata_key_file_googleplay().each { |key, parameter|
|
155
113
|
final_translations = {}
|
156
|
-
|
157
114
|
metadata.each { |lang, translations|
|
158
115
|
if translations.empty? == false
|
159
116
|
translation = translations[key]
|
160
117
|
final_translations[lang] = translation if translation != nil && translation.empty? == false
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
dirname = File.dirname(path)
|
176
|
-
unless File.directory?(dirname)
|
177
|
-
FileUtils.mkdir_p(dirname)
|
118
|
+
metadata_path = get_metadata_path()
|
119
|
+
if "#{parameter}" == "changelogs"
|
120
|
+
path = File.join(metadata_path, lang, parameter)
|
121
|
+
filename = "#{release_number}.txt"
|
122
|
+
else
|
123
|
+
path = File.join('.', metadata_path, lang)
|
124
|
+
filename = "#{parameter}.txt"
|
125
|
+
end
|
126
|
+
output_file = File.join(path, filename)
|
127
|
+
FileUtils.mkdir_p(path) unless File.exist?(path)
|
128
|
+
puts "Updating '#{output_file}'..."
|
129
|
+
File.open(output_file, 'wb') do |file|
|
130
|
+
file.write(final_translations[lang])
|
131
|
+
end
|
178
132
|
end
|
179
|
-
File.write(path, text)
|
180
133
|
}
|
181
134
|
}
|
182
|
-
|
183
135
|
end
|
184
136
|
|
185
137
|
|
@@ -213,36 +165,32 @@ module Fastlane
|
|
213
165
|
end
|
214
166
|
|
215
167
|
|
216
|
-
def self.upload_metadata(metadata_keys,
|
217
|
-
|
168
|
+
def self.upload_metadata(metadata_keys, metadata)
|
218
169
|
keys = []
|
219
|
-
|
220
170
|
metadata_keys.each do |key, value|
|
221
|
-
key = make_key_object_from_metadata(key, metadata
|
171
|
+
key = make_key_object_from_metadata(key, metadata)
|
222
172
|
if key
|
223
173
|
keys << key
|
224
174
|
end
|
225
175
|
end
|
226
|
-
|
227
176
|
data = {
|
228
177
|
data: keys.to_json
|
229
178
|
}
|
230
|
-
|
231
179
|
make_request("string/set", data)
|
232
180
|
end
|
233
181
|
|
234
182
|
|
235
183
|
def self.upload_metadata_itunes(metadata)
|
236
|
-
upload_metadata(metadata_key_file_itunes,
|
184
|
+
upload_metadata(metadata_key_file_itunes, metadata)
|
237
185
|
end
|
238
186
|
|
239
187
|
|
240
188
|
def self.upload_metadata_google_play(metadata)
|
241
|
-
upload_metadata(metadata_key_file_googleplay,
|
189
|
+
upload_metadata(metadata_key_file_googleplay, metadata)
|
242
190
|
end
|
243
191
|
|
244
192
|
|
245
|
-
def self.make_key_object_from_metadata(key, metadata
|
193
|
+
def self.make_key_object_from_metadata(key, metadata)
|
246
194
|
key_data = {
|
247
195
|
"key" => key,
|
248
196
|
"platform_mask" => 16,
|
@@ -251,7 +199,7 @@ module Fastlane
|
|
251
199
|
metadata.each { |iso_code, data|
|
252
200
|
translation = data[key]
|
253
201
|
unless translation == nil || translation.empty?
|
254
|
-
key_data["translations"][fix_language_name(iso_code,
|
202
|
+
key_data["translations"][fix_language_name(iso_code, true)] = translation
|
255
203
|
end
|
256
204
|
}
|
257
205
|
unless key_data["translations"].empty?
|
@@ -262,99 +210,91 @@ module Fastlane
|
|
262
210
|
end
|
263
211
|
|
264
212
|
|
265
|
-
def self.
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
213
|
+
def self.get_metadata_path()
|
214
|
+
if @params[:metadata_path]
|
215
|
+
metadata_path = @params[:metadata_path]
|
216
|
+
else
|
217
|
+
case @params[:platform]
|
218
|
+
when "android"
|
219
|
+
metadata_path = "fastlane/metadata/android/"
|
220
|
+
else
|
221
|
+
metadata_path = "fastlane/metadata/"
|
222
|
+
end
|
223
|
+
end
|
274
224
|
end
|
275
225
|
|
276
226
|
|
277
|
-
def self.get_metadata(
|
227
|
+
def self.get_metadata()
|
228
|
+
case @params[:platform]
|
229
|
+
when "ios"
|
230
|
+
available_languages = itunes_connect_languages
|
231
|
+
when "android"
|
232
|
+
available_languages = google_play_languages
|
233
|
+
end
|
234
|
+
metadata_path = get_metadata_path()
|
278
235
|
complete_metadata = {}
|
279
|
-
|
280
236
|
available_languages.each { |iso_code|
|
281
|
-
language_directory =
|
237
|
+
language_directory = File.join(metadata_path, iso_code)
|
282
238
|
if Dir.exist? language_directory
|
283
239
|
language_metadata = {}
|
284
|
-
|
240
|
+
case @params[:platform]
|
241
|
+
when "ios"
|
285
242
|
metadata_key_file_itunes().each { |key, file|
|
286
|
-
populate_hash_key_from_file(language_metadata, key, language_directory
|
243
|
+
populate_hash_key_from_file(language_metadata, key, File.join(language_directory, "#{file}.txt"))
|
287
244
|
}
|
288
|
-
|
245
|
+
when "android"
|
289
246
|
metadata_key_file_googleplay().each { |key, file|
|
290
247
|
if file == "changelogs"
|
291
|
-
changelog_directory = "
|
248
|
+
changelog_directory = File.join(language_directory, "changelogs")
|
292
249
|
files = Dir.entries("#{changelog_directory}")
|
293
250
|
collectedFiles = files.collect { |s| s.partition(".").first.to_i }
|
294
251
|
sortedFiles = collectedFiles.sort
|
295
|
-
populate_hash_key_from_file(language_metadata, key, language_directory
|
296
|
-
else
|
297
|
-
populate_hash_key_from_file(language_metadata, key, language_directory
|
252
|
+
populate_hash_key_from_file(language_metadata, key, File.join(language_directory, "changelogs", "#{sortedFiles.last}.txt"))
|
253
|
+
else
|
254
|
+
populate_hash_key_from_file(language_metadata, key, File.join(language_directory, "#{file}.txt"))
|
298
255
|
end
|
299
256
|
}
|
300
257
|
end
|
301
258
|
complete_metadata[iso_code] = language_metadata
|
302
259
|
end
|
303
260
|
}
|
304
|
-
|
305
261
|
return complete_metadata
|
306
262
|
end
|
307
263
|
|
308
264
|
|
309
|
-
def self.get_metadata_from_lokalise(
|
310
|
-
|
265
|
+
def self.get_metadata_from_lokalise()
|
266
|
+
case @params[:platform]
|
267
|
+
when "ios"
|
268
|
+
valid_keys = metadata_key_file_itunes().keys
|
269
|
+
valid_languages = itunes_connect_languages_in_lokalise()
|
270
|
+
key_name = "key_ios"
|
271
|
+
when "android"
|
272
|
+
valid_keys = metadata_key_file_googleplay().keys
|
273
|
+
valid_languages = google_play_languages_in_lokalise()
|
274
|
+
key_name = "key_android"
|
275
|
+
end
|
311
276
|
data = {
|
312
277
|
platform_mask: 16,
|
313
278
|
keys: valid_keys.to_json,
|
314
279
|
}
|
315
|
-
|
316
280
|
response = make_request("string/list", data)
|
317
|
-
|
318
|
-
if for_itunes
|
319
|
-
valid_languages = itunes_connect_languages_in_lokalise()
|
320
|
-
else
|
321
|
-
valid_languages = google_play_languages_in_lokalise()
|
322
|
-
end
|
323
281
|
metadata = {}
|
324
|
-
|
325
282
|
response["strings"].each { |lang, translation_objects|
|
326
283
|
if valid_languages.include?(lang)
|
327
284
|
translations = {}
|
328
285
|
translation_objects.each { |object|
|
329
|
-
|
330
|
-
key = object["key_ios"]
|
331
|
-
else
|
332
|
-
key = object["key_android"]
|
333
|
-
end
|
286
|
+
key = object[key_name]
|
334
287
|
translation = object["translation"]
|
335
288
|
if valid_keys.include?(key) && translation != nil && translation.empty? == false
|
336
289
|
translations[key] = translation
|
337
290
|
end
|
338
291
|
}
|
339
292
|
if translations.empty? == false
|
340
|
-
metadata[fix_language_name(lang
|
293
|
+
metadata[fix_language_name(lang)] = translations
|
341
294
|
end
|
342
295
|
end
|
343
296
|
}
|
344
297
|
return metadata
|
345
|
-
|
346
|
-
end
|
347
|
-
|
348
|
-
|
349
|
-
def self.get_metadata_from_lokalise_itunes()
|
350
|
-
valid_keys = metadata_keys_itunes()
|
351
|
-
return get_metadata_from_lokalise(valid_keys, true)
|
352
|
-
end
|
353
|
-
|
354
|
-
|
355
|
-
def self.get_metadata_from_lokalise_googleplay()
|
356
|
-
valid_keys = metadata_keys_googleplay()
|
357
|
-
return get_metadata_from_lokalise(valid_keys, false)
|
358
298
|
end
|
359
299
|
|
360
300
|
|
@@ -369,16 +309,6 @@ module Fastlane
|
|
369
309
|
end
|
370
310
|
|
371
311
|
|
372
|
-
def self.metadata_keys_itunes()
|
373
|
-
return metadata_key_file_itunes().keys
|
374
|
-
end
|
375
|
-
|
376
|
-
|
377
|
-
def self.metadata_keys_googleplay()
|
378
|
-
return metadata_key_file_googleplay().keys
|
379
|
-
end
|
380
|
-
|
381
|
-
|
382
312
|
def self.metadata_key_file_itunes()
|
383
313
|
return {
|
384
314
|
"appstore.app.name" => "name",
|
@@ -406,201 +336,94 @@ module Fastlane
|
|
406
336
|
|
407
337
|
def self.itunes_connect_languages_in_lokalise()
|
408
338
|
return itunes_connect_languages().map { |lang|
|
409
|
-
fix_language_name(lang, true
|
339
|
+
fix_language_name(lang, true)
|
410
340
|
}
|
411
341
|
end
|
412
342
|
|
413
343
|
|
414
344
|
def self.google_play_languages_in_lokalise()
|
415
345
|
return google_play_languages().map { |lang|
|
416
|
-
fix_language_name(lang,
|
346
|
+
fix_language_name(lang, true)
|
417
347
|
}
|
418
348
|
end
|
419
349
|
|
420
350
|
|
421
351
|
def self.itunes_connect_languages()
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
"en-AU",
|
428
|
-
"en-CA",
|
429
|
-
"en-GB",
|
430
|
-
"en-US",
|
431
|
-
"es-MX",
|
432
|
-
"es-ES",
|
433
|
-
"fi",
|
434
|
-
"fr-FR",
|
435
|
-
"fr-CA",
|
436
|
-
"id",
|
437
|
-
"it",
|
438
|
-
"ja",
|
439
|
-
"ko",
|
440
|
-
"ms",
|
441
|
-
"nl-NL",
|
442
|
-
"no",
|
443
|
-
"pt-BR",
|
444
|
-
"pt-PT",
|
445
|
-
"ru",
|
446
|
-
"sv",
|
447
|
-
"th",
|
448
|
-
"tr",
|
449
|
-
"vi",
|
450
|
-
"zh-Hans",
|
451
|
-
"zh-Hant"
|
452
|
-
]
|
352
|
+
languages = FastlaneCore::Languages::ALL_LANGUAGES
|
353
|
+
languages.each do |lang|
|
354
|
+
lang.gsub!("_", '-')
|
355
|
+
end
|
356
|
+
return languages
|
453
357
|
end
|
454
358
|
|
455
359
|
|
456
360
|
def self.google_play_languages()
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
'az-AZ',
|
463
|
-
'eu-ES',
|
464
|
-
'be',
|
465
|
-
'bn-BD',
|
466
|
-
'bg',
|
467
|
-
'my',
|
468
|
-
'ca',
|
469
|
-
'zh-CN',
|
470
|
-
'zh-TW',
|
471
|
-
'zh-HK',
|
472
|
-
'hr',
|
473
|
-
'cs',
|
474
|
-
'da',
|
475
|
-
'nl-NL',
|
476
|
-
'en-AU',
|
477
|
-
'en-CA',
|
478
|
-
'en-IN',
|
479
|
-
'en-SG',
|
480
|
-
'en-ZA',
|
481
|
-
'en-GB',
|
482
|
-
'en-US',
|
483
|
-
'et-EE',
|
484
|
-
'fil',
|
485
|
-
'fi',
|
486
|
-
'fr-CA',
|
487
|
-
'fr-FR',
|
488
|
-
'gl-ES',
|
489
|
-
'ka-GE',
|
490
|
-
'de-DE',
|
491
|
-
'el-GR',
|
492
|
-
'he',
|
493
|
-
'hi-IN',
|
494
|
-
'hu',
|
495
|
-
'is-IS',
|
496
|
-
'id',
|
497
|
-
'it-IT',
|
498
|
-
'ja',
|
499
|
-
'kn-IN',
|
500
|
-
'km-KH',
|
501
|
-
'ko',
|
502
|
-
'ky',
|
503
|
-
'lo',
|
504
|
-
'lv-LV',
|
505
|
-
'lt-LT',
|
506
|
-
'mk-MK',
|
507
|
-
'ms',
|
508
|
-
'ml-IN',
|
509
|
-
'mr',
|
510
|
-
'mn-MN',
|
511
|
-
'ne-NP',
|
512
|
-
'no',
|
513
|
-
'fa',
|
514
|
-
'pl',
|
515
|
-
'pt-BR',
|
516
|
-
'pt-PT',
|
517
|
-
'ro',
|
518
|
-
'ru-RU',
|
519
|
-
'sr',
|
520
|
-
'si',
|
521
|
-
'sk',
|
522
|
-
'sl-SI',
|
523
|
-
'es-419',
|
524
|
-
'es-ES',
|
525
|
-
'es-US',
|
526
|
-
'sw',
|
527
|
-
'sv-SE',
|
528
|
-
'ta-IN',
|
529
|
-
'te-IN',
|
530
|
-
'th',
|
531
|
-
'tr',
|
532
|
-
'uk',
|
533
|
-
'vi',
|
534
|
-
'zu'
|
535
|
-
]
|
361
|
+
languages = Supply::Languages::ALL_LANGUAGES
|
362
|
+
languages.each do |lang|
|
363
|
+
lang.gsub!("_", '-')
|
364
|
+
end
|
365
|
+
return languages
|
536
366
|
end
|
537
367
|
|
538
368
|
|
539
|
-
def self.
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
369
|
+
def self.itunes_to_lokalise_language_map()
|
370
|
+
return {
|
371
|
+
"de-DE" => "de",
|
372
|
+
"en-US" => "en",
|
373
|
+
"es-ES" => "es",
|
374
|
+
"fr-FR" => "fr"
|
375
|
+
}
|
376
|
+
end
|
377
|
+
|
378
|
+
|
379
|
+
def self.googleplay_to_lokalise_language_map()
|
380
|
+
return {
|
381
|
+
"cs-CZ" => "cs",
|
382
|
+
"da-DK" => "da",
|
383
|
+
"en-US" => "en",
|
384
|
+
"et" => "et_EE",
|
385
|
+
"fi-FI" => "fi",
|
386
|
+
"iw-IL" => "he",
|
387
|
+
"hu-HU" => "hu",
|
388
|
+
"hy-AM" => "hy",
|
389
|
+
"ja-JP" => "ja",
|
390
|
+
"ko-KR" => "ko",
|
391
|
+
"ky-KG" => "ky",
|
392
|
+
"lt" => "lt_LT",
|
393
|
+
"lv" => "lv_LV",
|
394
|
+
"lo-LA" => "lo",
|
395
|
+
"mr-IN" => "mr",
|
396
|
+
"ms-MY" => "ms",
|
397
|
+
"my-MM" => "my",
|
398
|
+
"no-NO" => "no",
|
399
|
+
"pl-PL" => "pl",
|
400
|
+
"si-LK" => "si",
|
401
|
+
"sl" => "sl_SI",
|
402
|
+
"tr-TR" => "tr"
|
403
|
+
}
|
404
|
+
end
|
405
|
+
|
406
|
+
|
407
|
+
def self.fix_language_name(language, for_lokalise = false)
|
408
|
+
if @params[:platform] == "android"
|
409
|
+
language_map = googleplay_to_lokalise_language_map()
|
410
|
+
else
|
411
|
+
language_map = itunes_to_lokalise_language_map()
|
412
|
+
end
|
413
|
+
if for_lokalise
|
414
|
+
if language_map.key?(language)
|
415
|
+
return language_map[language]
|
416
|
+
else
|
417
|
+
return language.gsub("-", "_")
|
553
418
|
end
|
554
419
|
else
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
name = "ms" if name == "ms_MY"
|
561
|
-
name = "cs" if name == "cs_CZ"
|
562
|
-
name = "da" if name == "da_DK"
|
563
|
-
name = "et_EE" if name == "et"
|
564
|
-
name = "fi" if name == "fi_FI"
|
565
|
-
name = "he" if name == "iw_IL"
|
566
|
-
name = "hu" if name == "hu_HU"
|
567
|
-
name = "ja" if name == "ja_JP"
|
568
|
-
name = "ko" if name == "ko_KR"
|
569
|
-
name = "ky" if name == "ky_KG"
|
570
|
-
name = "lo" if name == "lo_LA"
|
571
|
-
name = "lv_LV" if name == "lv"
|
572
|
-
name = "lt_LT" if name == "lt"
|
573
|
-
name = "mr" if name == "mr_IN"
|
574
|
-
name = "no" if name == "no_NO"
|
575
|
-
name = "pl" if name == "pl_PL"
|
576
|
-
name = "si" if name == "si_LK"
|
577
|
-
name = "sl_SI" if name == "sl"
|
578
|
-
else
|
579
|
-
name = name.gsub("_","-")
|
580
|
-
name = "tr-TR" if name == "tr"
|
581
|
-
name = "hy-AM" if name == "hy"
|
582
|
-
name = "my-MM" if name == "my"
|
583
|
-
name = "ms-MY" if name == "ms"
|
584
|
-
name = "cs-CZ" if name == "cs"
|
585
|
-
name = "da-DK" if name == "da"
|
586
|
-
name = "et" if name == "et-EE"
|
587
|
-
name = "fi-FI" if name == "fi"
|
588
|
-
name = "iw-IL" if name == "he"
|
589
|
-
name = "hu-HU" if name == "hu"
|
590
|
-
name = "ja-JP" if name == "ja"
|
591
|
-
name = "ko-KR" if name == "ko"
|
592
|
-
name = "ky-KG" if name == "ky"
|
593
|
-
name = "lo-LA" if name == "lo"
|
594
|
-
name = "lv" if name == "lv-LV"
|
595
|
-
name = "lt" if name == "lt-LT"
|
596
|
-
name = "mr-IN" if name == "mr"
|
597
|
-
name = "no-NO" if name == "no"
|
598
|
-
name = "pl-PL" if name == "pl"
|
599
|
-
name = "si-LK" if name == "si"
|
600
|
-
name = "sl" if name == "sl-SI"
|
420
|
+
language_map = language_map.invert
|
421
|
+
if language_map.key?(language)
|
422
|
+
return language_map[language]
|
423
|
+
else
|
424
|
+
return language.gsub("_", "-")
|
601
425
|
end
|
602
426
|
end
|
603
|
-
return name
|
604
427
|
end
|
605
428
|
|
606
429
|
|
@@ -621,6 +444,9 @@ module Fastlane
|
|
621
444
|
|
622
445
|
def self.available_options
|
623
446
|
[
|
447
|
+
FastlaneCore::ConfigItem.new(key: :platform,
|
448
|
+
env_name: "FASTLANE_PLATFORM_NAME",
|
449
|
+
description: "Fastlane platform name"),
|
624
450
|
FastlaneCore::ConfigItem.new(key: :api_token,
|
625
451
|
env_name: "LOKALISE_API_TOKEN",
|
626
452
|
description: "API Token for Lokalise",
|
@@ -633,6 +459,9 @@ module Fastlane
|
|
633
459
|
verify_block: proc do |value|
|
634
460
|
UI.user_error! "No Project Identifier for Lokalise given, pass using `project_identifier: 'identifier'`" unless (value and not value.empty?)
|
635
461
|
end),
|
462
|
+
FastlaneCore::ConfigItem.new(key: :metadata_path,
|
463
|
+
description: "Location where the metadata files should be stored and read from",
|
464
|
+
optional: true),
|
636
465
|
FastlaneCore::ConfigItem.new(key: :add_languages,
|
637
466
|
description: "Add missing languages in lokalise",
|
638
467
|
optional: true,
|
@@ -650,35 +479,27 @@ module Fastlane
|
|
650
479
|
UI.user_error! "Override translation should be true or false" unless [true, false].include? value
|
651
480
|
end),
|
652
481
|
FastlaneCore::ConfigItem.new(key: :action,
|
653
|
-
description: "Action to perform (
|
482
|
+
description: "Action to perform (download_from_lokalise, upload_to_lokalise)",
|
654
483
|
optional: false,
|
655
484
|
is_string: true,
|
656
485
|
verify_block: proc do |value|
|
657
|
-
UI.user_error! "Action should be
|
486
|
+
UI.user_error! "Action should be one of the following: download_from_lokalise, upload_to_lokalise" unless ["download_from_lokalise", "upload_to_lokalise"].include? value
|
658
487
|
end),
|
659
488
|
FastlaneCore::ConfigItem.new(key: :release_number,
|
660
|
-
description: "Release number is required
|
489
|
+
description: "Release number is required for Android actions",
|
661
490
|
optional: true,
|
662
491
|
is_string: false),
|
663
|
-
FastlaneCore::ConfigItem.new(key: :validate_only,
|
664
|
-
description: "Only validate the metadata (works with only update_googleplay action)",
|
665
|
-
optional: true,
|
666
|
-
is_string: false,
|
667
|
-
default_value: false,
|
668
|
-
verify_block: proc do |value|
|
669
|
-
UI.user_error! "Validate only should be true or false" unless [true, false].include? value
|
670
|
-
end),
|
671
492
|
]
|
672
493
|
end
|
673
494
|
|
674
495
|
|
675
496
|
def self.authors
|
676
|
-
["Fedya-L"]
|
497
|
+
["Fedya-L", "BasouKazuma"]
|
677
498
|
end
|
678
499
|
|
679
500
|
|
680
501
|
def self.is_supported?(platform)
|
681
|
-
[:ios, :mac].include? platform
|
502
|
+
[:ios, :android, :mac].include? platform
|
682
503
|
end
|
683
504
|
|
684
505
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-lokalise
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Abbas Jaffery
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: zip
|