diff --git a/sphinx/util/i18n.py b/sphinx/util/i18n.py index 16fa7a21ca..90fa900ac3 100644 --- a/sphinx/util/i18n.py +++ b/sphinx/util/i18n.py @@ -126,15 +126,21 @@ def find_catalog_source_files(locale_dirs, locale, domains=None, gettext_compact return catalogs -# date_format mappings: ustrftime() to bable.dates.format_date() +# date_format mappings: ustrftime() to bable.dates.format_datetime() date_format_mappings = { '%a': 'EEE', # Weekday as locale’s abbreviated name. '%A': 'EEEE', # Weekday as locale’s full name. '%b': 'MMM', # Month as locale’s abbreviated name. '%B': 'MMMM', # Month as locale’s full name. + '%c': 'medium', # Locale’s appropriate date and time representation. '%d': 'dd', # Day of the month as a zero-padded decimal number. + '%H': 'HH', # Hour (24-hour clock) as a decimal number [00,23]. + '%I': 'hh', # Hour (12-hour clock) as a decimal number [01,12]. '%j': 'DDD', # Day of the year as a zero-padded decimal number. '%m': 'MM', # Month as a zero-padded decimal number. + '%M': 'mm', # Minute as a decimal number [00,59]. + '%p': 'a', # Locale’s equivalent of either AM or PM. + '%S': 'ss', # Second as a decimal number. '%U': 'WW', # Week number of the year (Sunday as the first day of the week) # as a zero padded decimal number. All days in a new year preceding # the first Sunday are considered to be in week 0. @@ -143,21 +149,23 @@ date_format_mappings = { # as a decimal number. All days in a new year preceding the first # Monday are considered to be in week 0. '%x': 'medium', # Locale’s appropriate date representation. + '%X': 'medium', # Locale’s appropriate time representation. '%y': 'YY', # Year without century as a zero-padded decimal number. '%Y': 'YYYY', # Year with century as a decimal number. + '%Z': 'zzzz', # Time zone name (no characters if no time zone exists). '%%': '%', } -def babel_format_date(date, format, locale, warn=None): +def babel_format_date(date, format, locale, warn=None, formatter=babel.dates.format_date): if locale is None: locale = 'en' try: - return babel.dates.format_date(date, format, locale=locale) + return formatter(date, format, locale=locale) except (ValueError, babel.core.UnknownLocaleError): # fallback to English - return babel.dates.format_date(date, format, locale='en') + return formatter(date, format, locale='en') except AttributeError: if warn: warn('Invalid date format. Quote the string by single quote ' @@ -184,7 +192,7 @@ def format_date(format, date=None, language=None, warn=None): warnings.warn('LDML format support will be dropped at Sphinx-1.5', DeprecationWarning) - return babel_format_date(date, format, locale=language, warn=warn) + return babel_format_date(date, format, locale=language, warn=warn, formatter=babel.dates.format_datetime) else: # consider the format as ustrftime's and try to convert it to babel's result = [] @@ -192,7 +200,13 @@ def format_date(format, date=None, language=None, warn=None): for token in tokens: if token in date_format_mappings: babel_format = date_format_mappings.get(token, '') - result.append(babel_format_date(date, babel_format, locale=language)) + if token == '%x': + function = babel.dates.format_date + elif token == '%X': + function = babel.dates.format_time + else: + function = babel.dates.format_datetime + result.append(babel_format_date(date, babel_format, locale=language, formatter=function)) else: result.append(token)