我想构建一个可以处理获取区域设置字符串以支持国际化的CMS.我计划将字符串存储在数据库中,然后在数据库和应用程序之间放置一个键/值缓存(如memcache),以防止性能下降,从而使每个页面的数据库都能进行翻译.
这比使用带有字符串数组的PHP文件更复杂 - 但是当你有2,000个翻译行时,这种方法效率非常低.
我想过使用gettext,但我不确定CMS的用户是否会习惯使用gettext文件.如果字符串存储在数据库中,那么可以设置一个不错的管理系统,允许它们随时进行更改,RAM中的缓存将确保获取这些字符串的速度比gettext快或快.考虑到甚至zend框架都没有使用它,我也觉得使用PHP扩展并不安全.
这种方法有什么问题吗?
我想也许我会增加更多的思考.字符串翻译的一个问题是它们不支持日期,金钱或条件语句.但是,感谢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));
Run Code Online (Sandbox Code Playgroud)
另一方面,我不喜欢gettext的一个原因是文本被嵌入到整个应用程序中.这意味着负责主要翻译的团队(通常是英语)必须能够访问项目源代码,以便在默认语句的所有位置进行更改.它几乎与遍布SQL意大利面条代码的应用程序一样糟糕.
因此,使用这样的键是有意义的_('error.404_not_found')
,然后允许内容编写者和翻译者只是担心PO/MO文件而不会弄乱代码.
但是,如果给定键不存在 gettext转换,则无法回退到默认值(就像使用自定义处理程序一样).这意味着您要么在代码中使用写入器 - 或者向没有语言环境转换的用户显示"error.404_not_found"!
另外,我不知道任何使用PHP的gettext的大型项目.我很感激任何链接到使用良好(因此经过测试)的系统,这些系统实际上依赖于本机PHP gettext扩展.
现在约会我的国家10.01.2018和时间10:03.我的时区名称是"Asia/Tashkent"
,如果我写代码:
echo date_default_timezone_get();
echo date('d-m-y H:m');
Run Code Online (Sandbox Code Playgroud)
显示的时区名称:Europe/Moscow
日期时间:10-01-18 08:01
我怎么能得到我的时区和我目前的约会?