fastlane-plugin-lokalise 1.0.1 → 2.0.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 +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
|