From 753d30d0dddcef25cdffcaede5110a1e3468769c Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 6 Nov 2026 05:43:12 +0000 Subject: [PATCH] i18n(plugin-sharing): ship the assignment rule object in all eleven platform languages sys_assignment_rule (added by #30760) joins the package's extract config, so its en leaves are generated and check:i18n covers it. Its 30 leaves (label, plural label, description, field labels and help, the recipient and strategy options, the By Object view) are translated in zh-CN, ja-JP, es-ES, zh-Hant, ar, fr, pt-BR, ru, de and ko. The recipient options reuse each locale's existing words for Queue and User, so the recipient-vocabulary consistency test holds across the queue, sharing and assignment-rule objects. Native words equal to English (fr Description, Condition; de Name) are recorded by the extractor as source copies. Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_016WV4cya5ej5GQV86RPbRPK --- ...-plugin-sharing-assignment-rule-locales.md | 10 +++ .../scripts/i18n-extract.config.ts | 4 +- .../src/translations/ar.objects.generated.ts | 66 +++++++++++++++++++ .../src/translations/bundle-ownership.test.ts | 1 + .../src/translations/de.objects.generated.ts | 66 +++++++++++++++++++ .../de.source-hashes.generated.ts | 1 + .../src/translations/en.objects.generated.ts | 66 +++++++++++++++++++ .../translations/es-ES.objects.generated.ts | 66 +++++++++++++++++++ .../src/translations/fr.objects.generated.ts | 66 +++++++++++++++++++ .../fr.source-hashes.generated.ts | 2 + .../translations/ja-JP.objects.generated.ts | 66 +++++++++++++++++++ .../src/translations/ko.objects.generated.ts | 66 +++++++++++++++++++ .../translations/pt-BR.objects.generated.ts | 66 +++++++++++++++++++ .../src/translations/ru.objects.generated.ts | 66 +++++++++++++++++++ .../translations/zh-CN.objects.generated.ts | 66 +++++++++++++++++++ .../translations/zh-Hant.objects.generated.ts | 66 +++++++++++++++++++ 16 files changed, 742 insertions(+), 2 deletions(-) create mode 100644 .changeset/30512-plugin-sharing-assignment-rule-locales.md diff --git a/.changeset/30512-plugin-sharing-assignment-rule-locales.md b/.changeset/30512-plugin-sharing-assignment-rule-locales.md new file mode 100644 index 00000000000..046558185c2 --- /dev/null +++ b/.changeset/30512-plugin-sharing-assignment-rule-locales.md @@ -0,0 +1,10 @@ +--- +'@objectstack/plugin-sharing': patch +--- + +i18n(plugin-sharing): the assignment rule object ships in all eleven platform languages + +Clause-②: no +Metadata-protocol: none + +`sys_assignment_rule`, the object an organization authors its own assignment rules in, now carries its label, description, field labels and help, option labels and its "By Object" view name in `zh-CN`, `ja-JP`, `es-ES`, `zh-Hant`, `ar`, `fr`, `pt-BR`, `ru`, `de` and `ko`, so an administrator in any platform language reads Setup → Assignment Rules in their own language instead of English. The object is now listed in the package's extract config, so the existing `check:i18n` bundle check covers it. Its recipient options read the same words as the queue and sharing objects in each language. Part of #30512. diff --git a/packages/plugins/plugin-sharing/scripts/i18n-extract.config.ts b/packages/plugins/plugin-sharing/scripts/i18n-extract.config.ts index 7d1d3de8465..a3588c78646 100644 --- a/packages/plugins/plugin-sharing/scripts/i18n-extract.config.ts +++ b/packages/plugins/plugin-sharing/scripts/i18n-extract.config.ts @@ -43,7 +43,7 @@ */ import { defineStack, type ObjectStackDefinition } from '@objectstack/spec'; -import { SysRecordShare, SysSharingRule, SysShareLink, SysQueue, SysQueueMember } from '../src/objects/index.js'; +import { SysRecordShare, SysSharingRule, SysShareLink, SysQueue, SysQueueMember, SysAssignmentRule } from '../src/objects/index.js'; import { enObjects } from '../src/translations/en.objects.generated.js'; import { zhCNObjects } from '../src/translations/zh-CN.objects.generated.js'; import { jaJPObjects } from '../src/translations/ja-JP.objects.generated.js'; @@ -73,7 +73,7 @@ import { sharingPageTranslations } from '../src/translations/pages.js'; * precision: the annotated type is the function's own return type. */ const config: ObjectStackDefinition = defineStack({ - objects: [SysRecordShare, SysSharingRule, SysShareLink, SysQueue, SysQueueMember] as any, + objects: [SysRecordShare, SysSharingRule, SysShareLink, SysQueue, SysQueueMember, SysAssignmentRule] as any, pages: [SysQueueDetailPage], translations: [ { en: { objects: enObjects, pages: sharingPageTranslations.en } }, diff --git a/packages/plugins/plugin-sharing/src/translations/ar.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/ar.objects.generated.ts index 1e2d855a43d..139511643f2 100644 --- a/packages/plugins/plugin-sharing/src/translations/ar.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/ar.objects.generated.ts @@ -343,5 +343,71 @@ export const arObjects: NonNullable = { label: "حسب قائمة الانتظار" } } + }, + sys_assignment_rule: { + label: "قاعدة الإسناد", + pluralLabel: "قواعد الإسناد", + description: "ترسل كل سجل جديد يطابق شرطًا إلى قائمة انتظار أو إلى شخص.", + fields: { + organization_id: { + label: "المؤسسة", + help: "المؤسسة التي تنتمي إليها هذه القاعدة." + }, + name: { + label: "الاسم", + help: "يعرّف القاعدة. أحرف لاتينية صغيرة وأرقام وشرطات سفلية فقط، ولا يجوز أن يكون اسم قاعدة يوفرها تطبيق مثبّت." + }, + label: { + label: "التسمية المعروضة" + }, + description: { + label: "الوصف" + }, + object_name: { + label: "الكائن", + help: "الكائن الذي ترسل هذه القاعدة سجلاته الجديدة. لا يمكن الإسناد إلا في الكائنات التي لسجلاتها مالك." + }, + criteria: { + label: "الشرط", + help: "السجلات الجديدة التي تأخذها هذه القاعدة؛ اتركه فارغًا لتأخذ كل سجل جديد لم تأخذه قاعدة سابقة. يُكتب تعبيرًا على السجل، مثل record.priority == \"high\"." + }, + sort_order: { + label: "الترتيب", + help: "عندما يمكن لأكثر من قاعدة من قواعدك أن تأخذ السجل نفسه، تُجرَّب القاعدة ذات الترتيب الأدنى أولًا. تُجرَّب قواعدك دائمًا قبل القواعد التي توفرها التطبيقات المثبّتة." + }, + recipient_type: { + label: "الإسناد إلى", + help: "أرسل السجل إلى قائمة انتظار يمكن لأعضائها أخذه، أو مباشرة إلى شخص واحد.", + options: { + queue: "قائمة الانتظار", + user: "المستخدم" + } + }, + recipient_id: { + label: "قائمة الانتظار أو المستخدم", + help: "قائمة الانتظار أو الشخص الذي يذهب إليه السجل. يجب أن يكون الشخص عضوًا نشطًا في هذه المؤسسة." + }, + strategy: { + label: "اختيار عضو", + help: "لقائمة انتظار: أعطِ السجل مباشرة لعضو واحد، بالتناوب أو باختيار من لديه أقل عمل مفتوح. اتركه فارغًا لإبقاء السجل في قائمة الانتظار حتى يأخذه عضو.", + options: { + round_robin: "بالتناوب", + least_loaded: "الأقل عبئًا" + } + }, + load: { + label: "العمل المفتوح", + help: "مطلوب مع «الأقل عبئًا»: السجلات التي تُحتسب عملًا مفتوحًا للعضو، ويُكتب تعبيرًا على السجل، مثل record.status != \"closed\"." + }, + active: { + label: "نشِط", + help: "أوقفه لتتوقف هذه القاعدة عن إسناد السجلات الجديدة دون حذفها." + } + }, + _views: { + by_object: { + label: "حسب الكائن" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/bundle-ownership.test.ts b/packages/plugins/plugin-sharing/src/translations/bundle-ownership.test.ts index 093c2ddd0f1..9d7cd142600 100644 --- a/packages/plugins/plugin-sharing/src/translations/bundle-ownership.test.ts +++ b/packages/plugins/plugin-sharing/src/translations/bundle-ownership.test.ts @@ -22,6 +22,7 @@ const OWNED_OBJECTS = new Set([ 'sys_share_link', 'sys_queue', 'sys_queue_member', + 'sys_assignment_rule', ]); describe('objects translation bundle ownership (ADR-0029 D8)', () => { diff --git a/packages/plugins/plugin-sharing/src/translations/de.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/de.objects.generated.ts index 30965e449a5..b9805494d4e 100644 --- a/packages/plugins/plugin-sharing/src/translations/de.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/de.objects.generated.ts @@ -343,5 +343,71 @@ export const deObjects: NonNullable = { label: "Nach Warteschlange" } } + }, + sys_assignment_rule: { + label: "Zuweisungsregel", + pluralLabel: "Zuweisungsregeln", + description: "Sendet jeden neuen Datensatz, der eine Bedingung erfüllt, an eine Warteschlange oder an eine Person.", + fields: { + organization_id: { + label: "Organisation", + help: "Die Organisation, zu der diese Regel gehört." + }, + name: { + label: "Name", + help: "Kennzeichnet die Regel. Nur Kleinbuchstaben, Ziffern und Unterstriche, und nicht der Name einer Regel, die eine installierte App bereitstellt." + }, + label: { + label: "Anzeigebezeichnung" + }, + description: { + label: "Beschreibung" + }, + object_name: { + label: "Objekt", + help: "Das Objekt, dessen neue Datensätze diese Regel weiterleitet. Zuweisen lassen sich nur Objekte, deren Datensätze einen Besitzer haben." + }, + criteria: { + label: "Bedingung", + help: "Welche neuen Datensätze diese Regel übernimmt; leer lassen, um jeden neuen Datensatz zu übernehmen, den keine frühere Regel übernommen hat. Geschrieben als Ausdruck über den Datensatz, zum Beispiel record.priority == \"high\"." + }, + sort_order: { + label: "Reihenfolge", + help: "Wenn mehrere Ihrer Regeln denselben Datensatz übernehmen könnten, wird die mit der niedrigsten Reihenfolge zuerst versucht. Ihre Regeln werden immer vor den Regeln installierter Apps versucht." + }, + recipient_type: { + label: "Zuweisen an", + help: "Sendet den Datensatz an eine Warteschlange, aus der ihre Mitglieder ihn übernehmen können, oder direkt an eine Person.", + options: { + queue: "Warteschlange", + user: "Benutzer" + } + }, + recipient_id: { + label: "Warteschlange oder Benutzer", + help: "Die Warteschlange oder die Person, an die der Datensatz geht. Eine Person muss ein aktives Mitglied dieser Organisation sein." + }, + strategy: { + label: "Mitglied auswählen", + help: "Für eine Warteschlange: gibt den Datensatz direkt einem Mitglied, reihum oder dem Mitglied mit der wenigsten offenen Arbeit. Leer lassen, damit der Datensatz in der Warteschlange bleibt, bis ein Mitglied ihn übernimmt.", + options: { + round_robin: "Reihum", + least_loaded: "Geringste Auslastung" + } + }, + load: { + label: "Offene Arbeit", + help: "Erforderlich bei „Geringste Auslastung“: welche Datensätze als offene Arbeit eines Mitglieds zählen, geschrieben als Ausdruck über den Datensatz, zum Beispiel record.status != \"closed\"." + }, + active: { + label: "Aktiv", + help: "Ausschalten, damit diese Regel keine neuen Datensätze mehr zuweist, ohne sie zu löschen." + } + }, + _views: { + by_object: { + label: "Nach Objekt" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/de.source-hashes.generated.ts b/packages/plugins/plugin-sharing/src/translations/de.source-hashes.generated.ts index 9616e0665f1..ec9323b52aa 100644 --- a/packages/plugins/plugin-sharing/src/translations/de.source-hashes.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/de.source-hashes.generated.ts @@ -18,6 +18,7 @@ */ export const deGeneratedSourceHashes: Readonly> = { + "objects.sys_assignment_rule.fields.name.label": "5274417ff1ccaf01", "objects.sys_queue.fields.name.label": "5274417ff1ccaf01", "objects.sys_queue_member.fields.recipient_type.options.position": "9a24c02e441eb0b4", "objects.sys_queue_member.fields.recipient_type.options.team": "42b87165ac826b2b", diff --git a/packages/plugins/plugin-sharing/src/translations/en.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/en.objects.generated.ts index a8487c1c091..5f8c2f2c20b 100644 --- a/packages/plugins/plugin-sharing/src/translations/en.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/en.objects.generated.ts @@ -343,5 +343,71 @@ export const enObjects: NonNullable = { label: "By Queue" } } + }, + sys_assignment_rule: { + label: "Assignment Rule", + pluralLabel: "Assignment Rules", + description: "Sends each new record that matches a condition to a queue or a person.", + fields: { + organization_id: { + label: "Organization", + help: "The organization this rule belongs to." + }, + name: { + label: "Name", + help: "Identifies the rule. Lowercase letters, digits and underscores only, and not the name of a rule an installed app provides." + }, + label: { + label: "Display Label" + }, + description: { + label: "Description" + }, + object_name: { + label: "Object", + help: "The object whose new records this rule sends somewhere. Only objects whose records have an owner can be assigned." + }, + criteria: { + label: "Condition", + help: "Which new records this rule takes; leave it empty to take every new record that no earlier rule took. Written as an expression over the record — for example record.priority == \"high\"." + }, + sort_order: { + label: "Order", + help: "When several of your rules could take the same record, the one with the lowest order is tried first. Your rules are always tried before the rules installed apps provide." + }, + recipient_type: { + label: "Assign To", + help: "Send the record to a queue, where its members can take it, or straight to one person.", + options: { + queue: "Queue", + user: "User" + } + }, + recipient_id: { + label: "Queue or User", + help: "The queue, or the person, the record goes to. A person must be an active member of this organization." + }, + strategy: { + label: "Pick a Member", + help: "For a queue: give the record straight to one member, taking turns or choosing whoever has the least open work. Leave it empty to leave the record in the queue until a member takes it.", + options: { + round_robin: "Round robin", + least_loaded: "Least loaded" + } + }, + load: { + label: "Open Work", + help: "Required for \"Least loaded\": which records count as a member's open work, written as an expression over the record — for example record.status != \"closed\"." + }, + active: { + label: "Active", + help: "Turn off to stop this rule from assigning new records, without deleting it." + } + }, + _views: { + by_object: { + label: "By Object" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/es-ES.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/es-ES.objects.generated.ts index 264ebe62ac6..1d457bb93e6 100644 --- a/packages/plugins/plugin-sharing/src/translations/es-ES.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/es-ES.objects.generated.ts @@ -343,5 +343,71 @@ export const esESObjects: NonNullable = { label: "By Queue" } } + }, + sys_assignment_rule: { + label: "Regla de asignación", + pluralLabel: "Reglas de asignación", + description: "Envía cada registro nuevo que cumple una condición a una cola o a una persona.", + fields: { + organization_id: { + label: "Organización", + help: "La organización a la que pertenece esta regla." + }, + name: { + label: "Nombre", + help: "Identifica la regla. Solo letras minúsculas, dígitos y guiones bajos, y no puede ser el nombre de una regla que proporcione una aplicación instalada." + }, + label: { + label: "Nombre visible" + }, + description: { + label: "Descripción" + }, + object_name: { + label: "Objeto", + help: "El objeto cuyos registros nuevos envía esta regla. Solo se pueden asignar los objetos cuyos registros tienen propietario." + }, + criteria: { + label: "Condición", + help: "Qué registros nuevos toma esta regla; déjela vacía para tomar todos los registros nuevos que ninguna regla anterior haya tomado. Se escribe como una expresión sobre el registro, por ejemplo record.priority == \"high\"." + }, + sort_order: { + label: "Orden", + help: "Cuando varias de sus reglas pueden tomar el mismo registro, se prueba primero la de menor orden. Sus reglas siempre se prueban antes que las que proporcionan las aplicaciones instaladas." + }, + recipient_type: { + label: "Asignar a", + help: "Envía el registro a una cola, donde sus miembros pueden tomarlo, o directamente a una persona.", + options: { + queue: "Cola", + user: "Usuario" + } + }, + recipient_id: { + label: "Cola o usuario", + help: "La cola, o la persona, a la que va el registro. Una persona debe ser un miembro activo de esta organización." + }, + strategy: { + label: "Elegir un miembro", + help: "Para una cola: entrega el registro directamente a un miembro, por turnos o eligiendo a quien tenga menos trabajo abierto. Déjelo vacío para que el registro permanezca en la cola hasta que un miembro lo tome.", + options: { + round_robin: "Por turnos", + least_loaded: "Menor carga" + } + }, + load: { + label: "Trabajo abierto", + help: "Obligatorio con «Menor carga»: qué registros cuentan como trabajo abierto de un miembro, escrito como una expresión sobre el registro, por ejemplo record.status != \"closed\"." + }, + active: { + label: "Activo", + help: "Desactívela para que esta regla deje de asignar registros nuevos, sin eliminarla." + } + }, + _views: { + by_object: { + label: "Por objeto" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/fr.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/fr.objects.generated.ts index 20f02b8fcfc..80110030e8e 100644 --- a/packages/plugins/plugin-sharing/src/translations/fr.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/fr.objects.generated.ts @@ -343,5 +343,71 @@ export const frObjects: NonNullable = { label: "Par file d’attente" } } + }, + sys_assignment_rule: { + label: "Règle d’attribution", + pluralLabel: "Règles d’attribution", + description: "Envoie chaque nouvel enregistrement qui remplit une condition à une file d’attente ou à une personne.", + fields: { + organization_id: { + label: "Organisation", + help: "L’organisation à laquelle appartient cette règle." + }, + name: { + label: "Nom", + help: "Identifie la règle. Lettres minuscules, chiffres et traits de soulignement uniquement, et pas le nom d’une règle fournie par une application installée." + }, + label: { + label: "Libellé affiché" + }, + description: { + label: "Description" + }, + object_name: { + label: "Objet", + help: "L’objet dont cette règle envoie les nouveaux enregistrements. Seuls les objets dont les enregistrements ont un propriétaire peuvent être attribués." + }, + criteria: { + label: "Condition", + help: "Les nouveaux enregistrements que prend cette règle ; laissez vide pour prendre chaque nouvel enregistrement qu’aucune règle précédente n’a pris. S’écrit comme une expression sur l’enregistrement, par exemple record.priority == \"high\"." + }, + sort_order: { + label: "Ordre", + help: "Lorsque plusieurs de vos règles pourraient prendre le même enregistrement, celle dont l’ordre est le plus bas est essayée en premier. Vos règles sont toujours essayées avant celles des applications installées." + }, + recipient_type: { + label: "Attribuer à", + help: "Envoie l’enregistrement à une file d’attente, où ses membres peuvent le prendre, ou directement à une personne.", + options: { + queue: "File d’attente", + user: "Utilisateur" + } + }, + recipient_id: { + label: "File d’attente ou utilisateur", + help: "La file d’attente, ou la personne, à qui va l’enregistrement. Une personne doit être un membre actif de cette organisation." + }, + strategy: { + label: "Choisir un membre", + help: "Pour une file d’attente : remet l’enregistrement directement à un membre, à tour de rôle ou à celui qui a le moins de travail en cours. Laissez vide pour laisser l’enregistrement dans la file d’attente jusqu’à ce qu’un membre le prenne.", + options: { + round_robin: "À tour de rôle", + least_loaded: "Moins chargé" + } + }, + load: { + label: "Travail en cours", + help: "Obligatoire avec « Moins chargé » : les enregistrements qui comptent comme travail en cours d’un membre, écrits comme une expression sur l’enregistrement, par exemple record.status != \"closed\"." + }, + active: { + label: "Actif", + help: "Désactivez-la pour que cette règle cesse d’attribuer les nouveaux enregistrements, sans la supprimer." + } + }, + _views: { + by_object: { + label: "Par objet" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/fr.source-hashes.generated.ts b/packages/plugins/plugin-sharing/src/translations/fr.source-hashes.generated.ts index ec4f07b8668..cfe257240fd 100644 --- a/packages/plugins/plugin-sharing/src/translations/fr.source-hashes.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/fr.source-hashes.generated.ts @@ -18,6 +18,8 @@ */ export const frGeneratedSourceHashes: Readonly> = { + "objects.sys_assignment_rule.fields.criteria.label": "bfcca3fe6f93b90c", + "objects.sys_assignment_rule.fields.description.label": "779a4342c8eb6707", "objects.sys_queue.fields.description.label": "779a4342c8eb6707", "objects.sys_record_share.fields.source.label": "8fe786e8e29c8cec", "objects.sys_share_link.fields.audience.label": "6530e0148b77428f", diff --git a/packages/plugins/plugin-sharing/src/translations/ja-JP.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/ja-JP.objects.generated.ts index 47d14b78cb0..022eea80a65 100644 --- a/packages/plugins/plugin-sharing/src/translations/ja-JP.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/ja-JP.objects.generated.ts @@ -343,5 +343,71 @@ export const jaJPObjects: NonNullable = { label: "By Queue" } } + }, + sys_assignment_rule: { + label: "割り当てルール", + pluralLabel: "割り当てルール", + description: "条件に一致する新しいレコードを、キューまたは特定の人に送ります。", + fields: { + organization_id: { + label: "組織", + help: "このルールが属する組織。" + }, + name: { + label: "名前", + help: "ルールを識別します。小文字、数字、アンダースコアのみ使用でき、インストール済みアプリが提供するルールと同じ名前は使えません。" + }, + label: { + label: "表示名" + }, + description: { + label: "説明" + }, + object_name: { + label: "オブジェクト", + help: "このルールが新しいレコードを送る対象のオブジェクト。所有者を持つレコードのオブジェクトだけが割り当ての対象になります。" + }, + criteria: { + label: "条件", + help: "このルールが受け取る新しいレコード。空欄にすると、それより前のルールが受け取らなかった新しいレコードをすべて受け取ります。レコードに対する式で記述します(例: record.priority == \"high\")。" + }, + sort_order: { + label: "順序", + help: "同じレコードを複数のルールが受け取りうる場合、順序の値が最も小さいルールから試されます。この組織のルールは、インストール済みアプリが提供するルールより常に先に試されます。" + }, + recipient_type: { + label: "割り当て先", + help: "レコードをキュー(メンバーが引き受けられます)に送るか、1 人に直接送ります。", + options: { + queue: "キュー", + user: "ユーザー" + } + }, + recipient_id: { + label: "キューまたはユーザー", + help: "レコードの送り先となるキューまたは人。人はこの組織の有効なメンバーである必要があります。" + }, + strategy: { + label: "メンバーの選び方", + help: "キューの場合: レコードを 1 人のメンバーに直接渡します。順番に回すか、未完了の作業が最も少ないメンバーを選びます。空欄にすると、メンバーが引き受けるまでレコードはキューに残ります。", + options: { + round_robin: "ラウンドロビン", + least_loaded: "負荷が最も少ない" + } + }, + load: { + label: "未完了の作業", + help: "「負荷が最も少ない」では必須: どのレコードをメンバーの未完了の作業として数えるか。レコードに対する式で記述します(例: record.status != \"closed\")。" + }, + active: { + label: "有効", + help: "オフにすると、ルールを削除せずに新しいレコードの割り当てを止めます。" + } + }, + _views: { + by_object: { + label: "オブジェクト別" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/ko.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/ko.objects.generated.ts index 184b5d87c73..5dc3cbb8ce8 100644 --- a/packages/plugins/plugin-sharing/src/translations/ko.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/ko.objects.generated.ts @@ -343,5 +343,71 @@ export const koObjects: NonNullable = { label: "대기열별" } } + }, + sys_assignment_rule: { + label: "배정 규칙", + pluralLabel: "배정 규칙", + description: "조건에 맞는 각 새 레코드를 대기열 또는 한 사람에게 보냅니다.", + fields: { + organization_id: { + label: "조직", + help: "이 규칙이 속한 조직입니다." + }, + name: { + label: "이름", + help: "규칙을 식별합니다. 영문 소문자, 숫자, 밑줄만 쓸 수 있으며, 설치된 앱이 제공하는 규칙의 이름은 쓸 수 없습니다." + }, + label: { + label: "표시 레이블" + }, + description: { + label: "설명" + }, + object_name: { + label: "객체", + help: "이 규칙이 새 레코드를 보내는 대상 객체입니다. 레코드에 소유자가 있는 객체만 배정할 수 있습니다." + }, + criteria: { + label: "조건", + help: "이 규칙이 가져갈 새 레코드입니다. 비워 두면 앞선 규칙이 가져가지 않은 모든 새 레코드를 가져갑니다. 레코드에 대한 식으로 작성합니다(예: record.priority == \"high\")." + }, + sort_order: { + label: "순서", + help: "여러 규칙이 같은 레코드를 가져갈 수 있으면 순서 값이 가장 낮은 규칙부터 시도합니다. 조직의 규칙은 항상 설치된 앱이 제공하는 규칙보다 먼저 시도됩니다." + }, + recipient_type: { + label: "배정 대상", + help: "레코드를 구성원이 가져갈 수 있는 대기열로 보내거나, 한 사람에게 바로 보냅니다.", + options: { + queue: "대기열", + user: "사용자" + } + }, + recipient_id: { + label: "대기열 또는 사용자", + help: "레코드가 갈 대기열 또는 사람입니다. 사람은 이 조직의 활성 구성원이어야 합니다." + }, + strategy: { + label: "구성원 선택", + help: "대기열인 경우: 레코드를 한 구성원에게 바로 넘깁니다. 돌아가며 넘기거나 미완료 작업이 가장 적은 구성원을 고릅니다. 비워 두면 구성원이 가져갈 때까지 레코드가 대기열에 남습니다.", + options: { + round_robin: "순환 배정", + least_loaded: "최소 부하" + } + }, + load: { + label: "미완료 작업", + help: "\"최소 부하\"에서 필수: 어떤 레코드를 구성원의 미완료 작업으로 셀지 레코드에 대한 식으로 작성합니다(예: record.status != \"closed\")." + }, + active: { + label: "활성", + help: "끄면 규칙을 삭제하지 않고 새 레코드 배정을 멈춥니다." + } + }, + _views: { + by_object: { + label: "객체별" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/pt-BR.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/pt-BR.objects.generated.ts index 44e0acbbccc..a1d1a6df0d9 100644 --- a/packages/plugins/plugin-sharing/src/translations/pt-BR.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/pt-BR.objects.generated.ts @@ -343,5 +343,71 @@ export const ptBRObjects: NonNullable = { label: "Por fila" } } + }, + sys_assignment_rule: { + label: "Regra de atribuição", + pluralLabel: "Regras de atribuição", + description: "Envia cada novo registro que atende a uma condição para uma fila ou para uma pessoa.", + fields: { + organization_id: { + label: "Organização", + help: "A organização à qual esta regra pertence." + }, + name: { + label: "Nome", + help: "Identifica a regra. Apenas letras minúsculas, dígitos e sublinhados, e não pode ser o nome de uma regra fornecida por um aplicativo instalado." + }, + label: { + label: "Rótulo de exibição" + }, + description: { + label: "Descrição" + }, + object_name: { + label: "Objeto", + help: "O objeto cujos novos registros esta regra envia. Só podem ser atribuídos objetos cujos registros têm proprietário." + }, + criteria: { + label: "Condição", + help: "Quais novos registros esta regra pega; deixe vazio para pegar todo novo registro que nenhuma regra anterior pegou. Escrita como uma expressão sobre o registro, por exemplo record.priority == \"high\"." + }, + sort_order: { + label: "Ordem", + help: "Quando várias das suas regras puderem pegar o mesmo registro, a de menor ordem é tentada primeiro. Suas regras são sempre tentadas antes das regras fornecidas pelos aplicativos instalados." + }, + recipient_type: { + label: "Atribuir a", + help: "Envia o registro para uma fila, onde seus membros podem pegá-lo, ou diretamente para uma pessoa.", + options: { + queue: "Fila", + user: "Usuário" + } + }, + recipient_id: { + label: "Fila ou usuário", + help: "A fila, ou a pessoa, para a qual o registro vai. Uma pessoa precisa ser um membro ativo desta organização." + }, + strategy: { + label: "Escolher um membro", + help: "Para uma fila: entrega o registro diretamente a um membro, em rodízio ou escolhendo quem tiver menos trabalho em aberto. Deixe vazio para manter o registro na fila até que um membro o pegue.", + options: { + round_robin: "Rodízio", + least_loaded: "Menor carga" + } + }, + load: { + label: "Trabalho em aberto", + help: "Obrigatório com \"Menor carga\": quais registros contam como trabalho em aberto de um membro, escrito como uma expressão sobre o registro, por exemplo record.status != \"closed\"." + }, + active: { + label: "Ativo", + help: "Desative para que esta regra pare de atribuir novos registros, sem excluí-la." + } + }, + _views: { + by_object: { + label: "Por objeto" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/ru.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/ru.objects.generated.ts index a3323467c2a..962b118a5ca 100644 --- a/packages/plugins/plugin-sharing/src/translations/ru.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/ru.objects.generated.ts @@ -343,5 +343,71 @@ export const ruObjects: NonNullable = { label: "По очереди" } } + }, + sys_assignment_rule: { + label: "Правило назначения", + pluralLabel: "Правила назначения", + description: "Отправляет каждую новую запись, удовлетворяющую условию, в очередь или конкретному человеку.", + fields: { + organization_id: { + label: "Организация", + help: "Организация, к которой относится это правило." + }, + name: { + label: "Имя", + help: "Идентифицирует правило. Только строчные латинские буквы, цифры и подчёркивания; имя не должно совпадать с именем правила, которое предоставляет установленное приложение." + }, + label: { + label: "Отображаемая метка" + }, + description: { + label: "Описание" + }, + object_name: { + label: "Объект", + help: "Объект, новые записи которого это правило куда-либо отправляет. Назначать можно только объекты, записи которых имеют владельца." + }, + criteria: { + label: "Условие", + help: "Какие новые записи берёт это правило; оставьте пустым, чтобы брать каждую новую запись, которую не взяло ни одно предыдущее правило. Записывается как выражение над записью, например record.priority == \"high\"." + }, + sort_order: { + label: "Порядок", + help: "Если одну и ту же запись могут взять несколько ваших правил, первым пробуется правило с наименьшим порядком. Ваши правила всегда пробуются раньше правил, которые предоставляют установленные приложения." + }, + recipient_type: { + label: "Назначить", + help: "Отправляет запись в очередь, где её могут взять участники, или сразу одному человеку.", + options: { + queue: "Очередь", + user: "Пользователь" + } + }, + recipient_id: { + label: "Очередь или пользователь", + help: "Очередь или человек, которому направляется запись. Человек должен быть активным участником этой организации." + }, + strategy: { + label: "Выбор участника", + help: "Для очереди: передаёт запись сразу одному участнику — по очереди или тому, у кого меньше всего открытой работы. Оставьте пустым, чтобы запись оставалась в очереди, пока её не возьмёт участник.", + options: { + round_robin: "По очереди", + least_loaded: "Наименьшая загрузка" + } + }, + load: { + label: "Открытая работа", + help: "Обязательно для «Наименьшая загрузка»: какие записи считаются открытой работой участника; записывается как выражение над записью, например record.status != \"closed\"." + }, + active: { + label: "Активно", + help: "Отключите, чтобы правило перестало назначать новые записи, не удаляя его." + } + }, + _views: { + by_object: { + label: "По объекту" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/zh-CN.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/zh-CN.objects.generated.ts index 0fcc0cc3a0f..ce50201978d 100644 --- a/packages/plugins/plugin-sharing/src/translations/zh-CN.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/zh-CN.objects.generated.ts @@ -343,5 +343,71 @@ export const zhCNObjects: NonNullable = { label: "按队列" } } + }, + sys_assignment_rule: { + label: "分配规则", + pluralLabel: "分配规则", + description: "将每条符合条件的新记录发送到一个队列或一个人。", + fields: { + organization_id: { + label: "组织", + help: "该规则所属的组织。" + }, + name: { + label: "名称", + help: "标识该规则。只能使用小写字母、数字和下划线,且不能与已安装应用提供的规则同名。" + }, + label: { + label: "显示标签" + }, + description: { + label: "描述" + }, + object_name: { + label: "对象", + help: "该规则将其新记录发送出去的对象。只有记录带有所有者的对象才能被分配。" + }, + criteria: { + label: "条件", + help: "该规则接收哪些新记录;留空则接收所有未被前面规则接收的新记录。写成针对记录的表达式,例如 record.priority == \"high\"。" + }, + sort_order: { + label: "顺序", + help: "当你的多条规则都可能接收同一条记录时,顺序值最小的规则最先尝试。你的规则总是先于已安装应用提供的规则尝试。" + }, + recipient_type: { + label: "分配给", + help: "将记录发送到一个队列(由其成员领取),或直接发送给某个人。", + options: { + queue: "队列", + user: "用户" + } + }, + recipient_id: { + label: "队列或用户", + help: "记录要发往的队列或人员。人员必须是该组织的有效成员。" + }, + strategy: { + label: "选择成员", + help: "针对队列:直接把记录交给一名成员,轮流分配或选择未完成工作最少的成员。留空则记录留在队列中,直到有成员领取。", + options: { + round_robin: "轮流分配", + least_loaded: "负载最少" + } + }, + load: { + label: "未完成工作", + help: "选择“负载最少”时必填:哪些记录算作成员的未完成工作,写成针对记录的表达式,例如 record.status != \"closed\"。" + }, + active: { + label: "启用", + help: "关闭后该规则不再分配新记录,但不会被删除。" + } + }, + _views: { + by_object: { + label: "按对象" + } + } } }; diff --git a/packages/plugins/plugin-sharing/src/translations/zh-Hant.objects.generated.ts b/packages/plugins/plugin-sharing/src/translations/zh-Hant.objects.generated.ts index f50bbfeb053..de93e7d77e2 100644 --- a/packages/plugins/plugin-sharing/src/translations/zh-Hant.objects.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/zh-Hant.objects.generated.ts @@ -343,5 +343,71 @@ export const zhHantObjects: NonNullable = { label: "依佇列" } } + }, + sys_assignment_rule: { + label: "指派規則", + pluralLabel: "指派規則", + description: "將每筆符合條件的新記錄傳送到一個佇列或一個人。", + fields: { + organization_id: { + label: "組織", + help: "此規則所屬的組織。" + }, + name: { + label: "名稱", + help: "識別此規則。只能使用小寫字母、數字和底線,且不能與已安裝應用程式提供的規則同名。" + }, + label: { + label: "顯示標籤" + }, + description: { + label: "描述" + }, + object_name: { + label: "物件", + help: "此規則會將其新記錄傳送出去的物件。只有記錄具有擁有者的物件才能被指派。" + }, + criteria: { + label: "條件", + help: "此規則接收哪些新記錄;留空則接收所有未被先前規則接收的新記錄。以針對記錄的運算式撰寫,例如 record.priority == \"high\"。" + }, + sort_order: { + label: "順序", + help: "當你的多條規則都可能接收同一筆記錄時,順序值最小的規則會最先嘗試。你的規則一律先於已安裝應用程式提供的規則嘗試。" + }, + recipient_type: { + label: "指派給", + help: "將記錄傳送到一個佇列(由其成員領取),或直接傳送給某個人。", + options: { + queue: "佇列", + user: "使用者" + } + }, + recipient_id: { + label: "佇列或使用者", + help: "記錄要送往的佇列或人員。人員必須是此組織的有效成員。" + }, + strategy: { + label: "選擇成員", + help: "針對佇列:直接把記錄交給一名成員,輪流指派或選擇未完成工作最少的成員。留空則記錄會留在佇列中,直到有成員領取。", + options: { + round_robin: "輪流指派", + least_loaded: "負載最少" + } + }, + load: { + label: "未完成工作", + help: "選擇「負載最少」時必填:哪些記錄算作成員的未完成工作,以針對記錄的運算式撰寫,例如 record.status != \"closed\"。" + }, + active: { + label: "啟用", + help: "關閉後此規則不再指派新記錄,但不會被刪除。" + } + }, + _views: { + by_object: { + label: "依物件" + } + } } };