motion-i18n 0.0.5 → 0.0.6
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/.gitignore +11 -0
- data/Gemfile +6 -0
- data/README.md +79 -0
- data/Rakefile +24 -0
- data/app/app_delegate.rb +7 -0
- data/lib/motion-i18n-android/i18n.rb +19 -0
- data/lib/motion-i18n-android/translate.rb +48 -0
- data/lib/motion-i18n-ios/i18n.rb +16 -0
- data/lib/motion-i18n-ios/translate.rb +40 -0
- data/lib/motion-i18n.rb +27 -0
- data/motion-i18n.gemspec +18 -0
- data/resources/en.lproj/Localizable.strings +3 -0
- data/spec/motion-i18n/i18n_spec.rb +29 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d676471d45904385e6697965801e24e5e2d9735b
|
4
|
+
data.tar.gz: f9fb82da081092ea176ea5dea420e53ae371c5d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0febb52ac33d19e9df01ec8ac9b54610a92921c8e227161e0a1ab18720b63a621f9c06f6a947f3c1835166f092eed315da1a738f5f039c1e7d42c9d4a32eba36
|
7
|
+
data.tar.gz: b4a62246aabf6aefb5fd533a85e873f6a4d7bdf94ed4565ee359a05ec39b642a766dc14718450ecaba1b5e83930b108c82b0ed379526e372140afe09f84d8962
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# MotionI18n
|
2
|
+
|
3
|
+
Rails-style translations for RubyMotion apps.
|
4
|
+
|
5
|
+
This gem allows you to specify your RubyMotion translations as `.yml` files. The translations are automatically converted to Cocoa's native format for translations.
|
6
|
+
|
7
|
+
# Installation
|
8
|
+
|
9
|
+
```
|
10
|
+
gem install motion-i18n
|
11
|
+
```
|
12
|
+
|
13
|
+
and in your `Rakefile`:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
require 'motion-i18n'
|
17
|
+
```
|
18
|
+
|
19
|
+
or using bundler:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
gem "motion-i18n"
|
23
|
+
```
|
24
|
+
|
25
|
+
# Usage
|
26
|
+
|
27
|
+
Put your translations in YAML files in `config/locales/`. For each locale there should be a file named as the locale with the extension `.yml`, e.g. `en.yml`, `de.yml` etc.
|
28
|
+
|
29
|
+
## Translations
|
30
|
+
|
31
|
+
For a guide on how the translation files should look like, see <http://guides.rubyonrails.org/i18n.html#adding-translations>
|
32
|
+
|
33
|
+
To translate a string, use `I18n.translate` or the shortcut `I18n.t` like this:
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
I18n.t("main_screen.title")
|
37
|
+
```
|
38
|
+
|
39
|
+
To substitute variables in the string, specify the substitutions in second a hash argument
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
I18n.t("maps.directions", :from => origin, :to => destination)
|
43
|
+
```
|
44
|
+
|
45
|
+
## Locale
|
46
|
+
|
47
|
+
You can get the current locale by calling
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
I18n.locale
|
51
|
+
```
|
52
|
+
|
53
|
+
## Workflow
|
54
|
+
|
55
|
+
This gem works perfectly together with the `i18n_tools` gem:
|
56
|
+
|
57
|
+
```
|
58
|
+
gem install i18n_tools
|
59
|
+
```
|
60
|
+
|
61
|
+
or in `Gemfile`;
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
gem "i18n_tools", :require => "i18n_tools/tasks"
|
65
|
+
```
|
66
|
+
|
67
|
+
The gem will give you the tasks `rake translations:missing` which shows untranslated strings as well as `rake translations:unused` which shows strings which are translated but not used in the code. For more information, see [i18n_tools](https://github.com/tkadauke/i18n_tools).
|
68
|
+
|
69
|
+
# Warning
|
70
|
+
|
71
|
+
For each locale `loc`, this gem overwrites the file `resources/loc.lproj/Localizable.strings` before building. Make sure you don't edit this file. Also, you should add these files to `.gitignore`:
|
72
|
+
|
73
|
+
```
|
74
|
+
Localizable.strings
|
75
|
+
```
|
76
|
+
|
77
|
+
# Forking
|
78
|
+
|
79
|
+
Feel free to fork and submit pull requests!
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
$:.unshift("/Library/RubyMotion/lib")
|
3
|
+
|
4
|
+
if ENV['android']
|
5
|
+
require 'motion/project/template/android'
|
6
|
+
elsif ENV['osx']
|
7
|
+
require 'motion/project/template/osx'
|
8
|
+
else
|
9
|
+
require 'motion/project/template/ios'
|
10
|
+
end
|
11
|
+
|
12
|
+
require './lib/motion-i18n'
|
13
|
+
|
14
|
+
begin
|
15
|
+
require 'bundler'
|
16
|
+
require 'motion/project/template/gem/gem_tasks'
|
17
|
+
Bundler.require
|
18
|
+
rescue LoadError
|
19
|
+
end
|
20
|
+
|
21
|
+
Motion::Project::App.setup do |app|
|
22
|
+
# Use `rake config' to see complete project settings.
|
23
|
+
app.name = 'MotionI18n'
|
24
|
+
end
|
data/app/app_delegate.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module I18n
|
2
|
+
class << self
|
3
|
+
def translate(key, substitutions = {})
|
4
|
+
pkg_name = RMQ.app.context.getPackageName # please use RMQ for now.
|
5
|
+
id = RMQ.app.resources.getIdentifier(key.gsub(" ", "_"), "string", pkg_name)
|
6
|
+
str = RMQ.app.resources.getString(id)
|
7
|
+
str.tap do |result|
|
8
|
+
substitutions.each do |key, value|
|
9
|
+
result.gsub!("%{#{key}}", value.to_s)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
alias_method :t, :translate
|
14
|
+
|
15
|
+
def locale
|
16
|
+
Java::Util::Locale.getDefault
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
def droid_convert(file, namespace, value)
|
2
|
+
if value.is_a?(Hash)
|
3
|
+
value.each do |key, value|
|
4
|
+
droid_convert(file, "#{namespace}.#{key}", value)
|
5
|
+
end
|
6
|
+
else
|
7
|
+
encoded_val = value.to_s.gsub("'", "'").gsub('"', """).encode(:xml => :text)
|
8
|
+
encoded_name = namespace.to_s.gsub(" ", "_")
|
9
|
+
file.puts %{<string name="#{encoded_name}">#{encoded_val}</string>}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def droid_translate
|
14
|
+
require 'i18n'
|
15
|
+
|
16
|
+
files = Dir.glob("config/locales/*.yml")
|
17
|
+
|
18
|
+
I18n.load_path.clear
|
19
|
+
I18n.load_path << files
|
20
|
+
|
21
|
+
files.each do |locale_file|
|
22
|
+
locale = File.basename(locale_file).sub(".yml", "")
|
23
|
+
|
24
|
+
all_translations = I18n.backend.send(:lookup, locale.to_sym, "")
|
25
|
+
FileUtils.mkdir_p("resources/values-#{locale}")
|
26
|
+
File.open("resources/values-#{locale}/strings.xml", 'w') do |file|
|
27
|
+
file.puts '<?xml version ="1.0" encoding ="utf-8"?>'
|
28
|
+
file.puts '<resources>'
|
29
|
+
all_translations.each do |key, value|
|
30
|
+
droid_convert(file, key, value)
|
31
|
+
end
|
32
|
+
file.puts '</resources>'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
# get rid of annoying warnings
|
36
|
+
FileUtils.mkdir_p("resources/values-en")
|
37
|
+
FileUtils.cp("resources/values-en/strings.xml", "resources/values/strings.xml")
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Translate (android)"
|
41
|
+
task :translate do
|
42
|
+
droid_translate
|
43
|
+
end
|
44
|
+
|
45
|
+
namespace :build do
|
46
|
+
task :simulator => :translate
|
47
|
+
task :device => :translate
|
48
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module I18n
|
2
|
+
class << self
|
3
|
+
def translate(key, substitutions = {})
|
4
|
+
String.new((NSBundle.mainBundle.localizedStringForKey(key, value:"", table:nil))).tap do |result|
|
5
|
+
substitutions.each do |key, value|
|
6
|
+
result.gsub!("%{#{key}}", value.to_s)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
alias t translate
|
11
|
+
|
12
|
+
def locale
|
13
|
+
NSLocale.preferredLanguages.first
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
def convert(file, namespace, value)
|
2
|
+
if value.is_a?(Hash)
|
3
|
+
value.each do |key, value|
|
4
|
+
convert(file, "#{namespace}.#{key}", value)
|
5
|
+
end
|
6
|
+
else
|
7
|
+
file.puts %{"#{namespace}" = "#{value.to_s}";}
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def ios_translate
|
12
|
+
require 'i18n'
|
13
|
+
|
14
|
+
files = Dir.glob("config/locales/*.yml")
|
15
|
+
|
16
|
+
I18n.load_path.clear
|
17
|
+
I18n.load_path << files
|
18
|
+
|
19
|
+
files.each do |locale_file|
|
20
|
+
locale = File.basename(locale_file).sub(".yml", "")
|
21
|
+
|
22
|
+
all_translations = I18n.backend.send(:lookup, locale.to_sym, "")
|
23
|
+
FileUtils.mkdir_p("resources/#{locale}.lproj")
|
24
|
+
File.open("resources/#{locale}.lproj/Localizable.strings", 'w') do |file|
|
25
|
+
all_translations.each do |key, value|
|
26
|
+
convert(file, key, value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Translate (ios)"
|
33
|
+
task :translate do
|
34
|
+
ios_translate
|
35
|
+
end
|
36
|
+
|
37
|
+
namespace :build do
|
38
|
+
task :simulator => :translate
|
39
|
+
task :device => :translate
|
40
|
+
end
|
data/lib/motion-i18n.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'motion-require'
|
2
|
+
|
3
|
+
platform = Motion::Project::App.respond_to?(:template) ? Motion::Project::App.template : :ios
|
4
|
+
if platform.to_s.start_with?('ios') or platform.to_s.start_with?('osx')
|
5
|
+
platform_name = 'ios'
|
6
|
+
elsif platform.to_s.start_with?('android')
|
7
|
+
platform_name = 'android'
|
8
|
+
end
|
9
|
+
|
10
|
+
require "motion-i18n-#{platform_name}/translate"
|
11
|
+
|
12
|
+
Motion::Project::App.setup do |app|
|
13
|
+
platform_lib = File.join(File.dirname(__FILE__), "motion-i18n-#{platform_name}")
|
14
|
+
unless File.exists? platform_lib
|
15
|
+
raise "Sorry, the platform #{platform.inspect} (aka #{platform_name}) is not supported by motion-i18n"
|
16
|
+
end
|
17
|
+
|
18
|
+
# scans app.files until it finds app/ (the default)
|
19
|
+
# if found, it inserts just before those files, otherwise it will insert to
|
20
|
+
# the end of the list
|
21
|
+
insert_point = app.files.find_index { |file| file =~ /^(?:\.\/)?app\// } || 0
|
22
|
+
|
23
|
+
Dir.glob(File.join(platform_lib, 'i18n.rb')).reverse.each do |file|
|
24
|
+
app.files.insert(insert_point, file)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
data/motion-i18n.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
Gem::Specification.new do |s|
|
3
|
+
s.name = "motion-i18n"
|
4
|
+
s.version = "0.0.6"
|
5
|
+
s.authors = ["Thomas Kadauke"]
|
6
|
+
s.email = ["thomas.kadauke@googlemail.com"]
|
7
|
+
s.homepage = "https://github.com/tkadauke/motion-i18n"
|
8
|
+
s.summary = "Wrapper for translations in RubyMotion"
|
9
|
+
s.description = "Wrapper for translations in RubyMotion"
|
10
|
+
|
11
|
+
s.files = `git ls-files`.split($\)
|
12
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
13
|
+
s.require_paths = ["lib"]
|
14
|
+
|
15
|
+
s.add_dependency 'motion-require'
|
16
|
+
s.add_dependency 'i18n'
|
17
|
+
s.add_development_dependency 'rake'
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
describe "I18n" do
|
2
|
+
describe "translate" do
|
3
|
+
it "should translate string" do
|
4
|
+
I18n.translate("test.string").should == "Test string"
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should return key for untranslated string" do
|
8
|
+
I18n.translate("foo.bar").should == "foo.bar"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should plug in substitutions" do
|
12
|
+
I18n.translate("test.substitutions", :count => 5).should == "5 substitutions"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "substitutes multiple instances" do
|
16
|
+
I18n.translate("test.multiple_substitutions", :count => 5).should == "5 substitutions 5"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have shortcut" do
|
20
|
+
I18n.t("test.string").should == I18n.translate("test.string")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "locale" do
|
25
|
+
it "should return the current locale" do
|
26
|
+
I18n.locale.should == "en-US"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-i18n
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Kadauke
|
@@ -58,7 +58,20 @@ email:
|
|
58
58
|
executables: []
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
|
-
files:
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- README.md
|
65
|
+
- Rakefile
|
66
|
+
- app/app_delegate.rb
|
67
|
+
- lib/motion-i18n-android/i18n.rb
|
68
|
+
- lib/motion-i18n-android/translate.rb
|
69
|
+
- lib/motion-i18n-ios/i18n.rb
|
70
|
+
- lib/motion-i18n-ios/translate.rb
|
71
|
+
- lib/motion-i18n.rb
|
72
|
+
- motion-i18n.gemspec
|
73
|
+
- resources/en.lproj/Localizable.strings
|
74
|
+
- spec/motion-i18n/i18n_spec.rb
|
62
75
|
homepage: https://github.com/tkadauke/motion-i18n
|
63
76
|
licenses: []
|
64
77
|
metadata: {}
|
@@ -82,4 +95,5 @@ rubygems_version: 2.2.2
|
|
82
95
|
signing_key:
|
83
96
|
specification_version: 4
|
84
97
|
summary: Wrapper for translations in RubyMotion
|
85
|
-
test_files:
|
98
|
+
test_files:
|
99
|
+
- spec/motion-i18n/i18n_spec.rb
|