diff --git a/Gemfile b/Gemfile index 4b9d978d4..abbd3332f 100644 --- a/Gemfile +++ b/Gemfile @@ -207,7 +207,7 @@ group :production do end group :development do - gem 'annotaterb' + gem 'annotate' gem 'bullet' gem 'letter_opener' gem 'scss_lint', require: false diff --git a/Gemfile.lock b/Gemfile.lock index fa3a5e788..99e75b33c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -128,9 +128,9 @@ GEM selectize-rails (~> 0.6) ai-agents (0.4.3) ruby_llm (~> 1.3) - annotaterb (4.20.0) - activerecord (>= 6.0.0) - activesupport (>= 6.0.0) + annotate (3.2.0) + activerecord (>= 3.2, < 8.0) + rake (>= 10.4, < 14.0) ast (2.4.3) attr_extras (7.1.0) audited (5.4.1) @@ -992,7 +992,7 @@ DEPENDENCIES administrate-field-active_storage (>= 1.0.3) administrate-field-belongs_to_search (>= 0.9.0) ai-agents (>= 0.4.3) - annotaterb + annotate attr_extras audited (~> 5.4, >= 5.4.1) aws-sdk-s3 diff --git a/app/javascript/dashboard/components-next/captain/PageLayout.vue b/app/javascript/dashboard/components-next/captain/PageLayout.vue index 19303ba01..d9fce9e0f 100644 --- a/app/javascript/dashboard/components-next/captain/PageLayout.vue +++ b/app/javascript/dashboard/components-next/captain/PageLayout.vue @@ -2,6 +2,7 @@ import { ref, computed } from 'vue'; import { OnClickOutside } from '@vueuse/components'; import { useRoute } from 'vue-router'; +import { useI18n } from 'vue-i18n'; import { useMapGetter } from 'dashboard/composables/store.js'; import { usePolicy } from 'dashboard/composables/usePolicy'; import Button from 'dashboard/components-next/button/Button.vue'; @@ -69,6 +70,8 @@ const props = defineProps({ const emit = defineEmits(['click', 'close', 'update:currentPage']); +const { t } = useI18n(); + const route = useRoute(); const { shouldShowPaywall } = usePolicy(); @@ -76,14 +79,16 @@ const showAssistantSwitcherDropdown = ref(false); const createAssistantDialogRef = ref(null); const assistants = useMapGetter('captainAssistants/getRecords'); +const uiFlags = useMapGetter('captainAssistants/getUIFlags'); const currentAssistantId = computed(() => route.params.assistantId); +const isFetchingAssistants = computed(() => uiFlags.value?.fetchingList); const activeAssistantName = computed(() => { return ( assistants.value?.find( assistant => assistant.id === Number(currentAssistantId.value) - )?.name || '' + )?.name || t('CAPTAIN.ASSISTANT_SWITCHER.NEW_ASSISTANT') ); }); @@ -118,15 +123,18 @@ const handleCreateAssistant = () => { >
-
+
{{ activeAssistantName }} -
+
@@ -135,6 +143,8 @@ const handleCreateAssistant = () => { variant="ghost" color="slate" size="xs" + :disabled="isFetchingAssistants" + :is-loading="isFetchingAssistants" class="rounded-md group-hover:bg-n-slate-3 hover:bg-n-slate-3 [&>span]:size-4" @click="toggleAssistantSwitcher" /> @@ -151,7 +161,7 @@ const handleCreateAssistant = () => {
{ />
+
+

+ {{ t('CAPTAIN.ASSISTANT_SWITCHER.EMPTY_LIST') }} +

+
diff --git a/app/javascript/dashboard/i18n/locale/am/integrations.json b/app/javascript/dashboard/i18n/locale/am/integrations.json index ccc46ee1d..9500e2fbc 100644 --- a/app/javascript/dashboard/i18n/locale/am/integrations.json +++ b/app/javascript/dashboard/i18n/locale/am/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/am/report.json b/app/javascript/dashboard/i18n/locale/am/report.json index c622170b0..dbf59f603 100644 --- a/app/javascript/dashboard/i18n/locale/am/report.json +++ b/app/javascript/dashboard/i18n/locale/am/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/am/settings.json b/app/javascript/dashboard/i18n/locale/am/settings.json index 812b0cd8b..50cf38b58 100644 --- a/app/javascript/dashboard/i18n/locale/am/settings.json +++ b/app/javascript/dashboard/i18n/locale/am/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/ar/integrations.json b/app/javascript/dashboard/i18n/locale/ar/integrations.json index f48d263ac..2145f7701 100644 --- a/app/javascript/dashboard/i18n/locale/ar/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ar/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "رابط Webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "قائد", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "الإعدادات", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ar/report.json b/app/javascript/dashboard/i18n/locale/ar/report.json index 8aeb7d9fa..ac8e46365 100644 --- a/app/javascript/dashboard/i18n/locale/ar/report.json +++ b/app/javascript/dashboard/i18n/locale/ar/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "آخر 7 أيام", "LAST_14_DAYS": "آخر 14 يوماً", "LAST_30_DAYS": "آخر 30 يوماً", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "آخر 3 أشهر", "LAST_6_MONTHS": "آخر 6 أشهر", "LAST_YEAR": "العام الماضي", diff --git a/app/javascript/dashboard/i18n/locale/ar/settings.json b/app/javascript/dashboard/i18n/locale/ar/settings.json index 22b9cb254..fa09f590a 100644 --- a/app/javascript/dashboard/i18n/locale/ar/settings.json +++ b/app/javascript/dashboard/i18n/locale/ar/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "تم تعليق الحساب", "MESSAGE": "تم تعليق حسابك. يرجى الاتصال بفريق الدعم للمزيد من المعلومات." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "قنوات التواصل", + "CAPTAIN_SETTINGS": "الإعدادات", "HOME": "الرئيسية", "AGENTS": "وكيل الدعم", "AGENT_BOTS": "الروبوتات", diff --git a/app/javascript/dashboard/i18n/locale/az/integrations.json b/app/javascript/dashboard/i18n/locale/az/integrations.json index ccc46ee1d..9500e2fbc 100644 --- a/app/javascript/dashboard/i18n/locale/az/integrations.json +++ b/app/javascript/dashboard/i18n/locale/az/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/az/report.json b/app/javascript/dashboard/i18n/locale/az/report.json index c622170b0..dbf59f603 100644 --- a/app/javascript/dashboard/i18n/locale/az/report.json +++ b/app/javascript/dashboard/i18n/locale/az/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/az/settings.json b/app/javascript/dashboard/i18n/locale/az/settings.json index 812b0cd8b..50cf38b58 100644 --- a/app/javascript/dashboard/i18n/locale/az/settings.json +++ b/app/javascript/dashboard/i18n/locale/az/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/bg/integrations.json b/app/javascript/dashboard/i18n/locale/bg/integrations.json index 0eddb3a10..8c503eac6 100644 --- a/app/javascript/dashboard/i18n/locale/bg/integrations.json +++ b/app/javascript/dashboard/i18n/locale/bg/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/bg/report.json b/app/javascript/dashboard/i18n/locale/bg/report.json index 5ba9c2508..fb1f34d3c 100644 --- a/app/javascript/dashboard/i18n/locale/bg/report.json +++ b/app/javascript/dashboard/i18n/locale/bg/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/bg/settings.json b/app/javascript/dashboard/i18n/locale/bg/settings.json index 7879190b6..3d1cd4fe3 100644 --- a/app/javascript/dashboard/i18n/locale/bg/settings.json +++ b/app/javascript/dashboard/i18n/locale/bg/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Агенти", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/bn/integrations.json b/app/javascript/dashboard/i18n/locale/bn/integrations.json index ccc46ee1d..9500e2fbc 100644 --- a/app/javascript/dashboard/i18n/locale/bn/integrations.json +++ b/app/javascript/dashboard/i18n/locale/bn/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/bn/report.json b/app/javascript/dashboard/i18n/locale/bn/report.json index c622170b0..dbf59f603 100644 --- a/app/javascript/dashboard/i18n/locale/bn/report.json +++ b/app/javascript/dashboard/i18n/locale/bn/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/bn/settings.json b/app/javascript/dashboard/i18n/locale/bn/settings.json index 812b0cd8b..50cf38b58 100644 --- a/app/javascript/dashboard/i18n/locale/bn/settings.json +++ b/app/javascript/dashboard/i18n/locale/bn/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/ca/integrations.json b/app/javascript/dashboard/i18n/locale/ca/integrations.json index d8d32d02c..f24fb0115 100644 --- a/app/javascript/dashboard/i18n/locale/ca/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ca/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL del webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Configuracions", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ca/report.json b/app/javascript/dashboard/i18n/locale/ca/report.json index 2a3d6cd32..1db2cca6a 100644 --- a/app/javascript/dashboard/i18n/locale/ca/report.json +++ b/app/javascript/dashboard/i18n/locale/ca/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Últims 7 dies", "LAST_14_DAYS": "Últims 14 dies", "LAST_30_DAYS": "Últims 30 dies", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Últims tres mesos", "LAST_6_MONTHS": "Últims sis mesos", "LAST_YEAR": "Darrer any", diff --git a/app/javascript/dashboard/i18n/locale/ca/settings.json b/app/javascript/dashboard/i18n/locale/ca/settings.json index bf9ec5edc..f46d812c2 100644 --- a/app/javascript/dashboard/i18n/locale/ca/settings.json +++ b/app/javascript/dashboard/i18n/locale/ca/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Compte suspès", "MESSAGE": "El teu compte està suspès. Posa't en contacte amb l'equip d'assistència per obtenir més informació." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Safates d'entrada", + "CAPTAIN_SETTINGS": "Configuracions", "HOME": "Inici", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/cs/integrations.json b/app/javascript/dashboard/i18n/locale/cs/integrations.json index 73d0c365e..df6e1f936 100644 --- a/app/javascript/dashboard/i18n/locale/cs/integrations.json +++ b/app/javascript/dashboard/i18n/locale/cs/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL webového háčku", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Nastavení", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/cs/report.json b/app/javascript/dashboard/i18n/locale/cs/report.json index 6cf765f24..2831eeeb0 100644 --- a/app/javascript/dashboard/i18n/locale/cs/report.json +++ b/app/javascript/dashboard/i18n/locale/cs/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Posledních 7 dní", "LAST_14_DAYS": "Posledních 14 dní", "LAST_30_DAYS": "Posledních 30 dní", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Poslední 3 měsíce", "LAST_6_MONTHS": "Posledních 6 měsíců", "LAST_YEAR": "Poslední rok", diff --git a/app/javascript/dashboard/i18n/locale/cs/settings.json b/app/javascript/dashboard/i18n/locale/cs/settings.json index 616e16942..c6e26c413 100644 --- a/app/javascript/dashboard/i18n/locale/cs/settings.json +++ b/app/javascript/dashboard/i18n/locale/cs/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Schránky", + "CAPTAIN_SETTINGS": "Nastavení", "HOME": "Domů", "AGENTS": "Agenti", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/da/integrations.json b/app/javascript/dashboard/i18n/locale/da/integrations.json index 30847d37d..bee4e7081 100644 --- a/app/javascript/dashboard/i18n/locale/da/integrations.json +++ b/app/javascript/dashboard/i18n/locale/da/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Indstillinger", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/da/report.json b/app/javascript/dashboard/i18n/locale/da/report.json index 3b81e2a18..fb93cb681 100644 --- a/app/javascript/dashboard/i18n/locale/da/report.json +++ b/app/javascript/dashboard/i18n/locale/da/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Seneste 7 dage", "LAST_14_DAYS": "Seneste 14 dage", "LAST_30_DAYS": "Seneste 30 dage", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Seneste 3 måneder", "LAST_6_MONTHS": "Seneste 6 måneder", "LAST_YEAR": "Sidste år", diff --git a/app/javascript/dashboard/i18n/locale/da/settings.json b/app/javascript/dashboard/i18n/locale/da/settings.json index b2db02ef5..02e958cec 100644 --- a/app/javascript/dashboard/i18n/locale/da/settings.json +++ b/app/javascript/dashboard/i18n/locale/da/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Konto Suspenderet", "MESSAGE": "Din konto er suspenderet. Gå ud til supportteamet for mere information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Indbakker", + "CAPTAIN_SETTINGS": "Indstillinger", "HOME": "Hjem", "AGENTS": "Agenter", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/de/contact.json b/app/javascript/dashboard/i18n/locale/de/contact.json index c13b81468..8907118f6 100644 --- a/app/javascript/dashboard/i18n/locale/de/contact.json +++ b/app/javascript/dashboard/i18n/locale/de/contact.json @@ -18,9 +18,9 @@ "CREATED_AT_LABEL": "Erstellt", "NEW_MESSAGE": "Neue Nachricht", "CALL": "Anruf", - "CALL_UNDER_DEVELOPMENT": "Calling is under development", + "CALL_UNDER_DEVELOPMENT": "Anrufe sind in der Entwicklung", "VOICE_INBOX_PICKER": { - "TITLE": "Choose a voice inbox" + "TITLE": "Spracheingang wählen" }, "CONVERSATIONS": { "NO_RECORDS_FOUND": "Es sind keine vorherigen Gespräche mit diesem Kontakt verbunden.", @@ -554,12 +554,12 @@ "WROTE": "schrieb", "YOU": "Sie", "SAVE": "Notiz speichern", - "ADD_NOTE": "Add contact note", + "ADD_NOTE": "Füge eine Kontakt-Notiz hinzu", "EXPAND": "Erweitern", "COLLAPSE": "Einklappen", "NO_NOTES": "Keine Notizen, Sie können Notizen auf der Kontakt-Detailseite hinzufügen.", "EMPTY_STATE": "Es gibt keine Notizen zu diesem Kontakt. Sie können eine Notiz hinzufügen, indem Sie diese in das obige Feld eingeben.", - "CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one." + "CONVERSATION_EMPTY_STATE": "Es sind noch keine Notizen vorhanden. Benutzen Sie die Schaltfläche \"Notiz hinzufügen\" um eine zu erstellen." } }, "EMPTY_STATE": { @@ -574,21 +574,21 @@ "CONTACTS_BULK_ACTIONS": { "ASSIGN_LABELS": "Labels zuweisen", "ASSIGN_LABELS_SUCCESS": "Labels erfolgreich zugewiesen.", - "ASSIGN_LABELS_FAILED": "Failed to assign labels", - "DESCRIPTION": "Select the labels you want to add to the selected contacts.", - "NO_LABELS_FOUND": "No labels available yet.", + "ASSIGN_LABELS_FAILED": "Fehler beim Zuweisen der Labels", + "DESCRIPTION": "Wählen Sie die Labels aus, die zu den ausgewählten Kontakten hinzugefügt werden sollen.", + "NO_LABELS_FOUND": "Noch keine Labels vorhanden.", "SELECTED_COUNT": "{count} selected", - "CLEAR_SELECTION": "Clear selection", - "SELECT_ALL": "Select all ({count})", + "CLEAR_SELECTION": "Auswahl löschen", + "SELECT_ALL": "Alle auswählen ({count})", "DELETE_CONTACTS": "Löschen", - "DELETE_SUCCESS": "Contacts deleted successfully.", - "DELETE_FAILED": "Failed to delete contacts.", + "DELETE_SUCCESS": "Kontakte erfolgreich gelöscht.", + "DELETE_FAILED": "Kontakte konnten nicht gelöscht werden.", "DELETE_DIALOG": { - "TITLE": "Delete selected contacts", - "SINGULAR_TITLE": "Delete selected contact", - "DESCRIPTION": "This will permanently delete {count} selected contacts. This action cannot be undone.", - "SINGULAR_DESCRIPTION": "This will permanently delete the selected contact. This action cannot be undone.", - "CONFIRM_MULTIPLE": "Delete contacts", + "TITLE": "Ausgewählte Kontakte löschen", + "SINGULAR_TITLE": "Ausgewählten Kontakt löschen", + "DESCRIPTION": "Dies wird {count} ausgewählte Kontakte dauerhaft löschen. Diese Aktion kann nicht rückgängig gemacht werden.", + "SINGULAR_DESCRIPTION": "Der ausgewählte Kontakt wird dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.", + "CONFIRM_MULTIPLE": "Kontakte löschen", "CONFIRM_SINGLE": "Kontakt löschen" } }, diff --git a/app/javascript/dashboard/i18n/locale/de/conversation.json b/app/javascript/dashboard/i18n/locale/de/conversation.json index 56b39edb9..b30f38ebe 100644 --- a/app/javascript/dashboard/i18n/locale/de/conversation.json +++ b/app/javascript/dashboard/i18n/locale/de/conversation.json @@ -36,10 +36,10 @@ "NOT_ASSIGNED_TO_YOU": "Diese Konversation ist Ihnen nicht zugeordnet. Möchten Sie dieses Gespräch sich selbst zuordnen?", "ASSIGN_TO_ME": "Mir zuweisen", "BOT_HANDOFF_MESSAGE": "Sie antworten auf eine Unterhaltung, die derzeit von einem Assistenten oder einem Bot bearbeitet wird.", - "BOT_HANDOFF_ACTION": "Mark open and assign to you", - "BOT_HANDOFF_REOPEN_ACTION": "Mark conversation open", - "BOT_HANDOFF_SUCCESS": "Conversation has been handed over to you", - "BOT_HANDOFF_ERROR": "Failed to take over the conversation. Please try again.", + "BOT_HANDOFF_ACTION": "Als geöffnet markieren und Ihnen zuweisen", + "BOT_HANDOFF_REOPEN_ACTION": "Gespräch als geöffnet markieren", + "BOT_HANDOFF_SUCCESS": "Die Unterhaltung wurde dir übergeben", + "BOT_HANDOFF_ERROR": "Die Unterhaltung konnte nicht übernommen werden. Bitte versuche es erneut.", "TWILIO_WHATSAPP_CAN_REPLY": "Sie können auf diese Konversation nur mit einer Nachrichtenvorlage antworten wegen", "TWILIO_WHATSAPP_24_HOURS_WINDOW": "24-Stunden-Nachrichtenfenster-Beschränkung", "OLD_INSTAGRAM_INBOX_REPLY_BANNER": "Dieser Instagram-Account wurde in den neuen Instagram-Kanal übertragen. Alle neuen Nachrichten werden dort erscheinen. Sie werden keine Nachrichten mehr von dieser Unterhaltung senden können.", @@ -72,15 +72,15 @@ "HIDE_LABELS": "Labels ausblenden" }, "VOICE_CALL": { - "INCOMING_CALL": "Incoming call", - "OUTGOING_CALL": "Outgoing call", - "CALL_IN_PROGRESS": "Call in progress", - "NO_ANSWER": "No answer", - "MISSED_CALL": "Missed call", - "CALL_ENDED": "Call ended", - "NOT_ANSWERED_YET": "Not answered yet", - "THEY_ANSWERED": "They answered", - "YOU_ANSWERED": "You answered" + "INCOMING_CALL": "Eingehender Anruf", + "OUTGOING_CALL": "Ausgehender Anruf", + "CALL_IN_PROGRESS": "Anruf läuft", + "NO_ANSWER": "Keine Antwort", + "MISSED_CALL": "Entgangener Anruf", + "CALL_ENDED": "Anruf beendet", + "NOT_ANSWERED_YET": "Noch nicht beantwortet", + "THEY_ANSWERED": "Sie antworteten", + "YOU_ANSWERED": "Sie haben beantwortet" }, "HEADER": { "RESOLVE_ACTION": "Fall schließen", @@ -160,9 +160,9 @@ "AGENTS_LOADING": "Agenten werden geladen...", "ASSIGN_TEAM": "Team zuweisen", "DELETE": "Unterhaltung löschen", - "OPEN_IN_NEW_TAB": "Open in new tab", - "COPY_LINK": "Copy conversation link", - "COPY_LINK_SUCCESS": "Conversation link copied to clipboard", + "OPEN_IN_NEW_TAB": "In neuem Tab öffnen", + "COPY_LINK": "Konversationslink kopieren", + "COPY_LINK_SUCCESS": "Konversationslink in Zwischenablage kopiert", "API": { "AGENT_ASSIGNMENT": { "SUCCESFUL": "Konversations-ID {conversationId} zugewiesen zu \"{agentName}\"", @@ -229,11 +229,11 @@ } }, "QUOTED_REPLY": { - "ENABLE_TOOLTIP": "Include quoted email thread", - "DISABLE_TOOLTIP": "Don't include quoted email thread", - "REMOVE_PREVIEW": "Remove quoted email thread", - "COLLAPSE": "Collapse preview", - "EXPAND": "Expand preview" + "ENABLE_TOOLTIP": "Zitierten E-Mail-Thread einbeziehen", + "DISABLE_TOOLTIP": "Zitierten E-Mail-Thread nicht einbeziehen", + "REMOVE_PREVIEW": "Zitierte E-Mail-Themen entfernen", + "COLLAPSE": "Vorschau ausblenden", + "EXPAND": "Vorschau erweitern" } }, "VISIBLE_TO_AGENTS": "Privater Hinweis: Nur für Sie und Ihr Team sichtbar", @@ -338,7 +338,7 @@ "CONTACT_ATTRIBUTES": "Kontakt-Attribute", "PREVIOUS_CONVERSATION": "Vorherige Konversationen", "MACROS": "Makros", - "LINEAR_ISSUES": "Linked Linear Issues", + "LINEAR_ISSUES": "Verknüpfte lineare Probleme", "SHOPIFY_ORDERS": "Shopify Orders" }, "SHOPIFY": { diff --git a/app/javascript/dashboard/i18n/locale/de/generalSettings.json b/app/javascript/dashboard/i18n/locale/de/generalSettings.json index bf67ac1b0..33c2c2843 100644 --- a/app/javascript/dashboard/i18n/locale/de/generalSettings.json +++ b/app/javascript/dashboard/i18n/locale/de/generalSettings.json @@ -3,7 +3,7 @@ "LIMIT_MESSAGES": { "CONVERSATION": "Sie haben das Konversationslimit überschritten. Der Hacker Plan erlaubt nur 500 Unterhaltungen.", "INBOXES": "Sie haben das Posteingang-Limit überschritten. Der Hacker-Plan unterstützt nur Live-Chat der Webseite. Zusätzliche Posteingänge wie E-Mail, WhatsApp usw. erfordern einen kostenpflichtigen Tarif.", - "AGENTS": "You have exceeded the agent limit. Your plan only allows {allowedAgents} agents.", + "AGENTS": "Sie haben das Agenten-Limit überschritten. Ihr Plan erlaubt nur {allowedAgents} Agenten.", "NON_ADMIN": "Bitte kontaktieren Sie Ihren Administrator, um den Plan zu upgraden und alle Funktionen weiterzunutzen." }, "TITLE": "Kontoeinstellungen", @@ -25,13 +25,13 @@ "DISMISS": "Stornieren", "PLACE_HOLDER": "Bitte {accountName} zur Bestätigung eingeben" }, - "SUCCESS": "Account marked for deletion", - "FAILURE": "Could not delete account, try again!", + "SUCCESS": "Konto zur Löschung markiert", + "FAILURE": "Konto konnte nicht gelöscht werden, versuche es erneut!", "SCHEDULED_DELETION": { - "TITLE": "Account Scheduled for Deletion", - "MESSAGE_MANUAL": "This account is scheduled for deletion on {deletionDate}. This was requested by an administrator. You can cancel the deletion before this date.", - "MESSAGE_INACTIVITY": "This account is scheduled for deletion on {deletionDate} due to account inactivity. You can cancel the deletion before this date.", - "CLEAR_BUTTON": "Cancel Scheduled Deletion" + "TITLE": "Konto für Löschung geplant", + "MESSAGE_MANUAL": "Dieses Konto ist für das Löschen auf {deletionDate} geplant. Dies wurde von einem Administrator angefordert. Sie können das Löschen vor diesem Datum abbrechen.", + "MESSAGE_INACTIVITY": "Dieses Konto ist für die Löschung auf {deletionDate} aufgrund von Kontoinaktivität vorgesehen. Sie können die Löschung vor diesem Datum abbrechen.", + "CLEAR_BUTTON": "Geplante Löschung abbrechen" } }, "FORM": { @@ -45,13 +45,13 @@ "NOTE": "Diese ID ist erforderlich, wenn Sie eine API-basierte Integration erstellen" }, "AUTO_RESOLVE": { - "TITLE": "Auto-resolve conversations", - "NOTE": "This configuration would allow you to automatically resolve the conversation after a certain period of inactivity.", + "TITLE": "Unterhaltungen automatisch auflösen", + "NOTE": "Diese Konfiguration würde es Ihnen ermöglichen, die Unterhaltung nach einer gewissen Zeit der Inaktivität automatisch zu beenden.", "DURATION": { - "LABEL": "Inactivity duration", - "HELP": "Time period of inactivity after which conversation is auto-resolved", + "LABEL": "Dauer der Inaktivität", + "HELP": "Zeit der Inaktivität, nach der die Unterhaltung automatisch gelöst wird", "PLACEHOLDER": "30", - "ERROR": "Auto resolve duration should be between 10 minutes and 999 days", + "ERROR": "Automatische Auflösungsdauer sollte zwischen 10 Minuten und 999 Tagen liegen", "API": { "SUCCESS": "Auto resolve settings updated successfully", "ERROR": "Failed to update auto resolve settings" @@ -108,7 +108,7 @@ "LABEL": "Inactivity duration for resolution", "HELP": "Duration after a conversation should auto resolve if there is no activity", "PLACEHOLDER": "30", - "ERROR": "Auto resolve duration should be between 10 minutes and 999 days", + "ERROR": "Automatische Auflösungsdauer sollte zwischen 10 Minuten und 999 Tagen liegen", "API": { "SUCCESS": "Auto resolve settings updated successfully", "ERROR": "Failed to update auto resolve settings" diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json index 1b23f7613..fe86cc204 100644 --- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json @@ -296,17 +296,17 @@ "WAITING_FOR_AUTH": "Waiting for authentication...", "INVALID_BUSINESS_DATA": "Invalid business data received from Facebook. Please try again.", "SIGNUP_ERROR": "Signup error occurred", - "AUTH_NOT_COMPLETED": "Authentication not completed. Please restart the process.", - "SUCCESS_FALLBACK": "WhatsApp Business Account has been successfully configured", - "MANUAL_FALLBACK": "If your number is already connected to the WhatsApp Business Platform (API), or if you’re a tech provider onboarding your own number, please use the {link} flow", - "MANUAL_LINK_TEXT": "manual setup flow" + "AUTH_NOT_COMPLETED": "Authentifizierung nicht abgeschlossen. Bitte starte den Prozess neu.", + "SUCCESS_FALLBACK": "WhatsApp Business Account wurde erfolgreich konfiguriert", + "MANUAL_FALLBACK": "Wenn Ihre Nummer bereits mit der WhatsApp Business Plattform (API) verbunden ist, oder wenn Sie als Technologieanbieter Ihre eigene Nummer an Bord haben, verwenden Sie bitte den {link} Flow", + "MANUAL_LINK_TEXT": "Manueller Einrichtungsablauf" }, "API": { "ERROR_MESSAGE": "Wir konnten den WhatsApp-Kanal nicht speichern" } }, "VOICE": { - "TITLE": "Voice Channel", + "TITLE": "Sprachkanal", "DESC": "Integrate Twilio Voice and start supporting your customers via phone calls.", "PHONE_NUMBER": { "LABEL": "Telefonnummer", diff --git a/app/javascript/dashboard/i18n/locale/de/integrations.json b/app/javascript/dashboard/i18n/locale/de/integrations.json index 5186b9f63..bf4d70074 100644 --- a/app/javascript/dashboard/i18n/locale/de/integrations.json +++ b/app/javascript/dashboard/i18n/locale/de/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook-URL", "PLACEHOLDER": "Beispiel: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Kapitän", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Probiere diese Prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Einstellungen", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/de/report.json b/app/javascript/dashboard/i18n/locale/de/report.json index 820676f3f..b61ce23eb 100644 --- a/app/javascript/dashboard/i18n/locale/de/report.json +++ b/app/javascript/dashboard/i18n/locale/de/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Letzten 7 Tage", "LAST_14_DAYS": "Letzten 14 Tage", "LAST_30_DAYS": "Letzte 30 Tage", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Die letzten 3 Monate", "LAST_6_MONTHS": "Die letzten 6 Monate", "LAST_YEAR": "Letztes Jahr", diff --git a/app/javascript/dashboard/i18n/locale/de/settings.json b/app/javascript/dashboard/i18n/locale/de/settings.json index 190880321..50e1cf7a5 100644 --- a/app/javascript/dashboard/i18n/locale/de/settings.json +++ b/app/javascript/dashboard/i18n/locale/de/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Konto gesperrt", "MESSAGE": "Ihr Account wurde gesperrt. Wenden Sie sich für weitere Informationen bitte an das Support-Team." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Posteingänge", + "CAPTAIN_SETTINGS": "Einstellungen", "HOME": "Hauptseite", "AGENTS": "Agenten", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/el/integrations.json b/app/javascript/dashboard/i18n/locale/el/integrations.json index ab132c61e..67ca0056e 100644 --- a/app/javascript/dashboard/i18n/locale/el/integrations.json +++ b/app/javascript/dashboard/i18n/locale/el/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Σύνδεσμος Webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Ρυθμίσεις", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/el/report.json b/app/javascript/dashboard/i18n/locale/el/report.json index c050a93c9..aa2a68208 100644 --- a/app/javascript/dashboard/i18n/locale/el/report.json +++ b/app/javascript/dashboard/i18n/locale/el/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Τελευταίες 7 ημέρες", "LAST_14_DAYS": "Τελευταίες 14 ημέρες", "LAST_30_DAYS": "Τελευταίες 30 ημέρες", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Τελευταίοι 3 μήνες", "LAST_6_MONTHS": "Τελευταίοι 6 μήνες", "LAST_YEAR": "Τελευταίο έτος", diff --git a/app/javascript/dashboard/i18n/locale/el/settings.json b/app/javascript/dashboard/i18n/locale/el/settings.json index da4c4dec5..2e8026e32 100644 --- a/app/javascript/dashboard/i18n/locale/el/settings.json +++ b/app/javascript/dashboard/i18n/locale/el/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Αναστολή Λογαριασμού", "MESSAGE": "Ο λογαριασμός σας έχει ανασταλεί. Επικοινωνήστε με την ομάδα υποστήριξης για περισσότερες πληροφορίες." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Κιβώτια Εισερχομένων", + "CAPTAIN_SETTINGS": "Ρυθμίσεις", "HOME": "Αρχική", "AGENTS": "Πράκτορες", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index f74e674d7..c08cde4d3 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -348,7 +348,8 @@ "ASSISTANT_SWITCHER": { "ASSISTANTS": "Assistants", "SWITCH_ASSISTANT": "Switch between assistants", - "NEW_ASSISTANT": "Create Assistant" + "NEW_ASSISTANT": "Create Assistant", + "EMPTY_LIST": "No assistants found, please create one to get started" }, "COPILOT": { "TITLE": "Copilot", diff --git a/app/javascript/dashboard/i18n/locale/es/integrations.json b/app/javascript/dashboard/i18n/locale/es/integrations.json index ed03df719..d8306bd80 100644 --- a/app/javascript/dashboard/i18n/locale/es/integrations.json +++ b/app/javascript/dashboard/i18n/locale/es/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL de Webhook", "PLACEHOLDER": "Ejemplo: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Capitán", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Prueba estas sugerencias", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Ajustes", "BASIC_SETTINGS": { "TITLE": "Configuraciones básicas", "DESCRIPTION": "" @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/es/report.json b/app/javascript/dashboard/i18n/locale/es/report.json index 1db50b270..9302dd634 100644 --- a/app/javascript/dashboard/i18n/locale/es/report.json +++ b/app/javascript/dashboard/i18n/locale/es/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Últimos 7 días", "LAST_14_DAYS": "Últimos 14 días", "LAST_30_DAYS": "Últimos 30 días", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Últimos 3 meses", "LAST_6_MONTHS": "Últimos 6 meses", "LAST_YEAR": "Último año", diff --git a/app/javascript/dashboard/i18n/locale/es/settings.json b/app/javascript/dashboard/i18n/locale/es/settings.json index 37a1bfda4..d3d580143 100644 --- a/app/javascript/dashboard/i18n/locale/es/settings.json +++ b/app/javascript/dashboard/i18n/locale/es/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Cuenta suspendida", "MESSAGE": "Tu cuenta está suspendida. Comuníquese con el equipo de soporte para obtener más información." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Cerrar sesión" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documentos", "CAPTAIN_RESPONSES": "Preguntas frecuentes", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Entradas", + "CAPTAIN_SETTINGS": "Ajustes", "HOME": "Inicio", "AGENTS": "Agentes", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/et/integrations.json b/app/javascript/dashboard/i18n/locale/et/integrations.json index ccc46ee1d..9500e2fbc 100644 --- a/app/javascript/dashboard/i18n/locale/et/integrations.json +++ b/app/javascript/dashboard/i18n/locale/et/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/et/report.json b/app/javascript/dashboard/i18n/locale/et/report.json index c622170b0..dbf59f603 100644 --- a/app/javascript/dashboard/i18n/locale/et/report.json +++ b/app/javascript/dashboard/i18n/locale/et/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/et/settings.json b/app/javascript/dashboard/i18n/locale/et/settings.json index 812b0cd8b..50cf38b58 100644 --- a/app/javascript/dashboard/i18n/locale/et/settings.json +++ b/app/javascript/dashboard/i18n/locale/et/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/fa/integrations.json b/app/javascript/dashboard/i18n/locale/fa/integrations.json index 6c6be064f..e635d491f 100644 --- a/app/javascript/dashboard/i18n/locale/fa/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fa/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "آدرس URL وب هوک", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "تنظیمات", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/fa/report.json b/app/javascript/dashboard/i18n/locale/fa/report.json index f979b1b48..9596444e1 100644 --- a/app/javascript/dashboard/i18n/locale/fa/report.json +++ b/app/javascript/dashboard/i18n/locale/fa/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "در ۷ روز گذشته", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "در ۳۰ روز گذشته", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "۳ ماه گذشته", "LAST_6_MONTHS": "۶ ماه گذشته", "LAST_YEAR": "پارسال", diff --git a/app/javascript/dashboard/i18n/locale/fa/settings.json b/app/javascript/dashboard/i18n/locale/fa/settings.json index ae309c5bc..4c989b0fa 100644 --- a/app/javascript/dashboard/i18n/locale/fa/settings.json +++ b/app/javascript/dashboard/i18n/locale/fa/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "حساب‌کاربری معلق شده است", "MESSAGE": "حساب‌کاربری شما به حالت تعلیق درآمده. لطفا برای اطلاعات بیشتر با تیم پشتیبانی تماس بگیرید." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "صندوق‌های ورودی", + "CAPTAIN_SETTINGS": "تنظیمات", "HOME": "صفحه اصلی", "AGENTS": "ایجنت ها", "AGENT_BOTS": "ربات‌ها", diff --git a/app/javascript/dashboard/i18n/locale/fi/integrations.json b/app/javascript/dashboard/i18n/locale/fi/integrations.json index dda703541..f17f88ecd 100644 --- a/app/javascript/dashboard/i18n/locale/fi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fi/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhookin URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Asetukset", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/fi/report.json b/app/javascript/dashboard/i18n/locale/fi/report.json index fc442d094..22db228b2 100644 --- a/app/javascript/dashboard/i18n/locale/fi/report.json +++ b/app/javascript/dashboard/i18n/locale/fi/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Viimeiset 7 päivää", "LAST_14_DAYS": "Viimeiset 14 päivää", "LAST_30_DAYS": "Viimeiset 30 päivää", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/fi/settings.json b/app/javascript/dashboard/i18n/locale/fi/settings.json index 3fbcfe345..69cd048e1 100644 --- a/app/javascript/dashboard/i18n/locale/fi/settings.json +++ b/app/javascript/dashboard/i18n/locale/fi/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Saapuneet-kansiot", + "CAPTAIN_SETTINGS": "Asetukset", "HOME": "Koti", "AGENTS": "Edustajat", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/fr/integrations.json b/app/javascript/dashboard/i18n/locale/fr/integrations.json index 1c0ed950d..5a9e549a4 100644 --- a/app/javascript/dashboard/i18n/locale/fr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fr/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Saisie de conversation désactivée" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL du Webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Impossible de trouver l'assistant. Veuillez réessayer." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Paramètres", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/fr/report.json b/app/javascript/dashboard/i18n/locale/fr/report.json index 684e4d197..5c41536e9 100644 --- a/app/javascript/dashboard/i18n/locale/fr/report.json +++ b/app/javascript/dashboard/i18n/locale/fr/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "7 derniers jours", "LAST_14_DAYS": "14 derniers jours", "LAST_30_DAYS": "30 derniers jours", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "3 derniers mois", "LAST_6_MONTHS": "6 derniers mois", "LAST_YEAR": "Année dernière", diff --git a/app/javascript/dashboard/i18n/locale/fr/settings.json b/app/javascript/dashboard/i18n/locale/fr/settings.json index f04045ea6..66d7cefba 100644 --- a/app/javascript/dashboard/i18n/locale/fr/settings.json +++ b/app/javascript/dashboard/i18n/locale/fr/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Compte Suspendu", "MESSAGE": "Votre compte est suspendu. Veuillez contacter le support pour plus d'informations." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Outils", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Terrain de jeu", + "CAPTAIN_INBOXES": "Boîtes de réception", + "CAPTAIN_SETTINGS": "Paramètres", "HOME": "Accueil", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/he/integrations.json b/app/javascript/dashboard/i18n/locale/he/integrations.json index e28279a74..843c6360b 100644 --- a/app/javascript/dashboard/i18n/locale/he/integrations.json +++ b/app/javascript/dashboard/i18n/locale/he/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "כתובת אתר של Webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "טייס משנה", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "הגדרות", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/he/report.json b/app/javascript/dashboard/i18n/locale/he/report.json index c342d4649..6c84b77a1 100644 --- a/app/javascript/dashboard/i18n/locale/he/report.json +++ b/app/javascript/dashboard/i18n/locale/he/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "7 הימים האחרונים", "LAST_14_DAYS": "14 הימים האחרונים", "LAST_30_DAYS": "30 הימים האחרונים", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "3 החודשים האחרונים", "LAST_6_MONTHS": "6 החודשים האחרונים", "LAST_YEAR": "שנה שעברה", diff --git a/app/javascript/dashboard/i18n/locale/he/settings.json b/app/javascript/dashboard/i18n/locale/he/settings.json index 1601016eb..44c077268 100644 --- a/app/javascript/dashboard/i18n/locale/he/settings.json +++ b/app/javascript/dashboard/i18n/locale/he/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "חשבון מושעה", "MESSAGE": "החשבון שלך מושעה. אנא פנה לצוות התמיכה לקבלת מידע נוסף." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "תיבות דואר נכנס", + "CAPTAIN_SETTINGS": "הגדרות", "HOME": "בית", "AGENTS": "סוכנים", "AGENT_BOTS": "בוטים", diff --git a/app/javascript/dashboard/i18n/locale/hi/integrations.json b/app/javascript/dashboard/i18n/locale/hi/integrations.json index 4ce9d2077..c39ce064c 100644 --- a/app/javascript/dashboard/i18n/locale/hi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hi/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/hi/report.json b/app/javascript/dashboard/i18n/locale/hi/report.json index 22e285c19..a2ad6bd4a 100644 --- a/app/javascript/dashboard/i18n/locale/hi/report.json +++ b/app/javascript/dashboard/i18n/locale/hi/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/hi/settings.json b/app/javascript/dashboard/i18n/locale/hi/settings.json index 256f77c04..aec3e852d 100644 --- a/app/javascript/dashboard/i18n/locale/hi/settings.json +++ b/app/javascript/dashboard/i18n/locale/hi/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/hr/integrations.json b/app/javascript/dashboard/i18n/locale/hr/integrations.json index 505226f13..472e5fd69 100644 --- a/app/javascript/dashboard/i18n/locale/hr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hr/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/hr/report.json b/app/javascript/dashboard/i18n/locale/hr/report.json index 727964e50..c31c93369 100644 --- a/app/javascript/dashboard/i18n/locale/hr/report.json +++ b/app/javascript/dashboard/i18n/locale/hr/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/hr/settings.json b/app/javascript/dashboard/i18n/locale/hr/settings.json index 51e35e25b..721a1aecc 100644 --- a/app/javascript/dashboard/i18n/locale/hr/settings.json +++ b/app/javascript/dashboard/i18n/locale/hr/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agenti", "AGENT_BOTS": "Botovi", diff --git a/app/javascript/dashboard/i18n/locale/hu/integrations.json b/app/javascript/dashboard/i18n/locale/hu/integrations.json index 090dc241e..a6a0654fb 100644 --- a/app/javascript/dashboard/i18n/locale/hu/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hu/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Beállítások", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/hu/report.json b/app/javascript/dashboard/i18n/locale/hu/report.json index 1231d8d90..45e014b95 100644 --- a/app/javascript/dashboard/i18n/locale/hu/report.json +++ b/app/javascript/dashboard/i18n/locale/hu/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Utolsó 7 nap", "LAST_14_DAYS": "Utolsó 14 nap", "LAST_30_DAYS": "Utolsó 30 nap", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Elmúlt 3 hónapban", "LAST_6_MONTHS": "Elmúlt 6 hónapban", "LAST_YEAR": "Elmúlt 1 évben", diff --git a/app/javascript/dashboard/i18n/locale/hu/settings.json b/app/javascript/dashboard/i18n/locale/hu/settings.json index 0bda60edd..5228bdc84 100644 --- a/app/javascript/dashboard/i18n/locale/hu/settings.json +++ b/app/javascript/dashboard/i18n/locale/hu/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Felfüggesztett Fiók", "MESSAGE": "A fiókod felfüggesztés alatt van. Bővebb információkért, kérlek, lépj kapcsolatba az ügfyélszolgálattal." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Fiókok", + "CAPTAIN_SETTINGS": "Beállítások", "HOME": "Nyitólap", "AGENTS": "Ügynökök", "AGENT_BOTS": "Botok", diff --git a/app/javascript/dashboard/i18n/locale/hy/integrations.json b/app/javascript/dashboard/i18n/locale/hy/integrations.json index c5b554ee7..0566abd9a 100644 --- a/app/javascript/dashboard/i18n/locale/hy/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hy/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/hy/report.json b/app/javascript/dashboard/i18n/locale/hy/report.json index 22e285c19..a2ad6bd4a 100644 --- a/app/javascript/dashboard/i18n/locale/hy/report.json +++ b/app/javascript/dashboard/i18n/locale/hy/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/hy/settings.json b/app/javascript/dashboard/i18n/locale/hy/settings.json index 812b0cd8b..50cf38b58 100644 --- a/app/javascript/dashboard/i18n/locale/hy/settings.json +++ b/app/javascript/dashboard/i18n/locale/hy/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/id/integrations.json b/app/javascript/dashboard/i18n/locale/id/integrations.json index 725743dad..ce14316bb 100644 --- a/app/javascript/dashboard/i18n/locale/id/integrations.json +++ b/app/javascript/dashboard/i18n/locale/id/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL Webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Pengaturan", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/id/report.json b/app/javascript/dashboard/i18n/locale/id/report.json index e41778480..35393f1da 100644 --- a/app/javascript/dashboard/i18n/locale/id/report.json +++ b/app/javascript/dashboard/i18n/locale/id/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "7 hari terakhir", "LAST_14_DAYS": "14 hari terakhir", "LAST_30_DAYS": "30 hari terakhir", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "3 bulan terakhir", "LAST_6_MONTHS": "6 bulan terakhir", "LAST_YEAR": "Tahun terakhir", diff --git a/app/javascript/dashboard/i18n/locale/id/settings.json b/app/javascript/dashboard/i18n/locale/id/settings.json index 75324f02f..aad964a87 100644 --- a/app/javascript/dashboard/i18n/locale/id/settings.json +++ b/app/javascript/dashboard/i18n/locale/id/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Akun Ditangguhkan", "MESSAGE": "Akun Anda ditangguhkan. Silakan hubungi tim dukungan untuk informasi lebih lanjut." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Kotak masuk", + "CAPTAIN_SETTINGS": "Pengaturan", "HOME": "Beranda", "AGENTS": "Agen", "AGENT_BOTS": "Bot Agen", diff --git a/app/javascript/dashboard/i18n/locale/is/integrations.json b/app/javascript/dashboard/i18n/locale/is/integrations.json index d349fd38a..100ab01e9 100644 --- a/app/javascript/dashboard/i18n/locale/is/integrations.json +++ b/app/javascript/dashboard/i18n/locale/is/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Stillingar", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/is/report.json b/app/javascript/dashboard/i18n/locale/is/report.json index d65764ba5..923b60935 100644 --- a/app/javascript/dashboard/i18n/locale/is/report.json +++ b/app/javascript/dashboard/i18n/locale/is/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Síðustu 7 daga", "LAST_14_DAYS": "Síðustu 14 daga", "LAST_30_DAYS": "Síðustu 30 daga", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Síðustu 3 mánuði", "LAST_6_MONTHS": "Síðustu 6 mánuði", "LAST_YEAR": "Síðasta ár", diff --git a/app/javascript/dashboard/i18n/locale/is/settings.json b/app/javascript/dashboard/i18n/locale/is/settings.json index 076f19542..cba19a2b0 100644 --- a/app/javascript/dashboard/i18n/locale/is/settings.json +++ b/app/javascript/dashboard/i18n/locale/is/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Reikningnum þínum er lokað. Vinsamlegast hafðu samband við þjónustusviðið okkar til að fá frekari upplýsingar." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Innhólf", + "CAPTAIN_SETTINGS": "Stillingar", "HOME": "Home", "AGENTS": "Þjónustufulltrúar", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/it/conversation.json b/app/javascript/dashboard/i18n/locale/it/conversation.json index 89b4e0b4f..4506fe827 100644 --- a/app/javascript/dashboard/i18n/locale/it/conversation.json +++ b/app/javascript/dashboard/i18n/locale/it/conversation.json @@ -85,7 +85,7 @@ "HEADER": { "RESOLVE_ACTION": "Risolvi", "REOPEN_ACTION": "Riapri", - "OPEN_ACTION": "Aperte", + "OPEN_ACTION": "Apri", "MORE_ACTIONS": "Più azioni", "OPEN": "Altro", "CLOSE": "Chiudi", @@ -208,7 +208,7 @@ "": "", "EMAIL_HEAD": { "TO": "A", - "ADD_BCC": "Aggiungi Bcc", + "ADD_BCC": "Aggiungi Ccn", "CC": { "LABEL": "Cc", "PLACEHOLDER": "Email separate da virgole", @@ -296,7 +296,7 @@ }, "ONBOARDING": { "TITLE": "Ciao👋 Benvenuto in {installationName}!", - "DESCRIPTION": "Grazie per esserti registrato. Vogliamo che tu ottenga il massimo da {installationName}. Ecco alcune cose che puoi fare in {installationName} per rendere l'esperienza migliore.", + "DESCRIPTION": "Grazie per averci scelto! Vogliamo che tu ottenga il massimo da {installationName}. Ecco alcune cose che puoi fare in {installationName} per massimizzare la tua esperienza.", "GREETING_MORNING": "👋 Buongiorno, {name}. Benvenuto in {installationName}.", "GREETING_AFTERNOON": "👋 Buon pomeriggio, {name}. Benvenuto in {installationName}.", "GREETING_EVENING": "👋 Buona sera, {name}. Benvenuto su {installationName}.", diff --git a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json index 63bd21067..1b98fb807 100644 --- a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json @@ -86,7 +86,7 @@ }, "CHANNEL_WELCOME_TAGLINE": { "LABEL": "Titolo di benvenuto", - "PLACEHOLDER": "Rendiamo semplice connetterci con noi. Chiedete qualsiasi cosa o condividete il vostro feedback." + "PLACEHOLDER": "Siamo qui per aiutarti. Facci una domanda o condividi il tuo feedback." }, "CHANNEL_GREETING_MESSAGE": { "LABEL": "Messaggio di saluto del canale", @@ -523,8 +523,8 @@ "FINISH": { "TITLE": "L'Inbox è pronta!", "MESSAGE": "Ora puoi interagire con i tuoi clienti attraverso il nuovo canale. Buona assistenza", - "BUTTON_TEXT": "Portami lì", - "MORE_SETTINGS": "Altre impostazioni", + "BUTTON_TEXT": "Fatto", + "MORE_SETTINGS": "Impostazioni Aggiuntive", "WEBSITE_SUCCESS": "Hai completato la creazione di un canale sito web. Copia il codice mostrato qui sotto e incollalo sul tuo sito. La prossima volta che un cliente usa la live chat, la conversazione apparirà automaticamente nella tua inbox.", "WHATSAPP_QR_INSTRUCTION": "Scansiona il QR Code qui sopra per testare rapidamente la tua Inbox WhatsApp", "MESSENGER_QR_INSTRUCTION": "Scansiona il QR Code qui sopra per testare rapidamente la tua Inbox Facebook Messenger", @@ -918,7 +918,7 @@ }, "WELCOME_TAGLINE": { "LABEL": "Titolo di benvenuto", - "PLACE_HOLDER": "Rendiamo semplice connetterci con noi. Chiedete qualsiasi cosa o condividete il vostro feedback." + "PLACE_HOLDER": "Siamo qui per aiutarti. Facci una domanda o condividi il tuo feedback." }, "REPLY_TIME": { "LABEL": "Tempo di risposta", diff --git a/app/javascript/dashboard/i18n/locale/it/integrations.json b/app/javascript/dashboard/i18n/locale/it/integrations.json index 334ee8889..804385262 100644 --- a/app/javascript/dashboard/i18n/locale/it/integrations.json +++ b/app/javascript/dashboard/i18n/locale/it/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Digitazione conversazione disattiva" } }, + "NAME": { + "LABEL": "Nome Webhook", + "PLACEHOLDER": "Inserisci un nome per il webhook" + }, "END_POINT": { "LABEL": "URL del webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Scopri di più", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistenti", + "SWITCH_ASSISTANT": "Cambia assistenti", + "NEW_ASSISTANT": "Crea Assistente" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Prova questi prompt", @@ -483,9 +492,7 @@ "NOT_FOUND": "Impossibile trovare l'assistente. Riprova." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistente" - }, + "HEADER": "Impostazioni", "BASIC_SETTINGS": { "TITLE": "Impostazioni di base", "DESCRIPTION": "Personalizza ciò che l'assistente dice quando termina una conversazione o la trasferisce a un umano." @@ -502,15 +509,16 @@ "TITLE": "Guardrail", "DESCRIPTION": "Mantieni l’assistente concentrato: risponde solo ai tipi di domande che desideri, evitando argomenti fuori tema o non consentiti." }, - "SCENARIOS": { - "TITLE": "Scenari", - "DESCRIPTION": "Fornisci contesto aggiuntivo al tuo assistente, ad esempio “cosa fare quando un utente è bloccato” o “come comportarsi durante una richiesta di rimborso”." - }, "RESPONSE_GUIDELINES": { "TITLE": "Linee guida per le risposte", "DESCRIPTION": "Imposta il tono e la struttura delle risposte del tuo assistente: chiare e amichevoli? Brevi e dirette? Dettagliate e formali?" } } + }, + "DELETE": { + "TITLE": "Elimina Assistente", + "DESCRIPTION": "Questa azione è permanente. L'eliminazione di questo assistente la rimuoverà da tutte le inbox connesse e cancellerà definitivamente tutte le knowledge generate.", + "BUTTON_TEXT": "Elimina {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrail", "DESCRIPTION": "Mantieni l’assistente concentrato: risponde solo ai tipi di domande che desideri, evitando argomenti fuori tema o non consentiti.", - "BREADCRUMB": { - "TITLE": "Guardrail" - }, "BULK_ACTION": { "SELECTED": "{count} elemento selezionato | {count} elementi selezionati", "SELECT_ALL": "Seleziona tutto ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Linee Guida per le Risposte", "DESCRIPTION": "Imposta il tono e la struttura delle risposte del tuo assistente: chiare e amichevoli? Brevi e dirette? Dettagliate e formali?", - "BREADCRUMB": { - "TITLE": "Linee Guida per le Risposte" - }, "BULK_ACTION": { "SELECTED": "{count} elemento selezionato | {count} elementi selezionati", "SELECT_ALL": "Seleziona tutto ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenari", "DESCRIPTION": "Fornisci contesto aggiuntivo al tuo assistente, ad esempio “cosa fare quando un utente è bloccato” o “come comportarsi durante una richiesta di rimborso”.", - "BREADCRUMB": { - "TITLE": "Scenari" - }, "BULK_ACTION": { "SELECTED": "{count} elemento selezionato | {count} elementi selezionati", "SELECT_ALL": "Seleziona tutto ({count})", @@ -691,17 +690,17 @@ } }, "DOCUMENTS": { - "HEADER": "Documents", - "ADD_NEW": "Create a new document", + "HEADER": "Documenti", + "ADD_NEW": "Crea un nuovo documento", "RELATED_RESPONSES": { "TITLE": "FAQ Correlate", "DESCRIPTION": "Queste FAQ vengono generate direttamente dai Documenti." }, - "FORM_DESCRIPTION": "Enter the URL of the document to add it as a knowledge source and choose the assistant to associate it with.", + "FORM_DESCRIPTION": "Inserisci l'URL del documento per aggiungerlo come fonte e scegli l'assistente con cui associarlo.", "CREATE": { - "TITLE": "Add a document", - "SUCCESS_MESSAGE": "The document has been successfully created", - "ERROR_MESSAGE": "There was an error creating the document, please try again." + "TITLE": "Aggiungi un documento", + "SUCCESS_MESSAGE": "Il documento è stato creato correttamente", + "ERROR_MESSAGE": "Si è verificato un errore durante la creazione del documento, riprova." }, "FORM": { "TYPE": { @@ -711,8 +710,8 @@ }, "URL": { "LABEL": "URL", - "PLACEHOLDER": "Enter the URL of the document", - "ERROR": "Please provide a valid URL for the document" + "PLACEHOLDER": "Inserisci l'URL del documento", + "ERROR": "Inserisci un URL valido per il documento" }, "PDF_FILE": { "LABEL": "File PDF", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Nome Documento (Opzionale)", "PLACEHOLDER": "Inserisci un nome per il documento" - }, - "ASSISTANT": { - "LABEL": "Assistente", - "PLACEHOLDER": "Seleziona l'assistente", - "ERROR": "Il campo assistente è richiesto" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Risposta", "PLACEHOLDER": "Inserisci qui la risposta", "ERROR": "Inserisci una risposta valida." - }, - "ASSISTANT": { - "LABEL": "Assistente", - "PLACEHOLDER": "Seleziona un assistente", - "ERROR": "Seleziona un assistente." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/it/report.json b/app/javascript/dashboard/i18n/locale/it/report.json index 52b8e1685..13694e2af 100644 --- a/app/javascript/dashboard/i18n/locale/it/report.json +++ b/app/javascript/dashboard/i18n/locale/it/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Ultimi 7 giorni", "LAST_14_DAYS": "Ultimi 14 giorni", "LAST_30_DAYS": "Ultimi 30 giorni", + "THIS_MONTH": "Questo mese", + "LAST_MONTH": "Il mese scorso", "LAST_3_MONTHS": "Ultimi 3 mesi", "LAST_6_MONTHS": "Ultimi 6 mesi", "LAST_YEAR": "Ultimo anno", diff --git a/app/javascript/dashboard/i18n/locale/it/settings.json b/app/javascript/dashboard/i18n/locale/it/settings.json index 4e84259c6..de761061a 100644 --- a/app/javascript/dashboard/i18n/locale/it/settings.json +++ b/app/javascript/dashboard/i18n/locale/it/settings.json @@ -27,10 +27,10 @@ "CARD": { "ENTER_KEY": { "HEADING": "Invio (↵)", - "CONTENT": "Invia messaggi premendo il tasto INVIO invece di fare clic sul pulsante Invia." + "CONTENT": "Invia messaggi premendo il tasto Invio invece di fare clic sul pulsante Invia." }, "CMD_ENTER_KEY": { - "HEADING": "Cmd/Ctrl + Enter (⌘ + ↵)", + "HEADING": "Cmd/Ctrl + Invio (⌘ + ↵)", "CONTENT": "Invia messaggi premendo Cmd/Ctrl + Invio invece di dover cliccare sul pulsante Invia." } } @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Sospeso", "MESSAGE": "Il tuo account è sospeso. Contatta il team di supporto per ulteriori informazioni." + }, + "NO_ACCOUNTS": { + "TITLE": "Nessun account trovato", + "MESSAGE_CLOUD": "Non fai parte di nessun account al momento. Se pensi che sia un errore, contatta il nostro team di supporto.", + "MESSAGE_SELF_HOSTED": "Non fai parte di nessun account al momento. Per favore contatta il tuo amministratore.", + "LOGOUT": "Disconnetti" } }, "COMPONENTS": { @@ -299,12 +305,16 @@ "REPORTS": "Report", "SETTINGS": "Impostazioni", "CONTACTS": "Contatti", - "ACTIVE": "Attiva", + "ACTIVE": "Attivi", "CAPTAIN": "Captain", "CAPTAIN_ASSISTANTS": "Assistenti", "CAPTAIN_DOCUMENTS": "Documenti", "CAPTAIN_RESPONSES": "FAQ", "CAPTAIN_TOOLS": "Strumenti", + "CAPTAIN_SCENARIOS": "Scenari", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inbox", + "CAPTAIN_SETTINGS": "Impostazioni", "HOME": "Home", "AGENTS": "Operatori", "AGENT_BOTS": "Bots", @@ -324,7 +334,7 @@ "BILLING": "Fatturazione", "CUSTOM_VIEWS_FOLDER": "Cartelle", "CUSTOM_VIEWS_SEGMENTS": "Segmenti", - "ALL_CONTACTS": "Tutti I Contatti", + "ALL_CONTACTS": "Tutti i Contatti", "TAGGED_WITH": "Etichettato con", "NEW_LABEL": "Nuova etichetta", "NEW_TEAM": "Nuovo team", diff --git a/app/javascript/dashboard/i18n/locale/ja/integrations.json b/app/javascript/dashboard/i18n/locale/ja/integrations.json index 7af145aae..eb11e38ee 100644 --- a/app/javascript/dashboard/i18n/locale/ja/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ja/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "例: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "キャプテン", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "アシスタント", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "コパイロット", "TRY_THESE_PROMPTS": "これらのプロンプトを試してください", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "アシスタント" - }, + "HEADER": "設定", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "アシスタントを削除", + "DESCRIPTION": "この操作は永久的です。アシスタントを削除すると、すべての接続された受信トレイから削除され、生成されたすべての知識が永久に消去されます。", + "BUTTON_TEXT": "{assistantName}を削除" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "アシスタント", - "PLACEHOLDER": "アシスタントを選択", - "ERROR": "アシスタントの選択が必要です" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "回答", "PLACEHOLDER": "ここに回答を入力", "ERROR": "有効な回答を入力してください。" - }, - "ASSISTANT": { - "LABEL": "アシスタント", - "PLACEHOLDER": "アシスタントを選択", - "ERROR": "アシスタントを選択してください。" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ja/report.json b/app/javascript/dashboard/i18n/locale/ja/report.json index 75f715780..d90524f4e 100644 --- a/app/javascript/dashboard/i18n/locale/ja/report.json +++ b/app/javascript/dashboard/i18n/locale/ja/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "過去 7 日間", "LAST_14_DAYS": "過去 14 日間", "LAST_30_DAYS": "過去 30 日間", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "過去 3 ヶ月", "LAST_6_MONTHS": "過去 6 ヶ月", "LAST_YEAR": "過去 1 年", diff --git a/app/javascript/dashboard/i18n/locale/ja/settings.json b/app/javascript/dashboard/i18n/locale/ja/settings.json index 297fb854a..27874b6fa 100644 --- a/app/javascript/dashboard/i18n/locale/ja/settings.json +++ b/app/javascript/dashboard/i18n/locale/ja/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "アカウント停止中", "MESSAGE": "アカウントが停止されています。詳細についてはサポートチームにお問い合わせください。" + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "ログアウト" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "ドキュメント", "CAPTAIN_RESPONSES": "FAQ", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "受信トレイ", + "CAPTAIN_SETTINGS": "設定", "HOME": "ホーム", "AGENTS": "担当者", "AGENT_BOTS": "ボット", diff --git a/app/javascript/dashboard/i18n/locale/ka/integrations.json b/app/javascript/dashboard/i18n/locale/ka/integrations.json index c5b554ee7..0566abd9a 100644 --- a/app/javascript/dashboard/i18n/locale/ka/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ka/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ka/report.json b/app/javascript/dashboard/i18n/locale/ka/report.json index 22e285c19..a2ad6bd4a 100644 --- a/app/javascript/dashboard/i18n/locale/ka/report.json +++ b/app/javascript/dashboard/i18n/locale/ka/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/ka/settings.json b/app/javascript/dashboard/i18n/locale/ka/settings.json index ea45db5fa..ac11edc13 100644 --- a/app/javascript/dashboard/i18n/locale/ka/settings.json +++ b/app/javascript/dashboard/i18n/locale/ka/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "ინსტრუმენტები", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/ko/integrations.json b/app/javascript/dashboard/i18n/locale/ko/integrations.json index 9d0fd597a..8bc57201a 100644 --- a/app/javascript/dashboard/i18n/locale/ko/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ko/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "웹훅 URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "설정", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ko/report.json b/app/javascript/dashboard/i18n/locale/ko/report.json index be85b62c7..b53d52e6f 100644 --- a/app/javascript/dashboard/i18n/locale/ko/report.json +++ b/app/javascript/dashboard/i18n/locale/ko/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "지난 7일", "LAST_14_DAYS": "지난 14일", "LAST_30_DAYS": "지난 30일", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/ko/settings.json b/app/javascript/dashboard/i18n/locale/ko/settings.json index 4e4af2242..b55c84e9b 100644 --- a/app/javascript/dashboard/i18n/locale/ko/settings.json +++ b/app/javascript/dashboard/i18n/locale/ko/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "받은 메시지함", + "CAPTAIN_SETTINGS": "설정", "HOME": "홈", "AGENTS": "에이전트", "AGENT_BOTS": "봇", diff --git a/app/javascript/dashboard/i18n/locale/lt/integrations.json b/app/javascript/dashboard/i18n/locale/lt/integrations.json index 0bba965a7..266d5c56f 100644 --- a/app/javascript/dashboard/i18n/locale/lt/integrations.json +++ b/app/javascript/dashboard/i18n/locale/lt/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Nustatymai", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/lt/report.json b/app/javascript/dashboard/i18n/locale/lt/report.json index f5fcc3d52..cbd0536d9 100644 --- a/app/javascript/dashboard/i18n/locale/lt/report.json +++ b/app/javascript/dashboard/i18n/locale/lt/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Paskutines 7 dienas", "LAST_14_DAYS": "Paskutines 14 dienų", "LAST_30_DAYS": "Paskutines 30 dienų", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Paskutinius 3 mėnesius", "LAST_6_MONTHS": "Paskutinius 6 mėnesius", "LAST_YEAR": "Paskutinius metus", diff --git a/app/javascript/dashboard/i18n/locale/lt/settings.json b/app/javascript/dashboard/i18n/locale/lt/settings.json index 7b0b24e1c..e2958313b 100644 --- a/app/javascript/dashboard/i18n/locale/lt/settings.json +++ b/app/javascript/dashboard/i18n/locale/lt/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Paskyra laikinai sustabdyta", "MESSAGE": "Jūsų paskyra laikinai sustabdyta. Norėdami gauti daugiau informacijos, susisiekite su palaikymo komanda." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Gautų laiškų aplankai", + "CAPTAIN_SETTINGS": "Nustatymai", "HOME": "Pagrindinis", "AGENTS": "Agentai", "AGENT_BOTS": "Botai", diff --git a/app/javascript/dashboard/i18n/locale/lv/integrations.json b/app/javascript/dashboard/i18n/locale/lv/integrations.json index cb5dca8a2..7ffcdc6cf 100644 --- a/app/javascript/dashboard/i18n/locale/lv/integrations.json +++ b/app/javascript/dashboard/i18n/locale/lv/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Piemēram: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Kapteinis", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Asistenti", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Kopilots", "TRY_THESE_PROMPTS": "Pamēģiniet", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Asistents" - }, + "HEADER": "Iestatījumi", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Dzēst Asistentu", + "DESCRIPTION": "Šī darbība ir pastāvīga. Dzēšot šo asistentu, tas tiks noņemts no visām pievienotajām iesūtnēm un neatgriezeniski dzēstas visas ģenerētās zināšanas.", + "BUTTON_TEXT": "Dzēst {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Asistents", - "PLACEHOLDER": "Izvēlēties asistentu", - "ERROR": "Asistenta lauks ir obligāti jāaizpilda" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Atbilde", "PLACEHOLDER": "Ievadiet atbildi šeit", "ERROR": "Lūdzu, ievadiet derīgu atbildi." - }, - "ASSISTANT": { - "LABEL": "Asistents", - "PLACEHOLDER": "Izvēlieties asistentu", - "ERROR": "Lūdzu, izvēlieties asistentu." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/lv/report.json b/app/javascript/dashboard/i18n/locale/lv/report.json index b7a04d026..305da8164 100644 --- a/app/javascript/dashboard/i18n/locale/lv/report.json +++ b/app/javascript/dashboard/i18n/locale/lv/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Pēdējās 7 dienas", "LAST_14_DAYS": "Pēdējās 14 dienas", "LAST_30_DAYS": "Pēdējās 30 dienas", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Pēdējie 3 mēneši", "LAST_6_MONTHS": "Pēdējie 6 mēneši", "LAST_YEAR": "Pagājušais gads", diff --git a/app/javascript/dashboard/i18n/locale/lv/settings.json b/app/javascript/dashboard/i18n/locale/lv/settings.json index 663754aec..78f7a4d12 100644 --- a/app/javascript/dashboard/i18n/locale/lv/settings.json +++ b/app/javascript/dashboard/i18n/locale/lv/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Konts Iesaldēts", "MESSAGE": "Jūsu konts ir iesaldēts. Lai iegūtu papildu informāciju, lūdzu, sazinieties ar atbalsta komandu." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Izrakstīties" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Dokumenti", "CAPTAIN_RESPONSES": "Bieži uzdotie jautājumi", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Iesūtnes", + "CAPTAIN_SETTINGS": "Iestatījumi", "HOME": "Sākums", "AGENTS": "Aģenti", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/ml/integrations.json b/app/javascript/dashboard/i18n/locale/ml/integrations.json index 0c3e2d8cd..35c3b24b9 100644 --- a/app/javascript/dashboard/i18n/locale/ml/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ml/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "വെബ്‌ഹുക്ക് യുആർഎൽ", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "ക്രമീകരണങ്ങൾ", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ml/report.json b/app/javascript/dashboard/i18n/locale/ml/report.json index 3416089ff..fbbcca17c 100644 --- a/app/javascript/dashboard/i18n/locale/ml/report.json +++ b/app/javascript/dashboard/i18n/locale/ml/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "കഴിഞ്ഞ 7 ദിവസം", "LAST_14_DAYS": "കഴിഞ്ഞ 14 ദിവസം", "LAST_30_DAYS": "കഴിഞ്ഞ 30 ദിവസം", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "കഴിഞ്ഞ 3 മാസം", "LAST_6_MONTHS": "കഴിഞ്ഞ 6 മാസം", "LAST_YEAR": "കഴിഞ്ഞ വർഷം", diff --git a/app/javascript/dashboard/i18n/locale/ml/settings.json b/app/javascript/dashboard/i18n/locale/ml/settings.json index 4fa67d25e..a745f4e84 100644 --- a/app/javascript/dashboard/i18n/locale/ml/settings.json +++ b/app/javascript/dashboard/i18n/locale/ml/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "ഇൻ‌ബോക്സുകൾ", + "CAPTAIN_SETTINGS": "ക്രമീകരണങ്ങൾ", "HOME": "ഹോം", "AGENTS": "ഏജന്റുമാർ", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/ms/integrations.json b/app/javascript/dashboard/i18n/locale/ms/integrations.json index 4aa2fb33e..e530f8fb9 100644 --- a/app/javascript/dashboard/i18n/locale/ms/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ms/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ms/report.json b/app/javascript/dashboard/i18n/locale/ms/report.json index e72366e45..a70387666 100644 --- a/app/javascript/dashboard/i18n/locale/ms/report.json +++ b/app/javascript/dashboard/i18n/locale/ms/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/ms/settings.json b/app/javascript/dashboard/i18n/locale/ms/settings.json index 57032fa82..712408895 100644 --- a/app/javascript/dashboard/i18n/locale/ms/settings.json +++ b/app/javascript/dashboard/i18n/locale/ms/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Ejen", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/ne/integrations.json b/app/javascript/dashboard/i18n/locale/ne/integrations.json index d14e0f161..d6c7739e6 100644 --- a/app/javascript/dashboard/i18n/locale/ne/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ne/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ne/report.json b/app/javascript/dashboard/i18n/locale/ne/report.json index 22e285c19..a2ad6bd4a 100644 --- a/app/javascript/dashboard/i18n/locale/ne/report.json +++ b/app/javascript/dashboard/i18n/locale/ne/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/ne/settings.json b/app/javascript/dashboard/i18n/locale/ne/settings.json index 28cc081e0..698e5476d 100644 --- a/app/javascript/dashboard/i18n/locale/ne/settings.json +++ b/app/javascript/dashboard/i18n/locale/ne/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/nl/integrations.json b/app/javascript/dashboard/i18n/locale/nl/integrations.json index 7cf3c4242..57dedc0c9 100644 --- a/app/javascript/dashboard/i18n/locale/nl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/nl/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Instellingen", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/nl/report.json b/app/javascript/dashboard/i18n/locale/nl/report.json index 821a4f86c..d10ce7d5e 100644 --- a/app/javascript/dashboard/i18n/locale/nl/report.json +++ b/app/javascript/dashboard/i18n/locale/nl/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Afgelopen 7 dagen", "LAST_14_DAYS": "Afgelopen 14 dagen", "LAST_30_DAYS": "Laatste 30 dagen", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/nl/settings.json b/app/javascript/dashboard/i18n/locale/nl/settings.json index e75351d6d..542998bac 100644 --- a/app/javascript/dashboard/i18n/locale/nl/settings.json +++ b/app/javascript/dashboard/i18n/locale/nl/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxen", + "CAPTAIN_SETTINGS": "Instellingen", "HOME": "Startpagina", "AGENTS": "Medewerkers", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/no/integrations.json b/app/javascript/dashboard/i18n/locale/no/integrations.json index c13484bc3..d162c8412 100644 --- a/app/javascript/dashboard/i18n/locale/no/integrations.json +++ b/app/javascript/dashboard/i18n/locale/no/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Innstillinger", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/no/report.json b/app/javascript/dashboard/i18n/locale/no/report.json index 1cffe8c80..9dcfa688b 100644 --- a/app/javascript/dashboard/i18n/locale/no/report.json +++ b/app/javascript/dashboard/i18n/locale/no/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Siste 7 dager", "LAST_14_DAYS": "Siste 14 dager", "LAST_30_DAYS": "Siste 30 dager", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/no/settings.json b/app/javascript/dashboard/i18n/locale/no/settings.json index 7ed01e244..df9483f5a 100644 --- a/app/javascript/dashboard/i18n/locale/no/settings.json +++ b/app/javascript/dashboard/i18n/locale/no/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Innbokser", + "CAPTAIN_SETTINGS": "Innstillinger", "HOME": "Hjem", "AGENTS": "Agenter", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/pl/integrations.json b/app/javascript/dashboard/i18n/locale/pl/integrations.json index 237f584ae..741f7fc9c 100644 --- a/app/javascript/dashboard/i18n/locale/pl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pl/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Adres URL webhooka", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Ustawienia", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/pl/report.json b/app/javascript/dashboard/i18n/locale/pl/report.json index 75e475b07..9a82f5b8b 100644 --- a/app/javascript/dashboard/i18n/locale/pl/report.json +++ b/app/javascript/dashboard/i18n/locale/pl/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Ostatnie 7 dni", "LAST_14_DAYS": "Ostatnie 14 dni", "LAST_30_DAYS": "Ostatnie 30 dni", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Ostatnie 3 miesiące", "LAST_6_MONTHS": "Ostatnie 6 miesięcy", "LAST_YEAR": "Ostatni rok", diff --git a/app/javascript/dashboard/i18n/locale/pl/settings.json b/app/javascript/dashboard/i18n/locale/pl/settings.json index 0314c4375..974e9c138 100644 --- a/app/javascript/dashboard/i18n/locale/pl/settings.json +++ b/app/javascript/dashboard/i18n/locale/pl/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Konto zawieszone", "MESSAGE": "Twoje konto zostało zawieszone. Skontaktuj się z zespołem pomocy technicznej w celu uzyskania dodatkowych informacji." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Zarządzanie skrzynkami", + "CAPTAIN_SETTINGS": "Ustawienia", "HOME": "Strona główna", "AGENTS": "Agenci", "AGENT_BOTS": "Boty", diff --git a/app/javascript/dashboard/i18n/locale/pt/integrations.json b/app/javascript/dashboard/i18n/locale/pt/integrations.json index 4506492ff..4d485528e 100644 --- a/app/javascript/dashboard/i18n/locale/pt/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pt/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversa: a escrever desligada" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL do webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Não foi possível encontrar o assistente. Por favor, tente novamente." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Configurações", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Selecionar todas ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Selecionar todas ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Selecionar todas ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/pt/report.json b/app/javascript/dashboard/i18n/locale/pt/report.json index 44796931d..43b97d46d 100644 --- a/app/javascript/dashboard/i18n/locale/pt/report.json +++ b/app/javascript/dashboard/i18n/locale/pt/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Últimos 7 Dias", "LAST_14_DAYS": "Últimos 14 Dias", "LAST_30_DAYS": "Últimos 30 Dias", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Últimos 3 meses", "LAST_6_MONTHS": "Últimos 6 meses", "LAST_YEAR": "Último ano", diff --git a/app/javascript/dashboard/i18n/locale/pt/settings.json b/app/javascript/dashboard/i18n/locale/pt/settings.json index 8e71ed9a2..7c2ae657c 100644 --- a/app/javascript/dashboard/i18n/locale/pt/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Conta Suspensa", "MESSAGE": "A sua conta está suspensa. Entre em contato com a equipa de suporte para obter mais informações." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Ferramentas", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Caixas de Entrada", + "CAPTAIN_SETTINGS": "Configurações", "HOME": "Principal", "AGENTS": "Agentes", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json index 9d2319aae..b9311d051 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Status de Digitação desativado" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL do Webhook", "PLACEHOLDER": "Exemplo: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Capitão", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistentes", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copiloto", "TRY_THESE_PROMPTS": "Experimente estes comandos", @@ -483,9 +492,7 @@ "NOT_FOUND": "Não foi possível encontrar o assistente. Tente novamente." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistente" - }, + "HEADER": "Configurações", "BASIC_SETTINGS": { "TITLE": "Configurações básicas", "DESCRIPTION": "Personalize o que o assistente diz quando termina uma conversa ou transfere para um humano." @@ -502,15 +509,16 @@ "TITLE": "Proteções", "DESCRIPTION": "Mantém as coisas no caminho — apenas os tipos de perguntas que você quer que seu assistente responda, nada fora de limites ou fora do tópico." }, - "SCENARIOS": { - "TITLE": "Cenários", - "DESCRIPTION": "Dê algum contexto ao seu assistente — como \"o que fazer quando um usuário estiver com problemas\", ou \"como agir durante uma solicitação de reembolso\"." - }, "RESPONSE_GUIDELINES": { "TITLE": "Diretrizes de resposta", "DESCRIPTION": "O jeito e a estrutura das respostas do seu assistente — tranquilo e amigável? Curto e ágil? Detalhado e formal?" } } + }, + "DELETE": { + "TITLE": "Excluir Assistente", + "DESCRIPTION": "Esta ação é permanente. Excluir este assistente irá removê-lo de todas as caixas de entrada conectadas e apagará permanentemente todo o conhecimento gerado.", + "BUTTON_TEXT": "Excluir {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Proteções", "DESCRIPTION": "Mantém as coisas no caminho — apenas os tipos de perguntas que você quer que seu assistente responda, nada fora de limites ou fora do tópico.", - "BREADCRUMB": { - "TITLE": "Proteções" - }, "BULK_ACTION": { "SELECTED": "{count} item selecionado | {count} itens selecionados", "SELECT_ALL": "Selecionar todos ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Diretrizes de Resposta", "DESCRIPTION": "O jeito e a estrutura das respostas do seu assistente — tranquilo e amigável? Curto e ágil? Detalhado e formal?", - "BREADCRUMB": { - "TITLE": "Diretrizes de Resposta" - }, "BULK_ACTION": { "SELECTED": "{count} item selecionado | {count} itens selecionados", "SELECT_ALL": "Selecionar todos ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Cenários", "DESCRIPTION": "Dê algum contexto ao seu assistente — como \"o que fazer quando um usuário estiver com problemas\", ou \"como agir durante uma solicitação de reembolso\".", - "BREADCRUMB": { - "TITLE": "Cenários" - }, "BULK_ACTION": { "SELECTED": "{count} item selecionado | {count} itens selecionados", "SELECT_ALL": "Selecionar todos ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Nome do documento (opcional)", "PLACEHOLDER": "Insira um nome para o documento" - }, - "ASSISTANT": { - "LABEL": "Assistente", - "PLACEHOLDER": "Selecione o assistente", - "ERROR": "O campo Assistente é obrigatório" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Responder", "PLACEHOLDER": "Digite a resposta aqui", "ERROR": "Por favor, forneça uma resposta válida." - }, - "ASSISTANT": { - "LABEL": "Assistente", - "PLACEHOLDER": "Selecione um assistente", - "ERROR": "Por favor, selecione um assistente." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/report.json b/app/javascript/dashboard/i18n/locale/pt_BR/report.json index 7f1140fdd..426e895c1 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/report.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Últimos 7 dias", "LAST_14_DAYS": "Últimos 14 dias", "LAST_30_DAYS": "Últimos 30 dias", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Últimos 3 meses", "LAST_6_MONTHS": "Últimos 6 meses", "LAST_YEAR": "Ano passado", diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json index 8c4f3050c..b3afb42d0 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Conta Suspensa", "MESSAGE": "Sua conta está suspensa. Entre em contato com a equipe de suporte para obter mais informações." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Encerrar sessão" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documentos", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Ferramentas", + "CAPTAIN_SCENARIOS": "Cenários", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Caixas de Entrada", + "CAPTAIN_SETTINGS": "Configurações", "HOME": "Principal", "AGENTS": "Agentes", "AGENT_BOTS": "Robôs", diff --git a/app/javascript/dashboard/i18n/locale/ro/integrations.json b/app/javascript/dashboard/i18n/locale/ro/integrations.json index 26c4a59d3..8ec2f80f3 100644 --- a/app/javascript/dashboard/i18n/locale/ro/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ro/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL Webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Setări", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ro/report.json b/app/javascript/dashboard/i18n/locale/ro/report.json index 9c712852f..a41f15393 100644 --- a/app/javascript/dashboard/i18n/locale/ro/report.json +++ b/app/javascript/dashboard/i18n/locale/ro/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Ultimele 7 zile", "LAST_14_DAYS": "Ultimele 14 zile", "LAST_30_DAYS": "Ultimele 30 zile", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Ultimele 3 luni", "LAST_6_MONTHS": "Ultimele 6 luni", "LAST_YEAR": "Anul trecut", diff --git a/app/javascript/dashboard/i18n/locale/ro/settings.json b/app/javascript/dashboard/i18n/locale/ro/settings.json index def3181f6..7c976827d 100644 --- a/app/javascript/dashboard/i18n/locale/ro/settings.json +++ b/app/javascript/dashboard/i18n/locale/ro/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Cont suspendat", "MESSAGE": "Contul tău este suspendat. Vă rugăm să contactați echipa de asistență pentru mai multe informații." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Căsuțe", + "CAPTAIN_SETTINGS": "Setări", "HOME": "Acasa", "AGENTS": "Agenți", "AGENT_BOTS": "Boți", diff --git a/app/javascript/dashboard/i18n/locale/ru/integrations.json b/app/javascript/dashboard/i18n/locale/ru/integrations.json index 50b5aa94f..eaa271564 100644 --- a/app/javascript/dashboard/i18n/locale/ru/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ru/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Печатание во время разговора выключено" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL вебхука", "PLACEHOLDER": "Пример: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Капитан", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Ассистенты", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Попробуйте эти запросы", @@ -483,9 +492,7 @@ "NOT_FOUND": "Не удалось найти помощника. Пожалуйста, попробуйте еще раз." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Ассистент" - }, + "HEADER": "Настройки", "BASIC_SETTINGS": { "TITLE": "Основные настройки", "DESCRIPTION": "Настройте то, что говорит ассистент, завершая диалог или передавая человеку." @@ -502,15 +509,16 @@ "TITLE": "Ограждения", "DESCRIPTION": "Сохраняет вещи в нужном контексте — только те вопросы, которые вы хотите, чтобы ваш ассистент отвечал, ничего запрещённого или не по теме." }, - "SCENARIOS": { - "TITLE": "Сценарии", - "DESCRIPTION": "Дайте своему ассистенту определенный контекст, например «что делать, когда пользователь застрял» или «как действовать во время запроса на возмещение»." - }, "RESPONSE_GUIDELINES": { "TITLE": "Рекомендации по ответу", "DESCRIPTION": "Вайб и структура ответов помощника – ясные и дружелюбные? Коротко и непросто? Детально и формально?" } } + }, + "DELETE": { + "TITLE": "Удалить ассистента", + "DESCRIPTION": "Это действие необратимо. Удаление этого ассистента удалит его из всех подключенных источников и навсегда удалит все сгенерированные знания.", + "BUTTON_TEXT": "Удалить {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Ограждения", "DESCRIPTION": "Сохраняет вещи в нужном контексте — только те вопросы, которые вы хотите, чтобы ваш ассистент отвечал, ничего запрещённого или не по теме.", - "BREADCRUMB": { - "TITLE": "Ограждения" - }, "BULK_ACTION": { "SELECTED": "{count} элемент выбран | {count} элементов выбрано", "SELECT_ALL": "Выбрать все ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Руководство по ограждению", "DESCRIPTION": "Вайб и структура ответов помощника – ясные и дружелюбные? Коротко и непросто? Детально и формально?", - "BREADCRUMB": { - "TITLE": "Руководство по ограждению" - }, "BULK_ACTION": { "SELECTED": "{count} элемент выбран | {count} элементов выбрано", "SELECT_ALL": "Выбрать все ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Сценарии", "DESCRIPTION": "Дайте своему ассистенту определенный контекст, например «что делать, когда пользователь застрял» или «как действовать во время запроса на возмещение».", - "BREADCRUMB": { - "TITLE": "Сценарии" - }, "BULK_ACTION": { "SELECTED": "{count} элемент выбран | {count} элементов выбрано", "SELECT_ALL": "Выбрать все ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Название документа (необязательно)", "PLACEHOLDER": "Введите название документа" - }, - "ASSISTANT": { - "LABEL": "Ассистент", - "PLACEHOLDER": "Выберите ассистента", - "ERROR": "Необходимо заполнить поле ассистента" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Ответ", "PLACEHOLDER": "Введите ответ", "ERROR": "Пожалуйста, введите корректный ответ." - }, - "ASSISTANT": { - "LABEL": "Ассистент", - "PLACEHOLDER": "Выбрать ассистента", - "ERROR": "Выбрать ассистента" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ru/report.json b/app/javascript/dashboard/i18n/locale/ru/report.json index c01aa0b0c..abb9be29b 100644 --- a/app/javascript/dashboard/i18n/locale/ru/report.json +++ b/app/javascript/dashboard/i18n/locale/ru/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Последние 7 дней", "LAST_14_DAYS": "Последние 14 дней", "LAST_30_DAYS": "Последние 30 дней", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Последние 3 месяца", "LAST_6_MONTHS": "Последние 6 месяцев", "LAST_YEAR": "За прошлый год", diff --git a/app/javascript/dashboard/i18n/locale/ru/settings.json b/app/javascript/dashboard/i18n/locale/ru/settings.json index 6215481fe..9c9b7ea59 100644 --- a/app/javascript/dashboard/i18n/locale/ru/settings.json +++ b/app/javascript/dashboard/i18n/locale/ru/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Аккаунт заблокирован", "MESSAGE": "Ваша учетная запись приостановлена. Пожалуйста, обратитесь в службу поддержки для получения дополнительной информации." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Выйти из системы" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Документы", "CAPTAIN_RESPONSES": "FAQ", "CAPTAIN_TOOLS": "Инструменты", + "CAPTAIN_SCENARIOS": "Сценарии", + "CAPTAIN_PLAYGROUND": "Площадка", + "CAPTAIN_INBOXES": "Источники", + "CAPTAIN_SETTINGS": "Настройки", "HOME": "Главная", "AGENTS": "Операторы", "AGENT_BOTS": "Боты", diff --git a/app/javascript/dashboard/i18n/locale/sh/integrations.json b/app/javascript/dashboard/i18n/locale/sh/integrations.json index c5b554ee7..0566abd9a 100644 --- a/app/javascript/dashboard/i18n/locale/sh/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sh/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sh/report.json b/app/javascript/dashboard/i18n/locale/sh/report.json index 22e285c19..a2ad6bd4a 100644 --- a/app/javascript/dashboard/i18n/locale/sh/report.json +++ b/app/javascript/dashboard/i18n/locale/sh/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/sh/settings.json b/app/javascript/dashboard/i18n/locale/sh/settings.json index 812b0cd8b..50cf38b58 100644 --- a/app/javascript/dashboard/i18n/locale/sh/settings.json +++ b/app/javascript/dashboard/i18n/locale/sh/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/sk/integrations.json b/app/javascript/dashboard/i18n/locale/sk/integrations.json index 942461242..963814952 100644 --- a/app/javascript/dashboard/i18n/locale/sk/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sk/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Nastavenia", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sk/report.json b/app/javascript/dashboard/i18n/locale/sk/report.json index 882ed9cab..65d7182d0 100644 --- a/app/javascript/dashboard/i18n/locale/sk/report.json +++ b/app/javascript/dashboard/i18n/locale/sk/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Posledných 7 dní", "LAST_14_DAYS": "Posledných 14 dní", "LAST_30_DAYS": "Posledných 30 dní", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Posledné 3 mesiace", "LAST_6_MONTHS": "Posledných 6 mesiacov", "LAST_YEAR": "Posledný rok", diff --git a/app/javascript/dashboard/i18n/locale/sk/settings.json b/app/javascript/dashboard/i18n/locale/sk/settings.json index 719146e9e..7fc93a668 100644 --- a/app/javascript/dashboard/i18n/locale/sk/settings.json +++ b/app/javascript/dashboard/i18n/locale/sk/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Nastavenia", "HOME": "Home", "AGENTS": "Agenti", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/sl/integrations.json b/app/javascript/dashboard/i18n/locale/sl/integrations.json index 1ae3a96b5..91018d11f 100644 --- a/app/javascript/dashboard/i18n/locale/sl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sl/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sl/report.json b/app/javascript/dashboard/i18n/locale/sl/report.json index efcfb05af..6aaaabb7e 100644 --- a/app/javascript/dashboard/i18n/locale/sl/report.json +++ b/app/javascript/dashboard/i18n/locale/sl/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/sl/settings.json b/app/javascript/dashboard/i18n/locale/sl/settings.json index b5df89409..ab3ecd93b 100644 --- a/app/javascript/dashboard/i18n/locale/sl/settings.json +++ b/app/javascript/dashboard/i18n/locale/sl/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Boti", diff --git a/app/javascript/dashboard/i18n/locale/sq/integrations.json b/app/javascript/dashboard/i18n/locale/sq/integrations.json index 8a4a1c41e..6305a2c82 100644 --- a/app/javascript/dashboard/i18n/locale/sq/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sq/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Kufizime", "DESCRIPTION": "I mban gjërat në vijë—vetëm llojet e pyetjeve që dëshironi që asistenti juaj t’u përgjigjet, asgjë e ndaluar apo jashtë teme.", - "BREADCRUMB": { - "TITLE": "Kufizime" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Zgjidh të gjitha ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "Stili dhe struktura e përgjigjeve të asistentit tuaj—të qarta dhe miqësore? Të shkurtra dhe koncize? Të detajuara dhe formale?", - "BREADCRUMB": { - "TITLE": "Udhëzime për përgjigjet" - }, "BULK_ACTION": { "SELECTED": "{count, plural, one {{count} element i përzgjedhur} other {{count} elemente të përzgjedhura}}", "SELECT_ALL": "Zgjidh të gjitha ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Skenarë", "DESCRIPTION": "Jepini asistentit pak kontekst—si p.sh. “çfarë të bëjë kur një përdorues ngec” ose “si të veprojë gjatë një kërkese për rimbursim”.", - "BREADCRUMB": { - "TITLE": "Skenarë" - }, "BULK_ACTION": { "SELECTED": "{count, plural, one {{count} element i përzgjedhur} other {{count} elemente të përzgjedhura}}", "SELECT_ALL": "Zgjidh të gjitha ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sq/report.json b/app/javascript/dashboard/i18n/locale/sq/report.json index 4ac743070..bee450314 100644 --- a/app/javascript/dashboard/i18n/locale/sq/report.json +++ b/app/javascript/dashboard/i18n/locale/sq/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/sq/settings.json b/app/javascript/dashboard/i18n/locale/sq/settings.json index a05b4a5d8..bbe97e7bc 100644 --- a/app/javascript/dashboard/i18n/locale/sq/settings.json +++ b/app/javascript/dashboard/i18n/locale/sq/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Skenarë", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/sr/integrations.json b/app/javascript/dashboard/i18n/locale/sr/integrations.json index 3c18faba8..b1f2a0c04 100644 --- a/app/javascript/dashboard/i18n/locale/sr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sr/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Adresa veb zakačke", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Podešavanja", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sr/report.json b/app/javascript/dashboard/i18n/locale/sr/report.json index 5c2d928c7..94048d504 100644 --- a/app/javascript/dashboard/i18n/locale/sr/report.json +++ b/app/javascript/dashboard/i18n/locale/sr/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Poslednjih 7 dana", "LAST_14_DAYS": "Poslednjih 14 dana", "LAST_30_DAYS": "Poslednjih 30 dana", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Poslednja 3 meseca", "LAST_6_MONTHS": "Poslednjih 6 meseci", "LAST_YEAR": "Poslednja godina", diff --git a/app/javascript/dashboard/i18n/locale/sr/settings.json b/app/javascript/dashboard/i18n/locale/sr/settings.json index 2bcf552c1..fd70709da 100644 --- a/app/javascript/dashboard/i18n/locale/sr/settings.json +++ b/app/javascript/dashboard/i18n/locale/sr/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Nalog je suspendovan", "MESSAGE": "Vaš nalog je suspendovan. Molim vas kontaktirajte tim za podršku za dodatne informacije." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Prijemni sandučići", + "CAPTAIN_SETTINGS": "Podešavanja", "HOME": "Početak", "AGENTS": "Agenti", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/sv/integrations.json b/app/javascript/dashboard/i18n/locale/sv/integrations.json index 74f4c7a4d..eb206fa68 100644 --- a/app/javascript/dashboard/i18n/locale/sv/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sv/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Inställningar", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sv/report.json b/app/javascript/dashboard/i18n/locale/sv/report.json index 6768aaa8b..3f0b24c94 100644 --- a/app/javascript/dashboard/i18n/locale/sv/report.json +++ b/app/javascript/dashboard/i18n/locale/sv/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "De senaste 7 dagarna", "LAST_14_DAYS": "De senaste 14 dagarna", "LAST_30_DAYS": "De senaste 30 dagarna", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/sv/settings.json b/app/javascript/dashboard/i18n/locale/sv/settings.json index f545647b2..da9d452da 100644 --- a/app/javascript/dashboard/i18n/locale/sv/settings.json +++ b/app/javascript/dashboard/i18n/locale/sv/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inkorgar", + "CAPTAIN_SETTINGS": "Inställningar", "HOME": "Hem", "AGENTS": "Agenter", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/ta/integrations.json b/app/javascript/dashboard/i18n/locale/ta/integrations.json index 0ababba9d..b71f3824e 100644 --- a/app/javascript/dashboard/i18n/locale/ta/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ta/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "வெப்ஹூக் URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "அமைப்புகள்", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ta/report.json b/app/javascript/dashboard/i18n/locale/ta/report.json index 68b0af4fc..2a8f390fe 100644 --- a/app/javascript/dashboard/i18n/locale/ta/report.json +++ b/app/javascript/dashboard/i18n/locale/ta/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "கடந்த 7 நாட்கள்", "LAST_14_DAYS": "கடந்த 14 நாட்கள்", "LAST_30_DAYS": "கடந்த 30 நாட்கள்", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/ta/settings.json b/app/javascript/dashboard/i18n/locale/ta/settings.json index 8881d2028..3d25fc4d0 100644 --- a/app/javascript/dashboard/i18n/locale/ta/settings.json +++ b/app/javascript/dashboard/i18n/locale/ta/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "இன்பாக்ஸ்கள்", + "CAPTAIN_SETTINGS": "அமைப்புகள்", "HOME": "முகப்பு", "AGENTS": "ஏஜென்ட்கள்", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/th/integrations.json b/app/javascript/dashboard/i18n/locale/th/integrations.json index 2fc7f5b40..7c30cbb08 100644 --- a/app/javascript/dashboard/i18n/locale/th/integrations.json +++ b/app/javascript/dashboard/i18n/locale/th/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "ลิ้ง Webhook", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "ตั้งค่า", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/th/report.json b/app/javascript/dashboard/i18n/locale/th/report.json index beb3b7a33..2a042a17c 100644 --- a/app/javascript/dashboard/i18n/locale/th/report.json +++ b/app/javascript/dashboard/i18n/locale/th/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "7 วันที่ผ่านมา", "LAST_14_DAYS": "14 วันที่ผ่านมา", "LAST_30_DAYS": "30 วันที่ผ่านมา", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "3 เดือนที่ผ่านมา", "LAST_6_MONTHS": "6 เดือนที่ผ่านมา", "LAST_YEAR": "ปีที่ผ่านมา", diff --git a/app/javascript/dashboard/i18n/locale/th/settings.json b/app/javascript/dashboard/i18n/locale/th/settings.json index 065d9fcb2..ede5c3cdf 100644 --- a/app/javascript/dashboard/i18n/locale/th/settings.json +++ b/app/javascript/dashboard/i18n/locale/th/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "กล่องข้อความ", + "CAPTAIN_SETTINGS": "ตั้งค่า", "HOME": "หน้าหลัก", "AGENTS": "พนักงาน", "AGENT_BOTS": "บอท", diff --git a/app/javascript/dashboard/i18n/locale/tl/integrations.json b/app/javascript/dashboard/i18n/locale/tl/integrations.json index ccc46ee1d..9500e2fbc 100644 --- a/app/javascript/dashboard/i18n/locale/tl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/tl/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/tl/report.json b/app/javascript/dashboard/i18n/locale/tl/report.json index c622170b0..dbf59f603 100644 --- a/app/javascript/dashboard/i18n/locale/tl/report.json +++ b/app/javascript/dashboard/i18n/locale/tl/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/tl/settings.json b/app/javascript/dashboard/i18n/locale/tl/settings.json index 812b0cd8b..50cf38b58 100644 --- a/app/javascript/dashboard/i18n/locale/tl/settings.json +++ b/app/javascript/dashboard/i18n/locale/tl/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/tr/conversation.json b/app/javascript/dashboard/i18n/locale/tr/conversation.json index d793d6675..570bf19ac 100644 --- a/app/javascript/dashboard/i18n/locale/tr/conversation.json +++ b/app/javascript/dashboard/i18n/locale/tr/conversation.json @@ -229,9 +229,9 @@ } }, "QUOTED_REPLY": { - "ENABLE_TOOLTIP": "Include quoted email thread", - "DISABLE_TOOLTIP": "Don't include quoted email thread", - "REMOVE_PREVIEW": "Remove quoted email thread", + "ENABLE_TOOLTIP": "Alıntılanan e-posta zincirini dahil et", + "DISABLE_TOOLTIP": "Alıntılanan e-posta zincirini dahil etme", + "REMOVE_PREVIEW": "Alıntılanan e-posta zincirini kaldır", "COLLAPSE": "Önizlemeyi daralt", "EXPAND": "Önizlemeyi genişlet" } diff --git a/app/javascript/dashboard/i18n/locale/tr/inbox.json b/app/javascript/dashboard/i18n/locale/tr/inbox.json index 69d93cc31..3602e0eaf 100644 --- a/app/javascript/dashboard/i18n/locale/tr/inbox.json +++ b/app/javascript/dashboard/i18n/locale/tr/inbox.json @@ -82,13 +82,13 @@ "ERROR": "WhatsApp'a yeniden bağlanılamadı. Lütfen tekrar deneyin.", "WHATSAPP_APP_ID_MISSING": "WhatsApp Uygulama Kimliği yapılandırılmamış. Lütfen yöneticinize başvurun.", "WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Yapılandırma Kimliği yapılandırılmamış. Lütfen yöneticinize başvurun.", - "CONFIGURATION_ERROR": "Configuration error occurred during reauthorization.", - "FACEBOOK_LOAD_ERROR": "Failed to load Facebook SDK. Please try again.", + "CONFIGURATION_ERROR": "Yeniden yetkilendirme sırasında yapılandırma hatası oluştu.", + "FACEBOOK_LOAD_ERROR": "Facebook SDK yüklenemedi. Lütfen tekrar deneyin.", "TROUBLESHOOTING": { - "TITLE": "Troubleshooting", - "POPUP_BLOCKED": "Ensure pop-ups are allowed for this site", - "COOKIES": "Third-party cookies must be enabled", - "ADMIN_ACCESS": "You need admin access to the WhatsApp Business Account" + "TITLE": "Sorun Giderme", + "POPUP_BLOCKED": "Bu site için açılır pencerelere izin verildiğinden emin olun", + "COOKIES": "Üçüncü taraf çerezlerin etkinleştirilmesi gerekir", + "ADMIN_ACCESS": "WhatsApp Business Hesabına yönetici erişiminizin olması gerekir" } } } diff --git a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json index 7beb86c96..9af6714e7 100644 --- a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json +++ b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json @@ -5,8 +5,8 @@ "LEARN_MORE": "Learn more about inboxes", "RECONNECTION_REQUIRED": "Your inbox is disconnected. You won't receive new messages until you reauthorize it.", "CLICK_TO_RECONNECT": "Click here to reconnect.", - "WHATSAPP_REGISTRATION_INCOMPLETE": "Your WhatsApp Business registration isn’t complete. Please check your display name status in Meta Business Manager before reconnecting.", - "COMPLETE_REGISTRATION": "Complete Registration", + "WHATSAPP_REGISTRATION_INCOMPLETE": "WhatsApp Business kaydınız tamamlanmadı. Yeniden bağlanmadan önce lütfen Meta Business Manager'da görünen adınızın (display name) durumunu kontrol edin.", + "COMPLETE_REGISTRATION": "Kaydı Tamamla", "LIST": { "404": "Bu hesaba bağlı gelen kutusu yok." }, @@ -337,9 +337,9 @@ }, "CONFIGURATION": { "TWILIO_VOICE_URL_TITLE": "Twilio Ses URL", - "TWILIO_VOICE_URL_SUBTITLE": "Configure this URL as the Voice URL on your Twilio phone number and TwiML App.", - "TWILIO_STATUS_URL_TITLE": "Twilio Status Callback URL", - "TWILIO_STATUS_URL_SUBTITLE": "Configure this URL as the Status Callback URL on your Twilio phone number." + "TWILIO_VOICE_URL_SUBTITLE": "Bu URL'yi Twilio telefon numaranızda ve TwiML Uygulamanızda Sesli Görüşme URL'si (Voice URL) olarak yapılandırın.", + "TWILIO_STATUS_URL_TITLE": "Twilio Durum Geri Çağırma URL'si (Status Callback URL)", + "TWILIO_STATUS_URL_SUBTITLE": "Bu URL'yi Twilio telefon numaranızda Durum Geri Çağırma URL'si (Status Callback URL) olarak yapılandırın." }, "SUBMIT_BUTTON": "Ses Kanalı Oluştur", "API": { @@ -441,7 +441,7 @@ }, "WHATSAPP": { "TITLE": "WhatsApp", - "DESCRIPTION": "Support your customers on WhatsApp" + "DESCRIPTION": "Müşterilerinize WhatsApp üzerinden destek sağlayın" }, "EMAIL": { "TITLE": "E-Posta", @@ -638,25 +638,25 @@ }, "ACCOUNT_MODE": { "LABEL": "Hesap modu", - "TOOLTIP": "Current operating mode of your WhatsApp account" + "TOOLTIP": "WhatsApp hesabınızın mevcut çalışma modu" } }, "VALUES": { "TIERS": { - "TIER_250": "250 customers per 24h", - "TIER_1000": "1K customers per 24h", - "TIER_1K": "1K customers per 24h", - "TIER_10K": "10K customers per 24h", - "TIER_100K": "100K customers per 24h", - "TIER_UNLIMITED": "Unlimited customers per 24h", + "TIER_250": "24 saatte 250 müşteri", + "TIER_1000": "24 saatte 1000 müşteri", + "TIER_1K": "24 saatte 1000 müşteri", + "TIER_10K": "24 saatte 10000 müşteri", + "TIER_100K": "24 saatte 100000 müşteri", + "TIER_UNLIMITED": "24 saatte sınırsız müşteri", "UNKNOWN": "Değerlendirme mevcut değil" }, "STATUSES": { "APPROVED": "Approved", "PENDING_REVIEW": "İnceleme Bekliyor", - "AVAILABLE_WITHOUT_REVIEW": "Available Without Review", + "AVAILABLE_WITHOUT_REVIEW": "İnceleme Olmadan Kullanılabilir", "REJECTED": "Reddedildi", - "DECLINED": "Declined", + "DECLINED": "Reddedildi", "NON_EXISTS": "Mevcut değil" }, "MODES": { @@ -678,8 +678,8 @@ "MESSENGER_SUB_HEAD": "Bu düğmeyi gövde etiketinizin içine yerleştirin", "ALLOWED_DOMAINS": { "TITLE": "İzin Verilen Alan Adları", - "SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.", - "PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)" + "SUBTITLE": "Virgülle ayrılmış joker karakterli veya normal alan adları ekleyin (hepsine izin vermek için boş bırakın), örneğin *.chatwoot.dev, chatwoot.com.", + "PLACEHOLDER": "Virgülle ayrılmış alan adlarını girin (ör: *.chatwoot.dev, chatwoot.com)" }, "INBOX_AGENTS": "Kullanıcılar", "INBOX_AGENTS_SUB_TEXT": "Bu gelen kutusuna aracı ekleyin veya aracıları kaldırın", @@ -716,26 +716,26 @@ "WHATSAPP_SECTION_UPDATE_PLACEHOLDER": "Yeni API Anahtarını buraya girin", "WHATSAPP_SECTION_UPDATE_BUTTON": "Güncelleme", "WHATSAPP_EMBEDDED_SIGNUP_TITLE": "WhatsApp Embedded Signup", - "WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "This inbox is connected through WhatsApp embedded signup.", - "WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "You can reconfigure this inbox to update your WhatsApp Business settings.", + "WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "Bu gelen kutusu, WhatsApp embedded signup yoluyla bağlandı.", + "WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "WhatsApp Business ayarlarınızı güncellemek için bu gelen kutusunu yeniden yapılandırabilirsiniz.", "WHATSAPP_RECONFIGURE_BUTTON": "Yeniden yapılandır", - "WHATSAPP_CONNECT_TITLE": "Connect to WhatsApp Business", - "WHATSAPP_CONNECT_SUBHEADER": "Upgrade to WhatsApp embedded signup for easier management.", - "WHATSAPP_CONNECT_DESCRIPTION": "Connect this inbox to WhatsApp Business for enhanced features and easier management.", + "WHATSAPP_CONNECT_TITLE": "WhatsApp Business'a Bağlan", + "WHATSAPP_CONNECT_SUBHEADER": "Daha kolay yönetim için WhatsApp gömülü kayda (embedded signup) yükseltin.", + "WHATSAPP_CONNECT_DESCRIPTION": "Gelişmiş özellikler ve daha kolay yönetim için bu gelen kutusunu WhatsApp Business'a bağlayın.", "WHATSAPP_CONNECT_BUTTON": "Bağlan", - "WHATSAPP_CONNECT_SUCCESS": "Successfully connected to WhatsApp Business!", - "WHATSAPP_CONNECT_ERROR": "Failed to connect to WhatsApp Business. Please try again.", - "WHATSAPP_RECONFIGURE_SUCCESS": "Successfully reconfigured WhatsApp Business!", - "WHATSAPP_RECONFIGURE_ERROR": "Failed to reconfigure WhatsApp Business. Please try again.", + "WHATSAPP_CONNECT_SUCCESS": "WhatsApp Business'a başarıyla bağlandı!", + "WHATSAPP_CONNECT_ERROR": "WhatsApp Business'a bağlanılamadı. Lütfen tekrar deneyin.", + "WHATSAPP_RECONFIGURE_SUCCESS": "WhatsApp Business başarıyla yeniden yapılandırıldı!", + "WHATSAPP_RECONFIGURE_ERROR": "WhatsApp Business yeniden yapılandırılamadı. Lütfen tekrar deneyin.", "WHATSAPP_APP_ID_MISSING": "WhatsApp Uygulama Kimliği yapılandırılmamış. Lütfen yöneticinize başvurun.", "WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Yapılandırma Kimliği yapılandırılmamış. Lütfen yöneticinize başvurun.", - "WHATSAPP_LOGIN_CANCELLED": "WhatsApp login was cancelled. Please try again.", + "WHATSAPP_LOGIN_CANCELLED": "WhatsApp oturum açma işlemi iptal edildi. Lütfen tekrar deneyin.", "WHATSAPP_WEBHOOK_TITLE": "Webhook Onay Anahtarı", "WHATSAPP_WEBHOOK_SUBHEADER": "Bu belirteç, webhook uç noktasının gerçekliğini doğrulamak için kullanılır.", "WHATSAPP_TEMPLATES_SYNC_TITLE": "Şablonları Senkronize Et", "WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "WhatsApp'tan mesaj şablonlarını manuel olarak senkronize ederek mevcut şablonlarınızı güncelleyin.", "WHATSAPP_TEMPLATES_SYNC_BUTTON": "Şablonları Senkronize Et", - "WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Templates sync initiated successfully. It may take a couple of minutes to update.", + "WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Şablon senkronizasyonu başarıyla başlatıldı. Güncellenmesi birkaç dakika sürebilir.", "UPDATE_PRE_CHAT_FORM_SETTINGS": "Sohbet Öncesi Form Ayarlarını Güncelleme" }, "HELP_CENTER": { @@ -981,15 +981,15 @@ "EMAIL_PROVIDERS": { "MICROSOFT": { "TITLE": "Microsoft", - "DESCRIPTION": "Connect with Microsoft" + "DESCRIPTION": "Microsoft ile giriş yap" }, "GOOGLE": { "TITLE": "Google", - "DESCRIPTION": "Connect with Google" + "DESCRIPTION": "Google ile giriş yap" }, "OTHER_PROVIDERS": { "TITLE": "Diğer Sağlayıcılar", - "DESCRIPTION": "Connect with Other Providers" + "DESCRIPTION": "Diğer Sağlayıcılar ile giriş yap" } }, "CHANNELS": { diff --git a/app/javascript/dashboard/i18n/locale/tr/integrations.json b/app/javascript/dashboard/i18n/locale/tr/integrations.json index 56d9582f3..1e4118d0f 100644 --- a/app/javascript/dashboard/i18n/locale/tr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/tr/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Konuşmada Yazıyor Kapalı" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Web kancası URL'si", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Asistan bulunamadı. Lütfen tekrar deneyin." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Ayarlar", "BASIC_SETTINGS": { "TITLE": "Temel ayarlar", "DESCRIPTION": "Konuşmayı sonlandırırken veya bir operatöre aktarırken asistanın söyleyeceği sözleri özelleştirin." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,11 +537,8 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { - "SELECTED": "{count} item selected | {count} items selected", + "SELECTED": "{count} eşya seçildi | {count} eşya seçildi", "SELECT_ALL": "Tümünü seç ({count})", "UNSELECT_ALL": "Tümünü kaldır ({count})", "BULK_DELETE_BUTTON": "Sil" @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} eşya seçildi | {count} eşya seçildi", "SELECT_ALL": "Tümünü seç ({count})", @@ -625,11 +627,8 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { - "SELECTED": "{count} item selected | {count} items selected", + "SELECTED": "{count} eşya seçildi | {count} eşya seçildi", "SELECT_ALL": "Tümünü seç ({count})", "UNSELECT_ALL": "Tümünü kaldır ({count})", "BULK_DELETE_BUTTON": "Sil" @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Belge Adı (İsteğe Bağlı)", "PLACEHOLDER": "Belgeye bir ad girin" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/tr/login.json b/app/javascript/dashboard/i18n/locale/tr/login.json index 8460a575b..6b4b4a693 100644 --- a/app/javascript/dashboard/i18n/locale/tr/login.json +++ b/app/javascript/dashboard/i18n/locale/tr/login.json @@ -24,17 +24,17 @@ "CREATE_NEW_ACCOUNT": "Yeni hesap oluştur", "SUBMIT": "Oturum aç", "SAML": { - "LABEL": "Login via SSO", - "TITLE": "Initiate Single Sign-on (SSO)", - "SUBTITLE": "Enter your work email to access your organization", + "LABEL": "SSO ile giriş yapın", + "TITLE": "Tek Oturum Açma (SSO)", + "SUBTITLE": "Kuruluşunuza erişmek için iş e-posta adresinizi girin", "BACK_TO_LOGIN": "Şifre ile giriş yap", "WORK_EMAIL": { - "LABEL": "Work Email", - "PLACEHOLDER": "Enter your work email" + "LABEL": "İş E-Postası", + "PLACEHOLDER": "İş e-posta adresinizi girin" }, - "SUBMIT": "Continue with SSO", + "SUBMIT": "SSO ile devam et", "API": { - "ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again." + "ERROR_MESSAGE": "SSO (Tek Oturum Açma) kimlik doğrulaması başarısız oldu. Lütfen kimlik bilgilerinizi kontrol edin ve tekrar deneyin." } } } diff --git a/app/javascript/dashboard/i18n/locale/tr/report.json b/app/javascript/dashboard/i18n/locale/tr/report.json index 9d0d74741..ae3d54d3f 100644 --- a/app/javascript/dashboard/i18n/locale/tr/report.json +++ b/app/javascript/dashboard/i18n/locale/tr/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Son 7 gün", "LAST_14_DAYS": "Son 14 gün", "LAST_30_DAYS": "Son 30 gün", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Son 3 ay", "LAST_6_MONTHS": "Son 6 ay", "LAST_YEAR": "Geçen yıl", diff --git a/app/javascript/dashboard/i18n/locale/tr/settings.json b/app/javascript/dashboard/i18n/locale/tr/settings.json index 120acd2f4..88bc7346f 100644 --- a/app/javascript/dashboard/i18n/locale/tr/settings.json +++ b/app/javascript/dashboard/i18n/locale/tr/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Hesap Askıya Alındı", "MESSAGE": "Hesabınız askıya alındı. Daha fazla bilgi için lütfen destek ekibine ulaşın." + }, + "NO_ACCOUNTS": { + "TITLE": "Hesap bulunamadı", + "MESSAGE_CLOUD": "Şu anda herhangi bir hesabın parçası değilsiniz. Bunun bir hata olduğunu düşünüyorsanız, lütfen destek ekibimizle iletişime geçin.", + "MESSAGE_SELF_HOSTED": "Şu anda herhangi bir hesabın parçası değilsiniz. Lütfen yöneticinizle iletişime geçin.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Araçlar", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Oyun Alanı", + "CAPTAIN_INBOXES": "Gelen kutuları", + "CAPTAIN_SETTINGS": "Ayarlar", "HOME": "Anasayfa", "AGENTS": "Kullanıcılar", "AGENT_BOTS": "Botlar", @@ -419,8 +429,8 @@ "PLACEHOLDER": "-----BEGIN CERTIFICATE-----\nMIIC..." }, "FINGERPRINT": { - "LABEL": "Fingerprint", - "TOOLTIP": "SHA-1 fingerprint of the certificate - Use this to verify the certificate in your IdP configuration" + "LABEL": "Parmak izi", + "TOOLTIP": "Sertifikanın SHA-1 parmak izi – Bunu, Kimlik Sağlayıcısı (IdP) yapılandırmanızda sertifikayı doğrulamak için kullanın" }, "COPY_SUCCESS": "Kod başarıyla panoya kopyalandı", "SP_ENTITY_ID": { diff --git a/app/javascript/dashboard/i18n/locale/tr/signup.json b/app/javascript/dashboard/i18n/locale/tr/signup.json index c804e8968..9900d3ba6 100644 --- a/app/javascript/dashboard/i18n/locale/tr/signup.json +++ b/app/javascript/dashboard/i18n/locale/tr/signup.json @@ -28,11 +28,11 @@ "PLACEHOLDER": "Parola", "ERROR": "Parola çok kısa.", "IS_INVALID_PASSWORD": "Şifre en az 1 büyük harf, 1 küçük harf, 1 rakam ve 1 özel karakter içermelidir.", - "REQUIREMENTS_LENGTH": "At least 6 characters long", - "REQUIREMENTS_UPPERCASE": "At least one uppercase letter", - "REQUIREMENTS_LOWERCASE": "At least one lowercase letter", - "REQUIREMENTS_NUMBER": "At least one number", - "REQUIREMENTS_SPECIAL": "At least one special character" + "REQUIREMENTS_LENGTH": "En az 6 karakter uzunluğunda olmalı", + "REQUIREMENTS_UPPERCASE": "En az bir büyük harf içermeli", + "REQUIREMENTS_LOWERCASE": "En az bir küçük harf içermeli", + "REQUIREMENTS_NUMBER": "En az bir rakam içermeli", + "REQUIREMENTS_SPECIAL": "En az bir özel karakter içermeli" }, "CONFIRM_PASSWORD": { "LABEL": "Parolayı onayla", @@ -40,7 +40,7 @@ "ERROR": "Parola eşleşmiyor." }, "API": { - "SUCCESS_MESSAGE": "Registration Successful", + "SUCCESS_MESSAGE": "Başarıyla Kayıt Olundu", "ERROR_MESSAGE": "Woot sunucusuna bağlanılamadı. Lütfen tekrar deneyin." }, "SUBMIT": "Hesap oluştur", diff --git a/app/javascript/dashboard/i18n/locale/uk/integrations.json b/app/javascript/dashboard/i18n/locale/uk/integrations.json index 5ebd0081c..de5e8258b 100644 --- a/app/javascript/dashboard/i18n/locale/uk/integrations.json +++ b/app/javascript/dashboard/i18n/locale/uk/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "URL вебхука", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Налаштування", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/uk/report.json b/app/javascript/dashboard/i18n/locale/uk/report.json index bf40caef6..6af3bdc23 100644 --- a/app/javascript/dashboard/i18n/locale/uk/report.json +++ b/app/javascript/dashboard/i18n/locale/uk/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Останні 7 днів", "LAST_14_DAYS": "Останні 14 днів", "LAST_30_DAYS": "Останні 30 днів", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Останні 3 місяці", "LAST_6_MONTHS": "Останні 6 місяців", "LAST_YEAR": "Минулий рік", diff --git a/app/javascript/dashboard/i18n/locale/uk/settings.json b/app/javascript/dashboard/i18n/locale/uk/settings.json index 6d480d63b..2fcc4fd2f 100644 --- a/app/javascript/dashboard/i18n/locale/uk/settings.json +++ b/app/javascript/dashboard/i18n/locale/uk/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Обліковий запис призупинено", "MESSAGE": "Ваш обліковий запис призупинено. Будь ласка, зверніться до служби підтримки для отримання додаткової інформації." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Вхідні", + "CAPTAIN_SETTINGS": "Налаштування", "HOME": "Головна", "AGENTS": "Агенти", "AGENT_BOTS": "Боти", diff --git a/app/javascript/dashboard/i18n/locale/ur/integrations.json b/app/javascript/dashboard/i18n/locale/ur/integrations.json index 80b245b7b..b534e6194 100644 --- a/app/javascript/dashboard/i18n/locale/ur/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ur/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ur/report.json b/app/javascript/dashboard/i18n/locale/ur/report.json index 6c25d30c7..a4c1fb9b3 100644 --- a/app/javascript/dashboard/i18n/locale/ur/report.json +++ b/app/javascript/dashboard/i18n/locale/ur/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/ur/settings.json b/app/javascript/dashboard/i18n/locale/ur/settings.json index dda7ab163..8b15e3009 100644 --- a/app/javascript/dashboard/i18n/locale/ur/settings.json +++ b/app/javascript/dashboard/i18n/locale/ur/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "ایجنٹ", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json index c5b554ee7..0566abd9a 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Settings", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/report.json b/app/javascript/dashboard/i18n/locale/ur_IN/report.json index 22e285c19..a2ad6bd4a 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/report.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "Last 7 days", "LAST_14_DAYS": "Last 14 days", "LAST_30_DAYS": "Last 30 days", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "Last 3 months", "LAST_6_MONTHS": "Last 6 months", "LAST_YEAR": "Last year", diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/settings.json b/app/javascript/dashboard/i18n/locale/ur_IN/settings.json index 256f77c04..aec3e852d 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/settings.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Inboxes", + "CAPTAIN_SETTINGS": "Settings", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/vi/integrations.json b/app/javascript/dashboard/i18n/locale/vi/integrations.json index 42ff68fda..bcfd10f38 100644 --- a/app/javascript/dashboard/i18n/locale/vi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/vi/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook URL", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "Cài đặt", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/vi/report.json b/app/javascript/dashboard/i18n/locale/vi/report.json index 6713bb3a9..69b10453e 100644 --- a/app/javascript/dashboard/i18n/locale/vi/report.json +++ b/app/javascript/dashboard/i18n/locale/vi/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "7 ngày cuối", "LAST_14_DAYS": "14 ngày cuối", "LAST_30_DAYS": "30 ngày cuối", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "3 tháng vừa qua", "LAST_6_MONTHS": "6 tháng vừa qua", "LAST_YEAR": "Năm ngoái", diff --git a/app/javascript/dashboard/i18n/locale/vi/settings.json b/app/javascript/dashboard/i18n/locale/vi/settings.json index 1f5c43834..5d52a58c5 100644 --- a/app/javascript/dashboard/i18n/locale/vi/settings.json +++ b/app/javascript/dashboard/i18n/locale/vi/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Tài khoản bị ngưng", "MESSAGE": "Tài khoản của bạn bị tạm ngưng. Vui lòng liên hệ với nhóm hỗ trợ để biết thêm thông tin." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "Log out" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "Hộp thư đến", + "CAPTAIN_SETTINGS": "Cài đặt", "HOME": "Trang Chủ", "AGENTS": "Đại lý", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json index ee01615e4..a37ac43a5 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "对话输入关闭" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook 网址", "PLACEHOLDER": "例如:{webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "了解更多", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "助手", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "尝试这些提示信息", @@ -483,9 +492,7 @@ "NOT_FOUND": "无法找到助手。请重试。" }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "助手" - }, + "HEADER": "设置", "BASIC_SETTINGS": { "TITLE": "基本设置", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "删除助手", + "DESCRIPTION": "此操作是永久性的。删除此文档将永久删除所有生成的知识。", + "BUTTON_TEXT": "删除 {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "全选 ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "全选 ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "全选 ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "文档名称(可选)", "PLACEHOLDER": "输入文档的名称" - }, - "ASSISTANT": { - "LABEL": "助手", - "PLACEHOLDER": "选择助手", - "ERROR": "助手字段是必需的" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "答案", "PLACEHOLDER": "在此输入答案", "ERROR": "请提供有效的答案" - }, - "ASSISTANT": { - "LABEL": "助手", - "PLACEHOLDER": "选择助手", - "ERROR": "请选择助手" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/report.json b/app/javascript/dashboard/i18n/locale/zh_CN/report.json index b6b89b17e..57c9ef3af 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "最近7天", "LAST_14_DAYS": "最近14天", "LAST_30_DAYS": "最近30天", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "最近3个月", "LAST_6_MONTHS": "最近6个月", "LAST_YEAR": "最近一年", diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json index 478816f53..1a60e9538 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "账户已暂停", "MESSAGE": "您的账户已被暂停。请联系支持团队以获取更多信息。" + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "注销" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "文档", "CAPTAIN_RESPONSES": "常见问题", "CAPTAIN_TOOLS": "工具", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "试验场", + "CAPTAIN_INBOXES": "收件箱", + "CAPTAIN_SETTINGS": "设置", "HOME": "首页", "AGENTS": "客服代理", "AGENT_BOTS": "机器人", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json index e3acd0073..2016bb406 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json @@ -46,6 +46,10 @@ "CONVERSATION_TYPING_OFF": "Conversation Typing Off" } }, + "NAME": { + "LABEL": "Webhook Name", + "PLACEHOLDER": "Enter the name of the webhook" + }, "END_POINT": { "LABEL": "Webhook 網址", "PLACEHOLDER": "Example: {webhookExampleURL}", @@ -344,6 +348,11 @@ "CAPTAIN": { "NAME": "Captain", "HEADER_KNOW_MORE": "Know more", + "ASSISTANT_SWITCHER": { + "ASSISTANTS": "Assistants", + "SWITCH_ASSISTANT": "Switch between assistants", + "NEW_ASSISTANT": "Create Assistant" + }, "COPILOT": { "TITLE": "Copilot", "TRY_THESE_PROMPTS": "Try these prompts", @@ -483,9 +492,7 @@ "NOT_FOUND": "Could not find the assistant. Please try again." }, "SETTINGS": { - "BREADCRUMB": { - "ASSISTANT": "Assistant" - }, + "HEADER": "設定", "BASIC_SETTINGS": { "TITLE": "Basic settings", "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." @@ -502,15 +509,16 @@ "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." }, - "SCENARIOS": { - "TITLE": "Scenarios", - "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" - }, "RESPONSE_GUIDELINES": { "TITLE": "Response guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" } } + }, + "DELETE": { + "TITLE": "Delete Assistant", + "DESCRIPTION": "This action is permanent. Deleting this assistant will remove it from all connected inboxes and permanently erase all generated knowledge.", + "BUTTON_TEXT": "Delete {assistantName}" } }, "OPTIONS": { @@ -529,9 +537,6 @@ "GUARDRAILS": { "TITLE": "Guardrails", "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic.", - "BREADCRUMB": { - "TITLE": "Guardrails" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -577,9 +582,6 @@ "RESPONSE_GUIDELINES": { "TITLE": "Response Guidelines", "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?", - "BREADCRUMB": { - "TITLE": "Response Guidelines" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -625,9 +627,6 @@ "SCENARIOS": { "TITLE": "Scenarios", "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”", - "BREADCRUMB": { - "TITLE": "Scenarios" - }, "BULK_ACTION": { "SELECTED": "{count} item selected | {count} items selected", "SELECT_ALL": "Select all ({count})", @@ -725,11 +724,6 @@ "NAME": { "LABEL": "Document Name (Optional)", "PLACEHOLDER": "Enter a name for the document" - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select the assistant", - "ERROR": "The assistant field is required" } }, "DELETE": { @@ -923,11 +917,6 @@ "LABEL": "Answer", "PLACEHOLDER": "Enter the answer here", "ERROR": "Please provide a valid answer." - }, - "ASSISTANT": { - "LABEL": "Assistant", - "PLACEHOLDER": "Select an assistant", - "ERROR": "Please select an assistant." } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/report.json b/app/javascript/dashboard/i18n/locale/zh_TW/report.json index 76a86db03..3f36b9ef5 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/report.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/report.json @@ -53,6 +53,8 @@ "LAST_7_DAYS": "最近7天", "LAST_14_DAYS": "最近14天", "LAST_30_DAYS": "最近30天", + "THIS_MONTH": "This month", + "LAST_MONTH": "Last month", "LAST_3_MONTHS": "三個月內", "LAST_6_MONTHS": "六個月內", "LAST_YEAR": "去年", diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json index 814517a19..1ba1d30ff 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json @@ -251,6 +251,12 @@ "ACCOUNT_SUSPENDED": { "TITLE": "Account Suspended", "MESSAGE": "Your account is suspended. Please reach out to the support team for more information." + }, + "NO_ACCOUNTS": { + "TITLE": "No account found", + "MESSAGE_CLOUD": "You are not part of any accounts right now. If you think this is a mistake, please reach out to our support team.", + "MESSAGE_SELF_HOSTED": "You are not part of any accounts right now. Please reach out to your administrator.", + "LOGOUT": "退出登入" } }, "COMPONENTS": { @@ -305,6 +311,10 @@ "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", "CAPTAIN_TOOLS": "Tools", + "CAPTAIN_SCENARIOS": "Scenarios", + "CAPTAIN_PLAYGROUND": "Playground", + "CAPTAIN_INBOXES": "收件匣", + "CAPTAIN_SETTINGS": "設定", "HOME": "首頁", "AGENTS": "客服", "AGENT_BOTS": "機器人", diff --git a/app/jobs/auto_assignment/assignment_job.rb b/app/jobs/auto_assignment/assignment_job.rb new file mode 100644 index 000000000..9c6760ecc --- /dev/null +++ b/app/jobs/auto_assignment/assignment_job.rb @@ -0,0 +1,22 @@ +class AutoAssignment::AssignmentJob < ApplicationJob + queue_as :default + + def perform(inbox_id:) + inbox = Inbox.find_by(id: inbox_id) + return unless inbox + + service = AutoAssignment::AssignmentService.new(inbox: inbox) + + assigned_count = service.perform_bulk_assignment(limit: bulk_assignment_limit) + Rails.logger.info "Assigned #{assigned_count} conversations for inbox #{inbox.id}" + rescue StandardError => e + Rails.logger.error "Bulk assignment failed for inbox #{inbox_id}: #{e.message}" + raise e if Rails.env.test? + end + + private + + def bulk_assignment_limit + ENV.fetch('AUTO_ASSIGNMENT_BULK_LIMIT', 100).to_i + end +end diff --git a/app/jobs/auto_assignment/periodic_assignment_job.rb b/app/jobs/auto_assignment/periodic_assignment_job.rb new file mode 100644 index 000000000..63500507e --- /dev/null +++ b/app/jobs/auto_assignment/periodic_assignment_job.rb @@ -0,0 +1,19 @@ +class AutoAssignment::PeriodicAssignmentJob < ApplicationJob + queue_as :scheduled_jobs + + def perform + Account.find_in_batches do |accounts| + accounts.each do |account| + next unless account.feature_enabled?('assignment_v2') + + account.inboxes.joins(:assignment_policy).find_in_batches do |inboxes| + inboxes.each do |inbox| + next unless inbox.auto_assignment_v2_enabled? + + AutoAssignment::AssignmentJob.perform_later(inbox_id: inbox.id) + end + end + end + end + end +end diff --git a/app/models/concerns/auto_assignment_handler.rb b/app/models/concerns/auto_assignment_handler.rb index de5fdae7d..a1198200a 100644 --- a/app/models/concerns/auto_assignment_handler.rb +++ b/app/models/concerns/auto_assignment_handler.rb @@ -14,7 +14,13 @@ module AutoAssignmentHandler return unless conversation_status_changed_to_open? return unless should_run_auto_assignment? - ::AutoAssignment::AgentAssignmentService.new(conversation: self, allowed_agent_ids: inbox.member_ids_with_assignment_capacity).perform + if inbox.auto_assignment_v2_enabled? + # Use new assignment system + AutoAssignment::AssignmentJob.perform_later(inbox_id: inbox.id) + else + # Use legacy assignment system + AutoAssignment::AgentAssignmentService.new(conversation: self, allowed_agent_ids: inbox.member_ids_with_assignment_capacity).perform + end end def should_run_auto_assignment? diff --git a/app/models/concerns/inbox_agent_availability.rb b/app/models/concerns/inbox_agent_availability.rb new file mode 100644 index 000000000..289da7db9 --- /dev/null +++ b/app/models/concerns/inbox_agent_availability.rb @@ -0,0 +1,28 @@ +module InboxAgentAvailability + extend ActiveSupport::Concern + + def available_agents + online_agent_ids = fetch_online_agent_ids + return inbox_members.none if online_agent_ids.empty? + + inbox_members + .joins(:user) + .where(users: { id: online_agent_ids }) + .includes(:user) + end + + def member_ids_with_assignment_capacity + member_ids + end + + private + + def fetch_online_agent_ids + OnlineStatusTracker.get_available_users(account_id) + .select { |_key, value| value.eql?('online') } + .keys + .map(&:to_i) + end +end + +InboxAgentAvailability.prepend_mod_with('InboxAgentAvailability') diff --git a/app/models/inbox.rb b/app/models/inbox.rb index b0f13d222..894c57bcc 100644 --- a/app/models/inbox.rb +++ b/app/models/inbox.rb @@ -44,6 +44,7 @@ class Inbox < ApplicationRecord include Avatarable include OutOfOffisable include AccountCacheRevalidator + include InboxAgentAvailability # Not allowing characters: validates :name, presence: true @@ -190,6 +191,10 @@ class Inbox < ApplicationRecord members.ids end + def auto_assignment_v2_enabled? + account.feature_enabled?('assignment_v2') + end + private def default_name_for_blank_name diff --git a/app/services/auto_assignment/assignment_service.rb b/app/services/auto_assignment/assignment_service.rb new file mode 100644 index 000000000..59e7b5a7b --- /dev/null +++ b/app/services/auto_assignment/assignment_service.rb @@ -0,0 +1,90 @@ +class AutoAssignment::AssignmentService + pattr_initialize [:inbox!] + + def perform_bulk_assignment(limit: 100) + return 0 unless inbox.auto_assignment_v2_enabled? + + assigned_count = 0 + + unassigned_conversations(limit).each do |conversation| + assigned_count += 1 if perform_for_conversation(conversation) + end + + assigned_count + end + + private + + def perform_for_conversation(conversation) + return false unless assignable?(conversation) + + agent = find_available_agent + return false unless agent + + assign_conversation(conversation, agent) + end + + def assignable?(conversation) + conversation.status == 'open' && + conversation.assignee_id.nil? + end + + def unassigned_conversations(limit) + scope = inbox.conversations.unassigned.open + + scope = if assignment_config['conversation_priority'].to_s == 'longest_waiting' + scope.reorder(last_activity_at: :asc, created_at: :asc) + else + scope.reorder(created_at: :asc) + end + + scope.limit(limit) + end + + def find_available_agent + agents = filter_agents_by_rate_limit(inbox.available_agents) + return nil if agents.empty? + + round_robin_selector.select_agent(agents) + end + + def filter_agents_by_rate_limit(agents) + agents.select do |agent_member| + rate_limiter = build_rate_limiter(agent_member.user) + rate_limiter.within_limit? + end + end + + def assign_conversation(conversation, agent) + conversation.update!(assignee: agent) + + rate_limiter = build_rate_limiter(agent) + rate_limiter.track_assignment(conversation) + + dispatch_assignment_event(conversation, agent) + true + end + + def dispatch_assignment_event(conversation, agent) + Rails.configuration.dispatcher.dispatch( + Events::Types::ASSIGNEE_CHANGED, + Time.zone.now, + conversation: conversation, + user: agent + ) + end + + def build_rate_limiter(agent) + AutoAssignment::RateLimiter.new(inbox: inbox, agent: agent) + end + + def round_robin_selector + @round_robin_selector ||= AutoAssignment::RoundRobinSelector.new(inbox: inbox) + end + + def assignment_config + @assignment_config ||= inbox.auto_assignment_config || {} + end +end + +AutoAssignment::AssignmentService.prepend_mod_with('AutoAssignment::AssignmentService') diff --git a/app/services/auto_assignment/rate_limiter.rb b/app/services/auto_assignment/rate_limiter.rb new file mode 100644 index 000000000..d22f1f9b7 --- /dev/null +++ b/app/services/auto_assignment/rate_limiter.rb @@ -0,0 +1,49 @@ +class AutoAssignment::RateLimiter + pattr_initialize [:inbox!, :agent!] + + def within_limit? + return true unless enabled? + + current_count < limit + end + + def track_assignment(conversation) + return unless enabled? + + assignment_key = build_assignment_key(conversation.id) + Redis::Alfred.set(assignment_key, conversation.id.to_s, ex: window) + end + + def current_count + return 0 unless enabled? + + pattern = assignment_key_pattern + Redis::Alfred.keys_count(pattern) + end + + private + + def enabled? + limit.present? && limit.positive? + end + + def limit + config&.fair_distribution_limit&.to_i || Math + end + + def window + config&.fair_distribution_window&.to_i || 24.hours.to_i + end + + def config + @config ||= inbox.assignment_policy + end + + def assignment_key_pattern + format(Redis::RedisKeys::ASSIGNMENT_KEY_PATTERN, inbox_id: inbox.id, agent_id: agent.id) + end + + def build_assignment_key(conversation_id) + format(Redis::RedisKeys::ASSIGNMENT_KEY, inbox_id: inbox.id, agent_id: agent.id, conversation_id: conversation_id) + end +end diff --git a/app/services/auto_assignment/round_robin_selector.rb b/app/services/auto_assignment/round_robin_selector.rb new file mode 100644 index 000000000..65e72090d --- /dev/null +++ b/app/services/auto_assignment/round_robin_selector.rb @@ -0,0 +1,16 @@ +class AutoAssignment::RoundRobinSelector + pattr_initialize [:inbox!] + + def select_agent(available_agents) + return nil if available_agents.empty? + + agent_user_ids = available_agents.map(&:user_id).map(&:to_s) + round_robin_service.available_agent(allowed_agent_ids: agent_user_ids) + end + + private + + def round_robin_service + @round_robin_service ||= AutoAssignment::InboxRoundRobinService.new(inbox: inbox) + end +end diff --git a/config/locales/am.yml b/config/locales/am.yml index f1e9bf52b..59ecaf187 100644 --- a/config/locales/am.yml +++ b/config/locales/am.yml @@ -76,6 +76,7 @@ am: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ar.yml b/config/locales/ar.yml index b4998c6e4..77c3f3c21 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -76,6 +76,7 @@ ar: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/az.yml b/config/locales/az.yml index 4ca5260f5..ecf46da3b 100644 --- a/config/locales/az.yml +++ b/config/locales/az.yml @@ -76,6 +76,7 @@ az: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 9a83df74a..9f806ddb8 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -76,6 +76,7 @@ bg: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/bn.yml b/config/locales/bn.yml index 6e2cedeb1..6bea58292 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -76,6 +76,7 @@ bn: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ca.yml b/config/locales/ca.yml index cd0e36f29..51a3e06e4 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -76,6 +76,7 @@ ca: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 3fb647b48..9daeea48a 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -76,6 +76,7 @@ cs: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/da.yml b/config/locales/da.yml index d7c02426f..81834a427 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -76,6 +76,7 @@ da: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/de.yml b/config/locales/de.yml index c59576720..c805c47d3 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -76,6 +76,7 @@ de: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/el.yml b/config/locales/el.yml index 22fce73b7..63c4a686d 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -76,6 +76,7 @@ el: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/es.yml b/config/locales/es.yml index cfe468dee..8a035df7b 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -76,6 +76,7 @@ es: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/et.yml b/config/locales/et.yml index dcf81c6e3..e60df2b42 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -76,6 +76,7 @@ et: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 536c78f47..bb9db01e9 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -76,6 +76,7 @@ fa: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 7e8c3e14b..94f68aa8d 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -76,6 +76,7 @@ fi: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 53435aafa..460e520aa 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -76,6 +76,7 @@ fr: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/he.yml b/config/locales/he.yml index a8c729959..56e32d142 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -76,6 +76,7 @@ he: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/hi.yml b/config/locales/hi.yml index 26b89c2e5..0e47a998c 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -76,6 +76,7 @@ hi: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 4b4117eed..3239824bf 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -76,6 +76,7 @@ hr: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 87c496aa0..585afcd24 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -76,6 +76,7 @@ hu: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/hy.yml b/config/locales/hy.yml index 063db291d..8b61be9c4 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -76,6 +76,7 @@ hy: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/id.yml b/config/locales/id.yml index 41383befc..167b860a9 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -76,6 +76,7 @@ id: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/is.yml b/config/locales/is.yml index 7f671ac54..47db2a83c 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -76,6 +76,7 @@ is: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/it.yml b/config/locales/it.yml index 83a00a8b5..ba6c7cf5e 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -76,6 +76,7 @@ it: token_exchange_failed: 'Impossibile scambiare il codice con il token di accesso. Riprova.' invalid_token_permissions: 'Il token di accesso non dispone dei permessi richiesti per WhatsApp.' phone_info_fetch_failed: 'Impossibile recuperare le informazioni sul numero di telefono. Riprova.' + phone_number_already_exists: 'Esiste già un canale per questo numero di telefono: %{phone_number}, si prega di contattare il supporto se l''errore persiste' reauthorization: generic: 'Impossibile riautorizzare WhatsApp. Riprova.' not_supported: 'La riautorizzazione non è supportata per questo tipo di canale WhatsApp.' diff --git a/config/locales/ja.yml b/config/locales/ja.yml index eb205d1f5..d1753cb7a 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -76,6 +76,7 @@ ja: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ka.yml b/config/locales/ka.yml index df7caec35..25e2370ee 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -76,6 +76,7 @@ ka: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 8200fe4cf..707332172 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -76,6 +76,7 @@ ko: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 4fca6066f..daf7b00ee 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -76,6 +76,7 @@ lt: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/lv.yml b/config/locales/lv.yml index baac1bbfe..3fd92993b 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -76,6 +76,7 @@ lv: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ml.yml b/config/locales/ml.yml index ef716ae26..ee5ee8f7f 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -76,6 +76,7 @@ ml: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 8dc3b396d..460986218 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -76,6 +76,7 @@ ms: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ne.yml b/config/locales/ne.yml index 6a1d0cdb0..57b0ddc4c 100644 --- a/config/locales/ne.yml +++ b/config/locales/ne.yml @@ -76,6 +76,7 @@ ne: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 75d536a5c..73e15b0c3 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -76,6 +76,7 @@ nl: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/no.yml b/config/locales/no.yml index e45fe8b88..41ce03ef5 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -76,6 +76,7 @@ token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 863bd6671..5b727d944 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -76,6 +76,7 @@ pl: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/pt.yml b/config/locales/pt.yml index cc5f4b940..168941db0 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -76,6 +76,7 @@ pt: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml index 52a0b4226..f8f6c0428 100644 --- a/config/locales/pt_BR.yml +++ b/config/locales/pt_BR.yml @@ -76,6 +76,7 @@ pt_BR: token_exchange_failed: 'Falha ao trocar o código por um token de acesso. Por favor, tente novamente.' invalid_token_permissions: 'O token de acesso não tem as permissões necessárias para o WhatsApp.' phone_info_fetch_failed: 'Falha ao obter a informação do número de telefone. Por favor, tente novamente.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Falha ao reautenticar o WhatsApp. Por favor, tente novamente.' not_supported: 'Reautenticação não é suportado por este tipo de canal WhatsApp.' diff --git a/config/locales/ro.yml b/config/locales/ro.yml index b998feb84..b00c1689c 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -76,6 +76,7 @@ ro: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 2484b30b4..90d41e87b 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -76,6 +76,7 @@ ru: token_exchange_failed: 'Не удалось обменять код на токена доступа. Пожалуйста, попробуйте еще раз.' invalid_token_permissions: 'Токен доступа не имеет необходимых прав для WhatsApp.' phone_info_fetch_failed: 'Не удалось получить информацию о номере телефона. Пожалуйста, попробуйте еще раз.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Не удалось повторно авторизовать WhatsApp. Пожалуйста, попробуйте еще раз.' not_supported: 'Повторная авторизация не поддерживается для данного типа канала WhatsApp.' diff --git a/config/locales/sh.yml b/config/locales/sh.yml index 612db81a8..e918e4f58 100644 --- a/config/locales/sh.yml +++ b/config/locales/sh.yml @@ -76,6 +76,7 @@ sh: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 149af73cd..51c376df2 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -76,6 +76,7 @@ sk: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 40333e298..ba73fed9f 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -76,6 +76,7 @@ sl: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/sq.yml b/config/locales/sq.yml index ac7d5e4b9..b2874d78f 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -76,6 +76,7 @@ sq: token_exchange_failed: 'Dështoi shkëmbimi i kodit për tokenin e aksesit. Ju lutemi, provoni përsëri.' invalid_token_permissions: 'Tokeni i aksesit nuk ka lejet e nevojshme për WhatsApp.' phone_info_fetch_failed: 'Dështoi marrja e informacionit të numrit të telefonit. Ju lutemi, provoni përsëri.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Dështoi riautorizimi i WhatsApp-it. Ju lutemi, provoni përsëri.' not_supported: 'Riautorizimi nuk mbështetet për këtë lloj kanali të WhatsApp-it.' diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 685b736be..c0d384a15 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -76,6 +76,7 @@ sr-Latn: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 5c0c18b22..c12ee447d 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -76,6 +76,7 @@ sv: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ta.yml b/config/locales/ta.yml index 752ec6e6c..1f84cf894 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -76,6 +76,7 @@ ta: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/th.yml b/config/locales/th.yml index 1ad957730..c6882b804 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -76,6 +76,7 @@ th: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/tl.yml b/config/locales/tl.yml index 4ccbe3f16..a82593d8b 100644 --- a/config/locales/tl.yml +++ b/config/locales/tl.yml @@ -76,6 +76,7 @@ tl: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/tr.yml b/config/locales/tr.yml index ca0eb3596..5cca4e559 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -76,6 +76,7 @@ tr: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Bu telefon numarası için zaten bir kanal mevcut: %{phone_number}, hata devam ederse lütfen destek ile iletişime geçin' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 543241725..b993f11cc 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -76,6 +76,7 @@ uk: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ur.yml b/config/locales/ur.yml index 859babbfa..3ce206c7a 100644 --- a/config/locales/ur.yml +++ b/config/locales/ur.yml @@ -76,6 +76,7 @@ ur: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/ur_IN.yml b/config/locales/ur_IN.yml index 9a402fa1c..1c60bbbe2 100644 --- a/config/locales/ur_IN.yml +++ b/config/locales/ur_IN.yml @@ -76,6 +76,7 @@ ur: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 281b3bab4..4a58f028e 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -76,6 +76,7 @@ vi: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml index b706cdca3..86a9ca702 100644 --- a/config/locales/zh_CN.yml +++ b/config/locales/zh_CN.yml @@ -76,6 +76,7 @@ zh_CN: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml index f35ced777..de3b45df9 100644 --- a/config/locales/zh_TW.yml +++ b/config/locales/zh_TW.yml @@ -76,6 +76,7 @@ zh_TW: token_exchange_failed: 'Failed to exchange code for access token. Please try again.' invalid_token_permissions: 'The access token does not have the required permissions for WhatsApp.' phone_info_fetch_failed: 'Failed to fetch phone number information. Please try again.' + phone_number_already_exists: 'Channel already exists for this phone number: %{phone_number}, please contact support if the error persists' reauthorization: generic: 'Failed to reauthorize WhatsApp. Please try again.' not_supported: 'Reauthorization is not supported for this type of WhatsApp channel.' diff --git a/config/schedule.yml b/config/schedule.yml index b5b21b4ce..c039719fa 100644 --- a/config/schedule.yml +++ b/config/schedule.yml @@ -53,3 +53,9 @@ bulk_auto_assignment_job: cron: '*/15 * * * *' class: 'Inboxes::BulkAutoAssignmentJob' queue: scheduled_jobs + +# executed every 30 minutes for assignment_v2 +periodic_assignment_job: + cron: '*/30 * * * *' + class: 'AutoAssignment::PeriodicAssignmentJob' + queue: scheduled_jobs diff --git a/enterprise/app/models/enterprise/concerns/inbox.rb b/enterprise/app/models/enterprise/concerns/inbox.rb index 6f450bed1..0de61db23 100644 --- a/enterprise/app/models/enterprise/concerns/inbox.rb +++ b/enterprise/app/models/enterprise/concerns/inbox.rb @@ -6,5 +6,6 @@ module Enterprise::Concerns::Inbox has_one :captain_assistant, through: :captain_inbox, class_name: 'Captain::Assistant' + has_many :inbox_capacity_limits, dependent: :destroy end end diff --git a/enterprise/app/models/enterprise/inbox_agent_availability.rb b/enterprise/app/models/enterprise/inbox_agent_availability.rb new file mode 100644 index 000000000..886b55278 --- /dev/null +++ b/enterprise/app/models/enterprise/inbox_agent_availability.rb @@ -0,0 +1,31 @@ +module Enterprise::InboxAgentAvailability + extend ActiveSupport::Concern + + def member_ids_with_assignment_capacity + return member_ids unless capacity_filtering_enabled? + + # Get online agents with capacity + agents = available_agents + agents = filter_by_capacity(agents) + agents.map(&:user_id) + end + + private + + def filter_by_capacity(inbox_members_scope) + return inbox_members_scope unless capacity_filtering_enabled? + + inbox_members_scope.select do |inbox_member| + capacity_service.agent_has_capacity?(inbox_member.user, self) + end + end + + def capacity_filtering_enabled? + account.feature_enabled?('assignment_v2') && + account.account_users.joins(:agent_capacity_policy).exists? + end + + def capacity_service + @capacity_service ||= Enterprise::AutoAssignment::CapacityService.new + end +end diff --git a/enterprise/app/services/enterprise/auto_assignment/assignment_service.rb b/enterprise/app/services/enterprise/auto_assignment/assignment_service.rb new file mode 100644 index 000000000..4f3da08ee --- /dev/null +++ b/enterprise/app/services/enterprise/auto_assignment/assignment_service.rb @@ -0,0 +1,94 @@ +module Enterprise::AutoAssignment::AssignmentService + private + + # Override assignment config to use policy if available + def assignment_config + return super unless policy + + { + 'conversation_priority' => policy.conversation_priority, + 'fair_distribution_limit' => policy.fair_distribution_limit, + 'fair_distribution_window' => policy.fair_distribution_window, + 'balanced' => policy.balanced? + }.compact + end + + # Extend agent finding to add capacity checks + def find_available_agent + agents = filter_agents_by_rate_limit(inbox.available_agents) + agents = filter_agents_by_capacity(agents) if capacity_filtering_enabled? + return nil if agents.empty? + + selector = policy&.balanced? ? balanced_selector : round_robin_selector + selector.select_agent(agents) + end + + def filter_agents_by_capacity(agents) + return agents unless capacity_filtering_enabled? + + capacity_service = Enterprise::AutoAssignment::CapacityService.new + agents.select { |agent_member| capacity_service.agent_has_capacity?(agent_member.user, inbox) } + end + + def capacity_filtering_enabled? + account.feature_enabled?('assignment_v2') && + account.account_users.joins(:agent_capacity_policy).exists? + end + + def round_robin_selector + @round_robin_selector ||= AutoAssignment::RoundRobinSelector.new(inbox: inbox) + end + + def balanced_selector + @balanced_selector ||= Enterprise::AutoAssignment::BalancedSelector.new(inbox: inbox) + end + + def policy + @policy ||= inbox.assignment_policy + end + + def account + inbox.account + end + + # Override to apply exclusion rules + def unassigned_conversations(limit) + scope = inbox.conversations.unassigned.open + + # Apply exclusion rules from capacity policy or assignment policy + scope = apply_exclusion_rules(scope) + + # Apply conversation priority using enum methods if policy exists + scope = if policy&.longest_waiting? + scope.reorder(last_activity_at: :asc, created_at: :asc) + else + scope.reorder(created_at: :asc) + end + + scope.limit(limit) + end + + def apply_exclusion_rules(scope) + capacity_policy = inbox.inbox_capacity_limits.first&.agent_capacity_policy + return scope unless capacity_policy + + exclusion_rules = capacity_policy.exclusion_rules || {} + scope = apply_label_exclusions(scope, exclusion_rules['excluded_labels']) + apply_age_exclusions(scope, exclusion_rules['exclude_older_than_hours']) + end + + def apply_label_exclusions(scope, excluded_labels) + return scope if excluded_labels.blank? + + scope.tagged_with(excluded_labels, exclude: true, on: :labels) + end + + def apply_age_exclusions(scope, hours_threshold) + return scope if hours_threshold.blank? + + hours = hours_threshold.to_i + return scope unless hours.positive? + + scope.where('conversations.created_at >= ?', hours.hours.ago) + end +end diff --git a/enterprise/app/services/enterprise/auto_assignment/balanced_selector.rb b/enterprise/app/services/enterprise/auto_assignment/balanced_selector.rb new file mode 100644 index 000000000..57017b6bb --- /dev/null +++ b/enterprise/app/services/enterprise/auto_assignment/balanced_selector.rb @@ -0,0 +1,26 @@ +class Enterprise::AutoAssignment::BalancedSelector + pattr_initialize [:inbox!] + + def select_agent(available_agents) + return nil if available_agents.empty? + + agent_users = available_agents.map(&:user) + assignment_counts = fetch_assignment_counts(agent_users) + + agent_users.min_by { |user| assignment_counts[user.id] || 0 } + end + + private + + def fetch_assignment_counts(users) + user_ids = users.map(&:id) + + counts = inbox.conversations + .open + .where(assignee_id: user_ids) + .group(:assignee_id) + .count + + Hash.new(0).merge(counts) + end +end diff --git a/enterprise/app/services/enterprise/auto_assignment/capacity_service.rb b/enterprise/app/services/enterprise/auto_assignment/capacity_service.rb new file mode 100644 index 000000000..f82da9267 --- /dev/null +++ b/enterprise/app/services/enterprise/auto_assignment/capacity_service.rb @@ -0,0 +1,25 @@ +class Enterprise::AutoAssignment::CapacityService + def agent_has_capacity?(user, inbox) + # Get the account_user for this specific account + account_user = user.account_users.find_by(account: inbox.account) + + # If no account_user or no capacity policy, agent has unlimited capacity + return true unless account_user&.agent_capacity_policy + + policy = account_user.agent_capacity_policy + + # Check if there's a specific limit for this inbox + inbox_limit = policy.inbox_capacity_limits.find_by(inbox: inbox) + + # If no specific limit for this inbox, agent has unlimited capacity for this inbox + return true unless inbox_limit + + # Count current open conversations for this agent in this inbox + current_count = user.assigned_conversations + .where(inbox: inbox, status: :open) + .count + + # Agent has capacity if current count is below the limit + current_count < inbox_limit.conversation_limit + end +end diff --git a/lib/redis/alfred.rb b/lib/redis/alfred.rb index b3e156420..e7e04ed60 100644 --- a/lib/redis/alfred.rb +++ b/lib/redis/alfred.rb @@ -35,6 +35,25 @@ module Redis::Alfred $alfred.with { |conn| conn.exists?(key) } end + # set expiry on a key in seconds + def expire(key, seconds) + $alfred.with { |conn| conn.expire(key, seconds) } + end + + # scan keys matching a pattern + def scan_each(match: nil, count: 100, &) + $alfred.with do |conn| + conn.scan_each(match: match, count: count, &) + end + end + + # count keys matching a pattern + def keys_count(pattern) + count = 0 + scan_each(match: pattern) { count += 1 } + count + end + # list operations def llen(key) @@ -81,8 +100,15 @@ module Redis::Alfred # sorted set operations # add score and value for a key - def zadd(key, score, value) - $alfred.with { |conn| conn.zadd(key, score, value) } + # Modern Redis syntax: zadd(key, [[score, member], ...]) + def zadd(key, score, value = nil) + if value.nil? && score.is_a?(Array) + # New syntax: score is actually an array of [score, member] pairs + $alfred.with { |conn| conn.zadd(key, score) } + else + # Support old syntax for backward compatibility + $alfred.with { |conn| conn.zadd(key, [[score, value]]) } + end end # get score of a value for key @@ -90,9 +116,22 @@ module Redis::Alfred $alfred.with { |conn| conn.zscore(key, value) } end + # count members in a sorted set with scores within the given range + def zcount(key, min_score, max_score) + $alfred.with { |conn| conn.zcount(key, min_score, max_score) } + end + + # get the number of members in a sorted set + def zcard(key) + $alfred.with { |conn| conn.zcard(key) } + end + # get values by score - def zrangebyscore(key, range_start, range_end) - $alfred.with { |conn| conn.zrangebyscore(key, range_start, range_end) } + def zrangebyscore(key, range_start, range_end, with_scores: false, limit: nil) + options = {} + options[:with_scores] = with_scores if with_scores + options[:limit] = limit if limit + $alfred.with { |conn| conn.zrangebyscore(key, range_start, range_end, **options) } end # remove values by score diff --git a/lib/redis/redis_keys.rb b/lib/redis/redis_keys.rb index fa64d1043..f5d297e5f 100644 --- a/lib/redis/redis_keys.rb +++ b/lib/redis/redis_keys.rb @@ -42,4 +42,9 @@ module Redis::RedisKeys SLACK_MESSAGE_MUTEX = 'SLACK_MESSAGE_LOCK::%s::%s'.freeze EMAIL_MESSAGE_MUTEX = 'EMAIL_CHANNEL_LOCK::%s'.freeze CRM_PROCESS_MUTEX = 'CRM_PROCESS_MUTEX::%s'.freeze + + ## Auto Assignment Keys + # Track conversation assignments to agents for rate limiting + ASSIGNMENT_KEY = 'ASSIGNMENT::%d::AGENT::%d::CONVERSATION::%d'.freeze + ASSIGNMENT_KEY_PATTERN = 'ASSIGNMENT::%d::AGENT::%d::*'.freeze end diff --git a/lib/tasks/auto_annotate_models.rake b/lib/tasks/auto_annotate_models.rake index 9dcd13126..8a89739b6 100644 --- a/lib/tasks/auto_annotate_models.rake +++ b/lib/tasks/auto_annotate_models.rake @@ -2,14 +2,11 @@ # NOTE: are sensitive to local FS writes, and besides -- it's just not proper # NOTE: to have a dev-mode tool do its thing in production. if Rails.env.development? - require 'annotate_rb' - - AnnotateRb::Core.load_rake_tasks - + require 'annotate' task :set_annotation_options do # You can override any of these by setting an environment variable of the # same name. - AnnotateRb::Options.set_defaults( + Annotate.set_defaults( 'additional_file_patterns' => [], 'routes' => 'false', 'models' => 'true', @@ -58,4 +55,6 @@ if Rails.env.development? 'with_comment' => 'true' ) end + + Annotate.load_tasks end diff --git a/spec/enterprise/services/enterprise/auto_assignment/assignment_service_spec.rb b/spec/enterprise/services/enterprise/auto_assignment/assignment_service_spec.rb new file mode 100644 index 000000000..432f397be --- /dev/null +++ b/spec/enterprise/services/enterprise/auto_assignment/assignment_service_spec.rb @@ -0,0 +1,185 @@ +require 'rails_helper' + +RSpec.describe Enterprise::AutoAssignment::AssignmentService, type: :service do + let(:account) { create(:account) } + let(:assignment_policy) { create(:assignment_policy, account: account, enabled: true) } + let(:inbox) { create(:inbox, account: account) } + let(:agent1) { create(:user, account: account, name: 'Agent 1') } + let(:agent2) { create(:user, account: account, name: 'Agent 2') } + let(:assignment_service) { AutoAssignment::AssignmentService.new(inbox: inbox) } + + before do + # Create inbox members + create(:inbox_member, inbox: inbox, user: agent1) + create(:inbox_member, inbox: inbox, user: agent2) + + # Link inbox to assignment policy + create(:inbox_assignment_policy, inbox: inbox, assignment_policy: assignment_policy) + + allow(account).to receive(:feature_enabled?).and_return(false) + allow(account).to receive(:feature_enabled?).with('assignment_v2').and_return(true) + + # Set agents as online + OnlineStatusTracker.update_presence(account.id, 'User', agent1.id) + OnlineStatusTracker.set_status(account.id, agent1.id, 'online') + OnlineStatusTracker.update_presence(account.id, 'User', agent2.id) + OnlineStatusTracker.set_status(account.id, agent2.id, 'online') + end + + describe 'exclusion rules' do + let(:capacity_policy) { create(:agent_capacity_policy, account: account) } + let(:label1) { create(:label, account: account, title: 'high-priority') } + let(:label2) { create(:label, account: account, title: 'vip') } + + before do + create(:inbox_capacity_limit, inbox: inbox, agent_capacity_policy: capacity_policy, conversation_limit: 10) + inbox.enable_auto_assignment = true + inbox.save! + end + + context 'when excluding conversations by label' do + let!(:conversation_with_label) { create(:conversation, inbox: inbox, assignee: nil) } + let!(:conversation_without_label) { create(:conversation, inbox: inbox, assignee: nil) } + + before do + conversation_with_label.update_labels([label1.title]) + + capacity_policy.update!(exclusion_rules: { + 'excluded_labels' => [label1.title] + }) + end + + it 'excludes conversations with specified labels' do + # First check conversations are unassigned + expect(conversation_with_label.assignee).to be_nil + expect(conversation_without_label.assignee).to be_nil + + # Run bulk assignment + assigned_count = assignment_service.perform_bulk_assignment(limit: 10) + + # Only the conversation without label should be assigned + expect(assigned_count).to eq(1) + expect(conversation_with_label.reload.assignee).to be_nil + expect(conversation_without_label.reload.assignee).to be_present + end + + it 'handles bulk assignment correctly' do + assigned_count = assignment_service.perform_bulk_assignment(limit: 10) + + # Only 1 conversation should be assigned (the one without label) + expect(assigned_count).to eq(1) + expect(conversation_with_label.reload.assignee).to be_nil + expect(conversation_without_label.reload.assignee).to be_present + end + + it 'excludes conversations with multiple labels' do + conversation_without_label.update_labels([label2.title]) + + capacity_policy.update!(exclusion_rules: { + 'excluded_labels' => [label1.title, label2.title] + }) + + assigned_count = assignment_service.perform_bulk_assignment(limit: 10) + + # Both conversations should be excluded + expect(assigned_count).to eq(0) + expect(conversation_with_label.reload.assignee).to be_nil + expect(conversation_without_label.reload.assignee).to be_nil + end + end + + context 'when excluding conversations by age' do + let!(:old_conversation) { create(:conversation, inbox: inbox, assignee: nil, created_at: 25.hours.ago) } + let!(:recent_conversation) { create(:conversation, inbox: inbox, assignee: nil, created_at: 1.hour.ago) } + + before do + capacity_policy.update!(exclusion_rules: { + 'exclude_older_than_hours' => 24 + }) + end + + it 'excludes conversations older than specified hours' do + assigned_count = assignment_service.perform_bulk_assignment(limit: 10) + + # Only recent conversation should be assigned + expect(assigned_count).to eq(1) + expect(old_conversation.reload.assignee).to be_nil + expect(recent_conversation.reload.assignee).to be_present + end + + it 'handles different time thresholds' do + capacity_policy.update!(exclusion_rules: { + 'exclude_older_than_hours' => 2 + }) + + assigned_count = assignment_service.perform_bulk_assignment(limit: 10) + + # Only conversation created within 2 hours should be assigned + expect(assigned_count).to eq(1) + expect(recent_conversation.reload.assignee).to be_present + end + end + + context 'when combining exclusion rules' do + it 'applies both exclusion rules' do + # Create conversations + old_conversation_with_label = create(:conversation, inbox: inbox, assignee: nil, created_at: 25.hours.ago) + old_conversation_without_label = create(:conversation, inbox: inbox, assignee: nil, created_at: 25.hours.ago) + recent_conversation_with_label = create(:conversation, inbox: inbox, assignee: nil, created_at: 1.hour.ago) + recent_conversation_without_label = create(:conversation, inbox: inbox, assignee: nil, created_at: 1.hour.ago) + + # Add labels + old_conversation_with_label.update_labels([label1.title]) + recent_conversation_with_label.update_labels([label1.title]) + + capacity_policy.update!(exclusion_rules: { + 'excluded_labels' => [label1.title], + 'exclude_older_than_hours' => 24 + }) + + assigned_count = assignment_service.perform_bulk_assignment(limit: 10) + + # Only recent conversation without label should be assigned + expect(assigned_count).to eq(1) + expect(old_conversation_with_label.reload.assignee).to be_nil + expect(old_conversation_without_label.reload.assignee).to be_nil + expect(recent_conversation_with_label.reload.assignee).to be_nil + expect(recent_conversation_without_label.reload.assignee).to be_present + end + end + + context 'when exclusion rules are empty' do + let!(:conversation1) { create(:conversation, inbox: inbox, assignee: nil) } + let!(:conversation2) { create(:conversation, inbox: inbox, assignee: nil) } + + before do + capacity_policy.update!(exclusion_rules: {}) + end + + it 'assigns all eligible conversations' do + assigned_count = assignment_service.perform_bulk_assignment(limit: 10) + + expect(assigned_count).to eq(2) + expect(conversation1.reload.assignee).to be_present + expect(conversation2.reload.assignee).to be_present + end + end + + context 'when no capacity policy exists' do + let!(:conversation1) { create(:conversation, inbox: inbox, assignee: nil) } + let!(:conversation2) { create(:conversation, inbox: inbox, assignee: nil) } + + before do + InboxCapacityLimit.destroy_all + end + + it 'assigns all eligible conversations without exclusions' do + assigned_count = assignment_service.perform_bulk_assignment(limit: 10) + + expect(assigned_count).to eq(2) + expect(conversation1.reload.assignee).to be_present + expect(conversation2.reload.assignee).to be_present + end + end + end +end diff --git a/spec/enterprise/services/enterprise/auto_assignment/balanced_selector_spec.rb b/spec/enterprise/services/enterprise/auto_assignment/balanced_selector_spec.rb new file mode 100644 index 000000000..a2340ab0e --- /dev/null +++ b/spec/enterprise/services/enterprise/auto_assignment/balanced_selector_spec.rb @@ -0,0 +1,88 @@ +require 'rails_helper' + +RSpec.describe Enterprise::AutoAssignment::BalancedSelector do + let(:account) { create(:account) } + let(:inbox) { create(:inbox, account: account) } + let(:selector) { described_class.new(inbox: inbox) } + let(:agent1) { create(:user, account: account, role: :agent, availability: :online) } + let(:agent2) { create(:user, account: account, role: :agent, availability: :online) } + let(:agent3) { create(:user, account: account, role: :agent, availability: :online) } + let(:member1) { create(:inbox_member, inbox: inbox, user: agent1) } + let(:member2) { create(:inbox_member, inbox: inbox, user: agent2) } + let(:member3) { create(:inbox_member, inbox: inbox, user: agent3) } + + describe '#select_agent' do + context 'when selecting based on workload' do + let(:available_agents) { [member1, member2, member3] } + + it 'selects the agent with least open conversations' do + # Agent1 has 3 open conversations + 3.times { create(:conversation, inbox: inbox, assignee: agent1, status: 'open') } + + # Agent2 has 1 open conversation + create(:conversation, inbox: inbox, assignee: agent2, status: 'open') + + # Agent3 has 2 open conversations + 2.times { create(:conversation, inbox: inbox, assignee: agent3, status: 'open') } + + selected_agent = selector.select_agent(available_agents) + + # Should select agent2 as they have the least conversations + expect(selected_agent).to eq(agent2) + end + + it 'considers only open conversations' do + # Agent1 has 1 open and 3 resolved conversations + create(:conversation, inbox: inbox, assignee: agent1, status: 'open') + 3.times { create(:conversation, inbox: inbox, assignee: agent1, status: 'resolved') } + + # Agent2 has 2 open conversations + 2.times { create(:conversation, inbox: inbox, assignee: agent2, status: 'open') } + + selected_agent = selector.select_agent([member1, member2]) + + # Should select agent1 as they have fewer open conversations + expect(selected_agent).to eq(agent1) + end + + it 'selects any agent when agents have equal workload' do + # All agents have same number of conversations + [member1, member2, member3].each do |member| + create(:conversation, inbox: inbox, assignee: member.user, status: 'open') + end + + selected_agent = selector.select_agent(available_agents) + + # Should select one of the agents (when equal, min_by returns the first one it finds) + expect([agent1, agent2, agent3]).to include(selected_agent) + end + end + + context 'when no agents are available' do + it 'returns nil' do + selected_agent = selector.select_agent([]) + expect(selected_agent).to be_nil + end + end + + context 'when one agent is available' do + it 'returns that agent' do + selected_agent = selector.select_agent([member1]) + expect(selected_agent).to eq(agent1) + end + end + + context 'with new agents (no conversations)' do + it 'prioritizes agents with no conversations' do + # Agent1 and 2 have conversations + create(:conversation, inbox: inbox, assignee: agent1, status: 'open') + create(:conversation, inbox: inbox, assignee: agent2, status: 'open') + + # Agent3 is new with no conversations + selected_agent = selector.select_agent([member1, member2, member3]) + + expect(selected_agent).to eq(agent3) + end + end + end +end diff --git a/spec/enterprise/services/enterprise/auto_assignment/capacity_service_spec.rb b/spec/enterprise/services/enterprise/auto_assignment/capacity_service_spec.rb new file mode 100644 index 000000000..98d7c2172 --- /dev/null +++ b/spec/enterprise/services/enterprise/auto_assignment/capacity_service_spec.rb @@ -0,0 +1,119 @@ +require 'rails_helper' + +RSpec.describe Enterprise::AutoAssignment::CapacityService, type: :service do + let(:account) { create(:account) } + let(:inbox) { create(:inbox, account: account, enable_auto_assignment: true) } + + # Assignment policy with rate limiting + let(:assignment_policy) do + create(:assignment_policy, + account: account, + enabled: true, + fair_distribution_limit: 5, + fair_distribution_window: 3600) + end + + # Agent capacity policy + let(:agent_capacity_policy) do + create(:agent_capacity_policy, account: account, name: 'Limited Capacity') + end + + # Agents with different capacity settings + let(:agent_with_capacity) { create(:user, account: account, role: :agent, availability: :online) } + let(:agent_without_capacity) { create(:user, account: account, role: :agent, availability: :online) } + let(:agent_at_capacity) { create(:user, account: account, role: :agent, availability: :online) } + + before do + # Create inbox assignment policy + create(:inbox_assignment_policy, inbox: inbox, assignment_policy: assignment_policy) + + # Set inbox capacity limit + create(:inbox_capacity_limit, + agent_capacity_policy: agent_capacity_policy, + inbox: inbox, + conversation_limit: 3) + + # Assign capacity policy to specific agents + agent_with_capacity.account_users.find_by(account: account) + .update!(agent_capacity_policy: agent_capacity_policy) + + agent_at_capacity.account_users.find_by(account: account) + .update!(agent_capacity_policy: agent_capacity_policy) + + # Create inbox members + create(:inbox_member, inbox: inbox, user: agent_with_capacity) + create(:inbox_member, inbox: inbox, user: agent_without_capacity) + create(:inbox_member, inbox: inbox, user: agent_at_capacity) + + # Mock online status + allow(OnlineStatusTracker).to receive(:get_available_users).and_return({ + agent_with_capacity.id.to_s => 'online', + agent_without_capacity.id.to_s => 'online', + agent_at_capacity.id.to_s => 'online' + }) + + # Enable assignment_v2 feature + allow(account).to receive(:feature_enabled?).with('assignment_v2').and_return(true) + + # Create existing assignments for agent_at_capacity (at limit) + 3.times do + create(:conversation, inbox: inbox, assignee: agent_at_capacity, status: :open) + end + end + + describe 'capacity filtering' do + it 'excludes agents at capacity' do + # Get available agents respecting capacity + capacity_service = described_class.new + online_agents = inbox.available_agents + filtered_agents = online_agents.select do |inbox_member| + capacity_service.agent_has_capacity?(inbox_member.user, inbox) + end + available_users = filtered_agents.map(&:user) + + expect(available_users).to include(agent_with_capacity) + expect(available_users).to include(agent_without_capacity) # No capacity policy = unlimited + expect(available_users).not_to include(agent_at_capacity) # At capacity limit + end + + it 'respects inbox-specific capacity limits' do + capacity_service = described_class.new + + expect(capacity_service.agent_has_capacity?(agent_with_capacity, inbox)).to be true + expect(capacity_service.agent_has_capacity?(agent_without_capacity, inbox)).to be true + expect(capacity_service.agent_has_capacity?(agent_at_capacity, inbox)).to be false + end + end + + describe 'assignment with capacity' do + let(:service) { AutoAssignment::AssignmentService.new(inbox: inbox) } + + it 'assigns to agents with available capacity' do + # Create conversation before assignment + conversation = create(:conversation, inbox: inbox, assignee: nil, status: :open) + + # Mock the selector to prefer agent_at_capacity (but should skip due to capacity) + selector = instance_double(AutoAssignment::RoundRobinSelector) + allow(AutoAssignment::RoundRobinSelector).to receive(:new).and_return(selector) + allow(selector).to receive(:select_agent) do |agents| + agents.map(&:user).find { |u| [agent_with_capacity, agent_without_capacity].include?(u) } + end + + assigned_count = service.perform_bulk_assignment(limit: 1) + expect(assigned_count).to eq(1) + expect(conversation.reload.assignee).to be_in([agent_with_capacity, agent_without_capacity]) + expect(conversation.reload.assignee).not_to eq(agent_at_capacity) + end + + it 'returns false when all agents are at capacity' do + # Fill up remaining agents + 3.times { create(:conversation, inbox: inbox, assignee: agent_with_capacity, status: :open) } + + # agent_without_capacity has no limit, so should still be available + conversation2 = create(:conversation, inbox: inbox, assignee: nil, status: :open) + assigned_count = service.perform_bulk_assignment(limit: 1) + expect(assigned_count).to eq(1) + expect(conversation2.reload.assignee).to eq(agent_without_capacity) + end + end +end diff --git a/spec/jobs/auto_assignment/assignment_job_spec.rb b/spec/jobs/auto_assignment/assignment_job_spec.rb new file mode 100644 index 000000000..d13f9fef8 --- /dev/null +++ b/spec/jobs/auto_assignment/assignment_job_spec.rb @@ -0,0 +1,85 @@ +require 'rails_helper' + +RSpec.describe AutoAssignment::AssignmentJob, type: :job do + let(:account) { create(:account) } + let(:inbox) { create(:inbox, account: account, enable_auto_assignment: true) } + let(:agent) { create(:user, account: account, role: :agent, availability: :online) } + + before do + create(:inbox_member, inbox: inbox, user: agent) + end + + describe '#perform' do + context 'when inbox exists' do + context 'when auto assignment is enabled' do + it 'calls the assignment service' do + service = instance_double(AutoAssignment::AssignmentService) + allow(AutoAssignment::AssignmentService).to receive(:new).with(inbox: inbox).and_return(service) + expect(service).to receive(:perform_bulk_assignment).with(limit: 100).and_return(5) + + described_class.new.perform(inbox_id: inbox.id) + end + + it 'logs the assignment count' do + service = instance_double(AutoAssignment::AssignmentService) + allow(AutoAssignment::AssignmentService).to receive(:new).and_return(service) + allow(service).to receive(:perform_bulk_assignment).and_return(3) + + expect(Rails.logger).to receive(:info).with("Assigned 3 conversations for inbox #{inbox.id}") + + described_class.new.perform(inbox_id: inbox.id) + end + + it 'uses custom bulk limit from environment' do + allow(ENV).to receive(:fetch).with('AUTO_ASSIGNMENT_BULK_LIMIT', 100).and_return('50') + + service = instance_double(AutoAssignment::AssignmentService) + allow(AutoAssignment::AssignmentService).to receive(:new).with(inbox: inbox).and_return(service) + expect(service).to receive(:perform_bulk_assignment).with(limit: 50).and_return(2) + + described_class.new.perform(inbox_id: inbox.id) + end + end + + context 'when auto assignment is disabled' do + before { inbox.update!(enable_auto_assignment: false) } + + it 'calls the service which handles the disabled state' do + service = instance_double(AutoAssignment::AssignmentService) + allow(AutoAssignment::AssignmentService).to receive(:new).with(inbox: inbox).and_return(service) + expect(service).to receive(:perform_bulk_assignment).with(limit: 100).and_return(0) + + described_class.new.perform(inbox_id: inbox.id) + end + end + end + + context 'when inbox does not exist' do + it 'returns early without processing' do + expect(AutoAssignment::AssignmentService).not_to receive(:new) + + described_class.new.perform(inbox_id: 999_999) + end + end + + context 'when an error occurs' do + it 'logs the error and re-raises in test environment' do + service = instance_double(AutoAssignment::AssignmentService) + allow(AutoAssignment::AssignmentService).to receive(:new).and_return(service) + allow(service).to receive(:perform_bulk_assignment).and_raise(StandardError, 'Something went wrong') + + expect(Rails.logger).to receive(:error).with("Bulk assignment failed for inbox #{inbox.id}: Something went wrong") + + expect do + described_class.new.perform(inbox_id: inbox.id) + end.to raise_error(StandardError, 'Something went wrong') + end + end + end + + describe 'job configuration' do + it 'is queued in the default queue' do + expect(described_class.queue_name).to eq('default') + end + end +end diff --git a/spec/jobs/auto_assignment/periodic_assignment_job_spec.rb b/spec/jobs/auto_assignment/periodic_assignment_job_spec.rb new file mode 100644 index 000000000..4b06decd0 --- /dev/null +++ b/spec/jobs/auto_assignment/periodic_assignment_job_spec.rb @@ -0,0 +1,123 @@ +require 'rails_helper' + +RSpec.describe AutoAssignment::PeriodicAssignmentJob, type: :job do + let(:account) { create(:account) } + let(:inbox) { create(:inbox, account: account, enable_auto_assignment: true) } + let(:assignment_policy) { create(:assignment_policy, account: account) } + let(:inbox_assignment_policy) { create(:inbox_assignment_policy, inbox: inbox, assignment_policy: assignment_policy) } + let(:agent) { create(:user, account: account, role: :agent) } + + before do + create(:inbox_member, inbox: inbox, user: agent) + end + + describe '#perform' do + context 'when account has assignment_v2 feature enabled' do + before do + allow(account).to receive(:feature_enabled?).with('assignment_v2').and_return(true) + allow(Account).to receive(:find_in_batches).and_yield([account]) + end + + context 'when inbox has auto_assignment_v2 enabled' do + before do + allow(inbox).to receive(:auto_assignment_v2_enabled?).and_return(true) + inbox_relation = instance_double(ActiveRecord::Relation) + allow(account).to receive(:inboxes).and_return(inbox_relation) + allow(inbox_relation).to receive(:joins).with(:assignment_policy).and_return(inbox_relation) + allow(inbox_relation).to receive(:find_in_batches).and_yield([inbox]) + end + + it 'queues assignment job for eligible inboxes' do + inbox_assignment_policy # ensure it exists + expect(AutoAssignment::AssignmentJob).to receive(:perform_later).with(inbox_id: inbox.id) + + described_class.new.perform + end + + it 'processes multiple accounts' do + inbox_assignment_policy # ensure it exists + account2 = create(:account) + inbox2 = create(:inbox, account: account2, enable_auto_assignment: true) + policy2 = create(:assignment_policy, account: account2) + create(:inbox_assignment_policy, inbox: inbox2, assignment_policy: policy2) + + allow(account2).to receive(:feature_enabled?).with('assignment_v2').and_return(true) + allow(inbox2).to receive(:auto_assignment_v2_enabled?).and_return(true) + + inbox_relation2 = instance_double(ActiveRecord::Relation) + allow(account2).to receive(:inboxes).and_return(inbox_relation2) + allow(inbox_relation2).to receive(:joins).with(:assignment_policy).and_return(inbox_relation2) + allow(inbox_relation2).to receive(:find_in_batches).and_yield([inbox2]) + + allow(Account).to receive(:find_in_batches).and_yield([account]).and_yield([account2]) + + expect(AutoAssignment::AssignmentJob).to receive(:perform_later).with(inbox_id: inbox.id) + expect(AutoAssignment::AssignmentJob).to receive(:perform_later).with(inbox_id: inbox2.id) + + described_class.new.perform + end + end + + context 'when inbox does not have auto_assignment_v2 enabled' do + before do + allow(inbox).to receive(:auto_assignment_v2_enabled?).and_return(false) + end + + it 'does not queue assignment job' do + expect(AutoAssignment::AssignmentJob).not_to receive(:perform_later) + + described_class.new.perform + end + end + end + + context 'when account does not have assignment_v2 feature enabled' do + before do + allow(account).to receive(:feature_enabled?).with('assignment_v2').and_return(false) + allow(Account).to receive(:find_in_batches).and_yield([account]) + end + + it 'does not process the account' do + expect(AutoAssignment::AssignmentJob).not_to receive(:perform_later) + + described_class.new.perform + end + end + + context 'with batch processing' do + it 'processes accounts in batches' do + accounts = [] + # Create multiple accounts + 5.times do |_i| + acc = create(:account) + inb = create(:inbox, account: acc, enable_auto_assignment: true) + policy = create(:assignment_policy, account: acc) + create(:inbox_assignment_policy, inbox: inb, assignment_policy: policy) + allow(acc).to receive(:feature_enabled?).with('assignment_v2').and_return(true) + allow(inb).to receive(:auto_assignment_v2_enabled?).and_return(true) + + inbox_relation = instance_double(ActiveRecord::Relation) + allow(acc).to receive(:inboxes).and_return(inbox_relation) + allow(inbox_relation).to receive(:joins).with(:assignment_policy).and_return(inbox_relation) + allow(inbox_relation).to receive(:find_in_batches).and_yield([inb]) + + accounts << acc + end + + allow(Account).to receive(:find_in_batches) do |&block| + accounts.each { |acc| block.call([acc]) } + end + + expect(Account).to receive(:find_in_batches).and_call_original + + described_class.new.perform + end + end + end + + describe 'job configuration' do + it 'is queued in the scheduled_jobs queue' do + expect(described_class.queue_name).to eq('scheduled_jobs') + end + end +end diff --git a/spec/services/auto_assignment/assignment_service_spec.rb b/spec/services/auto_assignment/assignment_service_spec.rb new file mode 100644 index 000000000..535277714 --- /dev/null +++ b/spec/services/auto_assignment/assignment_service_spec.rb @@ -0,0 +1,310 @@ +require 'rails_helper' + +RSpec.describe AutoAssignment::AssignmentService do + let(:account) { create(:account) } + let(:assignment_policy) { create(:assignment_policy, account: account, enabled: true) } + let(:inbox) { create(:inbox, account: account, enable_auto_assignment: true) } + let(:service) { described_class.new(inbox: inbox) } + let(:agent) { create(:user, account: account, role: :agent, availability: :online) } + let(:agent2) { create(:user, account: account, role: :agent, availability: :online) } + let(:conversation) { create(:conversation, inbox: inbox, assignee: nil) } + + before do + # Enable assignment_v2 feature for the account + allow(account).to receive(:feature_enabled?).with('assignment_v2').and_return(true) + # Link inbox to assignment policy + create(:inbox_assignment_policy, inbox: inbox, assignment_policy: assignment_policy) + create(:inbox_member, inbox: inbox, user: agent) + end + + describe '#perform_bulk_assignment' do + context 'when auto assignment is enabled' do + let(:rate_limiter) { instance_double(AutoAssignment::RateLimiter) } + + before do + allow(OnlineStatusTracker).to receive(:get_available_users).and_return({ agent.id.to_s => 'online' }) + + # Mock RoundRobinSelector to return the agent + round_robin_selector = instance_double(AutoAssignment::RoundRobinSelector) + allow(AutoAssignment::RoundRobinSelector).to receive(:new).and_return(round_robin_selector) + allow(round_robin_selector).to receive(:select_agent).and_return(agent) + + # Mock RateLimiter to allow all assignments by default + allow(AutoAssignment::RateLimiter).to receive(:new).and_return(rate_limiter) + allow(rate_limiter).to receive(:within_limit?).and_return(true) + allow(rate_limiter).to receive(:track_assignment) + end + + it 'assigns conversations to available agents' do + # Create conversation and ensure it's unassigned + conv = create(:conversation, inbox: inbox, status: 'open') + conv.update!(assignee_id: nil) + + assigned_count = service.perform_bulk_assignment(limit: 1) + + expect(assigned_count).to eq(1) + expect(conv.reload.assignee).to eq(agent) + end + + it 'returns 0 when no agents are online' do + allow(OnlineStatusTracker).to receive(:get_available_users).and_return({}) + + assigned_count = service.perform_bulk_assignment(limit: 1) + + expect(assigned_count).to eq(0) + expect(conversation.reload.assignee).to be_nil + end + + it 'respects the limit parameter' do + 3.times do + conv = create(:conversation, inbox: inbox, status: 'open') + conv.update!(assignee_id: nil) + end + + assigned_count = service.perform_bulk_assignment(limit: 2) + + expect(assigned_count).to eq(2) + expect(inbox.conversations.unassigned.count).to eq(1) + end + + it 'only assigns open conversations' do + conversation # ensure it exists + conversation.update!(assignee_id: nil) + resolved_conversation = create(:conversation, inbox: inbox, status: 'resolved') + resolved_conversation.update!(assignee_id: nil) + + service.perform_bulk_assignment(limit: 10) + + expect(conversation.reload.assignee).to eq(agent) + expect(resolved_conversation.reload.assignee).to be_nil + end + + it 'does not reassign already assigned conversations' do + conversation # ensure it exists + conversation.update!(assignee_id: nil) + assigned_conversation = create(:conversation, inbox: inbox, assignee: agent) + unassigned_conversation = create(:conversation, inbox: inbox, status: 'open') + unassigned_conversation.update!(assignee_id: nil) + + assigned_count = service.perform_bulk_assignment(limit: 10) + + expect(assigned_count).to eq(2) # conversation + unassigned_conversation + expect(assigned_conversation.reload.assignee).to eq(agent) + expect(unassigned_conversation.reload.assignee).to eq(agent) + end + + it 'dispatches assignee changed event' do + conversation # ensure it exists + conversation.update!(assignee_id: nil) + + # The conversation model also dispatches a conversation.updated event + allow(Rails.configuration.dispatcher).to receive(:dispatch) + expect(Rails.configuration.dispatcher).to receive(:dispatch).with( + Events::Types::ASSIGNEE_CHANGED, + anything, + hash_including(conversation: conversation, user: agent) + ) + + service.perform_bulk_assignment(limit: 1) + end + end + + context 'when auto assignment is disabled' do + before { assignment_policy.update!(enabled: false) } + + it 'returns 0 without processing' do + assigned_count = service.perform_bulk_assignment(limit: 10) + + expect(assigned_count).to eq(0) + expect(conversation.reload.assignee).to be_nil + end + end + + context 'with conversation priority' do + let(:rate_limiter) { instance_double(AutoAssignment::RateLimiter) } + + before do + allow(OnlineStatusTracker).to receive(:get_available_users).and_return({ agent.id.to_s => 'online' }) + + # Mock RoundRobinSelector to return the agent + round_robin_selector = instance_double(AutoAssignment::RoundRobinSelector) + allow(AutoAssignment::RoundRobinSelector).to receive(:new).and_return(round_robin_selector) + allow(round_robin_selector).to receive(:select_agent).and_return(agent) + + # Mock RateLimiter to allow all assignments by default + allow(AutoAssignment::RateLimiter).to receive(:new).and_return(rate_limiter) + allow(rate_limiter).to receive(:within_limit?).and_return(true) + allow(rate_limiter).to receive(:track_assignment) + end + + context 'when priority is longest_waiting' do + before do + allow(inbox).to receive(:auto_assignment_config).and_return({ 'conversation_priority' => 'longest_waiting' }) + end + + it 'assigns conversations with oldest last_activity_at first' do + old_conversation = create(:conversation, + inbox: inbox, + status: 'open', + created_at: 2.hours.ago, + last_activity_at: 2.hours.ago) + old_conversation.update!(assignee_id: nil) + new_conversation = create(:conversation, + inbox: inbox, + status: 'open', + created_at: 1.hour.ago, + last_activity_at: 1.hour.ago) + new_conversation.update!(assignee_id: nil) + + service.perform_bulk_assignment(limit: 1) + + expect(old_conversation.reload.assignee).to eq(agent) + expect(new_conversation.reload.assignee).to be_nil + end + end + + context 'when priority is default' do + it 'assigns conversations by created_at' do + old_conversation = create(:conversation, inbox: inbox, status: 'open', created_at: 2.hours.ago) + old_conversation.update!(assignee_id: nil) + new_conversation = create(:conversation, inbox: inbox, status: 'open', created_at: 1.hour.ago) + new_conversation.update!(assignee_id: nil) + + service.perform_bulk_assignment(limit: 1) + + expect(old_conversation.reload.assignee).to eq(agent) + expect(new_conversation.reload.assignee).to be_nil + end + end + end + + context 'with fair distribution' do + before do + create(:inbox_member, inbox: inbox, user: agent2) + allow(OnlineStatusTracker).to receive(:get_available_users).and_return({ + agent.id.to_s => 'online', + agent2.id.to_s => 'online' + }) + end + + context 'when fair distribution is enabled' do + before do + allow(inbox).to receive(:auto_assignment_config).and_return({ + 'fair_distribution_limit' => 2, + 'fair_distribution_window' => 3600 + }) + end + + it 'respects the assignment limit per agent' do + # Mock RoundRobinSelector to select agent2 + round_robin_selector = instance_double(AutoAssignment::RoundRobinSelector) + allow(AutoAssignment::RoundRobinSelector).to receive(:new).and_return(round_robin_selector) + allow(round_robin_selector).to receive(:select_agent).and_return(agent2) + + # Mock agent1 at limit, agent2 not at limit + agent1_limiter = instance_double(AutoAssignment::RateLimiter) + agent2_limiter = instance_double(AutoAssignment::RateLimiter) + + allow(AutoAssignment::RateLimiter).to receive(:new).with(inbox: inbox, agent: agent).and_return(agent1_limiter) + allow(AutoAssignment::RateLimiter).to receive(:new).with(inbox: inbox, agent: agent2).and_return(agent2_limiter) + + allow(agent1_limiter).to receive(:within_limit?).and_return(false) + allow(agent2_limiter).to receive(:within_limit?).and_return(true) + allow(agent2_limiter).to receive(:track_assignment) + + unassigned_conversation = create(:conversation, inbox: inbox, status: 'open') + unassigned_conversation.update!(assignee_id: nil) + + service.perform_bulk_assignment(limit: 1) + + expect(unassigned_conversation.reload.assignee).to eq(agent2) + end + + it 'tracks assignments in Redis' do + conversation # ensure it exists + conversation.update!(assignee_id: nil) + + # Mock RoundRobinSelector + round_robin_selector = instance_double(AutoAssignment::RoundRobinSelector) + allow(AutoAssignment::RoundRobinSelector).to receive(:new).and_return(round_robin_selector) + allow(round_robin_selector).to receive(:select_agent).and_return(agent) + + limiter = instance_double(AutoAssignment::RateLimiter) + allow(AutoAssignment::RateLimiter).to receive(:new).and_return(limiter) + allow(limiter).to receive(:within_limit?).and_return(true) + expect(limiter).to receive(:track_assignment) + + service.perform_bulk_assignment(limit: 1) + end + + it 'allows assignments after window expires' do + # Mock RoundRobinSelector + round_robin_selector = instance_double(AutoAssignment::RoundRobinSelector) + allow(AutoAssignment::RoundRobinSelector).to receive(:new).and_return(round_robin_selector) + allow(round_robin_selector).to receive(:select_agent).and_return(agent, agent2) + + # Mock RateLimiter to allow all + limiter = instance_double(AutoAssignment::RateLimiter) + allow(AutoAssignment::RateLimiter).to receive(:new).and_return(limiter) + allow(limiter).to receive(:within_limit?).and_return(true) + allow(limiter).to receive(:track_assignment) + + # Simulate time passing for rate limit window + freeze_time do + 2.times do + conversation_new = create(:conversation, inbox: inbox, status: 'open') + conversation_new.update!(assignee_id: nil) + service.perform_bulk_assignment(limit: 1) + expect(conversation_new.reload.assignee).not_to be_nil + end + end + + # Move forward past the window + travel_to(2.hours.from_now) do + new_conversation = create(:conversation, inbox: inbox, status: 'open') + new_conversation.update!(assignee_id: nil) + service.perform_bulk_assignment(limit: 1) + expect(new_conversation.reload.assignee).not_to be_nil + end + end + end + + context 'when fair distribution is disabled' do + it 'assigns without rate limiting' do + 5.times do + conv = create(:conversation, inbox: inbox, status: 'open') + conv.update!(assignee_id: nil) + end + + # Mock RoundRobinSelector + round_robin_selector = instance_double(AutoAssignment::RoundRobinSelector) + allow(AutoAssignment::RoundRobinSelector).to receive(:new).and_return(round_robin_selector) + allow(round_robin_selector).to receive(:select_agent).and_return(agent) + + # Mock RateLimiter to allow all + limiter = instance_double(AutoAssignment::RateLimiter) + allow(AutoAssignment::RateLimiter).to receive(:new).and_return(limiter) + allow(limiter).to receive(:within_limit?).and_return(true) + allow(limiter).to receive(:track_assignment) + + assigned_count = service.perform_bulk_assignment(limit: 5) + expect(assigned_count).to eq(5) + end + end + + context 'with round robin assignment' do + it 'distributes conversations evenly among agents' do + conversations = Array.new(4) { create(:conversation, inbox: inbox, assignee: nil) } + + service.perform_bulk_assignment(limit: 4) + + agent1_count = conversations.count { |c| c.reload.assignee == agent } + agent2_count = conversations.count { |c| c.reload.assignee == agent2 } + + # Should be distributed evenly (2 each) or close to even (3 and 1) + expect([agent1_count, agent2_count].sort).to eq([2, 2]).or(eq([1, 3])) + end + end + end + end +end diff --git a/spec/services/auto_assignment/rate_limiter_spec.rb b/spec/services/auto_assignment/rate_limiter_spec.rb new file mode 100644 index 000000000..48a5367e3 --- /dev/null +++ b/spec/services/auto_assignment/rate_limiter_spec.rb @@ -0,0 +1,167 @@ +require 'rails_helper' + +RSpec.describe AutoAssignment::RateLimiter do + # Stub Math methods for testing when assignment_policy is nil + # rubocop:disable RSpec/BeforeAfterAll, RSpec/InstanceVariable + before(:all) do + @math_had_positive = Math.respond_to?(:positive?) + Math.define_singleton_method(:positive?) { false } unless @math_had_positive + end + + after(:all) do + Math.singleton_class.send(:remove_method, :positive?) unless @math_had_positive + end + # rubocop:enable RSpec/BeforeAfterAll, RSpec/InstanceVariable + + let(:account) { create(:account) } + let(:inbox) { create(:inbox, account: account) } + let(:agent) { create(:user, account: account, role: :agent) } + let(:conversation) { create(:conversation, inbox: inbox) } + let(:rate_limiter) { described_class.new(inbox: inbox, agent: agent) } + + describe '#within_limit?' do + context 'when rate limiting is not enabled' do + before do + allow(inbox).to receive(:assignment_policy).and_return(nil) + end + + it 'returns true' do + expect(rate_limiter.within_limit?).to be true + end + end + + context 'when rate limiting is enabled' do + let(:assignment_policy) do + instance_double(AssignmentPolicy, + fair_distribution_limit: 5, + fair_distribution_window: 3600) + end + + before do + allow(inbox).to receive(:assignment_policy).and_return(assignment_policy) + end + + it 'returns true when under the limit' do + allow(rate_limiter).to receive(:current_count).and_return(3) + expect(rate_limiter.within_limit?).to be true + end + + it 'returns false when at or over the limit' do + allow(rate_limiter).to receive(:current_count).and_return(5) + expect(rate_limiter.within_limit?).to be false + end + end + end + + describe '#track_assignment' do + context 'when rate limiting is not enabled' do + before do + allow(inbox).to receive(:assignment_policy).and_return(nil) + end + + it 'does not track the assignment' do + expect(Redis::Alfred).not_to receive(:set) + rate_limiter.track_assignment(conversation) + end + end + + context 'when rate limiting is enabled' do + let(:assignment_policy) do + instance_double(AssignmentPolicy, + fair_distribution_limit: 5, + fair_distribution_window: 3600) + end + + before do + allow(inbox).to receive(:assignment_policy).and_return(assignment_policy) + end + + it 'creates a Redis key with correct expiry' do + expected_key = format(Redis::RedisKeys::ASSIGNMENT_KEY, inbox_id: inbox.id, agent_id: agent.id, conversation_id: conversation.id) + expect(Redis::Alfred).to receive(:set).with( + expected_key, + conversation.id.to_s, + ex: 3600 + ) + rate_limiter.track_assignment(conversation) + end + end + end + + describe '#current_count' do + context 'when rate limiting is not enabled' do + before do + allow(inbox).to receive(:assignment_policy).and_return(nil) + end + + it 'returns 0' do + expect(rate_limiter.current_count).to eq(0) + end + end + + context 'when rate limiting is enabled' do + let(:assignment_policy) do + instance_double(AssignmentPolicy, + fair_distribution_limit: 5, + fair_distribution_window: 3600) + end + + before do + allow(inbox).to receive(:assignment_policy).and_return(assignment_policy) + end + + it 'counts matching Redis keys' do + pattern = format(Redis::RedisKeys::ASSIGNMENT_KEY_PATTERN, inbox_id: inbox.id, agent_id: agent.id) + allow(Redis::Alfred).to receive(:keys_count).with(pattern).and_return(3) + + expect(rate_limiter.current_count).to eq(3) + end + end + end + + describe 'configuration' do + context 'with custom window' do + let(:assignment_policy) do + instance_double(AssignmentPolicy, + fair_distribution_limit: 10, + fair_distribution_window: 7200) + end + + before do + allow(inbox).to receive(:assignment_policy).and_return(assignment_policy) + end + + it 'uses the custom window value' do + expected_key = format(Redis::RedisKeys::ASSIGNMENT_KEY, inbox_id: inbox.id, agent_id: agent.id, conversation_id: conversation.id) + expect(Redis::Alfred).to receive(:set).with( + expected_key, + conversation.id.to_s, + ex: 7200 + ) + rate_limiter.track_assignment(conversation) + end + end + + context 'without custom window' do + let(:assignment_policy) do + instance_double(AssignmentPolicy, + fair_distribution_limit: 10, + fair_distribution_window: nil) + end + + before do + allow(inbox).to receive(:assignment_policy).and_return(assignment_policy) + end + + it 'uses the default window value of 24 hours' do + expected_key = format(Redis::RedisKeys::ASSIGNMENT_KEY, inbox_id: inbox.id, agent_id: agent.id, conversation_id: conversation.id) + expect(Redis::Alfred).to receive(:set).with( + expected_key, + conversation.id.to_s, + ex: 86_400 + ) + rate_limiter.track_assignment(conversation) + end + end + end +end diff --git a/spec/services/auto_assignment/round_robin_selector_spec.rb b/spec/services/auto_assignment/round_robin_selector_spec.rb new file mode 100644 index 000000000..05c1dcd73 --- /dev/null +++ b/spec/services/auto_assignment/round_robin_selector_spec.rb @@ -0,0 +1,78 @@ +require 'rails_helper' + +RSpec.describe AutoAssignment::RoundRobinSelector do + let(:account) { create(:account) } + let(:inbox) { create(:inbox, account: account) } + let(:selector) { described_class.new(inbox: inbox) } + let(:agent1) { create(:user, account: account, role: :agent, availability: :online) } + let(:agent2) { create(:user, account: account, role: :agent, availability: :online) } + let(:agent3) { create(:user, account: account, role: :agent, availability: :online) } + + let(:round_robin_service) { instance_double(AutoAssignment::InboxRoundRobinService) } + + let(:member1) do + allow(AutoAssignment::InboxRoundRobinService).to receive(:new).and_return(round_robin_service) + allow(round_robin_service).to receive(:add_agent_to_queue) + create(:inbox_member, inbox: inbox, user: agent1) + end + + let(:member2) do + allow(AutoAssignment::InboxRoundRobinService).to receive(:new).and_return(round_robin_service) + allow(round_robin_service).to receive(:add_agent_to_queue) + create(:inbox_member, inbox: inbox, user: agent2) + end + + let(:member3) do + allow(AutoAssignment::InboxRoundRobinService).to receive(:new).and_return(round_robin_service) + allow(round_robin_service).to receive(:add_agent_to_queue) + create(:inbox_member, inbox: inbox, user: agent3) + end + + before do + # Mock the round robin service to avoid Redis calls + allow(AutoAssignment::InboxRoundRobinService).to receive(:new).and_return(round_robin_service) + allow(round_robin_service).to receive(:add_agent_to_queue) + allow(round_robin_service).to receive(:reset_queue) + allow(round_robin_service).to receive(:validate_queue?).and_return(true) + end + + describe '#select_agent' do + context 'when agents are available' do + let(:available_agents) { [member1, member2, member3] } + + it 'returns an agent from the available list' do + allow(round_robin_service).to receive(:available_agent).and_return(agent1) + + selected_agent = selector.select_agent(available_agents) + + expect(selected_agent).not_to be_nil + expect([agent1, agent2, agent3]).to include(selected_agent) + end + + it 'uses round robin service for selection' do + expect(round_robin_service).to receive(:available_agent).with( + allowed_agent_ids: [agent1.id.to_s, agent2.id.to_s, agent3.id.to_s] + ).and_return(agent1) + + selected_agent = selector.select_agent(available_agents) + expect(selected_agent).to eq(agent1) + end + end + + context 'when no agents are available' do + it 'returns nil' do + selected_agent = selector.select_agent([]) + expect(selected_agent).to be_nil + end + end + + context 'when one agent is available' do + it 'returns that agent' do + allow(round_robin_service).to receive(:available_agent).and_return(agent1) + + selected_agent = selector.select_agent([member1]) + expect(selected_agent).to eq(agent1) + end + end + end +end