【问题标题】:Is it possible to add translation variables automatically in Laravel?是否可以在 Laravel 中自动添加翻译变量?
【发布时间】:2021-09-28 00:05:24
【问题描述】:

我有一些刀片,我已经包括了很多这样的吸引力:

    <div>{{ __('auth.Example') }}</div>
    <a href='#'>{{ __('xyz.Another One Example') }}</a>
    <span>{{ __('xyz.Example Number Three') }}</span>
    ...

我将xyz.phpauth.php 文件添加到lang/enlang/pl 目录。现在我想知道,是否可以使用一些命令或方法,将适当的变量添加到这些文件中以重新填充? 除了准备好的翻译,我不会,但会很感激这样的事情:

xyz.php

return [
...
'Another One Example' => 'Another One Example',
'Example Number Three' => 'Example Number Three',
...
];

auth.php

return [
...
'Example' => 'Example'
...
];

之后,我可以快速更改正确语言的翻译值,但首先我需要在正确的文件中包含正确的变量。现在我正在手动将每个变量复制到适当的文件中,但感觉就像是永恒的......你有什么想法,我怎样才能更容易做到?

【问题讨论】:

标签: php laravel automation translation


【解决方案1】:

我以前写过这样的脚本。我使用下面的函数扫描所有文件并使用正则表达式来检测翻译键。

function findTranslationKeys($grep, $path, $regex)
{
    $keys = [];

    $filenames = glob(base_path() . $path . '/**/**');

    foreach ($filenames as $filename) {
        if (preg_match_all($regex, file_get_contents($filename), $matches)) {
            foreach ($matches[1] as $index => $match) {   
                $keys[$match] = $match;
            }
        }
    }

    return $keys;
}

 $keys = $this->findTranslationKeys( '/resources/views', '/__\(\'([^\']*)\'[^\)]*/s');

您可以使用

加载现有的翻译
 $filePath = base_path() . '/resources/lang/en/' . $file . '.php';

 if (file_exists($filePath)) {
     $existing = require $filePath;
 } else {
     $existing = [];
 }

将任何缺失的翻译添加到文件中,然后将文件写回

$fh = fopen($filePath, 'w');
fwrite($fh, "<?php\n");
fwrite($fh, 'return ' . var_export($existing, true) . ';');
fclose($fh);

【讨论】:

  • 哇利亚姆,我喜欢你的回答,太棒了!这正是我一直在寻找的。不幸的是,我是 Laravel 的初学者,所以我不确定如何克服一些问题。我发现,有时我在翻译键中使用了" 而不是',所以我将正则表达式更改为'/__\((\'|\")([^\'\"]*)(\'|\")[^\)]*/s',我相信这是可行的。但我意识到我的$filenames 变量始终为空。我用的是Win7,会不会是grep的问题?根据this answer,我把grep改成了findstr,但是没有用
  • 是的,这很好,默认情况下 grep 在 Windows 上可能不可用。我认为您可以尝试在 Git Bash 或 Linux 的 Windows 子系统中运行它,但或者您可以调整代码以使用 `glob(base_path() . '/resources/views/**/**') 代替,这将返回所有文件并全部扫描。
  • 经过测试,以上似乎效果很好,所以更新了我的答案
  • 太好了,它不匹配文件直接放在视图目录和目录比两个目录更深的目录,如views/auth/passwords/email.blade.php,但我可以处理它。现在我正在努力克服一个新问题:ErrorException file_get_contents(C:\xampp\htdocs\myproject\resources\views\auth): failed to open stream: Permission denied (View: C:\xampp\htdocs\myproject\resources\views\home.blade.php)
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 2013-11-11
相关资源
最近更新 更多