i18n-magic 1.0.0 → 1.1.0
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/Gemfile.lock +16 -8
- data/Guardfile +4 -4
- data/README.md +34 -1
- data/i18n-magic.gemspec +1 -0
- data/lib/i18n/magic.rb +1 -1
- data/lib/i18n/magic/commands/add.rb +5 -5
- data/lib/i18n/magic/entity/alphabet.rb +13 -2
- data/lib/i18n/magic/entity/translation_file.rb +11 -5
- data/lib/i18n/magic/helpers/environment.rb +6 -3
- data/lib/i18n/magic/helpers/string_ops.rb +4 -33
- data/lib/i18n/magic/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ceb29c304d96f0d2c975648c3476a9be2305fce
|
4
|
+
data.tar.gz: e117982cdee614cf719a94f88f898fc97a0a55da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63e0859c2b34f58878a09a8e3a6726289d9b1d22d1f13539d418907cd47cb246c56ff7a68d3b18c4d7cbf6d36970708b39ddd3b3141e860cdfaacf6e3d5719fd
|
7
|
+
data.tar.gz: e5ab85abb44a4bc3351f16a22f7ac7c60e1b0719c8c6a5d161b6aa62a6c22b228c90a939450e36ba2c902c005d81bbfb68b18421733e1ebc461c68442991736a
|
data/Gemfile.lock
CHANGED
@@ -1,21 +1,22 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
i18n-magic (1.
|
4
|
+
i18n-magic (1.1.0)
|
5
5
|
activesupport
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activesupport (5.1.
|
10
|
+
activesupport (5.1.6)
|
11
11
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
|
-
i18n (
|
12
|
+
i18n (>= 0.7, < 2)
|
13
13
|
minitest (~> 5.1)
|
14
14
|
tzinfo (~> 1.1)
|
15
15
|
ast (2.4.0)
|
16
16
|
coderay (1.1.2)
|
17
17
|
concurrent-ruby (1.0.5)
|
18
18
|
diff-lcs (1.3)
|
19
|
+
docile (1.3.0)
|
19
20
|
ffi (1.9.23)
|
20
21
|
formatador (0.2.5)
|
21
22
|
guard (2.14.2)
|
@@ -35,13 +36,14 @@ GEM
|
|
35
36
|
guard-rubocop (1.3.0)
|
36
37
|
guard (~> 2.0)
|
37
38
|
rubocop (~> 0.20)
|
38
|
-
i18n (0.
|
39
|
+
i18n (1.0.0)
|
39
40
|
concurrent-ruby (~> 1.0)
|
41
|
+
json (2.1.0)
|
40
42
|
listen (3.1.5)
|
41
43
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
42
44
|
rb-inotify (~> 0.9, >= 0.9.7)
|
43
45
|
ruby_dep (~> 1.2)
|
44
|
-
lumberjack (1.0.
|
46
|
+
lumberjack (1.0.13)
|
45
47
|
method_source (0.9.0)
|
46
48
|
minitest (5.11.3)
|
47
49
|
nenv (0.3.0)
|
@@ -49,7 +51,7 @@ GEM
|
|
49
51
|
nenv (~> 0.1)
|
50
52
|
shellany (~> 0.0)
|
51
53
|
parallel (1.12.1)
|
52
|
-
parser (2.5.0.
|
54
|
+
parser (2.5.0.5)
|
53
55
|
ast (~> 2.4.0)
|
54
56
|
powerpack (0.1.1)
|
55
57
|
pry (0.11.3)
|
@@ -72,8 +74,8 @@ GEM
|
|
72
74
|
rspec-mocks (3.7.0)
|
73
75
|
diff-lcs (>= 1.2.0, < 2.0)
|
74
76
|
rspec-support (~> 3.7.0)
|
75
|
-
rspec-support (3.7.
|
76
|
-
rubocop (0.
|
77
|
+
rspec-support (3.7.1)
|
78
|
+
rubocop (0.54.0)
|
77
79
|
parallel (~> 1.10)
|
78
80
|
parser (>= 2.5)
|
79
81
|
powerpack (~> 0.1)
|
@@ -83,6 +85,11 @@ GEM
|
|
83
85
|
ruby-progressbar (1.9.0)
|
84
86
|
ruby_dep (1.5.0)
|
85
87
|
shellany (0.0.1)
|
88
|
+
simplecov (0.16.1)
|
89
|
+
docile (~> 1.1)
|
90
|
+
json (>= 1.8, < 3)
|
91
|
+
simplecov-html (~> 0.10.0)
|
92
|
+
simplecov-html (0.10.2)
|
86
93
|
thor (0.20.0)
|
87
94
|
thread_safe (0.3.6)
|
88
95
|
tzinfo (1.2.5)
|
@@ -100,6 +107,7 @@ DEPENDENCIES
|
|
100
107
|
i18n-magic!
|
101
108
|
rake (~> 10.0)
|
102
109
|
rspec (~> 3.0)
|
110
|
+
simplecov
|
103
111
|
|
104
112
|
BUNDLED WITH
|
105
113
|
1.16.1
|
data/Guardfile
CHANGED
@@ -69,7 +69,7 @@ guard :rspec, cmd: "bundle exec rspec" do
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
guard :rubocop do
|
73
|
-
|
74
|
-
|
75
|
-
end
|
72
|
+
# guard :rubocop do
|
73
|
+
# watch(%r{.+\.rb$})
|
74
|
+
# watch(%r{(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m[0]) }
|
75
|
+
# end
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# I18n::Magic
|
2
2
|
|
3
3
|
[](https://codeclimate.com/github/a-smadi/i18n-magic/maintainability)
|
4
|
+
[](https://codeclimate.com/github/a-smadi/i18n-magic/test_coverage)
|
4
5
|
[](https://travis-ci.org/a-smadi/i18n-magic)
|
5
6
|
|
6
7
|
Easy localization management for Ruby projects that are using the i18n gem.
|
@@ -31,7 +32,39 @@ You can run tests using `rake` or `rake spec`
|
|
31
32
|
|
32
33
|
## Usage
|
33
34
|
|
34
|
-
|
35
|
+
Currently theres only a single command available; `add` which automatically adds the translation record alphabetically ordered into the file it reckons suitable.
|
36
|
+
|
37
|
+
The `add` command may be used in 2 different ways:
|
38
|
+
|
39
|
+
1- Adding translations as input after running the command. (useful when adding translations with special characters)
|
40
|
+
|
41
|
+
```
|
42
|
+
i18n-magic add hello_world
|
43
|
+
```
|
44
|
+
and the user will be prompted to enter translations for that key after running the command.
|
45
|
+
|
46
|
+
PS: The key can be in snake_case or CamelCase.
|
47
|
+
|
48
|
+
```
|
49
|
+
i18n-magic add hello_world
|
50
|
+
```
|
51
|
+
and
|
52
|
+
```
|
53
|
+
i18n-magic add HelloWorld
|
54
|
+
```
|
55
|
+
are both acceptable.
|
56
|
+
|
57
|
+
|
58
|
+
2- Adding multiple translation values using a single command. (experimental feature / may be faulty for projects handling locales with somewhat similar alphabets)
|
59
|
+
|
60
|
+
```
|
61
|
+
i18n-magic add hello_world "Hello, World!" "مرحبا"
|
62
|
+
```
|
63
|
+
PS: precednece of values doesn't have any effect. As long as the key comes first, i18n-magic will automatically recognise the translation values locales, so
|
64
|
+
```
|
65
|
+
i18n-magic add hello_world "مرحبا" "Hello, World!"
|
66
|
+
```
|
67
|
+
is also acceptable.
|
35
68
|
|
36
69
|
## License
|
37
70
|
|
data/i18n-magic.gemspec
CHANGED
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_development_dependency "guard"
|
37
37
|
spec.add_development_dependency "guard-rspec"
|
38
38
|
spec.add_development_dependency "guard-rubocop"
|
39
|
+
spec.add_development_dependency "simplecov"
|
39
40
|
|
40
41
|
spec.add_dependency "activesupport"
|
41
42
|
end
|
data/lib/i18n/magic.rb
CHANGED
@@ -63,7 +63,7 @@ module I18n
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def add
|
66
|
-
I18n::Magic::Commands::Add.new(key: @args[1], values: @args[2..-1]).execute
|
66
|
+
I18n::Magic::Commands::Add.new(key: @args[1], values: @args[2..-1], locale_files_path: I18n::Magic::Helpers::Environment::LOCALE_FILES_PATH).execute
|
67
67
|
end
|
68
68
|
|
69
69
|
def server
|
@@ -20,12 +20,12 @@ module I18n
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def add_values_from_input
|
23
|
-
I18n::Magic::Helpers::Environment.locales.each do |locale|
|
24
|
-
print "#{locale} for #{@options[:key]} (empty to
|
23
|
+
I18n::Magic::Helpers::Environment.locales(@options[:locale_files_path]).each do |locale|
|
24
|
+
print "#{locale} value for #{@options[:key]} (empty to skip) : "
|
25
25
|
value = STDIN.gets
|
26
26
|
record = I18n::Magic::Entity::TranslationRecord.new(@options[:key], value)
|
27
27
|
next unless record.valid?
|
28
|
-
translation_file = I18n::Magic::Entity::TranslationFile.new(locale)
|
28
|
+
translation_file = I18n::Magic::Entity::TranslationFile.new(locale, @options[:locale_files_path])
|
29
29
|
abort('translation file does not exist !') unless translation_file.exists?
|
30
30
|
translation_file.add(record)
|
31
31
|
end
|
@@ -36,8 +36,8 @@ module I18n
|
|
36
36
|
next unless value.present?
|
37
37
|
record = I18n::Magic::Entity::TranslationRecord.new(@options[:key], value)
|
38
38
|
abort('invalid key,value pair !') unless record.valid?
|
39
|
-
locale = I18n::Magic::Helpers::StringOps.locale(value)
|
40
|
-
translation_file = I18n::Magic::Entity::TranslationFile.new(locale)
|
39
|
+
locale = I18n::Magic::Helpers::StringOps.locale(value, @options[:locale_files_path])
|
40
|
+
translation_file = I18n::Magic::Entity::TranslationFile.new(locale, @options[:locale_files_path])
|
41
41
|
abort('translation file does not exist !') unless translation_file.exists?
|
42
42
|
translation_file.add(record)
|
43
43
|
end
|
@@ -6,8 +6,19 @@ module I18n
|
|
6
6
|
class Alphabet
|
7
7
|
attr_reader :letters
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
EN_LETTERS = %w[a b c d e f g h i j k l m n o p q r s t u v w x y z].freeze
|
10
|
+
AR_LETTERS = %w[ا ب ج د ه و ز ح ط ي ك ل لا م ن س ع ف ص ق ر ش ت ث خ ذ ض ظ غ].freeze
|
11
|
+
RU_LETTERS = %w[а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ыь э ю я і ѳ ѣ ѵ ѕ ѯ ѱ ѡ ѫ ѧ ѭ ѩ Ѩ Ѭ Ѧ Ѫ Ѡ Ѱ Ѯ Ѕ Ѵ Ѣ Ѳ І Я Ю Э Ь Ы Ъ Щ Ш Ч Ц Х Ф У П Л Й И З Ж Ё Д Г Б].freeze
|
12
|
+
DE_LETTERS = %w[a b c d e f g h i j k l m n o p q r s t u v w x y z ä ö ü Ä Ö Ü ß].freeze
|
13
|
+
FR_LETTERS = %w[a b c d e f g h i j k l m n o p q r s t u v w x y z é è ç ë ò ô ö ù à â].freeze
|
14
|
+
ES_LETTERS = %w[a b c d e é f g h i í j k l m n ñ o ó p q r s t u ú v w x y z].freeze
|
15
|
+
HE_LETTERS = %w[א בּ ב ג ד ה ו ז ח ט י כּ כ ךּ ך ל מ ם נ ן ס ע פּ פ ף צ ץ ק ר שׁ שׂ תּ ת].freeze
|
16
|
+
ZH_LETTERS = %w[ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㄭ].freeze
|
17
|
+
JA_LETTERS = %w[あ い う え お か き く け こ が ぎ ぐ げ ご さ し す せ そ ざ じ ず ぜ ぞ た ち つ て と だ ぢ づ で ど な に ぬ ね の は ひ ふ へ ほ ば び ぶ べ ぼ ぱ ぴ ぷ ぺ ぽ ま み む め も や ゆ よ ら り る れ ろ わ を ん].freeze
|
18
|
+
TR_LETTERS = %w[a b c ç d e f g ğ h ı i j k l m n o ö p r s ş t u ü v y z Ü Ş Ö Ğ Ç].freeze
|
19
|
+
|
20
|
+
def initialize(locale = nil)
|
21
|
+
@letters = eval("#{locale.upcase}_LETTERS") rescue %w[]
|
11
22
|
end
|
12
23
|
|
13
24
|
def learn(sample_text)
|
@@ -6,9 +6,9 @@ module I18n
|
|
6
6
|
module Magic
|
7
7
|
module Entity
|
8
8
|
class TranslationFile
|
9
|
-
def initialize(locale)
|
9
|
+
def initialize(locale, locale_files_path = I18n::Magic::Helpers::Environment::LOCALE_FILES_PATH)
|
10
10
|
@locale = locale
|
11
|
-
@filename = "
|
11
|
+
@filename = "#{locale_files_path}#{locale.downcase}.yml"
|
12
12
|
end
|
13
13
|
|
14
14
|
def exists?
|
@@ -40,6 +40,14 @@ module I18n
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def compatibility_score(text)
|
43
|
+
locale_alphabet = I18n::Magic::Entity::Alphabet.new(@locale)
|
44
|
+
locale_alphabet = learned_alphabet unless locale_alphabet.letters.any?
|
45
|
+
locale_alphabet.belonging_score(text)
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def learned_alphabet
|
43
51
|
locale_alphabet = I18n::Magic::Entity::Alphabet.new
|
44
52
|
open(@filename, 'r+') do |file|
|
45
53
|
%w[A B C D E F G H I J K L M N O P Q R S T U V W X Y Z].each do |letter|
|
@@ -53,11 +61,9 @@ module I18n
|
|
53
61
|
locale_alphabet.learn(sample_text)
|
54
62
|
end
|
55
63
|
end
|
56
|
-
locale_alphabet
|
64
|
+
locale_alphabet
|
57
65
|
end
|
58
66
|
|
59
|
-
private
|
60
|
-
|
61
67
|
def find(keyword)
|
62
68
|
count = 0
|
63
69
|
File.open(@filename, 'r') do |file|
|
@@ -2,9 +2,12 @@ module I18n
|
|
2
2
|
module Magic
|
3
3
|
module Helpers
|
4
4
|
class Environment
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
LOCALE_FILES_PATH = 'config/locales/'.freeze
|
6
|
+
LOCALE_FILES_SAMPLE_PATH = 'spec/sample/config/locales/'.freeze
|
7
|
+
|
8
|
+
def self.locales(locale_files_path = LOCALE_FILES_PATH)
|
9
|
+
locale_files = Dir["#{locale_files_path}*.yml"].select { |f| f =~ %r/\/[a-z]{2}.yml/ }
|
10
|
+
locale_files.map { |f| f.remove(locale_files_path).remove('.yml').upcase }
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
@@ -8,12 +8,12 @@ module I18n
|
|
8
8
|
text.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z\d])([A-Z])/, '\1_\2').tr('-', '_').downcase
|
9
9
|
end
|
10
10
|
|
11
|
-
def self.locale(text)
|
12
|
-
locales = I18n::Magic::Helpers::Environment.locales
|
11
|
+
def self.locale(text, locale_files_path = I18n::Magic::Helpers::Environment::LOCALE_FILES_PATH)
|
12
|
+
locales = I18n::Magic::Helpers::Environment.locales(locale_files_path)
|
13
13
|
text_locale = locales[0]
|
14
14
|
score = 0
|
15
15
|
locales.each do |locale|
|
16
|
-
locale_score = I18n::Magic::Entity::TranslationFile.new(locale).compatibility_score(text)
|
16
|
+
locale_score = I18n::Magic::Entity::TranslationFile.new(locale, locale_files_path).compatibility_score(text)
|
17
17
|
if locale_score > score
|
18
18
|
text_locale = locale
|
19
19
|
score = locale_score
|
@@ -23,36 +23,7 @@ module I18n
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def self.letters_only(text)
|
26
|
-
text.
|
27
|
-
.tr('!', '')
|
28
|
-
.tr('?', '')
|
29
|
-
.tr('@', '')
|
30
|
-
.tr('#', '')
|
31
|
-
.tr('$', '')
|
32
|
-
.tr('%', '')
|
33
|
-
.tr('^', '')
|
34
|
-
.tr('&', '')
|
35
|
-
.tr('*', '')
|
36
|
-
.tr('(', '')
|
37
|
-
.tr(')', '')
|
38
|
-
.tr('[', '')
|
39
|
-
.tr(']', '')
|
40
|
-
.tr('{', '')
|
41
|
-
.tr('}', '')
|
42
|
-
.tr(':', '')
|
43
|
-
.tr(';', '')
|
44
|
-
.tr('\'', '')
|
45
|
-
.tr('"', '')
|
46
|
-
.tr('`', '')
|
47
|
-
.tr('\\', '')
|
48
|
-
.tr('/', '')
|
49
|
-
.tr('<', '')
|
50
|
-
.tr('>', '')
|
51
|
-
.tr('.', '')
|
52
|
-
.tr(',', '')
|
53
|
-
.tr('|', '')
|
54
|
-
.tr(' ', '')
|
55
|
-
.strip.downcase
|
26
|
+
text.gsub(%r/[0-9]|\^|\[|\]|\\|\||\/|[ !?.,@#$%&*(){}:'"`<>]/, '').strip.downcase
|
56
27
|
end
|
57
28
|
end
|
58
29
|
end
|
data/lib/i18n/magic/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: i18n-magic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ali Smadi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: activesupport
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|