転職したらスマレジだった件

スマレジのエンジニアやまてのテックブログです。マジレス大歓迎です。

諸事情で Zend Framework を理解する 2022 - ⑥バリデーションメッセージの日本語化

こんにちは!

スマレジの テックファーム(SES 部門)のWebエンジニア やまて(@r_yamate) と申します。

はじめに

前回の記事(⑤編集・削除機能の作成)で、登録済みの商品データを編集・削除する機能を作成しました。

本連載の目次

本連載では以下の順序で進めています。

今回は、Zend のパッケージを用いて、英語のバリデーションメッセージを日本語化します。

目次

Zend Framework公式ドキュメントのチュートリアル、ドキュメントを参考に作成しました。(ところどころアレンジしています)

本記事完了時点のソースコード

本記事完了時点のソースコードGitHub上に公開しています。

github.com

以下は変更差分です。

github.com

商品管理ページの構成

ページ 説明
商品一覧 商品の一覧を表示。商品の新規登録や編集、削除のためのリンクボタン表示。
商品登録🇯🇵 新規商品を登録するためのフォーム。
商品編集🇯🇵 商品を編集するためのフォーム。
商品削除 商品を削除することを確認し、削除するページ。

上記の通り、登録フォーム・編集フォームがあり、バリデーションメッセージが現状では、英語で表示されます。

現状の確認(バリデーションメッセージが英語)

空欄のまま、新規登録ボタンを押してみます。

商品単価の桁数を変更して、編集ボタンを押してみます。

このとおり、メッセージが英語です。

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』連載は、今回で完了しました。


本記事を通じて、学習した内容をアウトプットしてきて、反復の大切さを再認識しました。

新しい知識をどんどん習得していきたい気持ちを持つことは大事だけど、基礎となる知識を固めていくことも大事だと考えているので、今後もアウトプットを通じて成長していきたいです。



自分に求めていることが何かを先方に確認しながら、自分でも考えながら業務を進めることを今は大事にしています。

そして、プロダクト内容、ソースコード、その他使用技術の理解を進めないとお役には立てないと感じているので、自習では使用技術の理解にコツコツ取り組んでいきます。