isodoc-i18n 1.0.2 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a5bee1c4d667fc659d53f3aa964cd4b6dbfe96fd0ec0eb45bce8ba6e44174e7
4
- data.tar.gz: 347381dbea8916642a042f0f2e98505c9418480f0b0b4e7c551610b564638861
3
+ metadata.gz: '0702006206028e38503e71c72fc5763c9ddc78798c7db38485ce3db8d1c58b55'
4
+ data.tar.gz: d55ddad57f401360969c491fc1c8efaa0a375324a09b1a2e1afee31bf9e76156
5
5
  SHA512:
6
- metadata.gz: b74a8ae85c13632ecc7e2619e5c76ae4041278cd73d3f6a2ea6555523b10ff9203c986ab0ffee8e2329f5530df257d2cea845bcdef5841182e48548526f4a898
7
- data.tar.gz: adab36d75979127547ad9bcdfc632a2aed78b2bc7ae2f33616513352a57f940441a5402dff6d72b9a4263ff4cca75233e64cce7102827cd74fd7e02b813e338e
6
+ metadata.gz: 3fa9c7108157ebf3e63d7bcba97e37b878527593d4462356d5f23e4d6350da37bb76e173ae165e75a86b025d5b09a193f0cde80505f50a47a5c3396e5323ff41
7
+ data.tar.gz: 30673e7993504c760358ef70aa18352eae6f5455098f5e86e07080af51fadd68014bc826f056bc5c28908e59651611a4ee4bdf7e2fed953f2bd03e38d050df8c
data/isodoc-i18n.gemspec CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
 
25
25
  spec.add_dependency "htmlentities", "~> 4.3.4"
26
26
  spec.add_dependency "metanorma-utils", "~> 1.2.8"
27
+ spec.add_dependency "twitter_cldr"
27
28
 
28
29
  spec.add_development_dependency "debug"
29
30
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
data/lib/isodoc/i18n.rb CHANGED
@@ -1,12 +1,14 @@
1
1
  require "yaml"
2
2
  require "htmlentities"
3
3
  require "metanorma-utils"
4
+ require "twitter_cldr"
4
5
 
5
6
  module IsoDoc
6
7
  class I18n
7
- def load_yaml(lang, script, i18nyaml = nil)
8
+ def load_yaml(lang, script, i18nyaml = nil, i18nhash = nil)
8
9
  ret = load_yaml1(lang, script)
9
10
  return normalise_hash(ret.merge(YAML.load_file(i18nyaml))) if i18nyaml
11
+ return normalise_hash(ret.merge(i18nhash)) if i18nhash
10
12
 
11
13
  normalise_hash(ret)
12
14
  end
@@ -52,10 +54,10 @@ module IsoDoc
52
54
  @labels[key] = val
53
55
  end
54
56
 
55
- def initialize(lang, script, i18nyaml = nil)
57
+ def initialize(lang, script, i18nyaml: nil, i18nhash: nil)
56
58
  @lang = lang
57
59
  @script = script
58
- y = load_yaml(lang, script, i18nyaml)
60
+ y = load_yaml(lang, script, i18nyaml, i18nhash)
59
61
  @labels = y
60
62
  @labels["language"] = @lang
61
63
  @labels["script"] = @script
@@ -146,5 +148,38 @@ module IsoDoc
146
148
  c.encode(c.decode(text), :hexadecimal)
147
149
  end
148
150
  end
151
+
152
+ # ord class is either SpelloutRules or OrdinalRules
153
+ def inflect_ordinal(num, term, ord_class)
154
+ if @labels["ordinal_keys"].nil? || @labels["ordinal_keys"].empty?
155
+ tw_cldr_localize(num).to_rbnf_s(ord_class, @labels[ord_class])
156
+ else
157
+ tw_cldr_localize(num)
158
+ .to_rbnf_s(ord_class, @labels[ord_class][ordinal_key(term)])
159
+ end
160
+ end
161
+
162
+ def tw_cldr_localize(num)
163
+ num.localize(tw_cldr_lang)
164
+ rescue StandardError
165
+ num.localize(:en)
166
+ end
167
+
168
+ def ordinal_key(term)
169
+ @labels["ordinal_keys"].each_with_object([]) do |k, m|
170
+ m << case k
171
+ when "gender" then term["gender"]
172
+ when "number" then term["number"] || "sg"
173
+ when "case" then term["case"] || "nom"
174
+ end
175
+ end.join(".")
176
+ end
177
+
178
+ def tw_cldr_lang
179
+ if @lang == "zh" && @script == "Hans" then :"zh-cn"
180
+ elsif @lang == "zh" && @script == "Hant" then :"zh-tw"
181
+ else @lang.to_sym
182
+ end
183
+ end
149
184
  end
