数字の誤読を防ぐために英語圏では、数字を英単語で綴る、という文化がある。WordingとかSpellOutとか呼ぶようだ。
海外送金などでは大きな金額を間違えずに英単語で書かされる場合もあり、けっこう面倒くさい。
ECCUBE3 の英語化にあたりSpellOutの要望があったので応えた。
目次
環境
[EC-CUBE] EC-CUBE3.0.16
調査
調べているうちに3つほど方針があるように思った
- ControllerからPHPの
NumberFormatter
を使って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-injection
はsymfony/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
のように表示される。
参考記事
- Twig拡張関数を作ってデザインをカスタマイズしてみよう - Qiita
- TwigExtensionsBundle/FormatNumberExtension.php at master · craue/TwigExtensionsBundle
- PHP: NumberFormatter - Manual
- craue/twigextensions-bundle - Packagist
- symfony/dependency-injection - Packagist
- The Intl Extension — Twig-extensions latest documentation
- symfony/NumberFormatter.php at 2.7 · symfony/symfony