【问题标题】:Laravel - specify a default/fallback string for multi-languageLaravel - 为多语言指定默认/后备字符串
【发布时间】:2016-06-18 21:48:46
【问题描述】:

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

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

唯一的挑战是,如果没有翻译文本,显示的内容是关键。我想为此指定一个默认/后备字符串。

例如

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

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

更好的是它应该为默认/后备字符串提供一个选项。

这可能吗?

顺便说一句,常用词有免费翻译吗?这样可以节省自己翻译所有内容的时间。

谢谢。

【问题讨论】:

    标签: php laravel-4 translation multilingual


    【解决方案1】:

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

    您还可以配置“备用语言”,当 活动语言不包含给定的语言行。像 默认语言,备用语言也在 app/config/app.php配置文件:

    'fallback_locale' => 'en',

    它肯定会花费您在后备内联中编写与在并行翻译文件中编写后备一样多的时间,就像您在翻译键中编写一样。最终花费在考虑替代方法而不是仅仅做它上的时间将可以忽略不计。

    如果你真的想要一个内联后备,那么你需要创建一个新的辅助方法来做一些不同的事情。所以准备好迎接一些自制的美味吧。

    让我们创建一个可以在任何视图中使用的新函数。我将使用Joseph Sibler描述的方法。在app 内创建一个名为helpers.php 的文件。然后将其添加到autoload 对象中的composer.jsonfiles 数组下的"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!") }}

    【讨论】:

    • 我已经为备用语言做好了准备,但在我的情况下看起来并不可行。我将按照建议尝试使用替代的辅助函数。谢谢。
    • 如果它不可行,那么这应该就是你所需要的 :) 祝你好运。
    【解决方案2】:

    我想出了这个解决方案,它使用与trans() 方法相同的参数,当密钥未翻译时,它使用来自app.php 的应用程序'fallback_locale' 返回翻译后的字符串。

    我仍然想知道为什么它没有在 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      相关资源
      最近更新 更多