每天40分玩转Django:Django国际化

打印 上一主题 下一主题

主题 819|帖子 819|积分 2457

Django国际化

一、今日学习内容概述

学习模块紧张水平主要内容国际化基础⭐⭐⭐⭐⭐根本概念、设置设置字符串翻译⭐⭐⭐⭐⭐翻译标志、消息文件模板国际化⭐⭐⭐⭐模板标签、过滤器动态内容翻译⭐⭐⭐⭐模型字段、表单翻译 二、国际化基础设置

  1. # settings.py
  2. # 启用国际化
  3. USE_I18N = True
  4. # 启用本地化
  5. USE_L10N = True
  6. # 启用时区
  7. USE_TZ = True
  8. # 支持的语言
  9. LANGUAGES = [
  10.     ('en', 'English'),
  11.     ('zh-hans', '简体中文'),
  12.     ('ja', '日本語'),
  13. ]
  14. # 默认语言
  15. LANGUAGE_CODE = 'en'
  16. # 翻译文件路径
  17. LOCALE_PATHS = [
  18.     BASE_DIR / 'locale',
  19. ]
  20. # 中间件配置
  21. MIDDLEWARE = [
  22.     # ...
  23.     'django.middleware.locale.LocaleMiddleware',
  24.     # ...
  25. ]
复制代码
三、代码中的字符串翻译

  1. # models.py
  2. from django.db import models
  3. from django.utils.translation import gettext_lazy as _
  4. class Article(models.Model):
  5.     STATUS_CHOICES = [
  6.         ('draft', _('草稿')),
  7.         ('published', _('已发布')),
  8.     ]
  9.    
  10.     title = models.CharField(_('标题'), max_length=200)
  11.     content = models.TextField(_('内容'))
  12.     status = models.CharField(
  13.         _('状态'),
  14.         max_length=10,
  15.         choices=STATUS_CHOICES,
  16.         default='draft'
  17.     )
  18.     created_at = models.DateTimeField(_('创建时间'), auto_now_add=True)
  19.    
  20.     class Meta:
  21.         verbose_name = _('文章')
  22.         verbose_name_plural = _('文章')
  23. # views.py
  24. from django.utils.translation import gettext as _
  25. from django.contrib import messages
  26. def article_create(request):
  27.     if request.method == 'POST':
  28.         form = ArticleForm(request.POST)
  29.         if form.is_valid():
  30.             article = form.save()
  31.             messages.success(request, _('文章创建成功!'))
  32.             return redirect('article_detail', pk=article.pk)
  33.     else:
  34.         form = ArticleForm()
  35.    
  36.     return render(request, 'articles/create.html', {
  37.         'title': _('创建新文章'),
  38.         'form': form
  39.     })
复制代码
四、模板国际化

  1. <!-- templates/base.html -->
  2. {% load i18n %}
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6.     <title>{% trans "我的网站" %}</title>
  7. </head>
  8. <body>
  9.     <header>
  10.         <h1>{% trans "欢迎访问" %}</h1>
  11.         <div class="language-selector">
  12.             <form action="{% url 'set_language' %}" method="post">
  13.                 {% csrf_token %}
  14.                 <input name="next" type="hidden" value="{{ request.path }}">
  15.                 <select name="language" onchange="this.form.submit()">
  16.                     {% get_current_language as CURRENT_LANGUAGE %}
  17.                     {% get_available_languages as LANGUAGES %}
  18.                     {% for code, name in LANGUAGES %}
  19.                         <option value="{{ code }}"
  20.                                 {% if code == CURRENT_LANGUAGE %}selected{% endif %}>
  21.                             {{ name }}
  22.                         </option>
  23.                     {% endfor %}
  24.                 </select>
  25.             </form>
  26.         </div>
  27.     </header>
  28.    
  29.     <nav>
  30.         <ul>
  31.             <li><a href="{% url 'home' %}">{% trans "首页" %}</a></li>
  32.             <li><a href="{% url 'about' %}">{% trans "关于" %}</a></li>
  33.             <li><a href="{% url 'contact' %}">{% trans "联系我们" %}</a></li>
  34.         </ul>
  35.     </nav>
  36.    
  37.     <main>
  38.         {% block content %}{% endblock %}
  39.     </main>
  40.    
  41.     <footer>
  42.         {% blocktrans %}
  43.             版权所有 © {{ year }} 我的网站
  44.         {% endblocktrans %}
  45.     </footer>
  46. </body>
  47. </html>
复制代码
五、国际化流程图


六、消息文件管理

6.1 创建和编译消息文件

  1. # 创建/更新消息文件
  2. python manage.py makemessages -l zh_hans
  3. python manage.py makemessages -l ja
  4. # 编译消息文件
  5. python manage.py compilemessages
