i18n велосипед

  • Автор темы Автор темы ghost9
  • Дата начала Дата начала

ghost9

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

Какие есть предложения по синтаксису такого файла переводов? Что можно добавить/изменить? Мозговой штурм приветствуется :)
 
Этой "новой" идее с sprintf примерно столько же лет, сколько gettext-у. :)

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

После того, как ты придумаешь новый синтаксис для перевода, не забудь написать аналог xgettext.
Почти во всех моих проектах, где использовался gettext, с ним были какие-то проблемы. Хочется написать что-то очень простое и не требующее доп. инструментов и настройки сервера. Задача, по сути, элементарна.
 
Наборы слов, из которых надо взять одно в соотв. с 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]
 
ghost9, на самом деле интересно, но вот в русском языке к примеру две формы множественных чисел 2 яблока но 5 яблок, как ты это собрался описывать?
те. если и делать то абстрактней %u[point|plural]
 
с этим проблемы нет - сделать 1 в 1 как в gettext

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

итд
 
вот хорошоб эти правила отдельно описать. я знаю что там множество камней. построение таких велосипедов дает очень быстрое представление сложности таких проектов.
 
кстати если хочешь голову поломать, задумайся о том что иногда хочется число в слово переводить (у вас 2 сообщения/у вас два сообщения) а там и до падежев недалеко (два, две, двум)
 
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, то там есть автоматизация сборки словарей.
 
Сверху