Last active
November 21, 2020 19:18
-
-
Save the-teacher/a21bbc02c4d4a05b2b2b to your computer and use it in GitHub Desktop.
Ruby, Rails, Транслитерация для Яндекса, yandex translit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# encoding: utf-8 | |
# Russian for Yandex. Based on: | |
# (c) Yaroslav Markin, Julian "julik" Tarkhanov and Co | |
# https://github.com/yaroslav/russian/blob/master/lib/russian/transliteration.rb | |
# WARN я не очень согласен с правилом для буквы Щ (SHH)- поэтому используется SCH | |
# SAVE IT HERE: | |
# :rails_root/config/locales/yandex_translit.rb | |
module RailsI18n | |
module Transliteration | |
module Russian | |
class << self | |
def rule | |
lambda do |string| | |
chars = string.scan(%r{#{multi_keys.join '|'}|\w|.}) | |
result = "" | |
chars.each_with_index do |char, index| | |
if upper.has_key?(char) && lower.has_key?(chars[index+1]) | |
# combined case | |
result << upper[char].downcase.capitalize | |
elsif upper.has_key?(char) | |
result << upper[char] | |
elsif lower.has_key?(char) | |
result << lower[char] | |
else | |
result << char | |
end | |
end | |
result | |
end | |
end | |
private | |
# use instance variables instead of constants to prevent warnings | |
# on re-evaling after I18n.reload! | |
def upper | |
@upper ||= begin | |
upper_single = { | |
"Ё"=>"E","Э"=>"E","Ю"=>"YU","Я"=>"YA", | |
"Ж"=>"ZH","Х"=>"KH","Й"=>"J", | |
"Ц"=>"TS","Ш"=>"SH","Щ"=>"SCH","Ь"=>"","Ъ"=>"", | |
"Ґ"=>"G","Є"=>"E","Ї"=>"YI","І"=>"I", | |
"А"=>"A","Б"=>"B","В"=>"V","Г"=>"G", | |
"Д"=>"D","Е"=>"E","З"=>"Z","И"=>"I", | |
"К"=>"K","Л"=>"L","М"=>"M","Н"=>"N", | |
"О"=>"O","П"=>"P","Р"=>"R","С"=>"S", | |
"Т"=>"T","У"=>"U","Ф"=>"F","Ч"=>"CH","Ы"=>"Y" | |
} | |
(upper_single.merge(upper_multi)).freeze | |
end | |
end | |
def lower | |
@lower ||= begin | |
lower_single = { | |
"ё"=>"e","э"=>"e","ю"=>"yu","я"=>"ya", | |
"ж"=>"zh","х"=>"kh","й"=>"j", | |
"ц"=>"ts","ш"=>"sh","щ"=>"sch","ь"=>"","ъ"=>"", | |
"і"=>"i","ґ"=>"g","№"=>"#", | |
"ї"=>"yi","а"=>"a","б"=>"b", | |
"в"=>"v","г"=>"g","д"=>"d","е"=>"e", | |
"з"=>"z","и"=>"i","к"=>"k","л"=>"l", | |
"м"=>"m","н"=>"n","о"=>"o","п"=>"p", | |
"р"=>"r", "с"=>"s","т"=>"t","у"=>"u", | |
"ф"=>"f","ч"=>"ch","ы"=>"y" | |
} | |
(lower_single.merge(lower_multi)).freeze | |
end | |
end | |
def upper_multi | |
@upper_multi ||= { "ЬЕ"=>"IE", "ЬЁ"=>"IE" } | |
end | |
def lower_multi | |
@lower_multi ||= { "ье"=>"ie", "ьё"=>"ie" } | |
end | |
def multi_keys | |
@multi_keys ||= (lower_multi.merge(upper_multi)).keys.sort_by {|s| s.length}.reverse.freeze | |
end | |
end | |
end | |
end | |
end | |
{ :ru => { | |
:i18n => { | |
:transliterate => { | |
:rule => RailsI18n::Transliteration::Russian.rule }}}} |
plain tests based on gem "the_string_to_slug"
я не очень согласен с правилом для буквы Щ (SHH)- поэтому используется SCH
ENV["RAILS_ENV"] ||= 'development'
require File.expand_path("../../../config/environment", __FILE__)
# I18n
#
# ё => yo
# э => e
# ю => yu
# я => ya
# ж => zh
# х => h
# й => y
# ц => ts
# ш => sh
# щ => sch
# ь =>
# ъ => '
p "I18n/Russian by Markin"
p "SRC: Ё Э Ю Я Ж Х Й Ц Ш Щ Ь Ъ"
p "REQ: yo-e-yu-ya-zh-h-y-ts-sh-sch"
p "Ё Э Ю Я Ж Х Й Ц Ш Щ Ь Ъ".to_slug_param
p "Ё Э Ю Я Ж Х Й Ц Ш Щ Ь Ъ".to_slug_param == "yo-e-yu-ya-zh-h-y-ts-sh-sch"
# YANDEX (my version in fact)
#
# ё => e
# э => e
# ю => yu ju
# я => ya (ja)
# ж => zh
# х => kh
# й => j
# ц => ts
# ш => sh
# щ => sch
# ь =>
# ъ =>
p "I18n/Russian for Yandex"
p "SRC: Ё Э Ю Я Ж Х Й Ц Ш Щ Ь Ъ"
p "REQ: e-e-yu-ya-zh-kh-j-ts-sh-sch"
p "Ё Э Ю Я Ж Х Й Ц Ш Щ Ь Ъ".to_slug_param
p "Ё Э Ю Я Ж Х Й Ц Ш Щ Ь Ъ".to_slug_param == "e-e-yu-ya-zh-kh-j-ts-sh-sch"
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
http://транслитерация.рф
Транслитерация по системе Яндекса*
Сразу скажем: Яндекс очень умен, поэтому он понимает ВСЕ существующие системы транслитерации, и активно их подсвечивает. А вот выводит на первые места по причине идеального написания только те, что написаны правильным, по его мнению, транслитом.
Многочисленные эксперименты однозначно показали, что Яндекс считает правильным транслителированием русской буквы "Х" не "X"(икс), как многие думали, а сочетание букв "KH". То есть, при прочих равных условиях при наборе в поисковой строке "хорошо ру" он отдаст предпочтение домену "khorosho.ru", а не привычному глазу написанию "xorosho.ru". Чтобы "xorosho" заняло такую же позицию, как "khorosho", вебмастеру нужно очень постараться, и найти возможность проставить на "xorosho" солидное количество ссылок с трастовых ресурсов, тем самым компенсируя написание домена, отличающееся от стандарта Яндекса.
С "х" все понятно, русская "Х" транслителируется как "KH" во всех системах транслитерации. Куда более интересные предпочтения выявляются в других буквах.
Так, русскую "Й" Яндекс предпочитает транслителировать как "J". И это тоже понятно. Ведь в системах, где "й" пишется как "y" или "i", легко появляется путаница, так как "y" в любой системе транслитерации означает еще и "ы", а "i" везде означает букву "и".
Представляется интересным транслитерация буквы Ц. Она воспринимается Яндексом и в виде сочетания букв TS, и как латинская C. Например, при наборе в поисковой строке ЦВЕТЫ ОРГ или ЦВЕТЫ БИЗ, на первых местах выдачи мы видим одностраничные сайты с первым вариантом (TS), если же набираем ЦВЕТЫ НЕТ, попадаем на второй вариант написания (C). Оба варианта ярко подсвечиваются, оба занимают первые места в поиске. Причем если "цветы нет" поддерживается ссылками с других ресурсов, то в случае с "цветы орг" и "цветы биз" ситуация интересна тем, что ссылок на эти сайты с других ресурсов вообще нет! То есть, Яндекс предпочитает эти сайтики именно за счет правильного транслита в их имени.
Буква Я прекрасно воспринимается Яндексом в двух вариантах - YA и JA. Набирая, например, в поисковой строке ДИСФУНКЦИЯ РУ, мы видим на первом месте ярко подсвеченный вариант с буквой Ц в виде C и Я в написании JA - disfunkCiJA. То же самое по аналогии и с буквой Ю.
Неожиданное открытие ждет нас с буквой Щ. Несмотря на то, что в большинстве современных систем транслитерации "Щ" пишется как "SHCH", Яндекс воспринимает как самое правильное написание другую транслитерацию: "SHH". То есть, лещ в написании "leshh" Яндексу более близок, чем более длинный "leshch".
Конечно, тут приходится выбирать. Если кто-то создает сайт только для себя и пары своих друзей, с которыми привык переписываться на каком-нибудь экзотическом виде транслита, то он может взять любое имя для сайта и радоваться, ежедневно вбивая его в адресной строке. Но он должен понимать, что посетителей на его сайт это не привлечет.
Если же Вы хотите, чтобы Ваш сайт больше других нравился Яндексу, чтобы у сайта была достойная посещаемость, то и смотреть на имя своего сайта нужно глазами Яндекса.
Какой же системой транслитерации пользуется Яндекс? "Щ" в виде "SHH" мы сразу находим в ГОСТ 16876-71 и СЭВ 1362-78, однако в этих системах буква "Э" транслителируется в виде "EH", вместо правильной для Яндекса "E", и т.д.
Может быть, Яндекс взял за основу самую современную систему - МЕЖГОСУДАРСТВЕННЫЙ СТАНДАРТ, за принятие которого в июне 2000 г. проголосовало около десяти стран? (см. левую таблицу вверху)
Увы. Оказалось, что не всё из МЕЖГОСУДАРСТВЕННОГО СТАНДАРТА Яндекс решил принять. Например, он наотрез отказывается читать представленную в стандарте букву "Ц" в виде: "CZ".
Так, в МЕЖГОСУДАРСТВЕННОМ СТАНДАРТЕ рекомендуется употреблять "С" перед буквами I, Е, Y, J, а в остальных случаях - "CZ". То есть, согласно этим правилам, идеальная транслитерация слова "пицца" по МЕЖГОСУДАРСТВЕННОМУ СТАНДАРТУ - "Piczcza". Однако, Яндекс даже не подсвечивает такое слово! (по крайней мере, не подсвечивал на момент написания этих строк).
Из всех двухбуквенных транслитов буквы Ц Яндекс выбирает TS.