プレビュー版 — 内容は変更される場合があります

顧客との共同開発で、Frappe 上のすべてのアプリを多言語化する仕組みをつくり、OSS として公開しました

管理者 7分で読めます

ラッシュジャパン様との共同開発で作成した多言語管理アプリ I18n Manager を、AGPL-3.0 のオープンソースとして公開しました。ERPNext だけでなく、Frappe 上で動くすべてのアプリ(HRMS、CRM、自社開発アプリなど)の翻訳を管理できます。

共同開発パートナー:ラッシュジャパン合同会社

英国発のハンドメイドコスメブランド「LUSH(ラッシュ)」の日本法人です。新鮮な原料を使った石けんやバスボムなどを国内で製造・販売しています。

https://www.lush.com/jp/ja

要旨

  1. 費用を分担し、成果物を公開する共同開発モデルで実施しました。顧客は費用が抑えられ、継続保守の付いた道具を手にします。当社は自社製品として育てる権利を得ます。
  2. Frappe に無かった能力を足しました。 標準の道具はソースコードしか見ず、画面に出る文字の多くを永久に検出できません。また「訳が実際に画面に届いたか」を確かめる手段がありません。
  3. 日本語に限った道具ではありません。 Frappe が翻訳を同梱していない言語でも、ベンチ上のどのアプリでも動きます。

1. 共同開発モデルについて

きっかけは、ラッシュジャパン様における ERPNext の日本市場導入をご支援する案件でした。その一環として画面の日本語化を進める中で、「どこがまだ訳されていないのかを誰も正確に言えない」という問題に突き当たります。

同じ道具は当社の他の案件でも必要でした。一方で顧客にとっても、自社専用の道具を抱え込むより、他社が使い改良するほうが長期的に有利です。そこで次の整理を提案しました。

一般的な受託開発今回の共同開発
著作権発注者または受注者の単独3 社の連名
成果物の扱い発注者の専有AGPL-3.0 で公開
開発費全額を発注者が負担費用を分担
保守都度見積当社が継続実施
他社での利用不可可能(誰でも導入できる)

顧客にとっての利点

  • 費用が下がる。 当社が自社製品として育てる権利を得る対価として、開発費の一部を当社が負担します。
  • 保守が続く。 専用開発の道具は、作った会社が離れれば止まります。公開された製品は、Frappe / ERPNext の版数追随も不具合修正も当社が継続して行います。
  • 他社の改良が還ってくる。 公開されている以上、他の利用者による修正や機能追加が自社にも届きます。
  • 囲い込まれない。 ソースが公開されているため、当社以外の事業者でも保守できます。

当社にとっての利点

  • 実際の業務課題から出発した製品が手に入ります。仮説から作った製品より、外れません。
  • 導入実績と、公開された測定結果が、次の案件の説得材料になります。

この形が向くのは、顧客固有の業務ロジックではなく、業界共通の課題を解く道具の場合です。 競争優位に直結する仕組みは、従来どおり専有で開発すべきです。


2. Frappe に足した能力

標準でできること、できないこと

Frappe は翻訳の置き場所(アプリ同梱ファイルとサイト内レコード)と、ソースコードから未訳を洗い出すコマンドを持っています。しかし次がありません。

Frappe 標準I18n Manager
訳の置き場所(ファイル・サイト内レコード)○○
親言語へのフォールバック○○
ソースコード中の未訳の抽出○○
データベースに入った表示文字列✕○
翻訳関数を通っていない文字列✕○
実際に画面へ描画された文字列✕○
訳が画面に届いたかの検証✕○
翻訳対象の台帳(状態管理)✕○
網羅率という数値✕○
用語集と遵守チェック✕○
プレースホルダ・書式の破損検出✕○
兄弟言語へのフォールバック✕○
アプリ同梱 CSV の生成✕○

上 3 行は Frappe が既に持っているもので、このアプリはそれを置き換えず、そのまま使います。訳の最終的な置き場所は標準のままなので、このアプリを外しても、反映済みの訳はサイトに残ります。

見えていなかった文字列

標準の bench get-untranslated は プログラムのソースコードしか読みません。画面に出る文字のうちデータベースに保存されているもの — ワークスペースの見出し、レポート名、通知の件名、選択肢 — は、何度実行しても出てきません。

