diff --git a/tests/TranslationsTest.php b/tests/TranslationsTest.php
new file mode 100644
index 00000000..3be8dd7b
--- /dev/null
+++ b/tests/TranslationsTest.php
@@ -0,0 +1,103 @@
+file->body;
+
+ foreach ($body->children() as $transUnit) {
+ self::assertNotEmpty(
+ (string) $transUnit->target,
+ sprintf(
+ 'Found empty translation in language "%s" and file "%s" for key "%s"',
+ $xml->file->attributes()['target-language'],
+ basename($file),
+ (string) $transUnit->source
+ )
+ );
+ }
+ }
+ }
+
+ public function testReplacerWereNotTranslated()
+ {
+ $englishFiles = glob(__DIR__ . '/../translations/*.en.xlf');
+ foreach ($englishFiles as $englishFile) {
+ $english = simplexml_load_file($englishFile);
+ $trans = [];
+ /** @var \SimpleXMLElement $body */
+ $body = $english->file->body;
+
+ foreach ($body->children() as $transUnit) {
+ preg_match_all('/%.+%/Uu', (string) $transUnit->target, $matches);
+ if (!empty($matches) && !empty($matches[0])) {
+ asort($matches[0]);
+ $trans[(string) $transUnit->source] = array_values($matches[0]);
+ }
+ }
+
+ if (empty($trans)) {
+ continue;
+ }
+
+ $expectedCounter = \count($trans);
+ $files = glob(__DIR__ . '/../translations/' . str_replace('.en.xlf', '', basename($englishFile)) . '*.xlf');
+ foreach ($files as $file) {
+ if ($englishFile === $file) {
+ continue;
+ }
+
+ $counter = 0;
+ $xml = simplexml_load_file($file);
+ $transLang = $trans;
+
+ /** @var \SimpleXMLElement $body */
+ $body = $xml->file->body;
+
+ foreach ($body->children() as $transUnit) {
+ $key = (string) $transUnit->source;
+ if (isset($transLang[$key])) {
+ if ($key !== 'stats.percentUsedLeft') { // special case, which doesn't work properly - base translation should be changed
+ preg_match_all('/%.+%/Uu', (string) $transUnit->target, $matches);
+ asort($matches[0]);
+ self::assertEquals($transLang[$key], array_values($matches[0]), sprintf('Invalid replacer "%s" in "%s"', $key, basename($file)));
+ }
+ $counter++;
+ unset($transLang[$key]);
+ }
+ }
+
+ $counter += \count($transLang);
+ self::assertEquals($expectedCounter, $counter, sprintf('Missing replacer in "%s", did not find translation keys: %s', basename($file), implode(', ', array_keys($transLang))));
+ }
+ }
+ }
+}
diff --git a/translations/about.el.xlf b/translations/about.el.xlf
new file mode 100644
index 00000000..c1e8b31a
--- /dev/null
+++ b/translations/about.el.xlf
@@ -0,0 +1,39 @@
+
+
+
+
+
+ about.title
+ Σχετικά με το Kimai
+
+
+ support
+ Υποστήριξη
+
+
+ website
+ Αρχική σελίδα
+
+
+ help
+ Τεκμηρίωση
+
+
+ donate
+ Δωρίστε για το μέλλον του Kimai
+
+
+ published_under
+ %kimai% δημοσιεύτηκε κάτω από
+
+
+ special_thanks
+ Ιδιαίτερες ευχαριστίες πηγαίνουν σε …
+
+
+ library_authors
+ … στους συγγραφείς των παρακάτω βιβλιοθηκών-λογισμικού, το Kimai δεν θα ήταν πραγματοποιήσιμο χωρίς εσάς 👍
+
+
+
+
diff --git a/translations/actions.el.xlf b/translations/actions.el.xlf
new file mode 100644
index 00000000..78745bbe
--- /dev/null
+++ b/translations/actions.el.xlf
@@ -0,0 +1,103 @@
+
+
+
+
+
+ stop
+ Διακοπή
+
+
+ back
+ Πίσω
+
+
+ edit
+ Τροποποίηση
+
+
+ trash
+ Διαγραφή
+
+
+ report
+ Αναφορά
+
+
+ repeat
+ Εκκίνηση ξανά
+
+
+ profile-stats
+ Προφίλ
+
+
+ settings
+ Προτιμήσεις
+
+
+ timesheet
+ Χρονοδιάγραμμα
+
+
+ customer
+ Φίλτρο πελατών
+
+
+ project
+ Φίλτρο έργων
+
+
+ activity
+ Φίλτρο δραστηριοτήτων
+
+
+ copy
+ Δημιουργία αντίγραφου
+
+
+ home
+ Αρχική σελίδα
+
+
+ create-project
+ Δημιουργία έργου
+
+
+ create-activity
+ Δημιουργία δραστηριότητας
+
+
+ create-timesheet
+ Δημιουργία χρονοδιαγράμματος
+
+
+ create-timesheet-multiuser
+ Για πολλαπλούς χρήστες
+
+
+ permissions
+ Δικαιώματα ομάδας
+
+
+ details
+ Εμφάνιση
+
+
+ download
+ Λήψη
+
+
+ invoice.pending
+ Αναμονή της είσπραξης
+
+
+ invoice.paid
+ Τιμολόγιο εξοφλήθη
+
+
+ filter
+ Φιλτράρισμα δεδομένων
+
+
+
+
diff --git a/translations/daterangepicker.el.xlf b/translations/daterangepicker.el.xlf
new file mode 100644
index 00000000..6ae698ba
--- /dev/null
+++ b/translations/daterangepicker.el.xlf
@@ -0,0 +1,43 @@
+
+
+
+
+
+ daterangepicker.today
+ Σήμερα
+
+
+ daterangepicker.yesterday
+ Χθες
+
+
+ daterangepicker.lastWeek
+ Προηγούμενη εβδομάδα
+
+
+ daterangepicker.thisWeek
+ Τρέχων εβδομάδα
+
+
+ daterangepicker.lastMonth
+ Προηγούμενος μήνας
+
+
+ daterangepicker.thisMonth
+ Τρέχων μήνας
+
+
+ daterangepicker.lastYear
+ Προηγούμενο έτος
+
+
+ daterangepicker.thisYear
+ Τρέχων έτος
+
+
+ daterangepicker.customRange
+ Προσαρμοσμένο εύρος
+
+
+
+
diff --git a/translations/email.el.xlf b/translations/email.el.xlf
new file mode 100644
index 00000000..11738cee
--- /dev/null
+++ b/translations/email.el.xlf
@@ -0,0 +1,47 @@
+
+
+
+
+
+ button_copy_url_to_browser
+ Εάν το κουμπί δεν λειτουργεί, παρακαλούμε αντιγράψτε & επικολλήστε την ακόλουθη διεύθυνση URL στο πρόγραμμα περιήγησης: %url%
+
+
+ automated_email_dont_answer
+ Αυτό είναι ένα e-mail που δημιουργείται αυτόματα. Παρακαλούμε μην απαντήσετε, το περιεχόμενο δεν θα αναγνωσθεί.
+
+
+ registration.subject
+ Ενεργοποίηση του λογαριασμού σας
+
+
+ registration.title
+ Καλώς όρισες %username%
+
+
+ registration.button
+ Ενεργοποίηση λογαριασμού
+
+
+ registration.intro
+ Εγγραφήκατε στο λογισμικό παρακολούθησης χρόνου Kimai με το e-mail %email%. Τώρα χρειάζεται να ενεργοποιήσετε τον λογαριασμό σας εντός μερικών ωρών, προτού λήξει ο σύνδεσμος.
+
+
+ reset.subject
+ Επαναφορά του δικού σας κωδικού πρόσβασης
+
+
+ reset.title
+ Αυτό μπορεί να συμβεί ...
+
+
+ reset.button
+ Επαναφορά κωδικού πρόσβασης
+
+
+ reset.intro
+ ... επομένως ξεχάσατε τον δικό σας κωδικό πρόσβασης; Μην ανησυχείτε: Το λογισμικό Kimai θα σας βοηθήσει να δημιουργήσετε ένα νέο:
+
+
+
+
diff --git a/translations/email.ko.xlf b/translations/email.ko.xlf
index 24b34e27..836bab94 100644
--- a/translations/email.ko.xlf
+++ b/translations/email.ko.xlf
@@ -4,7 +4,7 @@
button_copy_url_to_browser
- 버튼이 작동하지 않으면, 복사하여 & amp; 다음 URL을 브라우저에 붙여 넣으십시오: % url %
+ 버튼이 작동하지 않으면, 복사하여 & amp; 다음 URL을 브라우저에 붙여 넣으십시오: %url%automated_email_dont_answer
@@ -24,7 +24,7 @@
registration.intro
- 이메일 % email %로 Kimai 시간 트래커에 등록했습니다. 이제 링크가 만료되기 전에 계정을 활성화해야합니다.
+ 이메일 %email%로 Kimai 시간 트래커에 등록했습니다. 이제 링크가 만료되기 전에 계정을 활성화해야합니다.reset.subject
diff --git a/translations/email.pl.xlf b/translations/email.pl.xlf
index 1f0e9719..8ec9c815 100644
--- a/translations/email.pl.xlf
+++ b/translations/email.pl.xlf
@@ -4,7 +4,7 @@
button_copy_url_to_browser
- Jeśli przycisk nie działa, skopiuj & i wklej następujący link do przeglądarki: %link%
+ Jeśli przycisk nie działa, skopiuj & i wklej następujący link do przeglądarki: %url%automated_email_dont_answer
@@ -16,7 +16,7 @@
registration.title
- Witaj %nazwa użytkownika%
+ Witaj %username%registration.button
@@ -24,7 +24,7 @@
registration.intro
- Zarejestrowałeś się w w rejestratorze czasu Kimai za pomocą e-maila %e-mail%. Aktywuj konto w ciągu kilku godzin, zanim link wygaśnie.
+ Zarejestrowałeś się w w rejestratorze czasu Kimai za pomocą e-maila %email%. Aktywuj konto w ciągu kilku godzin, zanim link wygaśnie.reset.subject
diff --git a/translations/email.vi.xlf b/translations/email.vi.xlf
index 97a2436a..9aa73b32 100644
--- a/translations/email.vi.xlf
+++ b/translations/email.vi.xlf
@@ -24,7 +24,7 @@
registration.intro
- Bạn đã đăng ký theo dõi thời gian Kimai với email% email%. Bây giờ bạn phải kích hoạt tài khoản của mình trong vài giờ tới, trước khi liên kết hết hạn.
+ Bạn đã đăng ký theo dõi thời gian Kimai với email %email%. Bây giờ bạn phải kích hoạt tài khoản của mình trong vài giờ tới, trước khi liên kết hết hạn.reset.subject
diff --git a/translations/exceptions.el.xlf b/translations/exceptions.el.xlf
new file mode 100644
index 00000000..a7b42189
--- /dev/null
+++ b/translations/exceptions.el.xlf
@@ -0,0 +1,43 @@
+
+
+
+
+
+ access.denied
+ Η πρόσβαση απορρίφθηκε
+
+
+ stacktrace
+ Το πρόβλημα προέκυψε εδώ
+
+
+ http_error.title
+ Σφάλμα
+
+
+ http_error.description
+ Υπάρχει κάποιο λάθος
+
+
+ http_error.suggestion
+ Παρουσιάστηκε ένα κρίσιμο σφάλμα, παρακαλούμε δοκιμάστε ξανά. Ενδέχεται να έχετε βρει πρόβλημα στο λογισμικό, επικοινωνήστε με τον διαχειριστή σας εάν το πρόβλημα παραμένει.
+
+
+ http_error_404.description
+ Η σελίδα δεν βρέθηκε
+
+
+ http_error_404.suggestion
+ Δεν ήταν δυνατή η εύρεση της σελίδας που αναζητούσατε. Επιστρέψτε στον συνοπτικό πίνακα και ξανά-εκκινήσετε.
+
+
+ http_error_403.description
+ Σελίδα με περιορισμένη πρόσβαση
+
+
+ http_error_403.suggestion
+ Λυπούμαστε αλλά δεν έχετε, επαρκή δικαιώματα για να δείτε αυτήν τη σελίδα. Επικοινωνήστε με τον διαχειριστή σας εάν πιστεύετε ότι πρόκειται για σφάλμα.
+
+
+
+
diff --git a/translations/exceptions.sv.xlf b/translations/exceptions.sv.xlf
index 0e936865..ba374bec 100644
--- a/translations/exceptions.sv.xlf
+++ b/translations/exceptions.sv.xlf
@@ -1,53 +1,51 @@
-
-
-
-
-
- access.denied
- Åtkomst nekad
-
-
- stacktrace
- Ett problem uppstod här
-
-
- http_error.title
- Fel
-
-
- http_error.description
- Oj! Ett fel uppstod.
-
-
- http_error.suggestion
-
+
+
+
+
+
+ access.denied
+ Åtkomst nekad
+
+
+ stacktrace
+ Ett problem uppstod här
+
+
+ http_error.title
+ Fel
+
+
+ http_error.description
+ Oj! Ett fel uppstod
+
+
+ http_error.suggestion
+
Ett oväntat fel inträffade, försök igen.
Om problemet kvarstår efter att du försökt igen, kontakta din administratör.
Du kan ha hittat en bugg.
-
-
- http_error_404.description
- Oj! Sidan hittades inte
-
-
- http_error_404.suggestion
-
+
+
+ http_error_404.description
+ Oj! Sidan hittades inte
+
+
+ http_error_404.suggestion
+
Vi kunde inte hitta sidan du letade efter.
Under tiden kan du återvända till din dashboard och börja om.
-
-
- http_error_403.description
-
- Den här sidan är begränsad.
-
-
-
- http_error_403.suggestion
-
+
+
+ http_error_403.description
+ Den här sidan är begränsad
+
+
+ http_error_403.suggestion
+
Tyvärr har du inte tillräckligt med behörigheter för att se den här sidan.
Var vänlig och kontakta din administratör om du tycker att det här är ett fel.
-
-
-
+
+
+
diff --git a/translations/export.el.xlf b/translations/export.el.xlf
new file mode 100644
index 00000000..184be409
--- /dev/null
+++ b/translations/export.el.xlf
@@ -0,0 +1,19 @@
+
+
+
+
+
+ default.pdf.twig
+ Τυπικό
+
+
+ default-budget.pdf.twig
+ Με υπολειπόμενο προϋπολογισμό
+
+
+ default-internal.pdf.twig
+ Με εσωτερικές χρεώσεις
+
+
+
+
diff --git a/translations/export.pt-BR.xlf b/translations/export.pt-BR.xlf
new file mode 100644
index 00000000..461a8fbb
--- /dev/null
+++ b/translations/export.pt-BR.xlf
@@ -0,0 +1,11 @@
+
+
+
+
+
+ default.pdf.twig
+ Padrão
+
+
+
+
diff --git a/translations/flashmessages.ar.xlf b/translations/flashmessages.ar.xlf
index be1c7b05..fdd37eab 100644
--- a/translations/flashmessages.ar.xlf
+++ b/translations/flashmessages.ar.xlf
@@ -24,7 +24,7 @@
action.update.error
- لا يمكن حفظ التغييرات:٪ السبب٪
+ لا يمكن حفظ التغييرات:%reason%action.delete.success
@@ -32,7 +32,7 @@
action.delete.error
- لا يمكن حذف المشاركة:٪ السبب٪
+ لا يمكن حذف المشاركة:%reason%invoice.first_template
diff --git a/translations/flashmessages.el.xlf b/translations/flashmessages.el.xlf
new file mode 100644
index 00000000..ba53512b
--- /dev/null
+++ b/translations/flashmessages.el.xlf
@@ -0,0 +1,59 @@
+
+
+
+
+
+ warning
+ Προειδοποίηση
+
+
+ timesheet.stop.success
+ Η καταγραφή ωραρίου σταμάτησε
+
+
+ timesheet.stop.error
+ Η καταγραφή ωραρίου δεν μπόρεσε να σταματήσει
+
+
+ timesheet.start.success
+ Η καταγραφή ωραρίου ξεκίνησε
+
+
+ timesheet.start.error
+ Η καταγραφή ωραρίου δεν μπόρεσε να ξεκινήσει
+
+
+ timesheet.start.exceeded_limit
+ Έχει συμπληρωθεί το όριο των ενεργών καταγραφών ωραρίου, παρακαλούμε σταματήστε τουλάχιστον μία εκτελούμενη μέτρηση ωραρίου.
+
+
+ timesheet.locked.warning
+ Η εγγραφή που επεξεργάζεστε έχει ήδη εξαχθεί
+
+
+ action.update.success
+ Αποθηκευμένες αλλαγές
+
+
+ action.update.error
+ Δεν ήταν δυνατή η αποθήκευση των αλλαγών: %reason%
+
+
+ action.delete.success
+ Η καταχώριση διαγράφηκε
+
+
+ action.delete.error
+ Η καταχώριση δεν ήταν δυνατό να διαγραφεί: %reason%
+
+
+ invoice.first_template
+ Παρακαλούμε δημιουργήστε πρώτα ένα πρότυπο τιμολογίου
+
+
+ action.upload.error
+ Δεν ήταν δυνατή η μεταφόρτωση ή η αποθήκευση του αρχείου: %reason%
+
+
+
+
diff --git a/translations/flashmessages.eu.xlf b/translations/flashmessages.eu.xlf
index b7362e66..8e75ba07 100644
--- a/translations/flashmessages.eu.xlf
+++ b/translations/flashmessages.eu.xlf
@@ -52,7 +52,7 @@
action.upload.error
- Ezin izan da fitxategia kargatu edo gorde: % reason%
+ Ezin izan da fitxategia kargatu edo gorde: %reason%
diff --git a/translations/flashmessages.ko.xlf b/translations/flashmessages.ko.xlf
index 3e0f45f9..20021543 100644
--- a/translations/flashmessages.ko.xlf
+++ b/translations/flashmessages.ko.xlf
@@ -52,7 +52,7 @@
action.upload.error
- 파일을 업로드하거나 저장할 수 없습니다: % reason %
+ 파일을 업로드하거나 저장할 수 없습니다: %reason%
diff --git a/translations/flashmessages.ro.xlf b/translations/flashmessages.ro.xlf
index f88b32b7..3b37e637 100644
--- a/translations/flashmessages.ro.xlf
+++ b/translations/flashmessages.ro.xlf
@@ -55,7 +55,7 @@
action.upload.error
- Acest fișier nu a putut fi încărcat sau salvat
+ Acest fișier nu a putut fi încărcat sau salvat: %reason%