跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Django国际化最佳实践
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Django国际化最佳实践 = '''Django国际化(i18n)'''是指将Django项目适配为支持多语言的过程,使应用程序能够根据用户的语言偏好显示不同的文本内容。国际化是构建全球化Web应用的关键步骤,涉及翻译文本、处理日期/时间格式、数字格式等。本文将详细介绍Django国际化的核心概念、实现步骤及最佳实践。 == 核心概念 == Django国际化基于以下核心组件: * '''翻译字符串''':标记需要翻译的文本。 * '''语言文件'''(.po/.mo):存储翻译内容。 * '''中间件''':根据用户请求确定语言偏好。 * '''模板标签''':在模板中处理多语言内容。 国际化流程通常分为以下步骤: # 标记需要翻译的字符串 # 生成翻译文件 # 翻译文本 # 编译翻译文件 # 配置语言设置 == 实现步骤 == === 1. 配置settings.py === 首先在<code>settings.py</code>中启用国际化支持: <syntaxhighlight lang="python"> # settings.py 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> === 2. 标记翻译字符串 === 在Python代码中使用<code>gettext</code>函数标记需要翻译的字符串: <syntaxhighlight lang="python"> from django.utils.translation import gettext as _ def welcome_view(request): message = _("Welcome to our website!") return HttpResponse(message) </syntaxhighlight> 在模板中使用<code>{% trans %}</code>标签: <syntaxhighlight lang="django"> {% load i18n %} <h1>{% trans "Welcome to our website!" %}</h1> </syntaxhighlight> === 3. 创建翻译文件 === 运行以下命令生成翻译文件: <syntaxhighlight lang="bash"> # 创建或更新翻译文件 django-admin makemessages -l es # 为西班牙语创建翻译 django-admin makemessages -l zh_Hans # 为简体中文创建翻译 </syntaxhighlight> 这会在<code>locale</code>目录下生成<code>.po</code>文件,结构如下: <mermaid> graph TD locale/ ├── es/ │ └── LC_MESSAGES/ │ ├── django.po │ └── django.mo └── zh_Hans/ └── LC_MESSAGES/ ├── django.po └── django.mo </mermaid> === 4. 编辑翻译文件 === 打开生成的<code>.po</code>文件并添加翻译: <syntaxhighlight lang="po"> #: templates/base.html:10 msgid "Welcome to our website!" msgstr "¡Bienvenido a nuestro sitio web!" # 西班牙语翻译 </syntaxhighlight> === 5. 编译翻译文件 === 完成翻译后,编译为二进制格式: <syntaxhighlight lang="bash"> django-admin compilemessages </syntaxhighlight> == 高级实践 == === 复数形式处理 === 使用<code>ngettext</code>处理复数形式: <syntaxhighlight lang="python"> from django.utils.translation import ngettext def product_count(request, count): return HttpResponse(ngettext( "There is %(count)d product available.", "There are %(count)d products available.", count ) % {'count': count}) </syntaxhighlight> === 惰性翻译 === 在模型和表单中使用惰性翻译避免过早翻译: <syntaxhighlight lang="python"> from django.utils.translation import gettext_lazy as _ class Product(models.Model): name = models.CharField(_("product name"), max_length=100) </syntaxhighlight> === 语言切换 === 实现语言切换视图: <syntaxhighlight lang="python"> from django.views.generic import View from django.http import HttpResponseRedirect from django.utils.translation import activate class ChangeLanguageView(View): def get(self, request, language_code): activate(language_code) request.session[settings.LANGUAGE_SESSION_KEY] = language_code return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) </syntaxhighlight> == 最佳实践总结 == 1. '''尽早规划国际化''':在项目初期就考虑国际化需求 2. '''完整标记字符串''':确保所有用户可见文本都被标记 3. '''保持上下文''':为翻译者提供足够的上下文信息 4. '''测试所有语言''':验证所有语言版本的布局和功能 5. '''处理动态内容''':为数据库存储的内容设计翻译策略 6. '''考虑RTL语言''':为从右到左的语言(如阿拉伯语)设计布局 == 性能优化 == * 使用<code>cached_property</code>缓存翻译结果 * 避免在循环中进行翻译 * 对频繁访问的翻译使用内存缓存 <math> \text{性能增益} = \frac{\text{原始执行时间} - \text{优化后执行时间}}{\text{原始执行时间}} \times 100\% </math> == 常见问题 == '''Q: 如何测试特定语言版本?''' A: 可以通过修改浏览器语言设置或使用Django的测试客户端: <syntaxhighlight lang="python"> from django.test import Client c = Client(HTTP_ACCEPT_LANGUAGE='es') </syntaxhighlight> '''Q: 如何处理未翻译的字符串?''' A: 未翻译的字符串会显示为原始语言(通常是英语)。可以在设置中配置: <syntaxhighlight lang="python"> # settings.py FALLBACK_LANGUAGES = ('en',) # 设置回退语言 </syntaxhighlight> == 实际案例 == '''电商网站多语言支持''' 1. 产品名称和描述存储在翻译表中 2. 根据用户IP或浏览器设置自动检测语言 3. 提供显式的语言选择器 4. 购物车和结账流程完全本地化 通过遵循这些最佳实践,您可以构建真正全球化的Django应用程序,为不同地区的用户提供本地化的体验。 [[Category:后端框架]] [[Category:Django]] [[Category:Django最佳实践]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)