Я хочу создать CMS, которая может обрабатывать выборку строк локали для поддержки интернационализации. Я планирую хранить строки в базе данных, а затем класть кеш ключа/значения, такой как memcache между базой данных и приложением, чтобы предотвратить падение производительности для каждой страницы для каждой страницы для перевода.
Это сложнее, чем использование файлов PHP с массивами строк, но этот метод невероятно неэффективен, когда у вас есть 2000 строк перевода.
Я думал об использовании gettext, но я не уверен, что пользователям CMS будет удобна работа с файлами gettext. Если строки хранятся в базе данных, тогда может быть настроена хорошая система администрирования, позволяющая им вносить изменения, когда захочет, а кеширование в ОЗУ гарантирует, что выборка этих строк будет такой же быстрой или быстрой, чем gettext. Я также не чувствую себя в безопасности, используя расширение PHP, рассматривая даже не использует его zend framework.
Что-то не так с этим подходом?
Update
Я подумал, что, возможно, я бы добавил больше пищи для размышлений. Одна из проблем с строковыми переводами заключается в том, что они не поддерживают даты, деньги или условные утверждения. Однако благодаря intl PHP теперь имеет MessageFormatter, что действительно нужно использовать в любом случае.
// Load string from gettext file
$string = _("{0} resulted in {1,choice,0#no errors|1#single error|1<{1, number} errors}");
// Format using the current locale
msgfmt_format_message(setlocale(LC_ALL, 0), $string, array('Update', 3));
В другой заметке одна из вещей, которые мне не нравятся в gettext, заключается в том, что текст встроен в приложение по всему месту. Это означает, что команда, ответственная за первичный перевод (обычно английский), должна иметь доступ к исходному коду проекта, чтобы внести изменения во все места, в которые помещаются заявления по умолчанию. Это почти так же плохо, как и приложения с SQL-спагетти-кодом.
Таким образом, имеет смысл использовать такие клавиши, как _('error.404_not_found')
, которые затем позволяют писателям и переводчикам контента просто беспокоиться о файлах PO/MO, не вступая в код.
Однако, если трансляция gettext не существует для данного ключа, тогда нет способа вернуться к умолчанию (например, с помощью специального обработчика). Это означает, что у вас либо есть скрипт в вашем коде - или у вас есть "error.404_not_found" для пользователей, у которых нет языкового перевода!
Кроме того, я не знаю больших проектов, которые используют PHP gettext. Я был бы признателен за любые ссылки на хорошо используемые (и, следовательно, проверенные) системы, которые фактически полагаются на встроенное расширение gettext PHP.