1
vote
542 Views

得意先マスタの都道府県欄が日本語化する方法についてアドバイスをください

はじめまして、こちらのフォーラムには初投稿になります。
現在、Odoo の導入を検討している 澤田 と申します。

現在、github のソースから 11.0 ブランチを取得して自前で構築して、
不便なところを洗い出して自分で直せそうなところは、
修正してパッチを送ろうと考えていますので、
いろいろアドバイスをいただけると幸いです。

さっそく、Odoo の得意先マスタ(パートナー)の住所欄にある、
都道府県欄がアクセント付きのローマ字になっていることを発見したので、
試しに自身で解決を試みたのですが、冒頭から躓いてしまいました。

アクセントは設定で外せそうな雰囲気でしたが、
やはり日本語のネイティブ表示の方が自然ですし、
何よりカスタマイズの勉強には良い題材だと思ったので、
カスタマイズしてみることにしました。

試しに、@yostashiro 氏の開発した Odoo のローカライゼーションモジュール(l10n_jp)
に以下のようなパッチを当てて再インストールを試みましたが、
都道府県レコードの一意性制約(UNIQUE CONSTRAINTS)の関係でエラーがでるようです。

https://github.com/eternalharvest/odoo/commit/b9f67e4b986d9686ffd6393a6d399

74176d65587
エラーの内容は、以下のとおりです。

アドバイスをいただけると嬉しいです。
問題が解決できたら、Github の公式にプルリク投げてみたいと思います。

