Python 如何翻译Django日历中的星期和月份的名称

Python 如何翻译Django日历中的星期和月份的名称,python,django,Python,Django,我想问一下,在Django呈现的日历中,如何将一周和一个月的日期名称从原始英语更改为例如波兰语 我试图找到一个解决方案,在设置中更改语言,但没有任何效果 我还尝试使用LocalHTMLCalendar,但没有成功 这是我的utlis.py文件 class Calendar(LocaleHTMLCalendar): def __init__(self, year=None, month=None): self.year = year translation.

我想问一下,在Django呈现的日历中,如何将一周和一个月的日期名称从原始英语更改为例如波兰语

我试图找到一个解决方案,在设置中更改语言,但没有任何效果 我还尝试使用LocalHTMLCalendar,但没有成功

这是我的utlis.py文件

class Calendar(LocaleHTMLCalendar):
    def __init__(self, year=None, month=None):
        self.year = year
        translation.activate('pl')
        self.month = month
        super(Calendar, self).__init__()

    # formats a day as a td
    # filter events by day
    def formatday(self, day, events):
        events_per_day = events.filter(start_time__day=day)
        d = ''
        for event in events_per_day:
            d += f'<li> {event.get_html_url} </li>'

        if day != 0:
            return f"<td><span class='date'>{day}</span><ul> {d} </ul></td>"
        return '<td></td>'

    # formats a week as a tr
    def formatweek(self, theweek, events):
        week = ''
        for d, weekday in theweek:
            week += self.formatday(d, events)
            print()
        return f'<tr> {week} </tr>'

    # formats a month as a table
    # filter events by year and month
    def formatmonth(self, withyear=True):
        events = Event.objects.filter(start_time__year=self.year, start_time__month=self.month)

        cal = f'<table border="0" cellpadding="0" cellspacing="0" class="calendar">\n'
        cal += f'{self.formatmonthname(self.year, self.month, withyear=withyear)}\n'
        cal += f'{self.formatweekheader()}\n'
        for week in self.monthdays2calendar(self.year, self.month):
            cal += f'{self.formatweek(week, events)}\n'
        return cal


如果您能提供任何提示,我将不胜感激。也许您可以采用下面的工作示例,并根据您的实际情况调整原则。注意翻译所需的每个字符串前面的u

