Я только что выполнил переводы для своего проекта по изучению кода, и он отлично работает! Я также использую django -modeltranslation для моделей, и там тоже нет проблем.
В качестве последнего штриха я хотел создать представление, которое меняет язык. Он должен принимать единственный аргумент ключевого слова - language_code желаемого языка, например, «en-us», «de», «nb» и т. Д., А также должен принимать параметр GET следующим, на который я затем перенаправляю пользователя после языковые настройки обновлены. Например:
http://127.0.0.1:8000/en-us/change-language/nb/?next=/en-us/dashboard/
В этом примере url / en-us / - это текущий язык, / change-language / - это местоположение изменения языка. -view (так сказать), / nb / - это желаемый язык, а ? next = / en-us / dashboard / - текущий URL-адрес на текущем языке (и, следовательно, где пользователи будут перенаправлены после изменения их языка и после того, как URL-адрес будет переведен на новый язык, например, "/ nb / kontrollpanel /" )
Я сделал перевод URL работать с разрешением и реверсом, как показано ниже:
def change_language_view(request, **kwargs):
#get and validate the language user is trying to change to
language_code = kwargs.get('language_code', None)
try:
assert [lang[0] for lang in settings.LANGUAGES if lang[0] == language_code], _("%(selected_languages)s not in %(settings_languages)s"%{language_code, settings.LANGUAGES})
except (AssertionError, TypeError) as err:
raise Http404(_("Couldn't find that language: "))
#get the next path, if any
#create fallback values
next_view = 'index'
next_args = None
next_kwargs = None
#try to get and resolve from urls next-argument
next_path = request.GET.get('next', None)
try:
if next_path is not None:
next_view, next_args, next_kwargs = resolve(next_path)
except Exception as err:
pass
#activate translation for the intended language
translation.activate(language_code)
#make a new next_url, now that we are in the new language
next_url = reverse(next_view, args=next_args, kwargs=next_kwargs)
#make response, attach cookie, and return it
response = HttpResponseRedirect(next_url)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language_code)
return response
Он прекрасно работает, за исключением одного URL:
path(_('product-details/<uidb64>/<product_name>/'), ...
Этот URL принимает два аргумента, первый (uidb64) не вызывает проблем c, поскольку оно не переведено, второе (product_name) - это название продукта, которое, к сожалению, не переводится при создании нового URL. Я понимаю, почему это так, потому что для Django это просто случайная строка, полученная из базы данных. Что мне нужно сделать с sh, так это добавить что-то вроде:
if 'product_name' in next_kwargs:
force_django_to_translate(next_kwargs['product_name']) #I know that product_name is translated if Django would just look
Итак, чтобы быть очень понятным, я хочу, чтобы URL-адрес:
/en-us/product-details/Mq/my-awesome-product/
стал:
/nb/produktdetaljer/Mq/mitt-fantastiske-produkt/
но сейчас это становится:
/nb/produktdetaljer/Mq/my-awesome-product/
И перевод уже на месте, мне просто нужно Django сказать: «Эй, я, наверное, должен это перевести».
Есть мысли?