WBS
Новичок
Речь идет об аналоге стандартной функции vsprintf(), только с немного иным функционалом.
Исходные данные
Шаблон:
"{duration}<br>{animals}: {cats_pcnt} кошек и {dogs_pcnt} собак"
Массив:
Какие-то данные, обеспечивающие мультиязычность (с пока неясным форматом):
Требуется вернуть форматированную строку.
1. С учетом вставки единиц измерения.
duration (задано в секундах) => ".. часов .. минут"
animals => ".. животных"
cats_pcnt => "..%"
dogs_pcnt => "..%"
2. С правильным окончанием слов (1 час, 2 часа, 5 часов).
3. На указанном языке.
Ожидаемый результат работы функции.
Для "ru"
"3 часа 10 минут<br>21 животное: 71.4% кошек и 28.6% собак"
Для "en"
"3 hours 10 minutes<br>21 animal: 71.4% cats and 28.6% dogs"
На данный момент имеется:
1. Функция
num_ending ($number, $ending_arr)
Возвращает слово в правильной форме для количества $number.
num_ending(15, array("день", "дня", "дней")) => "дней"
2. Функция
sec_to_dhms ($sec)
Преобразует секунды $sec в массив вида
array("d" => {дни}, "h" => {часы}, "m" => {минуты}, "s" => {секунды})
sec_to_dhms(190) => array("h" => 3, "m" => 10)
Вопросы:
1. Как грамотно организовать хранение исходных данных?
В идеале шаблон нужно полностью "отделить" от языка.
2. Как обеспечить взаимодействие между всем этим добром?
Т.е. пока мне не очень понятна общая структура функции и механизм передачи различных переменных (в т.ч. списков слов для разных словоформ и языков).
Некоторые мои мысли по реализации.
На данный момент я прямо в шаблоне прописываю единицы измерения (один символ после фигурных скобок). Примерно так:
"{duration}t<br>{animals}a: {cats_pcnt}% кошек и {dogs_pcnt}% собак"
В функции я разбираю шаблон используя регулярные выражения
В цикле я по-разному обрабатываю данные в зависимости от единиц измерения.
- если "t" (время) - вызываю sec_to_dhms() и форматирую как время;
- если "a" (животное) - вызываю num_ending() и отформатирую как ".. животных" (в правильной словоформе);
- если "%" (процент) - округляю до десятых и добавляю знак процента.
Далее я заполняю шаблон через str_replace().
Поддержка мультиязычности у меня пока не реализована.
В общем, с удовольствием послушаю чужие мысли на этот счет.
Исходные данные
Шаблон:
"{duration}<br>{animals}: {cats_pcnt} кошек и {dogs_pcnt} собак"
Массив:
Код:
$arr = array(
"duration" => 190,
"animals" => 21,
"cats_pcnt" => 71.428571,
"dogs_pcnt" => 28.571429,
);
Какие-то данные, обеспечивающие мультиязычность (с пока неясным форматом):
Код:
$lang = array(
"ru" => ...,
"en" => ...,
...
);
Требуется вернуть форматированную строку.
1. С учетом вставки единиц измерения.
duration (задано в секундах) => ".. часов .. минут"
animals => ".. животных"
cats_pcnt => "..%"
dogs_pcnt => "..%"
2. С правильным окончанием слов (1 час, 2 часа, 5 часов).
3. На указанном языке.
Ожидаемый результат работы функции.
Для "ru"
"3 часа 10 минут<br>21 животное: 71.4% кошек и 28.6% собак"
Для "en"
"3 hours 10 minutes<br>21 animal: 71.4% cats and 28.6% dogs"
На данный момент имеется:
1. Функция
num_ending ($number, $ending_arr)
Возвращает слово в правильной форме для количества $number.
num_ending(15, array("день", "дня", "дней")) => "дней"
2. Функция
sec_to_dhms ($sec)
Преобразует секунды $sec в массив вида
array("d" => {дни}, "h" => {часы}, "m" => {минуты}, "s" => {секунды})
sec_to_dhms(190) => array("h" => 3, "m" => 10)
Вопросы:
1. Как грамотно организовать хранение исходных данных?
В идеале шаблон нужно полностью "отделить" от языка.
2. Как обеспечить взаимодействие между всем этим добром?
Т.е. пока мне не очень понятна общая структура функции и механизм передачи различных переменных (в т.ч. списков слов для разных словоформ и языков).
Некоторые мои мысли по реализации.
На данный момент я прямо в шаблоне прописываю единицы измерения (один символ после фигурных скобок). Примерно так:
"{duration}t<br>{animals}a: {cats_pcnt}% кошек и {dogs_pcnt}% собак"
В функции я разбираю шаблон используя регулярные выражения
Код:
if ($count = preg_match_all("/\{([a-z_]+)\}(.{1})/Usi", $pattern, $matches)) {
for ($i=0; $i<$count; $i++) {
...
}
}
- если "t" (время) - вызываю sec_to_dhms() и форматирую как время;
- если "a" (животное) - вызываю num_ending() и отформатирую как ".. животных" (в правильной словоформе);
- если "%" (процент) - округляю до десятых и добавляю знак процента.
Далее я заполняю шаблон через str_replace().
Поддержка мультиязычности у меня пока не реализована.
В общем, с удовольствием послушаю чужие мысли на этот счет.