对于希望扩大市场渗透率并提高可用性的Magento商户开发商而言,国际化已成为越来越重要的考虑因素。尽管Magento具有强大的本地化功能,但仍可以通过维护多种语言环境的翻译的形式来实现这项工作的很大一部分。
However, a journey of a thousand miles begins with a single step, and this 在里面ial step can be particularly daunting. 什么 must be 翻译d?
理想情况下,将对曾经使用过的每个字符串(无论是后端还是前端)进行记录,以便始终提供计划翻译的详尽清单。但是实际上,这种情况很少见-也许最初不是将站点或模块指定用于国际市场,或者很难证明投资回报率是合理的。因此,没有任何记录的孤儿弦非常普遍,也成为国际化的障碍。
拥有一种机制来追溯检查站点或模块并执行翻译差异分析会不会很好?
找出未翻译的字符串的一种方法是修改翻译工具本身,以在遇到未翻译的字符串时报告它们。这通常表示为对翻译类的快速攻克,即记录字符串,然后还原更改。
基本思想是扎实的,但执行本质上是一时的黑客行为-需要重复发现和实施,并且容易受到监督。
在最近一个涉及多个国家和地区的国际化密集型项目之后,我试图将该方法正式化为一个可靠的模块。
当调用熟悉的__()方法(无论是从块,助手,控制器等)时,将调用Mage_Core_Model_Translate :: 翻译()进行实际的繁重工作。
Mage_Core_Model_Translate :: 翻译()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/ ** *翻译 * * @参数数组$ args * @返回字符串 * / 上市 功能 翻译($ args) { $文字 = 数组_shift($ args); 如果 (is_string($文字) & 安培; & 安培; '' == $文字 || 一片空白($文字) || is_bool($文字) & 安培; & 安培; 假 == = $文字 || is_object($文字) & 安培; & 安培; '' == $文字 - & gt; getText()) { 返回 ''; } 如果 ($文字 实例 Mage_Core_Model_Translate_Expr) { $ code = $文字 - & gt; getCode(自::SCOPE_SEPARATOR); $模块 = $文字 - & gt; getModule(); $文字 = $文字 - & gt; getText(); $翻译 = $ this - & gt; _getTranslatedString($文字, $ code); } 其他 { 如果 (!空的($ _REQUEST['主题'])) { $模块 = '前端/默认/'.$ _REQUEST['主题']; } 其他 { $模块 = '前端/默认/默认'; } $ code = $模块.自::SCOPE_SEPARATOR.$文字; $翻译 = $ this - & gt; _getTranslatedString($文字, $ code); } // 数组_unshift($ args,$ 翻译d); // $ result = @call_user_func_array('sprintf',$ args); $结果 = @vsprintf($翻译, $ args); 如果 ($结果 == = 假) { $结果 = $翻译; } 如果 ($ this - & gt; _translateInline & 安培; & 安培; $ this - & gt; getTranslateInline()) { 如果 (结构($结果, '{{{') == = 假 || 结构($结果, '}}}') == = 假 || 结构($结果, '}} {{') == = 假) { $结果 = '{{{'.$结果. '}} {{'.$翻译. '}} {{'.$文字. '}} {{'.$模块. '}}}'; } } 返回 $结果; } |
在进行了一些启发式确定确切用于上下文的模块和代码之后,Mage_Core_Model_Translate :: __ getTranslatedString()接手了。
Mage_Core_Model_Translate :: _ getTranslatedString()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/ ** *从文本返回翻译后的字符串。 * * @param字符串$ text * @参数字符串$ code * @返回字符串 * / 受保护的 功能 _getTranslatedString($文字, $ code) { $翻译 = ''; 如果 (数组_key_exists($ code, $ this->getData())) { $翻译 = $ this->_数据[$ code]; } 其他if (数组_key_exists($文字, $ this->getData())) { $翻译 = $ this->_数据[$文字]; } 其他 { $翻译 = $文字; } 返回 $翻译; } |
如果存在通过代码或文本进行的翻译,则将其返回-否则,将返回键(未翻译的字符串)。
的 Mage_Core_Model_Translate::_getTranslatedString() 方法提供了绝佳的机会来检测没有翻译的字符串并进行记录。
不幸的是,没有事件可以观察到以完成此检测,因此必须重写模型。使用这种基本模型可能的最轻触,在翻译之前对字符串进行预处理,以确定它是否缺少有趣地区的翻译。
EW_UntranslatedStrings_Model_Core_Translate :: _ getTranslatedString()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/ ** *评估翻译的文本和代码并确定 *如果未翻译。 * * @param字符串$ text * @参数字符串$ code * / 受保护的 功能 _checkTranslatedString($文字, $ code) { Varien_Profiler ::开始(__类__ . '::' . __功能__); Varien_Profiler ::开始(EW_UntranslatedStrings_Helper_Data ::PROFILER_KEY); //循环语言环境并找出差距 $ untranslated短语 = 数组(); 前言($ this->_getLocalesToCheck() 如 $ locale) { 如果(!法师::帮手('ew_untranslatedstrings')->isTranslated($文字,$ code,$ locale)) { $ untranslated短语[] = 数组( '文本' => $文字, '码' => $ code, “语言环境” => $ locale ); } } $ this->_storeUntranslated($ untranslated短语); Varien_Profiler ::停(EW_UntranslatedStrings_Helper_Data ::PROFILER_KEY); Varien_Profiler ::停(__类__ . '::' . __功能__); } / ** *返回之前检查翻译间隙 * * @param字符串$ text * @参数字符串$ code * @返回字符串 * / 受保护的 功能 _getTranslatedString($文字, $ code) { 如果(法师::帮手('ew_untranslatedstrings')->isEnabled()) { $ this->_checkTranslatedString($文字, $ code); } 返回 父母::_getTranslatedString($文字, $ code); } |
这个简单的更改使模块可以收集未翻译的字符串,出于性能方面的考虑,在呈现页面之后,可以在单个查询中将这些字符串打包并刷新到数据库中。执行此收集所需要做的只是在系统配置中启用该模块并浏览站点-对于正在进行的UAT阶段站点而言,这是一个完美的方案。
如果商人或开发人员担心某个地区的翻译差异,那么他可能也担心其他几个地区。 _checkTranslatedString()中的循环可简化此工作,该循环在最终从系统配置中检索的多个语言环境进行迭代。
要检查当前所选语言环境以外的翻译状态, EW_UntranslatedStrings_Helper_Data::isTranslated() 独立于当前商店配置执行评估,并辅以 getTranslator() 它为任何语言环境和商店ID提供了现成的翻译器模型。
EW_UntranslatedStrings_Helper_Data :: isTranslated()和getTranslator()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
/ ** *为翻译人员准备给定的语言环境 * * @param $ locale * @param bool $ allowMatchingKeyValuePairs-匹配的键/值对计为翻译 * @param 空值 $ storeIdContext * @param bool $ forceRefresh * @返回EW_UntranslatedStrings_Model_Core_Translate * / 上市 功能 getTranslator($ locale, $ allowMatchingKeyValuePairs = 空值, $ storeIdContext = 空值, $ force刷新 = 假) { 如果(!isset($ this->_翻译者[$ locale])) { 如果(一片空白($ allowMatchingKeyValuePairs)) { //“ allow”和“ log”是相反的概念 $ allowMatchingKeyValuePairs = !$ this->logMatchingKeyValuePairs(); } / * @var $ 翻译 EW_UntranslatedStrings_Model_Core_Translate * / $翻译 = 法师::getModel('ew_untranslatedstrings / core_translate'); $翻译->setConfig( 数组( Mage_Core_Model_Translate ::CONFIG_KEY_LOCALE => $ locale ) ); $翻译->setLocale($ locale); $翻译->setAllowLooseDevModuleMode(真正); //防止原生开发模式差异 $翻译->setAllowMatchingKeyValuePairs($ allowMatchingKeyValuePairs); 如果(!一片空白($ storeIdContext)) { $翻译->setThemeContext($ storeIdContext); } $翻译->在里面(Mage_Core_Model_Design_Package ::DEFAULT_AREA, $ force刷新); $ this->_翻译者[$ locale] = $翻译; } 返回 $ this->_翻译者[$ locale]; } / ** *文本/代码是否具有给定语言环境的翻译? * * @参数$ text * @参数$ code * @param $ locale * @返回布尔 * / 上市 功能 isTranslated($文字, $ code, $ locale) { / * @var $ 翻译 EW_UntranslatedStrings_Model_Core_Translate * / $翻译 = $ this->getTranslator($ locale); 返回 $翻译->hasTranslation($文字, $ code); } |
尽管它需要在翻译器模型上再重写一些方法,但是此功能使商店所有者或开发人员可以快速地一次对多个语言环境进行差距分析。
尽管概念上很简单,但是有一些可选的调整可使此功能对于有效的字符串收集更加有用。
此模块添加了一个新的系统配置部分,该部分可在“高级-> Developer ->未翻译的字符串。
这些选项提供了几个强大的可自定义选项。例如
如果结果不易于访问和操作,那么即使是最强大的未翻译字符串检测也无济于事。
为此,“报告”中提供了两个新报告->管理员主菜单中未翻译的字符串。
此外,未翻译的字符串报告允许将字符串导出到CSV文件。结合其过滤功能,这使商人或开发人员可以有效地管理字符串,并将其与所有重要上下文一起提供给翻译团队。
查看未翻译的字符串报告是一种“to-do list”,摘要视图使商人或开发人员可以整理剩余的未翻译字符串。特别是,与给定语言环境和存储区关联的字符串可以被截断(单独或整体),清理板岩并允许收集新的字符串集。
但是,更强大的是清除选项。在区域设置和存储上执行此选项(或通过大规模动作功能将其分组),模块将重新评估关联字符串的翻译状态,并删除根据系统配置设置现在视为已翻译的任何字符串。
在添加翻译以解决空白之后,此功能允许商家和开发人员剔除不再相关的字符串,从而确保未翻译的字符串列表始终可操作。
尽管此模块对正式确定前者有很大帮助“hacky”过程中,总有改进的空间。需要记住的一些特殊事项:
如果您想使用这个开源模块并迈出国际化的第一步,可以在Github上找到它:
//github.com/ericthehacker/magento-untranslatedstrings
如自述文件所述,可通过modman轻松安装。明智地使用它!
有兴趣建立一家国际电子商务商店或想要升级您拥有的商店吗?在我们的联系表上告诉我们!
3 评论s
什么’找到所有未翻译的字符串时继续执行的策略。最好我们’d希望将CSV保留在git中,然后将其转储到Magento层次结构中的某些语言环境目录中。但是我猜你’我需要知道主题和插件从哪里读取CSV语言环境文件吗?
嗨,埃里克
出色的工作!但是,我的管理网格‘untranslated strings’缺少一些布局。上面的github存储库中是否缺少布局xml文件?
我已经看到了一些有助于翻译的模块,但是您的代码就是我想要的代码,我只希望布局在admin中工作,以便可以看到一些未翻译的字符串。
如果我是正确的,但事情已经坏了,请修复,因为您的模块看起来很棒,我当然想要它!
J
很高兴该模块可以提供帮助!
应该包含一个布局文件: //github.com/ericthehacker/magento-untranslatedstrings/blob/master/app/design/adminhtml/default/default/layout/ew_untranslatedstrings.xml .
看起来这篇文章在最近的数据迁移期间丢失了格式和图像,所以我’ve恢复了屏幕截图,让您知道期待看到什么。您的实例与屏幕截图不同吗?如果是这样,您可以张贴屏幕截图吗?