-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlocale.rb
153 lines (132 loc) · 3.96 KB
/
locale.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# frozen_string_literal: true
#
# irb/locale.rb - internationalization module
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
#
module IRB # :nodoc:
class Locale
LOCALE_NAME_RE = %r[
(?<language>[[:alpha:]]{2,3})
(?:_ (?<territory>[[:alpha:]]{2,3}) )?
(?:\. (?<codeset>[^@]+) )?
(?:@ (?<modifier>.*) )?
]x
LOCALE_DIR = "/lc/"
LEGACY_ENCODING_ALIAS_MAP = {
'ujis' => Encoding::EUC_JP,
'euc' => Encoding::EUC_JP
}
@@loaded = []
def initialize(locale = nil)
@override_encoding = nil
@lang = @territory = @encoding_name = @modifier = nil
@locale = locale || ENV["IRB_LANG"] || ENV["LC_MESSAGES"] || ENV["LC_ALL"] || ENV["LANG"] || "C"
if m = LOCALE_NAME_RE.match(@locale)
@lang, @territory, @encoding_name, @modifier = m[:language], m[:territory], m[:codeset], m[:modifier]
if @encoding_name
if @encoding = LEGACY_ENCODING_ALIAS_MAP[@encoding_name]
warn(("%s is obsolete. use %s" % ["#{@lang}_#{@territory}.#{@encoding_name}", "#{@lang}_#{@territory}.#{@encoding.name}"]), uplevel: 1)
else
@encoding = Encoding.find(@encoding_name) rescue nil
end
end
end
@encoding ||= (Encoding.find('locale') rescue Encoding::ASCII_8BIT)
end
attr_reader :lang, :territory, :modifier
def encoding
@override_encoding || @encoding
end
def String(mes)
mes = super(mes)
if encoding
mes.encode(encoding, undef: :replace)
else
mes
end
end
def format(*opts)
String(super(*opts))
end
def gets(*rs)
String(super(*rs))
end
def readline(*rs)
String(super(*rs))
end
def print(*opts)
ary = opts.collect{|opt| String(opt)}
super(*ary)
end
def printf(*opts)
s = format(*opts)
print s
end
def puts(*opts)
ary = opts.collect{|opt| String(opt)}
super(*ary)
end
def load(file)
found = find(file)
if found
unless @@loaded.include?(found)
@@loaded << found # cache
Kernel.load(found)
end
else
raise LoadError, "No such file to load -- #{file}"
end
end
def find(file, paths = $:)
dir = File.dirname(file)
dir = "" if dir == "."
base = File.basename(file)
if dir.start_with?('/')
return each_localized_path(dir, base).find{|full_path| File.readable? full_path}
else
return search_file(paths, dir, base)
end
end
# @param paths load paths in which IRB find a localized file.
# @param dir directory
# @param file basename to be localized
#
# typically, for the parameters and a <path> in paths, it searches
# <path>/<dir>/<locale>/<file>
def search_file(lib_paths, dir, file)
each_localized_path(dir, file) do |lc_path|
lib_paths.each do |libpath|
full_path = File.join(libpath, lc_path)
return full_path if File.readable?(full_path)
end
redo if defined?(Gem) and Gem.try_activate(lc_path)
end
nil
end
def each_localized_path(dir, file)
return enum_for(:each_localized_path) unless block_given?
each_sublocale do |lc|
yield lc.nil? ? File.join(dir, LOCALE_DIR, file) : File.join(dir, LOCALE_DIR, lc, file)
end
end
def each_sublocale
if @lang
if @territory
if @encoding_name
yield "#{@lang}_#{@territory}.#{@encoding_name}@#{@modifier}" if @modifier
yield "#{@lang}_#{@territory}.#{@encoding_name}"
end
yield "#{@lang}_#{@territory}@#{@modifier}" if @modifier
yield "#{@lang}_#{@territory}"
end
if @encoding_name
yield "#{@lang}.#{@encoding_name}@#{@modifier}" if @modifier
yield "#{@lang}.#{@encoding_name}"
end
yield "#{@lang}@#{@modifier}" if @modifier
yield "#{@lang}"
end
yield nil
end
end
end