Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Локализация Smarty, Желательно gettext 
:(
    Опции темы
race1
Дата 22.10.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Привет!

Вот захотелось использовать смарти для сайта. Сайт планируется многоязычным, там внутри всё переводится через gettext. Появилась проблема как бы так локализовать и шаблоны смарти, очень желательно используя тот же gettext, что бы все локализованные ресурсы хранились в одном месте.

Простейший способ - делать несколько шаблонов на разных языках, очень не нравится.

Ещё есть способ через конфиги. Тоже не очень, ресурсы будут в .mo файлах и конфигах.

Прикрутить gettext через пользовательскую функцию не получилось.

Пробовал найти в интернете что-то про локализацию смарти, не нашёл почти ничего полезнго.

Как это можно сделать? Спасибо smile

А, да, единственный вариант который мне видится - делать весь перевод в скриптах, а в шаблоны отдавать через переменные. Но хотелось бы чего-нибудь не такого ужасного smile

Это сообщение отредактировал(а) race1 - 22.10.2008, 18:37
PM MAIL ICQ   Вверх
skyboy
Дата 23.10.2008, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(race1 @  22.10.2008,  17:31 Найти цитируемый пост)
Прикрутить gettext через пользовательскую функцию не получилось.

почему? мне это казалось самым очевидным, простым и действенным решением...
PM MAIL   Вверх
race1
Дата 23.10.2008, 05:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



А как? Я написал пользовательскую функцию gettext, могу вызывать её из шаблонов {gettext text='hello'}, но я не могу выдрать стандартными средствами это hello из шаблона. Только если писать свой парсер, чего не хотелось бы...
PM MAIL ICQ   Вверх
skyboy
Дата 23.10.2008, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(race1 @  23.10.2008,  04:36 Найти цитируемый пост)
но я не могу выдрать стандартными средствами это hello из шаблона

в смысле, не можешь автоматически заменить 
Код

gettext('Hello');

на 
Код

{gettext text='hello'}
?
PM MAIL   Вверх
race1
Дата 23.10.2008, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Я пробовал делать так, но почему-то парсер ругается на ошибки в tpl файле, poedit который. Думал что есть что-то готовое, видимо придётся писать велосипед :(
PM MAIL ICQ   Вверх
skyboy
Дата 23.10.2008, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(race1 @  23.10.2008,  07:44 Найти цитируемый пост)
но почему-то парсер ругается на ошибки в tpl файле

ну, так а ты пользовательскую функцию описал и подключил к СМАРТИ-то?
давай-ка, ты приведешь код подключения функции и минимальный(чем меньше, тем лучше) шаблон...
PM MAIL   Вверх
race1
Дата 23.10.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Цитата(skyboy @  23.10.2008,  14:27 Найти цитируемый пост)
ну, так а ты пользовательскую функцию описал и подключил к СМАРТИ-то?давай-ка, ты приведешь код подключения функции и минимальный(чем меньше, тем лучше) шаблон...


Нет, я всё это выдумал... smile

Шаблон:
Код

<html>
  <h1>{gettext text='Hello'}</h1>
</html>


Функция:
Код

function smarty_function_gettext($params, &$smarty) {
  return gettext($params['text']);
}


Все константы, которые д.б. переведены находятся в шаблоне, который у меня не получилось распарсить стандартными средствами, даже если писать "{gettext('Hello')}". Кроме написания своего парсера, который будет выдёргивать строки из шаблона, выхода не вижу.
PM MAIL ICQ   Вверх
skyboy
Дата 23.10.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(race1 @  23.10.2008,  12:52 Найти цитируемый пост)
се константы, которые д.б. переведены находятся в шаблоне, который у меня не получилось распарсить стандартными средствами, даже если писать "{gettext('Hello')}"

кроме виндового блокнота есть куча-куча редакторов, часть из которых использует поиск/замену с использованием регулярных выражений. так можно вполне заменить все "gettext('что-то там внутри');" на "{gettext text:"что-то там внутри"}".
Цитата(race1 @  23.10.2008,  12:52 Найти цитируемый пост)
Нет, я всё это выдумал... 

ну, ты привел код объявления функции и код использования в шаблоне. 
кода подключения функции к smarty(ну, вызов smarty->register_function) я не вижу. выполнение правил именования функций не подключит её автоматически.
PM MAIL   Вверх
Валерия
Дата 23.10.2008, 16:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: 1
Всего: 8



Ввобщем
index.php
Код

<?
require "libs/Smarty.class.php";

$smarty = new Smarty();

//Вот это нужно хранить в сессии
$lang = "en";
//$lang = "ru";

if (!in_array($lang, Array("ru", "en"))){
    die();
}

$smarty->assign("file_lang", $lang . ".txt");
$smarty->display("index.tpl");
?>


templates/index.tpl
Код

{config_load file="../`$file_lang`"}
<title>{#title#} - {#test#}</title>
{#sss#}


ru.txt
Код

title = "Приветик"
test = "Это тест"
sss = "Тестовое содержание"


en.txt
Код

title = "Hello"
test = "This is test"
sss = "Test content"


Вуаля)
Файлы языков компилируются только при первом запуске, или при их изменении, поэтому работает довольно шустро smile

Это сообщение отредактировал(а) Валерия - 23.10.2008, 16:10
PM MAIL   Вверх
race1
Дата 23.10.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Цитата(skyboy @  23.10.2008,  20:53 Найти цитируемый пост)
кроме виндового блокнота есть куча-куча редакторов, часть из которых использует поиск/замену с использованием регулярных выражений. так можно вполне заменить все "gettext('что-то там внутри');" на "{gettext text:"что-то там внутри"}".


Да, это можно сделать, но главная проблема в том, что стандартный парсер не может распарсить шаблон Smarty (.tpl) и сгенерировать файл для gettext!

Цитата(skyboy @  23.10.2008,  20:53 Найти цитируемый пост)
ну, ты привел код объявления функции и код использования в шаблоне. кода подключения функции к smarty(ну, вызов smarty->register_function) я не вижу. выполнение правил именования функций не подключит её автоматически.


Функция подключится автоматически, потому что там всё сделано как раз по правилам. Я даже проверял! Работает! И менял тело функции - тоже работает! И пробовал называть функцию не по правилам - не работает!

Валерия, спасибо, но тогда локализованные ресурсы будут в двух местах - для gettext отдельно, для шаблона - в конфигах. Хотелось бы что бы это было в одном месте... smile

В общем видимо пока наиболее вероятный вариант - преобразовывать все шаблоны так, что бы там было не 
Код
{gettext text='kva'}
, а 
Код
{<?php _('kva'); ?>}
, потом выдёргивать все строки для локализации, потом возвращать шаблоны к первоначальному виду... Немного не так удобно, как хотелось бы, но работать должно...
PM MAIL ICQ   Вверх
skyboy
Дата 23.10.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



race1, наверное, я тебя абсолютно не понял. у тебя есть:
а) нелокализованный шаблон
б) локализация с использованием gettext, но ещё нет шаблона
в) шаблона нет вообще; нет локализации вообще
какой из вариантов?
PM MAIL   Вверх
race1
Дата 23.10.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 18.6.2004

Репутация: нет
Всего: нет



Цитата(skyboy @  23.10.2008,  23:25 Найти цитируемый пост)
race1, наверное, я тебя абсолютно не понял. у тебя есть:а) нелокализованный шаблонб) локализация с использованием gettext, но ещё нет шаблонав) шаблона нет вообще; нет локализации вообщекакой из вариантов?


Есть:

1. скрипты на пхп которые локализуются через gettext, т.е. перед отдаванием строк в Smarty они сначала переводятся
2. шаблоны, статические тексты которых тоже надо как-то локализовать, хотелось бы через gettext тоже

Нашёл тут плагин один к Smarty, smarty-gettext, там как раз есть парсер который выдерает все тексты нового блока {t} и записывает их в c файл, что бы потом эти тексты добавились поедитом. Плюс блочный плагин {t} который и делает перевод. Наверное его и буду использовать. Только дата смущает, 2005 года плагин, плюс ещё и бета smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Libraries | Следующая тема »


 




[ Время генерации скрипта: 0.0940 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.