Рассмотрите возможность написания библиотеки PHP, которая будет опубликована через Packagist или Pear. Он адресован разработчикам-сверстникам, использующим его в произвольных настройках.
Эта библиотека будет содержать некоторые сообщения о статусе, определенные для клиента. Как я интернационализирую этот код, чтобы разработчики, использующие библиотеку, имели максимально возможную свободу подключать свой собственный метод локализации? Я не хочу ничего принимать, особенно не заставляя разработчика использовать gettext.
Чтобы работать с примером, допустим этот класс:
class Example {
protected $message = "I'd like to be translated in your client language.";
public function callMe() {
return $this->message;
}
public function callMeToo($user) {
return sprintf('Hi %s, nice to meet you!', $user);
}
}
Здесь есть две проблемы: как пометить приватный $message
для перевода и как разрешить разработчику локализовать строку внутри callMeToo()
?
Один (очень неудобный) вариант был бы, чтобы спросить о некотором методе i18n в конструкторе, например:
public function __construct($i18n) {
$this->i18n = $i18n;
$this->message = $this->i18n($this->message);
}
public function callMeToo($user) {
return sprintf($this->i18n('Hi %s, nice to meet you!'), $user);
}
но я очень надеюсь на более элегантное решение.
Изменить 1: Помимо простой подстановки строк, поле i18n является широким. Предпосылка заключается в том, что я не хочу упаковывать какое-либо решение i18n в свою библиотеку или принуждать пользователя выбирать его специально для моего кода.
Затем, как я могу структурировать свой код, чтобы обеспечить лучшую и наиболее гибкую локализацию для разных аспектов: строковый перевод, число и форматирование валюты, даты и время,...? Предположим, что один или другой файл выводится из моей библиотеки. В каком месте или интерфейсе может потребляющий разработчик подключиться к ее решению локализации?