Наверняка многие из вас встречались с такими заголовками:
Вся проблема в том, что в Друпале, заголовок этой формы устанавливается так:
<?phpdrupal_set_title(t('Submit name', array('name' => $types[$type]->name)));?>
И все бы было хорошо, если бы "великий и могучий", "солов'їна і співуча", а также белорусский и, возможно, ряд других языков не имели бы падежей.
...
Для тех, кому лень заходить и читать, даю ссылку на модуль прямо здесь (Drupal 5.x):
Комментарии
Спасибо! еще бы под 6-чку...
Модуль состоит из 4 строчек
При большом желании, вряд ли будет трудно портировать. Версии для 6.х не даю, ибо не имею ни одного продакшен сайта не ней — не на чем даже протестить.
Спасибо за модуль, еще не тестил, но думаю пригодиться..
А как вообще проблема с падежами решается глобально? Для всех языков? Т.е не привязываясь к конкретному?
То, что пришло прямо сейчас на ум: развитие данной идеи - то есть для строки в t() сделать дополнительный Placeholder, при наличие которого t заменяет строку до перевода, а не после. Только не очень-то это помогает.
Еще один метод бороться с такими ляпами – перевод в стиле "Слово – определение".
Можно заменить "Создать name" ("Create name")
(Модуль Locale, admin/build/translate/search)
на что-нибудь вида:
Создать материал "name"
Создать материал: name.
Создать материал – name
name. Добавление.
name [Добавление]
и т.д., по вкусу
PanDa777, никак не решается. Сколько языков - столько и вариантов всяческих фич типа падежей, а хуже всего, что из каждого правила в языке есть исключения.
gilmor, не всегда это решение можно применить ("Создать материал – Продукт" - выглядит даже хуже чем "Создать Продукт")
neochief, разумеется не всегда. И уж тем более это не панацея.
Но, иногда, позволяет малой кровью
привести запись к вполне вменяемому виду.
Особенно если контекст к этому располагает.
Я Друпал не использовал пока еще на серьезном уровне, но некоторые вещи позаимствовал при строительстве своего проекта. В частности - функцию t();
С подобной проблемой я уже давно столкнулся. Решение нашел в системе http://popoff.donetsk.ua/text/work/light/
Там в конце строки через знак "|" можно оставлять комментарии.
Таким образом, можно одно и тоже Английское слово переводить по разному, исходя из контекста.
Например
"create|создание чего-то там" переводим "создать"
"create|создание ноды" переводим "создание материала"
"use symbol \| any where| можно не комментировать" переводим "использование символа \| где угодно"
При выводе на экран экранирование сотрется.
Если кому интересно, привожу функцию:
<?php
function t($str)
{
global $locale_strings;
if (empty($str)) return '';
$args=array();
if (func_num_args() == 2 && is_array(func_get_arg(1))){
$args=func_get_arg(1);
foreach ($args as $k=>$v){
if (strlen($k)>0 && !in_array($k[0], array('%', '#', '@', '{'))){
$args['%'.$k]=$v;
unset($args[$k]);
}
}
}
elseif (func_num_args() >= 2 && !is_array(func_get_arg(1))){
$p = 0;
for ($i=1; $i < func_num_args(); $i++) {
$arg = func_get_arg($i);
if (is_array($arg)) {
foreach ($arg as $aarg) {
$args['%'.++$p] = $aarg;
}
} else {
$args['%'.++$p] = $arg;
}
}
}
// Собственно, сам механизм получения перевода рассматривать не буду, у меня это сделано через php-gettext,
//поэтому приведу две строки получения перевода из массива
if (isset($locale_strings[$str])) $return=$locale_strings[$str];
else $return=$str;
if (is_array($args) && count($args)>0) $return=strtr($return, $args);
//{{plural:%1|раз|раза|раз}}
if (stristr($return,'{{plural:')){
$return = preg_replace_callback("/{{plural:([^}]+)}}/i", "_locale_pluar", $return);
}
//Обрезаем комментирий - идентификатор, - очень полезная вещь, это я у Попова позаимствовал
$pos = strrpos($return, '|');
if ($pos !== false){
if ($return[$pos-1] != '\\') $return = substr($return, 0, $pos);
$return = str_replace("\\|", "|", $return);
}
return $return;
}
/*
Это я нашел на форуме dklab.ru
*/
function declension($int, $expressions){
if (count($expressions) < 3) $expressions[2] = $expressions[1];
settype($int, "integer");
$count = $int % 100;
if ($count >= 5 && $count <= 20) {
$result = $expressions['2'];
} else {
$count = $count % 10;
if ($count == 1) {
$result = $expressions['0'];
} elseif ($count >= 2 && $count <= 4) {
$result = $expressions['1'];
} else {
$result = $expressions['2'];
}
}
return $result;
}
/*
Связка
*/
function _locale_pluar($m){
$a = explode("|", $m[1]);
$int=$a[0];
array_shift($a); //var_dump($a);
return declension($int, $a);
}
?>
Полезный модуль, давно искала.
Немного поправим английский в описании:
Changes the way in which titles in node creation form are translating, make possible to set custom translation on whole title.
Лучше так:
Changes the way in which titles on the node creation forms are translated (заголовки сами себя не переводят), makes it possible to set a custom translation for the whole title, including the name of the content type (уточняем, что речь идет о названиях типов материалов).
Спасибо
Спасибо

Это действительно имеет место быть!
Взял на себя смелость, переделал и выложил для шестерки bonus_titles_6.x.rar
К великому сажалению модуль в D6 не работает
В D6 работает, но показывает нужный title только в заголовке страницы. В самой же ноде остается как было.
Удалил в конце модуля условие, оставил только строку drupal_set_title($new_translated); . Все стало работать как надо.
Граждане, кто нибудь переделывал по семерку?
Ссылка на bonus_titles_6.x.rar не работает, перезалейте плиз!