russian 0.0.7 → 0.0.8

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.
@@ -182,6 +182,19 @@ Russian.p(3.14, "вещь", "вещи", "вещей", "вещи") # послед
182
182
 
183
183
  -- упрощенная (без использования хешей I18n) плюрализация для русского языка
184
184
 
185
+ <pre><code>
186
+ Russian::transliterate
187
+ Russian::translit
188
+
189
+ Russian.translit("рубин")
190
+ => "rubin"
191
+ Russian.translit("Hallo Юлику Тарханову")
192
+ => "Hallo Yuliku Tarhanovu"
193
+ </code></pre>
194
+
195
+ -- транслитерация русских букв в строке.
196
+
197
+
185
198
  h2. Ruby on Rails
186
199
 
187
200
  h3. Переводы
@@ -218,7 +231,6 @@ ru-RU:
218
231
  <label for="user_name">Имя</label>
219
232
  </code></pre>
220
233
 
221
-
222
234
  h3. Валидация
223
235
 
224
236
  Обработка ошибок в ActiveRecord перегружается -- в Russian включен популярный плагин custom_error_message, с помощью которого можно переопределять стандартное отображение сообщений об ошибках. Так, например,
@@ -245,8 +257,32 @@ h3. Валидация
245
257
 
246
258
  _NB:_ в сообщениях валидации можно использовать такие макросы как @{{attribute}}@, @{{value}}@ -- подробнее см. документацию по I18n.
247
259
 
