Laravel - 为多语言指定一个 default/fallback 字符串

Laravel - specify a default/fallback string for multi-language

我开始向使用 Laravel 作为前端的网站添加多语言。

但是,由于目前缺乏资源,我正在翻译字符串。翻译整个网站还需要一段时间。

唯一的挑战是,如果文本未翻译,则显示的内容是关键。我想为此指定一个 default/fallback 字符串。

例如

{{ trans('site.'.$name) }}

如果我将 'Business' 作为 $name 传递并且在 site.php lang 文件中没有对 'Business' 的翻译,我最终会在前端得到 site.Business。这把一切都搞砸了。在最坏的情况下,如果没有 site.Business,Laravel 应该输出 Business.

更好的是它应该为 default/fallback 字符串提供一个选项。

这可能吗?

顺便说一下,是否有常用词的免费翻译?这将节省我自己翻译所有内容的时间。

谢谢。

后备语言是您应该使用的语言。见 docs

You may also configure a "fallback language", which will be used when the active language does not contain a given language line. Like the default language, the fallback language is also configured in the app/config/app.php configuration file:

'fallback_locale' => 'en',

您在回退内联中编写的时间肯定与在并行翻译文件中编写回退所花费的时间与您在翻译密钥中编写的时间一样多。最终,花在思考替代方法上的时间与仅仅这样做所花费的时间可以忽略不计。

如果您真的想要内联回退,那么您需要创建一个新的辅助方法来做一些不同的事情。因此,请为自己酿造的美味佳肴做好准备。

让我们创建一个可以在任何视图中使用的新函数。我将使用 描述的方法。在 app 中创建一个名为 helpers.php 的文件。然后将其添加到 files 数组下的 autoload 对象中的 composer.json 作为 "app/helpers.php"。不确定我的意思?看到他的回答。添加后,运行 composer dump-autoload.

现在,让我们添加一个 trans_fb() 方法,它将采用 trans() 方法的所有参数,但也有一个回退。我将定义此方法,以便需要前两个参数(密钥和回退)。

如果 Laravel 找不到翻译键(它在 resources/lang/en/auth.php 中搜索,例如 auth.failed 作为键),它将使用回退,并将任何其他可选参数传递给原来的方法。

<?php

if (! function_exists('trans_fb')) {
    /**
     * Translate the given message with a fallback string if none exists.
     *
     * @param  string  $id
     * @param  string  $fallback
     * @param  array   $parameters
     * @param  string  $domain
     * @param  string  $locale
     * @return \Symfony\Component\Translation\TranslatorInterface|string
     */
    function trans_fb($id, $fallback, $parameters = [], $domain = 'messages', $locale = null)
    {
        return ($id === ($translation = trans($id, $parameters, $domain, $locale))) ? $fallback : $translation;
    }
}

然后您可以像这样在模板中使用它:

{{ trans_fb("i.love.laravel", "I love Laravel!") }}

我想出了这个解决方案,它使用与 trans() 方法相同的参数,并且当密钥未被翻译时,它 returns 使用 'fallback_locale' 来自 [=] 的应用程序翻译的字符串13=].

我仍然想知道为什么它没有在 Laravel 中本地实现并且 Laravel 只返回未翻译的密钥。

if (!function_exists('trans_fb')) {
    function trans_fb(string $key, array $replace = [], ?string $locale = null)
    {
        $translation = trans($key, $replace, $locale);

        if ($key === $translation) {
            return trans($key, $replace, config('app.fallback_locale'));
        }

        return $translation;
    }
}