bisu 1.7.0 → 1.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: bed28be32f24a03d0e812b3ad88980911bd4d13a
4
- data.tar.gz: 13f1165c2bf416965c75e24553f5f2672a91f1ec
2
+ SHA256:
3
+ metadata.gz: 14ce8b0b059747d79f5a63fc910129774a634d015bf02563ac888dc80c735ed0
4
+ data.tar.gz: 5158d8f04815351d0850c52d948a2dcebb5bb267a8154e716c31d01334fdd379
5
5
  SHA512:
6
- metadata.gz: 2e4ebf64ac0b36be4fa1f058347a7029a676986289a216120bc22f680c9bbcdca545660017f2da39a2a6a05f822c3cf110820ce579d8c20f149fb16257e3adc3
7
- data.tar.gz: fb3ce272578ae914ca44b785a456dec185c87435a0abba11c1debb328e2dec1909bdf2d2648b40dda9b0030d63283b28120d16ac22db95f3b2347c84e3da181f
6
+ metadata.gz: 2773ab4e5ea6f8b0f419650e2cd4f551dacfb43d438e892a98bb9ca317774a82c61122ad232de1cd1ede184178ac502352bc356702144b70f73b7912a23adcba
7
+ data.tar.gz: 1bae10ebc6fb6a915d2c2122b4ceff3341b426eb47543b9e1502242e47804aa9599ef3c22f4abd62b915177d83d4a0b6a3cf08f8e7fa4aaa5ae505a8c3538429
data/.rspec CHANGED
@@ -1,5 +1,4 @@
1
1
  --color
2
2
  --format documentation
3
3
  --profile
4
- --drb
5
4
  --require spec_helper
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.7.3
data/.travis.yml ADDED
@@ -0,0 +1 @@
1
+ language: ruby
data/CHANGELOG.md CHANGED
@@ -2,6 +2,36 @@
2
2
  All notable changes to this project will be documented in this file.
3
3
  `Bisu` adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
+ ## [1.9.0](https://github.com/hole19/bisu/releases/tag/v1.9.0)
6
+ Released on 2021/05/21
7
+
8
+ #### Added
9
+ - Adds a new option to surpress missing params when that's intentional: add "//ignore-params" to the end of the translation key
10
+
11
+ ## [1.8.0](https://github.com/hole19/bisu/releases/tag/v1.8.0)
12
+ Released on 2020/04/30
13
+
14
+ #### Added
15
+ - Adds a new option: allows a single translation to have a specific fallback language (example: "es-MX" fallback to "es")
16
+
17
+ ## [1.7.3](https://github.com/hole19/bisu/releases/tag/v1.7.3)
18
+ Released on 2020/03/09
19
+
20
+ #### Added
21
+ - Correctly handles percentage sign on iOS platform
22
+
23
+ ## [1.7.2](https://github.com/hole19/bisu/releases/tag/v1.7.2)
24
+ Released on 2020/03/09
25
+
26
+ #### Added
27
+ - Correctly handles percentage sign on Android platform
28
+
29
+ ## [1.7.1](https://github.com/hole19/bisu/releases/tag/v1.7.1)
30
+ Released on 2019/03/04
31
+
32
+ #### Added
33
+ - Applies the same new line behaviour in every platform
34
+
5
35
  ## [1.7.0](https://github.com/hole19/bisu/releases/tag/v1.7.0)
6
36
  Released on 2019/02/18
7
37
 
data/Gemfile CHANGED
@@ -1,10 +1,13 @@
1
1
  source 'https://rubygems.org'
2
- ruby '2.3.1'
2
+ ruby '2.7.3'
3
3
 
4
4
  gem 'safe_yaml', '~> 1.0'
5
5
  gem 'colorize', '~> 0.7'
6
6
  gem 'xml-simple', '~> 1.1'
7
7
 
8
- gem 'webmock', '~> 1.20'
9
- gem 'rspec'
10
- gem 'rspec-its'
8
+ group :test do
9
+ gem 'rake'
10
+ gem 'webmock', '~> 1.20'
11
+ gem 'rspec'
12
+ gem 'rspec-its'
13
+ end
data/Gemfile.lock CHANGED
@@ -1,40 +1,45 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- addressable (2.4.0)
4
+ addressable (2.7.0)
5
+ public_suffix (>= 2.0.2, < 5.0)
5
6
  colorize (0.8.1)
