こんにちは!
スマレジの テックファーム(SES 部門)のWebエンジニア やまて(@r_yamate) と申します。
はじめに
前回の記事(⑤編集・削除機能の作成)で、登録済みの商品データを編集・削除する機能を作成しました。
本連載の目次
本連載では以下の順序で進めています。
- ① Docker での開発環境構築
- ② Zend Framework のインストール
- ③ 一覧画面の作成
- ④ 登録機能の作成
- ⑤ 編集・削除機能の作成
- ⑥ バリデーションメッセージの日本語化(今回)
今回は、Zend のパッケージを用いて、英語のバリデーションメッセージを日本語化します。
目次
- はじめに
- 1. パッケージ zend-i18n-resources のインストール
- 2. パッケージ zend-mvc-i18n のインストール
- 3. アプリケーションへの zend-mvc-i18n 追加
- 4. バリデーションメッセージの確認(未完成)
- 5. バリデーションメッセージの追記
- 6. バリデーションメッセージの確認(完成)
- おわりに
Zend Framework公式ドキュメントのチュートリアル、ドキュメントを参考に作成しました。(ところどころアレンジしています)
- https://docs.zendframework.com/tutorials/i18n/
- https://docs.zendframework.com/zend-validator/messages/
本記事完了時点のソースコード
本記事完了時点のソースコードをGitHub上に公開しています。
以下は変更差分です。
商品管理ページの構成
ページ | 説明 |
---|---|
商品一覧 | 商品の一覧を表示。商品の新規登録や編集、削除のためのリンクボタン表示。 |
商品登録🇯🇵 | 新規商品を登録するためのフォーム。 |
商品編集🇯🇵 | 商品を編集するためのフォーム。 |
商品削除 | 商品を削除することを確認し、削除するページ。 |
上記の通り、登録フォーム・編集フォームがあり、バリデーションメッセージが現状では、英語で表示されます。
現状の確認(バリデーションメッセージが英語)
空欄のまま、新規登録ボタンを押してみます。
商品単価の桁数を変更して、編集ボタンを押してみます。
このとおり、メッセージが英語です。
1. パッケージ zend-i18n-resources のインストール
英語→日本語に変換するためのファイルを含むパッケージ zend-i18n-resources をインストールします。
https://docs.zendframework.com/zend-i18n-resources/
docker-compose exec app composer require zendframework/zend-i18n-resources
コマンド実行結果
# r_yamate @ mbp in ~/Documents/code/zend-framework-crud-sample on git:feature-create-edit-and-delete o [17:29:50] $ docker-compose exec app composer require zendframework/zend-i18n-resources Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/ Info from https://repo.packagist.org: #StandWithUkraine Using version ^2.6 for zendframework/zend-i18n-resources ./composer.json has been updated Loading composer repositories with package information Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/ Info from https://repo.packagist.org: #StandWithUkraine Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing zendframework/zend-i18n-resources (2.6.1): Downloading (100%) Package container-interop/container-interop is abandoned, you should avoid using it. Use psr/container instead. Package zendframework/zend-component-installer is abandoned, you should avoid using it. Use laminas/laminas-component-installer instead. Package zendframework/zend-config is abandoned, you should avoid using it. Use laminas/laminas-config instead. Package zendframework/zend-db is abandoned, you should avoid using it. Use laminas/laminas-db instead. Package zendframework/zend-escaper is abandoned, you should avoid using it. Use laminas/laminas-escaper instead. Package zendframework/zend-eventmanager is abandoned, you should avoid using it. Use laminas/laminas-eventmanager instead. Package zendframework/zend-filter is abandoned, you should avoid using it. Use laminas/laminas-filter instead. Package zendframework/zend-form is abandoned, you should avoid using it. Use laminas/laminas-form instead. Package zendframework/zend-http is abandoned, you should avoid using it. Use laminas/laminas-http instead. Package zendframework/zend-hydrator is abandoned, you should avoid using it. Use laminas/laminas-hydrator instead. Package zendframework/zend-i18n is abandoned, you should avoid using it. Use laminas/laminas-i18n instead. Package zendframework/zend-inputfilter is abandoned, you should avoid using it. Use laminas/laminas-inputfilter instead. Package zendframework/zend-json is abandoned, you should avoid using it. Use laminas/laminas-json instead. Package zendframework/zend-loader is abandoned, you should avoid using it. Use laminas/laminas-loader instead. Package zendframework/zend-modulemanager is abandoned, you should avoid using it. Use laminas/laminas-modulemanager instead. Package zendframework/zend-mvc is abandoned, you should avoid using it. Use laminas/laminas-mvc instead. Package zendframework/zend-router is abandoned, you should avoid using it. Use laminas/laminas-router instead. Package zendframework/zend-servicemanager is abandoned, you should avoid using it. Use laminas/laminas-servicemanager instead. Package zendframework/zend-stdlib is abandoned, you should avoid using it. Use laminas/laminas-stdlib instead. Package zendframework/zend-uri is abandoned, you should avoid using it. Use laminas/laminas-uri instead. Package zendframework/zend-validator is abandoned, you should avoid using it. Use laminas/laminas-validator instead. Package zendframework/zend-view is abandoned, you should avoid using it. Use laminas/laminas-view instead. Package zfcampus/zf-development-mode is abandoned, you should avoid using it. Use laminas/laminas-development-mode instead. Package zendframework/zend-i18n-resources is abandoned, you should avoid using it. Use laminas/laminas-i18n-resources instead. Writing lock file Generating autoload files
確認:vendor/zendframework/zend-i18n-resources/languages/ja/Zend_Validate.php
<?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ /** * EN-Revision: 16.Jul.2013 */ return [ // Zend\I18n\Validator\Alnum "Invalid type given. String, integer or float expected" => "不正な形式です。文字列、整数、もしくは小数が期待されています", "The input contains characters which are non alphabetic and no digits" => "入力値にアルファベットと数字以外の文字が含まれています", "The input is an empty string" => "入力値は空の文字列です", // 略(以降もずらっと翻訳が並んでいます) ];
このファイルをそのまま利用して翻訳メッセージを日本語化したいところですが、スマートな状態にならず、試行錯誤の末、下記方法をとっています(公式ドキュメントにある方法の一つではあります)。
ディレクトリ作成:data/language/ja/
上記のディレクトリ内に、下記のバリデーションの日本語翻訳ファイルをコピーします。
vendor/zendframework/zend-i18n-resources/languages/ja/Zend_Validate.php
2. パッケージ zend-mvc-i18n のインストール
英語→日本語に変換する機能を含むパッケージ zend-mvc-i18n をインストールします。
https://docs.zendframework.com/zend-mvc-i18n/
docker-compose exec app composer require zendframework/zend-mvc-i18n
コマンド実行結果
# r_yamate @ mbp in ~/Documents/code/zend-framework-crud-sample on git:feature-create-edit-and-delete x [20:49:12] $ docker-compose exec app composer require zendframework/zend-mvc-i18n Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/ Info from https://repo.packagist.org: #StandWithUkraine Using version ^1.1 for zendframework/zend-mvc-i18n ./composer.json has been updated Loading composer repositories with package information Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/ Info from https://repo.packagist.org: #StandWithUkraine Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing zendframework/zend-mvc-i18n (1.1.1): Downloading (100%) Please select which config file you wish to inject 'Zend\Mvc\I18n' into: [0] Do not inject [1] config/modules.config.php [2] config/development.config.php.dist Make your selection (default is 1):1 Remember this option for other packages of the same type? (Y/n)Y Installing Zend\Mvc\I18n from package zendframework/zend-mvc-i18n zendframework/zend-mvc-i18n suggests installing zendframework/zend-cache (To enable caching of translation strings) Package container-interop/container-interop is abandoned, you should avoid using it. Use psr/container instead. Package zendframework/zend-component-installer is abandoned, you should avoid using it. Use laminas/laminas-component-installer instead. Package zendframework/zend-config is abandoned, you should avoid using it. Use laminas/laminas-config instead. Package zendframework/zend-db is abandoned, you should avoid using it. Use laminas/laminas-db instead. Package zendframework/zend-escaper is abandoned, you should avoid using it. Use laminas/laminas-escaper instead. Package zendframework/zend-eventmanager is abandoned, you should avoid using it. Use laminas/laminas-eventmanager instead. Package zendframework/zend-filter is abandoned, you should avoid using it. Use laminas/laminas-filter instead. Package zendframework/zend-form is abandoned, you should avoid using it. Use laminas/laminas-form instead. Package zendframework/zend-http is abandoned, you should avoid using it. Use laminas/laminas-http instead. Package zendframework/zend-hydrator is abandoned, you should avoid using it. Use laminas/laminas-hydrator instead. Package zendframework/zend-i18n is abandoned, you should avoid using it. Use laminas/laminas-i18n instead. Package zendframework/zend-i18n-resources is abandoned, you should avoid using it. Use laminas/laminas-i18n-resources instead. Package zendframework/zend-inputfilter is abandoned, you should avoid using it. Use laminas/laminas-inputfilter instead. Package zendframework/zend-json is abandoned, you should avoid using it. Use laminas/laminas-json instead. Package zendframework/zend-loader is abandoned, you should avoid using it. Use laminas/laminas-loader instead. Package zendframework/zend-modulemanager is abandoned, you should avoid using it. Use laminas/laminas-modulemanager instead. Package zendframework/zend-mvc is abandoned, you should avoid using it. Use laminas/laminas-mvc instead. Package zendframework/zend-router is abandoned, you should avoid using it. Use laminas/laminas-router instead. Package zendframework/zend-servicemanager is abandoned, you should avoid using it. Use laminas/laminas-servicemanager instead. Package zendframework/zend-stdlib is abandoned, you should avoid using it. Use laminas/laminas-stdlib instead. Package zendframework/zend-uri is abandoned, you should avoid using it. Use laminas/laminas-uri instead. Package zendframework/zend-validator is abandoned, you should avoid using it. Use laminas/laminas-validator instead. Package zendframework/zend-view is abandoned, you should avoid using it. Use laminas/laminas-view instead. Package zfcampus/zf-development-mode is abandoned, you should avoid using it. Use laminas/laminas-development-mode instead. Package zendframework/zend-mvc-i18n is abandoned, you should avoid using it. Use laminas/laminas-mvc-i18n instead. Writing lock file Generating autoload files
途中、
Please select which config file you wish to inject 'Zend\Mvc\I18n' into: (どの設定ファイルに 'Zend\Mvc\I18n' を注入したいかを選択してください。)
という質問をされて、 [1] config/modules.config.php
を選択すると、'Zend\Mvc\I18n' 使用についての設定を追記してくれます。
Remember this option for other packages of the same type? (Y/n) (このオプションを他の同じタイプのパッケージにも適用しますか? (Y/n))
とも聞かれるので、Y
にします。
3. アプリケーションへの zend-mvc-i18n 追加
アプリケーションにパッケージを追加するために設定します。(上の質問で [1] config/modules.config.php
選択していたら確認のみです)
確認 or 編集:config/modules.config.php
<?php // 略 return [ + 'Zend\Mvc\I18n', 'Zend\I18n', 'Zend\Form', 'Zend\InputFilter', 'Zend\Filter', 'Zend\Hydrator', 'Zend\Db', 'Zend\Router', 'Zend\Validator', 'Application', 'Product', ];
編集:config/autoload/global.php
<?php // 略 return [ // PDO を使って MySQL データベースに接続 'db' => [ // 略 ], // 以下、追記 'translator' => [ 'locale' => 'en_US', // デフォルトのロケール(提供されていない場合 'translation_file_patterns' => [ // 翻訳ファイルのパターン [ 'type' => 'phpArray', // 翻訳ソースの種類 (例: gettext、phpArray、ini) 'base_dir' => getcwd() . '/data/language/ja', // それらが格納されているベースディレクトリ 'pattern' => 'Zend_Validate.php', // 使用するファイルを特定するためのファイルパターン ], ], ], ];
4. バリデーションメッセージの確認(未完成)
空欄のまま、新規登録ボタンを押してみます。
一部日本語化されました!しかし残念ながら、
// Zend\Validator\Between
"The input is not between '%min%' and '%max%', inclusively" => "入力値は '%min%' 以上 '%max%' 以下ではありません",
のように'%min%'
や '%max%'
の値が挿入される箇所があるパターンについては、うまく日本語化されません。
「The input is not between '1' and '100000000', inclusively
」≠「The input is not between '%min%' and '%max%', inclusively
」となり、該当の日本語がないため英語のまま出力されることになっているのではないかと考えています。
5. バリデーションメッセージの追記
全くスマートではありませんが、'%min%'
や '%max%'
の値をいれた状態の文を書き足しました。
編集:data/language/ja/Zend_Validate.php
"The input is not between '%min%' and '%max%', inclusively" => "入力値は '%min%' 以上 '%max%' 以下ではありません",
+ "The input is not between '1' and '100000000', inclusively" => "入力値は '1' 以上 '99,999,999' 以下 ( 8 桁まで)の数字で入力してください", // 商品単価に使用
"The input is more than %max% characters long" => " 入力値は %max% 文字より長いです",
+ "The input is more than 85 characters long" => " 入力値は 85 文字以内で入力してください", // 商品名に使用
ついでに、元の文面よりもう少し伝わる文面にしてみました。
6. バリデーションメッセージの確認(完成)
空欄のまま、新規登録ボタンを押してみます。
商品単価の桁数を変更して、編集ボタンを押してみます。
バリデーションメッセージが日本語化されています!
おわりに
全6回の『諸事情で Zend Framework を理解する 2022』連載は、今回で完了しました。
本記事を通じて、学習した内容をアウトプットしてきて、反復の大切さを再認識しました。
新しい知識をどんどん習得していきたい気持ちを持つことは大事だけど、基礎となる知識を固めていくことも大事だと考えているので、今後もアウトプットを通じて成長していきたいです。
SESの出向先での1か月が経過!まだコードは1行も書いてない…と言うと愚痴っぽいけど、全然そんな訳ではなく。今は設計の前段階の調査で、骨の折れる作業ではあるけど、これが開発…これが実務…と感慨深く仕事してる。とはいえコード書くべき時に備えて、少しでもレベル上げしておきたい。
— やまて|Webエンジニア2年目 (@r_yamate) 2022年4月15日
自分に求めていることが何かを先方に確認しながら、自分でも考えながら業務を進めることを今は大事にしています。
そして、プロダクト内容、ソースコード、その他使用技術の理解を進めないとお役には立てないと感じているので、自習では使用技術の理解にコツコツ取り組んでいきます。