Как мне вручную попросить Django перевести строку (я знаю, что есть перевод)? - PullRequest
0 голосов
/ 06 августа 2020

Я только что выполнил переводы для своего проекта по изучению кода, и он отлично работает! Я также использую 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 сказать: «Эй, я, наверное, должен это перевести».

Есть мысли?

...