然而,即使以我的例子来说,这也涉及到一些进一步的工作:

  • 如果对.py代码满意,则必须为其生成.po文件(即目标语言的可编辑翻译文件);这可以通过使用gettext工具中的gettext(注意:在我的本地系统上,我为这个示例文件指定的名称是“test_i18n.py”;这个名称(但没有扩展名)也在
    language=gettext.translation('test_l10n',locale_path,[current_locale]中显式指定
    下面我的代码中的第行;此行中指定的名称必须与在此本地化过程中进一步生成的实际.py程序文件.mo编译语言文件的名称匹配(下面的第四个项目符号)
  • 必须将
    “Language:xx\n”
    行插入.po文件的头块中(例如,在
    “Language Team:etc.”
    行之后),其中xx是目标语言ID(在您的情况下是pl)
  • 例如,使用或翻译.po条目
  • 当您对翻译感到满意时,您必须从.po文件生成.mo文件(即编译的翻译文件);Poedit将自动生成此文件,但也可以使用gettext工具中的msgfmt使用
    msgfmt yourfile.po-o yourfile.mo生成此文件
  • 将生成的.mo文件放置(复制或移动)到与代码相关的区域设置路径中;例如,在与.py程序相同的位置上,必须存在(或生成)一个
    /locale/xx/LC_MESSAGES/
    路径,其中必须包含.mo文件(注意:'xx'是目标语言ID,.mo文件名必须与
    language=gettext.translation('test\u l10n',locale\u path,[current\u locale]
    line)中明确指定的主.py程序文件名相匹配)
  • 运行该程序,它将显示从现在开始的本地化名称
稍后编辑:事实上,
/locale/xx/LC\u MESSAGES/
路径中.mo文件的名称必须与
language=gettext.translation('test\u l10n',locale\u path,[current\u locale]
下面代码中的第行,这两个选项都可以独立于.py文件本身的名称进行选择。如果我之前造成了混淆,请原谅

这是我的示例文件test\u l10n.py:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import datetime
import locale
import gettext

##

class l10nTest(object):
    def __init__(self, *args):
        pass

    def Main(self):
        self.get_datetime = datetime.datetime.today()
        self.weekday_now = self.get_datetime.weekday()
        self.temp = self.weekday_now + 1
        self.dayl = self.DayOfWeekLiteral(str(self.temp))

        print (_("Today is %s") % self.dayl)

    def DayOfWeekLiteral(self, dday):
        self.dday = dday
        if int(self.dday) == 1:
            self.dayl = _("Monday")
        if int(self.dday) == 2:
            self.dayl = _("Tuesday")
        if int(self.dday) == 3:
            self.dayl = _("Wednesday")
        if int(self.dday) == 4:
            self.dayl = _("Thursday")
        if int(self.dday) == 5:
            self.dayl = _("Friday")
        if int(self.dday) == 6:
            self.dayl = _("Saturday")
        if int(self.dday) == 7:
            self.dayl = _("Sunday")
        return self.dayl

##

if __name__ == "__main__":

    current_locale, encoding = locale.getdefaultlocale()
    # or it can be forced explicitly by uncomment the line below
#    current_locale = "pl"
    locale_path = './locale/'
    language = gettext.translation('test_l10n', locale_path, [current_locale])
    language.install()

    app = l10nTest(0)
    app.Main()
这是我的test_l10n.po文件(在我的例子中,是罗马尼亚文):

(当时我添加了这个稍后的编辑,就当地时间而言,这已经是第二天了)

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import datetime
import locale
import gettext

##

class l10nTest(object):
    def __init__(self, *args):
        pass

    def Main(self):
        self.get_datetime = datetime.datetime.today()
        self.weekday_now = self.get_datetime.weekday()
        self.temp = self.weekday_now + 1
        self.dayl = self.DayOfWeekLiteral(str(self.temp))

        print (_("Today is %s") % self.dayl)

    def DayOfWeekLiteral(self, dday):
        self.dday = dday
        if int(self.dday) == 1:
            self.dayl = _("Monday")
        if int(self.dday) == 2:
            self.dayl = _("Tuesday")
        if int(self.dday) == 3:
            self.dayl = _("Wednesday")
        if int(self.dday) == 4:
            self.dayl = _("Thursday")
        if int(self.dday) == 5:
            self.dayl = _("Friday")
        if int(self.dday) == 6:
            self.dayl = _("Saturday")
        if int(self.dday) == 7:
            self.dayl = _("Sunday")
        return self.dayl

##

if __name__ == "__main__":

    current_locale, encoding = locale.getdefaultlocale()
    # or it can be forced explicitly by uncomment the line below
#    current_locale = "pl"
    locale_path = './locale/'
    language = gettext.translation('test_l10n', locale_path, [current_locale])
    language.install()

    app = l10nTest(0)
    app.Main()
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-02 22:08+0200\n"
"PO-Revision-Date: 2021-02-02 22:09+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n"

#: test_l10n.py:20
#, python-format
msgid "Today is %s"
msgstr "Azi este %s"

#: test_l10n.py:25
msgid "Monday"
msgstr "luni"

#: test_l10n.py:27
msgid "Tuesday"
msgstr "marți"

#: test_l10n.py:29
msgid "Wednesday"
msgstr "miercuri"

#: test_l10n.py:31
msgid "Thursday"
msgstr "joi"

#: test_l10n.py:33
msgid "Friday"
msgstr "vineri"

#: test_l10n.py:35
msgid "Saturday"
msgstr "sâmbătă"

#: test_l10n.py:37
msgid "Sunday"
msgstr "duminică"
Azi este marți
Azi este miercuri