Traceback (most recent call last): File "/home/takuya/work/odoo/odoo/tools/convert.py", line 741, in parse self._tags[rec.tag](rec, de, mode=mode) File "/home/takuya/work/odoo/odoo/tools/convert.py", line 651, in _tag_record id = self.env(context=rec_context)['ir.model.data']._update(rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode) File "/home/takuya/work/odoo/odoo/addons/base/ir/ir_model.py", line 1467, in _update record = record.create(values) File "/home/takuya/work/odoo/odoo/models.py", line 3281, in create record = self.browse(self._create(old_vals)) File "/home/takuya/work/odoo/odoo/models.py", line 3374, in _create cr.execute(query, tuple(u[2] for u in updates if len(u) > 2)) File "/home/takuya/work/odoo/odoo/sql_db.py", line 155, in wrapper return f(self, *args, **kwargs) File "/home/takuya/work/odoo/odoo/sql_db.py", line 232, in execute res = self._obj.execute(query, params) psycopg2.IntegrityError: duplicate key value violates unique constraint "res_country_state_name_code_uniq" DETAIL: Key (country_id, code)=(113, 01) already exists. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/takuya/work/odoo/odoo/http.py", line 646, in _handle_exception return super(JsonRequest, self)._handle_exception(exception) File "/home/takuya/work/odoo/odoo/http.py", line 307, in _handle_exception raise pycompat.reraise(type(exception), exception, sys.exc_info()[2]) File "/home/takuya/work/odoo/odoo/tools/pycompat.py", line 87, in reraise raise value File "/home/takuya/work/odoo/odoo/http.py", line 683, in dispatch result = self._call_function(**self.params) File "/home/takuya/work/odoo/odoo/http.py", line 339, in _call_function return checked_call(self.db, *args, **kwargs) File "/home/takuya/work/odoo/odoo/service/model.py", line 97, in wrapper return f(dbname, *args, **kwargs) File "/home/takuya/work/odoo/odoo/http.py", line 332, in checked_call result = self.endpoint(*a, **kw) File "/home/takuya/work/odoo/odoo/http.py", line 927, in __call__ return self.method(*args, **kw) File "/home/takuya/work/odoo/odoo/http.py", line 512, in response_wrap response = f(*args, **kw) File "/home/takuya/work/odoo/addons/web/controllers/main.py", line 928, in call_button action = self._call_kw(model, method, args, {}) File "/home/takuya/work/odoo/addons/web/controllers/main.py", line 916, in _call_kw return call_kw(request.env[model], method, args, kwargs) File "/home/takuya/work/odoo/odoo/api.py", line 689, in call_kw return call_kw_multi(method, model, args, kwargs) File "/home/takuya/work/odoo/odoo/api.py", line 680, in call_kw_multi result = method(recs, *args, **kwargs) File "<decorator-gen-39>", line 2, in button_immediate_install File "/home/takuya/work/odoo/odoo/addons/base/module/module.py", line 71, in check_and_log return method(self, *args, **kwargs) File "/home/takuya/work/odoo/odoo/addons/base/module/module.py", line 446, in button_immediate_install return self._button_immediate_function(type(self).button_install) File "/home/takuya/work/odoo/odoo/addons/base/module/module.py", line 539, in _button_immediate_function modules.registry.Registry.new(self._cr.dbname, update_module=True) File "/home/takuya/work/odoo/odoo/modules/registry.py", line 84, in new odoo.modules.load_modules(registry._db, force_demo, status, update_module) File "/home/takuya/work/odoo/odoo/modules/loading.py", line 343, in load_modules loaded_modules, update_module) File "/home/takuya/work/odoo/odoo/modules/loading.py", line 242, in load_marked_modules loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks) File "/home/takuya/work/odoo/odoo/modules/loading.py", line 156, in load_module_graph _load_data(cr, module_name, idref, mode, kind='data') File "/home/takuya/work/odoo/odoo/modules/loading.py", line 94, in _load_data tools.convert_file(cr, module_name, filename, idref, mode, noupdate, kind, report) File "/home/takuya/work/odoo/odoo/tools/convert.py", line 788, in convert_file convert_xml_import(cr, module, fp, idref, mode, noupdate, report) File "/home/takuya/work/odoo/odoo/tools/convert.py", line 849, in convert_xml_import obj.parse(doc.getroot(), mode=mode) File "/home/takuya/work/odoo/odoo/tools/convert.py", line 738, in parse self.parse(rec, mode) File "/home/takuya/work/odoo/odoo/tools/convert.py", line 748, in parse exc_info[2] File "/home/takuya/work/odoo/odoo/tools/pycompat.py", line 86, in reraise raise value.with_traceback(tb) File "/home/takuya/work/odoo/odoo/tools/convert.py", line 741, in parse self._tags[rec.tag](rec, de, mode=mode) File "/home/takuya/work/odoo/odoo/tools/convert.py", line 651, in _tag_record id = self.env(context=rec_context)['ir.model.data']._update(rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode) File "/home/takuya/work/odoo/odoo/addons/base/ir/ir_model.py", line 1467, in _update record = record.create(values) File "/home/takuya/work/odoo/odoo/models.py", line 3281, in create record = self.browse(self._create(old_vals)) File "/home/takuya/work/odoo/odoo/models.py", line 3374, in _create cr.execute(query, tuple(u[2] for u in updates if len(u) > 2)) File "/home/takuya/work/odoo/odoo/sql_db.py", line 155, in wrapper return f(self, *args, **kwargs) File "/home/takuya/work/odoo/odoo/sql_db.py", line 232, in execute res = self._obj.execute(query, params) odoo.tools.convert.ParseError: "duplicate key value violates unique constraint "res_country_state_name_code_uniq" DETAIL: Key (country_id, code)=(113, 01) already exists. " while parsing /home/takuya/work/odoo/addons/l10n_jp/data/l10n_jp_state_data.xml:8, near <record id="state_jp_jp-01" model="res.country.state"> <field name="code">01</field> <field name="name">北海道</field> <field name="country_id" ref="base.jp"/> </record>

Takuya Sawada
Takuya Sawada
7
| 0 0 0
Asked on 17/12/16 3:31

0
vote