260
+ h3. Параметризация строк
261
+
262
+ Перегружается метод @parameterize@ инфлектора ActiveSupport (он же -- @String#parameterize@), теперь в нем идет транслитерация букв русского алфавита.
263
+
264
+ Пример:
265
+
266
+ <pre><code>
267
+ class Person
268
+ def to_param
269
+ "#{id}-#{name.parameterize}"
270
+ end
271
+ end
272
+
273
+ @person = Person.find(1)
274
+ # => #<Person id: 1, name: "Дональд Кнут">
275
+
276
+ <%= link_to(@person.name, person_path %>
277
+ # => <a href="/person/1-donald-knut">Дональд Кнут</a>
278
+ </code></pre>
279
+
248
280
  h1. Автор
249
281
 
250
282
  Для сообщений об ошибках, обнаруженных неточностях и предложений:
251
283
 
252
284
  Ярослав Маркин ("yaroslav@markin.net":mailto:yaroslav@markin.net)
285
+
286
+ Огромное спасибо:
287
+
288
+ Юлику Тарханову (me@julik.nl) за "rutils":http://rutils.rubyforge.org/
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'rubygems/specification'
5
5
  require 'date'
6
6
 
7
7
  GEM = "russian"
8
- GEM_VERSION = "0.0.7"
8
+ GEM_VERSION = "0.0.8"
9
9
  AUTHOR = "Yaroslav Markin"
10
10
  EMAIL = "yaroslav@markin.net"
11
11
  HOMEPAGE = "http://github.com/yaroslav/russian/"
data/TODO CHANGED
@@ -12,3 +12,4 @@ Questionable
12
12
  * integration spec coverage for actionview locale
13
13
  * integration spec coverage for activerecord locale
14
14
  * integration spec coverage for activesupport locale
15
+ * integration specs for rails hacks
@@ -1,13 +1,13 @@
1
1
  $KCODE='u'
2
2
 
3
3
  $:.push File.join(File.dirname(__FILE__), 'russian')
4
+ require 'transliteration'
4
5
 
5
6
  # I18n require
6
7
  unless defined?(I18n)
7
8
  $:.push File.join(File.dirname(__FILE__), 'vendor', 'i18n', 'lib')
8
9
  require 'i18n'
9
10
  end
10
-
11
11
  # Advanced backend
12
12
  require 'backend/advanced'
13
13
 
@@ -17,12 +17,13 @@ if defined?(ActionView::Helpers)
17
17
  require 'action_view_ext/helpers/date_helper'
18
18
  require 'vendor/i18n_label/init'
19
19
  end
20
+ require 'active_support_ext/parameterize' if defined?(ActiveSupport::Inflector)
20
21
 
21
22
  module Russian
22
23
  module VERSION
23
24
  MAJOR = 0
24
25
  MINOR = 0
25
- TINY = 7
26
+ TINY = 8
26
27
 
27
28
  STRING = [MAJOR, MINOR, TINY].join('.')
28
29
  end
@@ -81,6 +82,16 @@ module Russian
81
82
  I18n.backend.send(:pluralize, LOCALE, variants_hash, n)
82
83
  end
83
84
  alias :p :pluralize
85
+
86
+ # Transliteration for russian language
87
+ #
88
+ # Usage:
89
+ # Russian.translit("рубин")
90
+ # Russian.transliterate("рубин")
91
+ def transliterate(str)
92
+ Russian::Transliteration.transliterate(str)
93
+ end
94
+ alias :translit :transliterate
84
95
 
85
96
  protected
86
97
  # Returns all locale files shipped with library
@@ -0,0 +1,24 @@
1
+ module ActiveSupport
2
+ module Inflector
3
+ # Replaces special characters in a string so that it may be used as part of a 'pretty' URL.
4
+ #
5
+ # ==== Examples
6
+ #
7
+ # class Person
8
+ # def to_param
9
+ # "#{id}-#{name.parameterize}"
10
+ # end
11
+ # end
12
+ #
13
+ # @person = Person.find(1)
14
+ # # => #<Person id: 1, name: "Дональд Кнут">
15
+ #
16
+ # <%= link_to(@person.name, person_path %>
17
+ # # => <a href="/person/1-donald-knut">Дональд Кнут</a>
18
+ def parameterize_with_russian(string, sep = '-')
19
+ parameterize_without_russian(Russian::transliterate(string), sep)
20
+ end
21
+ alias_method :parameterize_without_russian, :parameterize
22
+ alias_method :parameterize, :parameterize_with_russian
23
+ end
24
+ end
@@ -0,0 +1,54 @@
1
+ module Russian
2
+ # Russian transliteration
3
+ module Transliteration
4
+ extend self
5
+
6
+ # Transliteration heavily based on rutils gem by Julian "julik" Tarkhanov and Co.
7
+ # <http://rutils.rubyforge.org/>
8
+ # Cleaned up and optimized.
9
+
10
+ LOWER = {
11
+ "і"=>"i","ґ"=>"g","ё"=>"yo","№"=>"#","є"=>"e",
12
+ "ї"=>"yi","а"=>"a","б"=>"b",
13
+ "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"zh",
14
+ "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
15
+ "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
16
+ "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
17
+ "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"'",
18
+ "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
19
+ }.freeze
20
+
21
+ UPPER = {
22
+ "Ґ"=>"G","Ё"=>"YO","Є"=>"E","Ї"=>"YI","І"=>"I",
23
+ "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
24
+ "Д"=>"D","Е"=>"E","Ж"=>"ZH","З"=>"Z","И"=>"I",
25
+ "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
26
+ "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
27
+ "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
28
+ "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"'","Ы"=>"YI","Ь"=>"",
29
+ "Э"=>"E","Ю"=>"YU","Я"=>"YA",
30
+ }.freeze
31
+
32
+ # Transliterate a string with russian characters
33
+ def transliterate(str)
34
+ chars = str.split(//)
35
+
36
+ result = ""
37
+
38
+ chars.each_with_index do |char, index|
39
+ if UPPER.has_key?(char) && LOWER.has_key?(chars[index+1])
40
+ # combined case
41
+ result << UPPER[char].downcase.capitalize
42
+ elsif UPPER.has_key?(char)
43
+ result << UPPER[char]
44
+ elsif LOWER.has_key?(char)
45
+ result << LOWER[char]
46
+ else
47
+ result << char
48
+ end
49
+ end
50
+
51
+ return result
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Russian do
4
+ describe "transliteration" do
5
+ def t(str)
6
+ Russian::transliterate(str)
7
+ end
8
+
9
+ %w(transliterate translit).each do |method|
10
+ it "#{method} method should perform transliteration" do
11
+ str = mock(:str)
12
+ Russian::Transliteration.should_receive(:transliterate).with(str)
13
+ Russian.send(method, str)
14
+ end
15
+ end
16
+
17
+ # These tests are from rutils, <http://rutils.rubyforge.org>.
18
+
19
+ it "should transliterate properly" do
20
+ t("Это просто некий текст").should == "Eto prosto nekiy tekst"
21
+ t("щ").should == "sch"
22
+ t("стансы").should == "stansyi"
23
+ t("упущение").should == "upuschenie"
24
+ t("ш").should == "sh"
25
+ t("Ш").should == "SH"
26
+ t("ц").should == "ts"
27
+ end
28
+
29
+ it "should properly transliterate mixed russian-english strings" do
30
+ t("Это кусок строки русских букв v peremeshku s latinizey i амперсандом (pozor!) & something").should ==
31
+ "Eto kusok stroki russkih bukv v peremeshku s latinizey i ampersandom (pozor!) & something"
32
+ end
33
+
34
+ it "should properly transliterate mixed case chars in a string" do
35
+ t("НЕВЕРОЯТНОЕ УПУЩЕНИЕ").should == "NEVEROYATNOE UPUSCHENIE"
36
+ t("Невероятное Упущение").should == "Neveroyatnoe Upuschenie"
37
+ t("Шерстяной Заяц").should == "Sherstyanoy Zayats"
38
+ t("Н.П. Шерстяков").should == "N.P. Sherstyakov"
39
+ t("ШАРОВАРЫ").should == "SHAROVARYI"
40
+ end
41
+ end
42
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: russian
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yaroslav Markin
@@ -9,7 +9,7 @@ autorequire: russian
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-09 00:00:00 +03:00
12
+ date: 2008-11-21 00:00:00 +03:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -35,6 +35,8 @@ files:
35
35
  - lib/russian/action_view_ext/helpers/date_helper.rb
36
36
  - lib/russian/active_record_ext
37
37
  - lib/russian/active_record_ext/custom_error_message.rb
38
+ - lib/russian/active_support_ext
39
+ - lib/russian/active_support_ext/parameterize.rb
38
40
  - lib/russian/backend
39
41
  - lib/russian/backend/advanced.rb
40
42
  - lib/russian/core_ext
@@ -44,6 +46,7 @@ files:
44
46
  - lib/russian/locale/activesupport.yml
45
47
  - lib/russian/locale/datetime.yml
46
48
  - lib/russian/locale/pluralize.rb
49
+ - lib/russian/transliteration.rb
47
50
  - lib/russian.rb
48
51
  - lib/vendor
49
52
  - lib/vendor/i18n
@@ -86,6 +89,7 @@ files:
86
89
  - spec/locale_spec.rb
87
90
  - spec/russian_spec.rb
88
91
  - spec/spec_helper.rb
92
+ - spec/transliteration_spec.rb
89
93
  has_rdoc: true
90
94
  homepage: http://github.com/yaroslav/russian/
91
95
  post_install_message: