From df054f294de148669e71ab80e046ea83c8325175 Mon Sep 17 00:00:00 2001 From: Ramon van Bezouw Date: Tue, 9 Aug 2022 15:23:05 +0200 Subject: [PATCH] RTL support in translation interface (#14665) * first draft for translations rtl implementation * make direction field dybamic * Fixed default direction field * added directionality to: tags, input-multiline, repeater (list) * added directionality for wysiwyg, input-autocomplete, groups * reverted directionality in wysiwyg-editor * removed hardcoded rtl, ltr buttons from wysiwyg toolbar * working directionality in wysiwyg editor * also add v-if to await language for second language (split-view) in translations.vue * added watcher for changing wysiwyg directionality on language change Co-authored-by: Rijk van Zanten Co-authored-by: Martijn de Voogd Co-authored-by: Martijn <73393707+martijn-dev@users.noreply.github.com> Co-authored-by: Brainslug --- .../v-form/form-field-interface.vue | 5 ++ app/src/components/v-form/form-field.vue | 3 ++ app/src/components/v-form/v-form.vue | 6 +++ .../group-accordion/accordion-section.vue | 5 ++ .../group-accordion/group-accordion.vue | 5 ++ .../interfaces/group-detail/group-detail.vue | 5 ++ app/src/interfaces/group-raw/group-raw.vue | 5 ++ .../input-autocomplete-api.vue | 5 ++ .../input-multiline/input-multiline.vue | 5 ++ .../input-rich-text-html.vue | 25 +++++++++- app/src/interfaces/input/input.vue | 5 ++ app/src/interfaces/list/list.vue | 12 ++++- app/src/interfaces/tags/tags.vue | 7 +++ app/src/interfaces/translations/index.ts | 15 ++++++ .../interfaces/translations/translations.vue | 11 +++++ app/src/lang/translations/en-US.yaml | 3 ++ .../store/alterations/translations.ts | 49 +++++++++++++++++++ .../private/components/render-template.vue | 6 ++- 18 files changed, 173 insertions(+), 4 deletions(-) diff --git a/app/src/components/v-form/form-field-interface.vue b/app/src/components/v-form/form-field-interface.vue index f3978e3c41..1fc35557dc 100644 --- a/app/src/components/v-form/form-field-interface.vue +++ b/app/src/components/v-form/form-field-interface.vue @@ -26,6 +26,7 @@ :field-data="field" :primary-key="primaryKey" :length="field.schema && field.schema.max_length" + :direction="direction" @input="$emit('update:modelValue', $event)" @set-field-value="$emit('setFieldValue', $event)" /> @@ -92,6 +93,10 @@ export default defineComponent({ type: Boolean, default: false, }, + direction: { + type: String, + default: undefined, + }, }, emits: ['update:modelValue', 'setFieldValue'], setup(props) { diff --git a/app/src/components/v-form/form-field.vue b/app/src/components/v-form/form-field.vue index 49eb75135d..01d5e48f3d 100644 --- a/app/src/components/v-form/form-field.vue +++ b/app/src/components/v-form/form-field.vue @@ -44,6 +44,7 @@ :primary-key="primaryKey" :raw-editor-enabled="rawEditorEnabled" :raw-editor-active="rawEditorActive" + :direction="direction" @update:model-value="emitValue($event)" @set-field-value="$emit('setFieldValue', $event)" /> @@ -98,6 +99,7 @@ interface Props { badge?: string; rawEditorEnabled?: boolean; rawEditorActive?: boolean; + direction?: string; } const props = withDefaults(defineProps(), { @@ -113,6 +115,7 @@ const props = withDefaults(defineProps(), { badge: undefined, rawEditorEnabled: false, rawEditorActive: false, + direction: undefined, }); const emit = defineEmits(['toggle-batch', 'toggle-raw', 'unset', 'update:modelValue', 'setFieldValue']); diff --git a/app/src/components/v-form/v-form.vue b/app/src/components/v-form/v-form.vue index 9ce5a29f50..b7c15c3dfc 100644 --- a/app/src/components/v-form/v-form.vue +++ b/app/src/components/v-form/v-form.vue @@ -33,6 +33,7 @@ :validation-errors="validationErrors" :badge="badge" :raw-editor-enabled="rawEditorEnabled" + :direction="direction" v-bind="fieldsMap[fieldName].meta?.options || {}" @apply="apply" /> @@ -65,6 +66,7 @@ :badge="badge" :raw-editor-enabled="rawEditorEnabled" :raw-editor-active="rawActiveFields.has(fieldName)" + :direction="direction" @update:model-value="setValue(fieldName, $event)" @set-field-value="setValue($event.field, $event.value, { force: true })" @unset="unsetValue(fieldsMap[fieldName])" @@ -153,6 +155,10 @@ export default defineComponent({ type: Boolean, default: false, }, + direction: { + type: String, + default: null, + }, }, emits: ['update:modelValue'], setup(props, { emit }) { diff --git a/app/src/interfaces/group-accordion/accordion-section.vue b/app/src/interfaces/group-accordion/accordion-section.vue index 22e4b6450e..5a2983c70d 100644 --- a/app/src/interfaces/group-accordion/accordion-section.vue +++ b/app/src/interfaces/group-accordion/accordion-section.vue @@ -28,6 +28,7 @@ :loading="loading" :batch-mode="batchMode" :disabled="disabled" + :direction="direction" nested @update:model-value="$emit('apply', $event)" /> @@ -99,6 +100,10 @@ export default defineComponent({ type: Boolean, default: false, }, + direction: { + type: String, + default: undefined, + }, }, emits: ['apply', 'toggleAll'], setup(props, { emit }) { diff --git a/app/src/interfaces/group-accordion/group-accordion.vue b/app/src/interfaces/group-accordion/group-accordion.vue index 64cc5abfa5..fb5f654c27 100644 --- a/app/src/interfaces/group-accordion/group-accordion.vue +++ b/app/src/interfaces/group-accordion/group-accordion.vue @@ -17,6 +17,7 @@ :raw-editor-enabled="rawEditorEnabled" :group="field.meta.field" :multiple="accordionMode === false" + :direction="direction" @apply="$emit('apply', $event)" @toggle-all="toggleAll" /> @@ -91,6 +92,10 @@ export default defineComponent({ enum: ['opened', 'closed', 'first'], default: 'closed', }, + direction: { + type: String, + default: undefined, + }, }, emits: ['apply'], setup(props) { diff --git a/app/src/interfaces/group-detail/group-detail.vue b/app/src/interfaces/group-detail/group-detail.vue index 4514bf6784..2d102c7580 100644 --- a/app/src/interfaces/group-detail/group-detail.vue +++ b/app/src/interfaces/group-detail/group-detail.vue @@ -37,6 +37,7 @@ :batch-mode="batchMode" :disabled="disabled" :badge="badge" + :direction="direction" nested @update:model-value="$emit('apply', $event)" /> @@ -112,6 +113,10 @@ export default defineComponent({ type: String, default: null, }, + direction: { + type: String, + default: undefined, + }, }, emits: ['apply'], setup(props) { diff --git a/app/src/interfaces/group-raw/group-raw.vue b/app/src/interfaces/group-raw/group-raw.vue index 57cb43b596..7491935880 100644 --- a/app/src/interfaces/group-raw/group-raw.vue +++ b/app/src/interfaces/group-raw/group-raw.vue @@ -11,6 +11,7 @@ :disabled="disabled" :badge="badge" :raw-editor-enabled="rawEditorEnabled" + :direction="direction" nested @update:model-value="$emit('apply', $event)" /> @@ -71,6 +72,10 @@ export default defineComponent({ type: Boolean, default: false, }, + direction: { + type: String, + default: undefined, + }, }, emits: ['apply'], }); diff --git a/app/src/interfaces/input-autocomplete-api/input-autocomplete-api.vue b/app/src/interfaces/input-autocomplete-api/input-autocomplete-api.vue index c0818dc8c2..ed8a3598f8 100644 --- a/app/src/interfaces/input-autocomplete-api/input-autocomplete-api.vue +++ b/app/src/interfaces/input-autocomplete-api/input-autocomplete-api.vue @@ -10,6 +10,7 @@ :disabled="disabled" :class="font" :model-value="value" + :dir="direction" @update:model-value="onInput" @focus="activate" > @@ -85,6 +86,10 @@ export default defineComponent({ type: Boolean, default: false, }, + direction: { + type: String, + default: undefined, + }, }, emits: ['input'], setup(props, { emit }) { diff --git a/app/src/interfaces/input-multiline/input-multiline.vue b/app/src/interfaces/input-multiline/input-multiline.vue index fb3b5eee55..6662198caf 100644 --- a/app/src/interfaces/input-multiline/input-multiline.vue +++ b/app/src/interfaces/input-multiline/input-multiline.vue @@ -5,6 +5,7 @@ :nullable="!clear" :disabled="disabled" :class="font" + :dir="direction" @update:model-value="$emit('input', $event)" >