150
185
  end
@@ -1,5 +1,5 @@
1
1
  module IsoDoc
2
2
  class I18n
3
- VERSION = "1.0.2".freeze
3
+ VERSION = "1.0.5".freeze
4
4
  end
5
5
  end
@@ -0,0 +1,12 @@
1
+ ordinal_keys: [gender,number]
2
+ SpelloutRules:
3
+ m.sg: spellout-ordinal-r
4
+ f.sg: spellout-ordinal
5
+ n.sg: spellout-ordinal-s
6
+ m.pl: spellout-ordinal
7
+ f.pl: spellout-ordinal
8
+ n.pl: spellout-ordinal
9
+ edition: Auflage
10
+ inflection:
11
+ Auflage:
12
+ gender: f
@@ -0,0 +1,7 @@
1
+ ordinal_keys: []
2
+ SpelloutRules: spellout-ordinal
3
+ edition: Auflage
4
+ inflection:
5
+ Auflage:
6
+ gender: f
7
+
@@ -30,7 +30,15 @@ RSpec.describe IsoDoc::I18n do
30
30
  end
31
31
 
32
32
  it "loads language file overrides" do
33
- c = IsoDoc::I18n.new("en", "Latn", "spec/assets/new.yaml")
33
+ c = IsoDoc::I18n.new("en", "Latn", i18nyaml: "spec/assets/new.yaml")
34
+ expect(c.text).to eq "text2"
35
+ expect(c.at).to eq "at"
36
+ expect(c.hash.to_s).to be_equivalent_to '{"key1"=>"val1", "key2"=>"val2"}'
37
+ expect(c.arr.to_s).to eq '["arr1", "arr2"]'
38
+ end
39
+
40
+ it "loads language hash overrides" do
41
+ c = IsoDoc::I18n.new("en", "Latn", i18nhash: YAML.load_file("spec/assets/new.yaml"))
34
42
  expect(c.text).to eq "text2"
35
43
  expect(c.at).to eq "at"
36
44
  expect(c.hash.to_s).to be_equivalent_to '{"key1"=>"val1", "key2"=>"val2"}'
@@ -85,4 +93,25 @@ RSpec.describe IsoDoc::I18n do
85
93
  expect(c.boolean_conj(%w(a b c), "and")).to eq "a, b, and c"
86
94
  expect(c.boolean_conj(%w(a b c d), "and")).to eq "a, b, c, and d"
87
95
  end
96
+
97
+ it "does German ordinals" do
98
+ c = IsoDoc::I18n.new("de", "Latn", i18nyaml: "spec/assets/de.yaml")
99
+ term = c.inflection[c.edition]
100
+ expect(c.inflect_ordinal(5, term, "SpelloutRules"))
101
+ .to eq "fünfte"
102
+ end
103
+
104
+ it "does Chinese ordinals" do
105
+ c = IsoDoc::I18n.new("zh", "Hans", i18nyaml: "spec/assets/zh-Hans.yaml")
106
+ term = c.inflection[c.edition]
107
+ expect(c.inflect_ordinal(5, term, "SpelloutRules"))
108
+ .to eq "第五"
109
+ end
110
+
111
+ it "does Klingon ordinals" do
112
+ c = IsoDoc::I18n.new("tlh", "Hans", i18nyaml: "spec/assets/zh-Hans.yaml")
113
+ term = c.inflection[c.edition]
114
+ expect(c.inflect_ordinal(5, term, "SpelloutRules"))
115
+ .to eq "fifth"
116
+ end
88
117
  end
data/spec/spec_helper.rb CHANGED
@@ -30,7 +30,7 @@ def xmlpp(xml)
30
30
  end
31
31
 
32
32
  def metadata(hash)
33
- Hash[hash.sort].delete_if do |_k, v|
33
+ hash.sort.to_h.delete_if do |_k, v|
34
34
  v.nil? || (v.respond_to?(:empty?) && v.empty?)
35
35
  end
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isodoc-i18n
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-11 00:00:00.000000000 Z
11
+ date: 2022-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: htmlentities
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.2.8
41
+ - !ruby/object:Gem::Dependency
42
+ name: twitter_cldr
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: debug
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -201,7 +215,9 @@ files:
201
215
  - lib/isodoc-yaml/i18n-en.yaml
202
216
  - lib/isodoc/i18n.rb
203
217
  - lib/isodoc/version.rb
218
+ - spec/assets/de.yaml
204
219
  - spec/assets/new.yaml
220
+ - spec/assets/zh-Hans.yaml
205
221
  - spec/isodoc/base_spec.rb
206
222
  - spec/spec_helper.rb
207
223
  homepage: https://github.com/metanorma/isodoc-i18n