singleton-client-test 0.7.7.7 → 0.7.7.9
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/lib/sgtn-client/api/translation.rb +20 -11
- data/lib/sgtn-client/common/data.rb +7 -1
- data/lib/sgtn-client/core/config.rb +6 -2
- data/lib/sgtn-client/fallbacks.rb +8 -15
- data/lib/sgtn-client/loader/cache.rb +1 -1
- data/lib/sgtn-client/loader/chain_loader.rb +4 -4
- data/lib/sgtn-client/loader/consts.rb +0 -1
- data/lib/sgtn-client/loader/loader_factory.rb +1 -0
- data/lib/sgtn-client/loader/local_translation.rb +5 -6
- data/lib/sgtn-client/loader/pseudo.rb +21 -0
- data/lib/sgtn-client/loader/server.rb +4 -2
- data/lib/sgtn-client/loader/source.rb +2 -2
- data/lib/sgtn-client/loader/source_comparer.rb +19 -15
- data/lib/sgtn-client/loader.rb +1 -0
- data/lib/sgtn-client/sgtn-client.rb +1 -2
- data/lib/sgtn-client/util/locale-util.rb +26 -28
- data/lib/sgtn-client/util/{string-util.rb → localized_string.rb} +3 -3
- data/lib/{sgtn-client → singleton-client}/i18n_backend.rb +7 -3
- data/lib/singleton-client/pseudo.rb +14 -0
- data/lib/singleton-client.rb +15 -10
- metadata +30 -27
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 33c66285f53fb194a41ee8769b58e11b78411eb9c9b017847bf78bfe98db8a4a
|
|
4
|
+
data.tar.gz: 32980165aa18854ec621c96be34164311c61027d7ea2036afe42ecdccdb92355
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 37a00c18462c4b65aa3b9694e42dc9626e50c2109d6a1be27e6a7a1cac0c9ef57d76e5079cf6fee69960d830046cbc42d1fa98664a024d998966970679fd7adb
|
|
7
|
+
data.tar.gz: 905b50f8d67d556e883cacdac89984a77e816adb18f1c7713b1c9ddc2d5152f74ef8db0e4be4611434857e6b04af8dd747d8b5cdb6ba774082487577dc560565
|
|
@@ -39,10 +39,6 @@ module SgtnClient
|
|
|
39
39
|
get_translations(component, locale)
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
def get_translation!(key, component, locale)
|
|
43
|
-
[get_bundle!(component, locale)[key], locale]
|
|
44
|
-
end
|
|
45
|
-
|
|
46
42
|
def translate(key, component, locale = nil, **kwargs, &block)
|
|
47
43
|
translate!(key, component, locale, **kwargs, &block)
|
|
48
44
|
rescue StandardError => e
|
|
@@ -56,8 +52,8 @@ module SgtnClient
|
|
|
56
52
|
SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] key: #{key}, component: #{component}, locale: #{locale}, args: #{kwargs}" }
|
|
57
53
|
|
|
58
54
|
begin
|
|
59
|
-
|
|
60
|
-
result, actual_locale =
|
|
55
|
+
picked_locale = pickup_locale(locale || SgtnClient.locale, component)
|
|
56
|
+
result, actual_locale = get_string!(key, component, picked_locale)
|
|
61
57
|
rescue StandardError => e
|
|
62
58
|
raise e if block.nil?
|
|
63
59
|
end
|
|
@@ -68,7 +64,7 @@ module SgtnClient
|
|
|
68
64
|
return if result.nil?
|
|
69
65
|
end
|
|
70
66
|
|
|
71
|
-
kwargs.empty? ? result : result
|
|
67
|
+
kwargs.empty? ? result : interpolate(result, actual_locale, **kwargs)
|
|
72
68
|
end
|
|
73
69
|
alias t! translate!
|
|
74
70
|
|
|
@@ -82,13 +78,19 @@ module SgtnClient
|
|
|
82
78
|
def get_translations!(component, locale = nil)
|
|
83
79
|
SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] component: #{component}, locale: #{locale}" }
|
|
84
80
|
|
|
85
|
-
|
|
86
|
-
|
|
81
|
+
picked_locale = pickup_locale(locale || SgtnClient.locale, component)
|
|
82
|
+
get_bundle!(component, picked_locale)
|
|
83
|
+
end
|
|
87
84
|
|
|
88
|
-
|
|
85
|
+
protected
|
|
86
|
+
|
|
87
|
+
def pickup_locale(locale, component)
|
|
88
|
+
LocaleUtil.get_best_locale(locale, component)
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
-
|
|
91
|
+
def interpolate(translation, locale, **kwargs)
|
|
92
|
+
translation.localize(locale) % kwargs
|
|
93
|
+
end
|
|
92
94
|
|
|
93
95
|
def get_bundle!(component, locale)
|
|
94
96
|
SgtnClient.config.loader.get_bundle(component, locale)
|
|
@@ -100,6 +102,13 @@ module SgtnClient
|
|
|
100
102
|
SgtnClient.config.notify_observers(:available_locales, component)
|
|
101
103
|
raise
|
|
102
104
|
end
|
|
105
|
+
|
|
106
|
+
private
|
|
107
|
+
|
|
108
|
+
def get_string!(key, component, locale)
|
|
109
|
+
bundle = get_bundle!(component, locale)
|
|
110
|
+
[bundle.fetch(key), bundle.locale]
|
|
111
|
+
end
|
|
103
112
|
end
|
|
104
113
|
|
|
105
114
|
extend Implementation
|
|
@@ -50,13 +50,19 @@ module SgtnClient
|
|
|
50
50
|
class BundleData < Hash # :nodoc:
|
|
51
51
|
include DataInfo
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
attr_reader :origin, :locale, :component
|
|
54
|
+
|
|
55
|
+
def initialize(*args, origin: nil, locale: nil, component: nil)
|
|
54
56
|
if !args.empty? && args[0].is_a?(Hash)
|
|
55
57
|
update(args[0])
|
|
56
58
|
super()
|
|
57
59
|
else
|
|
58
60
|
super
|
|
59
61
|
end
|
|
62
|
+
|
|
63
|
+
@origin = origin
|
|
64
|
+
@locale = locale
|
|
65
|
+
@component = component
|
|
60
66
|
end
|
|
61
67
|
end
|
|
62
68
|
|
|
@@ -11,9 +11,13 @@ module SgtnClient
|
|
|
11
11
|
include Observable
|
|
12
12
|
include Singleton
|
|
13
13
|
|
|
14
|
-
attr_accessor :product_name, :version, :vip_server, :translation_bundle, :source_bundle, :cache_expiry_period,
|
|
14
|
+
attr_accessor :product_name, :version, :vip_server, :translation_bundle, :source_bundle, :cache_expiry_period,
|
|
15
|
+
:log_file, :log_level
|
|
16
|
+
attr_writer :logger, :pseudo_tag
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
def pseudo_tag
|
|
19
|
+
@pseudo_tag ||= '@@'
|
|
20
|
+
end
|
|
17
21
|
|
|
18
22
|
def logger
|
|
19
23
|
@logger ||= if log_file
|
|
@@ -1,25 +1,18 @@
|
|
|
1
|
-
# Copyright 2022 VMware, Inc.
|
|
1
|
+
# Copyright 2022-2023 VMware, Inc.
|
|
2
2
|
# SPDX-License-Identifier: EPL-2.0
|
|
3
3
|
|
|
4
4
|
module SgtnClient
|
|
5
5
|
module Fallbacks # :nodoc:
|
|
6
|
-
|
|
7
|
-
error = nil
|
|
8
|
-
localechain(locale) do |l|
|
|
9
|
-
return super(key, component, l)
|
|
10
|
-
rescue StandardError => e
|
|
11
|
-
error = e
|
|
12
|
-
end
|
|
13
|
-
raise error if error
|
|
14
|
-
end
|
|
6
|
+
protected
|
|
15
7
|
|
|
16
|
-
def
|
|
8
|
+
def get_bundle!(component, locale)
|
|
17
9
|
error = nil
|
|
18
10
|
localechain(locale) do |l|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
begin
|
|
12
|
+
return super(component, l)
|
|
13
|
+
rescue StandardError => e
|
|
14
|
+
error = e
|
|
15
|
+
end
|
|
23
16
|
end
|
|
24
17
|
raise error if error
|
|
25
18
|
end
|
|
@@ -35,7 +35,7 @@ module SgtnClient
|
|
|
35
35
|
def load_bundle(component, locale)
|
|
36
36
|
SgtnClient.logger.debug { "[#{__FILE__}][#{__callee__}] CacheFiller, component=#{component}, locale=#{locale}" }
|
|
37
37
|
|
|
38
|
-
@cache_hash[Common::BundleID.new(component, locale)] =
|
|
38
|
+
@cache_hash[Common::BundleID.new(component, locale)] = super
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def available_bundles
|
|
@@ -6,16 +6,16 @@ require 'set'
|
|
|
6
6
|
module SgtnClient
|
|
7
7
|
module TranslationLoader
|
|
8
8
|
class Chain
|
|
9
|
-
|
|
9
|
+
attr_reader :loaders
|
|
10
10
|
|
|
11
11
|
def initialize(*loaders)
|
|
12
|
-
|
|
12
|
+
@loaders = loaders
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def load_bundle(component, locale)
|
|
16
16
|
exception = nil
|
|
17
17
|
|
|
18
|
-
loaders.each do |loader|
|
|
18
|
+
@loaders.each do |loader|
|
|
19
19
|
begin
|
|
20
20
|
bundle = loader.load_bundle(component, locale)
|
|
21
21
|
return bundle if bundle
|
|
@@ -32,7 +32,7 @@ module SgtnClient
|
|
|
32
32
|
exception = nil
|
|
33
33
|
total_data = Set.new
|
|
34
34
|
|
|
35
|
-
loaders.each do |loader|
|
|
35
|
+
@loaders.each do |loader|
|
|
36
36
|
begin
|
|
37
37
|
item = loader.available_bundles
|
|
38
38
|
total_data += item
|
|
@@ -26,17 +26,16 @@ module SgtnClient
|
|
|
26
26
|
|
|
27
27
|
raise SingletonError, "no messages in local bundle file: #{file_path}." unless messages
|
|
28
28
|
|
|
29
|
-
messages
|
|
29
|
+
Common::BundleData.new(messages, origin: self, component: component,
|
|
30
|
+
locale: locale == CONSTS::REAL_SOURCE_LOCALE ? LocaleUtil.get_source_locale : locale)
|
|
30
31
|
end
|
|
31
32
|
|
|
32
33
|
def available_bundles
|
|
33
34
|
SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}]" }
|
|
34
35
|
|
|
35
|
-
@available_bundles
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
bundles.add Common::BundleID.new(f.parent.basename.to_s, locale)
|
|
39
|
-
end
|
|
36
|
+
@available_bundles = @base_path.glob('*/*.json').reduce(Set.new) do |bundles, f|
|
|
37
|
+
locale = f.basename.to_s.sub(/\A#{BUNDLE_PREFIX}/i, '').sub(/#{BUNDLE_SUFFIX}\z/i, '')
|
|
38
|
+
bundles.add Common::BundleID.new(f.parent.basename.to_s, locale)
|
|
40
39
|
end
|
|
41
40
|
end
|
|
42
41
|
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Copyright 2022 VMware, Inc.
|
|
2
|
+
# SPDX-License-Identifier: EPL-2.0
|
|
3
|
+
|
|
4
|
+
module SgtnClient
|
|
5
|
+
module TranslationLoader
|
|
6
|
+
module Pseudo # :nodoc:
|
|
7
|
+
def initialize(*)
|
|
8
|
+
super
|
|
9
|
+
@pseudo_tag = Sgtn.pseudo_tag
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def load_bundle(component, locale)
|
|
13
|
+
return super unless locale == Sgtn::PSEUDO_LOCALE
|
|
14
|
+
|
|
15
|
+
SgtnClient.logger.debug { "[#{__FILE__}][#{__callee__}] component=#{component}, locale=#{locale}" }
|
|
16
|
+
|
|
17
|
+
super(component, LocaleUtil.get_source_locale).transform_values! { |v| "#{@pseudo_tag}#{v}#{@pseudo_tag}" }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -27,16 +27,18 @@ module SgtnClient
|
|
|
27
27
|
|
|
28
28
|
@conn = Faraday.new(config.vip_server, request: REQUEST_ARGUMENTS) do |f|
|
|
29
29
|
f.response :json # decode response bodies as JSON
|
|
30
|
-
f.use :gzip
|
|
31
30
|
f.response :raise_error
|
|
32
31
|
f.response :logger, config.logger, { log_level: :debug, headers: false, bodies: true }
|
|
32
|
+
f.use :gzip
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def load_bundle(component, locale)
|
|
37
37
|
SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] component=#{component}, locale=#{locale}" }
|
|
38
38
|
|
|
39
|
-
query_server(format(@bundle_url, locale, component), ['messages'])
|
|
39
|
+
data = query_server(format(@bundle_url, locale, component), ['messages'])
|
|
40
|
+
Common::BundleData.new(data, origin: self, component: component,
|
|
41
|
+
locale: locale == CONSTS::REAL_SOURCE_LOCALE ? LocaleUtil.get_source_locale : locale)
|
|
40
42
|
end
|
|
41
43
|
|
|
42
44
|
def available_bundles
|
|
@@ -7,7 +7,7 @@ require 'yaml'
|
|
|
7
7
|
|
|
8
8
|
module SgtnClient
|
|
9
9
|
module TranslationLoader
|
|
10
|
-
class Source
|
|
10
|
+
class Source # :nodoc:
|
|
11
11
|
def initialize(config)
|
|
12
12
|
@source_bundle_path = Pathname.new(config.source_bundle)
|
|
13
13
|
end
|
|
@@ -31,7 +31,7 @@ module SgtnClient
|
|
|
31
31
|
|
|
32
32
|
raise SingletonError, "no local source messages for component #{component}" if total_messages.empty?
|
|
33
33
|
|
|
34
|
-
total_messages
|
|
34
|
+
Common::BundleData.new(total_messages, origin: self, component: component, locale: LocaleUtil.get_source_locale)
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def available_bundles
|
|
@@ -11,41 +11,45 @@ module SgtnClient
|
|
|
11
11
|
real_locale = cache_to_real_map[locale]
|
|
12
12
|
return super(component, real_locale) if real_locale
|
|
13
13
|
|
|
14
|
-
old_source_bundle_thread = Thread.new { load_bundle(component, CONSTS::OLD_SOURCE_LOCALE) }
|
|
15
14
|
source_bundle_thread = Thread.new { load_bundle(component, LocaleUtil.get_source_locale) }
|
|
16
|
-
translation_bundle = super
|
|
15
|
+
translation_bundle = super
|
|
16
|
+
|
|
17
|
+
begin
|
|
18
|
+
old_source_bundle = translation_bundle.origin.load_bundle(component, old_source_locale(locale))
|
|
19
|
+
rescue StandardError => e
|
|
20
|
+
SgtnClient.logger.error "[#{__FILE__}][#{__callee__}] failed to load old source bundle. component:#{component}. error: #{e}"
|
|
21
|
+
end
|
|
17
22
|
|
|
18
23
|
begin
|
|
19
|
-
old_source_bundle = old_source_bundle_thread.value
|
|
20
24
|
source_bundle = source_bundle_thread.value
|
|
21
25
|
rescue StandardError => e
|
|
22
|
-
SgtnClient.logger.error "[#{__FILE__}][#{__callee__}] failed to load
|
|
26
|
+
SgtnClient.logger.error "[#{__FILE__}][#{__callee__}] failed to load source bundle. component:#{component}. error: #{e}"
|
|
23
27
|
return translation_bundle
|
|
24
28
|
end
|
|
25
29
|
|
|
26
30
|
compare_source(translation_bundle, old_source_bundle, source_bundle)
|
|
27
31
|
end
|
|
28
32
|
|
|
29
|
-
|
|
33
|
+
protected
|
|
30
34
|
|
|
31
|
-
def
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return translation_bundle
|
|
35
|
-
end
|
|
35
|
+
def old_source_locale(_locale)
|
|
36
|
+
LocaleUtil.get_source_locale
|
|
37
|
+
end
|
|
36
38
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
def compare_source(translation_bundle, old_source_bundle, source_bundle)
|
|
40
|
+
source_bundle.each do |k, v|
|
|
41
|
+
if translation_bundle[k].nil? || (!old_source_bundle.nil? && old_source_bundle[k] != v)
|
|
42
|
+
translation_bundle[k] = LocalizedString.new(v, LocaleUtil.get_source_locale) if v
|
|
40
43
|
end
|
|
41
44
|
end
|
|
42
45
|
translation_bundle
|
|
43
46
|
end
|
|
44
47
|
|
|
48
|
+
private
|
|
49
|
+
|
|
45
50
|
def cache_to_real_map
|
|
46
51
|
@cache_to_real_map ||= {
|
|
47
|
-
LocaleUtil.get_source_locale => CONSTS::REAL_SOURCE_LOCALE
|
|
48
|
-
CONSTS::OLD_SOURCE_LOCALE => LocaleUtil.get_source_locale
|
|
52
|
+
LocaleUtil.get_source_locale => CONSTS::REAL_SOURCE_LOCALE
|
|
49
53
|
}.freeze
|
|
50
54
|
end
|
|
51
55
|
end
|
data/lib/sgtn-client/loader.rb
CHANGED
|
@@ -11,6 +11,7 @@ module SgtnClient
|
|
|
11
11
|
autoload :CONSTS, 'sgtn-client/loader/consts'
|
|
12
12
|
autoload :LoaderFactory, 'sgtn-client/loader/loader_factory'
|
|
13
13
|
autoload :LocalTranslation, 'sgtn-client/loader/local_translation'
|
|
14
|
+
autoload :Pseudo, 'sgtn-client/loader/pseudo'
|
|
14
15
|
autoload :SgtnServer, 'sgtn-client/loader/server'
|
|
15
16
|
autoload :SingleLoader, 'sgtn-client/loader/single_loader'
|
|
16
17
|
autoload :SourceComparer, 'sgtn-client/loader/source_comparer'
|
|
@@ -16,9 +16,8 @@ module SgtnClient # :nodoc:
|
|
|
16
16
|
autoload :Exceptions, 'sgtn-client/core/exceptions'
|
|
17
17
|
autoload :ValidateUtil, 'sgtn-client/util/validate-util'
|
|
18
18
|
autoload :LocaleUtil, 'sgtn-client/util/locale-util'
|
|
19
|
-
autoload :
|
|
19
|
+
autoload :LocalizedString, 'sgtn-client/util/localized_string'
|
|
20
20
|
autoload :SingletonError, 'sgtn-client/exceptions'
|
|
21
|
-
autoload :I18nBackend, 'sgtn-client/i18n_backend'
|
|
22
21
|
|
|
23
22
|
module Formatters # :nodoc:
|
|
24
23
|
autoload :PluralFormatter, 'sgtn-client/formatters/plurals/plural_formatter'
|
|
@@ -15,40 +15,38 @@ module SgtnClient
|
|
|
15
15
|
}.freeze
|
|
16
16
|
LOCALE_SEPARATOR = '-'
|
|
17
17
|
EN_LOCALE = 'en'
|
|
18
|
-
|
|
18
|
+
|
|
19
|
+
@locale_match_results = Concurrent::Map.new do |hash, component|
|
|
20
|
+
components = SgtnClient.config.available_components
|
|
21
|
+
unless components.empty? || components.include?(component)
|
|
22
|
+
raise SingletonError, "component '#{component}' doesn't exist!"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
hash[component] = Concurrent::Map.new
|
|
26
|
+
end
|
|
19
27
|
@lowercase_locales_map = Concurrent::Map.new
|
|
20
28
|
|
|
21
29
|
def self.get_best_locale(locale, component)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
return locale if SgtnClient.config.available_locales(component).include?(locale)
|
|
31
|
+
|
|
32
|
+
component_result = @locale_match_results[component]
|
|
33
|
+
component_result[locale] ||= begin
|
|
34
|
+
if component_result.size >= 50
|
|
35
|
+
component_result.delete(component_result.keys[Random.rand(component_result.size)])
|
|
26
36
|
end
|
|
27
37
|
|
|
28
|
-
|
|
38
|
+
locale = locale.to_s
|
|
39
|
+
if locale.empty?
|
|
40
|
+
get_fallback_locale
|
|
41
|
+
else
|
|
42
|
+
candidates = lowercase_locales_map(component)
|
|
43
|
+
if candidates.empty?
|
|
44
|
+
locale
|
|
45
|
+
else
|
|
46
|
+
get_best_match(locale.gsub('_', LOCALE_SEPARATOR).downcase, candidates)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
29
49
|
end
|
|
30
|
-
|
|
31
|
-
component_result[locale] ||= begin
|
|
32
|
-
component_result.delete(component_result.keys[Random.rand(component_result.size)]) if component_result.size >= 50
|
|
33
|
-
|
|
34
|
-
if SgtnClient.config.available_locales(component).include?(locale)
|
|
35
|
-
locale
|
|
36
|
-
elsif locale.nil?
|
|
37
|
-
get_fallback_locale
|
|
38
|
-
else
|
|
39
|
-
locale = locale.to_s
|
|
40
|
-
if locale.empty?
|
|
41
|
-
get_fallback_locale
|
|
42
|
-
else
|
|
43
|
-
candidates = lowercase_locales_map(component)
|
|
44
|
-
if candidates.empty?
|
|
45
|
-
locale
|
|
46
|
-
else
|
|
47
|
-
get_best_match(locale.gsub('_', LOCALE_SEPARATOR).downcase, candidates)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
50
|
end
|
|
53
51
|
|
|
54
52
|
def self.get_best_match(locale, candidates)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
require 'i18n'
|
|
5
5
|
|
|
6
|
-
module
|
|
6
|
+
module Sgtn # :nodoc:
|
|
7
7
|
# When integrating Singleton in a client application that is already using [I18n::Backend (https://www.rubydoc.info/github/svenfuchs/i18n/master/I18n/Backend/), it would be useful to have Singleton override the said module in order to minimize necessary changes. Here is a common usage:
|
|
8
8
|
#
|
|
9
9
|
# I18n::Backend::Simple.include(I18n::Backend::Fallbacks) # add fallbacks behavior to current backend
|
|
@@ -13,6 +13,10 @@ module SgtnClient # :nodoc:
|
|
|
13
13
|
class I18nBackend
|
|
14
14
|
def initialize(component)
|
|
15
15
|
@component = component
|
|
16
|
+
@translation = Class.new do
|
|
17
|
+
include SgtnClient::Translation::Implementation
|
|
18
|
+
include Sgtn::Pseudo
|
|
19
|
+
end.new
|
|
16
20
|
end
|
|
17
21
|
|
|
18
22
|
def initialized?
|
|
@@ -34,13 +38,13 @@ module SgtnClient # :nodoc:
|
|
|
34
38
|
def translations; end
|
|
35
39
|
|
|
36
40
|
def exists?(locale, key, options)
|
|
37
|
-
!!
|
|
41
|
+
!!translate(locale, key, options)
|
|
38
42
|
end
|
|
39
43
|
|
|
40
44
|
def translate(locale, key, options)
|
|
41
45
|
flat_key = I18n::Backend::Flatten.normalize_flat_keys(locale, key, options[:scope], '.')
|
|
42
46
|
values = options.except(*I18n::RESERVED_KEYS)
|
|
43
|
-
|
|
47
|
+
@translation.translate(flat_key, @component, locale, **values) { nil }
|
|
44
48
|
end
|
|
45
49
|
|
|
46
50
|
def localize(locale, object, format, options) end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright 2022 VMware, Inc.
|
|
4
|
+
# SPDX-License-Identifier: EPL-2.0
|
|
5
|
+
|
|
6
|
+
module Sgtn
|
|
7
|
+
module Pseudo # :nodoc:
|
|
8
|
+
protected
|
|
9
|
+
|
|
10
|
+
def pickup_locale(locale, _component)
|
|
11
|
+
locale == PSEUDO_LOCALE ? PSEUDO_LOCALE : super
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
data/lib/singleton-client.rb
CHANGED
|
@@ -5,6 +5,15 @@ require 'forwardable'
|
|
|
5
5
|
require_relative 'singleton-ruby'
|
|
6
6
|
|
|
7
7
|
module Sgtn # :nodoc:
|
|
8
|
+
autoload :Pseudo, 'singleton-client/pseudo'
|
|
9
|
+
autoload :I18nBackend, 'singleton-client/i18n_backend'
|
|
10
|
+
|
|
11
|
+
extend SgtnClient::Translation::Implementation
|
|
12
|
+
extend SgtnClient::Fallbacks
|
|
13
|
+
extend Sgtn::Pseudo
|
|
14
|
+
|
|
15
|
+
PSEUDO_LOCALE = 'pseudo'.freeze
|
|
16
|
+
|
|
8
17
|
class << self
|
|
9
18
|
extend Forwardable
|
|
10
19
|
|
|
@@ -13,14 +22,6 @@ module Sgtn # :nodoc:
|
|
|
13
22
|
SgtnClient.load(config_file, env)
|
|
14
23
|
end
|
|
15
24
|
|
|
16
|
-
def_delegator SgtnClient::Config, :instance, :config
|
|
17
|
-
delegate %i[translate! t! translate t get_translations! get_translations] => SgtnClient::Translation,
|
|
18
|
-
%i[locale locale=] => SgtnClient,
|
|
19
|
-
%i[logger product_name version vip_server translation_bundle
|
|
20
|
-
source_bundle cache_expiry_period log_file log_level].flat_map { |m|
|
|
21
|
-
[m, "#{m}=".to_sym]
|
|
22
|
-
} => :config
|
|
23
|
-
|
|
24
25
|
def with_locale(tmp_locale = nil)
|
|
25
26
|
if tmp_locale.nil?
|
|
26
27
|
yield
|
|
@@ -34,7 +35,11 @@ module Sgtn # :nodoc:
|
|
|
34
35
|
end
|
|
35
36
|
end
|
|
36
37
|
end
|
|
37
|
-
end
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
def_delegator SgtnClient::Config, :instance, :config
|
|
40
|
+
delegate %i[locale locale=] => SgtnClient,
|
|
41
|
+
%i[logger product_name version vip_server translation_bundle
|
|
42
|
+
source_bundle cache_expiry_period log_file log_level
|
|
43
|
+
pseudo_tag ].flat_map { |m| [m, "#{m}=".to_sym] } => :config
|
|
44
|
+
end
|
|
40
45
|
end
|
metadata
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: singleton-client-test
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.7.7.
|
|
4
|
+
version: 0.7.7.9
|
|
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:
|
|
11
|
+
date: 2023-01-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: concurrent-ruby
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: 1.1.10
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - "
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
26
|
+
version: 1.1.10
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: faraday
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
33
|
+
version: 1.0.1
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
40
|
+
version: 1.0.1
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: faraday_middleware
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
47
|
+
version: 1.2.0
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
54
|
+
version: 1.2.0
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: i18n
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -84,44 +84,44 @@ dependencies:
|
|
|
84
84
|
name: multi_json
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
|
-
- - "
|
|
87
|
+
- - ">="
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '
|
|
89
|
+
version: '0'
|
|
90
90
|
type: :runtime
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
|
-
- - "
|
|
94
|
+
- - ">="
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '
|
|
96
|
+
version: '0'
|
|
97
97
|
- !ruby/object:Gem::Dependency
|
|
98
98
|
name: request_store
|
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
|
100
100
|
requirements:
|
|
101
|
-
- - "
|
|
101
|
+
- - ">="
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: '
|
|
103
|
+
version: '0'
|
|
104
104
|
type: :runtime
|
|
105
105
|
prerelease: false
|
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
107
|
requirements:
|
|
108
|
-
- - "
|
|
108
|
+
- - ">="
|
|
109
109
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: '
|
|
110
|
+
version: '0'
|
|
111
111
|
- !ruby/object:Gem::Dependency
|
|
112
112
|
name: twitter_cldr
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
|
114
114
|
requirements:
|
|
115
|
-
- - "
|
|
115
|
+
- - ">="
|
|
116
116
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: '
|
|
117
|
+
version: '0'
|
|
118
118
|
type: :runtime
|
|
119
119
|
prerelease: false
|
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements:
|
|
122
|
-
- - "
|
|
122
|
+
- - ">="
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: '
|
|
124
|
+
version: '0'
|
|
125
125
|
description: Singleton Ruby client
|
|
126
126
|
email: g11n-vip-project@vmware.com
|
|
127
127
|
executables: []
|
|
@@ -146,28 +146,31 @@ files:
|
|
|
146
146
|
- lib/sgtn-client/exceptions.rb
|
|
147
147
|
- lib/sgtn-client/fallbacks.rb
|
|
148
148
|
- lib/sgtn-client/formatters/plurals/plural_formatter.rb
|
|
149
|
-
- lib/sgtn-client/i18n_backend.rb
|
|
150
149
|
- lib/sgtn-client/loader.rb
|
|
151
150
|
- lib/sgtn-client/loader/cache.rb
|
|
152
151
|
- lib/sgtn-client/loader/chain_loader.rb
|
|
153
152
|
- lib/sgtn-client/loader/consts.rb
|
|
154
153
|
- lib/sgtn-client/loader/loader_factory.rb
|
|
155
154
|
- lib/sgtn-client/loader/local_translation.rb
|
|
155
|
+
- lib/sgtn-client/loader/pseudo.rb
|
|
156
156
|
- lib/sgtn-client/loader/server.rb
|
|
157
157
|
- lib/sgtn-client/loader/single_loader.rb
|
|
158
158
|
- lib/sgtn-client/loader/source.rb
|
|
159
159
|
- lib/sgtn-client/loader/source_comparer.rb
|
|
160
160
|
- lib/sgtn-client/sgtn-client.rb
|
|
161
161
|
- lib/sgtn-client/util/locale-util.rb
|
|
162
|
-
- lib/sgtn-client/util/
|
|
162
|
+
- lib/sgtn-client/util/localized_string.rb
|
|
163
163
|
- lib/sgtn-client/util/validate-util.rb
|
|
164
164
|
- lib/singleton-client.rb
|
|
165
|
+
- lib/singleton-client/i18n_backend.rb
|
|
166
|
+
- lib/singleton-client/pseudo.rb
|
|
165
167
|
- lib/singleton-ruby.rb
|
|
166
168
|
- lib/version.rb
|
|
167
169
|
homepage: https://github.com/vmware/singleton
|
|
168
170
|
licenses:
|
|
169
171
|
- EPL 2.0
|
|
170
|
-
metadata:
|
|
172
|
+
metadata:
|
|
173
|
+
rubygems_mfa_required: 'true'
|
|
171
174
|
post_install_message:
|
|
172
175
|
rdoc_options: []
|
|
173
176
|
require_paths:
|
|
@@ -176,14 +179,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
176
179
|
requirements:
|
|
177
180
|
- - ">="
|
|
178
181
|
- !ruby/object:Gem::Version
|
|
179
|
-
version: 2.
|
|
182
|
+
version: 2.3.0
|
|
180
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
184
|
requirements:
|
|
182
185
|
- - ">="
|
|
183
186
|
- !ruby/object:Gem::Version
|
|
184
187
|
version: '0'
|
|
185
188
|
requirements: []
|
|
186
|
-
rubygems_version: 3.
|
|
189
|
+
rubygems_version: 3.3.26
|
|
187
190
|
signing_key:
|
|
188
191
|
specification_version: 4
|
|
189
192
|
summary: Singleton Ruby client
|