ad_localize 5.0.0 → 6.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/.github/workflows/ruby.yml +6 -3
- data/.rubocop.yml +5 -0
- data/.rubocop_todo.yml +319 -0
- data/CHANGELOG.md +24 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +54 -48
- data/README.md +32 -10
- data/Rakefile +1 -0
- data/ad_localize.gemspec +10 -9
- data/bin/console +1 -0
- data/exe/ad_localize +2 -1
- data/lib/ad_localize/ad_logger.rb +5 -10
- data/lib/ad_localize/cli.rb +10 -3
- data/lib/ad_localize/entities/key.rb +3 -76
- data/lib/ad_localize/entities/locale_wording.rb +32 -52
- data/lib/ad_localize/entities/platform.rb +13 -0
- data/lib/ad_localize/entities/simple_wording.rb +6 -0
- data/lib/ad_localize/entities/wording_type.rb +11 -0
- data/lib/ad_localize/interactors/base_generate_files.rb +37 -0
- data/lib/ad_localize/interactors/download_spreadsheets.rb +20 -0
- data/lib/ad_localize/interactors/export_wording.rb +26 -20
- data/lib/ad_localize/interactors/generate_info_plist.rb +24 -0
- data/lib/ad_localize/interactors/generate_ios_files.rb +12 -0
- data/lib/ad_localize/interactors/generate_json.rb +20 -0
- data/lib/ad_localize/interactors/generate_localizable_strings.rb +24 -0
- data/lib/ad_localize/interactors/generate_localizable_strings_dict.rb +24 -0
- data/lib/ad_localize/interactors/generate_properties.rb +20 -0
- data/lib/ad_localize/interactors/generate_strings.rb +25 -0
- data/lib/ad_localize/interactors/generate_yaml.rb +20 -0
- data/lib/ad_localize/interactors/merge_wordings.rb +49 -18
- data/lib/ad_localize/interactors/parse_csv_files.rb +22 -0
- data/lib/ad_localize/interactors/process_export_request.rb +21 -0
- data/lib/ad_localize/mappers/locale_wording_to_hash.rb +45 -24
- data/lib/ad_localize/mappers/options_to_export_request.rb +14 -22
- data/lib/ad_localize/option_handler.rb +50 -27
- data/lib/ad_localize/parsers/csv_parser.rb +84 -0
- data/lib/ad_localize/parsers/key_parser.rb +62 -0
- data/lib/ad_localize/repositories/drive_repository.rb +53 -0
- data/lib/ad_localize/repositories/file_system_repository.rb +2 -1
- data/lib/ad_localize/requests/export_request.rb +95 -57
- data/lib/ad_localize/sanitizers/ios_sanitizer.rb +12 -0
- data/lib/ad_localize/{mappers/android_translation_mapper.rb → sanitizers/ios_to_android_sanitizer.rb} +8 -8
- data/lib/ad_localize/sanitizers/pass_through_sanitizer.rb +10 -0
- data/lib/ad_localize/serializers/info_plist_serializer.rb +9 -11
- data/lib/ad_localize/serializers/json_serializer.rb +3 -5
- data/lib/ad_localize/serializers/localizable_strings_serializer.rb +9 -15
- data/lib/ad_localize/serializers/localizable_stringsdict_serializer.rb +12 -25
- data/lib/ad_localize/serializers/properties_serializer.rb +9 -11
- data/lib/ad_localize/serializers/strings_serializer.rb +12 -21
- data/lib/ad_localize/serializers/templated_serializer.rb +51 -0
- data/lib/ad_localize/serializers/yaml_serializer.rb +4 -6
- data/lib/ad_localize/templates/android/strings.xml.erb +6 -6
- data/lib/ad_localize/templates/ios/Localizable.stringsdict.erb +14 -14
- data/lib/ad_localize/version.rb +2 -1
- data/lib/ad_localize/view_models/compound_wording_view_model.rb +2 -0
- data/lib/ad_localize/view_models/simple_wording_view_model.rb +2 -0
- data/lib/ad_localize.rb +33 -35
- metadata +70 -47
- data/lib/ad_localize/constant.rb +0 -6
- data/lib/ad_localize/entities/translation.rb +0 -32
- data/lib/ad_localize/entities/wording.rb +0 -24
- data/lib/ad_localize/interactors/execute_export_request.rb +0 -45
- data/lib/ad_localize/interactors/export_csv_files.rb +0 -20
- data/lib/ad_localize/interactors/export_g_spreadsheet.rb +0 -64
- data/lib/ad_localize/interactors/platforms/export_android_locale_wording.rb +0 -44
- data/lib/ad_localize/interactors/platforms/export_csv_locale_wording.rb +0 -22
- data/lib/ad_localize/interactors/platforms/export_ios_locale_wording.rb +0 -75
- data/lib/ad_localize/interactors/platforms/export_json_locale_wording.rb +0 -27
- data/lib/ad_localize/interactors/platforms/export_platform_factory.rb +0 -50
- data/lib/ad_localize/interactors/platforms/export_properties_locale_wording.rb +0 -32
- data/lib/ad_localize/interactors/platforms/export_yaml_locale_wording.rb +0 -27
- data/lib/ad_localize/mappers/csv_path_to_wording.rb +0 -73
- data/lib/ad_localize/mappers/ios_translation_mapper.rb +0 -12
- data/lib/ad_localize/mappers/translation_group_mapper.rb +0 -14
- data/lib/ad_localize/mappers/translation_mapper.rb +0 -30
- data/lib/ad_localize/mappers/value_range_to_wording.rb +0 -67
- data/lib/ad_localize/repositories/g_sheets_repository.rb +0 -44
- data/lib/ad_localize/requests/export_wording_options.rb +0 -24
- data/lib/ad_localize/requests/g_spreadsheet_options.rb +0 -47
- data/lib/ad_localize/requests/merge_policy.rb +0 -28
- data/lib/ad_localize/serializers/with_template.rb +0 -19
- data/lib/ad_localize/validators/key_validator.rb +0 -31
- data/lib/ad_localize/view_models/translation_group_view_model.rb +0 -19
- data/lib/ad_localize/view_models/translation_view_model.rb +0 -23
data/ad_localize.gemspec
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'ad_localize/version'
|
|
@@ -7,7 +7,6 @@ Gem::Specification.new do |spec|
|
|
|
7
7
|
spec.name = 'ad_localize'
|
|
8
8
|
spec.version = AdLocalize::VERSION
|
|
9
9
|
spec.license = 'MIT'
|
|
10
|
-
spec.date = '2018-04-18'
|
|
11
10
|
spec.authors = [
|
|
12
11
|
'Edouard Siegel',
|
|
13
12
|
'Patrick Nollet',
|
|
@@ -24,11 +23,11 @@ Gem::Specification.new do |spec|
|
|
|
24
23
|
'Satyan Jacquens',
|
|
25
24
|
'Thomas Esterlin'
|
|
26
25
|
]
|
|
27
|
-
spec.email = %w
|
|
26
|
+
spec.email = %w[joanna.vigne@fabernovel.com pierre.felgines@fabernovel.com edouard.siegel@fabernovel.com]
|
|
28
27
|
|
|
29
|
-
spec.summary = %q
|
|
30
|
-
spec.description = %q
|
|
31
|
-
Supported wording format : CSV. Supported export format: iOS, Android, JSON and YAML
|
|
28
|
+
spec.summary = %q(AdLocalize helps with mobile and web applications wording)
|
|
29
|
+
spec.description = %q(AdLocalize produces localization files from platform agnostic wording.
|
|
30
|
+
Supported wording format : CSV. Supported export format: iOS, Android, JSON and YAML)
|
|
32
31
|
spec.homepage = 'https://github.com/applidium/ad_localize'
|
|
33
32
|
|
|
34
33
|
# Specify which files should be added to the gem when it is released.
|
|
@@ -45,12 +44,14 @@ Gem::Specification.new do |spec|
|
|
|
45
44
|
spec.add_development_dependency 'minitest', '~> 5.11'
|
|
46
45
|
spec.add_development_dependency 'minitest-reporters', '~> 1.3'
|
|
47
46
|
spec.add_development_dependency 'diffy', '~> 3.3'
|
|
47
|
+
spec.add_development_dependency 'debug', ">= 1.0.0", '< 2.0'
|
|
48
|
+
spec.add_development_dependency 'rubocop', "~> 1.0"
|
|
48
49
|
|
|
49
50
|
spec.add_dependency 'activesupport', '>= 6.1.3.2', '< 8.0'
|
|
50
|
-
spec.add_dependency 'nokogiri', '~> 1.10'
|
|
51
51
|
spec.add_dependency 'colorize', '~> 0.8'
|
|
52
|
-
spec.add_dependency 'googleauth', '~> 0.12'
|
|
53
52
|
spec.add_dependency 'google-apis-sheets_v4', '~> 0.9'
|
|
53
|
+
spec.add_dependency 'google-apis-drive_v3', '~> 0.33.0'
|
|
54
54
|
|
|
55
|
-
spec.required_ruby_version = '>= 2.7'
|
|
55
|
+
spec.required_ruby_version = '>= 2.7', '< 4.0'
|
|
56
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
56
57
|
end
|
data/bin/console
CHANGED
data/exe/ad_localize
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module AdLocalize
|
|
2
3
|
class AdLogger
|
|
3
4
|
def initialize
|
|
@@ -6,19 +7,19 @@ module AdLocalize
|
|
|
6
7
|
end
|
|
7
8
|
|
|
8
9
|
def warn(text)
|
|
9
|
-
|
|
10
|
+
@logger.warn(text.yellow)
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def info(text)
|
|
13
|
-
|
|
14
|
+
@logger.info(text.blue)
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def error(text)
|
|
17
|
-
|
|
18
|
+
@logger.error(text.red)
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
def debug(text)
|
|
21
|
-
|
|
22
|
+
@logger.debug(text)
|
|
22
23
|
end
|
|
23
24
|
|
|
24
25
|
def info!
|
|
@@ -36,11 +37,5 @@ module AdLocalize
|
|
|
36
37
|
def close
|
|
37
38
|
@logger.close
|
|
38
39
|
end
|
|
39
|
-
|
|
40
|
-
private
|
|
41
|
-
|
|
42
|
-
def log(level:, text:)
|
|
43
|
-
@logger.add(level, text)
|
|
44
|
-
end
|
|
45
40
|
end
|
|
46
41
|
end
|
data/lib/ad_localize/cli.rb
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module AdLocalize
|
|
2
3
|
class CLI
|
|
3
4
|
def self.start(args:)
|
|
4
5
|
options = OptionHandler.parse!(args)
|
|
5
6
|
export_request = Mappers::OptionsToExportRequest.new.map(options: options)
|
|
6
|
-
|
|
7
|
-
Interactors::
|
|
7
|
+
LOGGER.debug("Export request options : #{export_request}")
|
|
8
|
+
export_request.downloaded_csvs = Interactors::DownloadSpreadsheets.new.call(export_request: export_request) if export_request.has_sheets?
|
|
9
|
+
Interactors::ProcessExportRequest.new.call(export_request: export_request)
|
|
10
|
+
ensure
|
|
11
|
+
export_request&.downloaded_csvs&.each do |file|
|
|
12
|
+
file.close
|
|
13
|
+
file.unlink
|
|
14
|
+
end
|
|
8
15
|
end
|
|
9
16
|
end
|
|
10
|
-
end
|
|
17
|
+
end
|
|
@@ -1,79 +1,6 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module AdLocalize
|
|
2
3
|
module Entities
|
|
3
|
-
|
|
4
|
-
PLURAL_KEY_REGEXP = /\#\#\{([A-Za-z]+)\}/.freeze
|
|
5
|
-
ADAPTIVE_KEY_REGEXP = /\#\#\{(\d+)\}/.freeze
|
|
6
|
-
# see https://developer.apple.com/documentation/bundleresources/information_property_list
|
|
7
|
-
INFO_PLIST_KEY_REGEXP = /(NS.+UsageDescription)|(CF.+Name)|NFCReaderUsageDescription/.freeze
|
|
8
|
-
|
|
9
|
-
def initialize(label:)
|
|
10
|
-
@label = label
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def plural_key
|
|
14
|
-
@plural_key ||= compute_plural_key
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def plural?
|
|
18
|
-
plural_key.present?
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def adaptive?
|
|
22
|
-
adaptive_key.present?
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def adaptive_key
|
|
26
|
-
@adaptive_key ||= compute_adaptive_key
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def info_plist?
|
|
30
|
-
@label.match(INFO_PLIST_KEY_REGEXP).present?
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def singular?
|
|
34
|
-
!(plural? || adaptive? || info_plist?)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def label
|
|
38
|
-
compute_label.strip
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def raw_label
|
|
42
|
-
@label
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def same_as?(key:)
|
|
46
|
-
raw_label == key.raw_label
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def ==(o)
|
|
50
|
-
o.class == self.class &&
|
|
51
|
-
o.raw_label == raw_label
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
private
|
|
55
|
-
|
|
56
|
-
def compute_label
|
|
57
|
-
if plural?
|
|
58
|
-
@label.gsub(PLURAL_KEY_REGEXP, '')
|
|
59
|
-
elsif adaptive?
|
|
60
|
-
@label.gsub(ADAPTIVE_KEY_REGEXP, '')
|
|
61
|
-
else
|
|
62
|
-
@label
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def compute_plural_key
|
|
67
|
-
match = @label.match(PLURAL_KEY_REGEXP)
|
|
68
|
-
return unless match
|
|
69
|
-
match.captures.first
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def compute_adaptive_key
|
|
73
|
-
match = @label.match(ADAPTIVE_KEY_REGEXP)
|
|
74
|
-
return unless match
|
|
75
|
-
match.captures.first
|
|
76
|
-
end
|
|
77
|
-
end
|
|
4
|
+
Key = Struct.new(:id, :label, :variant_name, :type, keyword_init: true)
|
|
78
5
|
end
|
|
79
|
-
end
|
|
6
|
+
end
|
|
@@ -1,60 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module AdLocalize
|
|
2
3
|
module Entities
|
|
3
4
|
class LocaleWording
|
|
4
|
-
attr_reader
|
|
5
|
+
attr_reader :locale, :is_default, :singulars, :plurals, :adaptives, :info_plists
|
|
5
6
|
|
|
6
|
-
def initialize(locale:,
|
|
7
|
+
def initialize(locale:, is_default:)
|
|
7
8
|
@locale = locale
|
|
8
|
-
@
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@singulars ||= @translations.select { |translation| translation.key.singular? }
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def adaptives
|
|
40
|
-
@adaptives ||= @translations.select { |translation| translation.key.adaptive? }.group_by { |translation| translation.key.label }
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def add_translation(translation:)
|
|
44
|
-
@translations.push(translation)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def keys
|
|
48
|
-
@translations.map(&:key)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def has_key?(key:)
|
|
52
|
-
translation_for(key: key).present?
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def translation_for(key:)
|
|
56
|
-
@translations.find { |translation| translation.key.same_as?(key: key) }
|
|
9
|
+
@is_default = is_default
|
|
10
|
+
@singulars = {} # label => SimpleWording
|
|
11
|
+
@info_plists = {} # label => SimpleWording
|
|
12
|
+
@plurals = Hash.new { |hash, key| hash[key] = {} } # label: String => { variant_name: String => SimpleWording }
|
|
13
|
+
@adaptives = Hash.new { |hash, key| hash[key] = {} } # label: String => { variant_name: String => SimpleWording }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add_wording(key:, value:, comment:)
|
|
17
|
+
wording = SimpleWording.new(key: key, value: value, comment: comment)
|
|
18
|
+
|
|
19
|
+
case key.type
|
|
20
|
+
when WordingType::PLURAL
|
|
21
|
+
@plurals[key.label][key.variant_name] = wording
|
|
22
|
+
when WordingType::ADAPTIVE
|
|
23
|
+
@adaptives[key.label][key.variant_name] = wording
|
|
24
|
+
when WordingType::INFO_PLIST
|
|
25
|
+
@info_plists[key.label] = wording
|
|
26
|
+
else
|
|
27
|
+
@singulars[key.label] = wording
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def to_s
|
|
32
|
+
"Locale\nis default: #{is_default}\n==========\n" +
|
|
33
|
+
"Singulars\n#{singulars}\n==========\n" +
|
|
34
|
+
"InfoPlists\n#{info_plists}\n==========\n" +
|
|
35
|
+
"Plurals\n#{plurals}\n==========\n" +
|
|
36
|
+
"Adaptives\n#{adaptives}\n==========\n"
|
|
57
37
|
end
|
|
58
38
|
end
|
|
59
39
|
end
|
|
60
|
-
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Entities
|
|
4
|
+
module Platform
|
|
5
|
+
IOS = 'ios'
|
|
6
|
+
ANDROID = 'android'
|
|
7
|
+
YML = 'yml'
|
|
8
|
+
JSON = 'json'
|
|
9
|
+
PROPERTIES = 'properties'
|
|
10
|
+
SUPPORTED_PLATFORMS = [IOS, ANDROID, YML, JSON, PROPERTIES]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class BaseGenerateFiles
|
|
5
|
+
def initialize(serializer:)
|
|
6
|
+
@serializer = serializer
|
|
7
|
+
raise MissingArgument.new('Missing Serializer') unless serializer
|
|
8
|
+
|
|
9
|
+
@file_system_repository = Repositories::FileSystemRepository.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def call(wording:, export_request:)
|
|
13
|
+
wording.each do |locale, locale_wording|
|
|
14
|
+
next unless has_wording?(locale_wording: locale_wording)
|
|
15
|
+
|
|
16
|
+
path = output_path(locale_wording: locale_wording, export_request: export_request)
|
|
17
|
+
filename = path.basename
|
|
18
|
+
LOGGER.debug("[#{locale}] Generating #{filename}")
|
|
19
|
+
@file_system_repository.create_directory(path: path.dirname)
|
|
20
|
+
content = @serializer.render(locale_wording: locale_wording)
|
|
21
|
+
@file_system_repository.write(content: content, path: path)
|
|
22
|
+
LOGGER.debug("[#{locale}] #{filename} done !")
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
protected
|
|
27
|
+
|
|
28
|
+
def has_wording?(locale_wording:)
|
|
29
|
+
raise 'override me!'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def output_path(locale_wording:, export_request:)
|
|
33
|
+
raise 'override me!'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class DownloadSpreadsheets
|
|
5
|
+
def initialize
|
|
6
|
+
@drive_repository = Repositories::DriveRepository.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call(export_request:)
|
|
10
|
+
LOGGER.debug("Downloading spreadsheets")
|
|
11
|
+
if export_request.export_all
|
|
12
|
+
@drive_repository.download_all_sheets(spreadsheet_id: export_request.spreadsheet_id)
|
|
13
|
+
else
|
|
14
|
+
@drive_repository.download_sheets_by_id(spreadsheet_id: export_request.spreadsheet_id,
|
|
15
|
+
sheet_ids: export_request.sheet_ids)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -1,34 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module AdLocalize
|
|
2
3
|
module Interactors
|
|
3
4
|
class ExportWording
|
|
4
|
-
def initialize
|
|
5
|
-
@export_platform_factory = Platforms::ExportPlatformFactory.new
|
|
6
|
-
end
|
|
7
|
-
|
|
8
5
|
def call(export_request:, wording:)
|
|
9
|
-
LOGGER.debug("Starting export wording")
|
|
10
6
|
export_request.platforms.each do |platform|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
configure_output_directory(platform: platform, export_request: export_request)
|
|
8
|
+
LOGGER.debug("[#{platform}] Start exporting in #{export_request.output_dir}")
|
|
9
|
+
export_platform(wording: wording, platform: platform, export_request: export_request)
|
|
10
|
+
LOGGER.debug("[#{platform}] done !")
|
|
14
11
|
end
|
|
15
12
|
end
|
|
16
13
|
|
|
17
14
|
private
|
|
18
15
|
|
|
19
|
-
def
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
def configure_output_directory(platform:, export_request:)
|
|
17
|
+
if export_request.many_platforms?
|
|
18
|
+
export_request.output_dir = export_request.output_path.join(platform)
|
|
19
|
+
else
|
|
20
|
+
export_request.output_dir = export_request.output_path
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
def export_platform(wording:, platform:, export_request:)
|
|
25
|
+
case platform
|
|
26
|
+
when Entities::Platform::IOS
|
|
27
|
+
GenerateIOSFiles.new.call(wording: wording, export_request: export_request)
|
|
28
|
+
when Entities::Platform::ANDROID
|
|
29
|
+
GenerateStrings.new.call(wording: wording, export_request: export_request)
|
|
30
|
+
when Entities::Platform::YML
|
|
31
|
+
GenerateYAML.new.call(wording: wording, export_request: export_request)
|
|
32
|
+
when Entities::Platform::JSON
|
|
33
|
+
GenerateJSON.new.call(wording: wording, export_request: export_request)
|
|
34
|
+
when Entities::Platform::PROPERTIES
|
|
35
|
+
GenerateProperties.new.call(wording: wording, export_request: export_request)
|
|
36
|
+
end
|
|
31
37
|
end
|
|
32
38
|
end
|
|
33
39
|
end
|
|
34
|
-
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class GenerateInfoPlist < BaseGenerateFiles
|
|
5
|
+
INFO_PLIST_FILENAME = "InfoPlist.strings".freeze
|
|
6
|
+
LOCALE_DIRECTORY_CONVENTION = "%{locale}.lproj".freeze
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
super(serializer: Serializers::InfoPlistSerializer.new)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def has_wording?(locale_wording:)
|
|
15
|
+
locale_wording.info_plists.any?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def output_path(locale_wording:, export_request:)
|
|
19
|
+
locale_directory_name = LOCALE_DIRECTORY_CONVENTION % { locale: locale_wording.locale }
|
|
20
|
+
export_request.output_dir.join(locale_directory_name, INFO_PLIST_FILENAME)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class GenerateIOSFiles
|
|
5
|
+
def call(wording:, export_request:)
|
|
6
|
+
GenerateInfoPlist.new.call(wording: wording, export_request: export_request)
|
|
7
|
+
GenerateLocalizableStrings.new.call(wording: wording, export_request: export_request)
|
|
8
|
+
GenerateLocalizableStringsDict.new.call(wording: wording, export_request: export_request)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class GenerateJSON < BaseGenerateFiles
|
|
5
|
+
def initialize
|
|
6
|
+
super(serializer: Serializers::JSONSerializer.new)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def has_wording?(locale_wording:)
|
|
12
|
+
locale_wording.singulars.any? || locale_wording.plurals.any?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def output_path(locale_wording:, export_request:)
|
|
16
|
+
export_request.output_dir.join("#{locale_wording.locale}.json")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class GenerateLocalizableStrings < BaseGenerateFiles
|
|
5
|
+
LOCALIZABLE_STRINGS_FILENAME = "Localizable.strings".freeze
|
|
6
|
+
LOCALE_DIRECTORY_CONVENTION = "%{locale}.lproj".freeze
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
super(serializer: Serializers::LocalizableStringsSerializer.new)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def has_wording?(locale_wording:)
|
|
15
|
+
locale_wording.singulars.any?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def output_path(locale_wording:, export_request:)
|
|
19
|
+
locale_directory_name = LOCALE_DIRECTORY_CONVENTION % { locale: locale_wording.locale }
|
|
20
|
+
export_request.output_dir.join(locale_directory_name, LOCALIZABLE_STRINGS_FILENAME)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class GenerateLocalizableStringsDict < BaseGenerateFiles
|
|
5
|
+
LOCALIZABLE_STRINGSDICT_FILENAME = "Localizable.stringsdict".freeze
|
|
6
|
+
LOCALE_DIRECTORY_CONVENTION = "%{locale}.lproj".freeze
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
super(serializer: Serializers::LocalizableStringsdictSerializer.new)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def has_wording?(locale_wording:)
|
|
15
|
+
locale_wording.plurals.any? || locale_wording.adaptives.any?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def output_path(locale_wording:, export_request:)
|
|
19
|
+
locale_directory_name = LOCALE_DIRECTORY_CONVENTION % { locale: locale_wording.locale }
|
|
20
|
+
export_request.output_dir.join(locale_directory_name, LOCALIZABLE_STRINGSDICT_FILENAME)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class GenerateProperties < BaseGenerateFiles
|
|
5
|
+
def initialize
|
|
6
|
+
super(serializer: Serializers::PropertiesSerializer.new)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def has_wording?(locale_wording:)
|
|
12
|
+
locale_wording.singulars.any?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def output_path(locale_wording:, export_request:)
|
|
16
|
+
export_request.output_dir.join("#{locale_wording.locale}.properties")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class GenerateStrings < BaseGenerateFiles
|
|
5
|
+
STRINGS_FILENAME = 'strings.xml'.freeze
|
|
6
|
+
LOCALE_DIRECTORY_CONVENTION = "values".freeze
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
super(serializer: Serializers::StringsSerializer.new)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def has_wording?(locale_wording:)
|
|
15
|
+
locale_wording.singulars.any? || locale_wording.plurals.any?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def output_path(locale_wording:, export_request:)
|
|
19
|
+
locale_dir = LOCALE_DIRECTORY_CONVENTION
|
|
20
|
+
locale_dir += "-#{locale_wording.locale}" if !locale_wording.is_default
|
|
21
|
+
export_request.output_dir.join(locale_dir, STRINGS_FILENAME)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module AdLocalize
|
|
3
|
+
module Interactors
|
|
4
|
+
class GenerateYAML < BaseGenerateFiles
|
|
5
|
+
def initialize
|
|
6
|
+
super(serializer: Serializers::YAMLSerializer.new)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def has_wording?(locale_wording:)
|
|
12
|
+
locale_wording.singulars.any? || locale_wording.plurals.any?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def output_path(locale_wording:, export_request:)
|
|
16
|
+
export_request.output_dir.join("#{locale_wording.locale}.yml")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|