No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mlstring.py 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # -*- coding: utf-8 -*-
  2. import json
  3. import warnings
  4. ## Handle string with translations
  5. # @todo define a default language that will be used in case the wanted language is not available for this string (gettext-like behavior)
  6. class MlString(object):
  7. default_lang = '___'
  8. ## Instanciate a new string with translation
  9. #
  10. # @param translations dict: With key = lang and value the translation
  11. def __init__(self, translations=None, default_value = None):
  12. if isinstance(translations, str):
  13. try:
  14. translations = json.loads(translations)
  15. except ValueError:
  16. if default_value is None:
  17. default_value = str(translations)
  18. translations = None
  19. if translations is None:
  20. translations = dict()
  21. if not isinstance(translations, dict):
  22. raise ValueError('Bad value given for translations argument on MlString instanciation')
  23. else:
  24. self.translations = translations
  25. self.translations[self.default_lang] = '' if default_value is None else default_value
  26. if default_value is None:
  27. warnings.warn('No default value when isntanciating an MlString')
  28. ## Return a translation
  29. # @param lang str: The lang
  30. # @return An empty string if the wanted lang don't exist
  31. # @warning Returns an empty string if the wanted translation didn't exists
  32. # @todo if the asked language is not available, use the default one, defined as a class property
  33. def get(self, lang = None):
  34. if lang is None or lang not in self.translations:
  35. lang = self.default_lang
  36. return self.translations[lang]
  37. ## Set a translation for this MlString
  38. # @param lang str: The language
  39. # @param text str: The translation
  40. # @todo check if the default language as a translation
  41. def set(self, lang, text):
  42. if not text:
  43. if lang in self.translations:
  44. del(self.translations[lang])
  45. else:
  46. self.translations[lang] = text
  47. ## @return Default translation
  48. def get_default(self):
  49. return self.get(self.default_lang)
  50. ## @brief Set default value
  51. def set_default(self, text):
  52. self.set(self.default_lang, text)
  53. ## String representation
  54. # @return A json dump of the MlString::translations dict
  55. def __str__(self):
  56. return self.get_default()
  57. ## @brief Serialize the MlString in Json
  58. def json_dumps(self):
  59. if self.translations:
  60. return json.dumps(self.translations, sort_keys=True)
  61. else:
  62. return ""
  63. ## @brief Equivalent to json_dumps
  64. def dumps(self): return self.json_dumps()
  65. ## Test if two MlString instance are equivalent
  66. # @param other MlString|str : Another MlString instance or a string (json formated)
  67. # @return True or False
  68. def __eq__(self, other):
  69. if isinstance(other, str):
  70. other = MlString(other)
  71. if not isinstance(other, MlString):
  72. return False
  73. if not set(lng for lng in self.translations) == set( lng for lng in other.translations):
  74. return False
  75. for lng in self.translations:
  76. if self.get(lng) != other.get(lng):
  77. return False
  78. return True
  79. ## @brief Allow [] access to translations
  80. def __getitem__(self, langname): return self.get(langname)
  81. ## @brief Allow [] set
  82. def __setitem__(self, langname, txt): return self.set(langname, txt)
  83. ## @brief Implements dict.keys() method
  84. def keys(self): return self.translations.keys()
  85. ## @brief Implements dict.values() method
  86. def values(self): return self.translations.values()
  87. ## @brief Implements dict.items() method
  88. def items(self): return self.translations.items()
  89. @staticmethod
  90. ## Instanciate a MlString from something
  91. # @deprecated Equivalent to MlString(translations = arg, default_value = None)
  92. def load(arg):
  93. return MlString(arg)