为了本地化我的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 lexer进行较低级别的访问。
我的问题是:
t()
的电话?请不要建议独立的正则表达式,因为它们不可能完全解决我的问题。
提前谢谢。
答案 0 :(得分:1)
您所描述的基本上是编码标准。当然,确保字符串正确本地化是许多项目标准的一部分。所以我认为PHPCS对你来说是正确的工具,但是你需要为它编写一个自定义的嗅探器,因为没有什么可以完全按照你的目的去做。
最好的办法是从Github克隆PHPCS Git repo,然后在CodeSniffer / Standards下创建一个新目录来包含你的自定义嗅探。假设你称之为MyStandard。确保在其下创建一个Sniffs目录,然后在子目录中创建一个新的嗅探器。看看那里的其他标准,看看它们是如何工作的。您还会发现从另一个标准复制现有的ruleset.xml文件更容易,只需更改适合您的效果。如果你不想在任何地方包含任何其他的嗅探(你只想运行这个嗅探检查你的代码),那么你可以只指定一个名称和描述,并将其余部分留空。
有basic tutorial涵盖了这一点。
在你的嗅探中,你显然希望它只检查JS文件,因此请确保在supportedTokenizers成员var(也在文档中)中指定它。这将确保始终忽略PHP和CSS文件。
当您进行实际检查时,您将完全低级访问文件的已解析和标记化内容。有许多辅助函数可以检查其他作用域内的代码,或者帮助您在堆栈中前后移动以查找所需的代码。
提示:使用-v选项运行PHPCS以查看文件上的令牌输出。它应该可以帮助您更轻松地看到结构。
如果你想真正做好事,你甚至可以为你的嗅探创建一个不错的单元测试,以确保它随着时间的推移而持续运行。
毕竟,你要检查你的代码:
phpcs --standard=MyStandard /path/to/code
您可以在代码编辑器中使用PHPCS存在的大量集成。
您可能决定在标准中添加新的更多嗅探以检查其他内容,然后您可以使用ruleset.xml文件或编写更多自定义嗅探类轻松地执行这些操作。
我希望有所帮助。如果你决定写自己的嗅闻并需要帮助,请告诉我。