复制代码
6.2 消息文件示例

  1. # locale/zh_hans/LC_MESSAGES/django.po
  2. msgid ""
  3. msgstr ""
  4. "Project-Id-Version: PACKAGE VERSION\n"
  5. "Report-Msgid-Bugs-To: \n"
  6. "POT-Creation-Date: 2024-01-19 10:00+0000\n"
  7. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  8. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  9. "Language-Team: LANGUAGE <LL@li.org>\n"
  10. "Language: \n"
  11. "MIME-Version: 1.0\n"
  12. "Content-Type: text/plain; charset=UTF-8\n"
  13. "Content-Transfer-Encoding: 8bit\n"
  14. #: models.py:8
  15. msgid "标题"
  16. msgstr "Title"
  17. #: models.py:9
  18. msgid "内容"
  19. msgstr "Content"
  20. #: templates/base.html:4
  21. msgid "我的网站"
  22. msgstr "My Website"
复制代码
七、动态内容翻译

7.1 模型翻译

  1. # models.py
  2. from django.db import models
  3. from django.utils.translation import gettext_lazy as _
  4. class TranslatableModel(models.Model):
  5.     """可翻译内容的基类"""
  6.     class Meta:
  7.         abstract = True
  8. class ArticleTranslation(models.Model):
  9.     article = models.ForeignKey('Article', on_delete=models.CASCADE)
  10.     language = models.CharField(max_length=10, choices=settings.LANGUAGES)
  11.     title = models.CharField(max_length=200)
  12.     content = models.TextField()
  13.    
  14.     class Meta:
  15.         unique_together = ('article', 'language')
  16. class Article(TranslatableModel):
  17.     # 基本字段保持原样
  18.     created_at = models.DateTimeField(auto_now_add=True)
  19.    
  20.     def get_translation(self, language=None):
  21.         """获取指定语言的翻译"""
  22.         if language is None:
  23.             language = get_language()
  24.         
  25.         try:
  26.             return self.articletranslation_set.get(language=language)
  27.         except ArticleTranslation.DoesNotExist:
  28.             # 如果没有找到翻译,返回默认语言
  29.             return self.articletranslation_set.get(
  30.                 language=settings.LANGUAGE_CODE
  31.             )
复制代码
7.2 表单翻译

  1. # forms.py
  2. from django import forms
  3. from django.utils.translation import gettext_lazy as _
  4. class ContactForm(forms.Form):
  5.     name = forms.CharField(
  6.         label=_('姓名'),
  7.         max_length=100,
  8.         error_messages={
  9.             'required': _('请输入您的姓名'),
  10.             'max_length': _('姓名长度不能超过100个字符'),
  11.         }
  12.     )
  13.     email = forms.EmailField(
  14.         label=_('电子邮箱'),
  15.         error_messages={
  16.             'required': _('请输入您的电子邮箱'),
  17.             'invalid': _('请输入有效的电子邮箱地址'),
  18.         }
  19.     )
  20.     message = forms.CharField(
  21.         label=_('留言内容'),
  22.         widget=forms.Textarea,
  23.         error_messages={
  24.             'required': _('请输入留言内容'),
  25.         }
  26.     )
复制代码
八、URL国际化

  1. # urls.py
  2. from django.conf.urls.i18n import i18n_patterns
  3. from django.urls import path, include
  4. urlpatterns = [
  5.     path('i18n/', include('django.conf.urls.i18n')),
  6. ]
  7. urlpatterns += i18n_patterns(
  8.     path('admin/', admin.site.urls),
  9.     path('', include('myapp.urls')),
  10. )
复制代码
九、JavaScript国际化

  1. // static/js/i18n.js
  2. const gettext = function(msgid) {
  3.     return window.TRANSLATIONS[msgid] || msgid;
  4. };
  5. const interpolate = function(fmt, obj) {
  6.     return fmt.replace(/%\(\w+\)s/g, function(match) {
  7.         return String(obj[match.slice(2,-2)]);
  8.     });
  9. };
  10. // 使用示例
  11. const message = gettext('欢迎访问,%(name)s!');
  12. const welcomeMessage = interpolate(message, {name: 'John'});
复制代码
十、日期和数字格式化

  1. # views.py
  2. from django.utils.formats import date_format, number_format
  3. from django.utils import translation
  4. def format_example(request):
  5.     current_language = translation.get_language()
  6.    
  7.     # 格式化日期
  8.     today = date.today()
  9.     formatted_date = date_format(today, format='DATETIME_FORMAT')
  10.    
  11.     # 格式化数字
  12.     number = 1234567.89
  13.     formatted_number = number_format(
  14.         number,
  15.         decimal_pos=2,
  16.         use_l10n=True
  17.     )
  18.    
  19.     return render(request, 'format_example.html', {
  20.         'formatted_date': formatted_date,
  21.         'formatted_number': formatted_number,
  22.     })
复制代码
通过本章学习,你应该可以或许:

  • 设置Django国际化
  • 实现字符串翻译
  • 处理动态内容翻译
  • 使用本地化格式

怎么样今天的内容还满意吗?再次感谢朋友们的观看,关注GZH:凡人的AI工具箱,复兴666,送您代价199的AI大礼包。末了,祝您早日实现财务自由,还请给个赞,谢谢!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表