ad_localize 3.6.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -1
  3. data/Gemfile.lock +34 -11
  4. data/README.md +148 -145
  5. data/ad_localize.gemspec +2 -0
  6. data/bin/console +1 -0
  7. data/exe/ad_localize +1 -1
  8. data/lib/ad_localize.rb +52 -11
  9. data/lib/ad_localize/ad_logger.rb +22 -9
  10. data/lib/ad_localize/cli.rb +10 -0
  11. data/lib/ad_localize/constant.rb +2 -21
  12. data/lib/ad_localize/entities/key.rb +74 -0
  13. data/lib/ad_localize/entities/locale_wording.rb +60 -0
  14. data/lib/ad_localize/entities/translation.rb +20 -0
  15. data/lib/ad_localize/entities/wording.rb +24 -0
  16. data/lib/ad_localize/interactors/execute_export_request.rb +43 -0
  17. data/lib/ad_localize/interactors/export_csv_files.rb +17 -0
  18. data/lib/ad_localize/interactors/export_g_spreadsheet.rb +55 -0
  19. data/lib/ad_localize/interactors/export_wording.rb +27 -0
  20. data/lib/ad_localize/interactors/merge_wordings.rb +43 -0
  21. data/lib/ad_localize/interactors/platforms/export_android_locale_wording.rb +39 -0
  22. data/lib/ad_localize/interactors/platforms/export_ios_locale_wording.rb +62 -0
  23. data/lib/ad_localize/interactors/platforms/export_json_locale_wording.rb +23 -0
  24. data/lib/ad_localize/interactors/platforms/export_platform_factory.rb +44 -0
  25. data/lib/ad_localize/interactors/platforms/export_properties_locale_wording.rb +29 -0
  26. data/lib/ad_localize/interactors/platforms/export_yaml_locale_wording.rb +23 -0
  27. data/lib/ad_localize/mappers/android_translation_mapper.rb +18 -0
  28. data/lib/ad_localize/mappers/csv_path_to_wording.rb +76 -0
  29. data/lib/ad_localize/mappers/ios_translation_mapper.rb +12 -0
  30. data/lib/ad_localize/mappers/locale_wording_to_hash.rb +25 -0
  31. data/lib/ad_localize/mappers/options_to_export_request.rb +28 -0
  32. data/lib/ad_localize/mappers/translation_group_mapper.rb +14 -0
  33. data/lib/ad_localize/mappers/translation_mapper.rb +30 -0
  34. data/lib/ad_localize/mappers/value_range_to_wording.rb +69 -0
  35. data/lib/ad_localize/option_handler.rb +30 -57
  36. data/lib/ad_localize/repositories/file_system_repository.rb +13 -0
  37. data/lib/ad_localize/repositories/g_sheets_repository.rb +44 -0
  38. data/lib/ad_localize/requests/export_request.rb +77 -0
  39. data/lib/ad_localize/requests/g_spreadsheet_options.rb +47 -0
  40. data/lib/ad_localize/requests/merge_policy.rb +28 -0
  41. data/lib/ad_localize/serializers/info_plist_serializer.rb +27 -0
  42. data/lib/ad_localize/serializers/json_serializer.rb +13 -0
  43. data/lib/ad_localize/serializers/localizable_strings_serializer.rb +27 -0
  44. data/lib/ad_localize/serializers/localizable_stringsdict_serializer.rb +35 -0
  45. data/lib/ad_localize/serializers/properties_serializer.rb +25 -0
  46. data/lib/ad_localize/serializers/strings_serializer.rb +33 -0
  47. data/lib/ad_localize/serializers/with_template.rb +19 -0
  48. data/lib/ad_localize/serializers/yaml_serializer.rb +13 -0
  49. data/lib/ad_localize/templates/android/strings.xml.erb +19 -0
  50. data/lib/ad_localize/templates/ios/InfoPlist.strings.erb +3 -0
  51. data/lib/ad_localize/templates/ios/Localizable.strings.erb +3 -0
  52. data/lib/ad_localize/templates/ios/Localizable.stringsdict.erb +41 -0
  53. data/lib/ad_localize/templates/properties/template.properties.erb +3 -0
  54. data/lib/ad_localize/version.rb +1 -1
  55. data/lib/ad_localize/view_models/translation_group_view_model.rb +15 -0
  56. data/lib/ad_localize/view_models/translation_view_model.rb +19 -0
  57. metadata +74 -11
  58. data/Makefile +0 -11
  59. data/lib/ad_localize/csv_file_manager.rb +0 -64
  60. data/lib/ad_localize/csv_parser.rb +0 -165
  61. data/lib/ad_localize/platform/android_formatter.rb +0 -70
  62. data/lib/ad_localize/platform/ios_formatter.rb +0 -143
  63. data/lib/ad_localize/platform/json_formatter.rb +0 -17
  64. data/lib/ad_localize/platform/platform_formatter.rb +0 -109
  65. data/lib/ad_localize/platform/yml_formatter.rb +0 -19
  66. data/lib/ad_localize/runner.rb +0 -55
