phpMultiLang v2.0

  Версия: 2.0
  12.05.2005



  Чтобы посмотреть, что нового в этой версии, в загляните в файл CHANGES.txt в этом архиве


  
  Содержание:

Автор
Лицензия
Содержимое архива
Описание
Использование
Синтаксис языковых файлов
Обратная связь

Автор

Будылов Константин.
[email protected]

Лицензионная информация

Данный продукт распространяется согласно General Public License (GPL),
полный текст которой находится в файле GPL.txt


Содержимое архива

documentation  Документация
--------doc_RU.html  Для русских
--------doc_EN.html  Для других
languages  Языковые файлы
--------ru.lang  русский
--------en.lang  английский
cache  Каталог для кеша

class.phpMultiLang.php  класс phpMultiLang
example.php  пример использования
GPL.txt  Текст лицензии
CHANGES.txt  Список изменений в этой версии


Описание

Класс предназначен для организации мультиязыковой поддержки в web приложении.
Обеспечивает всю основную необходимую функциональностьдля получения и вывода языковых данных,
плюс некоторые дополнительные возможности, а именно:

-В качестве источников языковых данных допускается использование файлов и/или массивов.
-В случае использования файлов - возможна обработка любого их количества, а также кеширование результатов обработки.
-Корректная обработка файлов при magic_quotes_runtime == TRUE.
-Возможно динамическое (т.е. после обработки данных) добавление новых языковых данных из массивов.
-Возможно динамическое изменение уже обработанных данных
-В языковых данных допустима любая HTML-разметка.
 
-Возможно динамическое форматирование языковых данных во время вывода с использованием
модификаторов sprintf()


Плюс ко всему класс обладает понятным интерфейсом, и прост в использовании.


Использование

Использование очень просто:

Во первых, включаем в свой скрипт файл класса:
require "class.phpMultiLang.php";

Затем, делаем то же, что мы делаем с большинством классов, -создаём объект.

В конструкторе задаётся общая директория для языковых файлов ( _LangRoot ), если таковые будут использованы.
Второй параметр - директория для файлов кеша ( _LangCachePath ).
Путь может быть как абсолютным, так и относительным к текущей.
Указанные директории должны существовать, и быть доступными для чтения, а _LangCachePath - также и для записи.
Если какое-либо из этих условий не выполнено, будет сгенирирована ошибка, и значение директории установится в CWD.
Текущая рабочая директория также является значением по умолчанию для обоих аргументов.
$Lang = new phpMultiLang('languages','cache');   

Затем необходимо задать индексы и параметры языков:
$Lang -> AssignLanguage('EN','en');
$Lang -> AssignLanguage('RU',null,array('LC_ALL','ru'));
Первый аргумент метода AssignLanguage() - уникальный индекс языка (string), по которому в дальнейшем он будет идентифицироваться.
Второй (необязательный) - путь к директории относительно _LangRoot, в которой должны находиться файлы
для регистрируемого языка.
По умолчанию будет использован _LangRoot.
Третий аргумент используется если Вы хотите установить значение локали для данной языковой конфигурации.
В качестве третьего параметра может быть передан массив, нулевой элемент которого - ИМЯ КОНСТАНТЫ (в формате строки) для функции PHP setlocale(), а элемент с индексом '1' - имя локали для этой же функции (см. мануал к setlocale()).

Если Вы хотите установить настройки локали, не указывая каталог для языковых файлов,
передайте NULL в качестве второго параметра

Если на момент вызова AssignLanguage() директория неизвестна, можно задать её и позже
с помощью вызова SetLanguageDir(), передав в качестве параметров индекс языка и имя директории.
Например:

$Lang -> SetLanguageDir('RU','ru'); 

После этого мы указываем, где брать необходимые данные.

