nhockizi/ yii2-translate-manager
在线翻译
Requires
This package is auto-updated.
Last update: 2024-09-19 17:43:49 UTC
README
在线翻译
简介
此模块为您项目的多语言元素提供简单的翻译界面。它可以自动检测新的语言元素(项目扫描)。在项目扫描期间会自动过滤掉重复项。可以一键从数据库中删除未使用的语言元素(数据库优化),并可以导入和导出翻译。它还可以翻译客户端消息(存储在JavaScript文件中的那些),因为项目扫描也会收集从JavaScript文件中要翻译的语言元素。
它还允许您在不登录翻译界面的情况下翻译客户端(在实时网页上)的文本。(前端翻译)。
在服务器端,它可以处理数据库或一维/多维数组元素和Yii::t函数。您可以通过排除文件、文件夹或类别来防止它们被翻译。
安装
安装此扩展的首选方法是通过 composer。
运行以下命令
php composer.phar require --prefer-dist nhockizi/yii2-translate-manager "1.*"
或添加以下内容到您的 composer.json
文件的 require 部分中。
"nhockizi/yii2-translate-manager": "1.*"
###迁移
在终端运行以下命令进行数据库迁移
Linux/Unix
Windows
yii migrate/up --migrationPath=@vendor/nhockizi/yii2-translate-manager/migrations
###配置
yii.bat migrate/up --migrationPath=@vendor/nhockizi/yii2-translate-manager/migrations
以下是一个开启Yii数据库多语言的简单示例。
开启TranslateManager模块
'language' => 'en-US', 'components' => [ 'i18n' => [ 'translations' => [ '*' => [ 'class' => 'yii\i18n\DbMessageSource', 'db' => 'db', 'sourceLanguage' => 'xx-XX', // Developer language 'sourceMessageTable' => '{{%language_source}}', 'messageTable' => '{{%language_translate}}', 'cachingDuration' => 86400, 'enableCaching' => true, ], ], ], ],
简单示例
以下是一个更复杂的示例,包括支持多语言的数据表。
'modules' => [ 'translatemanager' => [ 'class' => 'nhockizi\translatemanager\Module', ], ],
配置扫描根目录
'modules' => [ 'translatemanager' => [ 'class' => 'nhockizi\translatemanager\Module', 'root' => '@app', // The root directory of the project scan. 'scanRootParentDirectory' => true, // Whether scan the defined `root` parent directory, or the folder itself. // IMPORTANT: for detailed instructions read the chapter about root configuration. 'layout' => 'language', // Name of the used layout. If using own layout use 'null'. 'allowedIPs' => ['127.0.0.1'], // IP addresses from which the translation interface is accessible. 'roles' => ['@'], // For setting access levels to the translating interface. 'tmpDir' => '@runtime', // Writable directory for the client-side temporary language files. // IMPORTANT: must be identical for all applications (the AssetsManager serves the JavaScript files containing language elements from this directory). 'phpTranslators' => ['::t'], // list of the php function for translating messages. 'jsTranslators' => ['nhockizi.t'], // list of the js function for translating messages. 'patterns' => ['*.js', '*.php'],// list of file extensions that contain language elements. 'ignoredCategories' => ['yii'], // these categories won't be included in the language database. 'ignoredItems' => ['config'], // these files will not be processed. 'scanTimeLimit' => null, // increase to prevent "Maximum execution time" errors, if null the default max_execution_time will be used 'searchEmptyCommand' => '!', // the search string to enter in the 'Translation' search field to find not yet translated items, set to null to disable this feature 'defaultExportStatus' => 1, // the default selection of languages to export, set to 0 to select all languages by default 'defaultExportFormat' => 'json',// the default format for export, can be 'json' or 'xml' 'tables' => [ // Properties of individual tables [ 'connection' => 'db', // connection identifier 'table' => '{{%language}}', // table name 'columns' => ['name', 'name_ascii'],// names of multilingual fields 'category' => 'database-table-name',// the category is the database table name ] ], 'scanners' => [ // define this if you need to override default scanners (below) '\nhockizi\translatemanager\services\scanners\ScannerPhpFunction', '\nhockizi\translatemanager\services\scanners\ScannerPhpArray', '\nhockizi\translatemanager\services\scanners\ScannerJavaScriptFunction', '\nhockizi\translatemanager\services\scanners\ScannerDatabase', ], 'googleApiKey' => 'your_google_API_Key', // if set - google translation will be inserted into translation field when you click on the source field. ], ],
根路径可以是别名或完整路径(例如 @app
或 /webroot/site/
)。
文件扫描器将扫描配置的文件夹以查找可翻译元素。以下两个选项确定扫描根目录: root
和 scanRootParentDirectory
。这些选项的默认值适用于Yii 2高级项目模板。如果您使用的是基本模板,您必须修改这些设置。
以下两个选项确定扫描根目录:root
和 scanRootParentDirectory
。这些选项的默认值适用于Yii 2高级项目模板。如果您使用的是基本模板,您必须修改这些设置。
root
选项告诉项目扫描的根文件夹是什么。它可以包含一个目录(字符串),或者多个目录(数组)。
scanRootParentDirectory
仅在指定单个根目录时使用。
重要提示:更改这些选项可能会造成翻译项的丢失,因为优化操作会删除缺失的项目。因此,请务必仔细检查您的配置!
(a) 单个根目录
可以在 root
选项中将一个根目录定义为字符串。在这种情况下,scanRootParentDirectory
将用于确定实际要扫描的目录。
如果 scanRootParentDirectory
设置为 true
(这是默认值),则扫描将在父目录上运行。这是在高级模板中期望的行为,因为 @app
是当前应用程序的根,它是项目中的子文件夹(因此项目的整个根目录是 @app
的父目录)。
对于基本模板,@app
也是整个项目的根。由于这个原因,使用默认值的 scanRootParentDirectory
,扫描将在项目文件夹之外运行。这不是期望的行为,将值更改为 false
可以解决这个问题。
重要提示:将 scanRootParentDirectory
从 true
更改为 false
可能会导致翻译项的丢失,因为根目录将不同。
例如
(b) 多个根目录
可以在数组中定义多个根目录。在这种情况下,所有项目都必须指向确切的目录,因为 scanRootParentDirectory
将会被省略。
例如
'root' => [ '@frontend', '@vendor', '/some/external/folder', ],
使用 authManager
示例
PhpManager
'components' => [ 'authManager' => [ 'class' => 'yii\rbac\PhpManager', ], // ... ],
DbManager
'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', ], // ... ],
前端翻译
'bootstrap' => ['translatemanager'], 'components' => [ 'translatemanager' => [ 'class' => 'nhockizi\translatemanager\Component' ] ]
用法
###注册客户端脚本
为了在JavaScript文件中翻译静态消息,需要注册这些文件。
要注册您的脚本,请在每个操作中调用以下方法
\nhockizi\translatemanager\helpers\Language::registerAssets();
在每次页面加载时调用上述方法的简单示例
namespace common\controllers; use nhockizi\translatemanager\helpers\Language; // IMPORTANT: all Controllers must originate from this Controller! class Controller extends \yii\web\Controller { public function init() { Language::registerAssets(); parent::init(); } }
###切换翻译按钮
显示按钮以切换到前端翻译模式的简单示例。(按钮将仅对具有翻译必要权限的用户显示!)
\nhockizi\translatemanager\widgets\ToggleTranslate::widget();
显示按钮的更复杂示例
\nhockizi\translatemanager\widgets\ToggleTranslate::widget([ 'position' => \nhockizi\translatemanager\widgets\ToggleTranslate::POSITION_TOP_RIGHT, 'template' => '<a href="javascript:void(0);" id="toggle-translate" class="{position}" data-language="{language}" data-url="{url}"><i></i> {text}</a><div id="translate-manager-div"></div>', 'frontendTranslationAsset' => 'nhockizi\translatemanager\bundles\FrontendTranslationAsset', 'frontendTranslationPluginAsset' => 'nhockizi\translatemanager\bundles\FrontendTranslationPluginAsset', ]);
###在源代码中放置多语言元素。
JavaScript
nhockizi.t('Apple'); nhockizi.t('Hello {name}!', {name:'World'}); nhockizi.t("Don't be so upset.");
PHP方法
Yii::t('category', 'Apple'); Yii::t('category', 'Hello {name}!', ['name' => 'World']); Yii::t('category', "Don't be so upset.");
PHP前端翻译函数
use nhockizi\translatemanager\helpers\Language as Lx; Lx::t('category', 'Apple'); Lx::t('category', 'Hello {name}!', ['name' => 'World']); Lx::t('category', "Don't be so upset.");
重要:nhockizi\translatemanager\helpers\Language::t()(Lx::t())函数目前不支持HTML属性的翻译
PHP数组
/** * @translate */ private $_STATUSES = [ self::STATUS_INACTIVE => 'Inactive', self::STATUS_ACTIVE => 'Active', self::STATUS_DELETED => 'Deleted' ]; /** * Returning the 'status' array on the site's own language. * return array */ public function getStatuses() { return \nhockizi\translatemanager\helpers\Language::a($this->_STATUSES); } /** * @translate */ private $_GENDERS = ['Male', 'Female']; /** * Returning the 'genders' array in German * return array */ public function getGenders() { return \nhockizi\translatemanager\helpers\Language::a($this->_GENDERS, 'de-DE'); }
PHP数据库
- 带有新属性
namespace common\models; use nhockizi\translatemanager\helpers\Language; /** * This is the model class for table "category". * * @property string $category_id * @property string $name * @property string $description */ class Category extends \yii\db\ActiveRecord { // afterFind & beforeSave: /** * @var Returning the 'name' attribute on the site's own language. */ public $name_t; /** * @var Returning the 'description' attribute on the site's own language. */ public $description_t; /* ... */ public function afterFind() { $this->name_t = Language::d($this->name); $this->description_t = Language::d($this->descrioption); // or If the category is the database table name. // $this->name_t = Language::t(static::tableName(), $this->name); // $this->description_t = Language::t(static::tableName(), $this->description); parent::afterFind(); } public function beforeSave($insert) { if (parent::beforeSave($insert)) { Language::saveMessage($this->name); Language::saveMessage($this->description); // or If the category is the database table name. // Language::saveMessage($this->name, static::tableName()); // Language::saveMessage($this->description, static::tableName()); return true; } return false; } // or GETTERS: /** * @return string Returning the 'name' attribute on the site's own language. */ public function getName($params = [], $language = null) { return Language::d($this->name, $params, $language); // or If the category is the database table name. // return Language::t(static::tableName(), $this->name, $params, $language); } /** * @return string Returning the 'description' attribute on the site's own language. */ public function getDescription($params = [], $language = null) { return Language::d($this->description, $params, $language); // or If the category is the database table name. // return Language::t(static::tableName(), $this->description, $params, $language); } }
-
带有行为(自1.5.3起)
注意:这将替换模型的原始属性值!
namespace common\models; /** * This is the model class for table "category". * * @property string $category_id * @property string $name * @property string $description */ class Category extends \yii\db\ActiveRecord { // TranslateBehavior public function behaviors() { return [ [ 'class' => \nhockizi\translatemanager\behaviors\TranslateBehavior::className(), 'translateAttributes' => ['name', 'description'], ], // or If the category is the database table name. // [ // 'class' => \nhockizi\translatemanager\behaviors\TranslateBehavior::className(), // 'translateAttributes' => ['name', 'description'], // 'category' => static::tableName(), // ], ]; } }
###URLs
翻译工具的URL
/translatemanager/language/list // List of languages and modifying their status /translatemanager/language/create // Create languages /translatemanager/language/scan // Scan the project for new multilingual elements /translatemanager/language/optimizer // Optimise the database
将Yii2菜单示例实现到您自己的菜单中。
$menuItems = [ ['label' => Yii::t('language', 'Language'), 'items' => [ ['label' => Yii::t('language', 'List of languages'), 'url' => ['/translatemanager/language/list']], ['label' => Yii::t('language', 'Create'), 'url' => ['/translatemanager/language/create']], ] ], ['label' => Yii::t('language', 'Scan'), 'url' => ['/translatemanager/language/scan']], ['label' => Yii::t('language', 'Optimize'), 'url' => ['/translatemanager/language/optimizer']], ['label' => Yii::t('language', 'Im-/Export'), 'items' => [ ['label' => Yii::t('language', 'Import'), 'url' => ['/translatemanager/language/import']], ['label' => Yii::t('language', 'Export'), 'url' => ['/translatemanager/language/export']], ] ];
###控制台命令
注册命令
'controllerMap' => [ 'translate' => \nhockizi\translatemanager\commands\TranslatemanagerController::className() ],
使用Yii CLI使用它
./yii translate/scan
./yii translate/optimize
###使用Google翻译API
Google翻译API是一项付费服务。截至本文撰写时,价格为每100万个字符翻译20美元。
为了激活此功能,您需要拥有Google账户,生成Google API密钥,并通过将'googleApiKey'添加到'translatemanager'模块配置中来启用此功能
'modules' => [ 'translatemanager' => [ // ... 'googleApiKey' => `Your_Google_API_Key', ], ],
功能启用后,当您单击源字段时,它将在空翻译字段中插入源文本的Google翻译版本(而不是原始文本)。