@@ -0,0 +1,13 @@
1
+ module AdLocalize
2
+ module Serializers
3
+ class JSONSerializer
4
+ def initialize
5
+ @locale_wording_to_hash = Mappers::LocaleWordingToHash.new
6
+ end
7
+
8
+ def render(locale_wording:)
9
+ @locale_wording_to_hash.map(locale_wording: locale_wording).to_json
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ module AdLocalize
2
+ module Serializers
3
+ class LocalizableStringsSerializer
4
+ include WithTemplate
5
+
6
+ LOCALIZABLE_STRINGS_FILENAME = "Localizable.strings".freeze
7
+
8
+ def initialize
9
+ @translation_mapper = Mappers::IOSTranslationMapper.new
10
+ end
11
+
12
+ private
13
+
14
+ def template_path
15
+ TEMPLATES_DIRECTORY + "/ios/#{LOCALIZABLE_STRINGS_FILENAME}.erb"
16
+ end
17
+
18
+ def hash_binding(locale_wording:)
19
+ { translations: map_translations(translations: locale_wording.singulars) }
20
+ end
21
+
22
+ def map_translations(translations:)
23
+ translations.map { |translation| @translation_mapper.map(translation: translation) }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,35 @@
1
+ module AdLocalize
2
+ module Serializers
3
+ class LocalizableStringsdictSerializer
4
+ include WithTemplate
5
+
6
+ LOCALIZABLE_STRINGSDICT_FILENAME = "Localizable.stringsdict".freeze
7
+
8
+ def initialize
9
+ @translation_mapper = Mappers::IOSTranslationMapper.new
10
+ @translation_group_mapper = Mappers::TranslationGroupMapper.new(translation_mapper: @translation_mapper)
11
+ end
12
+
13
+ private
14
+
15
+ def template_path
16
+ TEMPLATES_DIRECTORY + "/ios/#{LOCALIZABLE_STRINGSDICT_FILENAME}.erb"
17
+ end
18
+
19
+ def hash_binding(locale_wording:)
20
+ {
21
+ plurals: map_plurals(plurals: locale_wording.plurals),
22
+ adaptives: map_adaptives(adaptives: locale_wording.adaptives)
23
+ }
24
+ end
25
+
26
+ def map_plurals(plurals:)
27
+ plurals.map { |label, translations| @translation_group_mapper.map(label: label, translations: translations) }
28
+ end
29
+
30
+ def map_adaptives(adaptives:)
31
+ adaptives.map { |label, translations| @translation_group_mapper.map(label: label, translations: translations) }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ module AdLocalize
2
+ module Serializers
3
+ class PropertiesSerializer
4
+ include WithTemplate
5
+
6
+ def initialize
7
+ @translation_mapper = Mappers::TranslationMapper.new
8
+ end
9
+
10
+ private
11
+
12
+ def template_path
13
+ TEMPLATES_DIRECTORY + "/properties/template.properties.erb"
14
+ end
15
+
16
+ def hash_binding(locale_wording:)
17
+ { translations: map_translations(translations: locale_wording.singulars) }
18
+ end
19
+
20
+ def map_translations(translations:)
21
+ translations.map { |translation| @translation_mapper.map(translation: translation) }
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ module AdLocalize
2
+ module Serializers
3
+ class StringsSerializer
4
+ include WithTemplate
5
+
6
+ def initialize
7
+ @translation_mapper = Mappers::AndroidTranslationMapper.new
8
+ @translation_group_mapper = Mappers::TranslationGroupMapper.new(translation_mapper: @translation_mapper)
9
+ end
10
+
11
+ private
12
+
13
+ def template_path
14
+ TEMPLATES_DIRECTORY + "/android/strings.xml.erb"
15
+ end
16
+
17
+ def hash_binding(locale_wording:)
18
+ {
19
+ singulars: map_singulars(translations: locale_wording.singulars),
20
+ plurals: map_plurals(plurals: locale_wording.plurals)
21
+ }
22
+ end
23
+
24
+ def map_singulars(translations:)
25
+ translations.map { |translation| @translation_mapper.map(translation: translation) }
26
+ end
27
+
28
+ def map_plurals(plurals:)
29
+ plurals.map { |label, translations| @translation_group_mapper.map(label: label, translations: translations) }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ module AdLocalize
2
+ module Serializers
3
+ module WithTemplate
4
+ TEMPLATES_DIRECTORY = __dir__ + "/../templates"
5
+
6
+ def render(locale_wording:)
7
+ hash_binding = hash_binding(locale_wording: locale_wording)
8
+ return unless hash_binding
9
+ render_template(template_path: template_path, hash_binding: hash_binding)
10
+ end
11
+
12
+ def render_template(template_path:, hash_binding:)
13
+ template = File.read(template_path)
14
+ renderer = ERB.new(template, trim_mode: '-')
15
+ renderer.result_with_hash(hash_binding)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module AdLocalize
2
+ module Serializers
3
+ class YAMLSerializer
4
+ def initialize
5
+ @locale_wording_to_hash = Mappers::LocaleWordingToHash.new
6
+ end
7
+
8
+ def render(locale_wording:)
9
+ @locale_wording_to_hash.map(locale_wording: locale_wording).to_yaml
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <resources>
3
+ <%- singulars.each do |single_translation| -%>
4
+ <%- if single_translation.comment -%>
5
+ <!-- <%= single_translation.comment %> -->
6
+ <%- end -%>
7
+ <string name="<%= single_translation.label %>"><%= single_translation.value %></string>
8
+ <%- end -%>
9
+ <%- plurals.each do |translation_group| -%>
10
+ <plurals name="<%= translation_group.label %>">
11
+ <%- translation_group.translation_view_models.each do |translation_view_model| -%>
12
+ <%- if translation_view_model.comment -%>
13
+ <!-- <%= translation_view_model.comment %> -->
14
+ <%- end -%>
15
+ <item quantity="<%= translation_view_model.key %>"><%= translation_view_model.value %></item>
16
+ <%- end -%>
17
+ </plurals>
18
+ <%- end -%>
19
+ </resources>
@@ -0,0 +1,3 @@
1
+ <% translations.each do |single_translation| -%>
2
+ <%= single_translation.label %> = "<%= single_translation.value %>";<% if single_translation.comment %> // <%= single_translation.comment %> <% end %>
3
+ <% end -%>
@@ -0,0 +1,3 @@
1
+ <%- translations.each do |single_translation| -%>
2
+ "<%= single_translation.label %>" = "<%= single_translation.value %>";<% if single_translation.comment %> // <%= single_translation.comment %><% end %>
3
+ <%- end -%>
@@ -0,0 +1,41 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <plist>
3
+ <dict>
4
+ <%- plurals.each do |translation_group| -%>
5
+ <key><%= translation_group.label %></key>
6
+ <dict>
7
+ <key>NSStringLocalizedFormatKey</key>
8
+ <string>%#@key@</string>
9
+ <key>key</key>
10
+ <dict>
11
+ <key>NSStringFormatSpecTypeKey</key>
12
+ <string>NSStringPluralRuleType</string>
13
+ <key>NSStringFormatValueTypeKey</key>
14
+ <string>d</string>
15
+ <%- translation_group.translation_view_models.each do |translation_view_model| -%>
16
+ <%- if translation_view_model.comment -%>
17
+ <!-- <%= translation_view_model.comment %> -->
18
+ <%- end -%>
19
+ <key><%= translation_view_model.key -%></key>
20
+ <string><%= translation_view_model.value -%></string>
21
+ <%- end -%>
22
+ </dict>
23
+ </dict>
24
+ <%- end -%>
25
+ <%- adaptives.each do |translation_group| -%>
26
+ <key><%= translation_group.label %></key>
27
+ <dict>
28
+ <key>NSStringVariableWidthRuleType</key>
29
+ <dict>
30
+ <%- translation_group.translation_view_models.each do |translation_view_model| -%>
31
+ <%- if translation_view_model.comment -%>
32
+ <!-- <%= translation_view_model.comment %> -->
33
+ <%- end -%>
34
+ <key><%= translation_view_model.key %></key>
35
+ <string><%= translation_view_model.value %></string>
36
+ <%- end -%>
37
+ </dict>
38
+ </dict>
39
+ <%- end -%>
40
+ </dict>
41
+ </plist>
@@ -0,0 +1,3 @@
1
+ <% translations.each do |single_translation| -%>
2
+ <%= single_translation.label %>=<%= single_translation.value %>
3
+ <% end -%>
@@ -1,3 +1,3 @@
1
1
  module AdLocalize
