kitconcept.plate 1.0.0a23__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. kitconcept/plate/__init__.py +14 -0
  2. kitconcept/plate/behaviors/__init__.py +0 -0
  3. kitconcept/plate/behaviors/configure.zcml +13 -0
  4. kitconcept/plate/behaviors/workspace.py +5 -0
  5. kitconcept/plate/configure.zcml +32 -0
  6. kitconcept/plate/content/__init__.py +0 -0
  7. kitconcept/plate/content/wiki_page.py +5 -0
  8. kitconcept/plate/content/workspace.py +5 -0
  9. kitconcept/plate/controlpanels/__init__.py +0 -0
  10. kitconcept/plate/controlpanels/configure.zcml +10 -0
  11. kitconcept/plate/dependencies.zcml +7 -0
  12. kitconcept/plate/deserializers/__init__.py +1 -0
  13. kitconcept/plate/deserializers/comments.py +137 -0
  14. kitconcept/plate/deserializers/configure.zcml +10 -0
  15. kitconcept/plate/indexers/__init__.py +0 -0
  16. kitconcept/plate/indexers/configure.zcml +7 -0
  17. kitconcept/plate/interfaces.py +27 -0
  18. kitconcept/plate/locales/__init__.py +0 -0
  19. kitconcept/plate/locales/__main__.py +69 -0
  20. kitconcept/plate/locales/de/LC_MESSAGES/kitconcept.plate.mo +0 -0
  21. kitconcept/plate/locales/de/LC_MESSAGES/kitconcept.plate.po +65 -0
  22. kitconcept/plate/locales/en/LC_MESSAGES/kitconcept.plate.mo +0 -0
  23. kitconcept/plate/locales/en/LC_MESSAGES/kitconcept.plate.po +65 -0
  24. kitconcept/plate/locales/es/LC_MESSAGES/kitconcept.plate.mo +0 -0
  25. kitconcept/plate/locales/es/LC_MESSAGES/kitconcept.plate.po +65 -0
  26. kitconcept/plate/locales/it/LC_MESSAGES/kitconcept.plate.mo +0 -0
  27. kitconcept/plate/locales/it/LC_MESSAGES/kitconcept.plate.po +65 -0
  28. kitconcept/plate/locales/kitconcept.plate.pot +68 -0
  29. kitconcept/plate/locales/pt_BR/LC_MESSAGES/kitconcept.plate.mo +0 -0
  30. kitconcept/plate/locales/pt_BR/LC_MESSAGES/kitconcept.plate.po +65 -0
  31. kitconcept/plate/mentions/__init__.py +6 -0
  32. kitconcept/plate/mentions/configure.zcml +12 -0
  33. kitconcept/plate/mentions/helper.py +13 -0
  34. kitconcept/plate/mentions/utility.py +198 -0
  35. kitconcept/plate/permissions.zcml +11 -0
  36. kitconcept/plate/profiles/default/browserlayer.xml +6 -0
  37. kitconcept/plate/profiles/default/catalog.xml +13 -0
  38. kitconcept/plate/profiles/default/controlpanel.xml +8 -0
  39. kitconcept/plate/profiles/default/diff_tool.xml +6 -0
  40. kitconcept/plate/profiles/default/metadata.xml +7 -0
  41. kitconcept/plate/profiles/default/registry/.gitkeep +0 -0
  42. kitconcept/plate/profiles/default/registry/main.xml +19 -0
  43. kitconcept/plate/profiles/default/repositorytool.xml +6 -0
  44. kitconcept/plate/profiles/default/rolemap.xml +15 -0
  45. kitconcept/plate/profiles/default/types/.gitkeep +0 -0
  46. kitconcept/plate/profiles/default/types/WikiPage.xml +95 -0
  47. kitconcept/plate/profiles/default/types/Workspace.xml +96 -0
  48. kitconcept/plate/profiles/default/types.xml +11 -0
  49. kitconcept/plate/profiles/initial/actions.xml +16 -0
  50. kitconcept/plate/profiles/initial/metadata.xml +4 -0
  51. kitconcept/plate/profiles/initial/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml +14 -0
  52. kitconcept/plate/profiles/uninstall/browserlayer.xml +6 -0
  53. kitconcept/plate/profiles.zcml +41 -0
  54. kitconcept/plate/serializers/__init__.py +0 -0
  55. kitconcept/plate/serializers/comments.py +63 -0
  56. kitconcept/plate/serializers/configure.zcml +17 -0
  57. kitconcept/plate/serializers/summary.py +10 -0
  58. kitconcept/plate/services/__init__.py +1 -0
  59. kitconcept/plate/services/configure.zcml +14 -0
  60. kitconcept/plate/services/mentions.py +62 -0
  61. kitconcept/plate/setuphandlers/__init__.py +17 -0
  62. kitconcept/plate/setuphandlers/examplecontent/.gitignore +4 -0
  63. kitconcept/plate/setuphandlers/examplecontent/.gitkeep +0 -0
  64. kitconcept/plate/setuphandlers/examplecontent/content/00cea43587ba437d9665da8b02d3f043/data.json +96 -0
  65. kitconcept/plate/setuphandlers/examplecontent/content/0df80ceb9daa4587a59493fac1f9c45f/data.json +96 -0
  66. kitconcept/plate/setuphandlers/examplecontent/content/1896b63780854764adeb34f86369f5c5/data.json +95 -0
  67. kitconcept/plate/setuphandlers/examplecontent/content/213116f6885f4d1f8919fc79f160e2ae/data.json +96 -0
  68. kitconcept/plate/setuphandlers/examplecontent/content/2a3220b9af304bfdaee1a01f95bb3ab1/data.json +96 -0
  69. kitconcept/plate/setuphandlers/examplecontent/content/42aa727061e448d7a1d88235d4df8937/data.json +96 -0
  70. kitconcept/plate/setuphandlers/examplecontent/content/566b80982e5a4a07bf9d4d2735519ab0/data.json +96 -0
  71. kitconcept/plate/setuphandlers/examplecontent/content/66671dcf88294f79a4d5b681878b2c20/data.json +96 -0
  72. kitconcept/plate/setuphandlers/examplecontent/content/66986686c75b4a3f9d5a6bfc7dd45a6e/data.json +39 -0
  73. kitconcept/plate/setuphandlers/examplecontent/content/66986686c75b4a3f9d5a6bfc7dd45a6e/image/wizarto-pro-lftiUidW9AQ-unsplash.jpg +0 -0
  74. kitconcept/plate/setuphandlers/examplecontent/content/6fd4fdc26e0c41b798dcda77f72ea374/data.json +96 -0
  75. kitconcept/plate/setuphandlers/examplecontent/content/725320eede6548cd860da42e50d5f91b/data.json +96 -0
  76. kitconcept/plate/setuphandlers/examplecontent/content/72d982b497df42e1bf55cab6a9a70295/data.json +96 -0
  77. kitconcept/plate/setuphandlers/examplecontent/content/8b0dccfd6da5410ca3aefea63ac8afa5/data.json +95 -0
  78. kitconcept/plate/setuphandlers/examplecontent/content/98c51a23c93047bea86c90a794ed11b6/data.json +96 -0
  79. kitconcept/plate/setuphandlers/examplecontent/content/__metadata__.json +328 -0
  80. kitconcept/plate/setuphandlers/examplecontent/content/a58ccead718140c1baa98d43595fc3e6/data.json +41 -0
  81. kitconcept/plate/setuphandlers/examplecontent/content/a58ccead718140c1baa98d43595fc3e6/image/plone-foundation.png +0 -0
  82. kitconcept/plate/setuphandlers/examplecontent/content/a720393b3c0240e5bd27c43fcd2cfd1e/data.json +91 -0
  83. kitconcept/plate/setuphandlers/examplecontent/content/b1c6fb62b4af4dd697fd0c38ab7f51e8/data.json +70 -0
  84. kitconcept/plate/setuphandlers/examplecontent/content/b80b533add4546038d78ccc7bdc7238d/data.json +96 -0
  85. kitconcept/plate/setuphandlers/examplecontent/content/c3f02c4dc6914c65a312842d75c45697/data.json +96 -0
  86. kitconcept/plate/setuphandlers/examplecontent/content/d73b622d250544d0a5c1c7e7e9c54ad5/data.json +1141 -0
  87. kitconcept/plate/setuphandlers/examplecontent/content/db24cf4ba9d8440e9cdd3fcd66d23abd/data.json +96 -0
  88. kitconcept/plate/setuphandlers/examplecontent/content/e013b2a2394d47828d5402c7d2412f1b/data.json +96 -0
  89. kitconcept/plate/setuphandlers/examplecontent/content/eadea04a09484b35a2bdaaf284ece5c8/data.json +96 -0
  90. kitconcept/plate/setuphandlers/examplecontent/content/ef9acfecdad34752818daa1e164baa24/data.json +39 -0
  91. kitconcept/plate/setuphandlers/examplecontent/content/ef9acfecdad34752818daa1e164baa24/image/pexels-alex-sanchez-2150797975-35873260.jpg +0 -0
  92. kitconcept/plate/setuphandlers/examplecontent/content/f980f8999f7347ba92c89c8ae31ce6ba/data.json +96 -0
  93. kitconcept/plate/setuphandlers/examplecontent/content/plone_site_root/data.json +75 -0
  94. kitconcept/plate/setuphandlers/examplecontent/discussions.json +1 -0
  95. kitconcept/plate/setuphandlers/examplecontent/portlets.json +67 -0
  96. kitconcept/plate/setuphandlers/examplecontent/principals.json +38 -0
  97. kitconcept/plate/setuphandlers/examplecontent/redirects.json +1 -0
  98. kitconcept/plate/setuphandlers/examplecontent/relations.json +12 -0
  99. kitconcept/plate/setuphandlers/examplecontent/translations.json +1 -0
  100. kitconcept/plate/setuphandlers/initial.py +16 -0
  101. kitconcept/plate/subscribers/__init__.py +1 -0
  102. kitconcept/plate/subscribers/configure.zcml +17 -0
  103. kitconcept/plate/subscribers/mentions.py +18 -0
  104. kitconcept/plate/testing.py +52 -0
  105. kitconcept/plate/types.py +24 -0
  106. kitconcept/plate/upgrades/__init__.py +0 -0
  107. kitconcept/plate/upgrades/configure.zcml +13 -0
  108. kitconcept/plate/upgrades/v20260408001/__init__.py +0 -0
  109. kitconcept/plate/upgrades/v20260408001/configure.zcml +17 -0
  110. kitconcept/plate/upgrades/v20260414001/__init__.py +1 -0
  111. kitconcept/plate/upgrades/v20260414001/configure.zcml +17 -0
  112. kitconcept/plate/upgrades/v20260428001/__init__.py +16 -0
  113. kitconcept/plate/upgrades/v20260428001/configure.zcml +22 -0
  114. kitconcept/plate/upgrades/v20260511001/__init__.py +0 -0
  115. kitconcept/plate/upgrades/v20260511001/configure.zcml +17 -0
  116. kitconcept/plate/upgrades/v20260515001/__init__.py +0 -0
  117. kitconcept/plate/upgrades/v20260515001/configure.zcml +17 -0
  118. kitconcept/plate/upgrades/v20260623001/__init__.py +55 -0
  119. kitconcept/plate/upgrades/v20260623001/configure.zcml +17 -0
  120. kitconcept/plate/utils/__init__.py +1 -0
  121. kitconcept/plate/utils/mail.py +18 -0
  122. kitconcept/plate/vocabularies/__init__.py +0 -0
  123. kitconcept/plate/vocabularies/configure.zcml +5 -0
  124. kitconcept_plate-1.0.0a23.dist-info/METADATA +142 -0
  125. kitconcept_plate-1.0.0a23.dist-info/RECORD +129 -0
  126. kitconcept_plate-1.0.0a23.dist-info/WHEEL +4 -0
  127. kitconcept_plate-1.0.0a23.dist-info/entry_points.txt +2 -0
  128. kitconcept_plate-1.0.0a23.dist-info/licenses/LICENSE.GPL +339 -0
  129. kitconcept_plate-1.0.0a23.dist-info/licenses/LICENSE.md +15 -0