6
- crack (0.4.3)
7
- safe_yaml (~> 1.0.0)
8
- diff-lcs (1.2.5)
9
- hashdiff (0.3.0)
10
- rspec (3.5.0)
11
- rspec-core (~> 3.5.0)
12
- rspec-expectations (~> 3.5.0)
13
- rspec-mocks (~> 3.5.0)
14
- rspec-core (3.5.4)
15
- rspec-support (~> 3.5.0)
16
- rspec-expectations (3.5.0)
7
+ crack (0.4.5)
8
+ rexml
9
+ diff-lcs (1.4.4)
10
+ hashdiff (1.0.1)
11
+ public_suffix (4.0.6)
12
+ rake (13.0.3)
13
+ rexml (3.2.5)
14
+ rspec (3.10.0)
15
+ rspec-core (~> 3.10.0)
16
+ rspec-expectations (~> 3.10.0)
17
+ rspec-mocks (~> 3.10.0)
18
+ rspec-core (3.10.1)
19
+ rspec-support (~> 3.10.0)
20
+ rspec-expectations (3.10.1)
17
21
  diff-lcs (>= 1.2.0, < 2.0)
18
- rspec-support (~> 3.5.0)
19
- rspec-its (1.2.0)
22
+ rspec-support (~> 3.10.0)
23
+ rspec-its (1.3.0)
20
24
  rspec-core (>= 3.0.0)
21
25
  rspec-expectations (>= 3.0.0)
22
- rspec-mocks (3.5.0)
26
+ rspec-mocks (3.10.2)
23
27
  diff-lcs (>= 1.2.0, < 2.0)
24
- rspec-support (~> 3.5.0)
25
- rspec-support (3.5.0)
26
- safe_yaml (1.0.4)
28
+ rspec-support (~> 3.10.0)
29
+ rspec-support (3.10.2)
30
+ safe_yaml (1.0.5)
27
31
  webmock (1.24.6)
28
32
  addressable (>= 2.3.6)
29
33
  crack (>= 0.3.2)
30
34
  hashdiff
31
- xml-simple (1.1.5)
35
+ xml-simple (1.1.8)
32
36
 
33
37
  PLATFORMS
34
38
  ruby
35
39
 
36
40
  DEPENDENCIES
37
41
  colorize (~> 0.7)
42
+ rake
38
43
  rspec
39
44
  rspec-its
40
45
  safe_yaml (~> 1.0)
@@ -42,7 +47,7 @@ DEPENDENCIES
42
47
  xml-simple (~> 1.1)
43
48
 
44
49
  RUBY VERSION
45
- ruby 2.3.1p112
50
+ ruby 2.7.3p183
46
51
 
47
52
  BUNDLED WITH
48
- 1.14.3
53
+ 2.1.4
data/README.md CHANGED
@@ -1,9 +1,14 @@
1
1
  Bisu 홀
2
2
  ========
3
3
 
