【问题标题】:How to get localized day-names in django?如何在 django 中获取本地化的日期名称?
【发布时间】:2016-10-28 01:02:06
【问题描述】:

当使用 djangos(或更好的 gettext's)本地化机制时,很难获得当前语言环境的日期名称。通常,我会使用calendar:

calendar.day_name[current_day]

current_day 是介于 0 和 6 之间的整数。这不起作用,因为 Django 似乎没有正确设置请求的语言环境。月份名称的情况相同。

那么,如何正确本地化日历名称?

【问题讨论】:

    标签: python django localization calendar internationalization


    【解决方案1】:

    您可以使用django.utils.formats.date_format

    >>> from django.utils.formats import date_format
    >>> from django.utils import translation
    >>> from datetime import date
    >>> date_format(date.today(), 'l')
    'Saturday'
    >>> translation.activate('fr')
    >>> date_format(date.today(), 'l')
    'samedi'
    

    translation.activate 在已经激活翻译的请求上下文中是无用的。我在这里使用它作为示例。

    如果您没有具体的日期并且需要一周中某一天的名称,只需使用 gettext 进行翻译即可:

    >>> import calendar
    >>> from django.utils import translation
    >>> from django.utils.translation import gettext as _
    >>> translation.activate('fr')
    >>> _(calendar.day_name[0])
    'lundi'
    

    注意_(day_name)之所以起作用,虽然“day_name”是一个变量,但因为day names are already translated by Django,因此不需要被gettext发现。

    【讨论】:

    • 警告:如果您在 gettext 的其他地方没有明确显示日期名称,则不会通过运行 manage.py makemessages 命令收集它,这将导致产生未翻译的字符串。
    • @KryštofŘeháček 错了。您不需要在您自己的代码中的其他地方定义日期名称,因为它已经由 Django 定义:utils/dates.pyconf/locale/fr/LC_MESSAGES/django.po
    • 好吧,你是对的。但我仍然想鼓励人们避免这种模式,因为它是建立在 Django 定义它并且它不是通用的假设之上的。
    【解决方案2】:

    您可以使用calendar 中的different_locale 来返回本地化的日期名称:

    from calendar import day_name, different_locale
    
    def get_localized_day_name(day, locale):
        with different_locale(locale):
            return day_name[day]
    

    locale 是一个包含您所需语言环境的字符串,例如request.LANGUAGE_CODE.

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 2015-11-10
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      相关资源
      最近更新 更多