Для этого используется метод AssignLanguageSource().
В качестве первого аргумента передаётся индекс языка, для которого добавляются данные.
В качестве второго может быть передано имя файла(относительно директории с файлами,
определённой для этого языка), доступного для чтения, либо массив, непосредственно содержащий данные.
$Lang -> AssignLanguageSource('RU','russian.lang',3600);
$Lang -> AssignLanguageSource('EN','english.lang',3600);
$Lang -> AssignLanguageSource('RU',array("some_index1"=>"Какая-то строка"));
$Lang -> AssignLanguageSource('RU',array("some_index2"=>"Cтрока с %sмодификаторами%s"));
Третий параметр - время устаревания кеша данного файла(в секундах),
имеет смысл только при добавлении файла и при использовании для данного языка режима кеширования:



После того, как мы решим, какой язык нам понадобится,
мы должны будем инициализировать его, передав его индекс(тот, который задали вызовом AssignLanguage),
в качестве параметра в метод SetLanguage():
$Lang -> SetLanguage('RU', TRUE);
Если второй параметр == TRUE, то для данного языка включается режим кеширования файлов исходных данных.

В момент вызова этого метода, в спучае, если были заданы настройки локали для языка (см. метод AssignLanguage()), произойдёт вызов setlocale() с переданными ранее параметрами.

Всё, что нам теперь осталось, -вывести обработанные данные.

Это делается путём вызова метода GetString(),
в качестве параметра для которого необходимо передать индекс нужной нам строки:
echo $Lang->GetString("some_index1");
echo $Lang->GetString("some_index2");

Выведет соответственно:

Какая-то строка
и
Строка с %s модификаторами %s

Также существует возможность дополнительного форматирования строки,
содержащей sprintf-модификаторы(в данном примере - строка под индексом "some_index2")
во время вывода с использованием метода GetFString():
echo $Lang->GetFString("some_index2",array("<font color=#008080><b>","</b></font>"));

Выведет:

Строка с  модификаторами 

В качестве первого параметра GetFString() принимает индекс нужной строки.
В качестве второго - массив, содержащий данные, подлежащие форматированной вставке в строку.
Имена ключей значения не имеют. Значения обрабатываются в том порядке, в котором они заданы в массиве.

Если модификаторов в строке окажется меньше, чем значений в массиве, лишние значения игнорируются.
Если наоборот, -модификатор, соответствующее значение для которого не найдено, возвращается без изменений.


Ещё одна возможность, которая может пригодиться, -динамическое изменение строки.

Для этого служит метод GetStringReference().
Если вызвать его подобным образом:

$d =&$Lang->GetStringReference('some_index1');

то $d окажется ссылкой на строку под индексом "some_index1",
и посредством изменения $d будет возможно напрямую изменять содержимое строки "some_index1":

$d = "Изменённая строка";
echo $Lang->GetString("some_index1");

Выведет: Изменённая строка

Наконец, ещё два метода, которые могут пригодиться:
    - GetLanguage() - возвращает индекс текущего используемого языка.
и
    - GetLocale() - возвращает текущую установленную локаль, если она была установлена.


Синтаксис языкового файла

Все строки в языковом файле должны иметь следующий формат:

>индекс(один и более пробелов)'Строка'

Индекс - последовательность символов A-Z, 0-9, и _ (нечувствительно к регистру)

Строка - последовательность любых символов, заключённая в одинарные кавычки.

В случае, если строка должна содержать одинарные кавычки, они должны быть экранированы обратным слешем: \'

Строки могут содержать любую html разметку.

Пустые 'Cтроки' запрещены.
В этой версии пустые строки приводят к ошибкам обработки файла.
В будущих версиях я постараюсь исправить это.

И ещё.
Я точно не проверял, но видимо, всё, что не попадает под паттерн строки, не обрабатывается никак.
(это к вопросу о комментариях в файле).
В будущих версиях обязательно будет добавлена поддержка комментариев в файлах.

Вот, собственно, и всё.

Наслаждайтесь :)


Обратная связь

Пожалуйста, если у Вас возникли какие-либо вопросы или пожелания,
свяжитесь со мной
по eMail.

Конструктивная критика также с удовольствием принимается.




Содержание