在 PhpStorm 中从 JSON 文件自定义建议/完成 PHP 函数

Custom suggestions/completion in PHP function from JSON file in PhpStorm

提问人:beeftony 提问时间:11/15/2023 最后编辑:beeftony 更新时间:11/20/2023 访问量:33

问:

我有一个函数,我希望 PhpStorm 在我开始在引号之间键入时开始从 JSON 文件中建议值。translate("")

这个想法是,我有一个带有翻译字符串的 JSON 文件,当我开始输入时,它应该根据我已经输入的字符建议该 json 文件中已经包含的翻译。

经过一些研究,我认为这目前在 PhpStorm 中是不可能的,但也许这里有人有一个想法或替代方案。

谢谢!

php json 自动完成 phpstorm 自动建议

评论

1赞 LazyOne 11/15/2023
如果您有时间和愿望将JSON文件转换为另一个JSON文件(使用特殊格式),请查看PHP Toolbox插件,它可以提供此类内容。plugins.jetbrains.com/plugin/8133-php-toolboxP.S.那个功能 -- 是某些框架/CMS 的一部分吗?也许该框架的插件已经支持它(比如 Symfony/LaravelIdea 可以做 AFAIK)。例如,像“Text Domain Completion for WordPress”插件这样的东西......translate()
1赞 LazyOne 11/15/2023
您还可以使用高级元数据功能(为特定函数提供可接受值的列表)。但我完全不确定它在这里是否能很好地工作(翻译上下文,可能值的大列表)。无论如何:jetbrains.com/help/phpstorm/ide-advanced-metadata.html
1赞 beeftony 11/17/2023
我通过编写一个脚本来使它工作,该脚本将我的翻译字符串添加到 PhpStorm 元文件中。不理想,但它可以完成工作。谢谢!
0赞 LazyOne 11/17/2023
请将其作为答案发布 - 它将帮助处于类似情况的其他人(答案被接受的问题在搜索结果中具有更好的可见性)。只需描述您使用过的内容等(如果您可以显示完成在 IDE 中的外观的屏幕截图 - 这将是一个很大的好处)。如果带有翻译字符串的文件是某种标准格式(现有的 CMS/框架),那么也请考虑分享您的基本转换脚本(因为要点是完全可以的——只是为了展示整个过程/想法)。
0赞 beeftony 11/18/2023
周一会做!谢谢!

答:

1赞 beeftony 11/20/2023 #1

我使用 PhpStorm 高级元数据使它工作。

我在项目根目录中创建了一个文件,这将为方法的第一个 () 参数添加自动完成/建议:.phpstorm.meta.php0translate

<?php

namespace PHPSTORM_META {
    expectedArguments(
        \App\Helper\TranslationHelper::translate(),
        0,
        /* Generated */
        "Auto completion result",
        "This is also a suggested result",
        "Give me more suggestions PhpStorm",
        /* Generated */
    );
}

然后写了一个 Symfony 命令,从我的翻译文件中获取字符串并将它们包含在两个注释之间:/* Generated */

$translations = json_decode(file_get_contents($this->parameterBag->get('app.project.path') . '/resources/translations/de.json'), true);

$metadataPath = $this->parameterBag->get('app.project.path') . '/.phpstorm.meta.php';
$identifier = "/* Generated */";
$regexIdentifier = $this->escape($identifier);
$regex = "/$regexIdentifier(.*?)$regexIdentifier/s";

// Build the arguments string that will be written into the metadata file
$translationsAsArguments = "$identifier\n";
foreach ($translations as $translation) {
    $translationsAsArguments .= "\t\t\"$translation\",\n";
}
$translationsAsArguments .= "\t\t$identifier";

// Write to disk
$translationsMetadata = preg_replace($regex, $translationsAsArguments, file_get_contents($metadataPath));
file_put_contents($metadataPath, $translationsMetadata);

该解决方案是使用 Symfony 6.3 用 PHP 编写的

这些建议在 IDE 中如下所示:Completion in PhpStorm