4
+ [![Status](https://travis-ci.org/hole19/bisu.svg?branch=master)](https://travis-ci.org/hole19/bisu?branch=master)
5
+ [![Gem](https://img.shields.io/gem/v/bisu.svg?style=flat)](http://rubygems.org/gems/bisu "View this project in Rubygems")
6
+
4
7
  Bisu manages your app iOS, Android and RoR localization files for you. No more copy+paste induced errors!
5
8
 
6
- ---
9
+ <p align="center">
10
+ <img src="https://raw.githubusercontent.com/hole19/bisu/master/README_explanation.png" width="500">
11
+ </p>
7
12
 
8
13
  Instalation
9
14
  -----
@@ -19,9 +24,9 @@ Usage
19
24
  1. Run: `bisu`
20
25
  1. That's it!*
21
26
 
22
- *given that someone already configured Bisu
27
+ \*_given that someone already configured Bisu_
23
28
 
24
- Configuration
29
+ Setup your configuration file
25
30
  -----
26
31
 
27
32
  1. Create in your project base folder a translatable.yml:
@@ -30,9 +35,7 @@ Configuration
30
35
  type: <iOS|Android|RoR>
31
36
 
32
37
  dictionary:
33
- type: google_sheet
34
- sheet_id: <GOOGLE-DRIVE-SHEET-ID>
35
- keys_column: <GOOGLE-DRIVE-KEY-COLUMN-TITLE>
38
+ (see options below)
36
39
 
37
40
  translate:
38
41
  - in: path/to/1st/file.translatable
@@ -42,22 +45,39 @@ Configuration
42
45
  out: path/to/2nd-%{locale}/strings.xml
43
46
 
44
47
  languages:
45
- - locale: en
46
- language: en
47
- - locale: en-US
48
- language: en
49
- - locale: pt
48
+ - locale: en
49
+ language: en # the language as it appears in the dictionary
50
+ - locale: en-US
51
+ language: en-us
52
+ fallback_language: en
53
+ - locale: pt
50
54
  language: pt
51
55
  ```
52
56
 
53
- Also available generic URL source:
57
+ ##### Dictionary from a URL source:
58
+
54
59
  ```
55
60
  dictionary:
56
61
  type: url
57
62
  url: <A-GET-URL>
58
63
  ```
59
64
 
60
- Also available [OneSky](https://www.oneskyapp.com) integration:
65
+ ##### Google Sheets Dictionary:
66
+
67
+ 1. First ["Publish to the web"](https://www.google.com/search?q=google+sheets+publish+to+web) your Google Sheet
68
+ 1. Share only the sheet that contains the translations
69
+ 1. First column should contain the translation keys
70
+ 1. First row should contain the locale for each language
71
+
72
+ ```
73
+ dictionary:
74
+ type: google_sheet
75
+ sheet_id: <GOOGLE-DRIVE-SHEET-ID>
76
+ keys_column: <GOOGLE-DRIVE-KEY-COLUMN-TITLE>
77
+ ```
78
+
79
+ ##### OneSky integration:
80
+
61
81
  ```
62
82
  dictionary:
63
83
  type: one_sky
@@ -67,7 +87,13 @@ Configuration
67
87
  file_name: <ONE-SKY-FILE-NAME>
68
88
  ```
69
89
 
70
- 1. Create a \*.translatable version for your **iOS** localization files:
90
+ Create translation templates
91
+ -----
92
+
93
+ Create a \*.translatable version for your platform specific localization files:
94
+
95
+ ##### iOS
96
+ *example: Localizable.strings.translatable*
71
97
 
72
98
  ```
73
99
  // $specialKComment1$
@@ -82,10 +108,11 @@ Configuration
82
108
  "klGeneral_Delete" = "$kDelete$";
83
109
  "klGeneral_Cancel" = "$kCancel$";
84
110
  "klGeneral_Close" = "$kClose$";
85
- "klRequestName" = "$kRequestName%{user_name: %@}$";
111
+ "klRequestName" = "$kRequestName{user_name: %@}$";
86
112
  ```
87
113
 
88
- 1. Create a \*.translatable version for your **Android** localization files:
114
+ ##### Android
115
+ *example: strings.xml.translatable*
89
116
 
90
117
  ```
91
118
  <?xml version="1.0" encoding="utf-8"?>
@@ -98,11 +125,12 @@ Configuration
98
125
  <string name="delete">$kDelete$</string>
99
126
  <string name="cancel">$kCancel$</string>
100
127
  <string name="close">$kClose$</string>
101
- <string name="request_name">$kRequestName%{user_name: %s}$</string>
128
+ <string name="request_name">$kRequestName{user_name: %s}$</string>
102
129
  </resources>
103
130
  ```
104
131
 
105
- 1. Create a \*.translatable version for your **RoR** localization files:
132
+ ##### Ruby on Rails
133
+ *example: config/locales/yml.translatable*
106
134
 
107
135
  ```
108
136
  $specialKLocale$:
Binary file
data/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
- require 'rake/testtask'
1
+ require "rake"
2
+ require "rspec/core/rake_task"
2
3
 
3
- Rake::TestTask.new do |t|
4
- t.libs << 'test'
4
+ RSpec::Core::RakeTask.new(:spec) do |t|
5
+ t.pattern = Dir.glob("spec/**/*_spec.rb")
6
+ t.rspec_opts = "--format documentation"
5
7
  end
6
8
 
7
- desc "Run tests"
8
- task :default => :test
9
+ task default: :spec
data/lib/bisu.rb CHANGED
@@ -23,13 +23,15 @@ module Bisu
23
23
  dictionary = dictionary_for(config: config.dictionary, options: options)
24
24
  localizer = Bisu::Localizer.new(dictionary, config.type)
25
25
 
26
- config.localize_files do |in_path, out_path, language, locale|
26
+ config.localize_files do |in_path, out_path, locale, language, fallback_language|
27
27
  unless dictionary.has_language?(language)
28
28
  Logger.error("Unknown language #{language}")
29
29
  return false
30
30
  end
31
31
 
32
- localize_file(localizer, locale, language, options[:default_language], in_path, out_path)
32
+ fallback_languages = ([fallback_language] + [options[:default_language]]).compact
33
+
34
+ localize_file(localizer, locale, language, fallback_languages, in_path, out_path)
33
35
  end
34
36
  end
35
37
 
@@ -131,14 +133,14 @@ module Bisu
131
133
  File.open(File.expand_path(file_name), method)
132
134
  end
133
135
 
134
- def localize_file(localizer, locale, language, default_language, in_path, out_path)
136
+ def localize_file(localizer, locale, language, fallback_languages, in_path, out_path)
135
137
  Logger.info("Translating #{in_path} to #{language} > #{out_path}...")
136
138
 
137
139
  return false unless in_file = open_file(in_path, "r", true)
138
140
  return false unless out_file = open_file(out_path, "w", false)
139
141
 
140
142
  in_file.each_line do |line|
141
- out_file.write(localizer.localize(line, language, locale, default_language))
143
+ out_file.write(localizer.localize(line, language, locale, fallback_languages))
142
144
  end
143
145
 
144
146
  out_file.flush
data/lib/bisu/config.rb CHANGED
@@ -27,7 +27,7 @@ module Bisu
27
27
  @hash[:translate].each do |t|
28
28
  @hash[:languages].each do |l|
29
29
  downcase_locale = l[:locale].downcase.gsub("-", "_").gsub(" ", "_")
30
- yield(t[:in], (t[:"out_#{downcase_locale}"] || t[:out]) % l, l[:language], l[:locale])
30
+ yield(t[:in], (t[:"out_#{downcase_locale}"] || t[:out]) % l, l[:locale], l[:language], l[:fallback_language])
31
31
  end
32
32
  end
33
33
  end
@@ -50,7 +50,8 @@ module Bisu
50
50
  languages: { type: Array, elements: {
51
51
  type: Hash, elements: {
52
52
  locale: { type: String },
53
- language: { type: String }
53
+ language: { type: String },
54
+ fallback_language: { type: String, optional: true }
54
55
  }
55
56
  } }
56
57
  }
@@ -10,7 +10,7 @@ module Bisu
10
10
  end
11
11
  end
12
12
 
13
- def localize(text, language, locale, fallback_language=nil)
13
+ def localize(text, language, locale, fallback_languages=[])
14
14
  t = text
15
15
  t = t.gsub("$specialKLanguage$", language)
16
16
  t = t.gsub("$specialKLocale$", locale)
@@ -18,7 +18,9 @@ module Bisu
18
18
  t = t.gsub("$specialKComment2$", "Remember to CHANGE THE TEMPLATE and not this file!")
19
19
 
20
20
  to_localize(t).map do |l|
21
- if localized = @dict.localize(language, l[:key]) || @dict.localize(fallback_language, l[:key])
21
+ if localized = localize_key(l[:key], [language] + fallback_languages)
22
+ localized = process(localized)
23
+
22
24
  l[:params].each do |param, value|
23
25
  if localized.match("%{#{param}}")
24
26
  localized = localized.gsub("%{#{param}}", value)
@@ -27,25 +29,35 @@ module Bisu
27
29
  end
28
30
  end
29
31
 
30
- unless t.gsub!(l[:match], process(localized))
32
+ unless t.gsub!(l[:match], localized)
31
33
  Logger.warn("Could not find translation for #{l[:match]} in #{language}")
32
34
  end
35
+
36
+ unless @type.eql?(:ror) || l[:ignore_param_warn] == true
37
+ localized.scan(/%{[^}]+}/) { |match| Logger.error("Could not find translation param for #{match} in #{language}") }
38
+ end
33
39
  else
34
40
  Logger.warn("Could not find translation for #{l[:match]} in #{language}")
35
41
  end
36
42
  end
37
43
 
38
- unless @type.eql?(:ror)
39
- t.scan(/%{[^}]+}/) { |match| Logger.error("Could not find translation param for #{match} in #{language}") }
44
+ t
45
+ end
46
+
47
+ def localize_key(key, ordered_languages)
48
+ ordered_languages.each do |language|
49
+ if localized = @dict.localize(language, key)
50
+ return localized
51
+ end
40
52
  end
41
53
 
42
- t
54
+ nil
43
55
  end
44
56
 
45
57
  private
46
58
 
47
59
  def to_localize(text)
48
- all_matches = text.to_enum(:scan, /\$([^\$\{]+)(?:\{(.+)\})?\$/).map { Regexp.last_match }
60
+ all_matches = text.to_enum(:scan, /\$([^\$\{\/]+)(?:\{(.+)\})?(\/\/ignore-params)?\$/).map { Regexp.last_match }
49
61
  all_matches.map do |match|
50
62
  params = if match[2]
51
63
  params = match[2].split(",").map(&:strip).map do |param|
@@ -55,21 +67,28 @@ module Bisu
55
67
  Hash[params]
56
68
  end
57
69
 
58
- { match: match[0],
70
+ {
71
+ match: match[0],
59
72
  key: match[1],
60
- params: params || {} }
73
+ params: params || {},
74
+ ignore_param_warn: text.include?("//ignore-params")
75
+ }
61
76
  end
62
77
  end
63
78
 
64
79
  def process(text)
80
+ text = text.gsub("\n", "\\n")
81
+
65
82
  if @type.eql?(:android)
66
83
  text = text.gsub(/[']/, "\\\\\\\\'")
67
84
  text = text.gsub("...", "…")
68
85
  text = text.gsub("& ", "&amp; ")
69
86
  text = text.gsub("@", "\\\\@")
87
+ text = text.gsub(/%(?!{)/, "\\\\%%")
70
88
 
71
89
  elsif @type.eql?(:ios)
72
90
  text = text.gsub(/\"/, "\\\\\"")
91
+ text = text.gsub(/%(?!{)/, "%%")
73
92
  end
74
93
 
75
94
  text
data/lib/bisu/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Bisu
2
- VERSION = '1.7.0'
3
- VERSION_UPDATED_AT = '2019-02-18'
2
+ VERSION = '1.9.0'
3
+ VERSION_UPDATED_AT = '2021-05-21'
4
4
  end
@@ -15,4 +15,5 @@ languages:
15
15
  - locale: en
16
16
  language: english
17
17
  - locale: en-US
18
- language: english
18
+ language: english-us
19
+ fallback_language: english
@@ -22,7 +22,7 @@ describe Bisu::Config do
22
22
  { locale: "en-US", language: "english" },
23
23
  { locale: "pt", language: "portuguese" },
24
24
  { locale: "pt-PT", language: "portuguese" },
25
- { locale: "pt-Batatas", language: "portuguese" }
25
+ { locale: "pt-Batatas", language: "portuguese-bt", fallback_language: "portuguese" }
26
26
  ]
27
27
  } }
28
28
 
@@ -75,14 +75,14 @@ describe Bisu::Config do
75
75
  expect { |b|
76
76
  config.localize_files(&b)
77
77
  }.to yield_successive_args(
78
- ["path/to/file/to/1.ext.translatable", "path/to/default/1.ext", "english", "en-US" ],
79
- ["path/to/file/to/1.ext.translatable", "path/to/final-pt/1.ext", "portuguese", "pt" ],
80
- ["path/to/file/to/1.ext.translatable", "path/to/final-pt-PT/1.ext", "portuguese", "pt-PT" ],
81
- ["path/to/file/to/1.ext.translatable", "path/to/final-pt-Batatas/1.ext", "portuguese", "pt-Batatas"],
82
- ["path/to/file/to/2.ext.translatable", "path/to/default/2.ext", "english", "en-US" ],
83
- ["path/to/file/to/2.ext.translatable", "path/to/final-pt/2.ext", "portuguese", "pt" ],
84
- ["path/to/file/to/2.ext.translatable", "path/to/final-pt-PT/2.ext", "portuguese", "pt-PT" ],
85
- ["path/to/file/to/2.ext.translatable", "path/to/final-pt-Batatas/2.ext", "portuguese", "pt-Batatas"]
78
+ ["path/to/file/to/1.ext.translatable", "path/to/default/1.ext", "en-US", "english", nil ],
79
+ ["path/to/file/to/1.ext.translatable", "path/to/final-pt/1.ext", "pt", "portuguese", nil ],
80
+ ["path/to/file/to/1.ext.translatable", "path/to/final-pt-PT/1.ext", "pt-PT", "portuguese", nil ],
81
+ ["path/to/file/to/1.ext.translatable", "path/to/final-pt-Batatas/1.ext", "pt-Batatas", "portuguese-bt", "portuguese"],
82
+ ["path/to/file/to/2.ext.translatable", "path/to/default/2.ext", "en-US", "english", nil ],
83
+ ["path/to/file/to/2.ext.translatable", "path/to/final-pt/2.ext", "pt", "portuguese", nil ],
84
+ ["path/to/file/to/2.ext.translatable", "path/to/final-pt-PT/2.ext", "pt-PT", "portuguese", nil ],
85
+ ["path/to/file/to/2.ext.translatable", "path/to/final-pt-Batatas/2.ext", "pt-Batatas", "portuguese-bt", "portuguese"]
86
86
  )
87
87
  end
88
88
  end
@@ -1,4 +1,9 @@
1
1
  describe Bisu::Localizer do
2
+ def translates(text, fallbacks: [], to:, lang: nil)
3
+ translation = localizer.localize(text, lang || language, locale, fallbacks)
4
+ expect(translation).to eq to
5
+ end
6
+
2
7
  let(:language) { "Portuguese" }
3
8
  let(:locale) { "pt-PT" }
4
9
 
@@ -8,13 +13,19 @@ describe Bisu::Localizer do
8
13
  "kTranslationKey2" => "Naaada!",
9
14
  "k1ParameterKey" => "Não sabes nada %{name}",
10
15
  "k2ParametersKey" => "Sabes %{perc} por cento %{name}",
16
+ "kNewLineSingle" => "Não sabes nada\nJoão das Neves",
17
+ "kNewLineMultiple" => "Não sabes nada\\nJoão das Neves",
11
18
 
12
19
  # type dependent translations
13
20
  "kDoubleQuoted" => "Não sabes nada \"João das Neves\"",
14
21
  "kSingleQuoted" => "Não sabes nada 'João das Neves'",
15
22
  "kEllipsis" => "Não sabes nada João das Neves...",
16
23
  "kAmpersand" => "Não sabes nada João das Neves & Pícaros",
17
- "kAtSign" => "\@johnsnow sabes alguma coisa?"
24
+ "kAtSign" => "\@johnsnow sabes alguma coisa?",
25
+ "kPercentage" => "Sabes 0% João das Neves."
26
+ },
27
+ "Spanish" => {
28
+ "kMissingTransKey" => "Sabes poco John Snow"
18
29
  },
19
30
  "English" => {
20
31
  "kMissingTransKey" => "You know little John Snow"
@@ -27,11 +38,6 @@ describe Bisu::Localizer do
27
38
  shared_examples_for "a localizer" do
28
39
  it { expect { localizer }.not_to raise_error }
29
40
 
30
- def translates(text, fallback: nil, to:, lang: nil)
31
- translation = localizer.localize(text, lang || language, locale, fallback)
32
- expect(translation).to eq to
33
- end
34
-
35
41
  it { translates("a line with no key", to: "a line with no key") }
36
42
 
37
43
  it { translates("this special key: $specialKComment1$", to: "this special key: This file was automatically generated based on a translation template.") }
@@ -43,7 +49,8 @@ describe Bisu::Localizer do
43
49
  it { translates("this key: $kTranslationKey$", to: "this key: Não sabes nada João das Neves", lang: "portuguese") }
44
50
  it { translates("this unknown key: $kUnknownKey$", to: "this unknown key: $kUnknownKey$") }
45
51
  it { translates("this key with missing translations: $kMissingTransKey$", to: "this key with missing translations: $kMissingTransKey$") }
46
- it { translates("this key with missing translations: $kMissingTransKey$", fallback: "English", to: "this key with missing translations: You know little John Snow") }
52
+ it { translates("this key with missing translations: $kMissingTransKey$", fallbacks: ["English"], to: "this key with missing translations: You know little John Snow") }
53
+ it { translates("this key with missing translations: $kMissingTransKey$", fallbacks: ["Spanish", "English"], to: "this key with missing translations: Sabes poco John Snow") }
47
54
  it { translates("these 2 keys: $kTranslationKey$, $kTranslationKey2$", to: "these 2 keys: Não sabes nada João das Neves, Naaada!") }
48
55
 
49
56
  it { translates("1 parameter: $k1ParameterKey$", to: "1 parameter: Não sabes nada %{name}") }
@@ -52,6 +59,9 @@ describe Bisu::Localizer do
52
59
  it { translates("2 parameters: $k2ParametersKey{perc:%2$d, name:%1$s}$", to: "2 parameters: Sabes %2$d por cento %1$s") }
53
60
  it { translates("2 parameters: $k2ParametersKey{name:%1$s, perc:%2$d}$", to: "2 parameters: Sabes %2$d por cento %1$s") }
54
61
 
62
+ it { translates("$kNewLineSingle$", to: "Não sabes nada\\nJoão das Neves") }
63
+ it { translates("$kNewLineMultiple$", to: "Não sabes nada\\nJoão das Neves") }
64
+
55
65
  # type dependent translations
56
66
 
57
67
  it { translates("$kDoubleQuoted$", to: expected[:double_quoted]) }
@@ -59,6 +69,7 @@ describe Bisu::Localizer do
59
69
  it { translates("$kEllipsis$", to: expected[:ellipsis]) }
60
70
  it { translates("$kAmpersand$", to: expected[:ampersand]) }
61
71
  it { translates("$kAtSign$", to: expected[:at_sign]) }
72
+ it { translates("$kPercentage$", to: expected[:percentage]) }
62
73
 
63
74
  # error handling
64
75
 
@@ -76,7 +87,7 @@ describe Bisu::Localizer do
76
87
  .and not_change { Bisu::Logger.summary[:error] }
77
88
  end
78
89
 
79
- it "throws an error when missing key parameters (expect on ruby on rails)" do
90
+ it "throws a error when missing key parameters (expect on ruby on rails)" do
80
91
  if type == :ror
81
92
  expect {
82
93
  localizer.localize("$k1ParameterKey$", language, locale)
@@ -103,6 +114,17 @@ describe Bisu::Localizer do
103
114
  }.to not_change { Bisu::Logger.summary[:warn] }
104
115
  .and change { Bisu::Logger.summary[:error] }.by(1)
105
116
  end
117
+
118
+ # non localizable text with params
119
+
120
+ it "does not try to translate params outside $$" do
121
+ translates("%{some_text}", to: "%{some_text}")
122
+
123
+ expect {
124
+ localizer.localize("%{some_text}", language, locale)
125
+ }.to not_change { Bisu::Logger.summary[:warn] }
126
+ .and not_change { Bisu::Logger.summary[:error] }
127
+ end
106
128
  end
107
129
 
108
130
  let(:type_dependent_defaults) { {
@@ -110,17 +132,46 @@ describe Bisu::Localizer do
110
132
  single_quoted: keys[language]["kSingleQuoted"],
111
133
  ellipsis: keys[language]["kEllipsis"],
112
134
  ampersand: keys[language]["kAmpersand"],
113
- at_sign: keys[language]["kAtSign"]
135
+ at_sign: keys[language]["kAtSign"],
136
+ percentage: keys[language]["kPercentage"]
114
137
  } }
115
138
 
116
139
  describe "of type iOS" do
117
140
  let(:type) { :ios }
118
141
 
119
142
  let(:expected) { type_dependent_defaults.merge(
120
- double_quoted: "Não sabes nada \\\"João das Neves\\\""
143
+ double_quoted: "Não sabes nada \\\"João das Neves\\\"",
144
+ percentage: "Sabes 0%% João das Neves."
121
145
  ) }
122
146
 
123
147
  it_behaves_like "a localizer"
148
+
149
+ context "when a parameter replacemnt was not defined" do
150
+ let(:line) { "1 parameter: $k1ParameterKey$" }
151
+ let(:expected) { "1 parameter: Não sabes nada %{name}" }
152
+
153
+ it { translates(line, to: expected) }
154
+
155
+ it "returns an error" do
156
+ expect {
157
+ localizer.localize(line, language, locale)
158
+ }.to not_change { Bisu::Logger.summary[:warn] }
159
+ .and change { Bisu::Logger.summary[:error] }.by(1)
160
+ end
161
+
162
+ context "when passing //ignore-params" do
163
+ let(:line) { "1 parameter: $k1ParameterKey//ignore-params$" }
164
+
165
+ it { translates(line, to: expected) }
166
+
167
+ it "does not return an error" do
168
+ expect {
169
+ localizer.localize(line, language, locale)
170
+ }.to not_change { Bisu::Logger.summary[:warn] }
171
+ .and not_change { Bisu::Logger.summary[:error] }
172
+ end
173
+ end
174
+ end
124
175
  end
125
176
 
126
177
  describe "of type Android" do
@@ -130,7 +181,8 @@ describe Bisu::Localizer do
130
181
  single_quoted: "Não sabes nada \\'João das Neves\\'",
131
182
  ellipsis: "Não sabes nada João das Neves…",
132
183
  ampersand: "Não sabes nada João das Neves &amp; Pícaros",
133
- at_sign: "\\@johnsnow sabes alguma coisa?"
184
+ at_sign: "\\@johnsnow sabes alguma coisa?",
185
+ percentage: "Sabes 0\\%% João das Neves."
134
186
  ) }
135
187
 
136
188
  it_behaves_like "a localizer"
@@ -45,7 +45,7 @@ describe Bisu::Source::OneSky do
45
45
  expect(to_i18).to eq({
46
46
  "en" => {
47
47
  "kRegularNewLine" => "This is the first line\\nthis is the second line",
48
- "kErrorNewLine" => "This is the first line\\nthis is the second line"
48
+ "kErrorNewLine" => "This is the first line\\nthis is the second line"
49
49
  }
50
50
  })
51
51
  end
@@ -7,7 +7,8 @@ describe Bisu do
7
7
  before do
8
8
  allow(Bisu).to receive(:open_file).and_return(file)
9
9
  allow_any_instance_of(Bisu::Source::GoogleSheet).to receive(:to_i18).and_return({
10
- "english" => { "kKey" => "Value" }
10
+ "english" => { "kKey" => "Value" },
11
+ "english-us" => { "kKey" => "Value" }
11
12
  })
12
13
  allow(Bisu).to receive(:localize_file)
13
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bisu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - joaoffcosta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-18 00:00:00.000000000 Z
11
+ date: 2021-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: safe_yaml
@@ -74,12 +74,14 @@ executables:
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
- - ".gitignore"
78
77
  - ".rspec"
78
+ - ".ruby-version"
79
+ - ".travis.yml"
79
80
  - CHANGELOG.md
80
81
  - Gemfile
81
82
  - Gemfile.lock
82
83
  - README.md
84
+ - README_explanation.png
83
85
  - Rakefile
84
86
  - bin/bisu
85
87
  - bisu.gemspec
@@ -129,8 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
131
  - !ruby/object:Gem::Version
130
132
  version: '0'
131
133
  requirements: []
132
- rubyforge_project:
133
- rubygems_version: 2.5.1
134
+ rubygems_version: 3.1.6
134
135
  signing_key:
135
136
  specification_version: 4
136
137
  summary: A localization automation service
data/.gitignore DELETED
@@ -1 +0,0 @@
1
- .ruby-version