Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Мультиязычность шаблона на сайте
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Мультиязычность шаблона на сайте

Страниц (1): [1]
 

1. pps88 - 11 Мая, 2015 - 12:42:00 - перейти к сообщению
Мультиязычность шаблона на сайте - как правильно сделать?
Здравствуйте, конкретного решения не нашел - спрошу лучше чем наваять отсебятину.
Каждая языковая версия будет на субдомене: en.site.ru и ru.site.ru
Нужно перевести текст что встречается в шаблоне.
Начал делать так:
Для каждого субдомена есть папка: locale/language.php
Где переменным задано значение текста, файл language.php
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. $title = "Страница:".$b."текст"; //Title страницы
  4.  

$b - динамический контент, который тянется с базы в зависимости от страницы.

В файле index.php следующее:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. require '../../locale/language.php';
  4. $b = "Название страницы"
  5. echo $title; //результат на всякий случай: "Страница:текст"
  6.  


Собственно загвоздка с $b - из-за того что шаблон перевода require, $b - не получает значение на странице вывода.
Я не прошу готового решения - хотелось бы узнать направление куда копать. Работы сделано мало по локализации - можно применить совсем другой подход, вот и спрашиваю у опытных так как сам новичёк Растерялся
2. Panoptik - 11 Мая, 2015 - 14:10:29 - перейти к сообщению
не совсем понятно что за файл locale/language.php

я бы сделал так. есть папка с локализированными версиями

в ней все переводы каждый в отдельном файле

а-ля locale/ru.php locale/us.php locale/en.php

при инициализации скрипта определяется требуемый язык типа

PHP:
скопировать код в буфер обмена
  1.  
  2. if(file_exists('locale/'.$subdomain.'.php')) {
  3. // определяем константу CUR_LANG для дальнейших манипуляций и работой с локалями в бд
  4.   define('CUR_LANG', $subdomain);
  5. } else {
  6. // если нет локали, берем по умолчанию какую-нибудь
  7.   define('CUR_LANG', 'en');
  8. }
  9. $locale = require('locale/'.CUR_LANG.'.php');
  10.  


ну а дальше в коде где надо бросто берете индексы текущего массива $locale

а-ля

CODE (htmlphp):
скопировать код в буфер обмена
  1. <title><?=$locale['title'];?></title>
3. pps88 - 11 Мая, 2015 - 14:30:04 - перейти к сообщению
locale/language.php - это файл где хранится локализация для отдельного субдомена.
Дело в том что при Вашем способе файл локализации подключается через require как и у меня что вносит определенные неудобства.
Попробую объяснить:
Есть у меня страница фильма: скажем "Война миров", которая генериться на index.php из базы в зависимости от того куда пришел юзер. Я вытащил название и информацию из базы в массив. И при формировании <title> для этой страницы хочу получить такой:
<title>Фильм Война миров уже на экранах</title>
При этом в шаблоне языка language.php для русской версии сайта есть следующее
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $title = "Фильм".$b."уже на экранах";
  3.  

Где в $b на странице фильма (index.php) вставляю из массива его название.
Что require мне не позволяет делать, так как он не знает о переменной $b, пример писал выше.
В итоге выводится: Фильм уже на экранах
4. caballero - 11 Мая, 2015 - 14:57:27 - перейти к сообщению
Цитата:
я бы сделал так. есть папка с локализированными версиями

в ней все переводы каждый в отдельном файле

я делаю еще проще для каждого языка своя копия шаблонов

и не надо никаких переменных вообще
5. Panoptik - 11 Мая, 2015 - 18:06:23 - перейти к сообщению
pps88 пишет:

 
$title = "Фильм".$b."уже на экранах";
 

Где в $b на странице фильма (index.php) вставляю из массива его название.
Что require мне не позволяет делать, так как он не знает о переменной $b, пример писал выше.
В итоге выводится: Фильм уже на экранах


это лечится обычной оберткой

к примеру не используем на прямую массив, а используем его при помощи спциальной функции и передаем в нее доп аргументы если надо

инкапсуляция в чистом виде

пример
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $locale = [
  4.  'title' => "Фильм {title} уже на экранах",
  5. ]
  6.  
  7. function translate($key, $params) {
  8.  global $locale;
  9.  return str_replace(array_keys($params), array_values($params), $locale[$key]);
  10. }
  11.  
  12. // далее в коде просто вызываем функцию
  13.  
  14. ?>
  15. <title><?=translate('title', ['{title}'=>$b]);?></title>
  16.  


caballero пишет:
я делаю еще проще для каждого языка своя копия шаблонов

и не надо никаких переменных вообще


это конечно круто, только поддерживать бывает тяжковато
6. pps88 - 11 Мая, 2015 - 18:15:13 - перейти к сообщению
Panoptik спсасибо большое, думаю это то что мне нужно!

 

Powered by ExBB FM 1.0 RC1