bisu 2.0.0 → 2.1.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/CHANGELOG.md +3 -0
- data/Gemfile.lock +1 -1
- data/README.md +41 -26
- data/lib/bisu/localizer.rb +8 -7
- data/lib/bisu/version.rb +2 -2
- data/spec/lib/bisu/localizer_spec.rb +14 -10
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a53a95f2c8ca08de5f1b44a56f5648f3b3430d22f191a9a5637f9b6daa37bee9
|
4
|
+
data.tar.gz: b51d192672fdf321ba29f2ac1a4fdaf0728a615885f03fad317c566264531053
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50543ddcc08ea0d0c09626e4d7cee4cc1dec6f575f81e229dce5d263c2b460237fafedc6a13256178cc4a87ccf4eedb290edd83cb5b8c7ca672d5ad6aea9f969
|
7
|
+
data.tar.gz: d7ecec10c7249f263566589dbb62af318ea9a59adb346265bc9500248c048d00507047ce55eab2e2f3527403910bbd67ed995eb16282fda2b6595ab1fbcbc848
|
data/CHANGELOG.md
CHANGED
@@ -4,7 +4,10 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
|
5
5
|
## Unreleased
|
6
6
|
|
7
|
+
## [2.1.0](https://github.com/hole19/bisu/releases/tag/v2.1.0)
|
7
8
|
|
9
|
+
#### Fixed
|
10
|
+
- Fixes handling of % character on iOS localization
|
8
11
|
|
9
12
|
## [2.0.0](https://github.com/hole19/bisu/releases/tag/v2.0.0)
|
10
13
|
Released on 2023/12/07
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -105,7 +105,7 @@ Setup your configuration file
|
|
105
105
|
file_name: <ONE-SKY-FILE-NAME>
|
106
106
|
```
|
107
107
|
|
108
|
-
Create
|
108
|
+
Create translatable file templates
|
109
109
|
-----
|
110
110
|
|
111
111
|
Create a \*.translatable version for your platform specific localization files:
|
@@ -114,19 +114,10 @@ Create a \*.translatable version for your platform specific localization files:
|
|
114
114
|
*example: Localizable.strings.translatable*
|
115
115
|
|
116
116
|
```
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
/***********
|
123
|
-
* General
|
124
|
-
************/
|
125
|
-
|
126
|
-
"klGeneral_Delete" = "$kDelete$";
|
127
|
-
"klGeneral_Cancel" = "$kCancel$";
|
128
|
-
"klGeneral_Close" = "$kClose$";
|
129
|
-
"klRequestName" = "$kRequestName{user_name: %@}$";
|
117
|
+
"delete" = "$general.delete$";
|
118
|
+
"cancel" = "$general.cancel$";
|
119
|
+
"close" = "$general.close$";
|
120
|
+
"requestName" = "$request.name{user_name: %@}$";
|
130
121
|
```
|
131
122
|
|
132
123
|
##### Android
|
@@ -135,15 +126,11 @@ Create a \*.translatable version for your platform specific localization files:
|
|
135
126
|
```
|
136
127
|
<?xml version="1.0" encoding="utf-8"?>
|
137
128
|
|
138
|
-
<!-- $specialKComment1$ -->
|
139
|
-
<!-- $specialKComment2$ -->
|
140
|
-
<!-- Locale: $specialKLocale$; Language used: $specialKLanguage$ -->
|
141
|
-
|
142
129
|
<resources>
|
143
|
-
<string name="delete">$
|
144
|
-
<string name="cancel">$
|
145
|
-
<string name="close">$
|
146
|
-
<string name="request_name">$
|
130
|
+
<string name="delete">$general.delete$</string>
|
131
|
+
<string name="cancel">$general.cancel$</string>
|
132
|
+
<string name="close">$general.close$</string>
|
133
|
+
<string name="request_name">$request.name{user_name: %s}$</string>
|
147
134
|
</resources>
|
148
135
|
```
|
149
136
|
|
@@ -153,9 +140,37 @@ Create a \*.translatable version for your platform specific localization files:
|
|
153
140
|
```
|
154
141
|
$specialKLocale$:
|
155
142
|
resources:
|
156
|
-
delete: $
|
157
|
-
cancel: $
|
158
|
-
close: $
|
143
|
+
delete: $general.delete$
|
144
|
+
cancel: $general.cancel$
|
145
|
+
close: $general.close$
|
159
146
|
messages:
|
160
|
-
request_name: $
|
147
|
+
request_name: $request.name$
|
161
148
|
```
|
149
|
+
|
150
|
+
### Translatable options
|
151
|
+
|
152
|
+
#### Parameters
|
153
|
+
|
154
|
+
Given a key with params such as "Missing ${attribute} value"
|
155
|
+
- `$some-key-with-params{param: %s}$`: `Missing $s value`
|
156
|
+
- `$some-key-with-params//ignore-params$`: `Missing ${attribute} value`
|
157
|
+
|
158
|
+
#### Formated strings (special characters)
|
159
|
+
|
160
|
+
##### "%" character (iOS only)
|
161
|
+
|
162
|
+
When it should be localized as given such as "Perfect: 100 (%)"
|
163
|
+
- `$some-key-with-percentage$`: `Perfect: 100%`
|
164
|
+
|
165
|
+
When it should be localized as a formated string such as "Perfect: %{percentage} (%)"
|
166
|
+
- `$some-key-with-percentage{percentage: %d}//formatted-string$`: `Perfect: %d (%%)` (note the double `%`)
|
167
|
+
|
168
|
+
#### Locale (useful for Rails localization files)
|
169
|
+
|
170
|
+
- `$specialKLocale$`: the respective locale of this file
|
171
|
+
- `$specialKLanguage$`: the respective language on the translation platform
|
172
|
+
|
173
|
+
#### Special comments
|
174
|
+
|
175
|
+
- `$specialKComment1$`: `This file was automatically generated based on a translation template.`
|
176
|
+
- `$specialKComment2$`: `Remember to CHANGE THE TEMPLATE and not this file!`
|
data/lib/bisu/localizer.rb
CHANGED
@@ -19,7 +19,7 @@ module Bisu
|
|
19
19
|
|
20
20
|
to_localize(t).map do |l|
|
21
21
|
if localized = localize_key(l[:key], [language] + fallback_languages)
|
22
|
-
localized = process(localized)
|
22
|
+
localized = process(localized, l[:is_formatted_string])
|
23
23
|
|
24
24
|
l[:params].each do |param, value|
|
25
25
|
if localized.match("%{#{param}}")
|
@@ -33,8 +33,8 @@ module Bisu
|
|
33
33
|
Logger.warn("Could not find translation for #{l[:match]} in #{language}")
|
34
34
|
end
|
35
35
|
|
36
|
-
unless @type.eql?(:ror) || l[:
|
37
|
-
localized.scan(/%{[^}]+}/) { |match| Logger.error("Could not find translation param for #{match} in #{language}") }
|
36
|
+
unless @type.eql?(:ror) || l[:ignore_params] == true
|
37
|
+
localized.scan(/%{[^}]+}/) { |match| Logger.error("Could not find translation param for #{match} for #{l[:key]} in #{language}") }
|
38
38
|
end
|
39
39
|
else
|
40
40
|
Logger.warn("Could not find translation for #{l[:match]} in #{language}")
|
@@ -57,7 +57,7 @@ module Bisu
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def to_localize(text)
|
60
|
-
all_matches = text.to_enum(:scan, /\$([^\$\{\/]+)(?:\{(.+)\})?(\/\/
|
60
|
+
all_matches = text.to_enum(:scan, /\$([^\$\{\/]+)(?:\{(.+)\})?(\/\/[A-Za-z-]+)*\$/).map { Regexp.last_match }
|
61
61
|
all_matches.map do |match|
|
62
62
|
params = if match[2]
|
63
63
|
params = match[2].split(",").map(&:strip).map do |param|
|
@@ -71,12 +71,13 @@ module Bisu
|
|
71
71
|
match: match[0],
|
72
72
|
key: match[1],
|
73
73
|
params: params || {},
|
74
|
-
|
74
|
+
ignore_params: text.include?("//ignore-params"),
|
75
|
+
is_formatted_string: text.include?("//formatted-string"),
|
75
76
|
}
|
76
77
|
end
|
77
78
|
end
|
78
79
|
|
79
|
-
def process(text)
|
80
|
+
def process(text, is_formatted_string)
|
80
81
|
text = text.gsub("\n", "\\n")
|
81
82
|
|
82
83
|
if @type.eql?(:android)
|
@@ -88,7 +89,7 @@ module Bisu
|
|
88
89
|
|
89
90
|
elsif @type.eql?(:ios)
|
90
91
|
text = text.gsub(/\"/, "\\\\\"")
|
91
|
-
text = text.gsub(/%(?!{)/, "%%")
|
92
|
+
text = text.gsub(/%(?!{)/, "%%") if is_formatted_string
|
92
93
|
end
|
93
94
|
|
94
95
|
text
|
data/lib/bisu/version.rb
CHANGED
@@ -66,10 +66,11 @@ describe Bisu::Localizer do
|
|
66
66
|
|
67
67
|
it { translates("$kDoubleQuoted$", to: expected[:double_quoted]) }
|
68
68
|
it { translates("$kSingleQuoted$", to: expected[:single_quoted]) }
|
69
|
-
it { translates("$kEllipsis$",
|
70
|
-
it { translates("$kAmpersand$",
|
71
|
-
it { translates("$kAtSign$",
|
72
|
-
it { translates("$kPercentage$",
|
69
|
+
it { translates("$kEllipsis$", to: expected[:ellipsis]) }
|
70
|
+
it { translates("$kAmpersand$", to: expected[:ampersand]) }
|
71
|
+
it { translates("$kAtSign$", to: expected[:at_sign]) }
|
72
|
+
it { translates("$kPercentage$", to: expected[:percentage]) }
|
73
|
+
it { translates("$kPercentage//formatted-string$", to: expected[:percentage_formatted]) }
|
73
74
|
|
74
75
|
# error handling
|
75
76
|
|
@@ -130,10 +131,11 @@ describe Bisu::Localizer do
|
|
130
131
|
let(:type_dependent_defaults) { {
|
131
132
|
double_quoted: keys[language]["kDoubleQuoted"],
|
132
133
|
single_quoted: keys[language]["kSingleQuoted"],
|
133
|
-
ellipsis:
|
134
|
-
ampersand:
|
135
|
-
at_sign:
|
136
|
-
percentage:
|
134
|
+
ellipsis: keys[language]["kEllipsis"],
|
135
|
+
ampersand: keys[language]["kAmpersand"],
|
136
|
+
at_sign: keys[language]["kAtSign"],
|
137
|
+
percentage: keys[language]["kPercentage"],
|
138
|
+
percentage_formatted: keys[language]["kPercentage"],
|
137
139
|
} }
|
138
140
|
|
139
141
|
describe "of type iOS" do
|
@@ -141,7 +143,8 @@ describe Bisu::Localizer do
|
|
141
143
|
|
142
144
|
let(:expected) { type_dependent_defaults.merge(
|
143
145
|
double_quoted: "Não sabes nada \\\"João das Neves\\\"",
|
144
|
-
percentage: "Sabes 0
|
146
|
+
percentage: "Sabes 0% João das Neves.",
|
147
|
+
percentage_formatted: "Sabes 0%% João das Neves.",
|
145
148
|
) }
|
146
149
|
|
147
150
|
it_behaves_like "a localizer"
|
@@ -182,7 +185,8 @@ describe Bisu::Localizer do
|
|
182
185
|
ellipsis: "Não sabes nada João das Neves…",
|
183
186
|
ampersand: "Não sabes nada João das Neves & Pícaros",
|
184
187
|
at_sign: "\\@johnsnow sabes alguma coisa?",
|
185
|
-
percentage: "Sabes 0\\%% João das Neves."
|
188
|
+
percentage: "Sabes 0\\%% João das Neves.",
|
189
|
+
percentage_formatted: "Sabes 0\\%% João das Neves.",
|
186
190
|
) }
|
187
191
|
|
188
192
|
it_behaves_like "a localizer"
|
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: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- joaoffcosta
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-12-
|
11
|
+
date: 2023-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: safe_yaml
|
@@ -103,7 +103,7 @@ homepage: https://github.com/hole19/bisu
|
|
103
103
|
licenses:
|
104
104
|
- MIT
|
105
105
|
metadata: {}
|
106
|
-
post_install_message:
|
106
|
+
post_install_message:
|
107
107
|
rdoc_options: []
|
108
108
|
require_paths:
|
109
109
|
- lib
|
@@ -118,8 +118,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
118
118
|
- !ruby/object:Gem::Version
|
119
119
|
version: '0'
|
120
120
|
requirements: []
|
121
|
-
rubygems_version: 3.
|
122
|
-
signing_key:
|
121
|
+
rubygems_version: 3.1.6
|
122
|
+
signing_key:
|
123
123
|
specification_version: 4
|
124
124
|
summary: A localization automation service
|
125
125
|
test_files: []
|