singleton-client-test 0.7.0.34 → 0.7.0.37
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/README.md +27 -28
- data/lib/sgtn-client/api/translation.rb +4 -4
- data/lib/sgtn-client/cldr/localized_str.rb +1 -0
- data/lib/sgtn-client/core/config.rb +4 -1
- data/lib/sgtn-client/loader/local_translation.rb +2 -1
- data/lib/sgtn-client/loader/single_loader.rb +11 -9
- data/lib/sgtn-client/loader/source.rb +4 -1
- data/lib/sgtn-client/util/locale-util.rb +29 -11
- data/lib/singleton-client.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 365e6be5a17d3f95f2529789f8632092e859c793c96d67b4f8ddd6492f3e3687
|
4
|
+
data.tar.gz: a2df815daeda06f52484e61ef7c64e2c5bc6ce5d46332a10b60187bbc2440a59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64ef532c3de19ee72c7b0c28661c1192856eb9ebdef0a335d7d702d98b0d7bf56411691cd3ce2c8ceeae829d0d8d8eaad53981cde88721b49e606c657f053028
|
7
|
+
data.tar.gz: 27d63abbf9b7df87e20997664eebc97853ae1837f5f3c3853c1f77ce1ace43000d25482ae6f261a3d18788fbba9f026ca75374e1a14c078aa068dbdfec8a532a
|
data/README.md
CHANGED
@@ -1,54 +1,53 @@
|
|
1
|
-
#
|
1
|
+
# Singleton Client for Ruby
|
2
2
|
|
3
3
|
## Prerequisites
|
4
4
|
- Ruby version: 3.0.0 or above
|
5
5
|
- Bundler version: 2.2.3 or above
|
6
6
|
|
7
7
|
## Run Unit Test
|
8
|
-
rake spec
|
8
|
+
`rake spec`
|
9
9
|
|
10
10
|
## Usage
|
11
11
|
|
12
12
|
Basic Usage:
|
13
13
|
|
14
14
|
```ruby
|
15
|
-
require 'singleton-
|
16
|
-
|
17
|
-
include SgtnClient
|
18
|
-
|
19
|
-
SgtnClient.load(file, mode)
|
20
|
-
|
21
|
-
SgtnClient::Source.loadBundles(locale)
|
22
|
-
|
23
|
-
@Result = SgtnClient::Translation.getString(component, key, locale)
|
15
|
+
require 'singleton-client'
|
24
16
|
|
17
|
+
Sgtn.load_config(file, env)
|
18
|
+
result = Sgtn.translate(key, component, locale)
|
25
19
|
```
|
26
20
|
## API Usage
|
27
21
|
|
28
22
|
### Get a string's translation
|
29
|
-
|
30
|
-
|
31
|
-
### Get a string's translation and format it with placeholders
|
32
|
-
SgtnClient::Translation.getString_f(component, key, args, locale)
|
33
|
-
|
34
|
-
### Get a component's translations
|
35
|
-
SgtnClient::Translation.getStrings(component, locale)
|
36
|
-
|
23
|
+
`result = Sgtn.translate(key, component, locale)`
|
37
24
|
|
38
|
-
|
39
|
-
|
40
|
-
Before call below APIs(without locale and component arguments), it requires to set the locale and component in the initial codes.
|
41
|
-
|
42
|
-
### Get a string's translation
|
43
|
-
SgtnClient::T.s(key)
|
25
|
+
### Get a string's translation with default value when no translation
|
26
|
+
`result = Sgtn.translate(key, component, locale) { 'default value' }`
|
44
27
|
|
45
28
|
### Get a string's translation and format it with placeholders
|
46
|
-
|
29
|
+
`result = Sgtn.translate(key, component, locale, **args)`
|
47
30
|
|
48
|
-
### Get
|
49
|
-
|
31
|
+
### Get pluralized translation
|
32
|
+
`result = Sgtn.translate(key, component, locale, **args)`
|
50
33
|
|
34
|
+
### Get translations of a bundle
|
35
|
+
`result = Sgtn.get_translations(component, locale)`
|
51
36
|
|
37
|
+
### Set locale for a request
|
38
|
+
`Sgtn.locale = 'en'`
|
52
39
|
|
40
|
+
### Get locale of the request
|
41
|
+
`result = Sgtn.locale`
|
53
42
|
|
43
|
+
### Get a string's translation with locale set
|
44
|
+
```ruby
|
45
|
+
Sgtn.locale = 'en'
|
46
|
+
result = Sgtn.translate(key, component)
|
47
|
+
```
|
54
48
|
|
49
|
+
### Get translations of a bundle with locale set
|
50
|
+
```ruby
|
51
|
+
Sgtn.locale = 'en'
|
52
|
+
result = Sgtn.get_translations(component)
|
53
|
+
```
|
@@ -6,19 +6,19 @@ require 'request_store'
|
|
6
6
|
module SgtnClient
|
7
7
|
module Translation
|
8
8
|
module Implementation
|
9
|
-
# <b>DEPRECATED:</b> Please use <tt>
|
9
|
+
# <b>DEPRECATED:</b> Please use <tt>Sgtn:translate</tt> instead.
|
10
10
|
def getString(component, key, locale)
|
11
11
|
SgtnClient.logger.debug "[Translation.getString]component: #{component}, key: #{key}, locale: #{locale}"
|
12
12
|
translate(key, component, locale) { nil }
|
13
13
|
end
|
14
14
|
|
15
|
-
# <b>DEPRECATED:</b> Please use <tt>
|
15
|
+
# <b>DEPRECATED:</b> Please use <tt>Sgtn:translate</tt> instead.
|
16
16
|
def getString_p(component, key, plural_args, locale)
|
17
17
|
SgtnClient.logger.debug "[Translation][getString_p]component=#{component}, key=#{key}, locale=#{locale}"
|
18
18
|
translate(key, component, locale, **plural_args) { nil }
|
19
19
|
end
|
20
20
|
|
21
|
-
# <b>DEPRECATED:</b> Please use <tt>
|
21
|
+
# <b>DEPRECATED:</b> Please use <tt>Sgtn:translate</tt> instead.
|
22
22
|
def getString_f(component, key, args, locale, *_optionals)
|
23
23
|
SgtnClient.logger.debug "[Translation][getString_f]component=#{component}, key=#{key}, locale=#{locale}"
|
24
24
|
s = translate(key, component, locale) { nil }
|
@@ -34,7 +34,7 @@ module SgtnClient
|
|
34
34
|
s
|
35
35
|
end
|
36
36
|
|
37
|
-
# <b>DEPRECATED:</b> Please use <tt>
|
37
|
+
# <b>DEPRECATED:</b> Please use <tt>Sgtn:get_translations</tt> instead.
|
38
38
|
def getStrings(component, locale)
|
39
39
|
get_translations(component, locale)
|
40
40
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
# SPDX-License-Identifier: EPL-2.0
|
3
3
|
|
4
4
|
String.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
|
5
|
+
# <b>DEPRECATED:</b> Please use <tt>Sgtn:translate</tt> instead.
|
5
6
|
def to_plural_s(locale, arg)
|
6
7
|
num_str = SgtnClient::Formatters::PluralFormatter.new(locale).num_s(self, arg)
|
7
8
|
if num_str.nil? || num_str.empty?
|
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'erb'
|
5
5
|
require 'yaml'
|
6
|
-
|
6
|
+
require 'observer'
|
7
7
|
|
8
8
|
module SgtnClient
|
9
9
|
#include Exceptions
|
@@ -40,6 +40,7 @@ module SgtnClient
|
|
40
40
|
|
41
41
|
|
42
42
|
class Config
|
43
|
+
extend Observable
|
43
44
|
|
44
45
|
attr_accessor :username, :password, :signature, :app_id, :cert_path,
|
45
46
|
:token, :token_secret, :subject,
|
@@ -182,6 +183,8 @@ module SgtnClient
|
|
182
183
|
def bundles.locales
|
183
184
|
@locales ||= reduce(Set.new) { |locales, id| locales << id.locale }
|
184
185
|
end
|
186
|
+
changed
|
187
|
+
notify_observers(:available_locales)
|
185
188
|
end
|
186
189
|
bundles.locales
|
187
190
|
end
|
@@ -12,12 +12,9 @@ module SgtnClient
|
|
12
12
|
def load_bundle(component, locale)
|
13
13
|
SgtnClient.logger.debug "[#{__FILE__}][#{__callee__}] component=#{component}, locale=#{locale}"
|
14
14
|
|
15
|
-
@single_bundle_loader ||= single_loader { |c,l| super(c,l) }
|
15
|
+
@single_bundle_loader ||= single_loader { |c, l| super(c, l) }
|
16
16
|
id = CacheUtil.get_cachekey(component, locale)
|
17
17
|
@single_bundle_loader.operate(id, component, locale)&.value
|
18
|
-
ensure
|
19
|
-
# delete thread from hash after finish
|
20
|
-
@single_bundle_loader.remove_object(id)
|
21
18
|
end
|
22
19
|
|
23
20
|
def available_bundles
|
@@ -25,21 +22,26 @@ module SgtnClient
|
|
25
22
|
|
26
23
|
@single_available_bundles_loader ||= single_loader { super }
|
27
24
|
@single_available_bundles_loader.operate(CONSTS::AVAILABLE_BUNDLES_KEY)&.value
|
28
|
-
ensure
|
29
|
-
@single_available_bundles_loader.remove_object(CONSTS::AVAILABLE_BUNDLES_KEY)
|
30
25
|
end
|
31
26
|
|
32
27
|
private
|
28
|
+
|
33
29
|
def single_loader(&block)
|
34
|
-
|
30
|
+
loader = nil
|
31
|
+
none_alive = proc { |_, thread| thread.nil? }
|
35
32
|
creator = proc do |id, _, *args|
|
36
33
|
Thread.new do
|
37
34
|
SgtnClient.logger.debug "start single loading #{id}"
|
38
|
-
|
35
|
+
begin
|
36
|
+
block.call(*args)
|
37
|
+
ensure
|
38
|
+
# delete thread from hash after finish
|
39
|
+
loader.remove_object(id)
|
40
|
+
end
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
42
|
-
SgtnClient::SingleOperation.new(none_alive, &creator)
|
44
|
+
loader = SgtnClient::SingleOperation.new(none_alive, &creator)
|
43
45
|
end
|
44
46
|
end
|
45
47
|
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# Copyright 2022 VMware, Inc.
|
2
2
|
# SPDX-License-Identifier: EPL-2.0
|
3
3
|
|
4
|
+
require 'pathname'
|
5
|
+
require 'psych/simple'
|
6
|
+
|
4
7
|
module SgtnClient
|
5
8
|
module Common
|
6
9
|
autoload :BundleID, 'sgtn-client/common/data'
|
@@ -22,7 +25,7 @@ module SgtnClient
|
|
22
25
|
total_messages = {}
|
23
26
|
|
24
27
|
(@source_bundle_path + component).glob('**/*.{yml, yaml}') do |f|
|
25
|
-
bundle =
|
28
|
+
bundle = Psych.simple_load(File.read(f))
|
26
29
|
messages = bundle&.first&.last # TODO: Warn about inconsistent source locale
|
27
30
|
if messages.is_a?(Hash)
|
28
31
|
total_messages.merge!(messages)
|
@@ -1,23 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2022 VMware, Inc.
|
2
4
|
# SPDX-License-Identifier: EPL-2.0
|
5
|
+
|
3
6
|
require 'set'
|
4
7
|
|
5
8
|
module SgtnClient
|
6
9
|
class LocaleUtil
|
7
10
|
MAP_LOCALES = {
|
8
|
-
'zh-
|
9
|
-
'zh-
|
10
|
-
'zh-
|
11
|
-
'zh-
|
11
|
+
'zh-cn' => 'zh-hans',
|
12
|
+
'zh-tw' => 'zh-hant',
|
13
|
+
'zh-hans-cn' => 'zh-hans',
|
14
|
+
'zh-hant-tw' => 'zh-hant'
|
12
15
|
}.freeze
|
16
|
+
LOCALE_SEPARATOR = '-'
|
13
17
|
|
14
18
|
def self.get_best_locale(locale)
|
19
|
+
return locale if Config.available_locales.include?(locale)
|
20
|
+
|
15
21
|
return get_fallback_locale if locale.nil?
|
16
22
|
|
17
23
|
locale = locale.to_s
|
18
24
|
return get_fallback_locale if locale.empty?
|
19
25
|
|
20
|
-
get_best_match(locale.gsub('_',
|
26
|
+
get_best_match(locale.gsub('_', LOCALE_SEPARATOR).downcase)
|
21
27
|
end
|
22
28
|
|
23
29
|
def self.is_source_locale(locale = nil)
|
@@ -26,12 +32,12 @@ module SgtnClient
|
|
26
32
|
|
27
33
|
def self.get_best_match(locale)
|
28
34
|
locale = MAP_LOCALES[locale] || locale
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
return get_fallback_locale if index.nil?
|
35
|
+
lowercase_locales_map[locale] or begin
|
36
|
+
index = locale.rindex(LOCALE_SEPARATOR)
|
37
|
+
return get_fallback_locale if index.nil?
|
33
38
|
|
34
|
-
|
39
|
+
get_best_match(locale[0...index])
|
40
|
+
end
|
35
41
|
end
|
36
42
|
|
37
43
|
def self.get_source_locale
|
@@ -47,6 +53,18 @@ module SgtnClient
|
|
47
53
|
@fallback_locale ||= get_default_locale || get_source_locale || 'en'
|
48
54
|
end
|
49
55
|
|
50
|
-
|
56
|
+
def self.lowercase_locales_map
|
57
|
+
@lowercase_locales_map ||= Config.available_locales.each_with_object({}) do |locale, memo|
|
58
|
+
memo[locale.to_s.downcase] = locale
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.reset_available_locales(type)
|
63
|
+
@lowercase_locales_map = nil if type == :available_locales
|
64
|
+
end
|
65
|
+
|
66
|
+
SgtnClient::Config.add_observer(self, :reset_available_locales)
|
67
|
+
|
68
|
+
private_class_method :get_best_match, :lowercase_locales_map, :reset_available_locales
|
51
69
|
end
|
52
70
|
end
|
data/lib/singleton-client.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: singleton-client-test
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.0.
|
4
|
+
version: 0.7.0.37
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- VMware G11n Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|
@@ -142,6 +142,20 @@ dependencies:
|
|
142
142
|
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
144
|
version: '6.6'
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
name: psych-simple
|
147
|
+
requirement: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - "~>"
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '2.0'
|
152
|
+
type: :runtime
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - "~>"
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '2.0'
|
145
159
|
description: Singleton Ruby client
|
146
160
|
email: g11n-vip-project@vmware.com
|
147
161
|
executables: []
|