2
- VERSION = "3.6.0"
2
+ VERSION = "4.0.0"
3
3
  end
@@ -0,0 +1,15 @@
1
+ module AdLocalize
2
+ module ViewModels
3
+ class TranslationGroupViewModel
4
+ attr_reader(
5
+ :label,
6
+ :translation_view_models
7
+ )
8
+
9
+ def initialize(label:, translation_view_models:)
10
+ @label = label
11
+ @translation_view_models = translation_view_models
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ module AdLocalize
2
+ module ViewModels
3
+ class TranslationViewModel
4
+ attr_reader(
5
+ :label,
6
+ :key,
7
+ :value,
8
+ :comment
9
+ )
10
+
11
+ def initialize(label:, key:, value:, comment:)
12
+ @label = label
13
+ @key = key
14
+ @value = value
15
+ @comment = comment
16
+ end
17
+ end
18
+ end
19
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ad_localize
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edouard Siegel
@@ -160,6 +160,20 @@ dependencies:
160
160
  - - "~>"
161
161
  - !ruby/object:Gem::Version
162
162
  version: '0.8'
163
+ - !ruby/object:Gem::Dependency
164
+ name: google-api-client
165
+ requirement: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: '0.34'
170
+ type: :runtime
171
+ prerelease: false
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - "~>"
175
+ - !ruby/object:Gem::Version
176
+ version: '0.34'
163
177
  - !ruby/object:Gem::Dependency
