diff --git a/addons/test_website/controllers/main.py b/addons/test_website/controllers/main.py index f36053cd38f..63333b8157e 100644 --- a/addons/test_website/controllers/main.py +++ b/addons/test_website/controllers/main.py @@ -44,6 +44,10 @@ class WebsiteTest(Home): def test_company_context(self): return request.make_response(json.dumps(request.context.get('allowed_company_ids'))) + @http.route('/test_lang_url/', type='http', auth='public', website=True, sitemap=False) + def test_lang_url(self, **kwargs): + return request.render('test_website.test_view') + # Test Session @http.route('/test_get_dbname', type='json', auth='public', website=True, sitemap=False) diff --git a/addons/test_website/tests/test_is_multilang.py b/addons/test_website/tests/test_is_multilang.py index 69259f32054..1c7d61801e1 100644 --- a/addons/test_website/tests/test_is_multilang.py +++ b/addons/test_website/tests/test_is_multilang.py @@ -24,3 +24,48 @@ class TestIsMultiLang(odoo.tests.HttpCase): self.assertEqual(fr_prefix + '/post', body.find('./form[@id="post"]').get('action')) self.assertEqual(fr_prefix + '/get_post', body.find('./a[@id="get_post"]').get('href')) self.assertEqual('/get_post_nomultilang', body.find('./a[@id="get_post_nomultilang"]').get('href')) + + def test_02_url_lang_code_underscore(self): + website = self.env['website'].browse(1) + it = self.env.ref('base.lang_it').sudo() + en = self.env.ref('base.lang_en').sudo() + be = self.env.ref('base.lang_fr_BE').sudo() + country1 = self.env['res.country'].create({'name': "My Super Country"}) + + it.active = True + be.active = True + website.domain = 'http://127.0.0.1:8069' # for _is_canonical_url + website.default_lang_id = en + website.language_ids = en + it + be + params = { + 'src': country1.name, + 'value': country1.name + ' Italia', + 'type': 'model', + 'name': 'res.country,name', + 'res_id': country1.id, + 'lang': it.code, + 'state': 'translated', + } + self.env['ir.translation'].create(params) + params.update({ + 'value': country1.name + ' Belgium', + 'lang': be.code, + }) + self.env['ir.translation'].create(params) + r = self.url_open('/test_lang_url/%s' % country1.id) + self.assertEqual(r.status_code, 200) + self.assertTrue(r.url.endswith('/test_lang_url/my-super-country-%s' % country1.id)) + + r = self.url_open('/%s/test_lang_url/%s' % (it.url_code, country1.id)) + self.assertEqual(r.status_code, 200) + self.assertTrue(r.url.endswith('/%s/test_lang_url/my-super-country-italia-%s' % (it.url_code, country1.id))) + + body = lxml.html.fromstring(r.content) + # Note: this test is indirectly testing the `ref=canonical` tag is correctly set, + # as it is required in order for `rel=alternate` tags to be inserted in the DOM + it_href = body.find('./head/link[@rel="alternate"][@hreflang="it"]').get('href') + fr_href = body.find('./head/link[@rel="alternate"][@hreflang="fr"]').get('href') + en_href = body.find('./head/link[@rel="alternate"][@hreflang="en"]').get('href') + self.assertTrue(it_href.endswith('/%s/test_lang_url/my-super-country-italia-%s' % (it.url_code, country1.id))) + self.assertTrue(fr_href.endswith('/%s/test_lang_url/my-super-country-belgium-%s' % (be.url_code, country1.id))) + self.assertTrue(en_href.endswith('/test_lang_url/my-super-country-%s' % country1.id)) diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 248c75fa77f..8533e9c7e9c 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -1105,7 +1105,7 @@ class Website(models.Model): for key, val in list(arguments.items()): if isinstance(val, models.BaseModel): if val.env.context.get('lang') != lang.code: - arguments[key] = val.with_context(lang=lang.url_code) + arguments[key] = val.with_context(lang=lang.code) path = router.build(request.endpoint, arguments) else: # The build method returns a quoted URL so convert in this case for consistency.