Shopware 6 日本語言語パックを個人開発しました

に公開

Shopwareとは

Shopwareは、ドイツを拠点とするオープンソースのEコマースプラットフォームです。柔軟性の高いアーキテクチャと豊富なカスタマイズ機能で知られており、中小企業から大企業まで幅広く利用されています。現代的なフレームワーク(Symfony、Vue.js)を基盤とし、APIファーストアプローチを採用した次世代のEコマースソリューションです。しかし、主にヨーロッパ市場向けに開発されているため、日本語環境が全く整備されていません。

現在、日本向けオンラインショップをShopwareで開発しており、今後Shopwareを簡単に日本ローカライズできるように、日本語言語パック for Shopware 6を開発することにしました。現在のバージョンv1.3.0では、ストアフロントと管理パネルの両方で完全な日本語ローカライゼーションを提供しています。

設計思想:段階的機能拡張を見据えたアーキテクチャ

大規模な機能を一度に実装するのではなく、段階的な機能拡張を可能にするモジュラー設計を採用しました。これにより、開発・テスト・リリースのサイクルを短縮し、品質を保ちながら継続的に改善できる体制を構築しています。

<?php
public function install(InstallContext $installContext): void
{
    $this->createJapaneseLanguage($installContext->getContext());
    $this->createJapaneseCurrency($installContext->getContext());
    $this->createJapaneseCountry($installContext->getContext());
    $this->createJapanesePrefectures($installContext->getContext());
    $this->createJapaneseProductSorting($installContext->getContext());
    $this->createJapaneseMailTemplates($installContext->getContext());
    $this->createJapaneseStateMachineStates($installContext->getContext());
}

各機能を独立したメソッドに分離することで、単一責任の原則に従い、テストしやすく保守しやすいコードベースを実現しています。

日本円の特殊性への対応:小数点なし通貨の完全実装

日本円には小数点以下を使用しないという特徴があります。これをShopwareで正しく表現するため:

<?php
$currencyRepository->create([
    [
        'isoCode' => 'JPY',
        'name' => '日本円',
        'symbol' => '¥',
        'factor' => 1.0,
        'decimalPrecision' => 0,  // 小数点桁数を0に設定
        'shortName' => 'JPY',
        'position' => 1,
        'itemRounding' => [
            'decimals' => 0,
            'interval' => 0.01,
            'roundForNet' => false
        ],
        'totalRounding' => [
            'decimals' => 0,
            'interval' => 0.01,
            'roundForNet' => false
        ]
    ]
], $context);

decimalPrecision: 0 だけでなく、itemRoundingtotalRounding の両方で小数点処理を統一しています。これにより「¥1,234.56」ではなく「¥1,235」が正しく表示されます。

47都道府県の完全実装:日本のEコマースに必須の地域データ

日本のEコマースサイトでは都道府県選択が必須です。Shopwareの標準的なState管理機能を使用して、全47都道府県を実装しました:

<?php
private function getPrefecturesData(): array
{
    return [
        ['code' => 'JP-01', 'name' => 'Hokkaido', 'nameJa' => '北海道'],
        ['code' => 'JP-02', 'name' => 'Aomori', 'nameJa' => '青森県'],
        ['code' => 'JP-13', 'name' => 'Tokyo', 'nameJa' => '東京都'],
        ['code' => 'JP-27', 'name' => 'Osaka', 'nameJa' => '大阪府'],
        // ...全47都道府県を完全実装
    ];
}

public function createPrefectures(Context $context): void
{
    foreach ($this->getPrefecturesData() as $prefecture) {
        // 重複チェックとバリデーション付きの作成ロジック
    }
}

ISO 3166-2:JP標準に準拠したコード体系を使用し、英語名と日本語名の両方を管理することで、多言語環境での運用や将来的な国際展開にも対応可能な設計としています。

CSSのみで描く日本国旗:パフォーマンスを重視した軽量実装

画像ファイルに依存せず、CSSグラデーションで日本国旗を作成しています:

.language-flag {
  &.country-jp {
    background: radial-gradient(
        5px at 50% 50%,
        #bc002d 0,
        #bc002d 35%,
        transparent 35%,
        transparent 100%
      ), white;
    border: 1px solid $gray-500;
    width: 20px;
    height: 14px;
    border-radius: 2px;
  }
}

radial-gradient を使用して中央に赤い円を描き、外側を透明にして日の丸を表現しています。画像ファイルが不要で軽量なソリューションです。

開発過程で直面した技術的課題と解決策

日本語フォント問題:文字化けの根本原因

初期バージョンでは、生成されるPDFドキュメントで日本語が表示されない問題が発生しました。デバッグの結果、Shopwareのデフォルトフォント設定が日本語の文字セットに対応していないことが判明しました。

解決策: ドキュメントテンプレートのフォント指定を Noto Sans CJK JP に変更し、日本語、中国語、韓国語の文字を包括的にサポートする設定に修正しました。これにより、請求書や配送伝票などの重要なドキュメントでも日本語が正確に表示されるようになりました。

AI支援による効率的な翻訳作業

管理パネルやメールテンプレートの翻訳は内容的には複雑ではありませんでしたが、ファイル数が多いため非常に時間がかかりました。特に反復的なスニペット翻訳においてAIの活用は極めて効率的で、プロセスを大幅に加速させました。

Shopwareアーキテクチャの深掘り:ローカライゼーション機構の理解

このプロジェクトを通じて、Shopwareの内部アーキテクチャ、特にローカライゼーションシステムの設計思想を深く理解することができました。プラグインシステム、エンティティ管理、テンプレートエンジンの連携方法など、エンタープライズレベルのEコマースプラットフォームの構造を学ぶ貴重な機会となりました。

v1.3.0で達成した目標

現在のバージョンv1.3.0では以下が完全に実装されています:

  • 完全な日本語ローカライゼーション:ストアフロント、管理パネル、メールテンプレート、ドキュメント
  • 日本固有の調整:円通貨、47都道府県、フラグアイコン
  • 拡張性:段階的な機能拡張を可能にするアーキテクチャ

今後の展望

Shopwareは日本ではほとんど使われていませんが、柔軟性の高いアーキテクチャを持つオープンソースの素晴らしいEコマースプラットフォームです。WooCommerceやShopifyといった既存の選択肢とは一線を画す、モダンな技術スタックと拡張性を兼ね備えています。

このプラグインを使用すれば、日本の開発者がShopware 6を始める際の言語的障壁が大幅に削減されます。特に、カスタマイズ性を重視する開発者や、ヨーロッパ市場への展開を視野に入れている事業者にとって、Shopwareは非常に魅力的な選択肢となるでしょう。

もしShopwareに興味をお持ちであれば、ぜひ一度このプラグインを試用していただき、実際の使用感やご要望をフィードバックしていただけると幸いです。

Discussion