0

为了本地化我的 javascript 中使用的字符串,我想扫描我的所有 js 文件以查找此类字符串。

我正在使用一个t()函数来请求字符串翻译,如下所示:

t("Hello world");

或动态部分:

t("Hello @user", {"@user": "d_inevitable"});

我想检测对t()函数的所有调用,从而收集 php“build”脚本中第一个参数中包含的字符串,但跳过以下内容:

function foo(t) {
   t("This is not the real t, do not localize this!");
}

function bar() {
    var t = function(){}; //not the real t either...
}

function zoo() {
    function t() {
       //This also isn't the real t() function.
    }
}

t("Translate this string, because this is the real t() in its global scope");

所以这里的简单规则是被调用的 t 函数必须在全局范围内,以便第一个参数有资格作为翻译字符串。

通常,不允许将动态运行时数据作为第一个参数。的第一个参数t()必须始终是“常量”文字字符串。

我认为php codesniffer会帮助我做到这一点,但是我能找到的所有文档都是关于执行代码标准(或检测违反它的)。我需要对其 js 词法分析器的较低级别的访问。

我的问题是:

  1. php 代码嗅探器的 js 词法分析器能帮我解决我的问题吗?
  2. 如果是这样,我如何访问该词法分析器?
  3. 是否有任何其他 php 库可以帮助我找到对的调用t()

请不要建议独立的正则表达式,因为它们不可能完全解决我的问题。

先感谢您。

4

1 回答 1

1

您所描述的基本上是一个编码标准。当然,确保字符串正确本地化是许多项目标准的一部分。所以我认为 PHPCS 是适合您的工具,但您需要为它编写自定义嗅探,因为没有什么可以完全满足您的需求。

最好的办法可能是从 Github 克隆 PHPCS Git 存储库,然后在 CodeSniffer/Standards 下创建一个新目录以包含您的自定义嗅探。假设您将其称为 MyStandard。确保在其下创建一个 Sniffs 目录,然后创建一个子目录来存放新的嗅探器。看看那里的其他标准,看看它们是如何工作的。您还会发现从另一个标准复制现有的 ruleset.xml 文件并更改内容以适合您更容易。如果您不想在任何地方包含任何其他嗅探(您只想对代码运行此检查),那么您只需指定名称和描述并将其余部分留空。

有一个基本教程涵盖了这一点。

在您的嗅探中,您显然希望它仅检查 JS 文件,因此请确保在 supportedTokenizers 成员 var(也在文档中)中指定它。这将确保始终忽略 PHP 和 CSS 文件。

当您开始进行实际检查时,您将对文件的已解析和标记化内容具有完全的低级访问权限。有很多辅助函数可以检查代码是否在其他范围内,或者帮助您在堆栈中来回移动以查找所需的代码位。

提示:使用 -v 选项运行 PHPCS 以查看文件中的令牌输出。它应该可以帮助您更轻松地查看结构。

如果你真的想正确地做事,你甚至可以为你的嗅探创建一个很好的单元测试,以确保它随着时间的推移保持运行。

毕竟,你会像这样检查你的代码: phpcs --standard=MyStandard /path/to/code

您可以在代码编辑器中使用许多 PHPCS 的集成。

您可能决定向标准添加新的更多嗅探以检查其他内容,然后您可以使用您的 ruleset.xml 文件或编写更多自定义嗅探类轻松完成。

我希望这会有所帮助。如果您决定编写自己的嗅探器并需要帮助,请告诉我。

于 2012-06-15T03:27:16.750 回答