跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Django本地化
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Django本地化 = '''Django本地化'''(Localization,简称L10n)是指将Django应用程序适配到不同语言和地区的过程,包括翻译文本、格式化日期、时间和数字等。Django提供了强大的国际化(i18n)和本地化工具,使开发者能够轻松创建多语言网站。 == 概述 == 本地化不仅涉及语言的翻译,还包括以下方面: * '''文本翻译''':将界面中的字符串转换为目标语言。 * '''日期和时间格式化''':根据地区显示不同的日期格式(如`YYYY-MM-DD`或`DD/MM/YYYY`)。 * '''数字和货币格式化''':例如小数分隔符(`.`或`,`)和货币符号。 * '''时区处理''':根据用户所在时区显示时间。 Django使用GNU gettext工具链管理翻译文件,并通过内置的模板标签和过滤器实现本地化渲染。 == 配置Django本地化 == 在`settings.py`中启用本地化相关设置: <syntaxhighlight lang="python"> # 启用国际化与本地化 USE_I18N = True USE_L10N = True # 支持的语言列表 LANGUAGES = [ ('en', 'English'), ('es', 'Spanish'), ('zh-hans', 'Simplified Chinese'), ] # 默认语言 LANGUAGE_CODE = 'en' # 指定本地化文件存放路径 LOCALE_PATHS = [ os.path.join(BASE_DIR, 'locale'), ] </syntaxhighlight> === 中间件配置 === 通过中间件根据用户请求自动选择语言: <syntaxhighlight lang="python"> MIDDLEWARE = [ ... 'django.middleware.locale.LocaleMiddleware', ... ] </syntaxhighlight> == 翻译流程 == Django的翻译流程分为三步: === 1. 标记可翻译字符串 === 在Python代码中使用`gettext`或`_`别名标记需翻译的字符串: <syntaxhighlight lang="python"> from django.utils.translation import gettext as _ def my_view(request): output = _("Welcome to our site!") return HttpResponse(output) </syntaxhighlight> 在模板中使用`{% trans %}`标签: <syntaxhighlight lang="django"> {% load i18n %} <h1>{% trans "Hello, world!" %}</h1> </syntaxhighlight> === 2. 生成翻译文件 === 运行以下命令生成`.po`文件: <syntaxhighlight lang="bash"> django-admin makemessages -l es # 为西班牙语创建翻译文件 </syntaxhighlight> 生成的`.po`文件示例: <syntaxhighlight lang="po"> msgid "Welcome to our site!" msgstr "¡Bienvenido a nuestro sitio!" </syntaxhighlight> === 3. 编译翻译文件 === 将`.po`文件编译为机器可读的`.mo`文件: <syntaxhighlight lang="bash"> django-admin compilemessages </syntaxhighlight> == 本地化格式化 == Django自动根据用户语言环境格式化日期、数字等。例如在模板中: <syntaxhighlight lang="django"> {{ value|date }} {# 输出根据语言环境格式化的日期 #} {{ value|floatformat }} {# 本地化数字格式 #} </syntaxhighlight> === 时区处理 === 启用时区支持(`settings.py`): <syntaxhighlight lang="python"> USE_TZ = True TIME_ZONE = 'UTC' # 默认时区 </syntaxhighlight> 在模板中转换时区: <syntaxhighlight lang="django"> {% load tz %} {% timezone "Europe/Paris" %} {{ value }} {# 显示巴黎时间 #} {% endtimezone %} </syntaxhighlight> == 实际案例 == 假设我们需要为一个电商网站实现英语和西班牙语切换: 1. 在视图中提供语言选择: <syntaxhighlight lang="python"> from django.http import HttpResponseRedirect from django.utils.translation import activate def set_language(request, language): activate(language) request.session[settings.LANGUAGE_SESSION_KEY] = language return HttpResponseRedirect(request.META.get('HTTP_REFERER')) </syntaxhighlight> 2. 在模板中添加语言切换器: <syntaxhighlight lang="django"> <form action="{% url 'set_language' %}" method="post"> {% csrf_token %} <select name="language"> {% get_current_language as LANGUAGE_CODE %} {% get_available_languages as LANGUAGES %} {% for code, name in LANGUAGES %} <option value="{{ code }}" {% if code == LANGUAGE_CODE %}selected{% endif %}> {{ name }} </option> {% endfor %} </select> <input type="submit" value="Go"> </form> </syntaxhighlight> == 高级主题 == === 复数形式处理 === 使用`ngettext`处理不同数量的文本: <syntaxhighlight lang="python"> from django.utils.translation import ngettext count = 5 message = ngettext( 'There is %(count)d product.', 'There are %(count)d products.', count ) % {'count': count} </syntaxhighlight> 对应的`.po`文件条目: <syntaxhighlight lang="po"> msgid "There is %(count)d product." msgid_plural "There are %(count)d products." msgstr[0] "Hay %(count)d producto." msgstr[1] "Hay %(count)d productos." </syntaxhighlight> === 本地化URL === 使用`i18n_patterns`为不同语言创建URL前缀: <syntaxhighlight lang="python"> from django.conf.urls.i18n import i18n_patterns urlpatterns = i18n_patterns( path('about/', views.about), # 将生成/en/about/, /es/about/等 ) </syntaxhighlight> == 最佳实践 == 1. 始终使用Django提供的本地化工具,而非硬编码格式 2. 为翻译字符串提供上下文注释(在`.po`文件中使用`#.`注释) 3. 测试所有支持语言的界面布局(某些语言文本可能更长) 4. 定期更新翻译文件,与代码变更保持同步 == 常见问题 == '''Q: 为什么我的翻译没有生效?''' A: 检查以下事项: * 是否运行了`compilemessages` * `LOCALE_PATHS`设置是否正确 * 浏览器是否发送了正确的`Accept-Language`头 '''Q: 如何强制使用特定语言?''' A: 在视图中调用`django.utils.translation.activate(language_code)` == 总结 == Django的本地化系统提供了完整的工具链,使多语言网站开发变得简单高效。通过合理配置和遵循最佳实践,开发者可以轻松创建适应全球用户的应用程序。 [[Category:后端框架]] [[Category:Django]] [[Category:Django模板系统]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)