Opened 6 years ago
Last modified 6 years ago
#31540 new Bug
i18n URLs are not matched against the fallback language.
| Reported by: | osxisl | Owned by: | nobody |
|---|---|---|---|
| Component: | Internationalization | Version: | 3.0 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
http://example.com/de/id-button/ - 200 OK
http://example.com/id/id-button/ - 200 OK
http://example.com/any-other-slug/ - 200 OK
http://example.com/id-button/ - 404 error:
Using the URLconf defined in example.urls, Django tried these URL patterns, in this order: id/ The current path, id-button/, didn't match any of these. urls.py file:
urlpatterns = i18n_patterns(
path('admin/', admin.site.urls),
path('', cache_page(cache_homepage)(homepage_views.index), name='index'),
path('search/', search_views.search, name='search'),
path('<slug:slug>/', item_views.item, name='item'),
prefix_default_language=False,
)
The item have a slug field in DB "id-button". If I rename this to "idbutton": http://example.com/idbutton/ - 200 OK
Change History (10)
comment:1 by , 6 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 6 years ago
| Description: | modified (diff) |
|---|
follow-ups: 4 5 comment:3 by , 6 years ago
| Component: | Uncategorized → Internationalization |
|---|---|
| Resolution: | → invalid |
| Status: | new → closed |
| Summary: | A 404 error with “id-” in slug on multilingual website with Indonesian language → A 404 error with “id-” in slug on multilingual website with Indonesian language. |
comment:4 by , 6 years ago
Replying to felixxm:
Thanks for this ticket, however I cannot reproduce this issue. IMO it's not an issue in Django, you can try to ask on one of support channels.
For me it looks like there is a problem regex here https://github.com/django/django/blob/92507bf3ea4dc467f68edf81a686548fac7ff0e9/django/utils/translation/trans_real.py#L46
It activates "id" language when meets "id-button" in slug despite I only use in settings "id" not "id-button" locale. And I'm sure no such locale in Unicode as well.
comment:5 by , 6 years ago
Replying to felixxm:
Thanks for this ticket, however I cannot reproduce this issue. IMO it's not an issue in Django, you can try to ask on one of support channels.
I think there is problem in design here, if someone needs custom locale like 'id-button' it should be seeded separately in settings.py
comment:6 by , 6 years ago
| Resolution: | invalid |
|---|---|
| Status: | closed → new |
follow-up: 8 comment:7 by , 6 years ago
| Summary: | A 404 error with “id-” in slug on multilingual website with Indonesian language. → i18n URLs are not matched against the fallback language. |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
I'm going to accept this. I think there is an issue. I don't see that we can do much about slugs that match the language code regex, here id-... but the 404 isn't optimal...
If id-button correctly falls back to id as the langauge code, but then tries to match the URL against id/ — which it doesn't match.
But either we should use the submitted URL as the prefix, or redirect to the fallback URL.
The id-button example seems wrong, but it occurs with en-us. That would fallback to en, except it 404s.
More details and reproduce on the forum thread here:
https://forum.djangoproject.com/t/i-get-a-404-error-if-slug-begins-with-id/2272/7
Clean project, enable LocaleMiddleware:
from django.conf.urls.i18n import i18n_patterns
from django.urls import path
from django.http import HttpResponse
def hello(request):
return HttpResponse("hello")
urlpatterns = i18n_patterns(
path("", hello),
prefix_default_language=True,
)
/en/ 200.
/en-gb/ 200
/en-us/ 404
Using the URLconf defined in ticket_31540.urls, Django tried these URL patterns, in this order:
en/
The current path, en-us/, didn't match any of these.
So this is because en-us isn’t a configured language but when determining the language we fell-back to en correctly. Then we didn’t resolve the URL using the same, or redirect to the fallback language URL.
It seems like that’s something we should do, or… ? It seems suboptimal.
(Very happy if someone can correct me as to why not...🙂)
comment:8 by , 6 years ago
Replying to Carlton Gibson:
If
id-buttoncorrectly falls back toidas the langauge code, but then tries to match the URL againstid/— which it doesn't match.
Are you sure, that a fallback from id-button to id as the language code is a correct behaviour when we have set prefix_default_language=False ?
I think, it may be a some kind of correct behaviour in case we set prefix_default_language=True, but when we hide default language, we get a big problem - we need to check that we don't have items in DB with slug that begins with any of our "language code" + "-" +"any word".
For me it looks like the principle of encapsulation is broken.
For example: When website editor adds content to English version of a website he don't need to have a limitations, to set a slug id-button or in-love if the website doesn't have a language id-button or in-love even if it has "id" and "in" language.
follow-up: 10 comment:9 by , 6 years ago
The way I see it, there are two different concerns that need attention:
- Make it so that when
id-gibberish/is used in the path, that the knowledge aboutid-gibberishis passed fromLocaleMiddlewaretoLocalePrefixPattern. I think this is at least a bug, and I was also able to reproduce this locally. - Make it configurable whether or not
LocaleMiddlewareshould be lenient in parsing the language fromid-gibberishto "looks enough likeidto me". If we'd change this "hard" from lenient to "must match strictly" this might break current applications. See theen-usvsen-gbexample.
The prefix_default_language does not actually seem to influence the behaviour. Both an-example (Aragonese) and as-always (Assemese) would be affected.
comment:10 by , 6 years ago
Replying to Sjoerd Job Postmus:
- Make it configurable whether or not
LocaleMiddlewareshould be lenient in parsing the language fromid-gibberishto "looks enough likeidto me". If we'd change this "hard" from lenient to "must match strictly" this might break current applications. See theen-usvsen-gbexample.
I see the solution in implementing something like a standardised dictionary https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_territory_information.html where language codes and territories are predefined, but anyone can add custom languages and territories to their apps via settings.py.
I think it won't affect the majority of applications, and the affected ones can add their custom languages in settings. Or for a better backward compatibility a Boolean variable can be added to settings.py that sets lenient/strictl match.
Thanks for this ticket, however I cannot reproduce this issue. IMO it's not an issue in Django, you can try to ask on one of support channels.