/hyde/ext/plugins/languages.py

http://github.com/hyde/hyde · Python · 71 lines · 11 code · 4 blank · 56 comment · 3 complexity · aaed2ad6fbf5f6a5297ee3d868050b9c MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. """
  3. Contains classes to help manage multi-language pages.
  4. """
  5. from hyde.plugin import Plugin
  6. class LanguagePlugin(Plugin):
  7. """
  8. Each page should be tagged with a language using `language` meta
  9. data. Each page should also have an UUID stored in `uuid` meta
  10. data. Pages with different languages but the same UUID will be
  11. considered a translation of each other.
  12. For example, consider that you have the following content tree:
  13. - `en/`
  14. - `fr/`
  15. In `en/meta.yaml`, you set `language: en` and in `fr/meta.yaml`, you
  16. set `language: fr`. In `en/my-first-page.html`, you put something like
  17. this::
  18. -------
  19. uuid: page1
  20. -------
  21. My first page
  22. And in `fr/ma-premiere-page.html`, you put something like this::
  23. -------
  24. uuid: page1
  25. -------
  26. Ma première page
  27. You'll get a `translations` attribute attached to the resource
  28. with the list of resources that are a translation of this one.
  29. """
  30. def __init__(self, site):
  31. super(LanguagePlugin, self).__init__(site)
  32. # Associate a UUID to the list of resources available
  33. self.languages = {}
  34. def begin_site(self):
  35. """
  36. Initialize plugin. Build the language tree for each node
  37. """
  38. # Build association between UUID and list of resources
  39. for node in self.site.content.walk():
  40. for resource in node.resources:
  41. try:
  42. uuid = resource.meta.uuid
  43. language = resource.meta.language
  44. except AttributeError:
  45. continue
  46. if uuid not in self.languages:
  47. self.languages[uuid] = []
  48. self.languages[uuid].append(resource)
  49. # Add back the information about other languages
  50. for uuid, resources in self.languages.items():
  51. for resource in resources:
  52. language = resource.meta.language
  53. resource.translations = \
  54. [r for r in resources
  55. if r.meta.language != language]
  56. translations = ",".join(
  57. [t.meta.language for t in resource.translations])
  58. self.logger.debug("Adding translations for resource"
  59. "[%s] from %s to %s" % (resource,
  60. language,
  61. translations))