【问题标题】:PHP Custom Webapp Translation system - Optimization suggestionsPHP 自定义 Webapp 翻译系统 - 优化建议
【发布时间】:2012-01-22 15:52:39
【问题描述】:

我是 webapp(任务管理器)的开发者。
这个应用程序必须有多种语言版本。因此,用户可以通过常用语言下拉菜单切换到不同的语言。

我必须构建一个以 MySQL 作为后端的自定义翻译系统,因为我有特殊的限制。

系统上的主表(包括一些记录作为例子)是translation表:

id | language_id | string_id | message  
1  |     en      | WELCOME   | welcome  
2  |     it      | WELCOME   | benvenuto  

我可以编写一个函数getTranslatedMessage,它将string_id 作为输入,并将 _ 检测当前语言 _ 进行数据库查询并检索一行 _ 返回翻译后的消息

这样一个系统的问题在于,它会给数据库带来很大的压力。如果我在一个页面上有 20 个要翻译的字符串,那么每个页面加载都会有 20 个对数据库的查询。

你认为我应该走这条路,因为它是最干净和最简单的,使用memcache 来保留每个getTranslatedMessage 输出的结果,使用language_idstring_id 作为memcache 条目的键?

你会以不同的方式做到这一点吗?

我在想也许可以通过在启动时将一种语言的所有消息加载到全局数组 $lang 中。

任何建议都会受到欢迎,因为这个组件将是我的应用程序的关键。

谢谢,

【问题讨论】:

    标签: php translation


    【解决方案1】:

    这不是应用程序数据。它不属于数据库。 (请参阅 osCommerce 作为不走这条路的好例子)。由于您已经计划一口气阅读它,因此您可以很好地将应用程序 UI 文本存储在文件中。

    冗长的getTranslatedMessage() 函数名和助记消息ID 也不是一个好主意。使用原始的英文句子而不是大写的缩写。并使翻译函数调用不那么繁琐。否则,一旦超出预期的 20 个字符串,它会使您的应用程序更加不方便。 (OTOH如果想从心理上限制翻译量,msgid和long函数名比较合适。)

    这是无聊的建议。但是您应该考虑使用原生 PHP gettext functions。它们有很多缺点,但不适合这个目的。

    【讨论】:

    • 抱歉,谁说只能将应用程序数据存储到数据库中?
    • 使用整个消息(而不是 msgid)的问题是有些消息很长,甚至 1000 个字符。这就是为什么我还需要翻译功能描述、项目路线图……
    • @dan:这与你的能力无关。它更多的是关于你应该。实际数据和应用程序部分是不同的东西。您甚至可以将运行时/字节码存储到数据库中,没错,但通常应该避免。 -- 如果你有很长的字符串(>1K),那么确实可能需要缩写。但是您应该考虑尽可能将其拆分。或者只在不可避免的情况下使用缩写。
    【解决方案2】:

    您的表中有多少条记录?如果你没有太多(

    $LANG = array();
    
    $result = mysql_query("SELECT string_id, message FROM translation");
    while ($row = mysql_fetch_row($result))
      $LANG[$row[0]] = $row[1];
    
    
    function __($id) {
      global $LANG;
      return (isset($LANG[$id])) ? $LANG[$id] : $id;
    }
    

    使用名称 __() 而不是 getTranslatedMessage。这要容易得多。

    【讨论】:

    • 我将支持使用__(),但有一些特殊的处理程序可以使用Zend_Translate,您可以将其映射为从 CSV 文件中获取地图的翻译。
    【解决方案3】:

    对于多语言网站,我使用的是全局字典、分隔文件中的哈希表。 例如:

    ---带有英文翻译的文件---

    $lang['hello'] = 'Hello';
    

    ---带有德语翻译的文件---

    $lang['hello'] = 'Hallo';
    

    我只是包含了所需的文件。 我认为它的资源非常便宜且速度很快。添加其他语言文件(即使是 Web 表单)并使用它很容易。

    【讨论】:

      【解决方案4】:

      我尝试制作自己的基于翻译的系统。

      我将我的翻译存储在数据库中,以便于修改它们。然后我用这段代码制作了一个超级全局。前任。下面!

      $sql = mysql_query("SELECT * FROM `f_translations` where `language` = '".mysql_real_escape_string($setting[language])."'");
      while ($a = mysql_fetch_array($sql)) { $name=$a['category'].'-'.$a['name']; $language[$name] = utf8_encode($a['translation']);}
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        • 2022-10-04
        相关资源
        最近更新 更多