164
178
  name: googleauth
165
179
  requirement: !ruby/object:Gem::Requirement
@@ -174,6 +188,20 @@ dependencies:
174
188
  - - "~>"
175
189
  - !ruby/object:Gem::Version
176
190
  version: '0.12'
191
+ - !ruby/object:Gem::Dependency
192
+ name: mime-types
193
+ requirement: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - "~>"
196
+ - !ruby/object:Gem::Version
197
+ version: '3.3'
198
+ type: :runtime
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - "~>"
203
+ - !ruby/object:Gem::Version
204
+ version: '3.3'
177
205
  description: |-
178
206
  AdLocalize produces localization files from platform agnostic wording.
179
207
  Supported wording format : CSV. Supported export format: iOS, Android, JSON and YAML
@@ -194,7 +222,6 @@ files:
194
222
  - Gemfile
195
223
  - Gemfile.lock
196
224
  - LICENSE.txt
197
- - Makefile
198
225
  - README.md
199
226
  - Rakefile
200
227
  - ad_localize.gemspec
@@ -204,17 +231,53 @@ files:
204
231
  - exe/ad_localize
205
232
  - lib/ad_localize.rb
206
233
  - lib/ad_localize/ad_logger.rb
234
+ - lib/ad_localize/cli.rb
207
235
  - lib/ad_localize/constant.rb