さらに、frappe.throw("Invalid Name") のように翻訳関数を通さずに書かれた文字列は、どの言語でも訳されません。これは訳を足しても直らず、コードの修正が要ります。

そして最後に、画面を実際に開いて読む経路を用意しました。ブラウザでログインし、1 枚ずつ画面を開いて描画されている文字を読み取ります。JSON の中に埋まった見出しなど、他のどの方法でも見つからないものがここで出ます。当社の検証では、他の 3 経路が知らない文字列が実際に検出されました。

訳が「届いたか」を確かめる

翻訳を承認することと、それが利用者の画面に出ることは別です。このアプリは承認済みの各行について、ファイルをキャッシュを通さず読み直して判定します。

状態意味対処
Live画面に出ている—
Cache Staleファイルにはあるが古い内容を配信中キャッシュ削除
Not Deployedどのファイルにも無い書き出して配置
Overridden別のアプリのファイルが勝っている勝っている側を探す

ブラウザで見ると 3 つとも「英語のまま」で同じに見えますが、直し方はまったく違います。 この区別ができるようになったことが、実務では最も効きました。

一周させる

測定だけの道具ではありません。未訳を CSV で書き出し、訳し終えたものを取り込み、承認し、サイトとアプリ同梱ファイルの両方へ配るまでを担います。訳文を書くことだけが、このアプリの外側にあります。


3. グローバルへの貢献

日本語に限った道具ではありません

Frappe は 83 言語を選択肢として持ち、そのうち 36 言語を翻訳しています(ERPNext は 71 言語)。それ以外の言語を選べば、翻訳は自分たちで用意することになります。

そして、どの言語を選んでも、自社向けに書かれたアプリは誰も訳しません。 当社の検証サイトで、業務用に書かれたアプリ 5 本には 988 件の翻訳対象がありました。対価を払って作業した日本語は 97.9%、他の 3 言語は 0〜1.2% です。frappe と erpnext だけで網羅率を測ると、この事実は完全に隠れます。

測定結果を公開しました

同じサイトの 4 言語を同時点で測った結果を、アプリと一緒に公開しています。

言語frappe の翻訳ファイルサイトでの実測
ドイツ語6,292 件中 6,152 件(97.8%)93.0%
モンゴル語6,292 件中 6,285 件(99.9%)40.6%
韓国語6,292 件中 27 件(0.4%)58.1%

モンゴル語は、測った中で最もファイルが埋まっている言語でありながら網羅率は最下位です。ERPNext がモンゴル語を同梱していないためです。韓国語はファイルがほぼ空なのに 58.1% に届きます。ERPNext 側が埋まっているためです。

翻訳ファイルを見て進捗を判断すると、両方向に間違えます。 サイトを測る以外に答えは出ません。

そのほかの公開物

多言語管理アプリのほかにも、Frappe コミュニティに次を公開しています。

公開物内容
frappe_japanese_translationsFrappe / ERPNext の日本語訳 24,026 行。アプリとして導入できる形で提供
frappe_chat_translateチャットのリアルタイム翻訳。参加者がそれぞれの言語で全メッセージを読める
frappe-i18n-patches日付ピッカーとカレンダーが利用者の言語に従うようにする修正

最後のものについては、Frappe 本体への取り込みを提案中です。日本語のフォームの中で日付ピッカーだけが SU MO TU WE TH FR SA と英語で描画される問題で、日本語固有ではなく、定義が用意されていないすべての言語が影響を受けます。翻訳作業では直せない種類の不具合であり、回帰テストを添えて上流に提案しています。


今後

  • ラッシュジャパン様の確認を経て、Frappe Cloud Marketplace へ掲載申請します。掲載されれば、世界中の Frappe Cloud 利用者がワンクリックで導入できます
  • 検出した指摘を自動で分類し、対応の要否まで提示する機能を次の開発として予定しています

共同開発にご関心のある方へ。 自社の課題を解くために作った道具が、他社でも役に立つことは珍しくありません。費用を分担し、成果物を公開し、保守を当社が引き受ける形は、そうした場合に双方にとって合理的な選択肢になります。お気軽にご相談ください。

この記事を書いた人

管理者

Agentic Company OSを、14日間無料で体験

クレジットカード不要で、すべての機能をお試しいただけます。まずは無料トライアルから始めましょう。