我不知道如何把这个问题作为标题。但我的问题是我的django项目模板文件夹中的每个视图都有2个模板。一个用于英语的模板和另一个用于西班牙语的模板。我的模板结构是
#include <variant>
#include <string>
int main()
{
std::variant<int, float> v, w;
v = 12; // v contains int
int i = std::get<int>(v);
w = std::get<int>(v);
w = std::get<0>(v); // same effect as the previous line
w = v; // same effect as the previous line
try {
std::get<float>(w); // w contains int, not float: will throw
}
catch (std::bad_variant_access&) {}
std::variant<std::string> v("abc"); // converting constructors work when unambiguous
v = "def"; // converting assignment also works when unambiguous
}
我需要根据用户选择的语言来渲染模板。我现在完全用英语运行该项目。首先,我只将模板转换为西班牙语并准备渲染。对不起,这是一个模糊的问题,但是这方面的一些指示会有所帮助。
我的主要网址是
Project
|
app
|
templates
|
app
|
home_en.html
home_es.html
about_en.html
about_es.html
我的app urlpatterns
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^en/', include('app.urls')),
url(r'^es/', include('app.urls')),
]
我还尝试使用/ en /或/ es /检查请求网址,然后在每个视图中根据它进行渲染。
urlpatterns = [
url(r'^about$', views.about, name='about'),
url(r'.*', views.home, name='home'), ]
当我明确地将url请求指定为/ en /或/ es /时,这可以正常工作。我如何根据用户选择的语言在网址上设置它?
如果我明确向http://127.0.0.1/es/about发出请求,我的页面会以西班牙语显示,但当我从那里切换到家时,它会返回英文主页。即使我更改了网址,我希望网址保持为/ es /作为开头。现在它变为英语,因为它是模式的上层
答案 0 :(得分:1)
请阅读Django翻译文档。在这里:https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#module-django.conf.urls.i18n 请参阅部分:网址格式中的语言前缀 在你的urls.py中:
from django.conf.urls.i18n import i18n_patterns
urlpatterns += i18n_patterns (
url(r'^about$', views.about, name='about'),
url(r'.*', views.home, name='home'),
)
这将自动为您的网址添加语言代码。 在views.py中,您可以获取语言代码fomr request.LANGUAGE_CODE,如下所示: from request.LANGUAGE_CODE ==&#39; en&#39;
选择放入html模板的语言:
{% load i18n %}
<form action="{% url 'set_language' %}" method="POST">{% csrf_token %}
<select name="language" id="language">
<option value="en">en</option>
<option value="ru">ru</option>
<option value="az">az</option>
</select>
<button type="submit">send</button>
</form>
或
{% load i18n %}
<form action="{% url 'set_language' %}" method="post">{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local }} ({{ language.code }})
</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>
答案 1 :(得分:1)
一个非常简单的解决方案是使用带有命名组的单个模式:
url(r'^(?P<language>en|es)/', include('app.urls'))
您的观点必须接受language
参数:
def home(request, language):
# language is either "es" or "en".
return render(request, 'app/home_{}.html'.format(language), {'title': 'HOME'})
您也可以考虑Django's localization并避免重复视图。