208
- - lib/ad_localize/csv_file_manager.rb
209
- - lib/ad_localize/csv_parser.rb
236
+ - lib/ad_localize/entities/key.rb
237
+ - lib/ad_localize/entities/locale_wording.rb
238
+ - lib/ad_localize/entities/translation.rb
239
+ - lib/ad_localize/entities/wording.rb
240
+ - lib/ad_localize/interactors/execute_export_request.rb
241
+ - lib/ad_localize/interactors/export_csv_files.rb
242
+ - lib/ad_localize/interactors/export_g_spreadsheet.rb
243
+ - lib/ad_localize/interactors/export_wording.rb
244
+ - lib/ad_localize/interactors/merge_wordings.rb
245
+ - lib/ad_localize/interactors/platforms/export_android_locale_wording.rb
246
+ - lib/ad_localize/interactors/platforms/export_ios_locale_wording.rb
247
+ - lib/ad_localize/interactors/platforms/export_json_locale_wording.rb
248
+ - lib/ad_localize/interactors/platforms/export_platform_factory.rb
249
+ - lib/ad_localize/interactors/platforms/export_properties_locale_wording.rb
250
+ - lib/ad_localize/interactors/platforms/export_yaml_locale_wording.rb
251
+ - lib/ad_localize/mappers/android_translation_mapper.rb
252
+ - lib/ad_localize/mappers/csv_path_to_wording.rb
253
+ - lib/ad_localize/mappers/ios_translation_mapper.rb
254
+ - lib/ad_localize/mappers/locale_wording_to_hash.rb
255
+ - lib/ad_localize/mappers/options_to_export_request.rb
256
+ - lib/ad_localize/mappers/translation_group_mapper.rb
257
+ - lib/ad_localize/mappers/translation_mapper.rb
258
+ - lib/ad_localize/mappers/value_range_to_wording.rb
210
259
  - lib/ad_localize/option_handler.rb
211
- - lib/ad_localize/platform/android_formatter.rb
212
- - lib/ad_localize/platform/ios_formatter.rb
213
- - lib/ad_localize/platform/json_formatter.rb
214
- - lib/ad_localize/platform/platform_formatter.rb
215
- - lib/ad_localize/platform/yml_formatter.rb
216
- - lib/ad_localize/runner.rb
260
+ - lib/ad_localize/repositories/file_system_repository.rb
261
+ - lib/ad_localize/repositories/g_sheets_repository.rb
262
+ - lib/ad_localize/requests/export_request.rb
263
+ - lib/ad_localize/requests/g_spreadsheet_options.rb
264
+ - lib/ad_localize/requests/merge_policy.rb
265
+ - lib/ad_localize/serializers/info_plist_serializer.rb
266
+ - lib/ad_localize/serializers/json_serializer.rb
267
+ - lib/ad_localize/serializers/localizable_strings_serializer.rb
268
+ - lib/ad_localize/serializers/localizable_stringsdict_serializer.rb
269
+ - lib/ad_localize/serializers/properties_serializer.rb
270
+ - lib/ad_localize/serializers/strings_serializer.rb
271
+ - lib/ad_localize/serializers/with_template.rb
272
+ - lib/ad_localize/serializers/yaml_serializer.rb
273
+ - lib/ad_localize/templates/android/strings.xml.erb
274
+ - lib/ad_localize/templates/ios/InfoPlist.strings.erb
275
+ - lib/ad_localize/templates/ios/Localizable.strings.erb
276
+ - lib/ad_localize/templates/ios/Localizable.stringsdict.erb
277
+ - lib/ad_localize/templates/properties/template.properties.erb
217
278
  - lib/ad_localize/version.rb
