Человеческие заголовки при создании ноды

Главные вкладки

Аватар пользователя neochief neochief 26 августа 2008 в 14:24

Наверняка многие из вас встречались с такими заголовками:

или такими:

Вся проблема в том, что в Друпале, заголовок этой формы устанавливается так:

<?phpdrupal_set_title(t('Submit name', array('name' => $types[$type]->name)));?>

И все бы было хорошо, если бы "великий и могучий", "солов'їна і співуча", а также белорусский и, возможно, ряд других языков не имели бы падежей.

...

Дальнейшее объяснение »

Для тех, кому лень заходить и читать, даю ссылку на модуль прямо здесь (Drupal 5.x):

Скачать bonus_titles

Комментарии

Аватар пользователя neochief neochief 26 августа 2008 в 15:50

Модуль состоит из 4 строчек Smile При большом желании, вряд ли будет трудно портировать. Версии для 6.х не даю, ибо не имею ни одного продакшен сайта не ней — не на чем даже протестить.

Аватар пользователя PanDa777 PanDa777 26 августа 2008 в 18:02

А как вообще проблема с падежами решается глобально? Для всех языков? Т.е не привязываясь к конкретному?

То, что пришло прямо сейчас на ум: развитие данной идеи - то есть для строки в t() сделать дополнительный Placeholder, при наличие которого t заменяет строку до перевода, а не после. Только не очень-то это помогает.

Аватар пользователя gilmor gilmor 26 августа 2008 в 19:10

Еще один метод бороться с такими ляпами – перевод в стиле "Слово – определение".
Можно заменить "Создать name" ("Create name")
(Модуль Locale, admin/build/translate/search)
на что-нибудь вида:
Создать материал "name"
Создать материал: name.
Создать материал – name
name. Добавление.
name [Добавление]
и т.д., по вкусу Wink

Аватар пользователя neochief neochief 26 августа 2008 в 20:47

PanDa777, никак не решается. Сколько языков - столько и вариантов всяческих фич типа падежей, а хуже всего, что из каждого правила в языке есть исключения.

gilmor, не всегда это решение можно применить ("Создать материал – Продукт" - выглядит даже хуже чем "Создать Продукт")

Аватар пользователя gilmor gilmor 27 августа 2008 в 1:24

neochief, разумеется не всегда. И уж тем более это не панацея.
Но, иногда, позволяет малой кровью
привести запись к вполне вменяемому виду.
Особенно если контекст к этому располагает.

Аватар пользователя SomeOne SomeOne 10 ноября 2015 в 11:45

Я Друпал не использовал пока еще на серьезном уровне, но некоторые вещи позаимствовал при строительстве своего проекта. В частности - функцию 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);
}

?>

Аватар пользователя Natalie Natalie 27 августа 2008 в 17:28

Полезный модуль, давно искала.

Немного поправим английский в описании:

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 (уточняем, что речь идет о названиях типов материалов).

Спасибо Smile

Аватар пользователя Drugan Drugan 9 августа 2009 в 14:52

В D6 работает, но показывает нужный title только в заголовке страницы. В самой же ноде остается как было.

Аватар пользователя Drugan Drugan 10 августа 2009 в 7:36

Удалил в конце модуля условие, оставил только строку drupal_set_title($new_translated); . Все стало работать как надо.