エラーの原因は、既に解消しているかと思いますが、レコードIDの先頭に上書き対象レコードのモジュール名が入っていないことにあります(レコード上書きでなく、新規追加しようとする動きとなり、キー重複でエラーとなる)。

 

都道府県のレコードの持ち方・表示は確かに改善の余地があるのですが、これは日本向けローカライズモジュールでなく、グローバルに対応すべきかと思います(例えば香港の会社が日本向けにECサイトを開設する場合、日本の勘定科目表などいらないけれども、都道府県は日本語で持ちたい)。

 

おそらく改善の方向性としては、「都道府県項目を翻訳対象とし、日本語訳を持たせる」のが妥当と思われます。

そのためのPRがこちら:https://github.com/odoo/odoo/pull/21798

 

関連して、eコマースでのアドレス入力画面の項目並びや都道府県表示(名称でなくコードが表示される)など、アドレス関連は日本での使用に際して改善すべき点がいくつかあると思いますので、今後そのためのアクションをとっていければと思います。

Yoshi Tashiro
Yoshi Tashiro
121
| 3 1 2
Answered on 17/12/22 6:52
0
vote

お返事ありがとうございます。

確かにデータベースの name フィールドを直接変更するのは良いのか疑問に思っていました。

海外の得意先に請求書を送る場合を考えると自社の住所欄が日本語(漢字表記)になってしまうのは、
非漢字圏の人にとっては不親切なような気もします。
この場合は street1, strret2 をどう翻訳すべきかという問題も残りますが。

教えて頂いた PR のコメント欄に書かれている以下のコミットはすでに 11.0 ブランチにマージされているようですね。
 l10n_multilang モジュールで CountryState が継承されて翻訳可能になっているみたいです。

https://github.com/odoo/odoo/commit/bc84eb20356e65cd8b6fe58e936cc1b90773fb96

都道府県のレコードの持ち方・表示は確かに改善の余地があるのですが、これは日本向けローカライズモジュールでなく、グローバルに対応すべきかと思います(例えば香港の会社が日本向けにECサイトを開設する場合、日本の勘定科目表などいらないけれども、都道府県は日本語で持ちたい)。

確かに、都道府県名はグローバルで持ったほうが良いように私も思いますが、
議論の末、l10n_multilang モジュールで翻訳を実現する方針に固まったのでしょうか。

さすがに base モジュールを l10n_multilang に依存するようなパッチは受け入れられないでしょうから、
実現するとすれば l10n_multilang に直接あるいは
l10n_jp モジュールが l10n_multilang に依存する形にして実現するのが現実的なのかな。

翻訳ファイルだけ l10n_multilang において、
l10n_jp が l10n_multilang に依存するようにする形が良いのだろうか。

こちらで議論するのはあまり適切では無いようなきがするので、
以降は Odoo 公式の Github リポジトリに私が出している PR の方で進めようと思います。
マージされるかは別として個人的に必要なのでパッチを書いてダメ元で PR 投げてみます。
英語はあまり得意ではないのでまともな議論ができる自身がありません。

こちらを見てくれた人のために、以下にリンクを貼っておきます。
今後も Github の方にパッチを投げたりしていくつもりなので、
アドバイスや至らぬ点をフォローをしていただけると幸いです。

https://github.com/odoo/odoo/pull/21780

Takuya Sawada
Takuya Sawada
7
| 0 0 0
Answered on 17/12/22 14:40

回答をどうぞ!

問題解決につながる実際的な回答をお願いします。質問や既出の回答に対して補足が意見がある場合は、コメントツールをご利用ください。一つの質問に対し複数回の回答はできませんが、自分の回答はいつでも修正が可能です。また、質問/回答の評価にご協力ください!

質問する

アップデート通知

このフォーラムについて

このフォーラムはOdooの日本での普及を目指す有志により運営されています。

ガイドラインを読む

質問ツール

13 フォロワー

統計

質問: 17/12/16 3:31
参照: 542
最終更新: 17/12/22 15:03