Советы по локализациям (подводный камушек)

Привет сообщество!
Веду беларускамоўны проект для ЛС. Естественно делал локализацию. Столкнулся с проблемой, что на сайте не верно склоняются некоторые лэйблы (если использовать другие локализации, да-да). Мной замечены даты и изображения.

К примеру в фотосетах слово «изображение» на русском языке склоняется следующим образом:
1,21,31… изображение
2,3,4; 22,23,24… 32,33,34… изображения
5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 изображений


На мове это выглядело бы так:
1,21,31… выява
2,3,4; 22,23,24… 32,33,34… выявы
5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 выяваў

Английском языке:
1 image
2,3,4,5,… images

В словарике russian.php оно выглядит следующим образом:
'topic_photoset_count_images' => 'изображение;изображения;изображений',


А в моем словарике belarusian.php выглядело так:
'topic_photoset_count_images' => 'выява;выявы;выяў',


А в коде шаблона оно вот такое вот:
<h2>{$oTopic->getPhotosetCount()} {$oTopic->getPhotosetCount()|declension:$aLang.topic_photoset_count_images}</h2>


Однако несмотря на мою локализацию сайт почему-то для всех случаев подсасывал одно и то же значение: «выявы». Посмотрите, может у Вас на сайте тоже так? ;)

Где же магия?

Магия называется Smarty declension.
Находится по адресу: /engine/modules/viewer/plugs/modifier.declension.php

В данном случае нас интересует метод:
function smarty_modifier_declension_russian($forms, $count)
{
	$mod100 = $count % 100;
	switch ($count%10) {
		case 1:
			if ($mod100 == 11)
				return $forms[2];
			else
				return $forms[0];
		case 2:
		case 3:
		case 4:
			if (($mod100 > 10) && ($mod100 < 20))
				return $forms[2];
			else
				return $forms[1];
		case 5:
		case 6:
		case 7:
		case 8:
		case 9:
		case 0:
			return $forms[2];

	}
}


По коду можно понять, что в случае локализации для своего языка нужно сделать отдельный метод в котором будут прописаны правила склонений для Вашего языка, к примеру для английского это(обратите внимание на название метода):
function smarty_modifier_declension_english($forms, $count)
{
	if ($count==1)
		return $forms[0];
	else
		return $forms[1];
}


Там все просто, если предмет один — бери значение один, если много — то бери значение два:
'topic_photoset_count_images' => 'image;images;images',


Вот вам и решение. Всем спасибо, все свободны %)

3 комментария

avatar
Ну что тут скажешь… спасибо! Всегда думал, что достаточно создать языковые константы и все.
avatar
Спасибо!
avatar
Дзякуй
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.