279
+ - lib/ad_localize/view_models/translation_group_view_model.rb
280
+ - lib/ad_localize/view_models/translation_view_model.rb
218
281
  homepage: https://github.com/applidium/ad_localize
219
282
  licenses:
220
283
  - MIT
@@ -234,7 +297,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
297
  - !ruby/object:Gem::Version
235
298
  version: '0'
236
299
  requirements: []
237
- rubygems_version: 3.0.3
300
+ rubygems_version: 3.1.2
238
301
  signing_key:
239
302
  specification_version: 4
240
303
  summary: AdLocalize helps with mobile and web applications wording
data/Makefile DELETED
@@ -1,11 +0,0 @@
1
- build:
2
- gem build ad_localize.gemspec
3
-
4
- install: clean build
5
- gem install ad_localize-*.gem
6
-
7
- clean:
8
- rm -f ad_localize-*.gem
9
-
10
- tests:
11
- bundle exec rake test
@@ -1,64 +0,0 @@
1
- module AdLocalize
2
- class CsvFileManager
3
- CSV_CONTENT_TYPES = %w(text/csv text/plain)
4
-
5
- class << self
6
- def csv?(file)
7
- !file.nil? && CSV_CONTENT_TYPES.include?(`file --brief --mime-type '#{file}'`.strip)
8
- end
9
-
10
- # Returns the downloaded file name (it is located in the current directory)
11
- def download_from_drive(key, sheet, use_service_account=false)
12
- LOGGER.log(:info, :green, "Downloading file from google drive...")
13
- download_string_path = "./#{key}.csv"
14
- begin
15
- File.open(download_string_path, "wb") do |saved_file|
16
- download_url = drive_download_url(key, sheet)
17
- headers = {}
18
- if use_service_account
19
- LOGGER.log(:debug, :green, "Using a service account...")
20
- token = service_account_access_token()
21
- headers["Authorization"] = "#{token["token_type"]} #{token["access_token"]}"
22
- end
23
- # the following "open" is provided by open-uri
24
- open(download_url, "rb", headers) do |read_file|
25
- saved_file.write(read_file.read)
26
- end
27
- File.basename saved_file
28
- end
29
- rescue => e
30
- delete_drive_file(download_string_path)
31
- LOGGER.log(:error, :red, e.message)
32
- exit
33
- end
34
- end
35
-
36
- def select_csvs(files)
37
- files.select do |file|
38
- LOGGER.log(:error, :red, "#{file} is not a csv. It will be ignored") unless self.csv?(file)
39
- self.csv?(file)
40
- end
41
- end
42
-
43
- def delete_drive_file(file)
44
- Pathname.new(file).delete unless file.nil?
45
- end
46
-
47
- private
48
- def drive_download_url(key, sheet)
49
- query_id = sheet ? "gid=#{sheet}" : "id=#{key}"
50
- "https://docs.google.com/spreadsheets/d/#{key}/export?format=csv&#{query_id}"
51
- end
52
- private
53
- def service_account_access_token()
54
- scope = "https://www.googleapis.com/auth/drive.readonly"
55
- json_key_io = StringIO.new ENV["GCLOUD_CLIENT_SECRET"]
56
- authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
57
- json_key_io: json_key_io,
58
- scope: scope
59
- )
60
- authorizer.fetch_access_token!
61
- end
62
- end
63
- end
64
- end