Здравствуйте. Очень сложно точно описать что хочу, поэтому извиняюсь за витеватость моего описания. Итак, описание: доска объявлений, работающая на 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): switch ($test[$i]) { case "TEST_A": $mas[]=_TEST_A; break; case "TEST_B": $mas[]=_TEST_A; break; case "TEST_B": $mas[]=_TEST_A; break; } Затем массив преобразуем в строчку с разделителем "," , чтобы пользователь видел это как "Тест А, Тест Б, Тест С". Собственно вопрос: Мне то ли интуитивно что-то подсказывает, то ли прослушанный в пол уха курс LISP-a, что можно ИМЯ КОНСТАНТЫ сделать ПЕРЕМЕННОЙ. Мысль глубокая, легко понятная мне, но я по уши в говне участия в этом и мне легко это представить. Попробую прояснить, слегка упростив. Зарисовка - языковые файлы определяют константу TEST_A, TEST_B и TEST_C. В поле записи может быть только одна из них. Приходит ответ от БД, чтобы сформировать читабельную для пользователя форму мы делаем это так: Код (Text): switch ($row['test']) { case "TEST_A": $string=_TEST_A; break; case "TEST_B": $string=_TEST_A; break; case "TEST_B": $string=_TEST_A; break; /*общий вид такой: case ".....имя константы......": $string=_....имя константы....; break; общие части видны налицо */ } ... echo $string; А нельзя ли как-то сделать так: echo _....ИМЯ КОНСТАНТЫ ВЗЯТОЕ ИЗ ПОЛЯ ЗАПИСИ В БД....; На мой взгляд - нельзя.... А может ?
Я извиняюсь, специально пишу вторым постом - ситуация аналогичная... Меня интересует чисто концепт, рассуждения и возможно или нет. Предположим делаем доску объявлений. Есть свойство ЦВЕТ. Заранее цвета не заполнены. Админ заходит в админку и создаёт цвета - БЕЛЫЙ, ЖЁЛТЫЙ, ЗЕЛЁНЫЙ.... Им присваивается COLOR_ID автоинкримент. Админ даёт им перевод - WHITE, YELLOW, GREEN... В БД им присваивается автоинкримент: COLOR_ID. А записываются они либо в трёх полях, либо в одном в строго определённом порядке - Белый|White. Где-то в коде получается такая ситуация: нужно вывести объявление. Находим поле ['color'], там хранится допустим 1 - это белый. Заранее объединяем запросы where color='$color_id' и проблема шума решена ?
слишком много букаф, трудно разбираться в первом посте. во втором вроде понятнее Если осуществлять перевод с помощью файлов локализации, то сам перевод будет выполняться функцией. PHP: function translate($text){ global $_LOCALE; $index = trim(strtolower($text)); return (is_set($_LOCALE[$index])) ? $_LOCALE[$index] : $text; } Пример использования очень прост (по идее функция должна принимать только англ. слова, но это по идее): PHP: $_LOCALE = array('color'=>'Цвет'); echo translate('Color'); echo translate('Colour'); Вывод будет: Цвет Colour Соответственно в глобальный массив $_LOCALE загружать текст на нужном языке. Хотя в своей реализации я делал это немного по другому. Внутри функции объявлял статический массив, а функция могла принимать два параметра. Первый - индекс, второй - перевод. Если перевод не указан - вернуть перевод из массива. Если указан - занести в массив перевод. Решения с БД возможны, но только для ограниченного кол-ва языков, т.к. для каждого языка нужно будет создавать отдельное поле: [sql]CREATE TABLE messages ( 'msg_id' SERIAL, 'msg_en' VARCHAR(100), 'msg_ru' VARCHAR(100), 'msg_ko' VARCHAR(100), ... );[/sql]