ad_localize 5.0.0 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|