bisu 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|