ETLane 0.1.42 → 0.1.43
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Lanes/actions/README.md +47 -0
- data/Lanes/actions/add_keys_to_lokalise.rb +106 -0
- data/Lanes/actions/android/README.md +53 -0
- data/Lanes/actions/android/lokalise_download.rb +144 -0
- data/Lanes/actions/android/lokalise_upload.rb +98 -0
- data/Lanes/actions/lokalise.rb +180 -0
- data/Lanes/actions/lokalise_metadata.rb +624 -0
- data/Lanes/actions/lokalise_upload.rb +165 -0
- data/Lanes/actions/previews.rb +157 -0
- data/Scripts/Sources/Common/Api.swift +142 -0
- data/Scripts/Sources/Common/Array.swift +8 -0
- data/Scripts/Sources/Common/Error.swift +10 -0
- data/Scripts/Sources/Common/MD5.swift +34 -0
- data/Scripts/Sources/Resources/Api+Figma.swift +43 -0
- data/Scripts/Sources/Resources/Deploy.swift +133 -0
- data/Scripts/Sources/Resources/Device.swift +42 -0
- data/Scripts/Sources/Resources/DownloadBatch.swift +108 -0
- data/Scripts/Sources/Resources/FigmaPages.swift +58 -0
- data/Scripts/Sources/Resources/Images.swift +5 -0
- data/Scripts/Sources/Resources/PreviewDownloader.swift +80 -0
- data/Scripts/Sources/Resources/ResourcesParser.swift +25 -0
- data/Scripts/Sources/Resources/ScreenshotDownloader.swift +150 -0
- data/Scripts/Sources/Resources/main.swift +58 -0
- metadata +25 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df552fc118e52cf6af8152f416754c4cf24a568229cf4b46909e27be82fecf95
|
4
|
+
data.tar.gz: 552b7544b60260f25a78d7f61c777895bc5821c8a541321bc1a6a98a95e46f20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 611db6f1e99fad1c8f5d9bfcb1ab8bc7c05e9822af0fc62e567d09de0953a10523f32dd688f37062275f520ea3bfef9c56cbe49226bc4d903a77e28604f60ce9
|
7
|
+
data.tar.gz: 03ba6b6a5a91d3602dff2fae7c004354001c1b3dc6f416c7b93f4373cdc36fd2a823785175e92095609dff65d8cfd14b1b2af00a2d77db97b917952b7e1138b3
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Lokalise Fastlane Actions
|
2
|
+
|
3
|
+
Collection of actions for integrating Lokalise into your iOS project using Fastlane. Learn more in our [blog post.](https://blog.lokalise.com/automating-itunes-connect-deployment-with-fastlane-and-lokalise/)
|
4
|
+
|
5
|
+
For Android actions please check [here](https://github.com/lokalise/lokalise-fastlane-actions/tree/master/android)
|
6
|
+
|
7
|
+
## Note
|
8
|
+
|
9
|
+
These are Fastlane actions, not plugins. Add them to `fastlane/actions` folder in the root of your project.
|
10
|
+
|
11
|
+
## lokalise
|
12
|
+
|
13
|
+
This action downloads .strings and .stringsdict files to destination folder.
|
14
|
+
|
15
|
+
Parameters:
|
16
|
+
|
17
|
+
- `api_token`. Your API token. Can be set up using enviromental parameter `LOKALISE_API_TOKEN`
|
18
|
+
- `project_identifier`. Your Project ID. Can be set up using enviromental parameter `LOKALISE_PROJECT_ID`
|
19
|
+
- `destination`. Localization files destination.
|
20
|
+
- `clean_destination`. Cleans destination folder if set to `true` *(`false` by default)*.
|
21
|
+
- `languages`. Languages to download *(must be passed as array of strings, leave empty to download all)*.
|
22
|
+
- `include_comments`. Include comments in exported files.
|
23
|
+
- `use_original`. Use original filenames/formats.
|
24
|
+
|
25
|
+
## lokalise_metadata
|
26
|
+
|
27
|
+
This action imports metadata from files generated by Deliver action and uploads iTunes Connect metadata using information from Lokalise.
|
28
|
+
|
29
|
+
- `api_token`. Your API token. Can be set up using enviromental parameter `LOKALISE_API_TOKEN`
|
30
|
+
- `project_identifier`. Your Project ID. Can be set up using enviromental parameter `LOKALISE_PROJECT_ID`
|
31
|
+
- `action`. Action to perform *(can be `update_lokalise_itunes`, `update_itunes`, `update_lokalise_googleplay` or `update_googleplay`)*.
|
32
|
+
- `add_languages`. Add missing languages to lokalise *(`false` by default)*.
|
33
|
+
- `override_translation`. Override translations in lokalise.
|
34
|
+
- `release_number`. Application release number. Required with `update_googleplay` action.
|
35
|
+
- `validate_only`. Only validate the metadata. Used with `update_googleplay` action *(`false` by default)*.
|
36
|
+
|
37
|
+
## add_keys_to_lokalise
|
38
|
+
|
39
|
+
This actions allow you upload keys to Lokalise.
|
40
|
+
|
41
|
+
Parameters:
|
42
|
+
|
43
|
+
- `api_token`. Your API token. Can be set up using enviromental parameter `LOKALISE_API_TOKEN`
|
44
|
+
- `project_identifier`. Your Project ID. Can be set up using enviromental parameter `LOKALISE_PROJECT_ID`
|
45
|
+
- `platform_mask`. Platform mask to asign to keys *(1 is iOS, 2 is Android, 4 is Web and 16 is Other)*.
|
46
|
+
- `keys`. Keys to add *(must be passed as array of strings)*.
|
47
|
+
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
|
4
|
+
class AddKeysToLokaliseAction < Action
|
5
|
+
def self.run(params)
|
6
|
+
require 'net/http'
|
7
|
+
|
8
|
+
token = params[:api_token]
|
9
|
+
project_identifier = params[:project_identifier]
|
10
|
+
keys = params[:keys]
|
11
|
+
platform_mask = params[:platform_mask]
|
12
|
+
|
13
|
+
keysObjects = []
|
14
|
+
|
15
|
+
keys.each do |key|
|
16
|
+
keysObjects << {
|
17
|
+
key: key,
|
18
|
+
platform_mask: platform_mask
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
request_data = {
|
23
|
+
api_token: token,
|
24
|
+
id: project_identifier,
|
25
|
+
data: keysObjects.to_json
|
26
|
+
}
|
27
|
+
|
28
|
+
uri = URI("https://api.lokalise.com/api/string/set")
|
29
|
+
request = Net::HTTP::Post.new(uri)
|
30
|
+
request.set_form_data(request_data)
|
31
|
+
|
32
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
33
|
+
http.use_ssl = true
|
34
|
+
response = http.request(request)
|
35
|
+
|
36
|
+
jsonResponse = JSON.parse(response.body)
|
37
|
+
raise "Bad response 🉐\n#{response.body}".red unless jsonResponse.kind_of? Hash
|
38
|
+
if jsonResponse["response"]["status"] == "success" then
|
39
|
+
inserted = jsonResponse["result"]["inserted"]
|
40
|
+
updated = jsonResponse["result"]["updated"]
|
41
|
+
Helper.log.info "Keys uploaded. #{inserted} inserted and #{updated} updated 🚀".green
|
42
|
+
elsif jsonResponse["response"]["status"] == "error"
|
43
|
+
code = jsonResponse["response"]["code"]
|
44
|
+
message = jsonResponse["response"]["message"]
|
45
|
+
raise "Response error code #{code} (#{message}) 📟".red
|
46
|
+
else
|
47
|
+
raise "Bad response 🉐\n#{jsonResponse}".red
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
#####################################################
|
52
|
+
# @!group Documentation
|
53
|
+
#####################################################
|
54
|
+
|
55
|
+
def self.description
|
56
|
+
"Add keys to lokalise"
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.available_options
|
60
|
+
[
|
61
|
+
FastlaneCore::ConfigItem.new(key: :api_token,
|
62
|
+
env_name: "LOKALISE_API_TOKEN",
|
63
|
+
description: "API Token for Lokalise",
|
64
|
+
is_string: true,
|
65
|
+
verify_block: proc do |value|
|
66
|
+
raise "No API token for Lokalise given, pass using `api_token: 'token'`".red unless (value and not value.empty?)
|
67
|
+
end),
|
68
|
+
FastlaneCore::ConfigItem.new(key: :project_identifier,
|
69
|
+
env_name: "LOKALISE_PROJECT_ID",
|
70
|
+
description: "Lokalise Project Identifier",
|
71
|
+
is_string: true,
|
72
|
+
verify_block: proc do |value|
|
73
|
+
raise "No Project Identifier for Lokalise given, pass using `project_identifier: 'identifier'`".red unless (value and not value.empty?)
|
74
|
+
end),
|
75
|
+
FastlaneCore::ConfigItem.new(key: :platform_mask,
|
76
|
+
description: "Platform mask where 1 is iOS, 2 is Android, 4 is Web and 16 is Other",
|
77
|
+
optional: true,
|
78
|
+
is_string: false,
|
79
|
+
default_value: 1,
|
80
|
+
verify_block: proc do |value|
|
81
|
+
raise "Platfrom mask is an integer value".red unless value.is_a?(Integer)
|
82
|
+
end),
|
83
|
+
FastlaneCore::ConfigItem.new(key: :keys,
|
84
|
+
description: "Keys to add",
|
85
|
+
optional: false,
|
86
|
+
is_string: false,
|
87
|
+
verify_block: proc do |value|
|
88
|
+
raise "Keys must be passed as array of strings".red unless (value.kind_of? Array and not value.empty?)
|
89
|
+
value.each_with_index do |key, index|
|
90
|
+
raise "Key at index #{index} must be string".red unless key.kind_of? String
|
91
|
+
raise "Key at index #{index} can't be empty".red if key.empty?
|
92
|
+
end
|
93
|
+
end)
|
94
|
+
]
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.authors
|
98
|
+
"Fedya-L"
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.is_supported?(platform)
|
102
|
+
[:ios, :mac].include? platform
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# Lokalise Fastlane Actions for Android
|
2
|
+
|
3
|
+
Fastlane actions for integrating Lokalise into your Android project using Fastlane.
|
4
|
+
|
5
|
+
All Android actions based on APIs V2
|
6
|
+
|
7
|
+
## Note
|
8
|
+
|
9
|
+
These are Fastlane actions, not plugins. Add them to `fastlane/actions` folder in the root of your project.
|
10
|
+
|
11
|
+
## lokalise_download
|
12
|
+
|
13
|
+
This action downloads strings.xml files to you main resources folder `./app/src/main/res`.
|
14
|
+
|
15
|
+
>That will replace your local strings.xml file with the latest version from lokalise project.
|
16
|
+
>So make sure to call lokalise_upload first to don't miss any added keys.
|
17
|
+
|
18
|
+
Parameters:
|
19
|
+
|
20
|
+
- `api_token`. Your API token. Can be set up using enviromental parameter `LOKALISE_API_TOKEN`
|
21
|
+
- `project_identifier`. Your Project ID. Can be set up using enviromental parameter `LOKALISE_PROJECT_ID`
|
22
|
+
- `languages`. Languages to download *(must be passed as array of strings)* Ex. `["en", "ar"]`.
|
23
|
+
|
24
|
+
Sample:
|
25
|
+
```
|
26
|
+
lokalise_download(
|
27
|
+
api_token: "YOUR_API_TOKEN",
|
28
|
+
project_identifier: "YOUR_PROJECT_ID",
|
29
|
+
languages: ["en", "ar"]
|
30
|
+
)
|
31
|
+
|
32
|
+
```
|
33
|
+
|
34
|
+
## lokalise_upload
|
35
|
+
|
36
|
+
This action uploads the new keys from your local strings.xml files to lokalise project.
|
37
|
+
|
38
|
+
- `api_token`. Your API token. Can be set up using enviromental parameter `LOKALISE_API_TOKEN`
|
39
|
+
- `project_identifier`. Your Project ID. Can be set up using enviromental parameter `LOKALISE_PROJECT_ID`
|
40
|
+
- `languages`. Languages to download *(must be passed as array of strings)* Ex. `["en", "ar"]`.
|
41
|
+
|
42
|
+
Sample:
|
43
|
+
```
|
44
|
+
lokalise_upload(
|
45
|
+
api_token: "YOUR_API_TOKEN",
|
46
|
+
project_identifier: "YOUR_PROJECT_ID",
|
47
|
+
languages: ["en", "ar"]
|
48
|
+
)
|
49
|
+
|
50
|
+
```
|
51
|
+
|
52
|
+
|
53
|
+
_All this actions are the basic ones, and can be enhanced for supporting flavors_
|
@@ -0,0 +1,144 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class LokaliseAction < Action
|
4
|
+
def self.run(params)
|
5
|
+
require 'net/http'
|
6
|
+
require 'json'
|
7
|
+
require 'zip'
|
8
|
+
require 'rubygems'
|
9
|
+
|
10
|
+
token = params[:api_token]
|
11
|
+
project_identifier = params[:project_identifier]
|
12
|
+
destination = params[:destination]
|
13
|
+
|
14
|
+
request_data = {
|
15
|
+
format: "xml",
|
16
|
+
original_filenames: false,
|
17
|
+
bundle_structure: "values-%LANG_ISO%/strings.%FORMAT%",
|
18
|
+
ota_plugin_bundle: 0,
|
19
|
+
export_empty: "base",
|
20
|
+
include_comments: false,
|
21
|
+
replace_breaks: true
|
22
|
+
}
|
23
|
+
|
24
|
+
languages = params[:languages]
|
25
|
+
if languages.kind_of? Array
|
26
|
+
request_data["langs"] = languages.to_json
|
27
|
+
end
|
28
|
+
|
29
|
+
tags = params[:tags]
|
30
|
+
if tags.kind_of? Array
|
31
|
+
request_data["include_tags"] = tags.to_json
|
32
|
+
end
|
33
|
+
|
34
|
+
uri = URI("https://api.lokalise.com/api2/projects/#{project_identifier}/files/download")
|
35
|
+
request = Net::HTTP::Post.new(uri)
|
36
|
+
request["content-type"] = 'application/json'
|
37
|
+
request["x-api-token"] = token
|
38
|
+
request.body = request_data.to_json
|
39
|
+
|
40
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
41
|
+
http.use_ssl = true
|
42
|
+
response = http.request(request)
|
43
|
+
|
44
|
+
jsonResponse = JSON.parse(response.body)
|
45
|
+
UI.error "Bad response 🉐\n#{response.body}" unless jsonResponse.kind_of? Hash
|
46
|
+
if jsonResponse["bundle_url"].kind_of?(String) then
|
47
|
+
UI.message "Downloading localizations archive 📦"
|
48
|
+
FileUtils.mkdir_p("lokalisetmp")
|
49
|
+
fileURL = jsonResponse["bundle_url"]
|
50
|
+
uri = URI(fileURL)
|
51
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
52
|
+
http.use_ssl = true
|
53
|
+
zipRequest = Net::HTTP::Get.new(uri)
|
54
|
+
response = http.request(zipRequest)
|
55
|
+
if response.content_type == "application/zip" or response.content_type == "application/octet-stream" then
|
56
|
+
FileUtils.mkdir_p("lokalisetmp")
|
57
|
+
open("lokalisetmp/a.zip", "wb") { |file|
|
58
|
+
file.write(response.body)
|
59
|
+
}
|
60
|
+
unzip_file("lokalisetmp/a.zip", destination)
|
61
|
+
FileUtils.remove_dir("lokalisetmp")
|
62
|
+
UI.success "Localizations extracted to #{destination} 📗 📕 📘"
|
63
|
+
else
|
64
|
+
UI.error "Response did not include ZIP"
|
65
|
+
end
|
66
|
+
elsif jsonResponse["error"]["code"].kind_of?(Integer)
|
67
|
+
code = jsonResponse["error"]["code"]
|
68
|
+
message = jsonResponse["error"]["message"]
|
69
|
+
UI.error "Response error code #{code} (#{message}) 📟"
|
70
|
+
else
|
71
|
+
UI.error "Bad response 🉐\n#{jsonResponse}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
def self.unzip_file(file, destination)
|
77
|
+
Zip::File.open(file) { |zip_file|
|
78
|
+
UI.message "Unarchiving localizations to destination 📚"
|
79
|
+
zip_file.each { |f|
|
80
|
+
f_path= File.join(destination, f.name)
|
81
|
+
FileUtils.mkdir_p(File.dirname(f_path))
|
82
|
+
FileUtils.rm(f_path) if File.file? f_path
|
83
|
+
zip_file.extract(f, f_path)
|
84
|
+
}
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
#####################################################
|
90
|
+
# @!group Documentation
|
91
|
+
#####################################################
|
92
|
+
|
93
|
+
def self.description
|
94
|
+
"Download Android localization from Lokalise"
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.available_options
|
98
|
+
[
|
99
|
+
FastlaneCore::ConfigItem.new(key: :api_token,
|
100
|
+
env_name: "LOKALISE_API_TOKEN",
|
101
|
+
description: "API Token for Lokalise",
|
102
|
+
verify_block: proc do |value|
|
103
|
+
UI.user_error! "No API token for Lokalise given, pass using `api_token: 'token'`" unless (value and not value.empty?)
|
104
|
+
end),
|
105
|
+
FastlaneCore::ConfigItem.new(key: :project_identifier,
|
106
|
+
env_name: "LOKALISE_PROJECT_ID",
|
107
|
+
description: "Lokalise Project ID",
|
108
|
+
verify_block: proc do |value|
|
109
|
+
UI.user_error! "No Project Identifier for Lokalise given, pass using `project_identifier: 'identifier'`" unless (value and not value.empty?)
|
110
|
+
end),
|
111
|
+
FastlaneCore::ConfigItem.new(key: :destination,
|
112
|
+
description: "Localization destination",
|
113
|
+
verify_block: proc do |value|
|
114
|
+
UI.user_error! "Things are pretty bad" unless (value and not value.empty?)
|
115
|
+
UI.user_error! "Directory you passed is in your imagination" unless File.directory?(value)
|
116
|
+
end),
|
117
|
+
FastlaneCore::ConfigItem.new(key: :languages,
|
118
|
+
description: "Languages to download",
|
119
|
+
optional: true,
|
120
|
+
is_string: false,
|
121
|
+
verify_block: proc do |value|
|
122
|
+
UI.user_error! "Language codes should be passed as array" unless value.kind_of? Array
|
123
|
+
end),
|
124
|
+
FastlaneCore::ConfigItem.new(key: :tags,
|
125
|
+
description: "Include only the keys tagged with a given set of tags",
|
126
|
+
optional: true,
|
127
|
+
is_string: false,
|
128
|
+
verify_block: proc do |value|
|
129
|
+
UI.user_error! "Tags should be passed as array" unless value.kind_of? Array
|
130
|
+
end),
|
131
|
+
|
132
|
+
]
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.authors
|
136
|
+
"simonkarmy"
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.is_supported?(platform)
|
140
|
+
[:android].include? platform
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class LokaliseUploadAction < Action
|
4
|
+
def self.run(params)
|
5
|
+
require 'net/http'
|
6
|
+
require 'json'
|
7
|
+
require 'base64'
|
8
|
+
|
9
|
+
token = params[:api_token]
|
10
|
+
project_identifier = params[:project_identifier]
|
11
|
+
languages = params[:languages]
|
12
|
+
|
13
|
+
for lang_code in languages do
|
14
|
+
file_path = (lang_code == "en" ? "./app/src/main/res/values/strings.xml" : "./app/src/main/res/values-#{lang_code}/strings.xml")
|
15
|
+
self.upload_lang(token, project_identifier, lang_code, file_path)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.upload_lang(token, project_id, lang_code, lang_file_path)
|
20
|
+
|
21
|
+
file_data = File.open(lang_file_path, "r").read
|
22
|
+
file_data_64 = Base64.encode64(file_data).delete("\n")
|
23
|
+
|
24
|
+
request_data = {
|
25
|
+
filename: "strings.xml",
|
26
|
+
data: file_data_64 ,
|
27
|
+
lang_iso: lang_code,
|
28
|
+
convert_placeholders: true ,
|
29
|
+
slashn_to_linebreak: true
|
30
|
+
}
|
31
|
+
|
32
|
+
uri = URI("https://api.lokalise.com/api2/projects/#{project_id}/files/upload")
|
33
|
+
request = Net::HTTP::Post.new(uri)
|
34
|
+
request["content-type"] = 'application/json'
|
35
|
+
request["x-api-token"] = token
|
36
|
+
request.body = request_data.to_json
|
37
|
+
|
38
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
39
|
+
http.use_ssl = true
|
40
|
+
response = http.request(request)
|
41
|
+
|
42
|
+
jsonResponse = JSON.parse(response.body)
|
43
|
+
UI.error "Bad response 🉐\n#{response.body}" unless jsonResponse.kind_of? Hash
|
44
|
+
if jsonResponse["project_id"].kind_of?(String) then
|
45
|
+
UI.message "Uploaded localization file for #{lang_code} successfully #{jsonResponse["result"]}"
|
46
|
+
elsif jsonResponse["error"]["code"].kind_of?(Integer)
|
47
|
+
code = jsonResponse["error"]["code"]
|
48
|
+
message = jsonResponse["error"]["message"]
|
49
|
+
UI.error "Response error code #{code} (#{message}) 📟"
|
50
|
+
else
|
51
|
+
UI.error "Bad response 🉐\n#{jsonResponse}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
#####################################################
|
57
|
+
# @!group Documentation
|
58
|
+
#####################################################
|
59
|
+
|
60
|
+
def self.description
|
61
|
+
"Upload Android strings.xml to Lokalise"
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.available_options
|
65
|
+
[
|
66
|
+
FastlaneCore::ConfigItem.new(key: :api_token,
|
67
|
+
env_name: "LOKALISE_API_TOKEN",
|
68
|
+
description: "API Token for Lokalise",
|
69
|
+
verify_block: proc do |value|
|
70
|
+
UI.user_error! "No API token for Lokalise given, pass using `api_token: 'token'`" unless (value and not value.empty?)
|
71
|
+
end),
|
72
|
+
FastlaneCore::ConfigItem.new(key: :project_identifier,
|
73
|
+
env_name: "LOKALISE_PROJECT_ID",
|
74
|
+
description: "Lokalise Project ID",
|
75
|
+
verify_block: proc do |value|
|
76
|
+
UI.user_error! "No Project Identifier for Lokalise given, pass using `project_identifier: 'identifier'`" unless (value and not value.empty?)
|
77
|
+
end),
|
78
|
+
FastlaneCore::ConfigItem.new(key: :languages,
|
79
|
+
description: "Languages to download",
|
80
|
+
optional: true,
|
81
|
+
is_string: false,
|
82
|
+
verify_block: proc do |value|
|
83
|
+
UI.user_error! "Language codes should be passed as array" unless value.kind_of? Array
|
84
|
+
end),
|
85
|
+
|
86
|
+
]
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.authors
|
90
|
+
"simonkarmy"
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.is_supported?(platform)
|
94
|
+
[:android].include? platform
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|