Because We Love Happy Coding

フリーライターからエンジニア × 講師。発信力だけあり余ってる感じ

数字のSpellOut、つまり英単語表記をECCUBE3に導入する

今日もまたコーディング。だって僕らはHappy Codingが大好きだから。

数字の誤読を防ぐために英語圏では、数字を英単語で綴る、という文化がある。WordingとかSpellOutとか呼ぶようだ。

海外送金などでは大きな金額を間違えずに英単語で書かされる場合もあり、けっこう面倒くさい。

ECCUBE3 の英語化にあたりSpellOutの要望があったので応えた。

目次

環境

[EC-CUBE] EC-CUBE3.0.16

調査

調べているうちに3つほど方針があるように思った

  • ControllerからPHPNumberFormatter を使ってTwigに渡す
  • TwigExtensionを見つけてきて使う
  • TwigExtensionを自作する

craue/twigextensions-bundleを見つけてきて使う

craue/twigextensions-bundleというのがあったのでcomposerでインストールを試みた。

composer require craue/twigextensions-bundle

ところがまずcurlがないと叱られる。

 Problem 1
- guzzle/guzzle v3.9.3 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.9.3 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- Installation request for guzzle/guzzle (installed at v3.9.3) -> satisfiable by guzzle/guzzle[v3.9.3].

  To enable extensions, verify that they are enabled in your .ini files:
- C:\PHPs\php-7.1.8-nts-Win32-VC14-x64\php.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

対策を検索してみる。

composerで怒られた. the requested PHP extension curl is missing from your system | たきもと.com

この記事に従って php.iniを書き換えてみた。

が、やはりエラー。

 Problem 1
    - Installation request for craue/twigextensions-bundle ~2.4 -> satisfiable by craue/twigextensions-bundle[2.4.0].
    - Conclusion: remove symfony/config v2.7.28
    - craue/twigextensions-bundle 2.4.0 requires symfony/dependency-injection ~3.4|~4.1 -> satisfiable by symfony/dependency-injection[v3.4.0, v3.4.1, v3.4.10, v3.4.11, v3.4.12, v3.4.13, v3.4.14, v3.4.15, v3.4.16, v3.4.17, v3.4.18, v3.4.19, v3.4.2, v3.4.20, v3.4.21, v3.4.22, v3.4.23, v3.4.24, v3.4.3, v3.4.4, v3.4.5, v3.4.6, v3.4.7, v3.4.8, v3.4.9, v4.1.0, v4.1.1, v4.1.10, v4.1.11, v4.1.2, v4.1.3, v4.1.4, v4.1.5, v4.1.6, v4.1.7, v4.1.8, v4.1.9, v4.2.0, v4.2.1, v4.2.2, v4.2.3, v4.2.4, v4.2.5].

craue/twigextensions-bundleではsymfony/config: ~3.4|~4.1を要求しているが、symfony/dependency-injectionsymfony/config: <4.2とconflictしている。というわけで相いれない。

TwigExtensionsBundle/FormatNumberExtension.php at master · craue/TwigExtensionsBundle

Extension 自作に方針転換

craue/twigextensions-bundleの中身を見ると、普通にPHPのNumberFormatterを呼び出している模様。

 /**
     * Spells out a number.
     * @return string Spelled out number.
     */
    public function formatSpelledOutNumber($value, $locale = null) {
        return $this->getFormattedNumber($value, $locale, \NumberFormatter::SPELLOUT);
    }

これならExtension自作でもなんとかなるか。

Twig拡張関数を作ってデザインをカスタマイズしてみよう - Qiita

プラグインServiceProviderに以下を追加。

//Twig Extensions
$app['twig'] = $app->share(
    $app->extend(
        'twig', function (\Twig_Environment $twig, \Silex\Application $app) {
            // spellout するTwig拡張関数
            $twig->addFunction(
                new \Twig_SimpleFunction(
                    'myTwigExtension_SpellOutNumber', function ($value) use ($app) {
                        if ($value === null) {
                          return null;
                        }
                        $localeToUse = 'en';
                        $spellouter = new \NumberFormatter($localeToUse, \NumberFormatter::SPELLOUT);
                        $result = $spellouter->format($value);
                        if ($result === false) {
                          throw new \InvalidArgumentException(sprintf('The value "%s" of type %s cannot be formatted.', $value, gettype($value)));
                        }
                        return $result;
                      }
                )
            );
            return $twig;
        }
    )
);

Twig テンプレートの中で、数値を

{{ myTwigExtension_SpellOutNumber( 100 )}}

のようにしてやると、英単語でhundredのように表示される。

参考記事