i18n-translators-tools 0.1.1 → 0.2
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.
- data/README.md +72 -22
- data/Rakefile +36 -3
- data/bin/i18n-translate +11 -68
- data/i18n-translators-tools.gemspec +44 -3
- data/lib/i18n-translate.rb +5 -0
- data/lib/i18n/backend/po.rb +20 -0
- data/lib/i18n/backend/properties.rb +19 -0
- data/lib/i18n/backend/translate.rb +2 -2
- data/lib/i18n/backend/ts.rb +19 -0
- data/lib/i18n/processor.rb +56 -1
- data/lib/i18n/processor/gettext.rb +63 -22
- data/lib/i18n/processor/properties.rb +78 -0
- data/lib/i18n/processor/ruby.rb +1 -1
- data/lib/i18n/processor/ts.rb +149 -0
- data/lib/i18n/processor/yaml.rb +2 -2
- data/lib/i18n/translate.rb +84 -69
- data/lib/i18n/translator.rb +76 -0
- data/test/all.rb +89 -0
- data/test/backend.rb +51 -0
- data/test/locale/src/cze.po +26 -0
- data/test/locale/src/cze.rb +24 -2
- data/test/locale/src/cze.yml +24 -6
- data/test/locale/src/deep/cze.yml +4 -0
- data/test/locale/src/deep/default.yml +4 -0
- data/test/locale/src/deep/eng.yml +4 -0
- data/test/locale/src/default.yml +14 -6
- data/test/processor.rb +42 -0
- data/test/tc_backend_po.rb +16 -0
- data/test/tc_backend_properties.rb +16 -0
- data/test/tc_backend_translate.rb +16 -0
- data/test/tc_backend_ts.rb +16 -0
- data/test/tc_i18n-translate.rb +128 -0
- data/test/tc_processor.rb +49 -0
- data/test/tc_processor_gettext.rb +15 -0
- data/test/tc_processor_properties.rb +35 -0
- data/test/tc_processor_ruby.rb +15 -0
- data/test/tc_processor_ts.rb +26 -0
- data/test/tc_processor_yaml.rb +15 -0
- data/test/tc_translate.rb +106 -87
- metadata +88 -19
data/README.md
CHANGED
@@ -11,8 +11,8 @@ Interesting features
|
|
11
11
|
* no database required
|
12
12
|
* merging and changes propagation (adding, removing and changed default text)
|
13
13
|
keeping default file untouched
|
14
|
-
* creating new locale file based
|
15
|
-
* converting from one format to another (yml <=> rb <=> po)
|
14
|
+
* creating new locale file based default file
|
15
|
+
* converting from one format to another (yml <=> rb <=> po <=> ts <=> properties)
|
16
16
|
* statistics
|
17
17
|
* built-in simple console translator
|
18
18
|
* support for locales split into sub-directories like:
|
@@ -61,14 +61,18 @@ WARNING
|
|
61
61
|
* **po files are supported only partialy.** If you convert from yaml or ruby to
|
62
62
|
po and back you don't have to care even if you are using pluralization.
|
63
63
|
If you are converting from po origin files then you can lose header of the
|
64
|
-
file, pluralization,
|
65
|
-
|
66
|
-
* **po files are not compatible with I18n::Gettext.** The main purpose
|
67
|
-
enabling conversions to po files is effort to allow usage of many po
|
68
|
-
for ruby projects.
|
69
|
-
|
70
|
-
|
71
|
-
|
64
|
+
file, pluralization, some flags (fuzzy will stay) and previous-context.
|
65
|
+
Strings over multiple lines are supported, however.
|
66
|
+
* **po files are not compatible with I18n::Backend::Gettext.** The main purpose
|
67
|
+
of enabling conversions to po files is effort to allow usage of many po
|
68
|
+
editors for ruby projects. You can either keep all your files in yml and
|
69
|
+
convert them only for translators and then back or you can have default in
|
70
|
+
yml and other locales in po files. i18-translate tool will take care of it.
|
71
|
+
* **QT TS format is not fully supported.** TS format is changing with almost
|
72
|
+
every qt release so i18n-translate don't support:
|
73
|
+
* extra-po-msgid_plural, extra-po-old_msgid_plural
|
74
|
+
* extra-loc-*
|
75
|
+
* nested context
|
72
76
|
|
73
77
|
Installation
|
74
78
|
------------
|
@@ -112,6 +116,7 @@ So in your application you should do something like this:
|
|
112
116
|
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
|
113
117
|
I18n.default_locale = 'default'
|
114
118
|
I18n.load_path << Dir[ File.expand_path("../locale/*.yml", __FILE__) ]
|
119
|
+
I18n.locale = 'cs'
|
115
120
|
|
116
121
|
and then you can use
|
117
122
|
|
@@ -119,6 +124,14 @@ and then you can use
|
|
119
124
|
|
120
125
|
as usual.
|
121
126
|
|
127
|
+
Notice that Translator have to be included BEFORE Fallbacks
|
128
|
+
otherwise the fallback will get Hash (even with empty translation)
|
129
|
+
and won't work.
|
130
|
+
|
131
|
+
It is hightly recommended to use Fallbacks backend together with
|
132
|
+
Translate. If you have experienced nil or empty translations due to
|
133
|
+
untranslated strings this can fix the problem.
|
134
|
+
|
122
135
|
|
123
136
|
Examples
|
124
137
|
--------
|
@@ -145,6 +158,12 @@ with locales 'locale/de_DE.yml', 'locale/cs_CZ.yml' and 'locale/extra/cs_CZ.yml'
|
|
145
158
|
locale/cs_CZ.yml...65% (650/1000)
|
146
159
|
locale/de_DE.yml...90% (900/1000)
|
147
160
|
|
161
|
+
**PO locales and default.yml**
|
162
|
+
|
163
|
+
$> i18n-translate merge
|
164
|
+
locale/cs_CZ.po...merged
|
165
|
+
locale/de_DE.po...merged
|
166
|
+
|
148
167
|
**Translate more entries (built-in translator invocation):**
|
149
168
|
|
150
169
|
$> i18n-translate translate -l cs_CZ
|
@@ -160,17 +179,43 @@ Supported formats
|
|
160
179
|
|
161
180
|
* **po**; supported format looks like
|
162
181
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
182
|
+
# there is some comment
|
183
|
+
#. extracted-comment
|
184
|
+
#: reference
|
185
|
+
#, fuzzy, changed
|
186
|
+
#| msgid Old default
|
187
|
+
msgctxt "there.is.some.key"
|
188
|
+
msgid "Default text"
|
189
|
+
msgstr "Prelozeny defaultni text"
|
169
190
|
|
170
191
|
Such po file is pretty usable with po editors.
|
171
192
|
|
193
|
+
To use po files you should include this backend istead of
|
194
|
+
I18n::Backend::Gettext
|
195
|
+
|
196
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::PO)
|
197
|
+
|
198
|
+
This backend can also work with natural po files. Just set your app.pot
|
199
|
+
as default and then you can use it:
|
200
|
+
|
201
|
+
I18n.t("some text there")
|
202
|
+
|
203
|
+
or create alias
|
204
|
+
|
205
|
+
def _(*args); I18n.t(*args); end
|
206
|
+
_("some text there")
|
207
|
+
|
172
208
|
* **yml**; standard yaml files in I18n simple format
|
173
209
|
* **rb**; typical ruby files in I18n simple format
|
210
|
+
* **ts**; QT Linguist TS format. If you are planing to do translation in
|
211
|
+
qt linguist, convert to this format rather then to po. Include TS backend
|
212
|
+
if you want use this foramat for locales.
|
213
|
+
|
214
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::TS)
|
215
|
+
|
216
|
+
* **properties**; support for java properties locales
|
217
|
+
|
218
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::Properties)
|
174
219
|
|
175
220
|
|
176
221
|
New locale files format
|
@@ -189,10 +234,10 @@ or for pluralization (depends on rules) it can be similar to this:
|
|
189
234
|
New format looks like:
|
190
235
|
|
191
236
|
key:
|
192
|
-
|
237
|
+
old_default: "old default string"
|
193
238
|
default: "new default string"
|
194
239
|
comment: "translator's comments"
|
195
|
-
|
240
|
+
translation: "translation itself"
|
196
241
|
flag: "one of (ok || incomplete || changed || untranslated)"
|
197
242
|
fuzzy: true # exists only where flag != ok (nice to have when you want
|
198
243
|
edit files manually)
|
@@ -201,14 +246,14 @@ Pluralized variant should look like:
|
|
201
246
|
|
202
247
|
key:
|
203
248
|
one:
|
204
|
-
|
249
|
+
old_default:
|
205
250
|
default:
|
206
|
-
|
251
|
+
translation:
|
207
252
|
...
|
208
253
|
other:
|
209
|
-
|
254
|
+
old_default:
|
210
255
|
default:
|
211
|
-
|
256
|
+
translation:
|
212
257
|
...
|
213
258
|
|
214
259
|
As you can see the old format is string and the new format is hash.
|
@@ -242,3 +287,8 @@ It is not necessary to use all switches.
|
|
242
287
|
|
243
288
|
[1]: http://github.com/pejuko/i18n-web-translator
|
244
289
|
|
290
|
+
|
291
|
+
<!--
|
292
|
+
vi: filetype=mkd
|
293
|
+
-->
|
294
|
+
|
data/Rakefile
CHANGED
@@ -2,17 +2,50 @@
|
|
2
2
|
# vi: fenc=utf-8:expandtab:ts=2:sw=2:sts=2
|
3
3
|
#
|
4
4
|
# @author: Petr Kovar <pejuko@gmail.com>
|
5
|
+
$KCODE='UTF8'
|
5
6
|
|
6
7
|
require 'rake/testtask'
|
7
8
|
require 'rake/gempackagetask'
|
8
9
|
require 'rake/clean'
|
9
10
|
|
10
|
-
CLEAN << "coverage" << "pkg"
|
11
|
+
CLEAN << "coverage" << "pkg" << "README.html" << "CHANGELOG.html"
|
11
12
|
|
12
|
-
task :default => [:test]
|
13
|
+
task :default => [:test, :doc, :gem]
|
13
14
|
Rake::TestTask.new(:test) do |t|
|
14
|
-
t.pattern = File.join(File.dirname(__FILE__), 'test/
|
15
|
+
t.pattern = File.join(File.dirname(__FILE__), 'test/all.rb')
|
15
16
|
t.verbose = true
|
16
17
|
end
|
17
18
|
|
18
19
|
Rake::GemPackageTask.new(eval(File.read("i18n-translators-tools.gemspec"))) {|pkg|}
|
20
|
+
|
21
|
+
desc "Test with rcov"
|
22
|
+
task :rcov do |t|
|
23
|
+
system "rcov --exclude .rvm,lib/ruby --sort coverage --text-summary --text-coverage-diff -o coverage test/all.rb"
|
24
|
+
end
|
25
|
+
|
26
|
+
begin
|
27
|
+
require 'bluecloth'
|
28
|
+
|
29
|
+
def build_document(mdfile)
|
30
|
+
fname = $1 if mdfile =~ /(.*)\.md$/
|
31
|
+
raise "Unknown file type" unless fname
|
32
|
+
|
33
|
+
data = File.read(mdfile)
|
34
|
+
md = Markdown.new(data)
|
35
|
+
htmlfile = "#{fname}.html"
|
36
|
+
|
37
|
+
File.open(htmlfile, "w") { |f| f << md.to_html }
|
38
|
+
end
|
39
|
+
|
40
|
+
task :doc => [:readme, :changelog]
|
41
|
+
|
42
|
+
task :readme do |t|
|
43
|
+
build_document("README.md")
|
44
|
+
end
|
45
|
+
|
46
|
+
task :changelog do |t|
|
47
|
+
build_document("CHANGELOG.md")
|
48
|
+
end
|
49
|
+
|
50
|
+
rescue
|
51
|
+
end
|
data/bin/i18n-translate
CHANGED
@@ -6,6 +6,8 @@
|
|
6
6
|
|
7
7
|
$KCODE="UTF8"
|
8
8
|
|
9
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), "../lib"))
|
10
|
+
|
9
11
|
def print_help
|
10
12
|
print $0
|
11
13
|
puts " <command> [options] [locale directory]"
|
@@ -45,6 +47,7 @@ options:
|
|
45
47
|
--locale=<locale>, -l <locale> -- work with specific locale only
|
46
48
|
e.g: create -p locale -l cs_CZ
|
47
49
|
--deep, -r -- scan locale_dir recursively
|
50
|
+
--encoding, -e -- set encoding of files (default: utf-8)
|
48
51
|
--quiet, -q -- show less information
|
49
52
|
--verbose, -v -- shows more information during
|
50
53
|
locales processing
|
@@ -61,7 +64,7 @@ CONFIG FILE
|
|
61
64
|
|
62
65
|
Example:
|
63
66
|
|
64
|
-
|
67
|
+
{
|
65
68
|
:exclude => ['rules'],
|
66
69
|
:verbose => true,
|
67
70
|
:format => 'yml',
|
@@ -149,6 +152,7 @@ opts = GetoptLong.new(
|
|
149
152
|
["--separator", "-s", GetoptLong::REQUIRED_ARGUMENT],
|
150
153
|
["--target", "-t", GetoptLong::REQUIRED_ARGUMENT],
|
151
154
|
["--deep", "-r", GetoptLong::NO_ARGUMENT],
|
155
|
+
["--encoding", "-e", GetoptLong::REQUIRED_ARGUMENT],
|
152
156
|
["--verbose", "-v", GetoptLong::NO_ARGUMENT],
|
153
157
|
["--quiet", "-q", GetoptLong::NO_ARGUMENT],
|
154
158
|
["--locale", "-l", GetoptLong::REQUIRED_ARGUMENT]
|
@@ -158,7 +162,7 @@ opts = GetoptLong.new(
|
|
158
162
|
# setting up default options
|
159
163
|
user_config_file = File.join(ENV["HOME"], ".config/ruby/i18n-translate")
|
160
164
|
options = I18n::Translate::Translate::DEFAULT_OPTIONS.dup
|
161
|
-
options.merge!(
|
165
|
+
options.merge!(I18n::Translate.read_config(user_config_file)) if File.exists?(user_config_file)
|
162
166
|
options[:exclude] ||= []
|
163
167
|
|
164
168
|
|
@@ -195,7 +199,7 @@ end
|
|
195
199
|
locale_dir = tmp[:locale_dir] ? tmp[:locale_dir] : options[:locale_dir]
|
196
200
|
# reading project locale config options
|
197
201
|
locale_config_file = File.join(locale_dir, ".i18n-translate")
|
198
|
-
options.merge!(
|
202
|
+
options.merge!(I18n::Translate.read_config(locale_config_file)) if File.exists?(locale_config_file)
|
199
203
|
|
200
204
|
# merge command line arguments
|
201
205
|
options.merge!(tmp)
|
@@ -219,9 +223,7 @@ when 'create'
|
|
219
223
|
exit 2
|
220
224
|
end
|
221
225
|
|
222
|
-
tr = I18n::Translate
|
223
|
-
tr.assign(tr.merge)
|
224
|
-
tr.export!
|
226
|
+
tr = I18n::Translate.create_locale(options[:locale], options.merge({:format => format}))
|
225
227
|
|
226
228
|
puts "#{tr.options[:locale_dir]}/#{tr.lang}...created" unless options[:quiet]
|
227
229
|
|
@@ -232,71 +234,12 @@ when 'translate'
|
|
232
234
|
exit 1
|
233
235
|
end
|
234
236
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
next_entry = false
|
239
|
-
while not next_entry
|
240
|
-
puts ""
|
241
|
-
puts ""
|
242
|
-
puts "(#{i+1}/#{stat[:fuzzy]}) #{entry["key"]} (#{entry["flag"]})"
|
243
|
-
puts "comment: #{entry["comment"]}" unless entry["comment"].empty?
|
244
|
-
puts "old default: #{entry["old_default"]}" unless entry["old_default"].empty?
|
245
|
-
puts "old translation: #{entry["old_t"]}" unless entry["old_t"].empty?
|
246
|
-
puts "default: #{entry["default"]}"
|
247
|
-
puts "translation: #{entry["t"]}"
|
248
|
-
puts ""
|
249
|
-
puts "Actions:"
|
250
|
-
puts "n (next) t (translate) f (change flag) c (comment) s (save) q (save & quit) x(exit no saving)"
|
251
|
-
action = STDIN.readline.strip
|
252
|
-
puts ""
|
253
|
-
case action
|
254
|
-
when 'n'
|
255
|
-
next_entry = true
|
256
|
-
when 't'
|
257
|
-
puts "Enter translation:"
|
258
|
-
entry["t"] = STDIN.readline.strip
|
259
|
-
entry["flag"] = "ok" unless entry["t"].empty?
|
260
|
-
tr.assign( [entry] )
|
261
|
-
puts "Flag sets to #{entry["flag"]}"
|
262
|
-
when 'f'
|
263
|
-
puts "Change flag to:"
|
264
|
-
puts "o (ok), i (incomplete), c (changed), u (untranslated)"
|
265
|
-
f = STDIN.readline.strip
|
266
|
-
I18n::Translate::FLAGS.each do |fname|
|
267
|
-
if fname[0,1] == f
|
268
|
-
entry["flag"] = fname
|
269
|
-
break
|
270
|
-
end
|
271
|
-
end
|
272
|
-
tr.assign( [entry] )
|
273
|
-
puts "Flag sets to #{entry["flag"]}"
|
274
|
-
when 'c'
|
275
|
-
puts "Enter comment:"
|
276
|
-
entry["comment"] = STDIN.readline.strip
|
277
|
-
tr.assign( [entry] )
|
278
|
-
puts "Comment has changed."
|
279
|
-
when 's'
|
280
|
-
tr.export!
|
281
|
-
puts "Translation saved"
|
282
|
-
when 'q'
|
283
|
-
tr.export!
|
284
|
-
puts "Translation saved"
|
285
|
-
exit
|
286
|
-
when 'x'
|
287
|
-
exit
|
288
|
-
end # case
|
289
|
-
end # while
|
290
|
-
end # each_with_index
|
291
|
-
|
292
|
-
tr.export!
|
293
|
-
tr.reload!
|
237
|
+
translator = I18n::Translate::Translator.new(options[:locale], options)
|
238
|
+
translator.run
|
239
|
+
|
294
240
|
else
|
295
241
|
|
296
242
|
I18n::Translate.scan(options) do |tr|
|
297
|
-
# skip if not desired locale
|
298
|
-
next if options[:locale] and (options[:locale] != tr.lang)
|
299
|
-
|
300
243
|
process_locale(tr, command, options)
|
301
244
|
end
|
302
245
|
|
@@ -9,19 +9,60 @@ require 'find'
|
|
9
9
|
spec = Gem::Specification.new do |s|
|
10
10
|
s.platform = Gem::Platform::RUBY
|
11
11
|
s.summary = "I18n transation utility which helps to manage files with locales."
|
12
|
+
s.homepage = "http://github.com/pejuko/i18n-translators-tools"
|
12
13
|
s.email = "pejuko@gmail.com"
|
13
14
|
s.authors = ["Petr Kovar"]
|
14
15
|
s.name = 'i18n-translators-tools'
|
15
|
-
s.version = '0.
|
16
|
-
s.date = '2010-07-
|
16
|
+
s.version = '0.2'
|
17
|
+
s.date = '2010-07-27'
|
17
18
|
s.add_dependency('i18n', '>= 0.4.1')
|
18
19
|
s.add_dependency('ya2yaml')
|
19
20
|
s.require_path = 'lib'
|
20
|
-
s.files = ["bin/i18n-translate", "
|
21
|
+
s.files = ["bin/i18n-translate", "README.md", "i18n-translators-tools.gemspec", "Rakefile"]
|
22
|
+
s.files += Dir["lib/**/*.rb", "test/**/*.{rb,yml,po}"]
|
21
23
|
s.executables = ["i18n-translate"]
|
24
|
+
s.post_install_message = <<EOF
|
25
|
+
=======================================================================
|
26
|
+
|
27
|
+
I18N TRANSLATORS TOOLS
|
28
|
+
|
29
|
+
-----------------------------------------------------------------------
|
30
|
+
|
31
|
+
Supported formats:
|
32
|
+
* yml
|
33
|
+
* rb
|
34
|
+
* ts
|
35
|
+
* po
|
36
|
+
* properties
|
37
|
+
|
38
|
+
Backends:
|
39
|
+
* Extended format. i18n-translators-tools bring extended format
|
40
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::Translator)
|
41
|
+
* Gettext po
|
42
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::PO)
|
43
|
+
* QT Linguist TS
|
44
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::TS)
|
45
|
+
* Java Properties files
|
46
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::Properties)
|
47
|
+
|
48
|
+
Functions:
|
49
|
+
* merge
|
50
|
+
* convert
|
51
|
+
* translate (built-in simple console translator)
|
52
|
+
* statistics
|
53
|
+
|
54
|
+
For more information read README.md and CHANGELOG.md
|
55
|
+
|
56
|
+
-----------------------------------------------------------------------
|
57
|
+
|
58
|
+
http://github.com/pejuko/i18n-translators-tools
|
59
|
+
|
60
|
+
=======================================================================
|
61
|
+
EOF
|
22
62
|
s.description = <<EOF
|
23
63
|
This package brings you useful utility which can help you to handle locale files
|
24
64
|
and translations in your Ruby projects. Offers also built-in simple console editor.
|
65
|
+
Supported formats are YAML, Ruby, Gettext po, QT Linguist TS and Java Properties.
|
25
66
|
Read README.md file and run i18n-translate without parameters for more information.
|
26
67
|
EOF
|
27
68
|
end
|
data/lib/i18n-translate.rb
CHANGED
@@ -9,5 +9,10 @@ dir = File.expand_path(File.dirname(__FILE__))
|
|
9
9
|
$:.unshift(dir) unless $:.include?(dir)
|
10
10
|
|
11
11
|
require 'i18n/backend/translate'
|
12
|
+
require 'i18n/backend/po'
|
13
|
+
require 'i18n/backend/ts'
|
14
|
+
require 'i18n/backend/properties'
|
12
15
|
require 'i18n/translate'
|
16
|
+
require 'i18n/processor'
|
17
|
+
require 'i18n/translator'
|
13
18
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# vi: fenc=utf-8:expandtab:ts=2:sw=2:sts=2
|
3
|
+
#
|
4
|
+
# @author: Petr Kovar <pejuko@gmail.com>
|
5
|
+
|
6
|
+
module I18n::Backend
|
7
|
+
|
8
|
+
# to use po files generated (e.g: by merge) by i18n-translate you should
|
9
|
+
# include this backend istead of I18n::Backend::Gettext
|
10
|
+
#
|
11
|
+
# I18n::Backend::Simple.send(:include, I18n::Backend::PO)
|
12
|
+
module PO
|
13
|
+
protected
|
14
|
+
def load_po(fname)
|
15
|
+
locale = ::File.basename(fname, '.po')
|
16
|
+
tr = I18n::Translate::Translate.new(locale, {:empty => true})
|
17
|
+
data = I18n::Translate::Processor::Gettext.new(fname, tr).read
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# vi: fenc=utf-8:expandtab:ts=2:sw=2:sts=2
|
3
|
+
#
|
4
|
+
# @author: Petr Kovar <pejuko@gmail.com>
|
5
|
+
|
6
|
+
module I18n::Backend
|
7
|
+
|
8
|
+
# to use Java properties files you should just include this backend
|
9
|
+
#
|
10
|
+
# I18n::Backend::Simple.send(:include, I18n::Backend::Properties)
|
11
|
+
module Properties
|
12
|
+
protected
|
13
|
+
def load_properties(fname)
|
14
|
+
locale = ::File.basename(fname, '.properties')
|
15
|
+
tr = I18n::Translate::Translate.new(locale, {:empty => true})
|
16
|
+
data = I18n::Translate::Processor::Properties.new(fname, tr).read
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|