Skip to content

Instantly share code, notes, and snippets.

@the-teacher
Last active November 21, 2020 19:18
Show Gist options
  • Save the-teacher/a21bbc02c4d4a05b2b2b to your computer and use it in GitHub Desktop.
Save the-teacher/a21bbc02c4d4a05b2b2b to your computer and use it in GitHub Desktop.
Ruby, Rails, Транслитерация для Яндекса, yandex translit
# 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 }}}}
@the-teacher
Copy link
Author

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.

@the-teacher
Copy link
Author

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