Jump to content
  • 0

define() - хранится в массиве?


Boron
 Share

Question

22 answers to this question

Recommended Posts

  • 0

Хм... первый раз слышу...

Может ты с каким-нибудь фреймворком перепутал? Там бывает организуют реестры настроек через классы или массивы.

А зачем, если не секрет, тебе этот массив нужен? Может есть альтернативный путь?

Link to comment
Share on other sites

  • 0

Нет, это я сам придумал, вот и решил уточнить. :(

Вообще, пока не напрограммировал непонятно что, задам такой вопрос:

Является ли нормальным делать языковые переводы сайта, следующим образом:

В зависимости от выбранного языка подключается файл "language.php", в котором хранятся строки вида:

// Interface Translations
define('INTERFACE_MAIN_PAGES' , 'Основные разделы');
define('INTERFACE_APPEARANCE' , 'Внешний вид');
define('INTERFACE_DEFAULT_PAGE' , 'Страница по умолчанию');

После чего в файле темплейта вызывается нужный define вида:

  <p class='link'><?=INTERFACE_DEFAULT_PAGE;?></p>

Или лучше сделать другим способом, без define?

Edited by Boron
Link to comment
Share on other sites

  • 0
А зачем, если не секрет, тебе этот массив нужен? Может есть альтернативный путь?

Ну просто хотел вызвать нужный перевод заголовка страницы следующим способом:

К примеру имеется в переменной $header = 'NEWS'

Вот и думаю как вызвать нужный define по шаблону: PAGE_HEADER_ + $header, придумать не могу. А вот если бы был массив, то можно было проще вызвать.

  $header = 'NEWS';
$header = "PAGE_HEADER_".$header;
// теперь $header = 'PAGE_HEADER_NEWS'
echo $_DEFINE_ARRAY['header'];

Ну или типо того что-то. :(

P.S. Что-то мне кажется, я тут перемудрил с переводами. :(

Edited by Boron
Link to comment
Share on other sites

  • 0

1. Для того, чтобы названия заголовков хранить, не надо использовать файлы конфигурации, надо использовать базу.

2. Если хочешь менять язык интерфейса, то целесообразно завести статический класс, реализовать в нем методы get() и set() и приватный массив.

Сначала с помощью методов set() заносишь в него данные, потом с помощью get() считываешь

class register {
private static $list = array();

static set( $name, $value )
{
self::$list[ $name ] = $value;
}

static get( $name )
{
if ( isset(self::$list[ $name ]) ) {
return self::$list[ $name ];
}
return null;
}

}



register::set( 'INTERFACE_MAIN_PAGES', 'Основные разделы' );

print register::get('INTERFACE_MAIN_PAGES');

ЗЫЖ А еще есть функция http://ru.php.net/manual/en/function.constant.php

ЗЫ2Ж статический метод из класса вызывается из любого места программы.

Link to comment
Share on other sites

  • 0
1. Для того, чтобы названия заголовков хранить, не надо использовать файлы конфигурации, надо использовать базу.

Тут два момента:

1. Я привёл пример с загаловками, просто как наглядный. :(

2. В базе переводы хранить не хочу (хоть контент и настройки храню в MySQL).

xPoint, keltanas, Иван Шумов, спасибо за советы!

Сейчас, для начала, попробую с массивами сделать переводы. Что-то я не подумал о таком варианте, и если честно, он мне кажется наиболее оптимальным вариантом в моём случае. :(

keltanas, спасибо за информацию про статические классы! Если честно, даже не знал про такие. В ближайшие дни посмотрю, что это такое. :(

Edited by Boron
Link to comment
Share on other sites

  • 0

Boron

Функция define служит для определения глобальной константы.

Использование для локализации неуместно и не рационально.

Для переводов лучше gettext, и оболочек её использующих, ещё ничего не придумали.

Link to comment
Share on other sites

  • 0

Массивы хорошо конечно, но только их придется в каждой функции в пространство GLOBAL объявлять.

А класс :

1. виден везде.

2. позволяет написать любой необходимый обработчик ваших данных.

3. можно реализовать фабрику, которая будет в зависимости от языковых установок выбирать класс с нужными данными и позволит работать с ними через себя.

Link to comment
Share on other sites

  • 0
Нет, это я сам придумал, вот и решил уточнить. :)

Вообще, пока не напрограммировал непонятно что, задам такой вопрос:

Является ли нормальным делать языковые переводы сайта, следующим образом:

В зависимости от выбранного языка подключается файл "language.php", в котором хранятся строки вида:

// Interface Translations
define('INTERFACE_MAIN_PAGES' , 'Основные разделы');
define('INTERFACE_APPEARANCE' , 'Внешний вид');
define('INTERFACE_DEFAULT_PAGE' , 'Страница по умолчанию');

После чего в файле темплейта вызывается нужный define вида:

  <p class='link'><?=INTERFACE_DEFAULT_PAGE;?></p>

Или лучше сделать другим способом, без define?

Лучше, на мой взгляд, в данном случае следеть несколько массивов. Например $ru, $eng и так далее. Каждый массив содержит одинаковое количество элементов. Ключем в данном случае будет выражение типа "MAIN_PAGES" а значением будет выводимый текст "Основные разделы". В каждом массиве ключи одинаковы но разны значения. Откудато ты получаешь параметр lang (к примеру)В зависимости от него используешь разные массивы. Как дальше - думай сам. Это отдельный вопрос

Link to comment
Share on other sites

  • 0

Нафиг?!

В моем мего кул движке языки работают так:

Парсим HTTP_ACCEPT_LANGUAGE.

Парсим папку language

Смотрим, сверям и т.д.

Инклудим файлы, файлов много инклудить не нужно, нагружать будет пыху.

Для всяких пустеков используй какой нить глобальный язык(где многа массивов).

Link to comment
Share on other sites

  • 0

Хы.. тут вспомнил... Один мой знакомый кодер языковые переменные при запуске скрипта загружает в $_SERVER['lang'], например, и уже потом юзает оттуда. Правда тоже через функции доступа... Но вроде не вижу преимуществ этого метода перед статическим вызовом методов...

Link to comment
Share on other sites

  • 0

Сегодня опять вернулся к вопросу переводов. Решил всё-таки остановиться на массиве, т.к. удобнее, быстрее, красивее. :)

keltanas, со статическим классом не разбирался вдумчиво, лишь поверхностно. Пожалуй в следующем проекте попробую применить его, т.к. идея понравилась. :)

Link to comment
Share on other sites

  • 0
быстрее

Не быстрее

удобнее

Не удобно для работы с формами слов после числительных.

Не удобно для независимости работ программистов и переводчиков.

Не удобное управление переводимыми фразами (см. poEdit)

красивее

Не красиво всюду таскать за собой массив.

Link to comment
Share on other sites

  • 0
Не удобно для работы с формами слов после числительных

Не понял, о чём ты?

А в остальном... Пожалуй сделаю альтернативный вариант переводов, погляжу что есть лучше. (проект всё-равно для себя делаю, поэтому лучше сразу всё сделать "правильнее").

Спасибо за ответ! По началу он меня немного задел "категоричностью", но я сразу же решил пересмотреть своё мнение. B)

Потом отпишусь, как доделаю твой вариант перевода. :)

Edited by Boron
Link to comment
Share on other sites

  • 0

А почему не хранить языковые настройки в xml файлах ru.xml, en.xml, fr.xml?

$xml_lang = simplexml_load_file($xml_file);

Подключаем по условию.

Далее

$xml_lang->site_variables->lang->title
$xml_lang->site_variables->lang->welcome_text

Как вариант. Хотя, кому что нравится...

Edited by EGORR
Link to comment
Share on other sites

  • 0
А почему не хранить языковые настройки в xml файлах ru.xml, en.xml, fr.xml?

$xml_lang = simplexml_load_file($xml_file);

Подключаем по условию.

Далее

$xml_lang->site_variables->lang->title
$xml_lang->site_variables->lang->welcome_text

Как вариант. Хотя, кому что нравится...

запись то длинновата в этих примерах

Link to comment
Share on other sites

  • 0
Не понял, о чём ты?

У вас 1 комментарий

У вас 2 комментария

У вас 5 комментариев

С помощью gettext решается легко и красиво.

Спасибо за ответ! По началу он меня немного задел "категоричностью", но я сразу же решил пересмотреть своё мнение. :)

Эта категоричность взята не с потолка, а из опыта (который когда-то начинался как ваш).

Лучше сразу приобщайтесь к хорошему стилю (хоть и с потерей времени на изучение), чем в будущем ездить на велосипедах с квадратными колёсами.

Link to comment
Share on other sites

  • 0

если не ошибаюсь это должно помочь:

// подгружаешь массив с переводом в зависимости от выбранного языка

$lang = array(
'hi, world!' => 'привет, мир!',
'test message' => 'тестовое сообщение'
// ну и так далее...
);

// функция для перевода

function __($str){
global $lang;
return empty($lang[$str]) ? $str : $lang[$str];
}

// ... где то в шаблоне

<?php echo __('hi, world!'); ?>

В общем как то так. Если языка нет, то выдаст фразу на международном. Ну и понятно сразу что к чему.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy