@
lincanbin 常量你要一个个定义,会让程序变得很复杂。
另外如果你使用常量,就等于定义了一个全局量(无论const还是define),这样很明显会污染Scope。
联系到你之前论坛的实现方法,可能对Scope污染不敏感,但是减少全局量和Public Accessable量有助于降低非规范的调用,借此提高程序质量。(这就是有些东西需要封装的原因)
而Hashtable本身其实不慢,只是内存占用的问题比较突出。(所以要简化和最小化加载的数据)。
多语言还是用gettext这样成熟的方案然后产生语言包就好了。如果需要自己做,自己写个格式来读取语言表(比如$lang->get_my_text('this is a test')),然后放到模板里就行了。
(是的,我已经开始想实现方案了)
$lang = new Lang($request->get_client_language(), $setting);
<? echo $lang->get_text('this is a text %s', $value) ?>
// 哈哈,其实这就是框架的作用,打包好底层功能,然后愉快的使用就行了
=====================================================================
下面是我的实现方法,没用gettext,仅供参考:
// 加载方法,加载好存到LanguageMap里
https://github.com/raincious/facula/blob/master/src/Facula/Base/Prototype/Core/Template.php#L1264// 编译模板的时候主动强制加载(如果未加载过)
https://github.com/raincious/facula/blob/master/src/Facula/Base/Prototype/Core/Template.php#L1165// 后面的工作交给模板编译器自行决定如何处理,这是框架自带的标准模板编译器的处理方法
https://github.com/raincious/facula/blob/master/src/Facula/Unit/Paging/Compiler/Operator/Language.php#L131// 按照上面那个模板引擎的Tag写的HTML模板,注意lang标签,比如“{lang TITLE_HOME_WELCOME /}”
https://github.com/raincious/facula/blob/master/examples/BasicStart/privated/Templates/template.home.htm// 语言格式文件
https://github.com/raincious/facula/blob/master/examples/BasicStart/privated/Templates/language.zh%2Bhome.txt语言文件仅在需要的时候(需要重新渲染或者需要读出用户消息)加载(并缓存),因此开销不算太大。我正在想着如何将其中“用户消息”的语言格式独立出来,这样开销会更低,但是一直苦于实现不太优雅。