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.
- kitconcept/plate/__init__.py +14 -0
- kitconcept/plate/behaviors/__init__.py +0 -0
- kitconcept/plate/behaviors/configure.zcml +13 -0
- kitconcept/plate/behaviors/workspace.py +5 -0
- kitconcept/plate/configure.zcml +32 -0
- kitconcept/plate/content/__init__.py +0 -0
- kitconcept/plate/content/wiki_page.py +5 -0
- kitconcept/plate/content/workspace.py +5 -0
- kitconcept/plate/controlpanels/__init__.py +0 -0
- kitconcept/plate/controlpanels/configure.zcml +10 -0
- kitconcept/plate/dependencies.zcml +7 -0
- kitconcept/plate/deserializers/__init__.py +1 -0
- kitconcept/plate/deserializers/comments.py +137 -0
- kitconcept/plate/deserializers/configure.zcml +10 -0
- kitconcept/plate/indexers/__init__.py +0 -0
- kitconcept/plate/indexers/configure.zcml +7 -0
- kitconcept/plate/interfaces.py +27 -0
- kitconcept/plate/locales/__init__.py +0 -0
- kitconcept/plate/locales/__main__.py +69 -0
- kitconcept/plate/locales/de/LC_MESSAGES/kitconcept.plate.mo +0 -0
- kitconcept/plate/locales/de/LC_MESSAGES/kitconcept.plate.po +65 -0
- kitconcept/plate/locales/en/LC_MESSAGES/kitconcept.plate.mo +0 -0
- kitconcept/plate/locales/en/LC_MESSAGES/kitconcept.plate.po +65 -0
- kitconcept/plate/locales/es/LC_MESSAGES/kitconcept.plate.mo +0 -0
- kitconcept/plate/locales/es/LC_MESSAGES/kitconcept.plate.po +65 -0
- kitconcept/plate/locales/it/LC_MESSAGES/kitconcept.plate.mo +0 -0
- kitconcept/plate/locales/it/LC_MESSAGES/kitconcept.plate.po +65 -0
- kitconcept/plate/locales/kitconcept.plate.pot +68 -0
- kitconcept/plate/locales/pt_BR/LC_MESSAGES/kitconcept.plate.mo +0 -0
- kitconcept/plate/locales/pt_BR/LC_MESSAGES/kitconcept.plate.po +65 -0
- kitconcept/plate/mentions/__init__.py +6 -0
- kitconcept/plate/mentions/configure.zcml +12 -0
- kitconcept/plate/mentions/helper.py +13 -0
- kitconcept/plate/mentions/utility.py +198 -0
- kitconcept/plate/permissions.zcml +11 -0
- kitconcept/plate/profiles/default/browserlayer.xml +6 -0
- kitconcept/plate/profiles/default/catalog.xml +13 -0
- kitconcept/plate/profiles/default/controlpanel.xml +8 -0
- kitconcept/plate/profiles/default/diff_tool.xml +6 -0
- kitconcept/plate/profiles/default/metadata.xml +7 -0
- kitconcept/plate/profiles/default/registry/.gitkeep +0 -0
- kitconcept/plate/profiles/default/registry/main.xml +19 -0
- kitconcept/plate/profiles/default/repositorytool.xml +6 -0
- kitconcept/plate/profiles/default/rolemap.xml +15 -0
- kitconcept/plate/profiles/default/types/.gitkeep +0 -0
- kitconcept/plate/profiles/default/types/WikiPage.xml +95 -0
- kitconcept/plate/profiles/default/types/Workspace.xml +96 -0
- kitconcept/plate/profiles/default/types.xml +11 -0
- kitconcept/plate/profiles/initial/actions.xml +16 -0
- kitconcept/plate/profiles/initial/metadata.xml +4 -0
- kitconcept/plate/profiles/initial/registry/plone.base.interfaces.controlpanel.INavigationSchema.xml +14 -0
- kitconcept/plate/profiles/uninstall/browserlayer.xml +6 -0
- kitconcept/plate/profiles.zcml +41 -0
- kitconcept/plate/serializers/__init__.py +0 -0
- kitconcept/plate/serializers/comments.py +63 -0
- kitconcept/plate/serializers/configure.zcml +17 -0
- kitconcept/plate/serializers/summary.py +10 -0
- kitconcept/plate/services/__init__.py +1 -0
- kitconcept/plate/services/configure.zcml +14 -0
- kitconcept/plate/services/mentions.py +62 -0
- kitconcept/plate/setuphandlers/__init__.py +17 -0
- kitconcept/plate/setuphandlers/examplecontent/.gitignore +4 -0
- kitconcept/plate/setuphandlers/examplecontent/.gitkeep +0 -0
- kitconcept/plate/setuphandlers/examplecontent/content/00cea43587ba437d9665da8b02d3f043/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/0df80ceb9daa4587a59493fac1f9c45f/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/1896b63780854764adeb34f86369f5c5/data.json +95 -0
- kitconcept/plate/setuphandlers/examplecontent/content/213116f6885f4d1f8919fc79f160e2ae/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/2a3220b9af304bfdaee1a01f95bb3ab1/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/42aa727061e448d7a1d88235d4df8937/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/566b80982e5a4a07bf9d4d2735519ab0/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/66671dcf88294f79a4d5b681878b2c20/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/66986686c75b4a3f9d5a6bfc7dd45a6e/data.json +39 -0
- kitconcept/plate/setuphandlers/examplecontent/content/66986686c75b4a3f9d5a6bfc7dd45a6e/image/wizarto-pro-lftiUidW9AQ-unsplash.jpg +0 -0
- kitconcept/plate/setuphandlers/examplecontent/content/6fd4fdc26e0c41b798dcda77f72ea374/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/725320eede6548cd860da42e50d5f91b/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/72d982b497df42e1bf55cab6a9a70295/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/8b0dccfd6da5410ca3aefea63ac8afa5/data.json +95 -0
- kitconcept/plate/setuphandlers/examplecontent/content/98c51a23c93047bea86c90a794ed11b6/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/__metadata__.json +328 -0
- kitconcept/plate/setuphandlers/examplecontent/content/a58ccead718140c1baa98d43595fc3e6/data.json +41 -0
- kitconcept/plate/setuphandlers/examplecontent/content/a58ccead718140c1baa98d43595fc3e6/image/plone-foundation.png +0 -0
- kitconcept/plate/setuphandlers/examplecontent/content/a720393b3c0240e5bd27c43fcd2cfd1e/data.json +91 -0
- kitconcept/plate/setuphandlers/examplecontent/content/b1c6fb62b4af4dd697fd0c38ab7f51e8/data.json +70 -0
- kitconcept/plate/setuphandlers/examplecontent/content/b80b533add4546038d78ccc7bdc7238d/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/c3f02c4dc6914c65a312842d75c45697/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/d73b622d250544d0a5c1c7e7e9c54ad5/data.json +1141 -0
- kitconcept/plate/setuphandlers/examplecontent/content/db24cf4ba9d8440e9cdd3fcd66d23abd/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/e013b2a2394d47828d5402c7d2412f1b/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/eadea04a09484b35a2bdaaf284ece5c8/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/ef9acfecdad34752818daa1e164baa24/data.json +39 -0
- kitconcept/plate/setuphandlers/examplecontent/content/ef9acfecdad34752818daa1e164baa24/image/pexels-alex-sanchez-2150797975-35873260.jpg +0 -0
- kitconcept/plate/setuphandlers/examplecontent/content/f980f8999f7347ba92c89c8ae31ce6ba/data.json +96 -0
- kitconcept/plate/setuphandlers/examplecontent/content/plone_site_root/data.json +75 -0
- kitconcept/plate/setuphandlers/examplecontent/discussions.json +1 -0
- kitconcept/plate/setuphandlers/examplecontent/portlets.json +67 -0
- kitconcept/plate/setuphandlers/examplecontent/principals.json +38 -0
- kitconcept/plate/setuphandlers/examplecontent/redirects.json +1 -0
- kitconcept/plate/setuphandlers/examplecontent/relations.json +12 -0
- kitconcept/plate/setuphandlers/examplecontent/translations.json +1 -0
- kitconcept/plate/setuphandlers/initial.py +16 -0
- kitconcept/plate/subscribers/__init__.py +1 -0
- kitconcept/plate/subscribers/configure.zcml +17 -0
- kitconcept/plate/subscribers/mentions.py +18 -0
- kitconcept/plate/testing.py +52 -0
- kitconcept/plate/types.py +24 -0
- kitconcept/plate/upgrades/__init__.py +0 -0
- kitconcept/plate/upgrades/configure.zcml +13 -0
- kitconcept/plate/upgrades/v20260408001/__init__.py +0 -0
- kitconcept/plate/upgrades/v20260408001/configure.zcml +17 -0
- kitconcept/plate/upgrades/v20260414001/__init__.py +1 -0
- kitconcept/plate/upgrades/v20260414001/configure.zcml +17 -0
- kitconcept/plate/upgrades/v20260428001/__init__.py +16 -0
- kitconcept/plate/upgrades/v20260428001/configure.zcml +22 -0
- kitconcept/plate/upgrades/v20260511001/__init__.py +0 -0
- kitconcept/plate/upgrades/v20260511001/configure.zcml +17 -0
- kitconcept/plate/upgrades/v20260515001/__init__.py +0 -0
- kitconcept/plate/upgrades/v20260515001/configure.zcml +17 -0
- kitconcept/plate/upgrades/v20260623001/__init__.py +55 -0
- kitconcept/plate/upgrades/v20260623001/configure.zcml +17 -0
- kitconcept/plate/utils/__init__.py +1 -0
- kitconcept/plate/utils/mail.py +18 -0
- kitconcept/plate/vocabularies/__init__.py +0 -0
- kitconcept/plate/vocabularies/configure.zcml +5 -0
- kitconcept_plate-1.0.0a23.dist-info/METADATA +142 -0
- kitconcept_plate-1.0.0a23.dist-info/RECORD +129 -0
- kitconcept_plate-1.0.0a23.dist-info/WHEEL +4 -0
- kitconcept_plate-1.0.0a23.dist-info/entry_points.txt +2 -0
- kitconcept_plate-1.0.0a23.dist-info/licenses/LICENSE.GPL +339 -0
- kitconcept_plate-1.0.0a23.dist-info/licenses/LICENSE.md +15 -0
|
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,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
|
|
File without changes
|
|
@@ -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
|
+
)
|
|
File without changes
|
|
@@ -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()
|
|
Binary file
|
|
@@ -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 ""
|
|
Binary file
|
|
@@ -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 ""
|
|
Binary file
|
|
@@ -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 ""
|
|
Binary file
|
|
@@ -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 ""
|