update 20240611

This commit is contained in:
Songb
2024-06-11 15:30:47 +08:00
parent 31ee62c3de
commit b24bf1dd04
1941 changed files with 362328 additions and 71446 deletions
+2 -1
View File
@@ -83,9 +83,10 @@
'web.qunit_suite_tests': [
'knowledge/static/tests/knowledge_form_view_tests.js',
'knowledge/static/tests/form_controller_patch_tests.js',
'knowledge/static/tests/knowledge_external_embeds_hotkeys.js',
'knowledge/static/tests/knowledge_external_embeds_tests.js',
'knowledge/static/tests/knowledge_form_view_tests.js',
'knowledge/static/tests/knowledge_behaviors_upgrade_tests.js',
'knowledge/static/tests/knowledge_thread_tests.js',
'knowledge/static/tests/knowledge_wysiwyg_collaboration_tests.js',
('include', 'knowledge.assets_wysiwyg'),
],
+11 -2
View File
@@ -71,6 +71,16 @@ class KnowledgeController(http.Controller):
))
def _redirect_to_portal_view(self, article):
url = '/knowledge/article'
if article.id:
url += '#id=%s' % article.id
return request.redirect(url)
@http.route('/knowledge/article', type='http', auth='user')
def _access_knowledge_portal_view(self):
if request.env.user._is_internal():
return request.redirect('/web')
# We build the session information necessary for the web client to load
session_info = request.env['ir.http'].session_info()
user_context = dict(request.env.context)
@@ -82,7 +92,6 @@ class KnowledgeController(http.Controller):
session_info.update(
cache_hashes=cache_hashes,
knowledge_article_id=article.id,
user_companies={
'current_company': request.env.company.id,
'allowed_companies': {
@@ -148,7 +157,7 @@ class KnowledgeController(http.Controller):
'id': member['member_id'],
'partner_id': partner_id,
'partner_name': member['partner_name'],
'partner_email': member['partner_email'],
'partner_email': member['partner_email'] if not member['partner_share'] or partner_id == request.env.user.partner_id.id or request.env.user._is_internal() else False,
'permission': member['permission'],
'based_on': f'{member["based_on_icon"] or request.env["knowledge.article"]._get_no_icon_placeholder()} {member["based_on_name"] or _("Untitled")}' if member['based_on'] else False,
'based_on_id': member['based_on'] if member['based_on'] in based_on_articles.ids else False,
+5 -1
View File
@@ -104,11 +104,15 @@
<span style="font-size: 14px;">You can use the clipboard as a description, a message or simply copy it to your clipboard! 👌</span>
</li>
<li>
<span style="font-size: 14px;">Not sure how to do it? <a href="https://www.youtube.com/watch?v=r_r8rl73asE">See how it works <i class="fa fa-youtube-play"/></a>.</span>
<span style="font-size: 14px;">Not sure how to do it? Check the video below 👇</span>
</li>
</ul>
</li>
</ul>
<div class="o_knowledge_behavior_anchor o_knowledge_behavior_type_video"
data-behavior-props="%7B%22videoId%22%3A%22uEdaZRqa1FQ%22%2C%22platform%22%3A%22youtube%22%2C%22params%22%3A%7B%22rel%22%3A0%7D%7D"
data-oe-protected="true"/>
<p><br /></p>
<div class="o_knowledge_behavior_anchor o_knowledge_behavior_type_template" data-oe-protected="true">
<div class="d-flex">
<div class="o_knowledge_template_label align-middle">Clipboard</div>
+72 -28
View File
@@ -5,16 +5,16 @@
# Translators:
# Mustafa Rawi <mustafa@cubexco.com>, 2023
# Martin Trigaux, 2023
# Malaz Abuidris <msea@odoo.com>, 2023
# Wil Odoo, 2023
# Malaz Abuidris <msea@odoo.com>, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Wil Odoo, 2023\n"
"Last-Translator: Malaz Abuidris <msea@odoo.com>, 2024\n"
"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -80,6 +80,19 @@ msgstr "عدد الموظفين: "
msgid "#Is Favorite"
msgstr "#مفضل "
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\" هو عنصر مقال من \"%(article_name)s\" ولا يمكن "
"استعادته من تلقاء نفسه. تواصل مع صاحب \"%(article_name)s\" ليقوم باستعادته "
"عوضاً عن ذلك. "
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -931,9 +944,9 @@ msgstr ""
" </span>\n"
" </span>\n"
" <span style=\"font-size: 14px;\">\n"
" — هذه\n"
" <span style=\"font-weight: bolder;\"><font class=\"text-o-color-2\">أشياؤك</font></span>,\n"
" الأشياء التي تبقيها لنفسك\n"
" — هذه الأشياء\n"
" <span style=\"font-weight: bolder;\"><font class=\"text-o-color-2\">لك وحدك</font></span>،\n"
" هي الأشياء التي عليك إبقاؤها خاصة\n"
" (<span style=\"font-style: italic;\">المسودات، قوائم المهام، ...</span>)\n"
" </span>"
@@ -1382,6 +1395,15 @@ msgstr ""
"<span style=\"font-size: 14px;\">أتحتاج إلى هذا المستند في مكان ما؟ يمكنك "
"العودة إلى هنا عن طريق الضغط على أيقونة 📗 في الدردشة.</span> "
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
"<span style=\"font-size: 14px;\">لست واثقاً من كيفية القيام بذلك؟ شاهد "
"الفيديو أدناه 👇</span> "
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -2474,6 +2496,7 @@ msgstr "خصائص عنصر المقال "
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -3460,7 +3483,7 @@ msgstr "تحرير "
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "تحرير"
@@ -3680,6 +3703,13 @@ msgstr "الجنس: ذ "
msgid "Gender(s): W"
msgstr "الجنس: أ "
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "إنشاء مقال باستخدام الذكاء الاصطناعي "
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4779,15 +4809,6 @@ msgstr "نقل إلى سلة المهملات "
msgid "Move to Workspace"
msgstr "النقل إلى مساحة العمل "
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr "النقل إلى الهدف %(article_name)s غير واضح. يجب تحديد الفئة. "
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4968,11 +4989,6 @@ msgstr "لا توجة مرحلة بعد! "
msgid "No template yet."
msgstr "لا يوجد قالب بعد. "
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "لست متأكداً من كيفية القيام بذلك؟ "
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -5063,6 +5079,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "جاري"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "يُسمَح فقط للمستخدمين الداخليين الوصول إلى نافذة العرض هذه. "
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5117,7 +5140,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5533,7 +5556,6 @@ msgstr "إزالة من المفضلة "
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5768,11 +5790,6 @@ msgstr "القسم"
msgid "See a doctor and send us the sick note."
msgstr "اذهب إلى الطبيب ثم أرسل العذر الطبي. "
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "ألقِ نظرة على كيفية عمله <i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -6239,6 +6256,15 @@ msgstr "معرض ريادة الأعمال المستقبلي "
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr "يحتاج المقال '%s' إلى مستخدم واحد على الأقل مع صلاحية 'الكتابة'. "
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr "مكان هدف %(article_name)s غير واضح. يجب تحديد الفئة. "
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6786,6 +6812,13 @@ msgstr "مساحة العمل"
msgid "Write"
msgstr "اكتب "
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "اكتب مقالاً عن "
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6875,6 +6908,17 @@ msgstr "لا يمكنك حفظ المفضلة في هذا المقال "
msgid "You can't leave an article for which you are the last writer"
msgstr "لا يمكنك مغادرة مقال كنت الكاتب الأخير فيه "
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"لا يمكنك نقل %(article_name)s تحت %(item_name)s, حيث إن %(item_name)s هو "
"عنصر مقال. حوّل %(item_name)s إلى مقال أولاً. "
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+6598
View File
File diff suppressed because it is too large Load Diff
+6863
View File
File diff suppressed because it is too large Load Diff
+423 -181
View File
File diff suppressed because it is too large Load Diff
+6818
View File
File diff suppressed because it is too large Load Diff
+73 -28
View File
@@ -4,15 +4,15 @@
#
# Translators:
# Wil Odoo, 2023
# Larissa Manderfeld, 2023
# Larissa Manderfeld, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Larissa Manderfeld, 2023\n"
"Last-Translator: Larissa Manderfeld, 2024\n"
"Language-Team: German (https://app.transifex.com/odoo/teams/41243/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -78,6 +78,19 @@ msgstr "# Mitarbeiter:"
msgid "#Is Favorite"
msgstr "#Ist Favorit"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"„%(article_item_name)s“ ist ein Artikelelement von „%(article_name)s“ und "
"kann nicht alleine wiederhergestellt werden. Kontaktieren Sie stattdessenden"
" Eigentümer von „%(article_name)s“, um es wiederherzustellen."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1389,6 +1402,15 @@ msgstr ""
"Kommen Sie hierhin zurück, indem Sie auf das Symbol 📗 im Chatter "
"klicken.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
"<span style=\"font-size: 14px;\">Wie geht das? Sehen Sie sich das folgende "
"Video an 👇</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -2499,6 +2521,7 @@ msgstr "Eigenschaften für Artikelelemente"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2633,7 +2656,7 @@ msgstr "Rückstand"
#: code:addons/knowledge/static/src/components/item_calendar_props_dialog/item_calendar_props_dialog.xml:0
#, python-format
msgid "Base Color On"
msgstr "Farben basieren auf"
msgstr "Farbe basieren auf"
#. module: knowledge
#. odoo-javascript
@@ -3505,7 +3528,7 @@ msgstr "BEARBEITEN"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Bearbeiten"
@@ -3727,6 +3750,13 @@ msgstr "Geschlecht(er): M"
msgid "Gender(s): W"
msgstr "Geschlecht(er): W"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "Einen Artikel mit KI generieren"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4843,17 +4873,6 @@ msgstr "In Papierkorb verschieben"
msgid "Move to Workspace"
msgstr "In Arbeitsbereich verschieben"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
"Bewegung zum Ziel von %(article_name)s ist mehrdeutig, Sie sollten die "
"Kategorie bestimmen."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -5034,11 +5053,6 @@ msgstr "Noch keine Phase!"
msgid "No template yet."
msgstr "Noch keine Vorlage."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "Sie wissen nicht, wie das funktioniert?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -5129,6 +5143,13 @@ msgstr "Einführungsphase.pdf"
msgid "Ongoing"
msgstr "Laufend"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "Nur interne Benutzer haben Zugriff auf diese Ansicht."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5184,7 +5205,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5607,7 +5628,6 @@ msgstr "Aus Favoriten entfernen"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5842,11 +5862,6 @@ msgstr "Abschnitt"
msgid "See a doctor and send us the sick note."
msgstr "Gehen Sie zum Arzt und senden Sie uns das ärztliche Attest."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "So geht's: <i class=\"fa fa-youtube-play\"/>!"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -6315,6 +6330,17 @@ msgid "The article '%s' needs at least one member with 'Write' access."
msgstr ""
"Der Artikel „%s“ benötigt mindestens ein Mitglied mit „Schreiben“-Zugriff."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
"Die Zielplatzierung von %(article_name)s ist mehrdeutig, Sie sollten die "
"Kategorie bestimmen."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6883,6 +6909,13 @@ msgstr "Arbeitsbereich"
msgid "Write"
msgstr "Schreiben"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "Schreiben Sie einen Artikel über"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6978,6 +7011,18 @@ msgid "You can't leave an article for which you are the last writer"
msgstr ""
"Sie können einen Artikel, für den Sie der letzte Autor sind, nicht verlassen"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"Sie können %(article_name)s nicht unter %(item_name)s verschieben, da "
"%(item_name)s ein Artikelelement ist. Wandeln Sie %(item_name)s zuerst in "
"einen Artikel um."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+685 -323
View File
File diff suppressed because it is too large Load Diff
+137 -94
View File
@@ -3,18 +3,19 @@
# * knowledge
#
# Translators:
# Fernanda Alvarez, 2023
# Patricia Gutiérrez Capetillo <pagc@odoo.com>, 2023
# Wil Odoo, 2023
# Iran Villalobos López, 2023
# Patricia Gutiérrez Capetillo <pagc@odoo.com>, 2024
# Fernanda Alvarez, 2024
# Martin Trigaux, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Iran Villalobos López, 2023\n"
"Last-Translator: Martin Trigaux, 2024\n"
"Language-Team: Spanish (Latin America) (https://app.transifex.com/odoo/teams/41243/es_419/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -78,7 +79,20 @@ msgstr "Número de empleados:"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__favorite_count
msgid "#Is Favorite"
msgstr "# Es un favorito"
msgstr "#Es favorito"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\" es un elemento de artículo de \"%(article_name)s\""
" y no se puede restaurar por sí mismo. Contacte al dueño de "
"\"%(article_name)s\" para poder restaurarlo."
#. module: knowledge
#. odoo-python
@@ -175,7 +189,7 @@ msgid ""
msgstr ""
"<em>\n"
" <font class=\"text-600\">\n"
" ¿Qué está tratando de lograr con esta campaña?\n"
" ¿Qué quiere lograr con esta campaña?\n"
" </font>\n"
" </em>"
@@ -190,7 +204,7 @@ msgid ""
msgstr ""
"<em>\n"
" <font class=\"text-600\">\n"
" ¿De qué está tratando de convencer a la gente involucrada?\n"
" ¿De qué quiere convencer a la gente?\n"
" </font>\n"
" </em>"
@@ -283,7 +297,7 @@ msgid ""
" </em>"
msgstr ""
"<em>\n"
" <font class=\"text-600\">¿Cómo es que ocurrió?</font>\n"
" <font class=\"text-600\">¿Cómo ocurrió?</font>\n"
" </em>"
#. module: knowledge
@@ -305,7 +319,7 @@ msgid ""
" </em>"
msgstr ""
"<em>\n"
" <font class=\"text-600\">Escriba aquí cualquier otra pregunta o duda que pueda llegar a tener.</font>\n"
" <font class=\"text-600\">Escriba aquí cualquier otra pregunta o duda que pueda tener.</font>\n"
" </em>"
#. module: knowledge
@@ -490,8 +504,8 @@ msgid ""
"<font class=\"text-600\">Detailed Explanation of the feature, with "
"screenshots or a GIF</font>"
msgstr ""
"<font class=\"text-600\">Explicación detallada de la función, incluya "
"capturas de pantalla o un GIF</font>"
"<font class=\"text-600\">Explicación detallada de la función en la que se "
"incluya capturas de pantalla o un GIF</font>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_account_management
@@ -514,8 +528,8 @@ msgid ""
"<font class=\"text-600\">How do stakeholders interact regarding "
"offers?</font>"
msgstr ""
"<font class=\"text-600\">¿Cómo interactúan las partes interesadas con "
"respecto a las ofertas?</font>"
"<font class=\"text-600\">¿Cómo interactúan las partes interesadas con las "
"ofertas?</font>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_account_management
@@ -527,7 +541,7 @@ msgstr "<font class=\"text-600\">¿Cómo comparan y evalúan las ofertas?</font>
msgid ""
"<font class=\"text-600\">I made sure any visual change is responsive</font>"
msgstr ""
"<font class=\"text-600\">Me aseguré de que cualquier cambio visual sea "
"<font class=\"text-600\">Me aseguré de que cualquier cambio visual fuera "
"responsivo</font>"
#. module: knowledge
@@ -734,7 +748,7 @@ msgstr ""
" <font style=\"color: rgb(255, 0, 0);\"><strong>Rojo: lo que más valoran son los resultados.</strong></font><br>\n"
" <strong>\n"
" <font style=\"color: rgb(239, 198, 49);\">\n"
" Amarillo: lo que más valoran es la creatividad y el entusiasmo, más que los resultados.\n"
" Amarillo: valoran la creatividad y el entusiasmo más que los resultados.\n"
" </font>\n"
" </strong>\n"
" </i>"
@@ -1012,9 +1026,9 @@ msgstr ""
"<span style=\"font-size: 14px;\">\n"
" Pruebe los\n"
" <span style=\"font-weight: bolder;\">comandos</span>\n"
" debajo de esta lista,\n"
" abajo de esta lista.\n"
" <span style=\"font-weight: bolder;\">\n"
" <font class=\"text-o-color-2\">escriba</font>\n"
" <font class=\"text-o-color-2\">Escriba</font>\n"
" </span>\n"
" \"<span style=\"font-weight: bolder;\">/</span>\"\n"
" </span>"
@@ -1289,7 +1303,7 @@ msgid ""
" </span>"
msgstr ""
"<span style=\"font-size: 14px;\">\n"
" ¿Desea ir\n"
" ¿Desea ser\n"
" <span style=\"font-style: italic;\">aún más</span>\n"
" rápido? ⚡️\n"
" </span>\n"
@@ -1392,6 +1406,15 @@ msgstr ""
"<span style=\"font-size: 14px;\">¿Necesita este documento en alguna parte? "
"Regrese aquí haciendo clic en el icono 📗 en el chatter.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
"<span style=\"font-size: 14px;\">¿No sabes muy bien cómo hacerlo? Mire el "
"video aquí abajo 👇</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -1967,8 +1990,8 @@ msgid ""
"A must listen for all developers out there and anyone interested in "
"Javascript!"
msgstr ""
"Sin duda alguna, todas las personas que se dediquen al desarrollo o que "
"estén interesadas en Javascript deben escucharlo."
"Todas las personas que se dediquen al desarrollo o que estén interesadas en "
"Javascript deben escucharlo."
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_3
@@ -2345,8 +2368,8 @@ msgid ""
"Are you sure you want to leave your private Article? As you are its last "
"member, it will be moved to the Trash."
msgstr ""
"¿Está seguro de que quiere dejar su artículo como privado? Ya que es su "
"último miembro, se moverá a la papelera."
"¿Está seguro de que quiere dejar el artículo como privado? Tome en cuenta "
"que usted es el último miembro, por lo que se moverá a la papelera."
#. module: knowledge
#. odoo-javascript
@@ -2491,6 +2514,7 @@ msgstr "Propiedades del elemento del artículo"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2667,7 +2691,7 @@ msgid ""
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-"
"star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-star-o\"></i></span>"
msgstr ""
"Atracción por la marca <span class=\"o_stars o_five_stars\" "
"Atracción de la marca <span class=\"o_stars o_five_stars\" "
"id=\"checkId-3\"><i class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i "
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
@@ -2680,7 +2704,7 @@ msgid ""
"star\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
msgstr ""
"Atracción por la marca <span class=\"o_stars o_five_stars\" "
"Atracción de la marca <span class=\"o_stars o_five_stars\" "
"id=\"checkId-3\"><i class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i "
"class=\"fa fa-star\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
@@ -2693,7 +2717,7 @@ msgid ""
"star-o\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
msgstr ""
"Atracción por la marca <span class=\"o_stars o_five_stars\" "
"Atracción de la marca <span class=\"o_stars o_five_stars\" "
"id=\"checkId-3\"><i class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i "
"class=\"fa fa-star-o\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
@@ -2706,7 +2730,7 @@ msgid ""
"star-o\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
msgstr ""
"Atracción por la marca <span class=\"o_stars o_five_stars\" "
"Atracción de la marca <span class=\"o_stars o_five_stars\" "
"id=\"checkId-3\"><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-star-o\"></i><i "
"class=\"fa fa-star-o\"></i></span>"
@@ -2912,7 +2936,7 @@ msgid ""
"Centralize account insights in one document for comprehensive monitoring and"
" follow-up."
msgstr ""
"Centralize la información sobre la cuenta en un solo documento para llevar "
"Centralice la información sobre la cuenta en un solo documento para llevar "
"un mejor seguimiento y monitoreo. "
#. module: knowledge
@@ -3144,8 +3168,8 @@ msgid ""
"Could not move \"%s%s\" in the shared section. Only shared articles can be "
"moved in this section."
msgstr ""
"No se pudo mover \"%s%s\" a la sección de compartidos, solo puede mover los "
"artículos compartidos."
"No se pudo mover \"%s%s\" a la sección de compartidos. Solo puede mover "
"artículos compartidos a esta sección."
#. module: knowledge
#. odoo-javascript
@@ -3383,7 +3407,7 @@ msgid ""
" before being permanently removed for your database"
msgstr ""
"Los artículos eliminados se almacenan en la papelera durante <b>%(threshold)s</b> días adicionales\n"
" antes de ser eliminados de forma permanente de su base de datos"
" antes de eliminarse de forma permanente de su base de datos"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__deletion_date
@@ -3490,7 +3514,7 @@ msgstr "EDITAR"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Editar"
@@ -3710,6 +3734,13 @@ msgstr "Género: hombre"
msgid "Gender(s): W"
msgstr "Género: mujer"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "Genere un artículo con inteligencia artificial."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -3764,7 +3795,7 @@ msgstr "¿Tiene subartículos normales?"
msgid ""
"Has the user access to each parent from current article until its root?"
msgstr ""
"¿El usuario tiene acceso a cada parte principal desde el artículo actual "
"¿El usuario tiene acceso a cada parte principal, desde el artículo actual "
"hasta su origen?"
#. module: knowledge
@@ -3917,7 +3948,7 @@ msgid ""
" Considering we just launched ProductName, I was thinking you would be interested."
msgstr ""
"Mientras realizaba una investigación por internet me encontré con su empresa.<br>\n"
" Acabamos de lanzar [escriba el nombre del producto aquí] y considero que podría ser de su interés. "
" Acabamos de lanzar [escriba el nombre del producto aquí] y considero que podría interesarle. "
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sales_playbook
@@ -3981,8 +4012,7 @@ msgstr ""
#: model:ir.model.fields,help:knowledge.field_knowledge_article_thread__message_has_error
#: model:ir.model.fields,help:knowledge.field_knowledge_article_thread__message_has_sms_error
msgid "If checked, some messages have a delivery error."
msgstr ""
"Si se encuentra seleccionado, algunos mensajes presentan un error de envío."
msgstr "Si se encuentra seleccionado, algunos mensajes tienen error de envío."
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_product_catalog
@@ -4275,7 +4305,7 @@ msgstr "Es una plantilla"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__has_item_parent
msgid "Is the parent an Item?"
msgstr "¿Es el principal un elemento?"
msgstr "¿El principal es un elemento?"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_post_mortem
@@ -4285,7 +4315,7 @@ msgstr "Resumen de errores"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_account_management
msgid "Issues they are trying to solve:"
msgstr "Problemas a los que se busca una solución:"
msgstr "Problemas para los que se está buscando una solución:"
#. module: knowledge
#: model:ir.model.fields,help:knowledge.field_knowledge_article__template_category_sequence
@@ -4302,22 +4332,22 @@ msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_meeting_minutes_template
msgid "Item 1"
msgstr "Primer tema"
msgstr "Tema 1"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_meeting_minutes_template
msgid "Item 2"
msgstr "Segundo tema"
msgstr "Tema 2"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_meeting_minutes_template
msgid "Item 3"
msgstr "Tercer tema"
msgstr "Tema 3"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_meeting_minutes_template
msgid "Item 4"
msgstr "Cuarto tema"
msgstr "Tema 4"
#. module: knowledge
#. odoo-javascript
@@ -4539,7 +4569,7 @@ msgstr "Permisos y tiempo personal"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_hr_faq
msgid "Let your Team Leader know in advance."
msgstr "Avise con anticipación a su Líder de equipo. "
msgstr "Avise con anticipación a su líder de equipo. "
#. module: knowledge
#. odoo-javascript
@@ -4760,10 +4790,9 @@ msgid ""
" kilometers.<br>Starting from the office, they enjoyed a great tour in the countryside before\n"
" coming back to Grand-Rosière, where they were welcomed with a drink and a burger."
msgstr ""
"Más de 150 Odooers participaron en la edición de este año de las carreras de"
" 5 y 11 kilómetros.<br>El punto de partida fue la oficina, disfrutaron de un"
" gran recorrido por el campo antes de regresar a Grand-Rosière, donde les "
"recibimos con una bebida y una hamburguesa."
"Más de 150 Odooers participaron en la carrera de 5 u 11 kilómetros\n"
" de este año.<br>El recorrido inició en la oficina y pudiero. correr a través del campo antes\n"
" de regresar a Grand-Rosière, donde se les recibió con bebidas y hamburguesas."
#. module: knowledge
#. odoo-javascript
@@ -4828,17 +4857,6 @@ msgstr "Mover a la papelera"
msgid "Move to Workspace"
msgstr "Mover al espacio de trabajo"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
"Mover al destino de %(article_name)s es ambiguo, debe especificar la "
"categoría."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4949,7 +4967,7 @@ msgstr "Próxima reunión: <font class=\"text-400\">lugar y fecha</font>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_meeting_example_branding
msgid "Next Meeting: <u>6th May, @John's Office</u>"
msgstr "Próxima reunión: <u>6 de mayo @ oficina de John</u>"
msgstr "Próxima reunión: <u>6 de mayo en la oficina de John</u>"
#. module: knowledge
#. odoo-javascript
@@ -5010,19 +5028,14 @@ msgstr "No se encontraron artículos ocultos"
#. module: knowledge
#: model_terms:ir.actions.act_window,help:knowledge.knowledge_article_stage_action
msgid "No stage yet!"
msgstr "Aún no hay etapa"
msgstr "Todavía no hay etapa."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.xml:0
#, python-format
msgid "No template yet."
msgstr "No hay plantilla."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "¿No está seguro de cómo hacerlo?"
msgstr "Todavía no hay plantilla."
#. module: knowledge
#. odoo-javascript
@@ -5114,6 +5127,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "En curso"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "Solo los usuarios internos pueden acceder a esta vista."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5164,12 +5184,12 @@ msgid ""
"Oops, the file %s could not be found. Please replace this file box by a new "
"one to re-upload the file."
msgstr ""
"Uy, no pudimos encontrar el archivo %s, reemplace este cuadro de archivo por"
" uno nuevo para volver a cargar el archivo."
"Lo sentimos, no pudimos encontrar el archivo %s, reemplace este cuadro de "
"archivo por uno nuevo para volver a cargarlo."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5242,7 +5262,7 @@ msgstr "Resultados"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article_stage__parent_id
msgid "Owner Article"
msgstr "Propietario del artículo"
msgstr "Dueño del artículo"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_company_newsletter
@@ -5464,7 +5484,7 @@ msgid ""
"Properties are fields that can only be added on articles that have a parent."
msgstr ""
"Las propiedades son campos que solo se pueden agregar a artículos que tienen"
" uno principal."
" un artículo principal."
#. module: knowledge
#. odoo-javascript
@@ -5592,7 +5612,6 @@ msgstr "Eliminar de favoritos"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5691,7 +5710,7 @@ msgstr "Restringir acceso"
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.js:0
#, python-format
msgid "Restrict own access"
msgstr "Restringir el propio acceso"
msgstr "Restringir el acceso propio"
#. module: knowledge
#: model:ir.model.fields.selection,name:knowledge.selection__knowledge_article__inherited_permission__none
@@ -5827,11 +5846,6 @@ msgstr "Sección"
msgid "See a doctor and send us the sick note."
msgstr "Consulte a un médico y envíenos la receta."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "Vea cómo funciona <i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -5939,9 +5953,9 @@ msgid ""
"fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i "
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i></span>"
msgstr ""
"Estatus social <span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i "
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-"
"star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i></span>"
"Social <span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i class=\"fa "
"fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i "
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i></span>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_4
@@ -5950,7 +5964,7 @@ msgid ""
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-"
"star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-star-o\"></i></span>"
msgstr ""
"Estatus social <span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i "
"Estado social <span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i "
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-"
"star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-star-o\"></i></span>"
@@ -5962,7 +5976,7 @@ msgid ""
"star\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
msgstr ""
"Estatus social <span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i "
"Estado social <span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i "
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-"
"star\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
@@ -5975,7 +5989,7 @@ msgid ""
"star-o\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
msgstr ""
"Estatus social <span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i "
"Estado social <span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i "
"class=\"fa fa-star-o\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i><i class=\"fa fa-star-o\"></i><i class=\"fa fa-"
"star-o\"></i></span>"
@@ -5987,7 +6001,7 @@ msgid ""
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-"
"star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-star-o\"></i></span>"
msgstr ""
"Estatus social ​<span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i "
"Estado social ​<span class=\"o_stars o_five_stars\" id=\"checkId-4\"><i "
"class=\"fa fa-star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-"
"star\"></i><i class=\"fa fa-star\"></i><i class=\"fa fa-star-o\"></i></span>"
@@ -6259,9 +6273,9 @@ msgid ""
" <strong>Odoo Run</strong>\n"
" </font>!"
msgstr ""
"¡Gracias a todas las personas que nos ayudaron a organizar esta edición del \n"
"¡Gracias a todas las personas que nos ayudaron a organizar esta edición de la \n"
" <font class=\"text-o-color-2\">\n"
" <strong>Maratón Odoo</strong>\n"
" <strong>carrera de Odoo</strong>\n"
" </font>!"
#. module: knowledge
@@ -6299,6 +6313,17 @@ msgstr "Nuestra participación en Future Entrepreneurship"
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr "El artículo \"%s\" necesita al menos un miembro con acceso a \"Editar\"."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
"La ubicación de destino de %(article_name)s es ambigua, especifique la "
"categoría."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6331,7 +6356,7 @@ msgstr "El registro al que está dirigido este macro no se pudo encontrar."
#: code:addons/knowledge/controllers/main.py:0
#, python-format
msgid "The selected member does not exists or has been already deleted."
msgstr "El miembro seleccionado no existe o ya ha sido eliminado."
msgstr "El miembro seleccionado no existe o ya se eliminó."
#. module: knowledge
#: model:ir.model.fields,help:knowledge.field_knowledge_article__sequence
@@ -6734,7 +6759,7 @@ msgid ""
"they have write access on the article."
msgstr ""
"Cuando está bloqueado, los usuarios no pueden escribir en el cuerpo o "
"cambiar el título, aún con acceso de edición al artículo."
"cambiar el título, aún aunque tengan acceso de edición al artículo."
#. module: knowledge
#: model:ir.model.fields,help:knowledge.field_knowledge_article__to_delete
@@ -6770,10 +6795,9 @@ msgid ""
msgstr ""
"Sin importar si tiene preferencia por el encanto rústico de una cabaña de "
"madera o la intrínseca belleza de las acerías victorianas, aquí podrá "
"encontrar lo que necesita. ¿Está en búsqueda de una opción más específica? "
"También podemos ayudarle, solo póngase en contacto con nuestros arquitectos "
"y nos aseguraremos de construir un lugar que cumpla con sus "
"especificaciones."
"encontrar lo que necesita. ¿Busca una opción más específica? También podemos"
" ayudarle, solo póngase en contacto con nuestros arquitectos y nos "
"aseguraremos de construir un lugar que cumpla con lo que usted desea."
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_meeting_example_branding
@@ -6803,8 +6827,8 @@ msgstr ""
" priorizar la comodidad al compartir un espacio tan limitado. Para asegurar "
"que todas las personas que habitarán allí sean felices, verifique que haya "
"al menos 9m² por persona. Si planea vivir con varios compañeros de "
"habitación, le recomendamos nuestro modelo Serenità, tiene suficiente "
"espacio para que todos se sientan a gusto.<br>"
"habitación, le recomendamos nuestro modelo Serenità, el cual tiene "
"suficiente espacio para que todos se sientan cómodos.<br>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_product_catalog
@@ -6858,6 +6882,13 @@ msgstr "Espacio de trabajo"
msgid "Write"
msgstr "Editar"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "Escriba un artículo al respecto"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6949,6 +6980,18 @@ msgstr "No puede guardar este artículo como favorito"
msgid "You can't leave an article for which you are the last writer"
msgstr "No puede abandonar un artículo del cual es el último autor"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"No puede mover %(article_name)s a %(item_name)s, ya que %(item_name)s es un "
"elemento de un artículo. Primero debe convertir %(item_name)s en un "
"artículo."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+112 -50
View File
@@ -13,20 +13,23 @@
# Martin Aavastik <martin@avalah.ee>, 2023
# Piia Paurson <piia@avalah.ee>, 2023
# Eneli Õigus <enelioigus@gmail.com>, 2023
# Anna, 2023
# Rivo Zängov <eraser@eraser.ee>, 2023
# JanaAvalah, 2023
# Triine Aavik <triine@avalah.ee>, 2023
# Leaanika Randmets, 2023
# Martin Trigaux, 2023
# Mihkel avalah, 2023
# Katrin Kampura, 2023
# Anna, 2024
# Birgit Vijar, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Martin Trigaux, 2023\n"
"Last-Translator: Birgit Vijar, 2024\n"
"Language-Team: Estonian (https://app.transifex.com/odoo/teams/41243/et/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -88,6 +91,16 @@ msgstr ""
msgid "#Is Favorite"
msgstr "#Lemmik"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -95,7 +108,7 @@ msgstr "#Lemmik"
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid "%(article_name)s (copy)"
msgstr ""
msgstr "%(article_name)s (copy)"
#. module: knowledge
#. odoo-python
@@ -530,17 +543,17 @@ msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_personal_organizer
msgid "<font class=\"text-600\">Reminder 1</font>"
msgstr ""
msgstr "<font class=\"text-600\">Meeldetuletus 1</font>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_personal_organizer
msgid "<font class=\"text-600\">Reminder 2</font>"
msgstr ""
msgstr "<font class=\"text-600\">Meeldetuletus 2</font>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_personal_organizer
msgid "<font class=\"text-600\">Reminder 3</font>"
msgstr ""
msgstr "<font class=\"text-600\">Meeldetuletus 3</font>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_personal_organizer
@@ -856,6 +869,15 @@ msgid ""
" \"<span style=\"font-weight: bolder;\">/</span>\"\n"
" </span>"
msgstr ""
"<span style=\"font-size: 14px;\">\n"
" Proovi nimekirja all\n"
" käskusid\n"
" \n"
" <span style=\"font-weight: bolder;\">\n"
" trükkides\n"
" </span>\n"
" \"<span style=\"font-weight: bolder;\">/</span>\"\n"
" </span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
@@ -896,6 +918,14 @@ msgid ""
" <span style=\"font-style: italic; text-decoration-line: underline;\">it</span>\n"
" </span>"
msgstr ""
"<span style=\"font-size: 14px;\">\n"
" Vali tekst\n"
" <font class=\"bg-o-color-2\">esile tõstmiseks</font>,\n"
" <span style=\"text-decoration-line: line-through;\">läbi kriipsutamiseks</span>\n"
" või\n"
" <span style=\"font-weight: bolder;\">stiili</span>\n"
" <span style=\"font-style: italic; text-decoration-line: underline;\">muutmiseks</span>\n"
" </span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
@@ -1052,14 +1082,14 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Check this box to indicate it's done</span>"
msgstr ""
msgstr "Märgi kastike, et näidata, et see on tehtud"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Click anywhere, and just start "
"typing</span>"
msgstr ""
msgstr "</span>Vajuta kuhu iganes ja lihtsalt alusta trükkimist</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
@@ -1094,10 +1124,19 @@ msgid ""
"here by clicking on the 📗 icon in the chatter.</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
msgstr ""
"<span style=\"font-size: 14px;\">Vajuta Ctrl-Z muudatuste tagasi "
"võtmiseks</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
@@ -1269,6 +1308,9 @@ msgid ""
" <font style=\"color: rgb(148, 189, 123);\">Do</font>\n"
" </strong>"
msgstr ""
"<strong>\n"
" <font style=\"color: rgb(148, 189, 123);\">Do</font>\n"
" </strong>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_personal_organizer
@@ -1479,7 +1521,7 @@ msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sales_playbook
msgid "<strong>Q1,2,3,4</strong>"
msgstr ""
msgstr "<strong>Q1,2,3,4</strong>"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_release_note
@@ -1624,7 +1666,7 @@ msgstr "Tegevustüübi ikoon"
#: code:addons/knowledge/static/src/components/topbar/topbar.xml:0
#, python-format
msgid "Add Properties"
msgstr ""
msgstr "Lisa omadusi"
#. module: knowledge
#. odoo-javascript
@@ -1806,25 +1848,25 @@ msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_4
msgid "Age: 24"
msgstr ""
msgstr "Vanus 24"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_2
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_3
msgid "Age: 29"
msgstr ""
msgstr "Vanus: 29"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_1
msgid "Age: 42"
msgstr ""
msgstr "Vanus: 42"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
#, python-format
msgid "All Comments"
msgstr ""
msgstr "Kõik kommentaarid"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_product_catalog
@@ -2023,6 +2065,7 @@ msgstr "Artikli üksuse rekvisiidid"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2134,7 +2177,7 @@ msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_company_newsletter
msgid "BOOK NOW"
msgstr ""
msgstr "BRONEERI NÜÜD"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sales_playbook
@@ -2308,7 +2351,7 @@ msgstr "Saab lugeda"
#: model:ir.model.fields.selection,name:knowledge.selection__knowledge_article_member__permission__write
#: model:ir.model.fields.selection,name:knowledge.selection__knowledge_invite__permission__write
msgid "Can edit"
msgstr ""
msgstr "Saab muuta"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__is_article_visible_by_everyone
@@ -2393,7 +2436,7 @@ msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_hr_faq
msgid "Car_Catalog.png"
msgstr ""
msgstr "Car_Catalog.png"
#. module: knowledge
#. odoo-javascript
@@ -2974,7 +3017,7 @@ msgstr "MUUDA"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Muuda"
@@ -2982,27 +3025,27 @@ msgstr "Muuda"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_personas
msgid "Education:"
msgstr ""
msgstr "Haridus:"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_1
msgid "Education: Bachelor's degree in Marketing"
msgstr ""
msgstr "Haridus: Turunuduse bakalaureusekraad"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_2
msgid "Education: High school diploma"
msgstr ""
msgstr "Haridus: keskkooli diplom"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_3
msgid "Education: PhD."
msgstr ""
msgstr "Haridus: doktorikraad"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_4
msgid "Education: Student"
msgstr ""
msgstr "Haridus: tudeng"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_company_newsletter
@@ -3192,6 +3235,13 @@ msgstr ""
msgid "Gender(s): W"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4130,7 +4180,7 @@ msgstr "Protokollid"
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_meeting_example_branding
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_meeting_minutes_template
msgid "Meeting Minutes Template"
msgstr ""
msgstr "Koosoleku protokolli mall"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_form
@@ -4267,15 +4317,6 @@ msgstr ""
msgid "Move to Workspace"
msgstr "Liiguta tööalale"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4456,11 +4497,6 @@ msgstr ""
msgid "No template yet."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -4491,7 +4527,7 @@ msgstr "Vigade arv"
#: model:ir.model.fields,help:knowledge.field_knowledge_article__message_needaction_counter
#: model:ir.model.fields,help:knowledge.field_knowledge_article_thread__message_needaction_counter
msgid "Number of messages requiring action"
msgstr ""
msgstr "Tegevust nõudvate sõnumite arv"
#. module: knowledge
#: model:ir.model.fields,help:knowledge.field_knowledge_article__message_has_error_counter
@@ -4549,6 +4585,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "Käimasolev"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -4598,7 +4641,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -4925,7 +4968,7 @@ msgstr "Hinnangud"
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid "Read"
msgstr ""
msgstr "Loe"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_invite__partner_ids
@@ -4991,7 +5034,6 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5226,11 +5268,6 @@ msgstr "Sektsioon"
msgid "See a doctor and send us the sick note."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -5652,6 +5689,15 @@ msgstr ""
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr "Artikkel '%s' vajab vähemalt ühte kasutajat \"Kirjutamise\" õigustega."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6167,6 +6213,13 @@ msgstr "Tööala"
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid "Write"
msgstr "Kirjuta"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr ""
#. module: knowledge
@@ -6258,6 +6311,15 @@ msgstr ""
msgid "You can't leave an article for which you are the last writer"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
@@ -6460,12 +6522,12 @@ msgstr "nt. hooned"
#: code:addons/knowledge/static/src/components/item_calendar_props_dialog/item_calendar_props_dialog.xml:0
#, python-format
msgid "e.g. Meetings"
msgstr ""
msgstr "nt. Koosolekud"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_stage_view_form
msgid "e.g. Ongoing"
msgstr ""
msgstr "nt. Käimasolev"
#. module: knowledge
#. odoo-javascript
+73 -34
View File
@@ -16,15 +16,17 @@
# Martin Trigaux, 2023
# Hamid Darabi, 2023
# Hamed Mohammadi <hamed@dehongi.com>, 2023
# Hanna Kheradroosta, 2023
# Abbas Ebadian, 2024
# Hanna Kheradroosta, 2024
# Mostafa Barmshory <mostafa.barmshory@gmail.com>, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Hanna Kheradroosta, 2023\n"
"Last-Translator: Mostafa Barmshory <mostafa.barmshory@gmail.com>, 2024\n"
"Language-Team: Persian (https://app.transifex.com/odoo/teams/41243/fa/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -86,6 +88,16 @@ msgstr ""
msgid "#Is Favorite"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1044,6 +1056,13 @@ msgid ""
"here by clicking on the 📗 icon in the chatter.</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -1932,7 +1951,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_stage_view_search
#, python-format
msgid "Article"
msgstr ""
msgstr "بند"
#. module: knowledge
#. odoo-python
@@ -1957,6 +1976,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2021,7 +2041,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_view_search
#, python-format
msgid "Articles"
msgstr ""
msgstr "بندها"
#. module: knowledge
#. odoo-python
@@ -2903,7 +2923,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "ویرایش"
@@ -2941,7 +2961,7 @@ msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sales_playbook
msgid "Email:"
msgstr ""
msgstr "ایمیل:"
#. module: knowledge
#. odoo-javascript
@@ -3121,6 +3141,13 @@ msgstr ""
msgid "Gender(s): W"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -3435,7 +3462,7 @@ msgstr ""
#: code:addons/knowledge/static/src/js/wysiwyg.js:0
#, python-format
msgid "Index"
msgstr ""
msgstr "شاخص"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_product_catalog
@@ -3746,7 +3773,7 @@ msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sales_playbook
msgid "Job Position:"
msgstr ""
msgstr "موقعیت شغلی:"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_view_form
@@ -4197,15 +4224,6 @@ msgstr ""
msgid "Move to Workspace"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4386,11 +4404,6 @@ msgstr ""
msgid "No template yet."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -4421,7 +4434,7 @@ msgstr "تعداد خطاها"
#: model:ir.model.fields,help:knowledge.field_knowledge_article__message_needaction_counter
#: model:ir.model.fields,help:knowledge.field_knowledge_article_thread__message_needaction_counter
msgid "Number of messages requiring action"
msgstr ""
msgstr "تعداد پیام هایی که نیاز به اقدام دارند"
#. module: knowledge
#: model:ir.model.fields,help:knowledge.field_knowledge_article__message_has_error_counter
@@ -4479,6 +4492,13 @@ msgstr ""
msgid "Ongoing"
msgstr "در دست اقدام"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -4528,7 +4548,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -4855,7 +4875,7 @@ msgstr "رتبه‌ها"
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid "Read"
msgstr ""
msgstr "خوانده شده"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_invite__partner_ids
@@ -4921,7 +4941,6 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5156,11 +5175,6 @@ msgstr "بخش"
msgid "See a doctor and send us the sick note."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -5582,6 +5596,15 @@ msgstr ""
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6095,6 +6118,13 @@ msgstr "فضای کار"
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid "Write"
msgstr "نوشتن"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr ""
#. module: knowledge
@@ -6186,6 +6216,15 @@ msgstr ""
msgid "You can't leave an article for which you are the last writer"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
@@ -6463,7 +6502,7 @@ msgstr ""
#. module: knowledge
#: model:ir.model.fields.selection,name:knowledge.selection__knowledge_article__user_permission__read
msgid "read"
msgstr ""
msgstr "خواندن"
#. module: knowledge
#. odoo-javascript
@@ -6492,7 +6531,7 @@ msgstr ""
#. module: knowledge
#: model:ir.model.fields.selection,name:knowledge.selection__knowledge_article__user_permission__write
msgid "write"
msgstr ""
msgstr "نوشتن"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_software_specification
+1082 -471
View File
File diff suppressed because it is too large Load Diff
+73 -27
View File
@@ -4,15 +4,16 @@
#
# Translators:
# Wil Odoo, 2023
# Jolien De Paepe, 2023
# Jolien De Paepe, 2024
# Manon Rondou, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Jolien De Paepe, 2023\n"
"Last-Translator: Manon Rondou, 2024\n"
"Language-Team: French (https://app.transifex.com/odoo/teams/41243/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -78,6 +79,19 @@ msgstr "# Employés :"
msgid "#Is Favorite"
msgstr "#Est favori"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\" est un élément d'article de \"%(article_name)s\" "
"et ne peut pas être restauré seul. Contactez le popriétaire de "
"\"%(article_name)s\" pour obtenir une restauration."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1392,6 +1406,15 @@ msgstr ""
"<span style=\"font-size: 14px;\">Vous avez besoin de ce document quelque "
"part ? Revenez ici en cliquant sur l'icône 📗 dans le chatter.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
"<span style=\"font-size: 14px;\">Vous ne savez pas comment faire ? Regardez "
"la vidéo ci-dessous 👇</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -2492,6 +2515,7 @@ msgstr "Propriétés de l'élément d'article"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -3497,7 +3521,7 @@ msgstr "MODIFIER"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Modifier"
@@ -3719,6 +3743,13 @@ msgstr "Genre : M"
msgid "Gender(s): W"
msgstr "Genre : F"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "Générez un article avec l'IA"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4831,17 +4862,6 @@ msgstr "Déplacer vers la corbeille"
msgid "Move to Workspace"
msgstr "Déplacer vers l'espace de travail"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
"Le déplacement vers la cible de %(article_name)s est ambigu, veuillez "
"préciser la catégorie."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -5022,11 +5042,6 @@ msgstr "Pas encore d'étape !"
msgid "No template yet."
msgstr "Pas encore de modèle."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "Vous ne savez pas comment vous y prendre ?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -5117,6 +5132,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "En cours"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "Seuls les utilisateurs internes peuvent accéder à cette vue."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5175,7 +5197,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5595,7 +5617,6 @@ msgstr "Supprimer des favoris"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5830,11 +5851,6 @@ msgstr "Section"
msgid "See a doctor and send us the sick note."
msgstr "Consultez un médecin et envoyez-nous le certificat médical."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "Voir comment cela fonctionne <i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -6302,6 +6318,17 @@ msgid "The article '%s' needs at least one member with 'Write' access."
msgstr ""
"L'article '%s' a besoin d'au moins un membre avec un accès en 'écriture'."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
"L'emplacement de destination de %(article_name)s est ambigu. Veuillez "
"préciser la catégorie."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6863,6 +6890,13 @@ msgstr "Espace de travail "
msgid "Write"
msgstr "Écrire"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "Écrivez un article sur"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6959,6 +6993,18 @@ msgid "You can't leave an article for which you are the last writer"
msgstr ""
"Vous ne pouvez pas quitter un article dont vous êtes le dernier auteur"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"Vous ne pouvez pas déplacer %(article_name)s sous %(item_name)s, car "
"%(item_name)s est un élément d'article. Convertissez %(item_name)s d'abord "
"en un article."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+61 -29
View File
@@ -13,26 +13,28 @@
# Leandro Noijovich <eliel.sorcerer@gmail.com>, 2023
# Yihya Hugirat <hugirat@gmail.com>, 2023
# Netta Waizer, 2023
# Roy Sayag, 2023
# NoaFarkash, 2023
# Lilach Gilliam <lilach.gilliam@gmail.com>, 2023
# שהאב חוסיין <shhab89@gmail.com>, 2023
# ZVI BLONDER <ZVIBLONDER@gmail.com>, 2023
# Martin Trigaux, 2023
# MichaelHadar, 2024
# Roy Sayag, 2024
# yael terner, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Martin Trigaux, 2023\n"
"Last-Translator: yael terner, 2024\n"
"Language-Team: Hebrew (https://app.transifex.com/odoo/teams/41243/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: he\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n"
#. module: knowledge
#. odoo-javascript
@@ -88,6 +90,16 @@ msgstr ""
msgid "#Is Favorite"
msgstr "#מועדף"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1050,6 +1062,13 @@ msgid ""
"here by clicking on the 📗 icon in the chatter.</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -1580,7 +1599,7 @@ msgstr "סוג פעילות"
#: code:addons/knowledge/static/src/components/topbar/topbar.xml:0
#, python-format
msgid "Add Properties"
msgstr ""
msgstr "הוסף מאפיינים"
#. module: knowledge
#. odoo-javascript
@@ -1965,6 +1984,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2913,7 +2933,7 @@ msgstr "עריכה"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "ערוך"
@@ -3131,6 +3151,13 @@ msgstr ""
msgid "Gender(s): W"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4206,15 +4233,6 @@ msgstr ""
msgid "Move to Workspace"
msgstr "העבר לסביבת עבודה"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4395,11 +4413,6 @@ msgstr ""
msgid "No template yet."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -4539,7 +4552,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -4838,7 +4851,7 @@ msgstr ""
#: model:knowledge.article,template_name:knowledge.knowledge_article_template_sprint_calendar_public_holiday
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sprint_calendar_public_holiday
msgid "Public Holidays"
msgstr ""
msgstr "חגים "
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_software_specification
@@ -4866,7 +4879,7 @@ msgstr "דירוגים"
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid "Read"
msgstr ""
msgstr "קריאה"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_invite__partner_ids
@@ -4932,7 +4945,6 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5167,11 +5179,6 @@ msgstr "סעיף"
msgid "See a doctor and send us the sick note."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -5593,6 +5600,15 @@ msgstr ""
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr "המאמר '%s' צריך לפחות חבר אחד עם גישת כתיבה."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6106,6 +6122,13 @@ msgstr "סביבת עבודה"
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid "Write"
msgstr "כתיבה"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr ""
#. module: knowledge
@@ -6197,6 +6220,15 @@ msgstr ""
msgid "You can't leave an article for which you are the last writer"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+6610
View File
File diff suppressed because it is too large Load Diff
+72 -27
View File
@@ -3,16 +3,16 @@
# * knowledge
#
# Translators:
# Abe Manyo, 2023
# Wil Odoo, 2023
# Abe Manyo, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Wil Odoo, 2023\n"
"Last-Translator: Abe Manyo, 2024\n"
"Language-Team: Indonesian (https://app.transifex.com/odoo/teams/41243/id/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -78,6 +78,19 @@ msgstr "# Karyawan:"
msgid "#Is Favorite"
msgstr "#Apakah Favorit"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\" adalah Item Artikel dari \"%(article_name)s\" dan "
"tidak dapat langsung dipulihkan. Hubungi pemilik \"%(article_name)s\" untuk "
"memulihkannya."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1389,6 +1402,15 @@ msgstr ""
"<span style=\"font-size: 14px;\">Butuh dokumen ini di tempat lain? Kembali "
"ke sini dengan mengeklik pada ikon 📗 di obrolan.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
"<span style=\"font-size: 14px;\">Tidak yakin bagaimana cara melakukannya? "
"Periksa video di bawah 👇</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -2485,6 +2507,7 @@ msgstr "Properti Item Artikel"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -3483,7 +3506,7 @@ msgstr "EDIT"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Edit"
@@ -3705,6 +3728,13 @@ msgstr "Jenis Kelamin: P"
msgid "Gender(s): W"
msgstr "Jenis Kelamin: W"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "Buat Artikel dengan AI"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4816,17 +4846,6 @@ msgstr "Pindahkan ke Tong Sampah"
msgid "Move to Workspace"
msgstr "Pindahkan ke Ruang Kerja"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
"Pindahkan ke target dari %(article_name)s bersifat ambigu, Anda harus "
"menentukan kategori."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -5007,11 +5026,6 @@ msgstr "Belum ada tahap!"
msgid "No template yet."
msgstr "Belum ada templat."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "Tidak yakin bagaimana melakukannya?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -5102,6 +5116,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "Terus-menerus"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "Hanya User Internal yang dapat mengakses tampilan ini."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5156,7 +5177,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5578,7 +5599,6 @@ msgstr "Hapus dari favorit"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5813,11 +5833,6 @@ msgstr "Bagian"
msgid "See a doctor and send us the sick note."
msgstr "Lihat dokter dan kirimkan kami surat sakit."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "Lihat bagaimana cara kerjanya <i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -6283,6 +6298,17 @@ msgid "The article '%s' needs at least one member with 'Write' access."
msgstr ""
"Artikel '%s' membutuhkan setidaknya satu anggota dengan akses 'Tulis'."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
"Tujuan pemindahan %(article_name)s ambigu, Anda harus menentukan "
"kategorinya."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6839,6 +6865,13 @@ msgstr "Ruang Kerja"
msgid "Write"
msgstr "Tulis"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "Tulis artikel mengenai"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6935,6 +6968,18 @@ msgstr ""
"Anda tidak dapat meninggalkan artikel saat Anda merupakan penulis "
"terakhirnya"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"Anda tidak dapat memindahkan %(article_name)s di bawah %(item_name)s, karena"
" %(item_name)s adalah item Artikel. Konversikan %(item_name)s menjadi "
"Artikel terlebih dahulu."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+6614
View File
File diff suppressed because it is too large Load Diff
+72 -27
View File
@@ -3,17 +3,17 @@
# * knowledge
#
# Translators:
# Marianna Ciofani, 2023
# Wil Odoo, 2023
# Sergio Zanchetta <primes2h@gmail.com>, 2023
# Marianna Ciofani, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Sergio Zanchetta <primes2h@gmail.com>, 2023\n"
"Last-Translator: Marianna Ciofani, 2024\n"
"Language-Team: Italian (https://app.transifex.com/odoo/teams/41243/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -79,6 +79,19 @@ msgstr "Numero di dipendenti:"
msgid "#Is Favorite"
msgstr "#È preferito"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\" è un elemento dell'articolo \"%(article_name)s\" e"
" non può essere ripristinato da solo. Contatta il proprietario di "
"\"%(article_name)s\" per ripristinarlo."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1391,6 +1404,15 @@ msgstr ""
"<span style=\"font-size: 14px;\">Hai bisogno di questo documento da qualche "
"parte? Torna qui e fai clic sull'icona 📗 nel chatter.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
"<span style=\"font-size: 14px;\">Non sei sicuro di come farlo? Guarda il "
"video 👇</span> "
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -2486,6 +2508,7 @@ msgstr "Proprietà elemento articolo"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -3487,7 +3510,7 @@ msgstr "MODIFICA"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Modifica"
@@ -3710,6 +3733,13 @@ msgstr "Genere: M"
msgid "Gender(s): W"
msgstr "Genere: F"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "Genera un articolo con l'IA"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4818,17 +4848,6 @@ msgstr "Sposta nel cestino"
msgid "Move to Workspace"
msgstr "Sposta in Spazio di lavoro"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
"Lo spostamento all'obiettivo di %(article_name)s è ambiguo, devi specificare"
" la categoria."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -5009,11 +5028,6 @@ msgstr "Ancora nessuna fase!"
msgid "No template yet."
msgstr "Ancora nessun modello!"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "Non sei sicuro di come procedere?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -5104,6 +5118,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "In corso"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "Solo gli utenti interni possono accedere a questa vista."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5159,7 +5180,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5579,7 +5600,6 @@ msgstr "Elimina dai preferiti"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5814,11 +5834,6 @@ msgstr "Sezione"
msgid "See a doctor and send us the sick note."
msgstr "Consulta un medico e inviaci il certificato."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "Guarda come funziona <i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -6286,6 +6301,17 @@ msgstr ""
"L'articolo \"%s\" necessita di almeno un membro con l'accesso \"in "
"scrittura\"."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
"La posizione di destinazione di %(article_name)s è ambigua, dovresti "
"specificare la categoria."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6844,6 +6870,13 @@ msgstr "Spazio di lavoro"
msgid "Write"
msgstr "Scrivi"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "Scrivi un articolo riguardo"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6937,6 +6970,18 @@ msgstr "Non è possibile salvare il preferito su questo articolo"
msgid "You can't leave an article for which you are the last writer"
msgstr "Non puoi abbandonare un articolo di cui sei l'ultimo scrittore"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"Non è possibile spostare %(article_name)s sotto %(item_name)s perché "
"%(item_name)s è un elemento articolo. È necessario convertire %(item_name)s "
"in articolo."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+73 -33
View File
@@ -4,17 +4,17 @@
#
# Translators:
# Norimichi Sugimoto <norimichi.sugimoto@tls-ltd.co.jp>, 2023
# Ryoko Tsuda <ryoko@quartile.co>, 2023
# Junko Augias, 2023
# Wil Odoo, 2023
# Ryoko Tsuda <ryoko@quartile.co>, 2024
# Junko Augias, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Wil Odoo, 2023\n"
"Last-Translator: Junko Augias, 2024\n"
"Language-Team: Japanese (https://app.transifex.com/odoo/teams/41243/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -76,6 +76,17 @@ msgstr "従業員数:"
msgid "#Is Favorite"
msgstr "#お気に入り"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\"は\"%(article_name)s\"の記事アイテムであり、単独で復元することはできません。代わりに\"%(article_name)s\"の所有者に連絡して復元を依頼して下さい。"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -921,7 +932,7 @@ msgstr ""
" — これは\n"
" <span style=\"font-weight: bolder;\"><font class=\"text-o-color-2\">あなたのものです</font></span>、\n"
" ご自分用にしておきましょう。\n"
" (<span style=\"font-style: italic;\">下書き、 Todoリスト..</span>)\n"
" (<span style=\"font-style: italic;\">ドラフト、 Todoリスト..</span>)\n"
" </span>"
#. module: knowledge
@@ -1364,6 +1375,13 @@ msgstr ""
"<span style=\"font-size: "
"14px;\">このドキュメントがどこかで必要ですか?チャターの📗アイコンをクリックしてここに戻って来て下さい。</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr "<span style=\"font-size: 14px;\">やり方がわからない場合は、以下の動画をご覧下さい 👇</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -2420,6 +2438,7 @@ msgstr "記事項目プロパティ"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2767,7 +2786,7 @@ msgstr "ユーザは記事を見ることができますか?"
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_invite_view_form
#, python-format
msgid "Cancel"
msgstr "キャンセル"
msgstr "取消"
#. module: knowledge
#. odoo-python
@@ -3386,7 +3405,7 @@ msgstr "編集"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "編集"
@@ -3544,7 +3563,7 @@ msgstr "ファイル"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.portal_my_home_knowledge
msgid "Find all articles shared with you"
msgstr "共有された全てのドキュメントを見る"
msgstr "共有されたすべてのドキュメントを参照できます。"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article_stage__fold
@@ -3604,6 +3623,13 @@ msgstr "性別: 男性"
msgid "Gender(s): W"
msgstr "性別: 女性"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "AIで記事を作成"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4537,7 +4563,7 @@ msgstr "メディア"
#: model:knowledge.article,template_name:knowledge.knowledge_article_template_sprint_calendar_meeting
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sprint_calendar_meeting
msgid "Meeting"
msgstr "打ち合わせ"
msgstr "ミーティング"
#. module: knowledge
#: model:knowledge.article,template_name:knowledge.knowledge_article_template_meeting_example_branding
@@ -4664,7 +4690,7 @@ msgstr "記事を移動"
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#, python-format
msgid "Move cancelled"
msgstr "移動がキャンセルされました。"
msgstr "移動が取消ルされました。"
#. module: knowledge
#. odoo-javascript
@@ -4694,15 +4720,6 @@ msgstr "ゴミ箱に移動"
msgid "Move to Workspace"
msgstr "移動先ワークスペース"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr "%(article_name)sのターゲットへの移動が曖昧なので、カテゴリを指定する必要があります。"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4883,11 +4900,6 @@ msgstr "ステージがまだありません!"
msgid "No template yet."
msgstr "テンプレートがありません。"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "どうすればいいかわからないのですか?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -4978,6 +4990,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "処理中"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "内部ユーザのみがこのビューにアクセスできます。"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5027,7 +5046,7 @@ msgstr "おっと、ファイル%sが見つかりません。ファイルを再
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5437,7 +5456,6 @@ msgstr "お気に入りから削除"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5672,11 +5690,6 @@ msgstr "セクション"
msgid "See a doctor and send us the sick note."
msgstr "医者に診てもらい、診断書を送って下さい。"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "仕組みを見る<i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -6139,6 +6152,15 @@ msgstr "未来の起業家フェア"
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr "記事'%s'には、'執筆'アクセス権を持つメンバが少なくとも一人必要です。"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr "%(article_name)sの宛先の配置が曖昧なので、カテゴリを指定する必要があります。"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6512,13 +6534,13 @@ msgstr "すでに次が待ち遠しいです🏃"
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__website_message_ids
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article_thread__website_message_ids
msgid "Website Messages"
msgstr "サイトメッセージ"
msgstr "ウェブサイトメッセージ"
#. module: knowledge
#: model:ir.model.fields,help:knowledge.field_knowledge_article__website_message_ids
#: model:ir.model.fields,help:knowledge.field_knowledge_article_thread__website_message_ids
msgid "Website communication history"
msgstr "サイト通信履歴"
msgstr "ウェブサイト通信履歴"
#. module: knowledge
#. odoo-python
@@ -6667,6 +6689,13 @@ msgstr "ワークスペース"
msgid "Write"
msgstr "書く"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "以下についての記事を書く:"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6757,6 +6786,17 @@ msgstr "この記事のお気に入りは保存できません。"
msgid "You can't leave an article for which you are the last writer"
msgstr "自分が最後の執筆者である記事を残すことはできません。"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"%(article_name)s を "
"%(item_name)sの下に移動することはできません。%(item_name)sは記事項目であるためです。%(item_name)sをまずは記事に変換して下さい。"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+61 -24
View File
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"PO-Revision-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2024-01-26 16:09+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -69,6 +69,16 @@ msgstr ""
msgid "#Is Favorite"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1027,6 +1037,13 @@ msgid ""
"here by clicking on the 📗 icon in the chatter.</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -1940,6 +1957,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2886,7 +2904,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr ""
@@ -3104,6 +3122,13 @@ msgstr ""
msgid "Gender(s): W"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4179,15 +4204,6 @@ msgstr ""
msgid "Move to Workspace"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4368,11 +4384,6 @@ msgstr ""
msgid "No template yet."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -4461,6 +4472,13 @@ msgstr ""
msgid "Ongoing"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -4510,7 +4528,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -4903,7 +4921,6 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5138,11 +5155,6 @@ msgstr ""
msgid "See a doctor and send us the sick note."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -5560,6 +5572,15 @@ msgstr ""
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6075,6 +6096,13 @@ msgstr ""
msgid "Write"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6164,6 +6192,15 @@ msgstr ""
msgid "You can't leave an article for which you are the last writer"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+42 -23
View File
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Sarah Park, 2023\n"
"Language-Team: Korean (https://app.transifex.com/odoo/teams/41243/ko/)\n"
@@ -1369,6 +1369,13 @@ msgstr ""
"<span style=\"font-size: 14px;\">이 문서를 어딘가에 사용하셔야 하나요? 메시지창에서 📗 아이콘을 클릭하시면 "
"바로 돌아올 수 있습니다.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -3391,7 +3398,7 @@ msgstr "편집"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "편집"
@@ -3609,6 +3616,13 @@ msgstr "성별: 남성"
msgid "Gender(s): W"
msgstr "성별: 여성"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4703,15 +4717,6 @@ msgstr "휴지통으로 이동"
msgid "Move to Workspace"
msgstr "저장공간으로 이동"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr "%(article_name)s 대상으로 이동할 수 없습니다. 카테고리를 지정해야 합니다."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4892,11 +4897,6 @@ msgstr "아직 단계가 없습니다!"
msgid "No template yet."
msgstr "아직 서식이 없습니다."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "진행 방법을 잘 모르시겠다고요?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -5036,7 +5036,7 @@ msgstr "%s 파일을 찾을 수 없습니다. 파일을 다시 업로드하시
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5446,7 +5446,6 @@ msgstr "즐겨찾기에서 삭제"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5681,11 +5680,6 @@ msgstr "구분"
msgid "See a doctor and send us the sick note."
msgstr "의사의 진찰을 받은 후 진단서를 보내주세요."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "진행 방식 보기 <i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -6145,6 +6139,15 @@ msgstr "미래 창업 박람회"
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr " '%s' 게시물에는 '쓰기' 권한을 가진 구성원이 한 명 이상 있어야 합니다."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr "%(article_name)s 최종 위치가 정확하지 않습니다. 카테고리를 지정하세요."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6683,6 +6686,13 @@ msgstr "저장공간"
msgid "Write"
msgstr "쓰기"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6774,6 +6784,15 @@ msgstr "이 게시물에서 즐겨찾기를 저장할 수 없습니다."
msgid "You can't leave an article for which you are the last writer"
msgstr "마지막 작성자인 경우 게시물에서 나갈 수 없습니다."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+67 -30
View File
@@ -3,22 +3,22 @@
# * knowledge
#
# Translators:
# Will Sensors, 2023
# Anzelika Adejanova, 2023
# Armīns Jeltajevs <armins.jeltajevs@gmail.com>, 2023
# Arnis Putniņš <arnis@allegro.lv>, 2023
# Martin Trigaux, 2023
# Konstantins Zabogonskis <inculin4ik@gmail.com>, 2023
# ievaputnina <ievai.putninai@gmail.com>, 2023
# JanisJanis <jbojars@gmail.com>, 2023
# Will Sensors, 2024
# ievaputnina <ievai.putninai@gmail.com>, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: JanisJanis <jbojars@gmail.com>, 2023\n"
"Last-Translator: ievaputnina <ievai.putninai@gmail.com>, 2024\n"
"Language-Team: Latvian (https://app.transifex.com/odoo/teams/41243/lv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -80,6 +80,16 @@ msgstr ""
msgid "#Is Favorite"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1038,6 +1048,13 @@ msgid ""
"here by clicking on the 📗 icon in the chatter.</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -1951,6 +1968,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2590,7 +2608,7 @@ msgstr ""
#: code:addons/knowledge/static/src/components/topbar/topbar.xml:0
#, python-format
msgid "Cover"
msgstr ""
msgstr "Nosegt"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_cover__attachment_url
@@ -2897,7 +2915,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Labot"
@@ -3115,6 +3133,13 @@ msgstr ""
msgid "Gender(s): W"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4190,15 +4215,6 @@ msgstr ""
msgid "Move to Workspace"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4379,11 +4395,6 @@ msgstr ""
msgid "No template yet."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -4414,7 +4425,7 @@ msgstr "Kļūdu skaits"
#: model:ir.model.fields,help:knowledge.field_knowledge_article__message_needaction_counter
#: model:ir.model.fields,help:knowledge.field_knowledge_article_thread__message_needaction_counter
msgid "Number of messages requiring action"
msgstr ""
msgstr "To ziņojumu skaits, kuros nepieciešama rīcība"
#. module: knowledge
#: model:ir.model.fields,help:knowledge.field_knowledge_article__message_has_error_counter
@@ -4472,6 +4483,13 @@ msgstr ""
msgid "Ongoing"
msgstr "Ongoing"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -4521,7 +4539,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -4841,7 +4859,7 @@ msgstr ""
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__rating_ids
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article_thread__rating_ids
msgid "Ratings"
msgstr ""
msgstr "Reitingi"
#. module: knowledge
#. odoo-python
@@ -4914,7 +4932,6 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5149,11 +5166,6 @@ msgstr "Sadaļa"
msgid "See a doctor and send us the sick note."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -5491,7 +5503,7 @@ msgstr ""
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__template_description
msgid "Template Description"
msgstr ""
msgstr "Sagataves apraksts"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_template_view_search
@@ -5575,6 +5587,15 @@ msgstr ""
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6090,6 +6111,13 @@ msgstr ""
msgid "Write"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6179,6 +6207,15 @@ msgstr ""
msgid "You can't leave an article for which you are the last writer"
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+6633
View File
File diff suppressed because it is too large Load Diff
+85 -41
View File
@@ -6,16 +6,16 @@
# Yenthe Van Ginneken <yenthespam@gmail.com>, 2023
# Martin Trigaux, 2023
# Wil Odoo, 2023
# Jolien De Paepe, 2023
# Erwin van der Ploeg <erwin@odooexperts.nl>, 2023
# Jolien De Paepe, 2024
# Erwin van der Ploeg <erwin@odooexperts.nl>, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Erwin van der Ploeg <erwin@odooexperts.nl>, 2023\n"
"Last-Translator: Erwin van der Ploeg <erwin@odooexperts.nl>, 2024\n"
"Language-Team: Dutch (https://app.transifex.com/odoo/teams/41243/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -81,6 +81,19 @@ msgstr "# Medewerkers:"
msgid "#Is Favorite"
msgstr "#Is Favoriet"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\" is een artikelitem van \"%(article_name)s\" en kan"
" niet op zichzelf worden hersteld. Neem contact op met de eigenaar van "
"\"%(article_name)s\" om het te laten herstellen."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1331,6 +1344,15 @@ msgstr ""
"<span style=\"font-size: 14px;\">Heb je dit document ergens nodig? Kom hier "
"terug door op het 📗-pictogram in de chatter te klikken.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
"<span style=\"font-size: 14px;\">Weet je niet zeker hoe het moet? Bekijk dan"
" zeker onderstaande video 👇</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -1886,7 +1908,7 @@ msgstr "Toegang beperkt. Mag niet met iedereen worden gedeeld van"
#. module: knowledge
#: model:knowledge.article,template_name:knowledge.knowledge_article_template_account_management
msgid "Account Management"
msgstr "Rekeningenbeheer"
msgstr "Accountbeheer"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_account_management
@@ -2372,6 +2394,7 @@ msgstr "Eigenschappen van artikelitem"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2537,7 +2560,7 @@ msgstr "Boekjes voor een totale prijs &gt; $1000"
#: model:knowledge.article,template_name:knowledge.knowledge_article_template_brand_assets
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid "Brand Assets"
msgstr "Brand Assets"
msgstr "Merkmiddelen"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_1
@@ -3367,11 +3390,11 @@ msgstr "Dupliceren"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_mail_invite
msgid "EDIT"
msgstr "BEWERK"
msgstr "BEWERKEN"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Bewerken"
@@ -3593,6 +3616,13 @@ msgstr "Geslacht(en): M"
msgid "Gender(s): W"
msgstr "Geslacht(en): W"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "Genereer een artikel met AI"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -3653,7 +3683,7 @@ msgstr ""
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_invite__have_share_partners
msgid "Have Share Partners"
msgstr "Deelpartners hebben"
msgstr "Is gedeeld met relaties"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
@@ -4703,17 +4733,6 @@ msgstr "Verplaatsen naar de prullenbak"
msgid "Move to Workspace"
msgstr "Naar werkruimte verplaatsen"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
"Verplaatsen naar doel van %(article_name)s is dubbelzinnig, je moet de "
"categorie specificeren."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4894,11 +4913,6 @@ msgstr "Nog geen fases!"
msgid "No template yet."
msgstr "Nog geen sjablonen."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "Ben je niet zeker hoe dit moet?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -4947,7 +4961,7 @@ msgstr "Doelstellingen met onze samenwerking"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_meeting_example_branding
msgid "Odoo Brand Assets"
msgstr "Odoo Brand Assets"
msgstr "Odoo Merkmiddelen"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_company_newsletter
@@ -4989,6 +5003,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "Lopend"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "Alleen interne gebruikers hebben toegang tot deze weergave."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5044,7 +5065,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5098,7 +5119,7 @@ msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_shared_todos
msgid "Otherwise, feel free to handle others listed below:"
msgstr "Anders kunt u gerust de onderstaande personen behandelen:"
msgstr "Anders kun je gerust de onderstaande personen behandelen:"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_hr_faq
@@ -5463,7 +5484,6 @@ msgstr "Verwijder van favorieten"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5495,7 +5515,7 @@ msgstr "Beantwoorden"
#: code:addons/knowledge/static/src/components/knowledge_cover/knowledge_cover.xml:0
#, python-format
msgid "Reposition"
msgstr "Verplaatse"
msgstr "Verplaatsen"
#. module: knowledge
#. odoo-javascript
@@ -5610,7 +5630,7 @@ msgstr "Verkoopdetails"
#: model:knowledge.article,template_name:knowledge.knowledge_article_template_sales_playbook
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sales_playbook
msgid "Sales Playbook"
msgstr "Sales Playbook"
msgstr "Verkoopdraaiboek"
#. module: knowledge
#. odoo-javascript
@@ -5698,11 +5718,6 @@ msgstr "Sectie"
msgid "See a doctor and send us the sick note."
msgstr "Ga naar de dokter en stuur ons een ziektebriefje."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "Zie hoe het werkt <i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -5789,7 +5804,7 @@ msgstr "Minder tonen"
#: code:addons/knowledge/static/src/components/topbar/topbar.xml:0
#, python-format
msgid "Show Properties"
msgstr "Eigendommen tonen"
msgstr "Eigenschappen tonen"
#. module: knowledge
#. odoo-javascript
@@ -5947,7 +5962,7 @@ msgstr ""
#: model:knowledge.article,template_name:knowledge.knowledge_article_template_sprint_calendar
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sprint_calendar
msgid "Sprint Calendar"
msgstr "Sprint Kalender"
msgstr "Sprintkalender"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_stage_view_form
@@ -6057,7 +6072,7 @@ msgstr "Sjabloon"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__template_body
msgid "Template Body"
msgstr "Sjabloonlichaam"
msgstr "Inhoud sjabloon"
#. module: knowledge
#: model:ir.actions.act_window,name:knowledge.knowledge_article_template_category_action
@@ -6088,7 +6103,7 @@ msgstr "Sjabloonitems"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__template_preview
msgid "Template Preview"
msgstr "Sjabloon preview"
msgstr "Sjabloon voorbeeld"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__template_sequence
@@ -6099,7 +6114,7 @@ msgstr "Sjabloonreeks"
#: model:ir.actions.act_window,name:knowledge.knowledge_article_template_stage_action
#: model:ir.ui.menu,name:knowledge.knowledge_article_template_stage_menu
msgid "Template Stages"
msgstr "Sjabloonstadia"
msgstr "Sjabloonfases"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__template_name
@@ -6167,6 +6182,17 @@ msgstr "De Ondernemersbeurs van de Toekomst"
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr "Het artikel '%s' heeft minimaal één lid nodig met 'schrijf'-toegang."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
"De doelbestemming van %(article_name)s is dubbelzinnig. Specifieer de "
"categorie."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6727,6 +6753,13 @@ msgstr "Werkruimte"
msgid "Write"
msgstr "Schrijven"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "Schrijf een artikel over"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6818,6 +6851,17 @@ msgstr "Je kan dit artikel niet als favoriet opslaan"
msgid "You can't leave an article for which you are the last writer"
msgstr "Je kunt geen artikel achterlaten waarvan je de laatste schrijver bent"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"Je kan %(article_name)s niet onder %(item_name)s verplaatsen, aangezien "
"%(item_name)s een artikelitem is. Zet eerst %(item_name)s om in een artikel."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+42 -25
View File
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Wil Odoo, 2023\n"
"Language-Team: Polish (https://app.transifex.com/odoo/teams/41243/pl/)\n"
@@ -1237,6 +1237,13 @@ msgstr ""
"<span style=\"font-size: 14px;\">Potrzebujesz gdzieś tego dokumentu? Wróć "
"tutaj, klikając ikonę 📗 w rozmowie.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -3149,7 +3156,7 @@ msgstr "EDYTUJ"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Edytuj"
@@ -3367,6 +3374,13 @@ msgstr ""
msgid "Gender(s): W"
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4454,17 +4468,6 @@ msgstr "Przenieś do kosza"
msgid "Move to Workspace"
msgstr "Przejdź do obszaru roboczego"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
"Przeniesienie do docelowego artykułu %(article_name)s jest niejednoznaczne, "
"powinieneś wyszczególnić kategorię."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4645,11 +4648,6 @@ msgstr "Nie ma jeszcze etapu!"
msgid "No template yet."
msgstr "Nie ma jeszcze szablonu."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "Nie wiesz, jak to zrobić?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -4792,7 +4790,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5189,7 +5187,6 @@ msgstr "Usuń z ulubionych"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5424,11 +5421,6 @@ msgstr "Sekcja"
msgid "See a doctor and send us the sick note."
msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "Zobacz, jak to działa <i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -5853,6 +5845,15 @@ msgid "The article '%s' needs at least one member with 'Write' access."
msgstr ""
"Ten artykuł '%s' wymaga przynajmniej jednej osoby z dostępem \"do pisania\"."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6384,6 +6385,13 @@ msgstr "Przestrzeń robocza"
msgid "Write"
msgstr "Pisz"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr ""
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6475,6 +6483,15 @@ msgstr "Nie można zapisać ulubionych w tym artykule"
msgid "You can't leave an article for which you are the last writer"
msgstr "Nie możesz opuścić artykułu, którego ostatnim twórcą jesteś Ty"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+6634
View File
File diff suppressed because it is too large Load Diff
+73 -28
View File
@@ -5,17 +5,17 @@
# Translators:
# Éder Brito <britoederr@gmail.com>, 2023
# Martin Trigaux, 2023
# Maitê Dietze, 2023
# Wil Odoo, 2023
# Layna Nascimento, 2023
# a75f12d3d37ea5bf159c4b3e85eb30e7_0fa6927, 2023
# Maitê Dietze, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Layna Nascimento, 2023\n"
"Last-Translator: Maitê Dietze, 2024\n"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/odoo/teams/41243/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -81,6 +81,19 @@ msgstr "Nº de funcionários:"
msgid "#Is Favorite"
msgstr "#É favorito"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\" é um item de artigo de \"%(article_name)s\" e não "
"pode ser restaurado sozinho. Entre em contato com o proprietário do "
"\"%(article_name)s\" para restaurá-lo."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1392,6 +1405,15 @@ msgstr ""
"<span style=\"font-size: 14px;\">Precisa desse documento em algum lugar? "
"Volte até aqui clicando no ícone 📗 do chatter.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
"<span style=\"font-size: 14px;\">Não sabe muito bem como fazer isso? Confira"
" o vídeo abaixo 👇</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -2487,6 +2509,7 @@ msgstr "Propriedades do item do artigo"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -3488,7 +3511,7 @@ msgstr "EDITAR"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Editar"
@@ -3710,6 +3733,13 @@ msgstr "Gênero(s): M"
msgid "Gender(s): W"
msgstr "Gênero(s): F"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "Gerar um artigo com IA"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -4362,7 +4392,7 @@ msgstr "Cargo:"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_view_form
msgid "Join"
msgstr "Participar"
msgstr "Entrar"
#. module: knowledge
#. odoo-javascript
@@ -4817,16 +4847,6 @@ msgstr "Mover para a lixeira"
msgid "Move to Workspace"
msgstr "Mover para o espaço de trabalho"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
"Mover para destino de %(article_name)s é ambíguo. Especifique a categoria."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -5007,11 +5027,6 @@ msgstr "Nenhum estágio ainda."
msgid "No template yet."
msgstr "Nenhum modelo ainda."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "Não tem certeza de como fazer?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -5102,6 +5117,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "Em andamento"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "Somente usuários internos podem acessar essa visualização."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5159,7 +5181,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5582,7 +5604,6 @@ msgstr "Remover dos favoritos"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5817,11 +5838,6 @@ msgstr "Seção"
msgid "See a doctor and send us the sick note."
msgstr "Consulte um médico e nos envie o atestado."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "Veja como funciona <i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -6288,6 +6304,17 @@ msgstr "Feira do empreendedorismo do futuro"
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr "O artigo \"%s\" precisa ter pelo menos um membro com acesso \"Editar\"."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
"O posicionamento de destino de %(article_name)s é ambíguo. Especifique a "
"categoria."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6842,6 +6869,13 @@ msgstr "Espaço de trabalho"
msgid "Write"
msgstr "Editar"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "Escreva um artigo sobre"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6934,6 +6968,17 @@ msgstr "Você não pode salvar favoritos nesse artigo"
msgid "You can't leave an article for which you are the last writer"
msgstr "Você não pode sair de um artigo em que você é o último editor"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"Você não pode mover %(article_name)s para %(item_name)s pois %(item_name)s é"
" um item de artigo. Converta o %(item_name)sem um Artigo primeiro."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+6683
View File
File diff suppressed because it is too large Load Diff
+7431
View File
File diff suppressed because it is too large Load Diff
+6671
View File
File diff suppressed because it is too large Load Diff
+6643
View File
File diff suppressed because it is too large Load Diff
+607 -340
View File
File diff suppressed because it is too large Load Diff
+6680
View File
File diff suppressed because it is too large Load Diff
+1363 -629
View File
File diff suppressed because it is too large Load Diff
+6649
View File
File diff suppressed because it is too large Load Diff
+714 -279
View File
File diff suppressed because it is too large Load Diff
+101 -55
View File
@@ -3,16 +3,16 @@
# * knowledge
#
# Translators:
# Thi Huong Nguyen, 2023
# Wil Odoo, 2023
# Thi Huong Nguyen, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Wil Odoo, 2023\n"
"Last-Translator: Thi Huong Nguyen, 2024\n"
"Language-Team: Vietnamese (https://app.transifex.com/odoo/teams/41243/vi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -49,7 +49,7 @@ msgid ""
"\"%(article_name)s\" is a template and can not be a child of an article "
"(\"%(parent_article_name)s\")."
msgstr ""
"\"%(article_name)s\" là mẫu và không thể là con của một bài viết "
"\"%(article_name)s\" là mẫu và không thể là phần phụ của một bài viết "
"(\"%(parent_article_name)s\")."
#. module: knowledge
@@ -60,7 +60,7 @@ msgid ""
"\"%(article_name)s\" is an article and can not be a child of a template "
"(\"%(parent_article_name)s\").\""
msgstr ""
"\"%(article_name)s\" là bài viết và không thể là con của một mẫu "
"\"%(article_name)s\" là bài viết và không thể là phần phụ của một mẫu "
"(\"%(parent_article_name)s\").\""
#. module: knowledge
@@ -78,6 +78,19 @@ msgstr "# nhân viên:"
msgid "#Is Favorite"
msgstr "#Là yêu thích"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\" là một Hạng mục bài viết từ \"%(article_name)s\" "
"và không thể tự khôi phục được. Hãy liên hệ với chủ sở hữu của "
"\"%(article_name)s\" để khôi phục nó."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1298,7 +1311,7 @@ msgstr ""
" </span>\n"
" bằng cách mở\n"
" <span style=\"font-weight: bolder;\">\n"
" <font class=\"text-o-color-2\">Khung nhập lệnh</font>\n"
" <font class=\"text-o-color-2\">Bảng lệnh</font>\n"
" </span>\n"
" (Ctrl + k/⌘ + k) sau đó tìm kiếm các bài viết bằng cách bắt đầu truy vấn với\n"
" \"<span style=\"font-weight: bolder;\">?</span>\".\n"
@@ -1386,6 +1399,15 @@ msgstr ""
"<span style=\"font-size: 14px;\">Bạn cần tài liệu này ở đâu đó? Hãy quay lại"
" đây bằng cách nhấp vào biểu tượng 📗 trong cửa sổ trò chuyện.</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr ""
"<span style=\"font-size: 14px;\">Bạn không rõ cách làm? Hãy xem video dưới "
"đây 👇</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -2402,7 +2424,7 @@ msgid ""
msgstr ""
"Bạn có chắc chắn muốn khôi phục quyền truy cập không? Điều này đồng nghĩa "
"với việc bài viết này giờ đây sẽ kế thừa mọi quyền truy cập được thiết lập "
"trên các bài viết cha của nó."
"trên các bài viết chính của nó."
#. module: knowledge
#. odoo-javascript
@@ -2414,7 +2436,7 @@ msgid ""
msgstr ""
"Bạn có chắc chắn muốn hạn chế quyền truy cập vào bài viết này không? Điều "
"này đồng nghĩa với việc bài viết sẽ không còn kế thừa quyền truy cập từ các "
"bài viết cha của nó nữa."
"bài viết chính của nó nữa."
#. module: knowledge
#. odoo-javascript
@@ -2484,6 +2506,7 @@ msgstr "Thuộc tính hạng mục bài viết"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2531,7 +2554,7 @@ msgstr ""
#. module: knowledge
#: model:ir.model.constraint,message:knowledge.constraint_knowledge_article_check_article_item_parent
msgid "Article items must have a parent."
msgstr "Các hạng mục bài viết phải có cha."
msgstr "Các hạng mục bài viết phải có hạng mục chính."
#. module: knowledge
#. odoo-python
@@ -2864,7 +2887,7 @@ msgid ""
"rights can not be inferred without a parent."
msgstr ""
"Không thể di chuyển %(article_name)s làm bài viết gốc của phần 'được chia "
"sẻ' vì không thể suy ra quyền truy cập nếu không có cha."
"sẻ' vì không thể suy ra quyền truy cập nếu không có phần chính."
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
@@ -2957,7 +2980,7 @@ msgstr "Thay đổi ảnh bìa"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__child_ids
msgid "Child Articles and Items"
msgstr "Hạng mục và bài viết con"
msgstr "Hạng mục và bài viết phụ"
#. module: knowledge
#. odoo-javascript
@@ -3394,7 +3417,7 @@ msgstr "Các bài viết huỷ đồng bộ phải có quyền nội bộ."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__is_desynchronized
msgid "Desyncronized with parents"
msgstr "Huỷ đồng bộ hóa với cha"
msgstr "Huỷ đồng bộ hóa với phần chính"
#. module: knowledge
#. odoo-javascript
@@ -3486,7 +3509,7 @@ msgstr "CHỈNH SỬA"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "Chỉnh sửa"
@@ -3708,6 +3731,13 @@ msgstr "Giới tính: Nam"
msgid "Gender(s): W"
msgstr "Giới tính: Nữ"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "Tạo một bài viết bằng AI"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_member_view_search
@@ -3750,20 +3780,20 @@ msgstr "Có quyền viết"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__has_item_children
msgid "Has article item children?"
msgstr "Có con của hạng mục bài viết?"
msgstr "Có phần phụ của hạng mục bài viết?"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__has_article_children
msgid "Has normal article children?"
msgstr "Có bài viết con bình thường?"
msgstr "Có phần phụ của bài viết bình thường?"
#. module: knowledge
#: model:ir.model.fields,help:knowledge.field_knowledge_article__user_has_access_parent_path
msgid ""
"Has the user access to each parent from current article until its root?"
msgstr ""
"Người dùng có quyền truy cập vào từng bài viết cha tính từ bài viết hiện tại"
" cho đến bài viết gốc của nó?"
"Người dùng có quyền truy cập vào từng bài viết chính tính từ bài viết hiện "
"tại cho đến bài viết gốc của nó?"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_invite__have_share_partners
@@ -3799,7 +3829,7 @@ msgid ""
msgstr ""
"Đây là những logo mà bạn có thể thoải mái sử dụng.\n"
" <br>\n"
" Chúng cũng có thể được chia sẻ với khách hàng, cánh nhà báo, và các đơn vị bán lại."
" Chúng cũng có thể được chia sẻ với khách hàng, các đơn vị báo chí, đơn vị bán lại."
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_product_catalog
@@ -3994,7 +4024,7 @@ msgid ""
"If set, this article won't inherit access rules from its parents anymore."
msgstr ""
"Nếu cài đặt, bài viết này sẽ không kế thừa các quy tắc truy cập từ bài viết "
"cha của nó."
"chính của nó."
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_post_mortem
@@ -4074,7 +4104,7 @@ msgstr "Quyền được kế thừa"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__inherited_permission_parent_id
msgid "Inherited Permission Parent Article"
msgstr "Bài viết cha có quyền được kế thừa"
msgstr "Bài viết chính có quyền được kế thừa"
#. module: knowledge
#. odoo-javascript
@@ -4268,7 +4298,7 @@ msgstr "Là mẫu"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__has_item_parent
msgid "Is the parent an Item?"
msgstr "Cha có phải là một hạng mục không?"
msgstr "Phần chính có phải là một hạng mục không?"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_post_mortem
@@ -4627,7 +4657,7 @@ msgstr ""
#. module: knowledge
#: model:knowledge.article,template_description:knowledge.knowledge_article_template_sprint_calendar
msgid "Manage your team schedule for the upcoming sprint."
msgstr ""
msgstr "Quản lý lịch làm việc của bộ phận cho cuộc chạy nước rút sắp tới."
#. module: knowledge
#. odoo-python
@@ -4818,17 +4848,6 @@ msgstr "Chuyển vào thùng rác"
msgid "Move to Workspace"
msgstr "Chuyển vào không gian làm việc"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr ""
"Mục tiêu chuyển đến của %(article_name)s không rõ ràng, bạn cần xác định "
"danh mục."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -5009,11 +5028,6 @@ msgstr "Chưa có giai đoạn nào!"
msgid "No template yet."
msgstr "Chưa có mẫu nào."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "Bạn không chắc chắn nên làm thế nào?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -5104,6 +5118,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "Đang diễn ra"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr "Chỉ Người dùng nội bộ mới có thể truy cập chế độ xem này."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5159,7 +5180,7 @@ msgstr ""
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5248,17 +5269,17 @@ msgstr "Điểm yếu (<em>đánh dấu vào mục liên quan</em>)"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__parent_id
msgid "Parent Article"
msgstr "Bài viết cha"
msgstr "Bài viết chính"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__parent_path
msgid "Parent Path"
msgstr "Tuyến cha"
msgstr "Tuyến chính"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_template_view_form
msgid "Parent Template"
msgstr "Mẫu cha"
msgstr "Mẫu chính"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article_member__partner_id
@@ -5455,7 +5476,7 @@ msgid ""
"Properties are fields that can only be added on articles that have a parent."
msgstr ""
"Thuộc tính là những trường chỉ có thể được thêm vào các bài viết có bài viết"
" cha."
" chính."
#. module: knowledge
#. odoo-javascript
@@ -5583,7 +5604,6 @@ msgstr "Xoá khỏi danh sách yêu thích"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5818,11 +5838,6 @@ msgstr "Phần"
msgid "See a doctor and send us the sick note."
msgstr "Hãy đến gặp bác sĩ và gửi cho chúng tôi phiếu khám bệnh."
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "Hãy xem cách thực hiện tại đây<i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -6084,7 +6099,8 @@ msgstr "Giai đoạn"
#. module: knowledge
#: model:ir.model.fields,help:knowledge.field_knowledge_article_stage__parent_id
msgid "Stages are shared among acommon parent and its children articles."
msgstr "Giai đoạn được chia sẻ giữa bài viết cha và các bài viết con của nó."
msgstr ""
"Giai đoạn được chia sẻ giữa bài viết chính và các bài viết phụ của nó."
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_account_management
@@ -6286,6 +6302,16 @@ msgstr "Hội chợ khởi nghiệp tương lai"
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr "Bài viết '%s' cần ít nhất một thành viên có quyền 'Viết'."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr ""
"Vị trí đích của %(article_name)s không rõ ràng, bạn cần xác định danh mục."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6324,7 +6350,7 @@ msgstr "Thành viên được chọn không tồn tại hoặc đã bị xóa."
#: model:ir.model.fields,help:knowledge.field_knowledge_article__sequence
msgid ""
"The sequence is computed only among the articles that have the same parent."
msgstr "Trình tự chỉ được tính trong số các bài viết có cùng cha."
msgstr "Trình tự chỉ được tính trong số các bài viết có cùng bài viết chính."
#. module: knowledge
#. odoo-javascript
@@ -6338,8 +6364,8 @@ msgstr "Thuộc tính ngày bắt đầu là bắt buộc."
msgid ""
"The subject is the title of the highest parent in the article hierarchy."
msgstr ""
"Chủ đề là tiêu đề của bài viết cha cao nhất trong hệ thống phân cấp bài "
"viết."
"Chủ đề là tiêu đề của bài viết chính có thứ tự cao nhất trong hệ thống phân "
"cấp bài viết."
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_company_newsletter
@@ -6415,7 +6441,8 @@ msgstr ""
#, python-format
msgid ""
"Those fields will be available on all articles that share the same parent."
msgstr "Những trường đó sẽ có sẵn trên tất cả bài viết có cùng cha."
msgstr ""
"Những trường đó sẽ có sẵn trên tất cả bài viết có cùng bài viết chính."
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article_thread__is_resolved
@@ -6843,6 +6870,13 @@ msgstr "Không gian làm việc"
msgid "Write"
msgstr "Viết"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "Viết một bài viết về"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6935,6 +6969,18 @@ msgstr "Bạn không thể đánh dấu yêu thích trên bài viết này"
msgid "You can't leave an article for which you are the last writer"
msgstr "Bạn không thể rời khỏi bài viết mà bạn là người viết cuối cùng"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"Bạn không thể di chuyển %(article_name)s dưới %(item_name)s, vì "
"%(item_name)s là một Hạng mục bài viết. Trước tiên hãy chuyển %(item_name)s "
"thành một Bài viết."
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
@@ -7113,7 +7159,7 @@ msgstr ""
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_trash_notification
msgid "and the following child article(s) have"
msgstr "và (các) bài viết con sau đây có"
msgstr "và (các) bài viết phụ sau đây có"
#. module: knowledge
#. odoo-javascript
+82 -40
View File
@@ -5,15 +5,17 @@
# Translators:
# Wil Odoo, 2023
# 山西清水欧度(QQ:54773801) <54773801@qq.com>, 2023
# Jeffery CHEN <jeffery9@gmail.com>, 2023
# Chloe Wang, 2024
# 湘子 南 <1360857908@qq.com>, 2024
# Jeffery CHEN <jeffery9@gmail.com>, 2024
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-26 22:20+0000\n"
"POT-Creation-Date: 2024-01-26 16:09+0000\n"
"PO-Revision-Date: 2023-10-26 23:10+0000\n"
"Last-Translator: Jeffery CHEN <jeffery9@gmail.com>, 2023\n"
"Last-Translator: Jeffery CHEN <jeffery9@gmail.com>, 2024\n"
"Language-Team: Chinese (China) (https://app.transifex.com/odoo/teams/41243/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -75,6 +77,18 @@ msgstr "# 员工:"
msgid "#Is Favorite"
msgstr "#是最喜欢的"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"\"%(article_item_name)s\" is an Article Item from \"%(article_name)s\" and "
"cannot be restored on its own. Contact the owner of \"%(article_name)s\" to "
"have it restored instead."
msgstr ""
"\"%(article_item_name)s\" 是来自的 \"%(article_name)s\" 文章项目,不能自行恢复. 联系 "
"\"%(article_name)s\" 的所有者来恢复它."
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -1329,7 +1343,7 @@ msgid ""
"<span style=\"font-size: 14px;\">From any Odoo document, find this article "
"by clicking on the 📗 icon in the chatter.</span>"
msgstr ""
"<span style=\"font-size: 14px;\">在任何 Odoo 文档中,只要点击聊天中的 📗 图标即可找到这篇文章。</span>"
"<span style=\"font-size: 14px;\">在任何 ERP 文档中,只要点击聊天中的 📗 图标即可查找这篇文章。</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
@@ -1352,6 +1366,13 @@ msgid ""
"here by clicking on the 📗 icon in the chatter.</span>"
msgstr "<span style=\"font-size: 14px;\">需要这份文件?点击聊天中的📗 图标回到这里。</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid ""
"<span style=\"font-size: 14px;\">Not sure how to do it? Check the video "
"below 👇</span>"
msgstr "<span style=\"font-size: 14px;\">不知道应该如何做?查看下面的视频 👇</span>"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "<span style=\"font-size: 14px;\">Press Ctrl-Z to undo any change</span>"
@@ -2375,7 +2396,7 @@ msgstr "您确定要将权限设置为\"无\"吗? 如果您这样做,您将
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_stage_view_search
#, python-format
msgid "Article"
msgstr "条款"
msgstr "文章"
#. module: knowledge
#. odoo-python
@@ -2400,6 +2421,7 @@ msgstr "文章项目属性"
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.js:0
#: model:ir.actions.act_window,name:knowledge.knowledge_article_action_item_calendar
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action
#: model:ir.actions.act_window,name:knowledge.knowledge_article_item_action_stages
@@ -2789,7 +2811,7 @@ msgstr "Car_Catalog.png"
#: code:addons/knowledge/static/src/components/move_article_dialog/move_article_dialog.js:0
#, python-format
msgid "Categories"
msgstr "电商品类"
msgstr "类别"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article_template_category__sequence
@@ -3326,7 +3348,7 @@ msgstr "记录营销活动,确定关键目标和成果的优先次序。"
msgid ""
"Don't forget to spread the word, we're <em>so</em> looking forward to "
"unveiling this new Odoo version! 🥳"
msgstr "别忘了传播消息,我们<em>非常</em>期待新版 Odoo 的发布!🥳"
msgstr "别忘了传播消息,我们<em>非常so</em>期待新版 ERP 的发布!🥳"
#. module: knowledge
#. odoo-python
@@ -3365,7 +3387,7 @@ msgstr "编辑"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#, python-format
msgid "Edit"
msgstr "编辑"
@@ -3569,7 +3591,7 @@ msgstr "全幅"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_personas
msgid "Gender(s):"
msgstr "性别:男"
msgstr "性别:"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_2
@@ -3581,7 +3603,14 @@ msgstr "性别:男"
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_1
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_marketing_customer_persona_3
msgid "Gender(s): W"
msgstr "性别:男"
msgstr "性别:女"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/knowledge_article_html_field/knowledge_article_html_field.xml:0
#, python-format
msgid "Generate an Article with AI"
msgstr "使用 AI 生成文章"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_favorite_view_search
@@ -3906,7 +3935,7 @@ msgstr "客户体验不一致"
#: code:addons/knowledge/static/src/js/wysiwyg.js:0
#, python-format
msgid "Index"
msgstr "指标"
msgstr "索引"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_product_catalog
@@ -4253,7 +4282,7 @@ msgstr "文章项目看板"
#. module: knowledge
#: model:knowledge.article,template_description:knowledge.knowledge_article_template_shared_todos
msgid "Keep track of your company to-dos and share them with your colleagues."
msgstr "记录公司的待办事项,并与同事分享。"
msgstr "记录公司的待办,并与同事分享。"
#. module: knowledge
#: model:knowledge.article,template_description:knowledge.knowledge_article_template_company_newsletter
@@ -4606,7 +4635,7 @@ msgid ""
msgstr ""
"150 多名奥杜人参加了今年的 5 或 11 公里长跑活动。\n"
" <br> ,他们从办公室出发,在郊外尽情游览,然后返回大罗西埃,在那里他们受到了饮料和汉堡的欢迎。\n"
" 在回到大罗西埃(Grand-Rosière)之前,他们在那里受到了饮料和汉堡的欢迎。"
" 在回到大罗西埃(Grand-Rosière)之前,他们在那里受到了饮料和汉堡的欢迎."
#. module: knowledge
#. odoo-javascript
@@ -4671,15 +4700,6 @@ msgstr "移至回收站"
msgid "Move to Workspace"
msgstr "移至工作区"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"Move to target of %(article_name)s is ambiguous, you should specify the "
"category."
msgstr "移动到目标%(article_name)s是模糊的,您应该指定类别。"
#. module: knowledge
#: model:ir.model.fields,field_description:knowledge.field_knowledge_article__my_activity_date_deadline
msgid "My Activity Deadline"
@@ -4860,11 +4880,6 @@ msgstr "尚无阶段!"
msgid "No template yet."
msgstr "尚无模板。"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "Not sure how to do it?"
msgstr "不知道怎么做?"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/comments_panel/comments_panel.xml:0
@@ -4955,6 +4970,13 @@ msgstr "Onboarding.pdf"
msgid "Ongoing"
msgstr "正在进行"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/view_link_behavior/view_link_behavior.js:0
#, python-format
msgid "Only Internal Users can access this view."
msgstr ""
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
@@ -5004,7 +5026,7 @@ msgstr "哎呀,无法找到文件%s。请用一个新的文件框替换这个
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/embedded_view_actions_menu/embedded_view_actions_menu.xml:0
#: code:addons/knowledge/static/src/components/sidebar/sidebar.js:0
#: code:addons/knowledge/static/src/views/item_calendar/item_calendar_views.xml:0
#, python-format
@@ -5414,7 +5436,6 @@ msgstr "从收藏夹移除"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/behaviors/embedded_view_behavior/embedded_view_manager.xml:0
#: code:addons/knowledge/static/src/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog.xml:0
#, python-format
msgid "Rename"
@@ -5649,11 +5670,6 @@ msgstr "小节"
msgid "See a doctor and send us the sick note."
msgstr "去看医生,并把病假条发送给我们。"
#. module: knowledge
#: model_terms:ir.ui.view,arch_db:knowledge.knowledge_article_user_onboarding
msgid "See how it works <i class=\"fa fa-youtube-play\"/>"
msgstr "了解看看<i class=\"fa fa-youtube-play\"/>"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/article_template_picker_dialog/article_template_picker_dialog.js:0
@@ -5719,7 +5735,7 @@ msgstr "分享"
#: model:knowledge.article,template_name:knowledge.knowledge_article_template_shared_todos
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_shared_todos
msgid "Shared To-Do List"
msgstr "共享待办事项清单"
msgstr "共享待办清单"
#. module: knowledge
#. odoo-javascript
@@ -5747,7 +5763,7 @@ msgstr "显示属性"
#: code:addons/knowledge/static/src/js/wysiwyg.js:0
#, python-format
msgid "Show nested articles"
msgstr "显示巢状文章"
msgstr "显示嵌套文章"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_sales_playbook
@@ -6111,6 +6127,15 @@ msgstr "未来创业博览会"
msgid "The article '%s' needs at least one member with 'Write' access."
msgstr "文章”%s“需要至少一位有“写入”权限的成员。"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"The destination placement of %(article_name)s is ambiguous, you should "
"specify the category."
msgstr "%(article_name)s的目标位置不明确,应指定类别。"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/macros/abstract_macro.js:0
@@ -6169,7 +6194,7 @@ msgstr "主题是文章层次结构中最高父级的标题。"
msgid ""
"The tickets to participate to Odoo Experience 23 are now available and they "
"are cheaper if you book them now!"
msgstr "参加 Odoo Experience 23 的门票现已开始发售,现在预订会更便宜!"
msgstr "参加 ERP Experience 23 的门票现已开始发售,现在可用的预订会更便宜!"
#. module: knowledge
#. odoo-javascript
@@ -6226,9 +6251,9 @@ msgid ""
" Antwerp, ready to promote our company!<br>Fabien was also there and gave an interview on the main\n"
" stage."
msgstr ""
"今年,Odoo 再次参加了在安特卫普举行的<em>学生科技创新节</em>。\n"
" <br> Fabien 也来到了现场,并在主舞台上接受了采访。\n"
" 舞台上接受了采访。"
"今年,ERP 再次参加了在安特卫普举行的<em>学生科技创新节</em>。\n"
" 安特卫普,准备促销我们的公司! <br> Fabien 也来到了现场,并在主舞台上接受了采访。\n"
" 舞台阶段上接受了面谈."
#. module: knowledge
#. odoo-javascript
@@ -6644,6 +6669,13 @@ msgstr "工作区"
msgid "Write"
msgstr "写入"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/js/knowledge_wysiwyg.js:0
#, python-format
msgid "Write an article about"
msgstr "写一篇文章关于"
#. module: knowledge
#: model_terms:knowledge.article,template_body:knowledge.knowledge_article_template_brand_assets
msgid ""
@@ -6733,6 +6765,16 @@ msgstr "您不能保存本文的收藏夹"
msgid "You can't leave an article for which you are the last writer"
msgstr "您不能离开一篇您是最后一名作者的文章"
#. module: knowledge
#. odoo-python
#: code:addons/knowledge/models/knowledge_article.py:0
#, python-format
msgid ""
"You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an "
"Article Item. Convert %(item_name)s into an Article first."
msgstr ""
"你不能将%(article_name)s移动到%(item_name)s下,因为%(item_name)s是一个文章项目。请先将%(item_name)s转换为文章。"
#. module: knowledge
#. odoo-javascript
#: code:addons/knowledge/static/src/components/permission_panel/permission_panel.xml:0
+1237 -659
View File
File diff suppressed because it is too large Load Diff
+76 -14
View File
@@ -16,7 +16,7 @@ from odoo import api, Command, fields, models, _
from odoo.addons.web_editor.tools import handle_history_divergence
from odoo.exceptions import AccessError, ValidationError, UserError
from odoo.osv import expression
from odoo.tools import get_lang
from odoo.tools import get_lang, is_html_empty
from odoo.tools.translate import html_translate
from odoo.tools.sql import SQL
@@ -1107,6 +1107,7 @@ class Article(models.Model):
def _get_common_copied_data(self):
return {
"article_properties_definition": self.article_properties_definition,
"body": self.body,
"cover_image_id": self.cover_image_id.id,
"cover_image_position": self.cover_image_position,
@@ -1117,6 +1118,35 @@ class Article(models.Model):
"name": _("%(article_name)s (copy)", article_name=self.name) if self.name else False,
}
def _update_article_references(self, original_article):
"""
Updates the IDs stored in the body of the current articles.
After calling that method, the embedded views listing the article items
of the original article will now list the article items of the current record.
:param <knowledge.article> original_article: original article
"""
for article in self:
if is_html_empty(article.body):
continue
needs_embed_view_update = False
fragment = html.fragment_fromstring(article.body, create_parent=True)
for element in fragment.findall(".//*[@data-behavior-props]"):
if "o_knowledge_behavior_type_embedded_view" in element.get("class"):
behavior_props = json.loads(parse.unquote(element.get("data-behavior-props")))
context = behavior_props.get("context", {})
if context.get("default_is_article_item") and context.get("active_id") == original_article.id:
context.update({
"active_id": article.id,
"default_parent_id": article.id
})
element.set("data-behavior-props", parse.quote(json.dumps(behavior_props), safe="()*!'"))
needs_embed_view_update = True
if needs_embed_view_update:
article.write({
"body": html.tostring(fragment, encoding="unicode")
})
# ------------------------------------------------------------
# ACTIONS
# ------------------------------------------------------------
@@ -1126,6 +1156,7 @@ class Article(models.Model):
""" Creates a copy of an article. != duplicate article (see `copy`).
Creates a new private article with the same body, icon and cover,
but drops other fields such as members, childs, permissions etc.
Note: Article references will be update, see `_update_article_references`
"""
self.ensure_one()
article_vals = self._get_common_copied_data()
@@ -1137,13 +1168,21 @@ class Article(models.Model):
"internal_permission": "none",
"parent_id": False,
})
return self.create(article_vals)
article = self.create(article_vals)
article._update_article_references(self)
# Copy the related stages for the /kanban command:
for stage in self.env["knowledge.article.stage"].search([("parent_id", "=", self.id)]):
stage.copy({
"parent_id": article.id
})
return article
@api.returns('self', lambda value: value.id)
def action_clone(self):
"""Creates a duplicate of an article in the same context as the original.
This means that this methods create a copy with the same parent,
permission and properties as the original
Note: Article references will be update, see `_update_article_references`
"""
self.ensure_one()
if not self.user_can_write or not (self.parent_id and self.parent_id.user_can_write):
@@ -1154,10 +1193,15 @@ class Article(models.Model):
"parent_id": self.parent_id.id,
"article_properties": self.article_properties,
"is_article_item": self.is_article_item,
"article_properties_definition": self.article_properties_definition,
})
return self.create(article_vals)
article = self.create(article_vals)
article._update_article_references(self)
# Copy the related stages for the /kanban command:
for stage in self.env["knowledge.article.stage"].search([("parent_id", "=", self.id)]):
stage.copy({
"parent_id": article.id
})
return article
def action_home_page(self):
""" Redirect to the home page of knowledge, which displays an article.
@@ -1229,7 +1273,7 @@ class Article(models.Model):
# _detach_unwritable_descendants calls _filter_access_rules_python which returns
# a sudo-ed recordset
writable_descendants = self._detach_unwritable_descendants().with_env(self.env)
(self + writable_descendants).toggle_active()
(self + writable_descendants).filtered('active').toggle_active()
if send_to_trash:
(self + writable_descendants).to_delete = True
(self + writable_descendants)._send_trash_notifications()
@@ -1255,20 +1299,27 @@ class Article(models.Model):
* To avoid 'restoring' an article that will not appear anywhere on
the knowledge home page, make the article a root article.
"""
for article_item in self.filtered(lambda article: article.is_article_item \
and article.parent_id not in self \
and article.parent_id.sudo().to_delete):
raise UserError(
_('"%(article_item_name)s" is an Article Item from "%(article_name)s" and cannot be restored on its own. Contact the owner of "%(article_name)s" to have it restored instead.',
article_item_name=article_item.display_name,
article_name=article_item.parent_id.display_name))
writable_descendants = self.with_context(active_test=False)._detach_unwritable_descendants().with_env(self.env)
res = super(Article, self + writable_descendants).action_unarchive()
# Trash management: unarchive removes the article from the trash
articles_to_restore = (self + writable_descendants).filtered(lambda article: article.to_delete)
articles_to_restore.write({'to_delete': False})
for article in self.filtered(lambda article: article.parent_id.to_delete):
write_values = article._desync_access_from_parents_values()
for article_sudo in self.sudo().filtered(lambda article: article.parent_id.to_delete):
write_values = article_sudo._desync_access_from_parents_values()
# Make it root
write_values.update({
'parent_id': False,
'is_desynchronized': False
})
# sudo to write on members
article.sudo().write(write_values)
article_sudo.write(write_values)
return res
def action_join(self):
@@ -1309,11 +1360,18 @@ class Article(models.Model):
category = category or parent.category or before_article.category
if not category:
raise ValidationError(
_("Move to target of %(article_name)s is ambiguous, you should specify the category.")
_("The destination placement of %(article_name)s is ambiguous, you should specify the category.",
article_name=self.display_name)
)
if category == 'shared' and not parent and (self.parent_id or self.category != 'shared'):
raise ValidationError(
_("Cannot move %(article_name)s as a root of the 'shared' section since access rights can not be inferred without a parent.")
_("Cannot move %(article_name)s as a root of the 'shared' section since access rights can not be inferred without a parent.",
article_name=self.display_name)
)
if parent.is_article_item:
raise ValidationError(
_("You can't move %(article_name)s under %(item_name)s, as %(item_name)s is an Article Item. "
"Convert %(item_name)s into an Article first.", article_name=self.display_name, item_name=parent.display_name)
)
if category == 'private':
@@ -2678,12 +2736,13 @@ class Article(models.Model):
current article (to avoid recursions) """
return self.search_read(
domain=[
'&', '&', '&', '&',
'&', '&', '&', '&', '&',
('is_template', '=', False),
('name', 'ilike', search_term),
('id', 'not in', self.ids),
'!', ('parent_id', 'child_of', self.ids),
('user_has_access', '=', True),
('is_article_item', '=', False),
],
fields=['id', 'display_name', 'root_article_id'],
limit=15,
@@ -2760,6 +2819,9 @@ class Article(models.Model):
# Do not fetch articles that the user did not join (articles with
# internal permissions may be set as visible to members only)
root_articles_domain.append(("is_article_visible", "=", True))
else:
# Do not fetch private articles of other users for portal user
expression.AND([root_articles_domain, ['|', ('user_has_access', '=', True), ('category', '!=', 'private')]])
# Fetch root article_ids as sudo, ACLs will be checked on next global call fetching 'all_visible_articles'
# this helps avoiding 2 queries done for ACLs (and redundant with the global fetch)
@@ -2767,7 +2829,7 @@ class Article(models.Model):
favorite_articles_ids = self.env['knowledge.article.favorite'].sudo().search(
[("user_id", "=", self.env.user.id), ('is_article_active', '=', True)]
).article_id.ids
).article_id.filtered(lambda article: article.user_has_access).ids
# Add favorite articles and items (they are root articles in the
# favorite tree)
+1 -1
View File
@@ -90,7 +90,7 @@ class KnowledgeArticleThread(models.Model):
which is a simple template comprised of the comment sent and the person that tagged the notified user.
"""
kwargs['msg_vals'] = {**kwargs['msg_vals'], 'email_layout_xmlid': 'knowledge.knowledge_mail_notification_layout'}
kwargs['msg_vals'] = {**kwargs.get('msg_vals', {}), 'email_layout_xmlid': 'knowledge.knowledge_mail_notification_layout'}
return super()._notify_thread_by_email(message, recipients_data, **kwargs)
@@ -4,6 +4,7 @@ import { useService } from "@web/core/utils/hooks";
import {
Component,
onMounted,
useExternalListener,
} from "@odoo/owl";
import {
copyOids,
@@ -46,6 +47,7 @@ export class AbstractBehavior extends Component {
setup() {
super.setup();
this.setupAnchor();
this.uiService = useService('ui');
this.knowledgeCommandsService = useService('knowledgeCommandsService');
if (!this.props.readonly) {
onMounted(() => {
@@ -114,6 +116,41 @@ export class AbstractBehavior extends Component {
*/
extraRender() {}
/**
* Normally, the editable is the only element in the editor which has the focus.
* With behaviors however (and most notably embedded views), it can be useful to delegate the focus at a lower level
* (i.e. to use hotkeys with the uiService).
* Also, since "focus" and "blur" events don't bubble, and the "blur" event is used to handle a dirty field for saving purpose,
* it has to sometimes be triggered programmatically for a proper save.
*
* We are adding tabindex="-1" to the anchor because this attribute is needed to capture the
* 'focusin' and 'focusout' events.
* In these events we are using activateElement/deactivateElement:
*
* `activateElement` is used to set the anchor as an active element in the ui service, this enables
* us to contain the events inside the embedded view when it has the focus.
*
* `deactivateElement` removes the anchor as an active element, leaving only the document as active
* and we come back to the default behavior of the document handling all the events.
*
*/
handleFocusEvents() {
this.props.anchor.setAttribute('tabindex', '-1');
useExternalListener(this.props.anchor, 'focusin', () => {
if (!this.props.anchor.contains(this.uiService.activeElement)) {
this.uiService.activateElement(this.props.anchor);
}
});
useExternalListener(this.props.anchor, 'focusout', (event) => {
if (!this.props.anchor.contains(event.relatedTarget)) {
this.uiService.deactivateElement(this.props.anchor);
if (!this.props.readonly && !this.editor.editable.contains(event.relatedTarget)) {
this.editor.editable.dispatchEvent(new FocusEvent('blur', {relatedTarget: event.relatedTarget}));
}
}
});
}
/**
* This method is used to ensure that the correct attributes are set
* on the anchor of the Behavior. Attributes could be incorrect for the
@@ -122,6 +159,7 @@ export class AbstractBehavior extends Component {
* of a Behavior which was in another state (i.e. from readonly to editable)
*/
setupAnchor() {
this.handleFocusEvents();
if (!this.props.readonly) {
this.props.anchor.setAttribute('contenteditable', 'false');
// prevent some interactions with OdooEditor, @see web_editor module
@@ -2,6 +2,7 @@
import { _t } from "@web/core/l10n/translation";
import { AbstractBehavior } from "@knowledge/components/behaviors/abstract_behavior/abstract_behavior";
import { encodeDataBehaviorProps } from "@knowledge/js/knowledge_utils";
import { AlertDialog } from "@web/core/confirmation_dialog/confirmation_dialog";
import { useService } from "@web/core/utils/hooks";
import { useEffect } from "@odoo/owl";
@@ -48,11 +49,25 @@ export class ArticleBehavior extends AbstractBehavior {
//--------------------------------------------------------------------------
/**
* Some `/article` blocks had their behavior-props encoded with
* `JSON.stringify` instead of `encodeDataBehaviorProps`. This override is
* there to ensure that props are encoded with the correct format.
* TODO ABD: this logic should be ultimately part of a knowledge upgrade.
* @see AbstractBehavior
* @override
*/
setupAnchor () {
setupAnchor() {
super.setupAnchor();
this.props.anchor.setAttribute('target', '_blank');
if (!this.props.readonly) {
try {
// JSON.parse will crash if the props are already encoded,
// in that case there is no need to update them.
this.props.anchor.dataset.behaviorProps = encodeDataBehaviorProps(
JSON.parse(this.props.anchor.dataset.behaviorProps)
);
} catch {}
}
}
//--------------------------------------------------------------------------
@@ -13,8 +13,7 @@ import { uuid } from "@web/views/utils";
import {
onError,
onMounted,
onWillDestroy,
useExternalListener,
onWillDestroy,
useState,
useSubEnv } from "@odoo/owl";
@@ -43,7 +42,6 @@ export class EmbeddedViewBehavior extends AbstractBehavior {
setup () {
super.setup();
this.actionService = useService('action');
this.uiService = useService('ui');
this.state = useState({
waiting: true,
error: false
@@ -123,35 +121,6 @@ export class EmbeddedViewBehavior extends AbstractBehavior {
this.state.error = true;
});
}
/**
* This function enables us to adds the desired attributes to the anchor of the embedded view
* before it is rendered.
* We are adding tabindex="-1" to the anchor because this attribute is needed to capture the
* 'focusin' and 'focusout' events.
* In these events we are using activateElement/deactivateElement:
*
* `activateElement` is used to set the anchor as an active element in the ui service, this enables
* us to contain the events inside the embedded view when it has the focus.
*
* `deactivateElement` removes the anchor as an active element, leaving only the document as active
* and we come back to the default behavior of the document handling all the events.
*
* @override
*/
setupAnchor() {
super.setupAnchor();
this.props.anchor.setAttribute('tabindex', '-1');
useExternalListener(this.props.anchor, 'focusin', () => {
if (!this.props.anchor.contains(this.uiService.activeElement)) {
this.uiService.activateElement(this.props.anchor);
}
});
useExternalListener(this.props.anchor, 'focusout', (event) => {
if (!this.props.anchor.contains(event.relatedTarget)) {
this.uiService.deactivateElement(this.props.anchor);
}
});
}
//--------------------------------------------------------------------------
// TECHNICAL
@@ -184,13 +153,7 @@ export class EmbeddedViewBehavior extends AbstractBehavior {
*/
setTitle (name) {
const behaviorProps = decodeDataBehaviorProps(this.props.anchor.getAttribute('data-behavior-props'));
if (behaviorProps.act_window) {
behaviorProps.act_window.name = name;
behaviorProps.act_window.display_name = name;
}
if (behaviorProps.display_name) {
behaviorProps.display_name = name;
}
behaviorProps.display_name = name;
this.props.anchor.dataset.behaviorProps = encodeDataBehaviorProps(behaviorProps);
this.embeddedViewManagerProps.action.name = name;
this.embeddedViewManagerProps.action.display_name = name;
@@ -7,7 +7,7 @@ import { EmbeddedView } from "@knowledge/views/embedded_view";
import { ItemCalendarPropsDialog } from "@knowledge/components/item_calendar_props_dialog/item_calendar_props_dialog";
import { PromptEmbeddedViewNameDialog } from "@knowledge/components/prompt_embedded_view_name_dialog/prompt_embedded_view_name_dialog";
import { useOwnDebugContext } from "@web/core/debug/debug_context";
import { useService } from "@web/core/utils/hooks";
import { useBus, useService } from "@web/core/utils/hooks";
import {
Component,
onWillStart,
@@ -15,10 +15,6 @@ import {
useSubEnv
} from "@odoo/owl";
import { decodeDataBehaviorProps, encodeDataBehaviorProps } from "@knowledge/js/knowledge_utils";
import {
BehaviorToolbar,
BehaviorToolbarButton,
} from "@knowledge/components/behaviors/behavior_toolbar/behavior_toolbar";
const EMBEDDED_VIEW_LIMITS = {
@@ -30,10 +26,6 @@ const EMBEDDED_VIEW_LIMITS = {
* Wrapper for the embedded view, manage the toolbar and the embedded view props
*/
export class EmbeddedViewManager extends Component {
static components = {
BehaviorToolbar,
BehaviorToolbarButton,
};
static props = {
action: { type: Object },
additionalViewProps: { type: Object, optional: true },
@@ -70,6 +62,16 @@ export class EmbeddedViewManager extends Component {
// store the start and end date properties that the model should use.
this.state = useState({additionalViewProps: this.props.additionalViewProps});
useBus(this.env.bus, `KNOWLEDGE_EMBEDDED_${this.props.context.knowledgeEmbeddedViewId}:EDIT`, () => {
if (this.props.additionalViewProps) {
this._onEditBtnClick(this);
} else {
this._onRenameBtnClick(this);
}
});
useBus(this.env.bus, `KNOWLEDGE_EMBEDDED_${this.props.context.knowledgeEmbeddedViewId}:OPEN`, () => {
this._onOpenBtnClick(this);
});
/**
* @param {ViewType} viewType
* @param {Object} [props={}]
@@ -301,7 +303,10 @@ export class EmbeddedViewManager extends Component {
this.actionService.doAction(this.action, {
viewType: this.props.viewType,
props,
additionalContext: { knowledgeEmbeddedViewId: this.props.context.knowledgeEmbeddedViewId }
additionalContext: {
knowledgeEmbeddedViewId: this.props.context.knowledgeEmbeddedViewId,
isOpenedEmbeddedView: true
}
});
}
@@ -10,27 +10,11 @@
.o_knowledge_behavior_type_embedded_view {
margin-left: calc(-1 * var(--editor-gutter-size));
margin-right: calc(-1 * var(--editor-gutter-size));
margin-right: calc(-1 * var(--editor-gutter-size) - 2rem);
position: relative;
background-color: $o-webclient-background-color;
border-left: 2px solid transparent; // adjust to resizer
.o_knowledge_toolbar {
position: absolute;
visibility: hidden;
height: 2rem;
top: -2rem;
right: 0rem;
> div {
height: 2rem;
}
}
&:hover {
.o_knowledge_toolbar {
visibility: visible;
}
}
.o_knowledge_embedded_view {
.o_content:not(.o_view_sample_data) .o_view_nocontent:not(.o_knowledge_item_calendar_nocontent) {
display: none !important;
@@ -38,6 +22,9 @@
.breadcrumb {
margin-right: 8px;
}
.o_content {
max-height: 80vh;
}
}
.o_view_nocontent_empty_folder:before {
@extend %o-nocontent-empty-document;
@@ -1,31 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<templates>
<t t-name="knowledge.EmbeddedViewManager">
<t t-set="edit">Edit</t>
<t t-set="rename">Rename</t>
<t t-set="open">Open</t>
<BehaviorToolbar buttonsGroupClass="'bg-white rounded-top border border-bottom-0'">
<t t-set-slot="buttons">
<BehaviorToolbarButton
t-if="props.additionalViewProps"
icon="'fa-pencil'"
label="edit"
onClick.bind="_onEditBtnClick"
/>
<BehaviorToolbarButton
t-else=""
hidden="props.readonly"
icon="'fa-pencil'"
label="rename"
onClick.bind="_onRenameBtnClick"
/>
<BehaviorToolbarButton
icon="'fa-external-link'"
label="open"
onClick.bind="_onOpenBtnClick"
/>
</t>
</BehaviorToolbar>
<div class="o_knowledge_embedded_view d-flex flex-column flex-grow-1 border-top border-bottom"
data-oe-transient-content="true">
<t t-component="EmbeddedView" t-props="allEmbeddedViewProps"/>
@@ -72,10 +72,12 @@ export class FileBehavior extends AbstractBehavior {
this.fileNameRef = useRefWithSingleCollaborativeChild(
'fileNameRef',
(element) => {
if (element) {
this.setFileName(this.fileNameRef.el.textContent);
const fileName = this.fileNameSpanTextContent;
if (element && fileName.length) {
this.setFileName(fileName);
} else {
this.renderFileName();
this.editor.historyStep();
}
}
);
@@ -89,7 +91,7 @@ export class FileBehavior extends AbstractBehavior {
}
}, () => [this.state.editFileName]);
useEffect(() => {
if (this.state.fileModel.filename !== this.fileNameRef.el.textContent) {
if (this.state.fileModel.filename !== this.fileNameSpanTextContent) {
this.renderFileName();
this.editor.historyStep();
}
@@ -206,14 +208,25 @@ export class FileBehavior extends AbstractBehavior {
*/
synchronizeOids(blueprint) {
super.synchronizeOids(blueprint);
const currentFileNameEl = this.props.anchor.querySelector('.o_knowledge_file_name[data-oe-protected="false"]');
const blueprintFileNameEl = blueprint.querySelector('.o_knowledge_file_name[data-oe-protected="false"]');
const currentFileNameEl = this.props.anchor.querySelector('.o_knowledge_file_name_container[data-oe-protected="false"]');
const blueprintFileNameEl = blueprint.querySelector('.o_knowledge_file_name_container[data-oe-protected="false"]');
if (!blueprintFileNameEl) {
return;
}
copyOids(blueprintFileNameEl, currentFileNameEl);
}
//--------------------------------------------------------------------------
// GETTERS/SETTERS
//--------------------------------------------------------------------------
/**
* @returns {String} fileName as it is written in the editor.
*/
get fileNameSpanTextContent() {
return this.fileNameRef.el.querySelector(".o_knowledge_file_name")?.textContent || "";
}
//--------------------------------------------------------------------------
// BUSINESS
//--------------------------------------------------------------------------
@@ -13,7 +13,7 @@
/>
</div>
<div class="d-block ps-2 text-break flex-grow-1">
<div t-attf-class="o_knowledge_file_name #{ state.editFileName ? 'd-none' : '' }"
<div t-attf-class="o_knowledge_file_name_container #{ state.editFileName ? 'd-none' : '' }"
data-oe-protected="false" t-ref="fileNameRef" t-att-tabindex="!this.props.readonly ? '-1' : undefined"
t-on-focus="props.readonly ? () => {} : onFocusFileName"/>
<div data-oe-transient-content="true">
@@ -57,7 +57,7 @@
</t>
<t t-name="knowledge.FileBehaviorFileName">
<div class="d-flex">
<span t-out="fileName"/>
<span class="o_knowledge_file_name" t-out="fileName"/>
<i class="fa fa-pencil mx-1 invisible align-items-center d-inline-flex"/>
</div>
</t>
@@ -95,19 +95,22 @@ export class TemplateBehavior extends AbstractBehavior {
if (!this.templateContent.el) {
return;
}
const blob = [new ClipboardItem({
"text/html": new Blob([this.templateContent.el.innerHTML], { type: "text/html" }),
"text/plain": new Blob([this.templateContent.el.innerHTML], { type: "text/plain" }),
})];
try {
await browser.navigator.clipboard.write(blob);
const selection = document.getSelection();
selection.removeAllRanges();
const range = new Range();
range.selectNodeContents(this.templateContent.el);
selection.addRange(range);
if (document.execCommand("copy")) {
// Nor the original `clipboard.write` function nor the polyfill
// written in `clipboard.js` does trigger the `odooEditor` `copy`
// handler, therefore `execCommand` should be called here so that
// html content is properly handled within the editor.
this.popover.open(this.copyToClipboardButton.el, {
tooltip: _t("Content copied to clipboard."),
});
browser.setTimeout(this.popover.close, 800);
} catch (error) {
browser.console.warn(error);
}
selection.removeAllRanges();
}
/**
@@ -2,6 +2,7 @@
import { AbstractBehavior } from "@knowledge/components/behaviors/abstract_behavior/abstract_behavior";
import { makeContext } from "@web/core/context";
import { _t } from "@web/core/l10n/translation";
import { useService } from "@web/core/utils/hooks";
import { useEffect } from "@odoo/owl";
@@ -24,12 +25,20 @@ export class ViewLinkBehavior extends AbstractBehavior {
setup () {
super.setup();
this.actionService = useService('action');
this.notification = useService("notification");
this.userService = useService("user");
useEffect(() => {
const type = this.props.readonly ? 'click' : 'dblclick';
/**
* @param {Event} event
*/
const onLinkClick = event => {
const onLinkClick = async (event) => {
const isInternalUser = await this.userService.hasGroup("base.group_user");
if (!isInternalUser) {
return this.notification.add(_t("Only Internal Users can access this view."), {
type: "warning",
});
}
this.openViewLink(event);
};
this.props.anchor.addEventListener(type, onLinkClick);
@@ -84,6 +84,10 @@ export class KnowledgeCommentsThread extends Component {
});
useChildSubEnv({
// We need to unset the chatter inside the env of the child Components
// because this Object contains values and methods that are linked to the form view's
// main chatter. By doing this we distinguish the main chatter from the comments.
chatter: false,
closeThread: this.resolveComment.bind(this),
openThread: this.unresolveComment.bind(this),
isResolved: this.isResolved
@@ -94,6 +98,13 @@ export class KnowledgeCommentsThread extends Component {
useBus(this.uiService.bus, 'resize', () => {
this.state.smallUI = this.isSmallUINeeded();
});
useBus(this.env.bus, `KNOWLEDGE_COMMENT_${this.state.knowledgeThreadId}:HIGHLIGHT`, () => {
this.state.commenting = true;
if (!this.state.isResolved && this.state.smallUI) {
this.openPopover({ target: this.targetRef.el });
}
this.highlightComment(true);
});
useBus(this.env.bus, `KNOWLEDGE_COMMENT_${this.state.knowledgeThreadId}:COMPUTE_POSITION`, ({detail}) => {
if (detail) {
this.anchors = detail.newAnchors;
@@ -176,8 +187,9 @@ export class KnowledgeCommentsThread extends Component {
});
onPatched(() => {
if (this.state.commenting && !this.state.smallUI) {
if (this.autoFocusTextarea) {
this.composerDivRef.el?.querySelector('textarea')?.focus();
this.autoFocusTextarea = false;
}
const { messages } = this.threadService.store.get(this.state.thread.localId);
if (messages.length && messages.every((message) => !message.body)) {
@@ -471,8 +483,11 @@ export class KnowledgeCommentsThread extends Component {
) &&
!ev.target.closest('.o-mail-Message-actions, .o-mail-Message-content .o-mail-Composer, .o-mail-MessageReaction, .o-mail-Composer ~ span a')
) {
if (!this.state.smallUI) {
this.autoFocusTextarea = true;
}
this.state.commenting = true;
if ( !this.state.isResolved && this.state.smallUI ) {
if (!this.state.isResolved && this.state.smallUI && !this.props.forceFullSize) {
this.openPopover({target: this.targetRef.el});
}
this.highlightComment(true);
@@ -14,7 +14,7 @@
'd-inline-block position-absolute end-100 rounded': !props.forceFullSize,
'pt-2': !(state.smallUI || props.record.data.full_width)
}"
t-attf-style="top: ${this.state.top}px; ${this.state.width}; ${this.state.marginRight};"
t-attf-style="${!this.props.forceFullSize ? `top: ${this.state.top}px;${this.state.width};${this.state.marginRight};` : ''}"
t-ref="targetRef">
<div class="o_knowledge_comment_small_ui"
t-if="!props.forceFullSize and state.smallUI"
@@ -187,11 +187,11 @@ export class KnowledgeCommentsHandler extends Component {
if (commentNode && commentNode.dataset.id) {
const commentingId = parseInt(commentNode.dataset.id);
this.commentingId = commentingId;
this.env.bus.trigger(`KNOWLEDGE_COMMENT_${commentingId}:HIGHLIGHT`);
document.querySelector(`.o_knowledge_comment_box[data-id='${commentingId}']`)?.scrollIntoView({
behavior: 'smooth',
block: 'nearest'
});
document.querySelector(`.o_knowledge_comment_box[data-id='${commentingId}']`)?.click();
} else if (ev.target?.closest('.o_field_knowledge_article_html_field')) {
this.commentingId = false;
}
@@ -104,7 +104,9 @@ export class KnowledgeArticleCommentsPanel extends Component {
}
insertNewThreadFromHandler(event) {
const newlyCreatedComment = event.detail.comment;
const newlyCreatedComment = Object.assign({}, event.detail.comment, {
insertNewThread: this.insertNewThread.bind(this),
});
this.state.commentMode = 'unresolved';
if (newlyCreatedComment.isCreationMode) {
this.state.comments['undefined'] = newlyCreatedComment;
@@ -0,0 +1,38 @@
/** @odoo-module */
import { Dropdown } from "@web/core/dropdown/dropdown";
import { DropdownItem } from "@web/core/dropdown/dropdown_item";
import { registry } from "@web/core/registry";
import { Component } from "@odoo/owl";
const cogMenuRegistry = registry.category("cogMenu");
export class EmbeddedViewActionsMenu extends Component {
static props = {};
static template = "knowledge.EmbeddedViewActionsMenu";
static components = { Dropdown, DropdownItem };
_onOpenEmbeddedView () {
this.env.bus.trigger(`KNOWLEDGE_EMBEDDED_${this.env.searchModel.context.knowledgeEmbeddedViewId}:OPEN`);
}
_onEditEmbeddedView () {
this.env.bus.trigger(`KNOWLEDGE_EMBEDDED_${this.env.searchModel.context.knowledgeEmbeddedViewId}:EDIT`);
}
}
cogMenuRegistry.add(
'embedded-view-actions-menu',
{
Component: EmbeddedViewActionsMenu,
groupNumber: 10,
isDisplayed: (env) => {
/**
* Those buttons should only be displayed when inside the main Knowledge view.
* This means that the context should contain an embedded ID and a context key called
* `isOpenedEmbeddedView`. (Which is added when clicking on the open button)
*/
return env.searchModel.context.knowledgeEmbeddedViewId &&
!env.searchModel.context.isOpenedEmbeddedView;
},
},
);
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<templates>
<t t-name="knowledge.EmbeddedViewActionsMenu" owl="1">
<DropdownItem onSelected.bind="_onOpenEmbeddedView">
<i class="fa fa-fw fa-external-link me-1"/>Open
</DropdownItem>
<DropdownItem onSelected.bind="_onEditEmbeddedView">
<i class="fa fa-fw fa-pencil me-1"/>Edit
</DropdownItem>
</t>
</templates>
@@ -1,10 +1,9 @@
/** @odoo-module */
import { _t } from "@web/core/l10n/translation";
import { memoize } from "@web/core/utils/functions";
import { renderToElement } from "@web/core/utils/render";
import { CalendarRenderer } from "@web/views/calendar/calendar_renderer";
import { CohortRenderer } from "@web_cohort/cohort_renderer";
import { GanttRenderer } from "@web_gantt/gantt_renderer";
import { GraphRenderer } from "@web/views/graph/graph_renderer";
import { HierarchyRenderer } from "@web_hierarchy/hierarchy_renderer";
import { KanbanRenderer } from "@web/views/kanban/kanban_renderer";
@@ -222,8 +221,6 @@ const EmbeddedViewListRendererPatch = () => ({
});
patch(CalendarRenderer.prototype, EmbeddedViewRendererPatch());
patch(CohortRenderer.prototype, EmbeddedViewRendererPatch());
patch(GanttRenderer.prototype, EmbeddedViewRendererPatch());
patch(GraphRenderer.prototype, EmbeddedViewRendererPatch());
patch(HierarchyRenderer.prototype, EmbeddedViewRendererPatch());
patch(KanbanRenderer.prototype, EmbeddedViewRendererPatch());
@@ -234,8 +231,6 @@ patch(PivotRenderer.prototype, EmbeddedViewRendererPatch());
const supportedEmbeddedViews = new Set([
'calendar',
'cohort',
'gantt',
'graph',
'hierarchy',
'kanban',
@@ -244,6 +239,52 @@ const supportedEmbeddedViews = new Set([
'pivot',
]);
const externalModules = {
"@web_cohort/cohort_renderer": {
renderer: "CohortRenderer",
view: "cohort",
},
"@web_gantt/gantt_renderer": {
renderer: "GanttRenderer",
view: "gantt",
},
};
/**
* Ensure that a patch is only applied once for each module.
*/
const patchExternalModule = memoize((path) => {
const { [externalModules[path].renderer]: Renderer } = odoo.loader.modules.get(path) || {};
if (Renderer) {
patch(Renderer.prototype, EmbeddedViewRendererPatch());
supportedEmbeddedViews.add(externalModules[path].view);
}
});
/**
* Apply all patches.
*/
const patchExternalModules = () => {
for (const path of Object.keys(externalModules)) {
patchExternalModule(path);
}
};
// Apply a patch to a lazy-loaded module.
odoo.loader.bus.addEventListener("module-started", (e) => {
if (e.detail.moduleName in externalModules) {
patchExternalModule(e.detail.moduleName);
}
});
if (odoo.loader.checkErrorProm) {
// Apply all patches after every non-lazy module finished loading.
odoo.loader.checkErrorProm.then(patchExternalModules);
} else {
// Apply all patches in case the current file is a lazy-loaded module.
patchExternalModules();
}
export {
supportedEmbeddedViews,
};
@@ -0,0 +1,12 @@
/** @odoo-module **/
import { FormStatusIndicator } from "@web/views/form/form_status_indicator/form_status_indicator";
/**
* This extension of the FormStatusIndicator is used to add a new indicator to the ones that already
* exists. This new icon is used in the same way as the icon in Google Docs => indicate that all changes
* have been committed to the DB.
*/
export class KnowledgeFormStatusIndicator extends FormStatusIndicator {
static template = 'knowledge.FormStatusIndicator';
}
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="knowledge.FormStatusIndicator" t-inherit="web.FormStatusIndicator">
<xpath expr="//div[hasclass('o_form_status_indicator_buttons')]" position="before">
<img src="/knowledge/static/src/img/form_status_indicator_saved.svg"
class="align-items-center d-flex px-1 py-0 border border-transparent user-select-none"
t-attf-class="{{ displayButtons ? 'd-none' : ''}}"
data-tooltip="All changes saved"/>
</xpath>
</t>
</templates>
@@ -6,6 +6,7 @@ import { encodeDataBehaviorProps } from "@knowledge/js/knowledge_utils";
import { HtmlField, htmlField } from "@web_editor/js/backend/html_field";
import { ItemCalendarPropsDialog } from "@knowledge/components/item_calendar_props_dialog/item_calendar_props_dialog";
import {
onWillStart,
onWillUnmount,
onWillUpdateProps,
} from "@odoo/owl";
@@ -35,6 +36,7 @@ export class KnowledgeArticleHtmlField extends HtmlField {
this.actionService = useService("action");
this.dialogService = useService("dialog");
this.orm = useService("orm");
this.userService = useService('user');
onWillUpdateProps(nextProps => {
this.state.isWysiwygHelperActive = this.isWysiwygHelperActive(nextProps);
});
@@ -46,6 +48,9 @@ export class KnowledgeArticleHtmlField extends HtmlField {
this.wysiwyg.odooEditor.removeEventListener("historyResetFromSteps", this.editorStepsCallback);
}
});
onWillStart(async () => {
this.isPortalUser = await this.userService.hasGroup('base.group_portal');
})
}
get wysiwygOptions() {
@@ -114,7 +119,7 @@ export class KnowledgeArticleHtmlField extends HtmlField {
};
const body = renderToString("knowledge.article_item_template", {
behaviorProps: encodeDataBehaviorProps(behaviorProps),
title: name
title: name || _t("Article Items")
});
this.updateArticle(name, body, {
full_width: true
@@ -184,6 +189,10 @@ export class KnowledgeArticleHtmlField extends HtmlField {
});
}
onGenerateArticleClick() {
this.wysiwyg.generateArticle();
}
/**
* @param {string} title
* @param {string} body
@@ -8,7 +8,7 @@
<div t-if="state.isWysiwygHelperActive and state.isEmpty" class="o_knowledge_helper pb-3">
<p class="text-muted">Start typing to continue with an empty page or pick an option below to get started.</p>
<div class="d-flex flex-column">
<a href="#" class="o_knowledge_load_template p-2" data-hotkey="A" t-on-click="onLoadTemplateBtnClick">
<a href="#" class="o_knowledge_load_template p-2" data-hotkey="A" t-on-click="onLoadTemplateBtnClick" t-if="!isPortalUser">
<i class="fa fa-lg fa-paint-brush me-1"/> Load a Template
</a>
<a href="#" class="o_knowledge_add_item_kanban p-2" data-hotkey="K" t-on-click="onBuildItemKanbanBtnClick">
@@ -20,6 +20,9 @@
<a href="#" class="o_knowledge_add_item_calendar p-2" data-hotkey="C" t-on-click="onBuildItemCalendarBtnClick">
<i class="fa fa-lg fa-calendar me-1"/> Build an Item Calendar
</a>
<a href="#" class="o_knowledge_generate_article p-2" data-hotkey="G" t-on-click="onGenerateArticleClick">
<i class="fa fa-lg fa-magic me-1"/> Generate an Article with AI
</a>
</div>
</div>
</xpath>
@@ -22,7 +22,9 @@
<t t-else="">
<a role="button" t-on-click="changeCover"
class="btn btn-light text-capitalize me-3 o_knowledge_replace_cover o_knowledge_option_button">
<i class="fa fa-lg fa-picture-o me-1" title="Change cover"/> Replace cover
<i class="fa fa-lg fa-picture-o" title="Change cover"/>
<span class="d-none d-sm-inline ms-1">Replace cover</span>
<span class="d-sm-none ms-1">Replace</span>
</a>
<a t-if="!this.env.isSmall" role="button" t-on-click="repositionCover"
class="btn btn-light text-capitalize me-3 o_knowledge_reposition_cover o_knowledge_option_button">
@@ -30,7 +32,7 @@
</a>
<a role="button" t-on-click="removeCover"
class="btn btn-light text-capitalize o_knowledge_remove_cover o_knowledge_option_button">
<i class="fa fa-lg fa-trash-o me-1" title="Remove cover"/> Remove
<i class="fa fa-lg fa-trash-o" title="Remove cover"/><span class="d-none d-sm-inline ms-1">Remove</span>
</a>
</t>
</span>
@@ -0,0 +1,26 @@
/** @odoo-module **/
import { patch } from "@web/core/utils/patch";
import { Dropdown } from "@web/core/dropdown/dropdown";
patch(Dropdown.prototype, {
/**
* Embedded view in knowledge can become the active element,
* but dropdowns should be able to be closed by clicking.
* Actually, the only case where a dropdown should sometimes not be closed is if
* a dialog becomes the active element above the opened dropdown.
* @override
*/
isInActiveElement() {
return (
super.isInActiveElement() ||
(
this.ui.activeElement !== this.myActiveEl &&
this.myActiveEl &&
this.myActiveEl.contains(this.ui.activeElement) &&
this.ui.activeElement.classList.contains("o_knowledge_behavior_anchor")
)
);
},
});
@@ -4,7 +4,7 @@ import { session } from "@web/session";
import { ConfirmationDialog, AlertDialog } from "@web/core/confirmation_dialog/confirmation_dialog";
import { _t } from "@web/core/l10n/translation";
import { useService } from '@web/core/utils/hooks';
import { Component, onWillStart, useState } from "@odoo/owl";
import { Component, onWillStart, useEffect, useState} from "@odoo/owl";
const permissionLevel = {'none': 0, 'read': 1, 'write': 2}
const restrictMessage = _t("Are you sure you want to restrict access to this article? "
@@ -29,9 +29,11 @@ export class PermissionPanel extends Component {
partner_id: session.partner_id
});
onWillStart(async () => {
this.loadPanel();
this.isInternalUser = await this.userService.hasGroup('base.group_user');
});
useEffect(() => {
this.loadPanel();
}, () => [this.props.record.resId]);
}
async loadPanel () {
@@ -15,7 +15,7 @@
<div class='o_field_widget o_field_properties'>
<PropertiesField
columns="1"
showAddButton="1"
showAddButton="true"
name="'article_properties'"
record="this.props.record"
readonly="this.props.record.data.is_locked || !this.props.record.data.user_can_write"
@@ -15,6 +15,7 @@ import { getRandomIcon } from '@knowledge/js/knowledge_utils';
import KnowledgeIcon from '@knowledge/components/knowledge_icon/knowledge_icon';
import MoveArticleDialog from '@knowledge/components/move_article_dialog/move_article_dialog';
import PermissionPanel from '@knowledge/components/permission_panel/permission_panel';
import { KnowledgeFormStatusIndicator } from "@knowledge/components/form_status_indicator/form_status_indicator";
import HistoryDialog from '@web_editor/components/history_dialog/history_dialog';
@@ -262,14 +263,8 @@ class KnowledgeTopbar extends Component {
}
async unarchiveArticle() {
this.actionService.doAction(
await this.orm.call(
'knowledge.article',
'action_unarchive_article',
[this.props.record.resId]
),
{stackPosition: 'replaceCurrentAction'}
);
await this.orm.call('knowledge.article', 'action_unarchive_article', [this.props.record.resId]);
await this.props.record.load();
}
/**
@@ -311,9 +306,6 @@ class KnowledgeTopbar extends Component {
*/
async _onNameClick(event) {
this.env.ensureArticleName();
window.setTimeout(() => {
event.target.select();
});
}
}
@@ -322,6 +314,7 @@ KnowledgeTopbar.props = {
...standardWidgetProps,
};
KnowledgeTopbar.components = {
KnowledgeFormStatusIndicator,
KnowledgeIcon,
PermissionPanel,
};
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates>
<t t-name="knowledge.KnowledgeTopbar">
<div class="o_knowledge_header d-flex gap-2 flex-column justify-content-end flex-sm-row align-items-sm-center border-bottom d-print-none bg-view px-0 py-2 ps-sm-3 pe-sm-2">
<div class="o_knowledge_header d-flex flex-wrap gap-1 flex-column justify-content-end flex-sm-row align-items-sm-center border-bottom d-print-none bg-view px-0 py-2 ps-sm-3 pe-sm-2">
<div class="d-flex flex-grow-1 min-w-0 gap-1 px-2 px-sm-0 pt-2 pt-sm-0">
<a role="button" class="d-md-none btn btn-light align-self-start px-2 py-1" t-on-click="() => this.env.toggleAsideMobile()">
<i class="fa fa-lg fa-bars" title="Toggle aside menu"/>
@@ -31,7 +31,7 @@
t-on-click="ev => this._onNameClick(ev)"
class="o_breadcrumb_article_name_container position-relative text-truncate mx-1">
<!-- span forces the input to match the length of its value -->
<span class="pe-2" t-esc="this.props.record.data.name" t-att-title="this.props.record.data.name" />
<span class="pe-2" t-att-title="this.props.record.data.name" t-out="this.props.record.data.name"/>
<div class="o_field_widget o_required_modifier o_field_char o_breadcrumb_article_name mb-0">
<input t-if="!(props.record.data.is_locked || !props.record.data.user_can_write || !props.record.data.active || !props.record.resId)" id="name" class="o_input" type="text" autocomplete="off"
t-att-value="props.record.data.name" placeholder="Untitled"/>
@@ -42,10 +42,13 @@
</div>
<i class="fa fa-fw fa-lock" title="This article is locked" t-if="this.props.record.data.is_locked" />
</li>
<t t-if="props.record.resId and props.record.data.active and !props.record.data.is_locked and props.record.data.user_can_write">
<KnowledgeFormStatusIndicator model="props.record.model" save="env.save" discard="env.discard"/>
</t>
</ol>
</div>
<!-- Buttons -->
<div class="d-flex gap-1 flex-column flex-lg-row">
<div class="d-flex gap-1 flex-wrap justify-content-end">
<!-- Icon and Cover buttons -->
<div class="d-flex gap-1 o_knowledge_add_buttons" t-if="props.record.resId and props.record.data.active and !props.record.data.is_locked and props.record.data.user_can_write">
<button class="btn btn-light text-nowrap o_knowledge_add_icon" t-if="!props.record.data.icon"
@@ -79,7 +82,7 @@
<i class="fa fa-fw fs-6 fa-plus-circle me-1"/>New
</a>
<div class="o-dropdown dropdown o-dropdown--no-caret" t-if="props.record.resId and props.record.data.active">
<a t-ref="sharePanel_button" role="button" class="btn btn-light btn-share dropdown-toggle" id="dropdown_share_panel" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" data-hotkey="s">
<a t-ref="sharePanel_button" role="button" class="btn btn-light btn-share dropdown-toggle" id="dropdown_share_panel" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" data-hotkey="shift+s">
<i class="fa fa-fw fs-6 fa-share-alt me-1"/>
<t t-if="isInternalUser">Share</t>
<t t-else="">Members</t>
@@ -97,7 +100,7 @@
<i class="fa fa-fw fs-6 fa-comments"/>
</a>
<a t-ref="btn_history"
t-if="props.record.resId and isInternalUser"
t-if="props.record.resId and isInternalUser and props.record.data.user_can_write"
role="button"
t-attf-class="btn btn-light btn-history #{state.displayHistory ? 'active' : ''}"
data-hotkey="h"
@@ -0,0 +1,26 @@
/* @odoo-module */
import { threadActionsRegistry } from "@mail/core/common/thread_actions";
import { patch } from "@web/core/utils/patch";
patch(threadActionsRegistry.get("expand-form"), {
async open(component) {
if (component.thread.model === "knowledge.article.thread") {
const [articleThreadData] = await component.env.services.orm.read(
"knowledge.article.thread",
[component.thread.id],
["article_id"],
{ load: false }
);
component.actionService.doAction("knowledge.ir_actions_server_knowledge_home_page", {
stackPosition: "replaceCurrentAction",
additionalContext: {
res_id: articleThreadData["article_id"],
},
});
component.chatWindowService.close(component.props.chatWindow);
} else {
super.open(component);
}
},
});
@@ -0,0 +1,14 @@
<svg width="18" height="11" viewBox="0 0 18 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
clip-rule="evenodd"
d="M15.3 4.5C15.3 4.84313 15.2353 5.17219 15.12 5.47312C16.7625 5.805 18 7.25906
18 9C18 10.9884 16.3884 12.6 14.4 12.6H4.05C1.81406 12.6 0 10.7859 0 8.55C0 6.78375
1.13063 5.28188 2.70563 4.72781L2.70562 4.72779C2.70281 4.65186 2.7 4.57593 2.7
4.5C2.7 2.01375 4.71375 0 7.2 0C8.86781 0 10.3219 0.905625 11.1009 2.25563C11.5284
1.96875 12.0459 1.8 12.6 1.8C14.0906 1.8 15.3 3.00938 15.3 4.5ZM4.13039 7.61571L7.02427
10.5096C7.19813 10.6835 7.48003 10.6835 7.6539 10.5096L12.7738 5.38965C12.9477 5.21577
12.9477 4.93388 12.7738 4.76002L12.1442 4.13039C11.9704 3.95654 11.6885 3.95654 11.5146
4.13039L7.33909 8.30589L5.38963 6.35646C5.21577 6.18258 4.93386 6.18258 4.76
6.35646L4.13039 6.98608C3.95654 7.15996 3.95654 7.44185 4.13039 7.61571Z" fill="#374151"
/>
</svg>

After

Width:  |  Height:  |  Size: 997 B

@@ -3,7 +3,7 @@
import { _t } from "@web/core/l10n/translation";
import { FormController } from '@web/views/form/form_controller';
import { KnowledgeSidebar } from '@knowledge/components/sidebar/sidebar';
import { useService } from "@web/core/utils/hooks";
import { useBus, useService } from "@web/core/utils/hooks";
import { Deferred } from "@web/core/utils/concurrency";
import { onMounted, onWillStart, useChildSubEnv, useExternalListener, useRef } from "@odoo/owl";
@@ -30,7 +30,14 @@ export class KnowledgeArticleFormController extends FormController {
renameArticle: this.renameArticle.bind(this),
toggleAsideMobile: this.toggleAsideMobile.bind(this),
topbarMountedPromise: this.topbarMountedPromise,
save: this.save.bind(this),
discard: this.discard.bind(this),
});
useBus(this.env.bus, 'KNOWLEDGE:OPEN_ARTICLE', (event) => {
this.openArticle(event.detail.id);
});
// Unregister the current candidate recordInfo for Knowledge macros in
// case of breadcrumbs mismatch.
onWillStart(() => {
+13 -13
View File
@@ -20,17 +20,9 @@ export class KnowledgePlugin {
this.editor = editor;
}
/**
* Remove the highlight decorators from the document and replace the video
* iframe with a video link before saving. The method aims to solve the
* following issues:
* (1) Some components are susceptible to add classes that are meant to be purely for decoration
* or highlighting of specific anchors in the text. These classes shouldn't be saved because
* they serve no real purpose other than highlight the text or decorate it temporarily.
* (2) When saving the document, the sanitizer discards the video iframe
* from the document. As a result, people reading the article outside
* of the odoo backend will not be able to see and access the video.
* To solve that issue, we will replace the iframe with a link before
* saving.
* Some content displayed as part of a Behavior Component render is not destined to be saved.
* The purpose of this function is to clean such content so that it will not be saved nor considered
* during _isDirty evaluation (which is the determining factor to enable a save).
* @param {Element} editable
*/
cleanForSave(editable) {
@@ -40,7 +32,8 @@ export class KnowledgePlugin {
elementToClean.classList.remove(decorationClass);
}
}
// Replace the iframe with a video link:
// Replace the iframe with a video link, because iframe elements are discarded by the backend sanitizer,
// and Behavior components are not rendered for public users, so they'll have access to the link instead
for (const anchor of editable.querySelectorAll('.o_knowledge_behavior_type_video')) {
const props = decodeDataBehaviorProps(anchor.dataset.behaviorProps);
const a = document.createElement('a');
@@ -56,9 +49,16 @@ export class KnowledgePlugin {
// html_field is being saved while the user is editing the name of the
// file (The input is removed by default because it is the child of a
// data-oe-transient-content="true" node).
for (const fileNameEl of editable.querySelectorAll('.o_knowledge_behavior_type_file .o_knowledge_file_name')) {
for (const fileNameEl of editable.querySelectorAll('.o_knowledge_behavior_type_file .o_knowledge_file_name_container')) {
fileNameEl.classList.remove("d-none");
}
// Remove the loading icon and/or error messages from embedded views anchors.
// Only children used as a props for the Embedded View Component are kept.
for (const embeddedViewEl of editable.querySelectorAll(".o_knowledge_behavior_type_embedded_view")) {
const childrenToKeep = [...embeddedViewEl.querySelectorAll(":scope > [data-prop-name]")];
embeddedViewEl.replaceChildren(...childrenToKeep);
}
}
}
@@ -1,5 +1,6 @@
/** @odoo-module */
import { _t } from "@web/core/l10n/translation";
import { isEmptyBlock } from "@web_editor/js/editor/odoo-editor/src/OdooEditor";
import { Wysiwyg } from "@web_editor/js/wysiwyg/wysiwyg";
import { useBus } from '@web/core/utils/hooks';
@@ -9,6 +10,7 @@ import {
getSelectedNodes,
closestElement,
} from "@web_editor/js/editor/odoo-editor/src/utils/utils";
import { ChatGPTPromptDialog } from '@web_editor/js/wysiwyg/widgets/chatgpt_prompt_dialog';
import { useRef } from '@odoo/owl';
/**
@@ -28,6 +30,35 @@ export class KnowledgeWysiwyg extends Wysiwyg {
this.knowledgeCommentsToolbarBtnRef = useRef('knowledgeCommentsToolbarBtn');
}
/**
* This function enables the user to generate an article using ChatGPT.
* We search inside of the generated content if we have a title.
* If we find one then we put it inside of an H1 in order to have it as the article's
* title.
* Otherwise we put a blank H1 in the generated content so that the user can add
* one later.
*/
generateArticle() {
this.env.services.dialog.add(ChatGPTPromptDialog, {
initialPrompt: _t('Write an article about'),
insert: (content) => {
const generatedContentTitle = content.querySelector('h1,h2');
const articleTitle = document.createElement('h1');
if (generatedContentTitle && generatedContentTitle.tagName !== 'H1') {
articleTitle.innerText = generatedContentTitle.innerText;
generatedContentTitle.replaceWith(articleTitle);
} else if (!generatedContentTitle) {
articleTitle.innerHTML = '<br>';
content.prepend(articleTitle);
}
const divElement = document.createElement('div');
divElement.appendChild(content);
this.odooEditor.resetContent(divElement.innerHTML);
}
});
}
/**
* Configure the new buttons added inside the knowledge toolbar.
* @override
+14 -2
View File
@@ -268,16 +268,20 @@ patch(Wysiwyg.prototype, {
articleSelected: article => {
const articleLinkBlock = renderToElement('knowledge.ArticleBehaviorBlueprint', {
href: '/knowledge/article/' + article.articleId,
data: JSON.stringify({
data: encodeDataBehaviorProps({
article_id: article.articleId,
display_name: article.displayName,
})
}),
});
const nameNode = document.createTextNode(article.display_name);
articleLinkBlock.appendChild(nameNode);
this._notifyNewBehavior(articleLinkBlock, restoreSelection);
},
parentArticleId: this.options.recordInfo.res_model === 'knowledge.article' ? this.options.recordInfo.res_id : undefined
}, {
onClose: () => {
restoreSelection();
}
});
},
/**
@@ -315,6 +319,7 @@ patch(Wysiwyg.prototype, {
action_help: actionWindow.act_window?.help,
});
this._notifyNewBehavior(embeddedViewBlock, restoreSelection);
this.env.model.root.update({'full_width': true});
},
/**
* Inserts a video in the editor
@@ -369,6 +374,9 @@ patch(Wysiwyg.prototype, {
};
return insertedNodes;
});
if (behaviorBlueprint.classList.contains('o_knowledge_behavior_type_embedded_view')) {
this.env.model.root.update({'full_width': true});
}
},
/**
* Notify a new @see FileBehavior when selecting a file in a
@@ -420,6 +428,10 @@ patch(Wysiwyg.prototype, {
itemCalendarProps,
});
}
}, {
onClose: () => {
restoreSelection();
}
});
},
+1 -1
View File
@@ -22,7 +22,7 @@ export class UseAsAttachmentMacro extends AbstractMacro {
this.validatePage();
const el = this.getFirstVisibleElement('.o-mail-Chatter-attachFiles:not([disabled])', (matchEl) => {
// Wait for the attachments to be loaded by the chatter.
const attachmentsCountEl = matchEl.querySelector('span');
const attachmentsCountEl = matchEl.querySelector('sup');
return attachmentsCountEl && Number.parseInt(attachmentsCountEl.textContent) > 0;
});
if (el) {
@@ -4,34 +4,47 @@ import { useBus, useService } from '@web/core/utils/hooks';
import { ActionContainer } from '@web/webclient/actions/action_container';
import { MainComponentsContainer } from "@web/core/main_components_container";
import { useOwnDebugContext } from "@web/core/debug/debug_context";
import { session } from '@web/session';
import { Component, onMounted, useExternalListener, useState } from "@odoo/owl";
import { Component, onMounted, useExternalListener } from "@odoo/owl";
export class KnowledgePortalWebClient extends Component {
setup() {
window.parent.document.body.style.margin = "0"; // remove the margin in the parent body
this.actionService = useService("action");
this.orm = useService("orm");
this.router = useService("router");
this.userService = useService("user");
useOwnDebugContext({ categories: ["default"] });
this.state = useState({
fullscreen: false,
});
useBus(this.env.bus, "ACTION_MANAGER:UI-UPDATED", (mode) => {
if (mode !== "new") {
this.state.fullscreen = mode === "fullscreen";
}
});
useBus(this.env.bus, "ROUTE_CHANGE", this._showView);
onMounted(() => { this._showView(); });
useExternalListener(window, "keydown", this.onGlobalKeyDown, { capture: true });
}
/**
* Loads the article specified in the URL hash (eg. /knowledge/article#id=42)
*/
async _showView() {
const { knowledge_article_id } = session;
const isOnKnowledgeArticleFormView = () => {
if (this.actionService.currentController) {
const { action } = this.actionService.currentController;
return action && action.xml_id === "knowledge.knowledge_article_action_form";
}
return false;
};
this.actionService.doAction('knowledge.ir_actions_server_knowledge_home_page', {
additionalContext: knowledge_article_id ? { res_id: knowledge_article_id } : {},
stackPosition: 'replaceCurrentAction',
// When the user is already on the Knowledge form view, we can load
// another record in the model to avoid reloading the sidebar.
if (isOnKnowledgeArticleFormView() && this.router.current.hash.id) {
this.env.bus.trigger("KNOWLEDGE:OPEN_ARTICLE", {
id: this.router.current.hash.id,
});
return;
}
await this.actionService.doAction("knowledge.ir_actions_server_knowledge_home_page", {
additionalContext: this.router.current.hash.id
? { res_id: this.router.current.hash.id }
: {},
stackPosition: "replaceCurrentAction",
});
}
@@ -10,7 +10,7 @@
}
.odoo-editor-editable .o_knowledge_behavior_type_file {
.o_knowledge_file_name {
.o_knowledge_file_name_container {
&:hover i {
visibility: visible !important;
}
@@ -124,6 +124,9 @@
background: radial-gradient($white, transparent);
}
}
.o_kanban_renderer.o_kanban_grouped .o_kanban_group {
background: #{$o-kanban-background};
}
}
// Knowledge Toolbars
@@ -22,6 +22,12 @@ $knowledge-bg--hover: $gray-300;
.o_knowledge_form_view, .o_knowledge_public_view {
background-color: var(--knowledge-view-bg, $o-white);
.o_knowledge_header {
.o_form_status_indicator {
align-self: normal !important;
display: flex;
}
}
.o_knowledge_sidebar {
.o_article:not(.o_article_has_children) {
.o_article_caret {
@@ -94,6 +100,9 @@ $knowledge-bg--hover: $gray-300;
transition: background-color 0.3s ease-in-out;
&.knowledge-thread-highlighted-comment {
background-color: rgba($knowledge-bg--active, 0.171);
.knowledge-thread-comment:not(.focused-comment) {
background-color: initial;
}
&.focused-comment {
background-color: $knowledge-bg--active;
}
@@ -52,4 +52,7 @@
}
}
}
body > :not(.o_action_manager) {
display: none;
}
}
+24 -15
View File
@@ -34,8 +34,11 @@
.o_knowledge_behavior_type_embedded_view .o_list_renderer thead {
position: relative;
z-index: auto;
}
.position-sticky {
position: unset !important;
}
}
.o_breadcrumb_article_name > input:not(.o_readonly_modifier):hover {
border-bottom: $input-border-width solid $o-brand-primary;
}
@@ -51,7 +54,6 @@
.o_knowledge_editor .o_field_html .note-editable,
.o_knowledge_editor .o_field_html .o_readonly,
.o_knowledge_editor .o_field_html .o_knowledge_helper {
margin-bottom: -0.5rem;
padding-left: var(--editor-gutter-size) !important;
padding-right: calc(var(--editor-gutter-size) + 2rem) !important;
}
@@ -175,6 +177,21 @@
}
}
.o_knowledge_body {
.o_knowledge_icon {
font-size: 3em;
line-height: normal;
margin-top: map-get($spacers, 3) !important;
margin-bottom: 0 !important;
.o_article_emoji {
position: relative;
}
}
.o_widget_knowledge_cover + .o_knowledge_icon {
margin-top: -0.7em !important;
}
}
.o_knowledge_chatter {
.oe_chatter {
padding: 0;
@@ -356,7 +373,7 @@
.o_scroll_view_lg, .o_knowledge_properties {
width: 100%;
}
.o_knowledge_chatter, .o_knowledge_properties {
.o_knowledge_chatter, .o_knowledge_properties, .o_knowledge_comments_panel {
border-top: 1px solid $border-color;
}
.o_knowledge_properties {
@@ -370,18 +387,10 @@
}
@include media-breakpoint-up(sm) {
.o_knowledge_form_view {
.o_scroll_view {
// Make icon overwrap the cover
.o_widget_knowledge_cover + .o_field_knowledge_icon {
margin-bottom: -80px !important;
.o_article_emoji {
position:relative;
top: -50px;
}
}
.o_field_knowledge_icon.o_large {
font-size: 80px;
.o_knowledge_article_view_form_view {
.o_knowledge_body {
.o_knowledge_icon {
font-size: 5em;
}
}
}
@@ -2,7 +2,7 @@
import { SearchModel } from "@web/search/search_model";
export class KnowledgeSearchModel extends SearchModel {
export const KnowledgeSearchModelMixin = (T) => class extends T {
setup(services, args) {
this.onSaveKnowledgeFavorite = args.onSaveKnowledgeFavorite;
this.onDeleteKnowledgeFavorite = args.onDeleteKnowledgeFavorite;
@@ -15,14 +15,22 @@ export class KnowledgeSearchModel extends SearchModel {
*/
async load(config) {
await super.load(config);
if (config.state) {
if (config.state && !this.isStateCompleteForEmbeddedView) {
// If the config contains an imported state that is not directly
// coming from a view that was embedded in Knowledge, the favorite
// filters have to be loaded, since they come from the
// `data-behavior-props` attribute of the anchor for the
// EmbeddedViewBehavior. Otherwise, those are already specified in
// the state and they should not be duplicated.
let defaultFavoriteId = null;
const activateFavorite = "activateFavorite" in config ? config.activateFavorite : true;
if (activateFavorite) {
defaultFavoriteId = this._createGroupOfFavorites(this.irFilters || []);
if (defaultFavoriteId) {
// activate default search items (populate this.query)
this._activateDefaultSearchItems(defaultFavoriteId);
}
}
// activate default search items (populate this.query)
this._activateDefaultSearchItems(defaultFavoriteId);
}
}
@@ -42,4 +50,24 @@ export class KnowledgeSearchModel extends SearchModel {
async _deleteIrFilters(searchItem) {
this.onDeleteKnowledgeFavorite(searchItem);
}
/**
* @override
* @returns {Object}
*/
exportState() {
const state = super.exportState();
state.isStateCompleteForEmbeddedView = true;
return state;
}
/**
* @override
*/
_importState(state) {
super._importState(state);
this.isStateCompleteForEmbeddedView = state.isStateCompleteForEmbeddedView;
}
}
export class KnowledgeSearchModel extends KnowledgeSearchModelMixin(SearchModel) {}
+5 -2
View File
@@ -1,6 +1,7 @@
/** @odoo-module */
import { KnowledgeSearchModel } from "@knowledge/search_model/search_model";
import { KnowledgeSearchModelMixin } from "@knowledge/search_model/search_model";
import { SearchModel } from "@web/search/search_model";
import { View } from "@web/views/view";
export class EmbeddedView extends View {
@@ -14,7 +15,9 @@ export class EmbeddedView extends View {
const {additionalViewProps, onDeleteKnowledgeFavorite, onSaveKnowledgeFavorite, ...viewProps} = props;
Object.assign(viewProps, additionalViewProps);
await super.loadView(viewProps);
this.withSearchProps.SearchModel = KnowledgeSearchModel;
this.withSearchProps.SearchModel = KnowledgeSearchModelMixin(
this.withSearchProps.SearchModel || SearchModel
);
this.withSearchProps.searchModelArgs = {
onSaveKnowledgeFavorite,
onDeleteKnowledgeFavorite,
@@ -2,6 +2,7 @@
import { _t } from "@web/core/l10n/translation";
import { memoize } from "@web/core/utils/functions";
import { registry } from "@web/core/registry";
import { HotkeyCommandItem } from "@web/core/commands/default_providers";
import { splitCommandName } from "@web/core/commands/command_palette";
@@ -30,6 +31,18 @@ commandSetupRegistry.add("?", {
const commandProviderRegistry = registry.category("command_provider");
const fn = (hidden) => {
// Check if the user has enough rights to create a new article
const canCreate = memoize(env => {
return env.services.orm.call(
"knowledge.article",
"check_access_rights",
[],
{
operation: "create",
raise_exception: false,
},
);
});
return async function provide(env, options) {
const articlesData = await env.services.orm.call(
"knowledge.article",
@@ -42,18 +55,9 @@ const fn = (hidden) => {
);
if (!hidden){
if (articlesData.length === 0) {
// check if user has enough rights to create a new article
const canCreate = await env.services.orm.call(
"knowledge.article",
"check_access_rights",
[],
{
operation: "create",
raise_exception: false,
},
);
// only display the "create article" command when there are at least 3 character
if (canCreate && options.searchValue.length > 2) {
// Only display the "create article" command when the user can
// create an article and when the user inputs at least 3 characters
if (await canCreate(env) && options.searchValue.length > 2) {
return [{
Component: Knowledge404Command,
async action() {
@@ -15,7 +15,7 @@
</xpath>
<xpath expr="//t[@archInfo='archInfo']" position="attributes">
<attribute name="class" add="'p-0 d-flex flex-column flex-grow-1 min-w-0'" />
<attribute name="class" add="'p-0 d-flex flex-column flex-grow-1 min-w-0 mw-100'" />
</xpath>
</t>
@@ -12,7 +12,6 @@ import { EmbeddedViewBehavior } from "@knowledge/components/behaviors/embedded_v
import { EmbeddedViewManager } from "@knowledge/components/behaviors/embedded_view_behavior/embedded_view_manager";
import { makeView, setupViewRegistries } from "@web/../tests/views/helpers";
import { HtmlField } from "@web_editor/js/backend/html_field";
import { encodeDataBehaviorProps } from "@knowledge/js/knowledge_utils";
import { onMounted } from "@odoo/owl";
@@ -22,21 +21,13 @@ let embedMountedPromise;
/**
* Insert an embedded kanban view inside a Knowledge article
* @param {HTMLElement} htmlField - Object HtmlField of Knowledge
* @param {HTMLElement} target - Target node
* @param {HTMLElement} action - Server action used for the embed
*/
const insertKanbanEmbed = async (htmlField, target) => {
const insertKanbanEmbed = async (htmlField, action) => {
const wysiwyg = htmlField.wysiwyg;
const behaviorProps = encodeDataBehaviorProps({
act_window: serverData.actions.actionExternalKanban,
name: 'External Embed',
view_type: 'kanban',
context: {}
});
wysiwyg.odooEditor.observerUnactive();
const embedDiv = document.createElement('div');
embedDiv.className = "o_knowledge_behavior_anchor o_knowledge_behavior_type_embedded_view";
embedDiv.setAttribute('data-behavior-props', behaviorProps);
target.replaceWith(embedDiv);
await wysiwyg._insertEmbeddedView(null, action, 'kanban', 'External Kanban');
await htmlFieldReadyPromise;
await htmlField.mountBehaviors();
wysiwyg.odooEditor.observerActive();
@@ -52,7 +43,7 @@ const insertKanbanEmbed = async (htmlField, target) => {
* would need to change its use for embedded views.
*/
QUnit.module("Knowledge External Embeds Hotkeys", (hooks) => {
QUnit.module("Knowledge External Embeds Tests", (hooks) => {
hooks.beforeEach(() => {
htmlFieldReadyPromise = makeDeferred();
embedMountedPromise = makeDeferred();
@@ -87,13 +78,15 @@ QUnit.module("Knowledge External Embeds Hotkeys", (hooks) => {
knowledge_article: {
fields: {
display_name: {string: "Displayed name", type: "char"},
full_width: {string: "Is Full Width ?", type: "boolean"},
body: {string: "Body", type: 'html'},
},
records: [{
id: 1,
display_name: "My Article",
body: `<p class="embedded_view_target"><br/></p>
<p class="regular_html_field_node"><br/></p>`
<p class="regular_html_field_node"><br/></p>`,
full_width: false
}]
},
quick_create: {
@@ -148,7 +141,7 @@ QUnit.module("Knowledge External Embeds Hotkeys", (hooks) => {
setupViewRegistries();
});
QUnit.test('Testing normal hotkey behavior: kanban embed', async function (assert) {
assert.expect(2);
assert.expect(3);
await makeView({
type: "form",
resModel: "knowledge_article",
@@ -156,6 +149,7 @@ QUnit.module("Knowledge External Embeds Hotkeys", (hooks) => {
arch: `<form js_class="knowledge_article_view_form">
<sheet>
<div>
<field name="full_width" readonly="1"/>
<div class="o_knowledge_editor d-flex flex-grow-1">
<field name="body" widget="knowledge_article_html_field"/>
</div>
@@ -172,14 +166,14 @@ QUnit.module("Knowledge External Embeds Hotkeys", (hooks) => {
}
}
});
const htmlField = await htmlFieldReadyPromise;
const editable = htmlField.wysiwyg.odooEditor.editable;
const embedViewTargetNode = editable.querySelector('.embedded_view_target');
const regularHtmlFieldNode = editable.querySelector('.regular_html_field_node');
await insertKanbanEmbed(htmlField, serverData.actions.actionExternalKanban);
// Embedded views trigger full width
assert.equal(document.querySelector('.o_field_boolean[name="full_width"] input').value, 'on');
await insertKanbanEmbed(htmlField, embedViewTargetNode);
const editable = htmlField.wysiwyg.odooEditor.editable;
const regularHtmlFieldNode = editable.querySelector('.regular_html_field_node');
await embedMountedPromise;
const embedViewWrapperNode = editable.querySelector('.o_knowledge_behavior_anchor.o_knowledge_behavior_type_embedded_view')
await click(editable, '.o_kanban_group:nth-of-type(1) .o_kanban_quick_add');
@@ -3,7 +3,7 @@
import { onMounted, onWillStart, status } from "@odoo/owl";
import { FormController } from "@web/views/form/form_controller";
import { registry } from "@web/core/registry";
import { click, getFixture, makeDeferred, nextTick, patchWithCleanup } from "@web/../tests/helpers/utils";
import { click, getFixture, makeDeferred, mockSendBeacon, nextTick, patchWithCleanup } from "@web/../tests/helpers/utils";
import { makeView, setupViewRegistries } from "@web/../tests/views/helpers";
import { renderToElement } from "@web/core/utils/render";
import { patch } from "@web/core/utils/patch";
@@ -486,30 +486,19 @@ QUnit.module("Knowledge - Ensure body save scenarios", (hooks) => {
//--------------------------------------------------------------------------
QUnit.test("Ensure save on beforeLeave when Behaviors mutex is not idle and when it is", async function (assert) {
await testFormSave(assert, "beforeLeave");
});
/**
* This test forces a call to the beforeLeave function of the KnowledgeFormController. It
* simulates that we leave the form view.
*
* The function will be called 2 times successively:
* 1- at a controlled time when a Behavior is in the process of being
* mounted, but not finished, to ensure that the saved article value is
* not corrupted (no missing html node).
* 2- at a controlled time when every Behavior was successfully mounted and
* no other Behavior is being mounted, to ensure that the saved article
* value contains information updated from the Behavior nodes.
*/
QUnit.test("Ensure save on beforeUnload when Behaviors mutex is not idle and when it is", async function (assert) {
await testFormSave(assert, "beforeUnload");
});
//--------------------------------------------------------------------------
// UTILS
//--------------------------------------------------------------------------
/**
* This test util will force a call to a KnowledgeFormController method
* that should save the current record (i.e. beforeLeave and beforeUnload).
*
* The method will be called 2 times successively:
* 1- at a controlled time when a Behavior is in the process of being
* mounted, but not finished, to ensure that the saved article value is
* not corrupted (no missing html node).
* 2- at a controlled time when every Behavior was successfully mounted and
* no other Behavior is being mounted, to ensure that the saved article
* value contains information updated from the Behavior nodes.
*/
async function testFormSave (assert, formSaveHandlerName) {
assert.expect(4);
let writeCount = 0;
await makeView({
@@ -583,7 +572,7 @@ QUnit.module("Knowledge - Ensure body save scenarios", (hooks) => {
// Attempt a save when the mutex is not idle. It should save the
// unchanged blueprint of the Behavior.
await formController[formSaveHandlerName]();
await formController.beforeLeave();
// Allow the Template Behavior to go past the `onWillStart` lifecycle
// step.
@@ -594,8 +583,107 @@ QUnit.module("Knowledge - Ensure body save scenarios", (hooks) => {
await htmlField.mountBehaviors();
// Attempt a save when the mutex is idle.
await formController[formSaveHandlerName]();
}
await formController.beforeLeave();
});
QUnit.test("Ensure save on beforeUnload when Behaviors mutex is not idle and when it is", async function (assert) {
/**
* This test forces a call to the beforeUnload function of the KnowledgeFormController. It
* simulates that the close the browser/tab when being on that form view.
*
* The function will be called 2 times successively:
* 1- at a controlled time when a Behavior is in the process of being
* mounted, but not finished, to ensure that the saved article value is
* not corrupted (no missing html node).
* 2- at a controlled time when every Behavior was successfully mounted and
* no other Behavior is being mounted, to ensure that the saved article
* value contains information updated from the Behavior nodes.
*/
mockSendBeacon((route) => {
if (route === '/web/dataset/call_kw/knowledge_article/web_save') {
if (writeCount === 0) {
// The first expected `write` value should be the
// unmodified blueprint, since OWL has not finished
// mounting the Behavior nodes.
assert.notOk(editor.editable.querySelector('[data-prop-name="content"]'));
assert.equal(editor.editable.querySelector('.witness').textContent, "WITNESS_ME!");
} else if (writeCount === 1) {
// Change the expected `write` value, the "witness node"
// should have been cleaned since it serves no purpose
// for this Behavior in the OWL template.
assert.notOk(editor.editable.querySelector('.witness'));
assert.equal(editor.editable.querySelector('[data-prop-name="content"]').innerHTML, "<p><br></p>");
} else {
// This should never be called and will fail if it is.
assert.ok(writeCount === 1, "Write should only be called 2 times during this test");
}
writeCount += 1;
}
});
assert.expect(4);
let writeCount = 0;
await makeView({
type: "form",
resModel: "knowledge_article",
serverData,
arch,
resId: 1,
});
// Let the htmlField be mounted and recover the Component instance.
htmlField = await htmlFieldPromise;
const editor = htmlField.wysiwyg.odooEditor;
// Patch to control when the next mounting is done.
const isAtWillStart = makeDeferred();
const pauseWillStart = makeDeferred();
const unpatch = patch(TemplateBehavior.prototype, {
setup() {
super.setup(...arguments);
onWillStart(async () => {
isAtWillStart.resolve();
await pauseWillStart;
unpatch();
});
}
});
// Introduce a Behavior blueprint with an "witness node" that does not
// serve any purpose except for the fact that it should be left
// untouched until OWL completely finishes its mounting process
// and at that point it will be replaced by the rendered OWL template.
const behaviorHTML = `
<div class="o_knowledge_behavior_anchor o_knowledge_behavior_type_template">
<div class="witness">WITNESS_ME!</div>
</div>
`;
const anchor = parseHTML(editor.document, behaviorHTML).firstChild;
const target = editor.editable.querySelector(".test_target");
// The BehaviorState MutationObserver will try to start the mounting
// process for the Behavior with the anchor node as soon as it is in
// the DOM.
editor.editable.replaceChild(anchor, target);
// Validate the mutation as a normal user history step.
editor.historyStep();
// Wait for the Template Behavior onWillStart lifecycle step.
await isAtWillStart;
// Attempt a save when the mutex is not idle. It should save the
// unchanged blueprint of the Behavior.
await formController.beforeUnload();
// Allow the Template Behavior to go past the `onWillStart` lifecycle
// step.
pauseWillStart.resolve();
// Wait for the mount mutex to be idle. The Template Behavior should
// be fully mounted after this.
await htmlField.mountBehaviors();
// Attempt a save when the mutex is idle.
await formController.beforeUnload();
});
});
//==============================================================================
@@ -0,0 +1,58 @@
/* @odoo-module */
import { startServer } from "@bus/../tests/helpers/mock_python_environment";
import { addModelNamesToFetch } from "@bus/../tests/helpers/model_definitions_helpers";
import { start } from "@mail/../tests/helpers/test_utils";
import { click, contains } from "@web/../tests/utils";
import { makeDeferred, patchWithCleanup } from "@web/../tests/helpers/utils";
QUnit.module("Knowledge - Thread tests");
addModelNamesToFetch(["knowledge.article", "knowledge.article.thread"]);
QUnit.test("Expand article.thread opens linked article", async function (assert) {
const pyEnv = await startServer();
const actionPromise = makeDeferred();
const { env } = await start();
patchWithCleanup(env.services.action, {
doAction(action, params) {
assert.ok(params?.additionalContext?.res_id);
assert.strictEqual(action, "knowledge.ir_actions_server_knowledge_home_page");
assert.step("knowledge_action_called");
actionPromise.resolve();
},
});
const articleId = pyEnv["knowledge.article"].create({
name: "Thread tests",
body: `
<h1>Thread tests</h1>
<p>Hello World</p>
`,
});
const thread = pyEnv["knowledge.article.thread"].create({
article_id: articleId,
});
pyEnv["bus.bus"]._sendone(pyEnv.currentPartner, "mail.message/inbox", {
author_id: pyEnv.publicPartnerId,
body: "Howdy Neighbor",
id: thread,
needaction_partner_ids: [pyEnv.currentPartnerId],
model: "knowledge.article.thread",
res_id: thread,
record_name: "Thread tests",
});
await contains(".o-mail-MessagingMenu-counter", { text: "1" });
await click(".o-mail-DiscussSystray-class .fa-comments");
await click(".o-mail-NotificationItem");
await contains(".o-mail-ChatWindow-header", { text: "Thread tests" });
await click(".o-mail-ChatWindow-command[title='Open Form View']");
await actionPromise;
await assert.verifySteps(["knowledge_action_called"]);
await contains(".o-mail-ChatWindow-header", { count: 0 });
});
@@ -205,7 +205,7 @@ registry.category("web_tour.tours").add('knowledge_calendar_command_tour', {
trigger: '.o_knowledge_editor .odoo-editor-editable h1',
run: 'text Item Article',
}, { // Go back to parent article
trigger: '.o_knowledge_tree .o_article_name:contains("EditorCommandsArticle")',
trigger: '.o_knowledge_tree .o_article_name:contains("Article Items")',
run: 'click',
}, { // Check that the item is shown in the calendar
trigger: '.fc-time-grid-event .o_event_title:contains("Item Article")',
@@ -218,8 +218,10 @@ registry.category("web_tour.tours").add('knowledge_calendar_command_tour', {
//-------------------------------------------------------------------------
// Open the view props editor
trigger: '.o_knowledge_behavior_type_embedded_view .o_knowledge_toolbar button:contains("Edit")',
trigger: '.o_control_panel_breadcrumbs_actions .dropdown-toggle',
run: 'click',
}, {
trigger: '.dropdown-item:contains(Edit)'
}, { // Change the start property
trigger: '.o_knowledge_item_calendar_dialog_date_start .o_select_menu_toggler',
run: 'click',
@@ -258,8 +260,10 @@ registry.category("web_tour.tours").add('knowledge_calendar_command_tour', {
extra_trigger: '.fc-view:not(:has(.fc-event-container))',
run: () => {},
}, { // Change start and stop dates again
trigger: '.o_knowledge_behavior_type_embedded_view .o_knowledge_toolbar button:contains("Edit")',
trigger: '.o_control_panel_breadcrumbs_actions .dropdown-toggle',
run: 'click',
}, {
trigger: '.dropdown-item:contains(Edit)'
}, { // Change the start property
trigger: '.o_knowledge_item_calendar_dialog_date_start .o_select_menu_toggler',
run: 'click',
@@ -279,8 +283,10 @@ registry.category("web_tour.tours").add('knowledge_calendar_command_tour', {
trigger: '.modal-footer .btn-primary',
run: 'click',
}, { // Open the view
trigger: '.o_knowledge_behavior_type_embedded_view .o_knowledge_toolbar button:contains("Open")',
trigger: '.o_control_panel_breadcrumbs_actions .dropdown-toggle',
run: 'click',
}, {
trigger: '.dropdown-item:contains(Open)'
}, { // Check that the item is shown
trigger: '.fc-view .o_event_title:contains("Item Article")',
extra_trigger: '.o_knowledge_article_view_calendar_embedded_view.o_action',
@@ -375,7 +381,7 @@ registry.category("web_tour.tours").add('knowledge_calendar_command_tour', {
trigger: '.modal-dialog .btn-primary',
run: 'click',
}, { // Go back to parent article
trigger: '.o_knowledge_tree .o_article_name:contains("EditorCommandsArticle")',
trigger: '.o_knowledge_tree .o_article_name:contains("Article Items")',
run: 'click',
}, { // Make sure view is not crashed and shows nocontent helper
trigger: '.o_knowledge_article_view_calendar_embedded_view .o_knowledge_item_calendar_nocontent',
@@ -32,7 +32,7 @@ registry.category("web_tour.tours").add('knowledge_file_command_tour', {
extra_trigger: 'iframe.o-FileViewer-view body:contains(Content)',
run: 'click',
}, {
trigger: '.o_knowledge_file_name:contains(Onboarding)',
trigger: '.o_knowledge_file_name_container:contains(Onboarding)',
run: function() {
this.$anchor[0].dispatchEvent(new Event('focus'));
}
@@ -43,7 +43,14 @@ registry.category("web_tour.tours").add('knowledge_file_command_tour', {
this.$anchor[0].dispatchEvent(new Event('blur'));
}
}, {
trigger: '.o_knowledge_file_name > div:contains(Renamed)',
run: () => {},
trigger: 'span.o_knowledge_file_name',
run: function() {
// specifically test that there is no zeroWidthSpace character in the
// name that would be added by the editor
const currentName = this.$anchor[0].textContent;
if (currentName !== "Renamed") {
throw new Error(`The new file name was expected to be: "Renamed", but the actual value is: "${currentName}"`);
}
},
}, ...endKnowledgeTour()
]});
@@ -167,8 +167,10 @@ function domHelpFieldSteps () {
trigger: '.o_knowledge_behavior_type_embedded_view .o_kanban_renderer',
run: () => {}
}, { // open the view
trigger: '.o_knowledge_toolbar button:contains(Open)',
run: 'click'
trigger: '.o_control_panel_breadcrumbs_actions .dropdown-toggle',
run: 'click',
}, {
trigger: '.dropdown-item:contains(Open)'
}, { // verify that the help message is displayed
trigger: '.o_action_manager > .o_view_controller.o_kanban_view .o_nocontent_help:contains("Test help message")',
run: () => {}
@@ -211,8 +213,10 @@ function domHelpFieldSteps () {
trigger: '.o_knowledge_behavior_type_embedded_view .o_kanban_renderer',
run: () => {},
}, { // open the view
trigger: '.o_knowledge_toolbar button:contains(Open)',
run: 'click'
trigger: '.o_control_panel_breadcrumbs_actions .dropdown-toggle',
run: 'click',
}, {
trigger: '.dropdown-item:contains(Open)'
}, { // verify that the default help message is displayed
trigger: '.o_action_manager > .o_view_controller.o_kanban_view .o_nocontent_help:contains("No data to display")',
run: () => {}
@@ -42,8 +42,10 @@ registry.category("web_tour.tours").add('knowledge_list_command_tour', {
behaviorProps = decodeDataBehaviorProps(embeddedViewElement.dataset.behaviorProps);
}
}, { // click on rename button
trigger: '.o_knowledge_toolbar button:contains(Rename)',
trigger: '.o_control_panel_breadcrumbs_actions .dropdown-toggle',
run: 'click',
}, {
trigger: '.dropdown-item:contains(Edit)'
}, { // click to validate the modal
trigger: '.modal-footer button.btn-primary',
run: 'click'
@@ -52,6 +54,9 @@ registry.category("web_tour.tours").add('knowledge_list_command_tour', {
run: () => {
const embeddedViewElement = document.querySelector('.o_knowledge_behavior_type_embedded_view');
const newBehaviorProps = decodeDataBehaviorProps(embeddedViewElement.dataset.behaviorProps);
if (newBehaviorProps.display_name !== behaviorProps.display_name) {
throw new Error('The name displayed should not have changed');
}
if (JSON.stringify(newBehaviorProps) !== JSON.stringify(behaviorProps)) {
// check that knowledge.article render_embedded_view urllib.parse.quote did
// produce an equivalent data-behavior-props as knowledge_utils encodeDataBehaviorProps encodeURIComponent
@@ -59,8 +64,10 @@ registry.category("web_tour.tours").add('knowledge_list_command_tour', {
}
}
}, { // click on rename button
trigger: '.o_knowledge_toolbar button:contains(Rename)',
trigger: '.o_control_panel_breadcrumbs_actions .dropdown-toggle',
run: 'click',
}, {
trigger: '.dropdown-item:contains(Edit)'
}, { // rename the view
trigger: '.modal-body input',
run: 'text New Title',
@@ -4,6 +4,50 @@ import { registry } from "@web/core/registry";
import { endKnowledgeTour, openCommandBar } from "../knowledge_tour_utils.js";
import { stepUtils } from "@web_tour/tour_service/tour_utils";
/**
* Verify that a filter is not duplicated and is properly maintained after
* a round trip with the breadcrumbs.
*
* @param {String} kanban name of a kanban view in which records can be created
* @param {String} filterName name of a favorite filter which is already present in the view
* @returns {Array} steps
*/
const validateFavoriteFilterPersistence = function(kanban, filterName) {
return [{
content: 'create and edit item in the kanban view',
trigger: `.o_knowledge_embedded_view .o_kanban_view:contains(${kanban}) .o-kanban-button-new`,
run: "click",
}, {
content: 'Give the name to the item',
trigger: 'input#name_0',
run: 'text Item 1',
}, {
content: 'click on the edit button',
trigger: '.o_kanban_edit',
}, {
content: `go to the ${kanban} from the breadcrumb`,
trigger: '.o_back_button',
}, {
// Open the favorite of the first kanban and check it's favorite
trigger: `.o_breadcrumb:contains('${kanban}')`,
run: function () {
const view = this.$anchor[0].closest(
'.o_kanban_view'
);
const searchMenuButton = view.querySelector(".o_searchview_dropdown_toggler");
searchMenuButton.click();
},
}, {
trigger: '.o_favorite_menu',
run: function () {
const favorites = this.$anchor[0].querySelectorAll("span.dropdown-item");
if (favorites.length !== 1 || favorites[0].innerText !== filterName) {
console.error(`Only one filter "(${filterName})" should be available`);
}
},
}]
};
/**
* Insert the Knowledge kanban view as an embedded view in article.
*
@@ -65,11 +109,15 @@ const validateFavoriteFiltersSteps = function (kanban1, kanban2) {
// check that the search item has been added
trigger: ".o_facet_value",
run: function () {
const items = document.querySelectorAll(".o_facet_value");
if (items.length !== 1) {
console.error("The search should be applied only on the first view");
} else if (items[0].innerText !== 'testFilter') {
console.error(`Wrong favorite name: ${items[0].innerText}`);
const items = [...document.querySelectorAll(".o_searchview_facet")];
const testFacets = items.filter((el) => {
return (
el.querySelector(".o_searchview_facet_label .fa-star") &&
el.querySelector(".o_facet_values")?.innerText === "testFilter"
);
});
if (testFacets.length !== 1) {
console.error("The 'testFilter' facet should be applied only on the first view");
}
},
}, {
@@ -157,6 +205,8 @@ registry.category("web_tour.tours").add("knowledge_items_search_favorites_tour",
run: () => {},
},
...validateFavoriteFiltersSteps("Items 1", "Items 2"),
// testFilter was added as a favorite during validateFavoriteFiltersSteps to Items 1
...validateFavoriteFilterPersistence("Items 1", "testFilter"),
...endKnowledgeTour(),
],
});
@@ -168,8 +218,10 @@ registry.category("web_tour.tours").add("knowledge_search_favorites_tour", {
// insert a first kanban view
...embedKnowledgeKanbanViewSteps("Article 1"),
{ // wait for embedded view to load and click on rename button
trigger: '.o_knowledge_behavior_type_embedded_view:has(.o_knowledge_embedded_view .o_control_panel:contains(Articles)) .o_knowledge_toolbar button:contains(Rename)',
trigger: '.o_knowledge_behavior_type_embedded_view:has(.o_knowledge_embedded_view .o_control_panel:contains(Articles)) .o_control_panel_breadcrumbs_actions .dropdown-toggle',
allowInvisible: true,
}, {
trigger: '.dropdown-item:contains(Edit)'
}, { // rename the view Kanban 1
trigger: '.modal-dialog input.form-control',
run: `text Kanban 1`,
@@ -128,9 +128,16 @@ registry.category("web_tour.tours").add('knowledge_main_flow_tour', {
trigger: '.o_field_many2many_tags_email[name=partner_ids] input',
run: 'text micheline@knowledge.com',
}, {
// Create the partner
trigger: '.ui-autocomplete.dropdown-menu a:contains("micheline@knowledge.com")',
in_modal: false,
// Open the simplified create form view
trigger: '.o-autocomplete--dropdown-menu .o_m2o_dropdown_option_create_edit a',
run: 'click',
}, {
// Give an email address to the partner
trigger: '.o_field_widget[name=email] input',
run: 'text micheline@knowledge.com',
}, {
// Save the new partner
trigger: '.o_form_button_save',
}, {
// Submit the invite wizard
trigger: 'button:contains("Invite")',
@@ -90,9 +90,16 @@ registry.category("web_tour.tours").add('knowledge_sidebar_tour', {
trigger: '.o_field_many2many_tags_email[name=partner_ids] input',
run: 'text henri@knowledge.com',
}, {
// Create the partner
trigger: '.ui-autocomplete.dropdown-menu a:contains("henri@knowledge.com")',
in_modal: false,
// Open the simplified create form view
trigger: '.o-autocomplete--dropdown-menu .o_m2o_dropdown_option_create_edit a',
run: 'click',
}, {
// Give an email address to the partner
trigger: '.o_field_widget[name=email] input',
run: 'text henri@knowledge.com',
}, {
// Save the new partner
trigger: '.o_form_button_save',
}, {
// Submit the invite wizard
trigger: 'button:contains("Invite")',
@@ -1,11 +1,16 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import json
from datetime import datetime
from lxml import html
from unittest.mock import patch
from urllib import parse
from odoo import exceptions
from odoo.addons.knowledge.tests.common import KnowledgeCommonWData
from odoo.exceptions import UserError
from odoo.tests.common import tagged, users
from odoo.tools import mute_logger
@@ -146,6 +151,30 @@ class TestKnowledgeArticleBusiness(KnowledgeCommonBusinessCase):
with self.assertRaises(exceptions.AccessError):
Article.article_create(title=_title, parent_id=private_nonmember.id, is_private=False)
@users('employee')
def test_article_get_sidebar_articles(self):
""" Testing the main access point for the sidebar. """
playground_root = self.article_workspace.with_env(self.env)
playground_children = self.workspace_children.with_env(self.env)
shared_root = self.article_shared.with_env(self.env)
# all articles are folded, expect only roots and no favorite
sidebar_articles = self.env['knowledge.article'].get_sidebar_articles()
self.assertListEqual(sidebar_articles['favorite_ids'], [])
self.assertListEqual([article['id'] for article in sidebar_articles['articles']], (shared_root + playground_root).ids)
# add both articles as favorite, favorite_ids should be populated
(playground_root + shared_root).action_toggle_favorite()
sidebar_articles = self.env['knowledge.article'].get_sidebar_articles()
self.assertListEqual(sidebar_articles['favorite_ids'], (playground_root + shared_root).ids)
# remove access to shared article, favorite_ids should have one element and only playground should be kept
shared_root.sudo()._add_members(self.partner_employee, 'none', True)
sidebar_articles = self.env['knowledge.article'].get_sidebar_articles()
self.assertListEqual(sidebar_articles['favorite_ids'], playground_root.ids)
self.assertListEqual([article['id'] for article in sidebar_articles['articles']], playground_root.ids)
# unfold playground, should contain its children
sidebar_articles = self.env['knowledge.article'].get_sidebar_articles(playground_root.ids)
self.assertListEqual(sidebar_articles['favorite_ids'], [playground_root.id])
self.assertListEqual([article['id'] for article in sidebar_articles['articles']], (playground_children + playground_root).ids)
@mute_logger('odoo.addons.base.models.ir_rule', 'odoo.addons.mail.models.mail_mail', 'odoo.models.unlink', 'odoo.tests')
@users('employee')
def test_article_invite_members(self):
@@ -684,6 +713,16 @@ class TestKnowledgeArticleBusiness(KnowledgeCommonBusinessCase):
self.assertFalse(workspace_children[0].parent_id)
self.assertEqual(workspace_children.root_article_id, workspace_children[0])
workspace_child_item = self.env['knowledge.article'].create({
'name': 'Article Item Child',
'parent_id': article_workspace.id,
'is_article_item': True
}).with_env(self.env)
with self.assertRaises(exceptions.ValidationError):
workspace_children[0].move_to(parent_id=workspace_child_item.id)
@mute_logger('odoo.addons.base.models.ir_rule')
@users('employee')
def test_article_move_to_shared(self):
@@ -970,6 +1009,121 @@ class TestKnowledgeArticleCopy(KnowledgeCommonBusinessCase):
self.assertFalse(new_article.child_ids)
self.assertFalse(new_article.parent_id)
def test_article_make_private_copy_having_embedded_views_of_article_items(self):
""" When the user copies an article, the system should copy the body
of the original article and update the ID references stored within
it so that the embedded views listing the article items of the original
article now list the article items of the copy. This test will check
that the ID references have been updated in the body of the new article. """
article = self.env['knowledge.article'].create({
'name': 'Hello'
})
def render_embedded_view(behavior_props):
return '''
<div class="o_knowledge_behavior_anchor o_knowledge_behavior_type_embedded_view"
data-oe-protected="true"
data-behavior-props="%s"/>
''' % (parse.quote(json.dumps(behavior_props)))
article.write({
'body': (
'<p>Hello world</p>' +
render_embedded_view({
'action_xml_id': 'knowledge.knowledge_article_item_action',
'display_name': 'Kanban',
'view_type': 'kanban',
'context': {
'active_id': article.id,
'default_parent_id': article.id,
'default_icon': '📄',
'default_is_article_item': True,
}
}) +
render_embedded_view({
'action_xml_id': 'knowledge.knowledge_article_item_action',
'display_name': 'List',
'view_type': 'list',
'context': {
'active_id': article.id,
'default_parent_id': article.id,
'default_icon': '📄',
'default_is_article_item': True,
}
}) +
render_embedded_view({
'action_xml_id': 'knowledge.knowledge_article_action',
'display_name': 'Articles',
'view_type': 'list',
'context': {
'search_default_filter_trashed': 1,
}
})
)
})
expected_view_types = [
'kanban',
'list',
'list'
]
expected_contexts = [{
'active_id': article.id,
'default_parent_id': article.id,
'default_icon': '📄',
'default_is_article_item': True,
}, {
'active_id': article.id,
'default_parent_id': article.id,
'default_icon': '📄',
'default_is_article_item': True,
}, {
'search_default_filter_trashed': 1,
}]
fragment = html.fragment_fromstring(article.body, create_parent=True)
embedded_views = [embedded_view for embedded_view in fragment.findall('.//*[@data-behavior-props]') \
if 'o_knowledge_behavior_type_embedded_view' in embedded_view.get('class')]
# Check that the original article contains the embedded views we want
self.assertEqual(len(embedded_views), 3)
for (embedded_view, expected_view_type, expected_context) in zip(embedded_views, expected_view_types, expected_contexts):
behavior_props = json.loads(parse.unquote(embedded_view.get('data-behavior-props', {})))
self.assertEqual(behavior_props['view_type'], expected_view_type)
self.assertEqual(behavior_props['context'], expected_context)
# Copy the article
new_article = article.action_make_private_copy()
expected_contexts = [{
'active_id': new_article.id,
'default_parent_id': new_article.id,
'default_icon': '📄',
'default_is_article_item': True,
}, {
'active_id': new_article.id,
'default_parent_id': new_article.id,
'default_icon': '📄',
'default_is_article_item': True,
}, {
'search_default_filter_trashed': 1,
}]
fragment = html.fragment_fromstring(new_article.body, create_parent=True)
embedded_views = [embedded_view for embedded_view in fragment.findall('.//*[@data-behavior-props]') \
if 'o_knowledge_behavior_type_embedded_view' in embedded_view.get('class')]
# Check that the context of the embedded views stored in the body of the
# newly created article have properly been updated: The embedded views
# listing the article items of the original article should now list the
# article items of the copy.
self.assertEqual(len(embedded_views), 3)
for (embedded_view, expected_view_type, expected_context) in zip(embedded_views, expected_view_types, expected_contexts):
behavior_props = json.loads(parse.unquote(embedded_view.get('data-behavior-props', {})))
self.assertEqual(behavior_props['view_type'], expected_view_type)
self.assertEqual(behavior_props['context'], expected_context)
@mute_logger('odoo.addons.base.models.ir_model', 'odoo.addons.base.models.ir_rule')
@users('employee')
def test_copy(self):
@@ -1033,6 +1187,20 @@ class TestKnowledgeArticleRemoval(KnowledgeCommonBusinessCase):
""" Testing archive that should also archive children. """
self._test_archive(test_trash=False)
def test_archive_unactive_article(self):
""" Checking that an unactive article can be archived. """
article = self.env['knowledge.article'].create({'name': 'Article'})
self.assertTrue(article.active)
self.assertFalse(article.to_delete)
article.action_archive()
self.assertFalse(article.active)
self.assertFalse(article.to_delete)
article.action_send_to_trash()
self.assertFalse(article.active)
self.assertTrue(article.to_delete)
def _test_archive(self, test_trash=False):
archive_method_name = 'action_send_to_trash' if test_trash else 'action_archive'
@@ -1204,6 +1372,93 @@ class TestKnowledgeArticleRemoval(KnowledgeCommonBusinessCase):
msg="ACLs: unlink is not accessible to employees"):
article_workspace.unlink()
def test_unarchive_article_items_having_archived_parent(self):
""" Check that the user can not unarchive an article item whose parent is archived. """
parent_article = self.env['knowledge.article'].create({
'active': False,
'to_delete': True,
'name': 'Parent article',
})
article_item = self.env['knowledge.article'].create({
'active': False,
'to_delete': True,
'name': 'Article item',
'parent_id': parent_article.id,
'is_article_item': True,
})
with self.assertRaises(UserError):
article_item.action_unarchive()
(parent_article + article_item).action_unarchive()
self.assertTrue(parent_article.active)
self.assertFalse(parent_article.to_delete)
self.assertTrue(article_item.active)
self.assertFalse(article_item.to_delete)
self.assertEqual(article_item.parent_id, parent_article)
@users('employee')
def test_unarchive_article_having_inaccessible_parent(self):
""" Check that the user can restore an article whose parent is inaccessible. """
parent_article = self.env['knowledge.article'].sudo().create({
'active': False,
'to_delete': True,
'name': 'Parent article',
'internal_permission': 'write',
'article_member_ids': [
(0, 0, {
'partner_id': self.env.user.partner_id.id,
'permission': 'none'
}),
(0, 0, {
'partner_id': self.customer.id,
'permission': 'read'
}),
]
}).with_user(self.env.user)
child_article = self.env['knowledge.article'].sudo().create({
'active': False,
'to_delete': True,
'name': 'Child article',
'parent_id': parent_article.id,
'article_member_ids': [
(0, 0, {
'partner_id': self.env.user.partner_id.id,
'permission': 'write'
}),
]
}).with_user(self.env.user)
# Check the access rights:
with self.assertRaises(exceptions.AccessError):
parent_article.check_access_rule('read')
child_article.check_access_rule('write')
# Unarchive the child article:
child_article.action_unarchive()
# When the parent article is in the trash, the child article should be
# detached from its parent so that it will not be deleted when the parent
# article is deleted.
self.assertTrue(child_article.active)
self.assertFalse(child_article.to_delete)
self.assertFalse(child_article.parent_id)
self.assertFalse(child_article.is_desynchronized)
self.assertMembers(child_article, 'write', {
self.env.user.partner_id: 'write',
self.customer: 'read'
})
self.assertFalse(parent_article.active)
self.assertTrue(parent_article.to_delete)
self.assertMembers(parent_article, 'write', {
self.env.user.partner_id: 'none',
self.customer: 'read'
})
@tagged('post_install', '-at_install', 'knowledge_internals', 'knowledge_management')
class TestKnowledgeShare(KnowledgeCommonWData):
@@ -196,6 +196,15 @@ class TestKnowledgeArticleInternals(KnowledgeCommonWData):
class TestKnowledgeArticleUtilities(KnowledgeCommonWData):
""" Test data oriented utilities and tools for articles. """
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env['knowledge.article'].create({
'name': 'Child Workspace Item',
'is_article_item': True,
'parent_id': cls.article_workspace.id
})
@users('employee')
def test_article_get_valid_parent_options(self):
child_writable_article = self.workspace_children[1].with_env(self.env)
@@ -228,6 +237,12 @@ class TestKnowledgeArticleUtilities(KnowledgeCommonWData):
'Should contain: none of descendants, so only other accessible articles (shared section), filtered by search term'
)
self.assertEqual(
child_writable_article.get_valid_parent_options(search_term='Item'),
[],
'Should contain: nothing as the searched article is an Article Item'
)
@users('employee')
def test_article_get_ancestor_ids(self):
# Using ids from method docstring for easy matching.
@@ -4,11 +4,12 @@
import base64
from markupsafe import Markup
from odoo.tests.common import tagged, users, HttpCase
from odoo.tests.common import tagged
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
@tagged('post_install', '-at_install', 'knowledge', 'knowledge_tour')
class TestKnowledgeEditorCommands(HttpCase):
class TestKnowledgeEditorCommands(HttpCaseWithUserDemo):
"""
This test suit run tours to test the new editor commands of Knowledge.
"""
+8 -7
View File
@@ -10,11 +10,12 @@ from markupsafe import Markup
from PIL import Image
from unittest import skipIf
from odoo import fields
from odoo.tests.common import tagged, HttpCase, users
from odoo.tests.common import tagged, users
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
from odoo.addons.mail.tests.common import MailCommon, mail_new_test_user
class TestKnowledgeUICommon(HttpCase, MailCommon):
class TestKnowledgeUICommon(HttpCaseWithUserDemo, MailCommon):
@classmethod
def setUpClass(cls):
super(TestKnowledgeUICommon, cls).setUpClass()
@@ -244,7 +245,7 @@ class TestKnowledgeUI(TestKnowledgeUICommon):
'partner_id': self.env.ref('base.partner_admin').id,
'permission': 'write',
}), (0, 0, {
'partner_id': self.env.ref('base.partner_demo').id,
'partner_id': self.partner_demo.id,
'permission': 'read',
})],
'is_article_visible_by_everyone': True,
@@ -252,11 +253,11 @@ class TestKnowledgeUI(TestKnowledgeUICommon):
self.start_tour('/knowledge/article/%s' % articles[0].id, 'knowledge_readonly_favorite_tour', login='demo', step_delay=100)
self.assertTrue(articles[0].with_user(self.env.ref('base.user_demo').id).is_user_favorite)
self.assertTrue(articles[1].with_user(self.env.ref('base.user_demo').id).is_user_favorite)
self.assertTrue(articles[0].with_user(self.user_demo.id).is_user_favorite)
self.assertTrue(articles[1].with_user(self.user_demo.id).is_user_favorite)
self.assertGreater(
articles[0].with_user(self.env.ref('base.user_demo').id).user_favorite_sequence,
articles[1].with_user(self.env.ref('base.user_demo').id).user_favorite_sequence,
articles[0].with_user(self.user_demo.id).user_favorite_sequence,
articles[1].with_user(self.user_demo.id).user_favorite_sequence,
)
def test_knowledge_resequence_children_of_readonly_parent_tour(self):

Some files were not shown because too many files have changed in this diff Show More