Skip to content

Commit ebf6d9f

Browse files
[18.0][MIG] Migrated module website_menu_url_translate from v15 to v18
1 parent 92d0cde commit ebf6d9f

File tree

11 files changed

+247
-0
lines changed

11 files changed

+247
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
.. image:: https://img.shields.io/badge/license-LGPL--3-blue.svg
2+
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
3+
:alt: License: LGPL-3
4+
5+
=============================
6+
Website Menus URL Translation
7+
=============================
8+
9+
This module allows you to translate the URL of the website menu in case if you have a multilanguage website
10+
11+
Usage
12+
=====
13+
14+
To use this module, you need to:
15+
16+
* To translate the URL of the website menu in case if you have a multilanguage website,
17+
go to Website App.
18+
* Then go to Site -> Pages and click the ✏️ Edit (pencil) icon to modify the website page.
19+
* You will see an Icon over the field which translates the url(suppose for english
20+
language, icon would be "En").
21+
* Click on that icon and change the url of the required language and save.
22+
23+
24+
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
25+
:alt: Try me on Runbot
26+
:target: https://runbot.odoo-community.org/runbot/186/8.0
27+
28+
Credits
29+
=======
30+
31+
Contributors
32+
------------
33+
34+
* Nilesh Sheliya <sheliyanilesh@gmail.com>
35+
36+
Sponsors
37+
--------
38+
39+
* Sponsored by Nitrokey: www.nitrokey.com
40+
41+
Maintainer
42+
----------
43+
44+
.. image:: https://odoo-community.org/logo.png
45+
:alt: Odoo Community Association
46+
:target: https://odoo-community.org
47+
48+
This module is maintained by the OCA.
49+
50+
OCA, or the Odoo Community Association, is a nonprofit organization whose
51+
mission is to support the collaborative development of Odoo features and
52+
promote its widespread use.
53+
54+
To contribute to this module, please visit https://odoo-community.org.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from . import controllers
2+
from . import models
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"name": "Website Menu URL Translation",
3+
"summary": "Translate website menu URLs for different languages.",
4+
"category": "Website",
5+
"version": "18.0.1.0.0",
6+
"author": "GYB IT SOLUTIONS,"
7+
"Nitrokey GmbH,"
8+
"Odoo Community Association (OCA),"
9+
"Synodica Solutions Pvt. Ltd.",
10+
"website": "https://github.com/OCA/website",
11+
"license": "LGPL-3",
12+
"depends": ["website"],
13+
"data": [
14+
# "data/ir_translation.xml",
15+
"views/website_page.xml",
16+
],
17+
"installable": True,
18+
"application": False,
19+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import main
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from odoo import http
2+
from odoo.http import request
3+
from odoo.addons.web.controllers.home import Home as WebHome
4+
5+
6+
class Website(WebHome):
7+
@http.route(
8+
"/website/lang/<lang>",
9+
type="http",
10+
auth="public",
11+
website=True,
12+
multilang=False,
13+
)
14+
def change_lang(self, lang, r="/", **kwargs):
15+
"""Override website language change to support translated menu URLs.
16+
Handle language change while keeping translated URLs."""
17+
TRANSLATE = request.env["ir.translation"].sudo()
18+
lang_code = request.env["res.lang"]._lang_get_code(lang)
19+
page_url = r.replace(f"/{lang}", "")
20+
trans_r = r.replace(f"{lang}/", "")
21+
22+
# Search translation record matching language and source URL
23+
trans_rec = TRANSLATE.search(
24+
[("lang", "=", lang_code), ("src", "=", trans_r)], limit=1
25+
)
26+
27+
if trans_rec:
28+
r = f"/{lang}{(trans_rec.value or trans_rec.src)}"
29+
else:
30+
# Try reverse lookup by translated value or src
31+
trans_val = TRANSLATE.search(
32+
[("value", "=", page_url)], limit=1
33+
) or TRANSLATE.search([("src", "=", page_url)], limit=1)
34+
35+
if trans_val:
36+
src = trans_val.src
37+
trans_lang = TRANSLATE.search(
38+
[("src", "=", src), ("lang", "=", lang_code)], limit=1
39+
)
40+
trans_text = trans_lang.value or trans_lang.src if trans_lang else src
41+
r = f"/{lang}{trans_text}"
42+
43+
# Call parent Home controller’s language switch
44+
return super().change_lang(lang=lang, r=r, **kwargs)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo noupdate="1">
3+
<!-- Enable Language -->
4+
<!-- <record id="base.lang_de" model="res.lang">
5+
<field name="active" eval="True" />
6+
</record>
7+
8+
<record id="lang_change_test_1" model="ir.translation">
9+
<field name="name">Testing</field>
10+
<field name="src">Testing</field>
11+
<field name="value">testen</field>
12+
<field name="lang">de_DE</field>
13+
<field name="state">translated</field>
14+
<field name="module">website_menu_url_translate</field>
15+
</record>
16+
17+
<record id="lang_change_test_2" model="ir.translation">
18+
<field name="name">testen</field>
19+
<field name="src">testen</field>
20+
<field name="lang">en_US</field>
21+
<field name="state">translated</field>
22+
<field name="module">website_menu_url_translate</field>
23+
</record>
24+
25+
<record id="lang_change_test_3" model="ir.translation">
26+
<field name="name">Testing-3</field>
27+
<field name="src">Testing-3</field>
28+
<field name="value" />
29+
<field name="lang">en_US</field>
30+
<field name="state">translated</field>
31+
<field name="module">website_menu_url_translate</field>
32+
</record>
33+
34+
<record id="lang_change_test_4" model="ir.translation">
35+
<field name="name">Testing-3</field>
36+
<field name="src">Testing-3</field>
37+
<field name="value">Testing-3</field>
38+
<field name="lang">de_DE</field>
39+
<field name="state">translated</field>
40+
<field name="module">website_menu_url_translate</field>
41+
</record> -->
42+
</odoo>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import website
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from odoo import fields, models
2+
3+
4+
class WebsiteMenu(models.Model):
5+
_inherit = "website.menu"
6+
7+
url = fields.Char(translate=True)
8+
9+
10+
class WebsitePage(models.Model):
11+
_inherit = "website.page"
12+
13+
url = fields.Char("Page URL", translate=True)
14+
15+
def action_edit_page_form(self):
16+
"""Open the page in form view from tree."""
17+
self.ensure_one()
18+
return {
19+
"type": "ir.actions.act_window",
20+
"name": "Edit Website Page",
21+
"res_model": "website.page",
22+
"view_mode": "form",
23+
"res_id": self.id,
24+
"target": "current",
25+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_website
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Copyright 2017 LasLabs Inc.
2+
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl)
3+
4+
from odoo.tests.common import HttpCase, TransactionCase
5+
6+
CONTROLLER_PATH = "odoo.addons.website_sale_affiliate.controllers.main"
7+
8+
9+
class WebsiteSaleCase(HttpCase, TransactionCase):
10+
def setUp(self):
11+
super().setUp()
12+
self.test1 = self.env.ref("website_menu_url_translate.lang_change_test_1")
13+
self.test2 = self.env.ref("website_menu_url_translate.lang_change_test_2")
14+
15+
def test_change_lang(self):
16+
"""Test change_lang controller with multiple languages"""
17+
# Test with default language
18+
req = self.url_open(f"/website/lang/default", allow_redirects=False)
19+
self.assertIn(req.status_code, [303, 200])
20+
21+
# Test with English language
22+
req = self.url_open(f"/website/lang/en_US?r=testen", allow_redirects=False)
23+
self.assertIn(req.status_code, [303, 200])
24+
25+
# Test with German language
26+
req = self.url_open(f"/website/lang/de_DE?r=Testing", allow_redirects=False)
27+
self.assertIn(req.status_code, [303, 200])
28+
29+
# Test with Spanish language
30+
req = self.url_open(f"/website/lang/es_ES?r=", allow_redirects=False)
31+
self.assertIn(req.status_code, [303, 200])
32+
33+
# Test with English language (empty route)
34+
req = self.url_open(f"/website/lang/en_US?r=", allow_redirects=False)
35+
self.assertIn(req.status_code, [303, 200])
36+
37+
# Test with German language (empty route)
38+
req = self.url_open(f"/website/lang/de_DE?r=", allow_redirects=False)
39+
self.assertIn(req.status_code, [303, 200])

0 commit comments

Comments
 (0)