За последние 24 часа нас посетили 22880 программистов и 1260 роботов. Сейчас ищут 645 программистов ...

Языковые файлы.Константы.Как быть

Тема в разделе "PHP для новичков", создана пользователем Родогор, 8 окт 2010.

  1. Родогор

    Родогор Активный пользователь

    С нами с:
    8 окт 2010
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте.
    Очень сложно точно описать что хочу, поэтому извиняюсь за витеватость моего описания.

    Итак, описание: доска объявлений, работающая на 3-х языках. 3 файла языковых(предположим рус, нем, англ), где забиты константы. define("_TEST","Тест"); define("_TEST","Test"); ну и т.п. Вопрос переключения/определения языка не берём во внимания, предположим что пользователь уже под нужным языком. Объявления должны читаться на любых языках
    При отправке объявлений записывается очень много инфы, куча чекбоксов и т.п.
    Некоторая информация хранится в базе как string в формате TEST_A|TEST_B|TEST_C|....|TEST_* - разделитель | ( explode, implode рулит)
    Каждой "переменной" (TEST_A, TEST_B и т.п.) соответствует константа с таким же именем, прописанная в языковых файлах. define("_TEST_A","Тест А"); и т.п.

    Ситуация: делаем запрос в базу, получаем ответ. Начинаем обрабатывать его в читабельный для пользователя вид... Предположим в поле ['test'] хранится запись TEST_A|TEST_B|TEST_C. Преобразуем в массив, пускаем по массиву цикл, в цикле switch case выбираем нужное нам:

    Код (Text):
    1.  switch ($test[$i]) {
    2.                case "TEST_A": $mas[]=_TEST_A; break;
    3.                case "TEST_B": $mas[]=_TEST_A; break;
    4.                case "TEST_B": $mas[]=_TEST_A; break;
    5. }
    Затем массив преобразуем в строчку с разделителем "," , чтобы пользователь видел это как "Тест А, Тест Б, Тест С".

    Собственно вопрос:
    Мне то ли интуитивно что-то подсказывает, то ли прослушанный в пол уха курс LISP-a, что можно ИМЯ КОНСТАНТЫ сделать ПЕРЕМЕННОЙ.
    Мысль глубокая, легко понятная мне, но я по уши в говне участия в этом и мне легко это представить. Попробую прояснить, слегка упростив.

    Зарисовка - языковые файлы определяют константу TEST_A, TEST_B и TEST_C. В поле записи может быть только одна из них. Приходит ответ от БД, чтобы сформировать читабельную для пользователя форму мы делаем это так:
    Код (Text):
    1.  
    2.  switch ($row['test']) {
    3.                case "TEST_A": $string=_TEST_A; break;
    4.                case "TEST_B": $string=_TEST_A; break;
    5.                case "TEST_B": $string=_TEST_A; break;
    6.  /*общий вид такой:
    7.               case ".....имя константы......": $string=_....имя константы....; break;
    8. общие части видны налицо
    9. */
    10. }
    11.  
    12. ...
    13. echo $string;
    А нельзя ли как-то сделать так: echo _....ИМЯ КОНСТАНТЫ ВЗЯТОЕ ИЗ ПОЛЯ ЗАПИСИ В БД....;

    На мой взгляд - нельзя.... А может ?
     
  2. Родогор

    Родогор Активный пользователь

    С нами с:
    8 окт 2010
    Сообщения:
    5
    Симпатии:
    0
    Я извиняюсь, специально пишу вторым постом - ситуация аналогичная... Меня интересует чисто концепт, рассуждения и возможно или нет.

    Предположим делаем доску объявлений. Есть свойство ЦВЕТ. Заранее цвета не заполнены. Админ заходит в админку и создаёт цвета - БЕЛЫЙ, ЖЁЛТЫЙ, ЗЕЛЁНЫЙ.... Им присваивается COLOR_ID автоинкримент. Админ даёт им перевод - WHITE, YELLOW, GREEN... В БД им присваивается автоинкримент: COLOR_ID. А записываются они либо в трёх полях, либо в одном в строго определённом порядке - Белый|White.
    Где-то в коде получается такая ситуация: нужно вывести объявление. Находим поле ['color'], там хранится допустим 1 - это белый. Заранее объединяем запросы where color='$color_id' и проблема шума решена ?
     
  3. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    слишком много букаф, трудно разбираться в первом посте.
    во втором вроде понятнее :)

    Если осуществлять перевод с помощью файлов локализации, то сам перевод будет выполняться функцией.
    PHP:
    1. function translate($text){
    2.   global $_LOCALE;
    3.   $index = trim(strtolower($text));
    4.   return (is_set($_LOCALE[$index])) ? $_LOCALE[$index] : $text;
    5. }
    Пример использования очень прост (по идее функция должна принимать только англ. слова, но это по идее):
    PHP:
    1.  
    2. $_LOCALE = array('color'=>'Цвет');
    3. echo translate('Color');
    4. echo translate('Colour');
    5.  
    Вывод будет:
    Цвет
    Colour

    Соответственно в глобальный массив $_LOCALE загружать текст на нужном языке.

    Хотя в своей реализации я делал это немного по другому.
    Внутри функции объявлял статический массив, а функция могла принимать два параметра.
    Первый - индекс, второй - перевод. Если перевод не указан - вернуть перевод из массива.
    Если указан - занести в массив перевод.

    Решения с БД возможны, но только для ограниченного кол-ва языков,
    т.к. для каждого языка нужно будет создавать отдельное поле:
    [sql]CREATE TABLE messages (
    'msg_id' SERIAL,
    'msg_en' VARCHAR(100),
    'msg_ru' VARCHAR(100),
    'msg_ko' VARCHAR(100),
    ...
    );[/sql]
     
  4. Родогор

    Родогор Активный пользователь

    С нами с:
    8 окт 2010
    Сообщения:
    5
    Симпатии:
    0
    Благодарю за совет, опробую...
    ч
     
  5. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Можно.
    Функция constant()