scottybo/laravel-translator

thiagocordeiro/laravel-translator 的分支,用于在 PHP 和 Vue/JS 中搜索翻译键,并将它们插入到单独的 JSON 文件中进行翻译

安装: 205

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 22

开放问题: 1

类型:项目

v0.1.3 2018-03-08 10:14 UTC

This package is not auto-updated.

Last update: 2024-09-23 16:41:59 UTC


README

这是 Laravel-Translator(《https://github.com/thiagocordeiro/laravel-translator》)的分支版本,增加了生成 Vue 翻译文件和 PHP 翻译文件的能力。它略微重构,以便与翻译字符串而不是命名键良好地协同工作。

在添加翻译时遵循以下简单规则

  • 始终使用 __() 而不是 lang()trans()
  • 任何包含 " 的字符串必须使用 " 替换
  • 字符串上始终使用 "" 而不是 '',即 {{ __("可以翻译的字符串") }}
  • 在嵌入 HTML 时,始终使用 '' 而不是 "",即 <a href=''></a>
  • 在嵌入 HTML 时,始终使用 {!! !!} 而不是 {{ }}
  • 永远不要将翻译断行,这将会创建额外的空格/制表符
  • 关于复数化、大小写等,请参阅: https://laravel.net.cn/docs/5.6/localization

Laravel Blades 中的翻译

对于简单字符串

{{ __("String that can be translated") }}

对于包含变量的字符串

{{ __("Hi :name, welcome to :app", ['name' => 'Scott', 'app' => 'Widgets 3000']) }}

JavaScript/Vue 中的翻译

翻译没有更新?清除缓存! $ php artisan cache:clear

Vue 模板和 JavaScript 代码中使用的字符串存储在 /resources/lang/_javascript/ 中,并从一般的 PHP/系统翻译中单独处理。这是为了确保访客只下载在 JS 中使用的翻译,以保持文件大小小,以便快速下载。

我们在系统的每一页上加载 <script src="/js/lang-{lang}.js"></script>。URL 实际上是一个 Laravel 路由,它加载相应的语言文件(例如 /resources/lang/_javascript/{lang}.json),并返回一个 json 编码的翻译字符串。这个字符串存储在变量:window.i18n 中,然后可以通过 JavaScript 引用。

// Load the translations for javascript strings
Route::get('js/lang-{locale}.js', function ($locale) {

    try {
        // config('app.locales') gives all supported locales
        if (!array_key_exists($locale, config('app.locales'))) {
            $locale = config('app.fallback_locale');
        }

        // Add locale to the cache key
        $json = \Cache::rememberForever("lang-{$locale}.js", function () use ($locale) {
            $path = base_path().'/resources/lang/_javascript/'.$locale.'.json';
            $data = file_get_contents($path);
            return $data;
        });
        
    } catch (Exception $e) {
        $json = $e->getMessage();
    }

    $contents = 'window.i18n = ' . json_encode($json, config('app.debug', false) ? JSON_PRETTY_PRINT : 0) . ';';

    $response = \Response::make($contents, 200);
    $response->header('Content-Type', 'application/javascript');

    return $response;
});

在生成此字符串的过程中,将告诉 Laravel 永久缓存此响应。因此,如果您更新了翻译文件,您需要通过 php artisan cache:clear 清除缓存。

为了保持翻译逻辑的一致性,我们有一个 Vue 原型变量 __,它处理翻译的转换(在 /resources/assets/js/app.js 中)

window._ = require('lodash');

// Localization of strings, see README
Vue.prototype.__ = (string, args) => {
    i18n_array = JSON.parse(window.i18n);

    let value = _.get(i18n_array, string);

    _.eachRight(args, (paramVal, paramKey) => {
        alert(`:${paramKey}`);
        value = _.replace(value, `:${paramKey}`, paramVal);
    });
    return value;
};

对于简单字符串

{{ __("String that can be translated") }}

对于包含变量的字符串

{{ __("Hi :name, welcome to :app", {'name': 'Scott', 'app', 'Widgets 3000'}) }}

Laravel-translator 扫描您的项目 resources/view/resources/js/app/ 目录,以查找 lang(...)__(...) 函数,然后根据第一个参数的值创建键并将它们插入到 JSON 翻译文件中。

安装

您只需要求此软件包即可

$ composer require scottybo/laravel-translator

此软件包会自动注册提供者,查看 Laravel 软件包发现

Composer 完成安装后,您可以通过运行以下命令更新您的项目翻译键

$ php artisan translator:update

如果出于任何原因 artisan 找不到 translator:update 命令,您可以在您的 config/app.php 文件上手动注册提供者

return [
    ...
    'providers' => [
        ...
        Translator\TranslatorServiceProvider::class,
        ...
    ]
]

用法

首先,您必须创建您的 JSON 翻译文件

app/
  resources/
    lang/
      pt.json
      es.json
      fr.json
    lang/
	    _javascript/
		      pt.json
		      es.json
		      fr.json

继续按照您习惯的方式工作,当Laravel内置的翻译函数找不到给定的键时,它将返回自身,所以如果您创建英文键,您不需要创建英文翻译

blade:
<html>
    {{ __('Hello World') }}
</html>

controllers, models, etc.:
<?php
    __('Hello World');

您还可以在翻译键中使用参数

__('Welcome, :name', ['Arthur Dent'])

输出

translator:update 命令将扫描您的代码以识别新的翻译键,然后它将在app/resources/lang/ 文件夹中更新所有JSON文件,添加这些键。