def translate(self, key: str, args: tuple, kwargs: dict, *, allow_failure: bool, language: Optional[str] = None, fallback_language: Optional[str] = None, plugin_translations: Optional[TranslationStorage] = None) -> MessageText: if language is None: language = self.language if plugin_translations is None: plugin_translations = {} # Translating try: translated_formatter = translation_util.translate_from_dict(self.translations.get(key, {}), language, fallback_language=fallback_language) except KeyError: try: translated_formatter = translation_util.translate_from_dict(plugin_translations.get(key, {}), language, fallback_language=fallback_language, default=None) except KeyError: translated_formatter = None # Check if there's any rtext inside args and kwargs use_rtext = any([isinstance(e, RTextBase) for e in list(args) + list(kwargs.values())]) # Processing if translated_formatter is not None: translated_formatter = translated_formatter.strip('\n\r') try: if use_rtext: translated_formatter = RTextBase.format(translated_formatter, *args, **kwargs) else: translated_formatter = translated_formatter.format(*args, **kwargs) except Exception as e: raise ValueError('Failed to apply args {} and kwargs {} to translated_text {}: {}'.format(args, kwargs, translated_formatter, e)) return translated_formatter else: if not allow_failure: raise KeyError('Translation key "{}" not found with language {}, fallback_language {}'.format(key, language, fallback_language)) self.logger.error('Error translate text "{}" to language {}'.format(key, language)) return key if not use_rtext else RTextBase.from_any(key)
def to_rtext(self) -> RTextBase: return RTextBase.format( '{}: {}{}{}', RTextBase.from_any(self.__message).copy().set_color(RColor.red), RText(self._parsed_command, RColor.dark_red), RText(self._error_command, RColor.red), RText('<--', RColor.dark_red))