Laravel Nova卡本地化

时间:2018-09-21 12:43:39

标签: localization laravel-5.6 laravel-nova

我正在尝试为为Laravel Nova仪表板构建的card添加本地化支持。

我已经在/resources/lang中创建了一个文件夹,其中包含en.json格式的JSON语言文件。这些文件通过publish命令发布(复制),但是loadJsonTranslationsFrom()似乎没有任何作用:

class CardServiceProvider extends ServiceProvider
{
  public function boot()
  {
    $this->publishes(
      [__DIR__ . '/../resources/lang' => resource_path('lang/vendor/my-custom-card')],
      'my-custom-card-lang'
    );

    $this->loadJsonTranslationsFrom(resource_path('lang/vendor/my-custom-card'));
  }
}

Card.vue中的标记如下所示:

{{__('Title')}}

如何测试JSON文件是否正确加载?我想念什么?

问题是我如何在Laravel Nova中支持卡的本地化?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但是对于tool,在Nova 2.0中也是如此。
我找到了一个比较优雅的解决方案-也许它仍然可以帮助某个人。

  • /nova-components/{your-tool}/resources/lang/中创建en.json
  • /nova-components/{your-tool}/resources/js/tool.js中添加Vue.mixin(require('./translation'));
    它应该看起来像这样:

    Nova.booting((Vue, router, store) => {
        router.addRoutes([
            {your-routes}
        ]);
        Vue.mixin(require('./translation'));    <-------------- add this line!
    });
    
  • 创建/nova-components/{your-tool}/resources/js/translation.js,它应如下所示:

    module.exports = {
        methods: {
            __(key, replace) {
                var translations = _.merge(window.config.translations, window.config['tool-translations']);
                var translation = translations[key]
                    ? translations[key]
                    : key;
    
                _.forEach(replace, (value, key) => {
                    translation = translation.replace(':' + key, value)
                });
    
                return translation;
            }
        }
    };
    
  • 现在,您必须在Nova::serving()文件的boot()函数内的/nova-components/{your-tool}/src/ToolServicePrivoder.php函数中添加以下内容:

    Nova::provideToScript([
        'tool-translations' => $this->getTranslations(),
    ]);
    
  • 现在在上述boot()下面添加以下功能:

    private static function getTranslations()
    {
        $translationFile = __DIR__ . '/../resources/lang/' . app()->getLocale() . '.json';
    
        if (!is_readable($translationFile)) {
            return [];
        }
    
        return json_decode(file_get_contents($translationFile), true);
    }
    

答案 1 :(得分:1)

Laravel Nova 2中的卡片本地化has been solved

要本地化字符串,请在Vue组件中使用__帮助器,并在NovaServiceProvider中加载相应的翻译文件:

Nova::serving(function (ServingNova $event) {
    Nova::script('{{ component }}', __DIR__.'/../dist/js/card.js');
    Nova::style('{{ component }}', __DIR__.'/../dist/css/card.css');
    Nova::translations(__DIR__.'/../resources/lang/en/card.json');
});

示例性实现可在GitHub上找到。

documentation中现在提供了更多信息。