Adding greek translation

This commit is contained in:
Wayne
2025-08-29 13:56:28 +03:00
parent 8675f90606
commit cd5f8fa313
5 changed files with 306 additions and 27 deletions

View File

@@ -23,18 +23,24 @@
const providerOptions = [
{
value: 'generic_imap',
label: $t('components.ingestion_source_form.provider_generic_imap'),
label: $t('app.components.ingestion_source_form.provider_generic_imap'),
},
{
value: 'google_workspace',
label: $t('components.ingestion_source_form.provider_google_workspace'),
label: $t('app.components.ingestion_source_form.provider_google_workspace'),
},
{
value: 'microsoft_365',
label: $t('components.ingestion_source_form.provider_microsoft_365'),
label: $t('app.components.ingestion_source_form.provider_microsoft_365'),
},
{
value: 'pst_import',
label: $t('app.components.ingestion_source_form.provider_pst_import'),
},
{
value: 'eml_import',
label: $t('app.components.ingestion_source_form.provider_eml_import'),
},
{ value: 'pst_import', label: $t('components.ingestion_source_form.provider_pst_import') },
{ value: 'eml_import', label: $t('components.ingestion_source_form.provider_eml_import') },
];
let formData: CreateIngestionSourceDto = $state({
@@ -53,7 +59,7 @@
const triggerContent = $derived(
providerOptions.find((p) => p.value === formData.provider)?.label ??
$t('components.ingestion_source_form.select_provider')
$t('app.components.ingestion_source_form.select_provider')
);
let isSubmitting = $state(false);
@@ -100,7 +106,7 @@
fileUploading = false;
setAlert({
type: 'error',
title: $t('components.ingestion_source_form.upload_failed'),
title: $t('app.components.ingestion_source_form.upload_failed'),
message: JSON.stringify(error),
duration: 5000,
show: true,
@@ -111,11 +117,11 @@
<form onsubmit={handleSubmit} class="grid gap-4 py-4">
<div class="grid grid-cols-4 items-center gap-4">
<Label for="name" class="text-left">{$t('ingestions.name')}</Label>
<Label for="name" class="text-left">{$t('app.ingestions.name')}</Label>
<Input id="name" bind:value={formData.name} class="col-span-3" />
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label for="provider" class="text-left">{$t('ingestions.provider')}</Label>
<Label for="provider" class="text-left">{$t('app.ingestions.provider')}</Label>
<Select.Root name="provider" bind:value={formData.provider} type="single">
<Select.Trigger class="col-span-3">
{triggerContent}
@@ -131,10 +137,12 @@
{#if formData.provider === 'google_workspace'}
<div class="grid grid-cols-4 items-center gap-4">
<Label for="serviceAccountKeyJson" class="text-left"
>{$t('components.ingestion_source_form.service_account_key')}</Label
>{$t('app.components.ingestion_source_form.service_account_key')}</Label
>
<Textarea
placeholder={$t('components.ingestion_source_form.service_account_key_placeholder')}
placeholder={$t(
'app.components.ingestion_source_form.service_account_key_placeholder'
)}
id="serviceAccountKeyJson"
bind:value={formData.providerConfig.serviceAccountKeyJson}
class="col-span-3 max-h-32"
@@ -142,7 +150,7 @@
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label for="impersonatedAdminEmail" class="text-left"
>{$t('components.ingestion_source_form.impersonated_admin_email')}</Label
>{$t('app.components.ingestion_source_form.impersonated_admin_email')}</Label
>
<Input
id="impersonatedAdminEmail"
@@ -153,36 +161,38 @@
{:else if formData.provider === 'microsoft_365'}
<div class="grid grid-cols-4 items-center gap-4">
<Label for="clientId" class="text-left"
>{$t('components.ingestion_source_form.client_id')}</Label
>{$t('app.components.ingestion_source_form.client_id')}</Label
>
<Input id="clientId" bind:value={formData.providerConfig.clientId} class="col-span-3" />
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label for="clientSecret" class="text-left"
>{$t('components.ingestion_source_form.client_secret')}</Label
>{$t('app.components.ingestion_source_form.client_secret')}</Label
>
<Input
id="clientSecret"
type="password"
placeholder={$t('components.ingestion_source_form.client_secret_placeholder')}
placeholder={$t('app.components.ingestion_source_form.client_secret_placeholder')}
bind:value={formData.providerConfig.clientSecret}
class="col-span-3"
/>
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label for="tenantId" class="text-left"
>{$t('components.ingestion_source_form.tenant_id')}</Label
>{$t('app.components.ingestion_source_form.tenant_id')}</Label
>
<Input id="tenantId" bind:value={formData.providerConfig.tenantId} class="col-span-3" />
</div>
{:else if formData.provider === 'generic_imap'}
<div class="grid grid-cols-4 items-center gap-4">
<Label for="host" class="text-left">{$t('components.ingestion_source_form.host')}</Label
<Label for="host" class="text-left"
>{$t('app.components.ingestion_source_form.host')}</Label
>
<Input id="host" bind:value={formData.providerConfig.host} class="col-span-3" />
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label for="port" class="text-left">{$t('components.ingestion_source_form.port')}</Label
<Label for="port" class="text-left"
>{$t('app.components.ingestion_source_form.port')}</Label
>
<Input
id="port"
@@ -193,7 +203,7 @@
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label for="username" class="text-left"
>{$t('components.ingestion_source_form.username')}</Label
>{$t('app.components.ingestion_source_form.username')}</Label
>
<Input id="username" bind:value={formData.providerConfig.username} class="col-span-3" />
</div>
@@ -208,14 +218,14 @@
</div>
<div class="grid grid-cols-4 items-center gap-4">
<Label for="secure" class="text-left"
>{$t('components.ingestion_source_form.use_tls')}</Label
>{$t('app.components.ingestion_source_form.use_tls')}</Label
>
<Checkbox id="secure" bind:checked={formData.providerConfig.secure} />
</div>
{:else if formData.provider === 'pst_import'}
<div class="grid grid-cols-4 items-center gap-4">
<Label for="pst-file" class="text-left"
>{$t('components.ingestion_source_form.pst_file')}</Label
>{$t('app.components.ingestion_source_form.pst_file')}</Label
>
<div class="col-span-3 flex flex-row items-center space-x-2">
<Input
@@ -233,7 +243,7 @@
{:else if formData.provider === 'eml_import'}
<div class="grid grid-cols-4 items-center gap-4">
<Label for="eml-file" class="text-left"
>{$t('components.ingestion_source_form.eml_file')}</Label
>{$t('app.components.ingestion_source_form.eml_file')}</Label
>
<div class="col-span-3 flex flex-row items-center space-x-2">
<Input
@@ -251,10 +261,10 @@
{/if}
{#if formData.provider === 'google_workspace' || formData.provider === 'microsoft_365'}
<Alert.Root>
<Alert.Title>{$t('components.ingestion_source_form.heads_up')}</Alert.Title>
<Alert.Title>{$t('app.components.ingestion_source_form.heads_up')}</Alert.Title>
<Alert.Description>
<div class="my-1">
{@html $t('components.ingestion_source_form.org_wide_warning')}
{@html $t('app.components.ingestion_source_form.org_wide_warning')}
</div>
</Alert.Description>
</Alert.Root>
@@ -262,9 +272,9 @@
<Dialog.Footer>
<Button type="submit" disabled={isSubmitting || fileUploading}>
{#if isSubmitting}
{$t('components.common.submitting')}
{$t('app.components.common.submitting')}
{:else}
{$t('components.common.submit')}
{$t('app.components.common.submit')}
{/if}
</Button>
</Dialog.Footer>

View File

@@ -0,0 +1,260 @@
{
"app": {
"auth": {
"login": "Σύνδεση",
"login_tip": "Εισαγάγετε το email σας παρακάτω για να συνδεθείτε στον λογαριασμό σας.",
"email": "Email",
"password": "Κωδικός πρόσβασης"
},
"common": {
"working": "Επεξεργασία"
},
"archive": {
"title": "Αρχείο",
"no_subject": "Χωρίς θέμα",
"from": "Από",
"sent": "Απεσταλμένα",
"recipients": "Παραλήπτες",
"to": "Προς",
"meta_data": "Μεταδεδομένα",
"folder": "Φάκελος",
"tags": "Ετικέτες",
"size": "Μέγεθος",
"email_preview": "Προεπισκόπηση email",
"attachments": "Συνημμένα",
"download": "Λήψη",
"actions": "Ενέργειες",
"download_eml": "Λήψη email (.eml)",
"delete_email": "Διαγραφή email",
"email_thread": "Συνομιλία email",
"delete_confirmation_title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το email;",
"delete_confirmation_description": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί και θα διαγράψει οριστικά το email και τα συνημμένα του.",
"deleting": "Διαγραφή",
"confirm": "Επιβεβαίωση",
"cancel": "Άκυρο",
"not_found": "Το email δεν βρέθηκε."
},
"ingestions": {
"title": "Πηγές εισαγωγής",
"ingestion_sources": "Πηγές εισαγωγής",
"bulk_actions": "Μαζικές ενέργειες",
"force_sync": "Εξαναγκασμένος συγχρονισμός",
"delete": "Διαγραφή",
"create_new": "Δημιουργία νέου",
"name": "Όνομα",
"provider": "Πάροχος",
"status": "Κατάσταση",
"active": "Ενεργό",
"created_at": "Δημιουργήθηκε στις",
"actions": "Ενέργειες",
"last_sync_message": "Τελευταίο μήνυμα συγχρονισμού",
"empty": "Κενό",
"open_menu": "Άνοιγμα μενού",
"edit": "Επεξεργασία",
"create": "Δημιουργία",
"ingestion_source": "Πηγή εισαγωγής",
"edit_description": "Κάντε αλλαγές στην πηγή εισαγωγής σας εδώ.",
"create_description": "Προσθέστε μια νέα πηγή εισαγωγής για να ξεκινήσετε την αρχειοθέτηση των email.",
"read": "Διαβάστε",
"docs_here": "την τεκμηρίωση εδώ",
"delete_confirmation_title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την εισαγωγή;",
"delete_confirmation_description": "Αυτό θα διαγράψει όλα τα αρχειοθετημένα email, τα συνημμένα, την ευρετηρίαση και τα αρχεία που σχετίζονται με αυτήν την εισαγωγή. Εάν θέλετε μόνο να σταματήσετε τον συγχρονισμό νέων email, μπορείτε να θέσετε σε παύση την εισαγωγή.",
"deleting": "Διαγραφή",
"confirm": "Επιβεβαίωση",
"cancel": "Άκυρο",
"bulk_delete_confirmation_title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε τις {{count}} επιλεγμένες εισαγωγές;",
"bulk_delete_confirmation_description": "Αυτό θα διαγράψει όλα τα αρχειοθετημένα email, τα συνημμένα, την ευρετηρίαση και τα αρχεία που σχετίζονται με αυτές τις εισαγωγές. Εάν θέλετε μόνο να σταματήσετε τον συγχρονισμό νέων email, μπορείτε να θέσετε σε παύση τις εισαγωγές."
},
"search": {
"title": "Αναζήτηση",
"description": "Αναζήτηση για αρχειοθετημένα email.",
"email_search": "Αναζήτηση email",
"placeholder": "Αναζήτηση με λέξη-κλειδί, αποστολέα, παραλήπτη...",
"search_button": "Αναζήτηση",
"search_options": "Επιλογές αναζήτησης",
"strategy_fuzzy": "Ασαφής",
"strategy_verbatim": "Κατά λέξη",
"strategy_frequency": "Συχνότητα",
"select_strategy": "Επιλέξτε μια στρατηγική",
"error": "Σφάλμα",
"found_results_in": "Βρέθηκαν {{total}} αποτελέσματα σε {{seconds}}s",
"found_results": "Βρέθηκαν {{total}} αποτελέσματα",
"from": "Από",
"to": "Προς",
"in_email_body": "Στο σώμα του email",
"in_attachment": "Στο συνημμένο: {{filename}}",
"prev": "Προηγούμενο",
"next": "Επόμενο"
},
"roles": {
"title": "Διαχείριση ρόλων",
"role_management": "Διαχείριση ρόλων",
"create_new": "Δημιουργία νέου",
"name": "Όνομα",
"created_at": "Δημιουργήθηκε στις",
"actions": "Ενέργειες",
"open_menu": "Άνοιγμα μενού",
"view_policy": "Προβολή πολιτικής",
"edit": "Επεξεργασία",
"delete": "Διαγραφή",
"no_roles_found": "Δεν βρέθηκαν ρόλοι.",
"role_policy": "Πολιτική ρόλου",
"viewing_policy_for_role": "Προβολή πολιτικής για τον ρόλο: {{name}}",
"create": "Δημιουργία",
"role": "Ρόλος",
"edit_description": "Κάντε αλλαγές στον ρόλο εδώ.",
"create_description": "Προσθέστε έναν νέο ρόλο στο σύστημα.",
"delete_confirmation_title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον ρόλο;",
"delete_confirmation_description": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Αυτό θα διαγράψει οριστικά τον ρόλο.",
"deleting": "Διαγραφή",
"confirm": "Επιβεβαίωση",
"cancel": "Άκυρο"
},
"system_settings": {
"title": "Ρυθμίσεις συστήματος",
"system_settings": "Ρυθμίσεις συστήματος",
"description": "Διαχείριση καθολικών ρυθμίσεων εφαρμογής.",
"language": "Γλώσσα",
"default_theme": "Προεπιλεγμένο θέμα",
"light": "Φωτεινό",
"dark": "Σκοτεινό",
"system": "Σύστημα",
"support_email": "Email υποστήριξης",
"saving": "Αποθήκευση",
"save_changes": "Αποθήκευση αλλαγών"
},
"users": {
"title": "Διαχείριση χρηστών",
"user_management": "Διαχείριση χρηστών",
"create_new": "Δημιουργία νέου",
"name": "Όνομα",
"email": "Email",
"role": "Ρόλος",
"created_at": "Δημιουργήθηκε στις",
"actions": "Ενέργειες",
"open_menu": "Άνοιγμα μενού",
"edit": "Επεξεργασία",
"delete": "Διαγραφή",
"no_users_found": "Δεν βρέθηκαν χρήστες.",
"create": "Δημιουργία",
"user": "Χρήστης",
"edit_description": "Κάντε αλλαγές στον χρήστη εδώ.",
"create_description": "Προσθέστε έναν νέο χρήστη στο σύστημα.",
"delete_confirmation_title": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον χρήστη;",
"delete_confirmation_description": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Αυτό θα διαγράψει οριστικά τον χρήστη και θα αφαιρέσει τα δεδομένα του από τους διακομιστές μας.",
"deleting": "Διαγραφή",
"confirm": "Επιβεβαίωση",
"cancel": "Άκυρο"
},
"components": {
"charts": {
"emails_ingested": "Εισερχόμενα email",
"storage_used": "Χρησιμοποιημένος χώρος αποθήκευσης",
"emails": "Email"
},
"common": {
"submitting": "Υποβολή...",
"submit": "Υποβολή",
"save": "Αποθήκευση"
},
"email_preview": {
"loading": "Φόρτωση προεπισκόπησης email...",
"render_error": "Δεν ήταν δυνατή η απόδοση της προεπισκόπησης email.",
"not_available": "Το ακατέργαστο αρχείο .eml δεν είναι διαθέσιμο για αυτό το email."
},
"footer": {
"all_rights_reserved": "Με επιφύλαξη παντός δικαιώματος."
},
"ingestion_source_form": {
"provider_generic_imap": "Γενικό IMAP",
"provider_google_workspace": "Google Workspace",
"provider_microsoft_365": "Microsoft 365",
"provider_pst_import": "Εισαγωγή PST",
"provider_eml_import": "Εισαγωγή EML",
"select_provider": "Επιλέξτε έναν πάροχο",
"service_account_key": "Κλειδί λογαριασμού υπηρεσίας (JSON)",
"service_account_key_placeholder": "Επικολλήστε το περιεχόμενο JSON του κλειδιού του λογαριασμού υπηρεσίας σας",
"impersonated_admin_email": "Email διαχειριστή που έχει πλαστοπροσωπηθεί",
"client_id": "Αναγνωριστικό εφαρμογής (πελάτη)",
"client_secret": "Τιμή μυστικού πελάτη",
"client_secret_placeholder": "Εισαγάγετε την τιμή του μυστικού, όχι το αναγνωριστικό του μυστικού",
"tenant_id": "Αναγνωριστικό καταλόγου (μισθωτή)",
"host": "Κεντρικός υπολογιστής",
"port": "Θύρα",
"username": "Όνομα χρήστη",
"use_tls": "Χρήση TLS",
"pst_file": "Αρχείο PST",
"eml_file": "Αρχείο EML",
"heads_up": "Προσοχή!",
"org_wide_warning": "Λάβετε υπόψη ότι αυτή είναι μια λειτουργία σε επίπεδο οργανισμού. Αυτό το είδος εισαγωγής θα εισαγάγει και θα ευρετηριάσει <b>όλα</b> τα εισερχόμενα email στον οργανισμό σας. Εάν θέλετε να εισαγάγετε μόνο συγκεκριμένα εισερχόμενα email, χρησιμοποιήστε τη σύνδεση IMAP.",
"upload_failed": "Η μεταφόρτωση απέτυχε, δοκιμάστε ξανά"
},
"role_form": {
"policies_json": "Πολιτικές (JSON)",
"invalid_json": "Μη έγκυρη μορφή JSON για τις πολιτικές."
},
"theme_switcher": {
"toggle_theme": "Εναλλαγή θέματος"
},
"user_form": {
"select_role": "Επιλέξτε έναν ρόλο"
}
},
"setup": {
"title": "Εγκατάσταση",
"description": "Ρυθμίστε τον αρχικό λογαριασμό διαχειριστή για το Open Archiver.",
"welcome": "Καλώς ορίσατε",
"create_admin_account": "Δημιουργήστε τον πρώτο λογαριασμό διαχειριστή για να ξεκινήσετε.",
"first_name": "Όνομα",
"last_name": "Επώνυμο",
"email": "Email",
"password": "Κωδικός πρόσβασης",
"creating_account": "Δημιουργία λογαριασμού",
"create_account": "Δημιουργία λογαριασμού"
},
"layout": {
"dashboard": "Πίνακας ελέγχου",
"ingestions": "Εισαγωγές",
"archived_emails": "Αρχειοθετημένα email",
"search": "Αναζήτηση",
"settings": "Ρυθμίσεις",
"system": "Σύστημα",
"users": "Χρήστες",
"roles": "Ρόλοι",
"logout": "Αποσύνδεση"
},
"archived_emails_page": {
"title": "Αρχειοθετημένα email",
"header": "Αρχειοθετημένα email",
"select_ingestion_source": "Επιλέξτε μια πηγή εισαγωγής",
"date": "Ημερομηνία",
"subject": "Θέμα",
"sender": "Αποστολέας",
"inbox": "Εισερχόμενα",
"path": "Διαδρομή",
"actions": "Ενέργειες",
"view": "Προβολή",
"no_emails_found": "Δεν βρέθηκαν αρχειοθετημένα email.",
"prev": "Προηγούμενο",
"next": "Επόμενο"
},
"dashboard_page": {
"title": "Πίνακας ελέγχου",
"meta_description": "Επισκόπηση του αρχείου email σας.",
"header": "Πίνακας ελέγχου",
"create_ingestion": "Δημιουργία εισαγωγής",
"no_ingestion_header": "Δεν έχετε ρυθμίσει καμία πηγή εισαγωγής.",
"no_ingestion_text": "Προσθέστε μια πηγή εισαγωγής για να ξεκινήσετε την αρχειοθέτηση των εισερχομένων σας.",
"total_emails_archived": "Συνολικά αρχειοθετημένα email",
"total_storage_used": "Συνολικός χρησιμοποιημένος χώρος αποθήκευσης",
"failed_ingestions": "Αποτυχημένες εισαγωγές (Τελευταίες 7 ημέρες)",
"ingestion_history": "Ιστορικό εισαγωγής",
"no_ingestion_history": "Δεν υπάρχει διαθέσιμο ιστορικό εισαγωγής.",
"storage_by_source": "Αποθήκευση ανά πηγή εισαγωγής",
"no_ingestion_sources": "Δεν υπάρχουν διαθέσιμες πηγές εισαγωγής.",
"indexed_insights": "Ευρετηριασμένες πληροφορίες",
"top_10_senders": "Οι 10 κορυφαίοι αποστολείς",
"no_indexed_insights": "Δεν υπάρχουν διαθέσιμες ευρετηριασμένες πληροφορίες."
}
}
}

View File

@@ -11,6 +11,7 @@ import pt from './pt.json';
import nl from './nl.json';
import ja from './ja.json';
import et from './et.json';
import el from './el.json';
// This is your config object.
// It defines the languages and how to load them.
const config: Config = {
@@ -70,6 +71,12 @@ const config: Config = {
key: 'app',
loader: async () => et.app,
},
// Greek 🇬🇷
{
locale: 'el',
key: 'app',
loader: async () => el.app,
},
],
fallbackLocale: 'en',
};

View File

@@ -23,6 +23,7 @@
{ value: 'it', label: '🇮🇹 Italiano' },
{ value: 'pt', label: '🇵🇹 Português' },
{ value: 'nl', label: '🇳🇱 Nederlands' },
{ value: 'el', label: '🇬🇷 Ελληνικά' },
{ value: 'ja', label: '🇯🇵 日本語' },
];

View File

@@ -7,7 +7,8 @@ export type SupportedLanguage =
| 'pt' // Portuguese
| 'nl' // Dutch
| 'ja' // Japanese
| 'et'; // Estonian
| 'et' // Estonian
| 'el'; // Greek
export type Theme = 'light' | 'dark' | 'system';