i18n велосипед

ghost9

Новичок
На фоне обсуждения написания парсера плейсхолдеров в запросах моя тема очень кстати будет. Народ, как лучше всего оформить и парсить фразы переводов? Например, код
Код:
__("blog::Hello, %s and %s!",  ["ghost", "world"]);
ищет фразу "Hello, %s and %s!" в домене blog, потом форматирует ее стандартной phpшной функцией vsprintf с массивом аргументов. Наборы слов, из которых надо взять одно в соотв. с plural-правилами(их можно тянуть из функции-замыкания или даже в классы обернуть, у меня пока заглушка стоит), можно обозначать так:
Код:
__("pm::You have %u[message|messages]",  [3]);
Какие есть предложения по синтаксису такого файла переводов? Что можно добавить/изменить? Мозговой штурм приветствуется :)
 

hell0w0rd

Продвинутый новичок

fixxxer

К.О.
Партнер клуба
Этой "новой" идее с sprintf примерно столько же лет, сколько gettext-у. :)

С plural - ну нормально выглядит, главное учесть, что в некоторых случаях плейсхолдер может оказаться внутри квадратных скобочек, и парсить сначала скобочки.
 

Вурдалак

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

ghost9

Новичок
https://github.com/symfony/Translation, http://symfony.com/doc/current/components/translation/usage.html
Зачем в этой теме нужен велосипед?) Идея описания типа подставляемого значения прямо в плесхолдерах относительно нова - я не видел реализаций до Фанатовской.
Что может быть принципиально нового в этом велосипеде?)
Тут мне не нравится как минимум необходимость в именованых переменных. Это же так лень будет их писать во время разработки. Стандартный синтаксис printf намного лаконичнее и мощнее.

После того, как ты придумаешь новый синтаксис для перевода, не забудь написать аналог xgettext.
Почти во всех моих проектах, где использовался gettext, с ним были какие-то проблемы. Хочется написать что-то очень простое и не требующее доп. инструментов и настройки сервера. Задача, по сути, элементарна.
 

Breeze

goshogun
Команда форума
Партнер клуба
Наборы слов, из которых надо взять одно в соотв. с plural-правилами(их можно тянуть из функции-замыкания или даже в классы обернуть, у меня пока заглушка стоит), можно обозначать так:
Код:
__("pm::You have %u[message|messages]",  [3]);
ИМХО лучше эту штуку готовить снаружи чем-то умеющим __toString

Один pm::You have %u лучше чем вагон
pm::You have %u[message|messages]
pm::You have %u[point|points]
pm::You have %u[join|joins]
pm::You have %u[cent|dollars]
 

WMix

герр M:)ller
Партнер клуба
ghost9, на самом деле интересно, но вот в русском языке к примеру две формы множественных чисел 2 яблока но 5 яблок, как ты это собрался описывать?
те. если и делать то абстрактней %u[point|plural]
 

fixxxer

К.О.
Партнер клуба
с этим проблемы нет - сделать 1 в 1 как в gettext

en: $n != 1
ru: ($n==1) ? 0 : (($n>=2 && $n<=4) ? 1 : 2)

итд
 

WMix

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

WMix

герр M:)ller
Партнер клуба
кстати если хочешь голову поломать, задумайся о том что иногда хочется число в слово переводить (у вас 2 сообщения/у вас два сообщения) а там и до падежев недалеко (два, две, двум)
 

ghost9

Новичок
ghost9, на самом деле интересно, но вот в русском языке к примеру две формы множественных чисел 2 яблока но 5 яблок, как ты это собрался описывать?
те. если и делать то абстрактней %u[point|plural]
Эти правила можно вынести в отдельную сущность(в класс, например) и обращаться к ней, когда надо.

ИМХО лучше эту штуку готовить снаружи чем-то умеющим __toString
Один pm::You have %u лучше чем вагон
pm::You have %u[message|messages]
pm::You have %u[point|points]
pm::You have %u[join|joins]
pm::You have %u[cent|dollars]
Я хочу сделать как-то так, чтобы логика отображения фразы была ясна при первом взгляде на строчку. Можно и собирать ее из кусочков, конечно, но тогда вырастет сложность и многословность конструкции.
 

Вурдалак

Продвинутый новичок
Почти во всех моих проектах, где использовался gettext, с ним были какие-то проблемы. Хочется написать что-то очень простое и не требующее доп. инструментов и настройки сервера. Задача, по сути, элементарна.
Я тоже не очень люблю gettext, то там есть автоматизация сборки словарей.
 
Сверху