2

我正在使用 Laravel 8,我想翻译一个网站。由于我有很多翻译要做,我将使用“翻译字符串作为键”(请参阅​​ Laravel 文档)。

我可以在我的 Blade 文件中使用以下两种方法。

{{ __('A propos') }}

或者

@lang('A propos')

我的问题是:你使用什么方法,为什么?

4

2 回答 2

2

我真的更喜欢使用 __ 辅助函数。如果你深入研究,你会发现这个辅助函数在功能和灵活性方面非常酷。除了翻译字符串,它还接收 2 个其他参数。一个是replace[],另一个是local

if (! function_exists('__')) {
/**
 * Translate the given message.
 *
 * @param  string|null  $key
 * @param  array  $replace
 * @param  string|null  $locale
 * @return string|array|null
 */
function __($key = null, $replace = [], $locale = null)
{
    if (is_null($key)) {
        return $key;
    }

    return trans($key, $replace, $locale);
 }
}

所以我们可以使用这个函数使用键执行翻译,另外还可以用第二个参数中传递的值替换翻译。不仅如此,我们还可以选择在第三个参数中指定我们需要翻译的语言。

其次,我们可以在 Laravel 控制器、视图等项目中的任何地方使用此功能。

另一方面,我们有刀片指令@lang()。我在供应商的任何地方都找不到它的定义,但我确信您只能在刀片模板中使用它。此外,它没有replace[]语言环境参数的灵活性,就像__()辅助函数一样。

在辩论结束时,我真的会选择__()辅助函数,因为它灵活、可重用且有良好的文档记录。

于 2021-07-04T09:54:04.783 回答
0

对于任何需要上述方法的最佳组合的人(如我),只需使用 @tr(...)指令,如:

@tr('My :app says hello!', ['app' => env('APP_NAME')])

但是要使上述功能正常运行,请在您的AppServiceProvider.php文件(在app/Providers目录中)执行以下操作:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('tr', function ($expression) {
            return "<?php echo __($expression); ?>";
        });
    }
}

PhpStorm

创建指令后,启用自动完成:

  1. 在 IDE 设置中,转到Languages & Frameworks > PHP > Blade.

  2. 那里禁用复选框Use default settings

  3. 然后切换到Directives选项卡,并添加新指令,设置:

    • 姓名:tr
    • 字首:<?php echo __(
    • 后缀:); ?>
于 2022-03-03T03:52:00.707 回答