@@ -0,0 +1,14 @@
1
+ """Init and utils."""
2
+
3
+ from zope.i18nmessageid import MessageFactory
4
+
5
+ import logging
6
+
7
+
8
+ __version__ = "1.0.0a23"
9
+
10
+ PACKAGE_NAME = "kitconcept.plate"
11
+
12
+ _ = MessageFactory(PACKAGE_NAME)
13
+
14
+ logger = logging.getLogger(PACKAGE_NAME)
File without changes
@@ -0,0 +1,13 @@
1
+ <configure
2
+ xmlns="http://namespaces.zope.org/zope"
3
+ xmlns:plone="http://namespaces.plone.org/plone"
4
+ >
5
+
6
+ <plone:behavior
7
+ name="kitconcept.plate.workspace"
8
+ title="Workspace"
9
+ description="Marks a content item as a Workspace container."
10
+ provides=".workspace.IWorkspaceMarker"
11
+ />
12
+
13
+ </configure>
@@ -0,0 +1,5 @@
1
+ from zope.interface import Interface
2
+
3
+
4
+ class IWorkspaceMarker(Interface):
5
+ """Marker interface applied to Workspace content objects."""
@@ -0,0 +1,32 @@
1
+ <configure
2
+ xmlns="http://namespaces.zope.org/zope"
3
+ xmlns:i18n="http://namespaces.zope.org/i18n"
4
+ i18n_domain="kitconcept.plate"
5
+ >
6
+
7
+ <i18n:registerTranslations directory="locales" />
8
+
9
+ <include
10
+ package="Products.CMFCore"
11
+ file="permissions.zcml"
12
+ />
13
+
14
+
15
+ <include file="dependencies.zcml" />
16
+ <include file="profiles.zcml" />
17
+ <include file="permissions.zcml" />
18
+
19
+ <include package=".behaviors" />
20
+ <include package=".controlpanels" />
21
+ <include package=".deserializers" />
22
+ <include package=".indexers" />
23
+ <include package=".mentions" />
24
+ <include package=".serializers" />
25
+ <include package=".services" />
26
+ <include package=".subscribers" />
27
+ <include package=".vocabularies" />
28
+ <include package=".upgrades" />
29
+
30
+ <!-- -*- extra stuff goes here -*- -->
31
+
32
+ </configure>
File without changes
@@ -0,0 +1,5 @@
1
+ from plone.supermodel import model
2
+
3
+
4
+ class IWikiPage(model.Schema):
5
+ """Schema for wiki pages."""
@@ -0,0 +1,5 @@
1
+ from plone.supermodel import model
2
+
3
+
4
+ class IWorkspace(model.Schema):
5
+ """Schema for workspace containers."""
File without changes
@@ -0,0 +1,10 @@
1
+ <configure
2
+ xmlns="http://namespaces.zope.org/zope"
3
+ xmlns:browser="http://namespaces.zope.org/browser"
4
+ xmlns:plone="http://namespaces.plone.org/plone"
5
+ i18n_domain="kitconcept.plate"
6
+ >
7
+
8
+ <!-- -*- extra stuff goes here -*- -->
9
+
10
+ </configure>
@@ -0,0 +1,7 @@
1
+ <configure xmlns="http://namespaces.zope.org/zope">
2
+
3
+ <!-- List all packages you depend here -->
4
+ <include package="plone.restapi" />
5
+ <include package="plone.volto" />
6
+
7
+ </configure>
@@ -0,0 +1 @@
1
+ """Block field deserializers for Plate editor."""
@@ -0,0 +1,137 @@
1
+ from kitconcept.plate.mentions import mentions_utility
2
+ from plone import api
3
+ from plone.restapi.interfaces import IBlockFieldDeserializationTransformer
4
+ from zExceptions import BadRequest
5
+ from zExceptions import Unauthorized
6
+ from zope.component import adapter
7
+ from zope.interface import implementer
8
+ from zope.interface import Interface
9
+ from zope.publisher.interfaces.browser import IBrowserRequest
10
+
11
+
12
+ @adapter(Interface, IBrowserRequest)
13
+ @implementer(IBlockFieldDeserializationTransformer)
14
+ class CommentsDeserializer:
15
+ """Handle comments in __somersault__ blocks."""
16
+
17
+ order = 100
18
+ block_type = "__somersault__"
19
+ disabled = False
20
+
21
+ def __init__(self, context, request):
22
+ self.context = context
23
+ self.request = request
24
+
25
+ def __call__(self, block):
26
+ """Process comments during block deserialization.
27
+
28
+ Validates permissions, prevents unauthorized modification of comments,
29
+ and stores discussions data separately from user details.
30
+ """
31
+ current_user = api.user.get_current()
32
+
33
+ # Check if user has permission to discuss content
34
+ has_permission = api.user.has_permission(
35
+ "kitconcept.plate: Discuss content", obj=self.context
36
+ )
37
+
38
+ # Get discussions from the request
39
+ incoming_discussions = block.get("discussions", {})
40
+ # Discard user details from the request (they are not stored here)
41
+ incoming_users = block.pop("users", {})
42
+
43
+ # Get existing discussions from the block data if it already exists
44
+ existing_discussions = self._get_existing_discussions()
45
+
46
+ if not has_permission:
47
+ # User does not have permission to edit comments
48
+ if incoming_discussions or incoming_users:
49
+ # They're trying to modify comments but don't have permission
50
+ raise Unauthorized("You do not have permission to modify comments")
51
+ else:
52
+ # No new comments in request, preserve existing comments
53
+ if existing_discussions:
54
+ block["discussions"] = existing_discussions
55
+ return block
56
+
57
+ # User has permission - validate and store the discussions
58
+ if incoming_discussions:
59
+ # Validate that comments from other users are unchanged
60
+ self._validate_unchanged_comments(
61
+ incoming_discussions, existing_discussions, current_user
62
+ )
63
+ block["discussions"] = incoming_discussions
64
+ elif existing_discussions:
65
+ # Keep existing discussions if none in request
66
+ block["discussions"] = existing_discussions
67
+
68
+ # Mentions may live in the document value or in a comment's
69
+ # ``contentRich`` value. Notify only nodes introduced by this save;
70
+ # stable mention ids prevent later, unrelated edits from resending mail.
71
+ if current_user:
72
+ utility = mentions_utility()
73
+ utility.queue_notifications(
74
+ self.context,
75
+ utility.new_mentions(block, self._get_existing_block()),
76
+ current_user,
77
+ )
78
+
79
+ return block
80
+
81
+ def _get_existing_block(self):
82
+ """Return the stored somersault block, if there is one."""
83
+ if hasattr(self.context, "blocks"):
84
+ blocks = self.context.blocks or {}
85
+ block = blocks.get("__somersault__")
86
+ if isinstance(block, dict):
87
+ return block
88
+ return {}
89
+
90
+ def _get_existing_discussions(self):
91
+ """Get existing discussions from the context if available."""
92
+ # Try to get from blocks if context has blocks
93
+ return self._get_existing_block().get("discussions", {})
94
+
95
+ def _validate_unchanged_comments(
96
+ self, incoming_discussions, existing_discussions, current_user
97
+ ):
98
+ """Validate that comments from other users are unchanged.
99
+
100
+ Raises BadRequest if a comment from another user has been modified.
101
+ """
102
+ if not existing_discussions:
103
+ return # No existing comments to validate against
104
+
105
+ # Check each existing discussion
106
+ for discussion_id, existing_discussion in existing_discussions.items():
107
+ incoming_discussion = incoming_discussions.get(discussion_id)
108
+
109
+ if not incoming_discussion:
110
+ # Discussion was removed - not allowed
111
+ raise BadRequest("Cannot delete existing discussion")
112
+
113
+ # Check each existing comment
114
+ existing_comments = existing_discussion.get("comments", [])
115
+ incoming_comments = {
116
+ c["id"]: c for c in incoming_discussion.get("comments", [])
117
+ }
118
+
119
+ for existing_comment in existing_comments:
120
+ comment_id = existing_comment.get("id")
121
+ user_id = existing_comment.get("userId")
122
+
123
+ # If comment is from another user, it must not be modified
124
+ if user_id and user_id != current_user.getId():
125
+ incoming_comment = incoming_comments.get(comment_id)
126
+ if not incoming_comment:
127
+ # Comment was removed - not allowed
128
+ raise BadRequest(
129
+ "Cannot delete comment "
130
+ f"{comment_id} created by another user"
131
+ )
132
+ # Comment still exists - verify it's unchanged
133
+ if incoming_comment != existing_comment:
134
+ raise BadRequest(
135
+ "Cannot modify comment "
136
+ f"{comment_id} created by another user"
137
+ )
@@ -0,0 +1,10 @@
1
+ <configure xmlns="http://namespaces.zope.org/zope">
2
+
3
+ <!-- Block deserializers -->
4
+
5
+ <subscriber
6
+ factory=".comments.CommentsDeserializer"
7
+ provides="plone.restapi.interfaces.IBlockFieldDeserializationTransformer"
8
+ />
9
+
10
+ </configure>
File without changes
@@ -0,0 +1,7 @@
1
+ <configure xmlns="http://namespaces.zope.org/zope">
2
+
3
+ <!-- Indexers/Metadata -->
4
+
5
+ <!-- -*- extra stuff goes here -*- -->
6
+
7
+ </configure>
@@ -0,0 +1,27 @@
1
+ """Module where all interfaces, events and exceptions live."""
2
+
3
+ from zope.interface import Interface
4
+ from zope.publisher.interfaces.browser import IDefaultBrowserLayer
5
+
6
+
7
+ class IBrowserLayer(IDefaultBrowserLayer):
8
+ """Marker interface that defines a browser layer."""
9
+
10
+
11
+ class IMentions(Interface):
12
+ """Named utility that extracts and notifies Plate user mentions."""
13
+
14
+ def iter_mentions(value):
15
+ """Yield mention nodes from a Plate value or discussion structure."""
16
+
17
+ def new_mentions(incoming_block, existing_block):
18
+ """Return mention nodes newly introduced by this save."""
19
+
20
+ def queue_notifications(context, mentions, author):
21
+ """Keep newly introduced mentions until the lifecycle event fires."""
22
+
23
+ def send_notifications(context, mentions, author):
24
+ """Send one notification per newly mentioned user."""
25
+
26
+ def send_pending_notifications(context):
27
+ """Deliver mentions queued for this context by an earlier save."""
File without changes
@@ -0,0 +1,69 @@
1
+ """Update locales."""
2
+
3
+ from pathlib import Path
4
+
5
+ import logging
6
+ import re
7
+ import subprocess
8
+
9
+
10
+ logger = logging.getLogger("i18n")
11
+ logger.setLevel(logging.DEBUG)
12
+
13
+
14
+ PATTERN = r"^[a-z]{2}.*"
15
+
16
+ locale_path = Path(__file__).parent.resolve()
17
+ target_path = locale_path.parent.resolve()
18
+ domains = [path.name[:-4] for path in locale_path.glob("*.pot")]
19
+
20
+ i18ndude = "uvx i18ndude"
21
+
22
+ # ignore node_modules files resulting in errors
23
+ excludes = '"*.html *json-schema*.xml"'
24
+
25
+
26
+ def locale_folder_setup(domain: str):
27
+ languages = [path for path in locale_path.glob("*") if path.is_dir()]
28
+ for lang_folder in languages:
29
+ lc_messages_path = lang_folder / "LC_MESSAGES"
30
+ lang = lang_folder.name
31
+ if lc_messages_path.exists():
32
+ continue
33
+ elif re.match(PATTERN, lang):
34
+ lc_messages_path.mkdir()
35
+ cmd = (
36
+ f"msginit --locale={lang} "
37
+ f"--input={locale_path}/{domain}.pot "
38
+ f"--output={locale_path}/{lang}/LC_MESSAGES/{domain}.po"
39
+ )
40
+ subprocess.call(cmd, shell=True) # noQA: S602
41
+
42
+
43
+ def _rebuild(domain: str):
44
+ cmd = (
45
+ f"{i18ndude} rebuild-pot --pot {locale_path}/{domain}.pot "
46
+ f"--exclude {excludes} "
47
+ f"--create {domain} {target_path}"
48
+ )
49
+ subprocess.call(cmd, shell=True) # noQA: S602
50
+
51
+
52
+ def _sync(domain: str):
53
+ cmd = (
54
+ f"{i18ndude} sync --pot {locale_path}/{domain}.pot "
55
+ f"{locale_path}/*/LC_MESSAGES/{domain}.po"
56
+ )
57
+ subprocess.call(cmd, shell=True) # noQA: S602
58
+
59
+
60
+ def main():
61
+ for domain in domains:
62
+ logger.info(f"Updating translations for {domain}")
63
+ locale_folder_setup(domain)
64
+ _rebuild(domain)
65
+ _sync(domain)
66
+
67
+
68
+ if __name__ == "__main__":
69
+ main()
@@ -0,0 +1,65 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: PACKAGE VERSION\n"
4
+ "POT-Creation-Date: 2026-06-25 12:03+0000\n"
5
+ "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
6
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
7
+ "Language-Team: LANGUAGE <LL@li.org>\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=utf-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "Plural-Forms: nplurals=1; plural=0\n"
12
+ "Language-Code: de\n"
13
+ "Language-Name: English\n"
14
+ "Preferred-Encodings: utf-8 latin1\n"
15
+ "Domain: DOMAIN\n"
16
+
17
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
18
+ msgid "A Plate-powered wiki page."
19
+ msgstr ""
20
+
21
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
22
+ msgid "A folderish workspace container."
23
+ msgstr ""
24
+
25
+ #: kitconcept/plate/profiles.zcml:13
26
+ msgid "A new add-on for Plone that includes both backend and Volto frontend"
27
+ msgstr ""
28
+
29
+ #: kitconcept/plate/profiles.zcml:22
30
+ msgid "Create example content to showcase this addon."
31
+ msgstr ""
32
+
33
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
34
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
35
+ msgid "Edit"
36
+ msgstr ""
37
+
38
+ #: kitconcept/plate/profiles.zcml:30
39
+ msgid "Uninstall kitconcept.plate setup."
40
+ msgstr ""
41
+
42
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
43
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
44
+ msgid "View"
45
+ msgstr ""
46
+
47
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
48
+ msgid "Wiki Page"
49
+ msgstr ""
50
+
51
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
52
+ msgid "Workspace"
53
+ msgstr ""
54
+
55
+ #: kitconcept/plate/profiles.zcml:22
56
+ msgid "kitconcept.plate: Example content"
57
+ msgstr ""
58
+
59
+ #: kitconcept/plate/profiles.zcml:13
60
+ msgid "kitconcept.plate: Install"
61
+ msgstr ""
62
+
63
+ #: kitconcept/plate/profiles.zcml:30
64
+ msgid "kitconcept.plate: Uninstall"
65
+ msgstr ""
@@ -0,0 +1,65 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: PACKAGE VERSION\n"
4
+ "POT-Creation-Date: 2026-06-25 12:03+0000\n"
5
+ "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
6
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
7
+ "Language-Team: LANGUAGE <LL@li.org>\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=utf-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "Plural-Forms: nplurals=1; plural=0\n"
12
+ "Language-Code: en\n"
13
+ "Language-Name: English\n"
14
+ "Preferred-Encodings: utf-8 latin1\n"
15
+ "Domain: DOMAIN\n"
16
+
17
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
18
+ msgid "A Plate-powered wiki page."
19
+ msgstr ""
20
+
21
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
22
+ msgid "A folderish workspace container."
23
+ msgstr ""
24
+
25
+ #: kitconcept/plate/profiles.zcml:13
26
+ msgid "A new add-on for Plone that includes both backend and Volto frontend"
27
+ msgstr ""
28
+
29
+ #: kitconcept/plate/profiles.zcml:22
30
+ msgid "Create example content to showcase this addon."
31
+ msgstr ""
32
+
33
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
34
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
35
+ msgid "Edit"
36
+ msgstr ""
37
+
38
+ #: kitconcept/plate/profiles.zcml:30
39
+ msgid "Uninstall kitconcept.plate setup."
40
+ msgstr ""
41
+
42
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
43
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
44
+ msgid "View"
45
+ msgstr ""
46
+
47
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
48
+ msgid "Wiki Page"
49
+ msgstr ""
50
+
51
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
52
+ msgid "Workspace"
53
+ msgstr ""
54
+
55
+ #: kitconcept/plate/profiles.zcml:22
56
+ msgid "kitconcept.plate: Example content"
57
+ msgstr ""
58
+
59
+ #: kitconcept/plate/profiles.zcml:13
60
+ msgid "kitconcept.plate: Install"
61
+ msgstr ""
62
+
63
+ #: kitconcept/plate/profiles.zcml:30
64
+ msgid "kitconcept.plate: Uninstall"
65
+ msgstr ""
@@ -0,0 +1,65 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: PACKAGE VERSION\n"
4
+ "POT-Creation-Date: 2026-06-25 12:03+0000\n"
5
+ "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
6
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
7
+ "Language-Team: LANGUAGE <LL@li.org>\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=utf-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "Plural-Forms: nplurals=1; plural=0\n"
12
+ "Language-Code: es\n"
13
+ "Language-Name: English\n"
14
+ "Preferred-Encodings: utf-8 latin1\n"
15
+ "Domain: DOMAIN\n"
16
+
17
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
18
+ msgid "A Plate-powered wiki page."
19
+ msgstr ""
20
+
21
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
22
+ msgid "A folderish workspace container."
23
+ msgstr ""
24
+
25
+ #: kitconcept/plate/profiles.zcml:13
26
+ msgid "A new add-on for Plone that includes both backend and Volto frontend"
27
+ msgstr ""
28
+
29
+ #: kitconcept/plate/profiles.zcml:22
30
+ msgid "Create example content to showcase this addon."
31
+ msgstr ""
32
+
33
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
34
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
35
+ msgid "Edit"
36
+ msgstr ""
37
+
38
+ #: kitconcept/plate/profiles.zcml:30
39
+ msgid "Uninstall kitconcept.plate setup."
40
+ msgstr ""
41
+
42
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
43
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
44
+ msgid "View"
45
+ msgstr ""
46
+
47
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
48
+ msgid "Wiki Page"
49
+ msgstr ""
50
+
51
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
52
+ msgid "Workspace"
53
+ msgstr ""
54
+
55
+ #: kitconcept/plate/profiles.zcml:22
56
+ msgid "kitconcept.plate: Example content"
57
+ msgstr ""
58
+
59
+ #: kitconcept/plate/profiles.zcml:13
60
+ msgid "kitconcept.plate: Install"
61
+ msgstr ""
62
+
63
+ #: kitconcept/plate/profiles.zcml:30
64
+ msgid "kitconcept.plate: Uninstall"
65
+ msgstr ""
@@ -0,0 +1,65 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: PACKAGE VERSION\n"
4
+ "POT-Creation-Date: 2026-06-25 12:03+0000\n"
5
+ "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
6
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
7
+ "Language-Team: LANGUAGE <LL@li.org>\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=utf-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "Plural-Forms: nplurals=1; plural=0\n"
12
+ "Language-Code: it\n"
13
+ "Language-Name: English\n"
14
+ "Preferred-Encodings: utf-8 latin1\n"
15
+ "Domain: DOMAIN\n"
16
+
17
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
18
+ msgid "A Plate-powered wiki page."
19
+ msgstr ""
20
+
21
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
22
+ msgid "A folderish workspace container."
23
+ msgstr ""
24
+
25
+ #: kitconcept/plate/profiles.zcml:13
26
+ msgid "A new add-on for Plone that includes both backend and Volto frontend"
27
+ msgstr ""
28
+
29
+ #: kitconcept/plate/profiles.zcml:22
30
+ msgid "Create example content to showcase this addon."
31
+ msgstr ""
32
+
33
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
34
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
35
+ msgid "Edit"
36
+ msgstr ""
37
+
38
+ #: kitconcept/plate/profiles.zcml:30
39
+ msgid "Uninstall kitconcept.plate setup."
40
+ msgstr ""
41
+
42
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
43
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
44
+ msgid "View"
45
+ msgstr ""
46
+
47
+ #: kitconcept/plate/profiles/default/types/WikiPage.xml
48
+ msgid "Wiki Page"
49
+ msgstr ""
50
+
51
+ #: kitconcept/plate/profiles/default/types/Workspace.xml
52
+ msgid "Workspace"
53
+ msgstr ""
54
+
55
+ #: kitconcept/plate/profiles.zcml:22
56
+ msgid "kitconcept.plate: Example content"
57
+ msgstr ""
58
+
59
+ #: kitconcept/plate/profiles.zcml:13
60
+ msgid "kitconcept.plate: Install"
61
+ msgstr ""
62
+
63
+ #: kitconcept/plate/profiles.zcml:30
64
+ msgid "kitconcept.plate: Uninstall"
65
+ msgstr ""