【问题标题】:Pseudolocalization in CakePHP/2CakePHP/2 中的伪本地化
【发布时间】:2019-01-30 20:55:53
【问题描述】:

我正在调整现有应用程序以支持多种语言,我想实现 pseudolocalization,即制作本地化字符串:

<?php echo h(__('Edit program settings')); ?>

...脱颖而出:

[!!! εÐiţ Þr0ģЯãm səTτıИğ§ !!!]

...这样我就可以快速发现遗漏并检测潜在的布局问题。

除非我错了,否则该功能不是内置的,也没有第三方插件。我的机会有多大?

我觉得一个明智的方法是扩展I18n 并覆盖I18n::translate()。但是我对 CakePHP 的内部结构不是特别熟悉,我不确定如何让__() 和家人使用我的扩展类。

另一方面,lib\Cake\basics.php 中的函数包含在 function_exists() 调用中,所以我想我可以编写自己的版本...

我欢迎任何建议。

【问题讨论】:

  • 如果您能描述您的具体用例并包含一些代码,这可能会有所帮助。
  • @ndm 好的,我已经编辑了问题。
  • 我了解了伪本地化的一般概念,但是您希望在您的应用程序中具体在哪里以及如何使用它?您使用的是执行 GUI 测试的自动化环境吗?
  • @ndm 不,没有什么花哨的。我只想像往常一样在屏幕上显示字符串,以便在使用应用程序时查看它们。 (我现在正在使用 auto_prepend_file 在 CakePHP 加载原始函数之前定义 i18n 函数,看起来很有希望。)
  • 可能不会,因为您必须使用相同的类名,而且 PHP 不允许重用/重新声明类名。

标签: cakephp internationalization cakephp-2.4


【解决方案1】:

理想的技术是能够定义一个自定义类:

class CustomI18n extends I18n {
    public static function translate($singular, $plural = null, $domain = null, $category = 6, $count = null, $language = null) {
    }
}

... 并指示 CakePHP 使用我的自定义类而不是原始类。这将与例如一致。视图助手的工作方式。

不幸的是,我不认为它不能完成¹,因为视图中的$this-&gt;Html 是一个动态属性,但__() 包含一个硬编码的类名:I18n::translate($singular)

¹ 是的,almost everything 可以做到。你知道我的意思:)


由于它只是一个不适合生产的辅助工具,因此您总是可以求助于并非真正特定于 CakePHP 的快速而肮脏的 hack:

  1. 将您感兴趣的lib\Cake\basics.php 中的函数重写到您选择的文件中,通常是以下划线开头的函数:__()_n()、...

    function __($singular, $args = null) {
        if (!$singular) {
            return;
        }
        $singular = pseudotranslation($singular); // <---------------------
    
        App::uses('I18n', 'I18n');
        $translated = I18n::translate($singular);
        if ($args === null) {
            return $translated;
        } elseif (!is_array($args)) {
            $args = array_slice(func_get_args(), 1);
        }
        return vsprintf($translated, $args);
    }
    

    确保您没有破坏vsprintf 代码。

  2. 使用auto_prepend_file 在 CakePHP 启动之前加载文件。理想情况下,将其设置在您的开发框中。

这具有不引人注目的优点。你可以很容易地启用或禁用auto_prepend_file,或者你可以在你的前置脚本中处理它。


另外,CakePHP 允许 override 大多数类,因此您可以将 /lib/Cake/I18n/I18n.php 复制为 /app/Lib/I18n/I18n.php 并根据自己的喜好调整 I18n::translate()。但是我发现这不太方便:如果升级 CakePHP,您仍然需要维护系统文件的自定义副本,并且没有简单的机制可以在运行时禁用伪本地化,因为 CakePHP 将始终使用该文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多