from typing import Optional, List
from validator_collection import validators, checkers
from highcharts_core import constants, errors
from highcharts_core.decorators import class_sensitive
from highcharts_core.metaclasses import HighchartsMeta
from highcharts_core.global_options.language.accessibility import AccessibilityLanguageOptions
from highcharts_core.global_options.language.export_data import ExportDataLanguageOptions
from highcharts_core.global_options.language.navigation import NavigationLanguageOptions
[docs]class Language(HighchartsMeta):
"""Collection of configuration settings for UI strings that can be adapted for
display in specific languages.
.. note::
The :class:`Language` object is a global setting in Highcharts and it *cannot* be
set on each chart initialization. Instead, it has to be set using (in JavaScript)
``Highcharts.setOptions(...)`` before any chart is initialized.
"""
def __init__(self, **kwargs):
self._accessibility = None
self._context_button_title = None
self._decimal_point = None
self._download_csv = None
self._download_jpeg = None
self._download_midi = None
self._download_pdf = None
self._download_png = None
self._download_svg = None
self._download_xls = None
self._drillup_text = None
self._exit_fullscreen = None
self._export_data = None
self._export_in_progress = None
self._hide_data = None
self._invalid_date = None
self._loading = None
self._main_breadcrumb = None
self._months = None
self._navigation = None
self._no_data = None
self._numeric_symbol_magnitude = None
self._numeric_symbols = None
self._play_as_sound = None
self._print_chart = None
self._reset_zoom = None
self._reset_zoom_title = None
self._short_months = None
self._short_weekdays = None
self._thousands_separator = None
self._view_data = None
self._view_fullscreen = None
self._weekdays = None
self.accessibility = kwargs.get('accessibility', None)
self.context_button_title = kwargs.get('context_button_title', None)
self.decimal_point = kwargs.get('decimal_point', None)
self.download_csv = kwargs.get('download_csv', None)
self.download_jpeg = kwargs.get('download_jpeg', None)
self.download_midi = kwargs.get('download_midi', None)
self.download_pdf = kwargs.get('download_pdf', None)
self.download_png = kwargs.get('download_png', None)
self.download_svg = kwargs.get('download_svg', None)
self.download_xls = kwargs.get('download_xls', None)
self.drillup_text = kwargs.get('drillup_text', None)
self.exit_fullscreen = kwargs.get('exit_fullscreen', None)
self.export_data = kwargs.get('export_data', None)
self.export_in_progress = kwargs.get('export_in_progress', None)
self.hide_data = kwargs.get('hide_data', None)
self.invalid_date = kwargs.get('invalid_date', None)
self.loading = kwargs.get('loading', None)
self.main_breadcrumb = kwargs.get('main_breadcrumb', None)
self.months = kwargs.get('months', None)
self.navigation = kwargs.get('navigation', None)
self.no_data = kwargs.get('no_data', None)
self.numeric_symbol_magnitude = kwargs.get('numeric_symbol_magnitude', None)
self.numeric_symbols = kwargs.get('numeric_symbols', None)
self.play_as_sound = kwargs.get('play_as_sound', None)
self.print_chart = kwargs.get('print_chart', None)
self.reset_zoom = kwargs.get('reset_zoom', None)
self.reset_zoom_title = kwargs.get('reset_zoom_title', None)
self.short_months = kwargs.get('short_months', None)
self.short_weekdays = kwargs.get('short_weekdays', None)
self.thousands_separator = kwargs.get('thousands_separator', None)
self.view_data = kwargs.get('view_data', None)
self.view_fullscreen = kwargs.get('view_fullscreen', None)
self.weekdays = kwargs.get('weekdays', None)
@property
def _dot_path(self) -> Optional[str]:
"""The dot-notation path to the options key for the current class.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return 'lang'
@property
def accessibility(self) -> Optional[AccessibilityLanguageOptions]:
"""Configuration of accessibility strings in the chart.
.. note::
Requires the
`accessibility module <https://code.highcharts.com/modules/accessibility.js>`_
to be loaded.
For a description of the module and information on its features, see
`Accessibility <https://www.highcharts.com/docs/chart-concepts/accessibility>`_.
.. hint::
For more dynamic control over the accessibility functionality, see
:meth:`Accessibility.point.description_formatter`,
:meth:`Accessibility.series.description_formatter`, and
:meth:`Accessibility.screen_reader_section.before_chart_formatter`.
:returns: Accessibility strings used in the chart.
:rtype: :class:`AccessibilityLanguageOptions` or :obj:`None <python:None>`
"""
return self._accessibility
@accessibility.setter
@class_sensitive(AccessibilityLanguageOptions)
def accessibility(self, value):
self._accessibility = value
@property
def context_button_title(self) -> Optional[str]:
"""The tooltip title for the context menu holding print and export menu items.
Defaults to ``'Chart context menu'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._context_button_title
@context_button_title.setter
def context_button_title(self, value):
self._context_button_title = validators.string(value, allow_empty = True)
@property
def decimal_point(self) -> Optional[str]:
"""Decimal point used in (JavaScript) ``Highcharts.numberFormat``. Defaults to
``.``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._decimal_point
@decimal_point.setter
def decimal_point(self, value):
self._decimal_point = validators.string(value, allow_empty = True)
@property
def download_csv(self) -> Optional[str]:
"""Text for the context menu item that allows the user to download a CSV of the
chart/data. Defaults to ``'Download CSV'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._download_csv
@download_csv.setter
def download_csv(self, value):
self._download_csv = validators.string(value, allow_empty = True)
@property
def download_jpeg(self) -> Optional[str]:
"""Text for the context menu item that allows the user to download a JPEG of the
chart/data. Defaults to ``'Download JPEG'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._download_jpeg
@download_jpeg.setter
def download_jpeg(self, value):
self._download_jpeg = validators.string(value, allow_empty = True)
@property
def download_midi(self) -> Optional[str]:
"""
.. versionadded:: Highcharts Core for Python v.1.1.0 / Highcharts Core (JS) v.11.0.0
Text for the context menu item that allows the user to download a MIDI of the
chart/data. Defaults to ``'Download MIDI'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._download_midi
@download_midi.setter
def download_midi(self, value):
self._download_midi = validators.string(value, allow_empty = True)
@property
def download_pdf(self) -> Optional[str]:
"""Text for the context menu item that allows the user to download a PDF of the
chart/data. Defaults to ``'Download PDF'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._download_pdf
@download_pdf.setter
def download_pdf(self, value):
self._download_pdf = validators.string(value, allow_empty = True)
@property
def download_png(self) -> Optional[str]:
"""Text for the context menu item that allows the user to download a PNG of the
chart/data. Defaults to ``'Download PNG'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._download_png
@download_png.setter
def download_png(self, value):
self._download_png = validators.string(value, allow_empty = True)
@property
def download_svg(self) -> Optional[str]:
"""Text for the context menu item that allows the user to download an SVG of the
chart/data. Defaults to ``'Download SVG'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._download_svg
@download_svg.setter
def download_svg(self, value):
self._download_svg = validators.string(value, allow_empty = True)
@property
def download_xls(self) -> Optional[str]:
"""Text for the context menu item that allows the user to download a Microsoft
Excel file of the chart/data. Defaults to
``'Download Excel'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._download_xls
@download_xls.setter
def download_xls(self, value):
self._download_xls = validators.string(value, allow_empty = True)
@property
def drillup_text(self) -> Optional[str]:
"""The text for the button that appears when drilling down, linking back to the
parent series.
.. note::
The parent series' name is inserted for ``{series.name}``.
Defaults to :obj:`None <python:None>`.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._drillup_text
@drillup_text.setter
def drillup_text(self, value):
self._drillup_text = validators.string(value, allow_empty = True)
@property
def exit_fullscreen(self) -> Optional[str]:
"""The text for the menu item to exit the chart from full screen. Defaults to
``'Exit from full screen'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._exit_fullscreen
@exit_fullscreen.setter
def exit_fullscreen(self, value):
self._exit_fullscreen = validators.string(value, allow_empty = True)
@property
def export_data(self) -> Optional[ExportDataLanguageOptions]:
"""Language strings used in the exported data table.
:rtype: :class:`ExportDataLanguageOptions` or :obj:`None <python:None>`
"""
return self._export_data
@export_data.setter
@class_sensitive(ExportDataLanguageOptions)
def export_data(self, value):
self._export_data = value
@property
def export_in_progress(self) -> Optional[str]:
"""Text to show when export is in progress. Defaults to ``'Exporting...'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._export_in_progress
@export_in_progress.setter
def export_in_progress(self, value):
if value is None:
self._export_in_progress = None
else:
self._export_in_progress = validators.string(value, allow_empty = True)
@property
def hide_data(self) -> Optional[str]:
"""Text used for the hide data table menu item. Defaults to:
``'Hide data table'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._hide_data
@hide_data.setter
def hide_data(self, value):
self._hide_data = validators.string(value, allow_empty = True)
@property
def invalid_date(self) -> Optional[str]:
"""Text to show in a date field for invalid dates. Defaults to
``''`` (an empty string).
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._invalid_date
@invalid_date.setter
def invalid_date(self, value):
self._invalid_date = validators.string(value, allow_empty = True)
@property
def loading(self) -> Optional[str]:
"""The loading text that appears when the chart is set into the loading state
following a (JavaScript) call to ``chart.showLoading()``. Defaults to
``'Loading...'``.
:rtype: :class:`str <python:None>`
"""
return self._loading
@loading.setter
def loading(self, value):
self._loading = validators.string(value, allow_empty = True)
@property
def main_breadcrumb(self) -> Optional[str]:
"""The root item in the breadcrums used when in drilldown mode. Defaults to
``'Main'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._main_breadcrumb
@main_breadcrumb.setter
def main_breadcrumb(self, value):
self._main_breadcrumb = validators.string(value, allow_empty = True)
@property
def months(self) -> Optional[List[str]]:
"""An array containing the months names. Defaults to:
.. code-block::
[
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
]
.. note::
Corresponds to the ``%B`` format string in (JavaScript)
``Highcharts.dateFormat()``.
:rtype: :class:`list <python:list>` of :class:`str <python:str>`, or
:obj:`None <python:None>`
"""
return self._months
@months.setter
def months(self, value):
if not value:
self._months = None
else:
if not checkers.is_iterable(value):
raise errors.HighchartsValueError(f'months expects an iterable of strings'
f'. Received a: '
f'{value.__class__.__name__}')
elif len(value) != 12:
raise errors.HighchartsValueError(f'months expects 12 string values, but'
f'received: {len(value)}')
self._months = [validators.string(x) for x in value]
@property
def navigation(self) -> Optional[NavigationLanguageOptions]:
"""The Popup strings used in the chart.
.. note::
Requires the ``annotations.js`` or ``annotations-advanced.src.js`` module to be
loaded.
:rtype: :class:`NavigationLanguageOptions` or :obj:`None <python:None>`
"""
return self._navigation
@navigation.setter
@class_sensitive(NavigationLanguageOptions)
def navigation(self, value):
self._navigation = value
@property
def no_data(self) -> Optional[str]:
"""The text to display when the chart contains no data. Defaults to
``'No data to display'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._no_data
@no_data.setter
def no_data(self, value):
self._no_data = validators.string(value, allow_empty = True)
@property
def numeric_symbol_magnitude(self) -> Optional[int]:
"""The magnitude of replacements for :meth:`Language.numeric_symbols`
replacements. Defaults to ``1000``.
.. hint::
Use ``10000`` for Japanese, Korean and various Chinese locales, which use
symbols for 10^4, 10^8 and 10^12.
:rtype: :class:`int <python:int>`
"""
return self._numeric_symbol_magnitude
@numeric_symbol_magnitude.setter
def numeric_symbol_magnitude(self, value):
self._numeric_symbol_magnitude = validators.integer(value,
allow_empty = True,
minimum = 0,
coerce_value = True)
@property
def numeric_symbols(self) -> Optional[List[str] | constants.EnforcedNullType]:
""":term:`Metric suffixes <Metric Suffix>` used to shorten high numbers in axis
labels. Defaults to ``["k", "M", "G", "T", "P", "E"]``.
.. note::
Replacing any of the positions with :obj:`None <python:None>` or
:class:`constants.EnforcedNullType` causes the full number to be written.
Setting :meth:`Language.numeric_symbols` as a whole to :obj:`None <python:None>`
or :class:`constants.EnforcedNullType` disables shortening altogether.
:rtype: :class:`list <python:list>` of :class:`str <python:str>` or
:class:`EnforcedNullType`, or :class:`EnforcedNullType`, or
:obj:`None <python:None>`
"""
return self._numeric_symbols
@numeric_symbols.setter
def numeric_symbols(self, value):
if not value:
self._numeric_symbols = None
elif isinstance(value, constants.EnforcedNullType):
self._numeric_symbols = constants.EnforcedNull
else:
if not checkers.is_iterable(value):
raise errors.HighchartsValueError(f'numeric_symbols expects an iterable '
f'of values, but received: '
f'{value.__class__.__name__}')
validated = []
for item in value:
if item is None or item == constants.EnforcedNull:
validated.append(item)
else:
validated.append(validators.string(item))
self._numeric_symbols = validated
@property
def play_as_sound(self) -> Optional[str]:
"""
.. versionadded:: Highcharts Core for Python v.1.1.0 / Highcharts Core (JS) v.11.0.0
Text for the context menu item that allows the user to play the chart/data as a sound.
Defaults to ``'Play as sound'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._play_as_sound
@play_as_sound.setter
def play_as_sound(self, value):
self._play_as_sound = validators.string(value, allow_empty = True)
@property
def print_chart(self) -> Optional[str]:
"""The text for the menu item to print the chart. Defaults to
``'Print chart'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._print_chart
@print_chart.setter
def print_chart(self, value):
self._print_chart = validators.string(value, allow_empty = True)
@property
def reset_zoom(self) -> Optional[str]:
"""The text for the label of the button to reset the zoom when a chart is zoomed.
Defaults to ``'Reset zoom'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._reset_zoom
@reset_zoom.setter
def reset_zoom(self, value):
self._reset_zoom = validators.string(value, allow_empty = True)
@property
def reset_zoom_title(self) -> Optional[str]:
"""The text for the tooltip which appears above the button to reset the zoom when
a chart is zoomed. Defaults to ``'Reset zoom level 1:1'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._reset_zoom_title
@reset_zoom_title.setter
def reset_zoom_title(self, value):
self._reset_zoom_title = validators.string(value, allow_empty = True)
@property
def short_months(self) -> Optional[List[str]]:
"""A collection containing the months names in abbreviated form. Defaults to:
.. code-block::
[
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
]
.. note::
Corresponds to the ``%b`` format in (JavaScript) ``Highcharts.dateFormat()``.
:rtype: :class:`list <python:list>` of :class:`str <python:str>`, or
:obj:`None <python:None>`
"""
return self._short_months
@short_months.setter
def short_months(self, value):
if not value:
self._short_months = None
else:
if not checkers.is_iterable(value):
raise errors.HighchartsValueError(f'short_months expects an iterable of '
f'strings. Received a: '
f'{value.__class__.__name__}')
elif len(value) != 12:
raise errors.HighchartsValueError(f'short_months expects 12 string values'
f', but received: {len(value)}')
self._short_months = [validators.string(x) for x in value]
@property
def short_weekdays(self) -> Optional[List[str]]:
"""Short week days, starting Sunday.
If not specified, Highcharts uses the first three letters of the
:meth:`Language.weekdays` setting.
:rtype: :class:`list <python:list>` of :class:`str <python:str>` or
:obj:`None <python:None>`
"""
return self._short_weekdays
@short_weekdays.setter
def short_weekdays(self, value):
if not value:
self._short_weekdays = None
else:
if not checkers.is_iterable(value):
raise errors.HighchartsValueError(f'short_weekdays expects an iterable. '
f'Received: {value.__class__.__name__}')
self._short_weekdays = [validators.string(x) for x in value]
@property
def thousands_separator(self) -> Optional[str]:
"""The default thousands separator used in the (JavaScript)
``Highcharts.numberFormat()`` method unless otherwise specified in the function
arguments.
Defaults to a single space character, which is recommended in ISO 31-0 and works
across Anglo-American and continental European languages.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._thousands_separator
@thousands_separator.setter
def thousands_separator(self, value):
self._thousands_separator = validators.string(value, allow_empty = True)
@property
def view_data(self) -> Optional[str]:
"""The text for the menu item to view the chart's data table. Defaults to:
``'View data table'``
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._view_data
@view_data.setter
def view_data(self, value):
self._view_data = validators.string(value, allow_empty = True)
@property
def view_fullscreen(self) -> Optional[str]:
"""The text for the menu item to view the chart in fullscreen mode. Defaults to:
``'View in full screen'``.
:rtype: :class:`str <python:str>` or :obj:`None <python:None>`
"""
return self._view_fullscreen
@view_fullscreen.setter
def view_fullscreen(self, value):
self._view_fullscreen = validators.string(value, allow_empty = True)
@property
def weekdays(self) -> Optional[List[str]]:
"""An array containing the days of the week, starting with Sunday. Defaults to:
.. code-block::
[
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
]
:rtype: :class:`list <python:list>` of :class:`str <python:str>`, or
:obj:`None <python:None>`
"""
return self._weekdays
@weekdays.setter
def weekdays(self, value):
if not value:
self._weekdays = None
else:
if not checkers.is_iterable(value):
raise errors.HighchartsValueError(f'weekdays expects an iterable of '
f'strings. Received a: '
f'{value.__class__.__name__}')
elif len(value) != 7:
raise errors.HighchartsValueError(f'weekdays expects 7 string values, but'
f'received: {len(value)}')
self._weekdays = [validators.string(x) for x in value]
@classmethod
def _get_kwargs_from_dict(cls, as_dict):
kwargs = {
'accessibility': as_dict.get('accessibility', None),
'context_button_title': as_dict.get('contextButtonTitle', None),
'decimal_point': as_dict.get('decimalPoint', None),
'download_csv': as_dict.get('downloadCSV', None),
'download_jpeg': as_dict.get('downloadJPEG', None),
'download_midi': as_dict.get('downloadMIDI', None),
'download_pdf': as_dict.get('downloadPDF', None),
'download_png': as_dict.get('downloadPNG', None),
'download_svg': as_dict.get('downloadSVG', None),
'download_xls': as_dict.get('downloadXLS', None),
'drillup_text': as_dict.get('drillUpText', None),
'exit_fullscreen': as_dict.get('exitFullscreen', None),
'export_data': as_dict.get('exportData', None),
'export_in_progress': as_dict.get('exportInProgress', None),
'hide_data': as_dict.get('hideData', None),
'invalid_date': as_dict.get('invalidDate', None),
'loading': as_dict.get('loading', None),
'main_breadcrumb': as_dict.get('mainBreadcrumb', None),
'months': as_dict.get('months', None),
'navigation': as_dict.get('navigation', None),
'no_data': as_dict.get('noData', None),
'numeric_symbol_magnitude': as_dict.get('numericSymbolMagnitude', None),
'numeric_symbols': as_dict.get('numericSymbols', None),
'play_as_sound': as_dict.get('playAsSound', None),
'print_chart': as_dict.get('printChart', None),
'reset_zoom': as_dict.get('resetZoom', None),
'reset_zoom_title': as_dict.get('resetZoomTitle', None),
'short_months': as_dict.get('shortMonths', None),
'short_weekdays': as_dict.get('shortWeekdays', None),
'thousands_separator': as_dict.get('thousandsSep', None),
'view_data': as_dict.get('viewData', None),
'view_fullscreen': as_dict.get('viewFullscreen', None),
'weekdays': as_dict.get('weekdays', None),
}
return kwargs
def _to_untrimmed_dict(self, in_cls = None) -> dict:
untrimmed = {
'accessibility': self.accessibility,
'contextButtonTitle': self.context_button_title,
'decimalPoint': self.decimal_point,
'downloadCSV': self.download_csv,
'downloadJPEG': self.download_jpeg,
'downloadMIDI': self.download_midi,
'downloadPDF': self.download_pdf,
'downloadPNG': self.download_png,
'downloadSVG': self.download_svg,
'downloadXLS': self.download_xls,
'drillUpText': self.drillup_text,
'exitFullscreen': self.exit_fullscreen,
'exportData': self.export_data,
'exportInProgress': self.export_in_progress,
'hideData': self.hide_data,
'invalidDate': self.invalid_date,
'loading': self.loading,
'mainBreadcrumb': self.main_breadcrumb,
'months': self.months,
'navigation': self.navigation,
'noData': self.no_data,
'numericSymbolMagnitude': self.numeric_symbol_magnitude,
'numericSymbols': self.numeric_symbols,
'playAsSound': self.play_as_sound,
'printChart': self.print_chart,
'resetZoom': self.reset_zoom,
'resetZoomTitle': self.reset_zoom_title,
'shortMonths': self.short_months,
'shortWeekdays': self.short_weekdays,
'thousandsSep': self.thousands_separator,
'viewData': self.view_data,
'viewFullscreen': self.view_fullscreen,
'weekdays': self.weekdays
}
return untrimmed
__all__ = [
'Language',
'AccessibilityLanguageOptions',
'ExportDataLanguageOptions',
'NavigationLanguageOptions'
]