ソースを参照

Switch tap:i18n to custom TAPi18n implementation

Jan Küster 3 年 前
コミット
60af7766bf
100 ファイル変更1345 行追加254 行削除
  1. 8 4
      .meteor/packages
  2. 9 10
      .meteor/versions
  3. 1 0
      client/components/activities/activities.js
  4. 2 0
      client/components/boards/boardBody.js
  5. 2 0
      client/components/boards/boardHeader.js
  6. 2 1
      client/components/boards/boardsList.js
  7. 2 0
      client/components/cards/cardCustomFields.js
  8. 2 0
      client/components/cards/cardDate.js
  9. 2 1
      client/components/cards/cardDetails.js
  10. 2 0
      client/components/cards/cardTime.js
  11. 1 0
      client/components/cards/checklists.js
  12. 2 0
      client/components/cards/minicard.js
  13. 1 0
      client/components/lists/list.js
  14. 1 0
      client/components/lists/listBody.js
  15. 2 0
      client/components/lists/listHeader.js
  16. 1 0
      client/components/main/globalSearch.js
  17. 17 111
      client/components/main/layouts.js
  18. 2 0
      client/components/rules/triggers/cardTriggers.js
  19. 1 0
      client/components/settings/adminReports.js
  20. 2 0
      client/components/settings/informationBody.js
  21. 1 0
      client/components/settings/settingBody.js
  22. 2 0
      client/components/sidebar/sidebar.js
  23. 2 0
      client/components/sidebar/sidebarArchives.js
  24. 2 0
      client/components/sidebar/sidebarCustomFields.js
  25. 11 95
      client/components/users/userHeader.js
  26. 10 0
      client/config/blazeHelpers.js
  27. 1 0
      client/lib/cardSearch.js
  28. 3 0
      client/lib/datepicker.js
  29. 3 1
      client/lib/filter.js
  30. 11 17
      client/lib/i18n.js
  31. 2 0
      client/lib/popup.js
  32. 2 3
      config/accounts.js
  33. 2 1
      config/query-classes.js
  34. 12 10
      config/router.js
  35. 63 0
      imports/i18n/accounts.js
  36. 8 0
      imports/i18n/blaze.js
  37. 0 0
      imports/i18n/data/ar-EG.i18n.json
  38. 0 0
      imports/i18n/data/ar.i18n.json
  39. 0 0
      imports/i18n/data/bg.i18n.json
  40. 0 0
      imports/i18n/data/br.i18n.json
  41. 0 0
      imports/i18n/data/ca.i18n.json
  42. 0 0
      imports/i18n/data/cs.i18n.json
  43. 0 0
      imports/i18n/data/da.i18n.json
  44. 0 0
      imports/i18n/data/de-AT.i18n.json
  45. 0 0
      imports/i18n/data/de-CH.i18n.json
  46. 0 0
      imports/i18n/data/de.i18n.json
  47. 0 0
      imports/i18n/data/el-GR.i18n.json
  48. 1148 0
      imports/i18n/data/el.i18n.json
  49. 0 0
      imports/i18n/data/en-DE.i18n.json
  50. 0 0
      imports/i18n/data/en-GB.i18n.json
  51. 0 0
      imports/i18n/data/en-IT.i18n.json
  52. 0 0
      imports/i18n/data/en.i18n.json
  53. 0 0
      imports/i18n/data/eo.i18n.json
  54. 0 0
      imports/i18n/data/es-AR.i18n.json
  55. 0 0
      imports/i18n/data/es-CL.i18n.json
  56. 0 0
      imports/i18n/data/es-LA.i18n.json
  57. 0 0
      imports/i18n/data/es-MX.i18n.json
  58. 0 0
      imports/i18n/data/es-PE.i18n.json
  59. 0 0
      imports/i18n/data/es-PY.i18n.json
  60. 0 0
      imports/i18n/data/es.i18n.json
  61. 0 0
      imports/i18n/data/et-EE.i18n.json
  62. 0 0
      imports/i18n/data/eu.i18n.json
  63. 0 0
      imports/i18n/data/fa-IR.i18n.json
  64. 0 0
      imports/i18n/data/fa.i18n.json
  65. 0 0
      imports/i18n/data/fi.i18n.json
  66. 0 0
      imports/i18n/data/fr-CH.i18n.json
  67. 0 0
      imports/i18n/data/fr.i18n.json
  68. 0 0
      imports/i18n/data/gl-ES.i18n.json
  69. 0 0
      imports/i18n/data/gl.i18n.json
  70. 0 0
      imports/i18n/data/gu-IN.i18n.json
  71. 0 0
      imports/i18n/data/he.i18n.json
  72. 0 0
      imports/i18n/data/hi-IN.i18n.json
  73. 0 0
      imports/i18n/data/hi.i18n.json
  74. 0 0
      imports/i18n/data/hr.i18n.json
  75. 0 0
      imports/i18n/data/hu.i18n.json
  76. 0 0
      imports/i18n/data/hy.i18n.json
  77. 0 0
      imports/i18n/data/id.i18n.json
  78. 0 0
      imports/i18n/data/ig.i18n.json
  79. 0 0
      imports/i18n/data/it.i18n.json
  80. 0 0
      imports/i18n/data/ja.i18n.json
  81. 0 0
      imports/i18n/data/ka.i18n.json
  82. 0 0
      imports/i18n/data/km.i18n.json
  83. 0 0
      imports/i18n/data/ko.i18n.json
  84. 0 0
      imports/i18n/data/lt.i18n.json
  85. 0 0
      imports/i18n/data/lv.i18n.json
  86. 0 0
      imports/i18n/data/mk.i18n.json
  87. 0 0
      imports/i18n/data/mn.i18n.json
  88. 0 0
      imports/i18n/data/ms-MY.i18n.json
  89. 0 0
      imports/i18n/data/nb.i18n.json
  90. 0 0
      imports/i18n/data/nl.i18n.json
  91. 0 0
      imports/i18n/data/oc.i18n.json
  92. 0 0
      imports/i18n/data/pa.i18n.json
  93. 0 0
      imports/i18n/data/pl.i18n.json
  94. 0 0
      imports/i18n/data/pt-BR.i18n.json
  95. 0 0
      imports/i18n/data/pt.i18n.json
  96. 0 0
      imports/i18n/data/ro.i18n.json
  97. 0 0
      imports/i18n/data/ru-UA.i18n.json
  98. 0 0
      imports/i18n/data/ru.i18n.json
  99. 0 0
      imports/i18n/data/sk.i18n.json
  100. 0 0
      imports/i18n/data/sl.i18n.json

+ 8 - 4
.meteor/packages

@@ -41,10 +41,11 @@ kadira:dochead
 mquandalle:autofocus
 ongoworks:speakingurl
 raix:handlebar-helpers
-http@2.0.0
+http@2.0.0! # force new http package
 
 # UI components
 blaze
+ostrio:i18n
 reactive-var@1.0.11
 fortawesome:fontawesome
 mousetrap:mousetrap
@@ -59,9 +60,7 @@ email@2.1.1
 horka:swipebox
 dynamic-import@0.7.1
 rzymek:fullcalendar
-momentjs:moment@2.22.2
 browser-policy-framing@1.1.0
-mquandalle:moment
 msavin:usercache
 # Keep stylus in 1.1.0, because building v2 takes extra 52 minutes.
 coagmano:stylus@1.1.0!
@@ -124,8 +123,13 @@ pascoual:pdfkit
 lmieulet:meteor-coverage
 meteortesting:mocha
 aldeed:simple-schema
-accounts-password@2.0.0
+accounts-password
 matb33:collection-hooks
 simple:json-routes
 kadira:flow-router
 spacebars
+communitypackages:picker
+useraccounts:core
+useraccounts:unstyled
+useraccounts:flow-routing
+service-configuration

+ 9 - 10
.meteor/versions

@@ -20,8 +20,7 @@ browser-policy-common@1.0.11
 browser-policy-framing@1.1.0
 caching-compiler@1.2.2
 caching-html-compiler@1.2.1
-callback-hook@1.3.1
-cfs:http-methods@0.0.32
+callback-hook@1.4.0
 check@1.3.1
 coagmano:stylus@1.1.0
 coffeescript@2.4.1
@@ -77,7 +76,6 @@ meteorhacks:aggregate@1.3.0
 meteorhacks:collection-utils@1.2.0
 meteorhacks:picker@1.0.3
 meteorhacks:subs-manager@1.6.4
-meteorspark:util@0.2.0
 meteortesting:browser-tests@0.2.0
 meteortesting:mocha@0.6.0
 minifier-css@1.5.4
@@ -100,15 +98,14 @@ mquandalle:collection-mutations@0.1.0
 mquandalle:jade@0.4.9
 mquandalle:jade-compiler@0.4.5
 mquandalle:jquery-textcomplete@0.8.0_1
-mquandalle:jquery-ui-drag-drop-sort@0.2.0
-mquandalle:moment@1.0.1
 mquandalle:mousetrap-bindglobal@0.0.1
-mrt:just-i18n@0.3.0
 msavin:usercache@1.8.0
 npm-mongo@3.9.1
 observe-sequence@1.0.19
 ongoworks:speakingurl@1.1.0
 ordered-dict@1.1.0
+ostrio:cstorage@2.2.2
+ostrio:i18n@3.1.0
 pascoual:pdfkit@1.0.7
 peerlibrary:assert@0.3.0
 peerlibrary:base-component@0.17.1
@@ -186,9 +183,8 @@ simple:json-routes@2.1.0
 socket-stream-client@0.4.0
 spacebars@1.2.0
 spacebars-compiler@1.3.0
-standard-minifier-css@1.7.3
-standard-minifier-js@2.6.1
-tap:i18n@1.8.2
+standard-minifier-css@1.7.4
+standard-minifier-js@2.8.0
 templates:tabs@2.3.0
 templating@1.4.1
 templating-compiler@1.4.1
@@ -199,7 +195,10 @@ twbs:bootstrap@3.3.6
 ui@1.0.13
 underscore@1.0.10
 url@1.3.2
-webapp@1.11.1
+useraccounts:core@1.16.2
+useraccounts:flow-routing@1.15.0
+useraccounts:unstyled@1.14.2
+webapp@1.13.0
 webapp-hashing@1.1.0
 wekan-markdown@1.0.9
 zimme:active-route@2.3.2

+ 1 - 0
client/components/activities/activities.js

@@ -1,4 +1,5 @@
 import DOMPurify from 'dompurify';
+import { TAPi18n } from '/imports/i18n';
 
 const activitiesPerPage = 500;
 

+ 2 - 0
client/components/boards/boardBody.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 const subManager = new SubsManager();
 const { calculateIndex } = Utils;
 const swimlaneWhileSortingHeight = 150;

+ 2 - 0
client/components/boards/boardHeader.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 /*
 const DOWNCLS = 'fa-sort-down';
 const UPCLS = 'fa-sort-up';

+ 2 - 1
client/components/boards/boardsList.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 const subManager = new SubsManager();
 
 Template.boardListHeaderBar.events({
@@ -33,7 +35,6 @@ BlazeComponent.extendComponent({
     }
     if (userLanguage) {
       TAPi18n.setLanguage(userLanguage);
-      T9n.setLanguage(userLanguage);
     }
   },
 

+ 2 - 0
client/components/cards/cardCustomFields.js

@@ -1,3 +1,5 @@
+import moment from 'moment';
+import { TAPi18n } from '/imports/i18n';
 import { DatePicker } from '/client/lib/datepicker';
 import Cards from '/models/cards';
 

+ 2 - 0
client/components/cards/cardDate.js

@@ -1,3 +1,5 @@
+import moment from 'moment';
+import { TAPi18n } from '/imports/i18n';
 import { DatePicker } from '/client/lib/datepicker';
 
 Template.dateBadge.helpers({

+ 2 - 1
client/components/cards/cardDetails.js

@@ -1,3 +1,5 @@
+import moment from 'moment';
+import { TAPi18n } from '/imports/i18n';
 import { DatePicker } from '/client/lib/datepicker';
 import Cards from '/models/cards';
 import Boards from '/models/boards';
@@ -7,7 +9,6 @@ import Users from '/models/users';
 import Lists from '/models/lists';
 import CardComments from '/models/cardComments';
 import { ALLOWED_COLORS } from '/config/const';
-import moment from 'moment';
 import { UserAvatar } from '../users/userAvatar';
 
 const subManager = new SubsManager();

+ 2 - 0
client/components/cards/cardTime.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 BlazeComponent.extendComponent({
   template() {
     return 'editCardSpentTime';

+ 1 - 0
client/components/cards/checklists.js

@@ -1,3 +1,4 @@
+import { TAPi18n } from '/imports/i18n';
 import Cards from '/models/cards';
 import Boards from '/models/boards';
 

+ 2 - 0
client/components/cards/minicard.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 // Template.cards.events({
 //   'click .member': Popup.open('cardMember')
 // });

+ 1 - 0
client/components/lists/list.js

@@ -1,3 +1,4 @@
+import { TAPi18n } from '/imports/i18n';
 require('/client/lib/jquery-ui.js')
 
 const { calculateIndex } = Utils;

+ 1 - 0
client/components/lists/listBody.js

@@ -1,3 +1,4 @@
+import { TAPi18n } from '/imports/i18n';
 import { Spinner } from '/client/lib/spinner';
 
 const subManager = new SubsManager();

+ 2 - 0
client/components/lists/listHeader.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 let listsColors;
 Meteor.startup(() => {
   listsColors = Lists.simpleSchema()._schema.color.allowedValues;

+ 1 - 0
client/components/main/globalSearch.js

@@ -1,3 +1,4 @@
+import { TAPi18n } from '/imports/i18n';
 import { CardSearchPagedComponent } from '../../lib/cardSearch';
 import Boards from '../../../models/boards';
 import { Query, QueryErrors } from '../../../config/query-classes';

+ 17 - 111
client/components/main/layouts.js

@@ -1,10 +1,6 @@
-BlazeLayout.setRoot('body');
+import { TAPi18n } from '/imports/i18n';
 
-const i18nTagToT9n = i18nTag => {
-  // t9n/i18n tags are same now, see: https://github.com/softwarerero/meteor-accounts-t9n/pull/129
-  // but we keep this conversion function here, to be aware that that they are different system.
-  return i18nTag;
-};
+BlazeLayout.setRoot('body');
 
 let alreadyCheck = 1;
 let isCheckDone = false;
@@ -60,11 +56,6 @@ Template.userFormsLayout.onRendered(() => {
     AccountsTemplates.state.form.keys,
     validator,
   );
-
-  const i18nTag = navigator.language;
-  if (i18nTag) {
-    T9n.setLanguage(i18nTagToT9n(i18nTag));
-  }
   EscapeActions.executeAll();
 });
 
@@ -89,11 +80,11 @@ Template.userFormsLayout.helpers({
   getLegalNoticeWithWritTraduction(){
     let spanLegalNoticeElt = $("#legalNoticeSpan");
     if(spanLegalNoticeElt != null && spanLegalNoticeElt != undefined){
-      spanLegalNoticeElt.html(TAPi18n.__('acceptance_of_our_legalNotice', {}, T9n.getLanguage() || 'en'));
+      spanLegalNoticeElt.html(TAPi18n.__('acceptance_of_our_legalNotice', {}));
     }
     let atLinkLegalNoticeElt = $("#legalNoticeAtLink");
     if(atLinkLegalNoticeElt != null && atLinkLegalNoticeElt != undefined){
-      atLinkLegalNoticeElt.html(TAPi18n.__('legalNotice', {}, T9n.getLanguage() || 'en'));
+      atLinkLegalNoticeElt.html(TAPi18n.__('legalNotice', {}));
     }
     return true;
   },
@@ -111,112 +102,27 @@ Template.userFormsLayout.helpers({
   },
 
   languages() {
-    return _.map(TAPi18n.getLanguages(), (lang, code) => {
-      const tag = code;
-      let name = lang.name;
-      if (lang.name === 'br') {
-        name = 'Brezhoneg';
-      } else if (lang.name === 'ar-EG') {
-        // ar-EG = Arabic (Egypt), simply Masri (مَصرى, [ˈmɑsˤɾi], Egyptian, Masr refers to Cairo)
-        name = 'مَصرى';
-      } else if (lang.name === 'de-CH') {
-        name = 'Deutsch (Schweiz)';
-      } else if (lang.name === 'de-AT') {
-        name = 'Deutsch (Österreich)';
-      } else if (lang.name === 'en-DE') {
-        name = 'English (Germany)';
-      } else if (lang.name === 'et-EE') {
-        name = 'eesti keel (Eesti)';
-      } else if (lang.name === 'fa-IR') {
-        // fa-IR = Persian (Iran)
-        name = 'فارسی/پارسی (ایران‎)';
-      } else if (lang.name === 'fr-BE') {
-        name = 'Français (Belgique)';
-      } else if (lang.name === 'fr-CA') {
-        name = 'Français (Canada)';
-      } else if (lang.name === 'fr-CH') {
-        name = 'Français (Schweiz)';
-      } else if (lang.name === 'gu-IN') {
-        // gu-IN = Gurajati (India)
-        name = 'ગુજરાતી';
-      } else if (lang.name === 'hi-IN') {
-        // hi-IN = Hindi (India)
-        name = 'हिंदी (भारत)';
-      } else if (lang.name === 'ig') {
-        name = 'Igbo';
-      } else if (lang.name === 'lv') {
-        name = 'Latviešu';
-      } else if (lang.name === 'latviešu valoda') {
-        name = 'Latviešu';
-      } else if (lang.name === 'ms-MY') {
-        // ms-MY = Malay (Malaysia)
-        name = 'بهاس ملايو';
-      } else if (lang.name === 'en-IT') {
-        name = 'English (Italy)';
-      } else if (lang.name === 'el-GR') {
-        // el-GR = Greek (Greece)
-        name = 'Ελληνικά (Ελλάδα)';
-      } else if (lang.name === 'Español') {
-        name = 'español';
-      } else if (lang.name === 'es_419') {
-        name = 'español de América Latina';
-      } else if (lang.name === 'es-419') {
-        name = 'español de América Latina';
-      } else if (lang.name === 'Español de América Latina') {
-        name = 'español de América Latina';
-      } else if (lang.name === 'es-LA') {
-        name = 'español de América Latina';
-      } else if (lang.name === 'Español de Argentina') {
-        name = 'español de Argentina';
-      } else if (lang.name === 'Español de Chile') {
-        name = 'español de Chile';
-      } else if (lang.name === 'Español de Colombia') {
-        name = 'español de Colombia';
-      } else if (lang.name === 'Español de México') {
-        name = 'español de México';
-      } else if (lang.name === 'es-PY') {
-        name = 'español de Paraguayo';
-      } else if (lang.name === 'Español de Paraguayo') {
-        name = 'español de Paraguayo';
-      } else if (lang.name === 'Español de Perú') {
-        name = 'español de Perú';
-      } else if (lang.name === 'Español de Puerto Rico') {
-        name = 'español de Puerto Rico';
-      } else if (lang.name === 'gl-ES') {
-        name = 'Galego (España)';
-      } else if (lang.name === 'oc') {
-        name = 'Occitan';
-      } else if (lang.name === 'ru-UA') {
-        name = 'Русский (Украина)';
-      } else if (lang.name === 'st') {
-        name = 'Sãotomense';
-      } else if (lang.name === 'uk-UA') {
-        name = 'українська (Україна)';
-      } else if (lang.name === '繁体中文(台湾)') {
-        // Traditional Chinese (Taiwan)
-        name = '繁體中文(台灣)';
-      }
-      return { tag, name };
-    }).sort(function(a, b) {
-      if (a.name === b.name) {
-        return 0;
-      } else {
-        return a.name > b.name ? 1 : -1;
-      }
-    });
+    return TAPi18n.getSupportedLanguages()
+      .map(({ isoCode, name }) => ({ tag: isoCode, name }))
+      .sort((a, b) => {
+        if (a.name === b.name) {
+          return 0;
+        } else {
+          return a.name > b.name ? 1 : -1;
+        }
+      });
   },
 
   isCurrentLanguage() {
-    const t9nTag = i18nTagToT9n(this.tag);
-    const curLang = T9n.getLanguage() || 'en';
-    return t9nTag === curLang;
+    const curLang = TAPi18n.getLanguage();
+    return this.tag === curLang;
   },
 });
 
 Template.userFormsLayout.events({
   'change .js-userform-set-language'(event) {
-    const i18nTag = $(event.currentTarget).val();
-    T9n.setLanguage(i18nTagToT9n(i18nTag));
+    const tag = $(event.currentTarget).val();
+    TAPi18n.setLanguage(tag);
     event.preventDefault();
   },
   'click #at-btn'(event, templateInstance) {

+ 2 - 0
client/components/rules/triggers/cardTriggers.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 BlazeComponent.extendComponent({
   onCreated() {
     this.subscribe('allRules');

+ 1 - 0
client/components/settings/adminReports.js

@@ -1,3 +1,4 @@
+import { TAPi18n } from '/imports/i18n';
 import { AttachmentStorage } from '/models/attachments';
 import { CardSearchPagedComponent } from '/client/lib/cardSearch';
 import SessionData from '/models/usersessiondata';

+ 2 - 0
client/components/settings/informationBody.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 BlazeComponent.extendComponent({
   onCreated() {
     this.info = new ReactiveVar({});

+ 1 - 0
client/components/settings/settingBody.js

@@ -1,3 +1,4 @@
+import { TAPi18n } from '/imports/i18n';
 import { ALLOWED_WAIT_SPINNERS } from '/config/const';
 
 BlazeComponent.extendComponent({

+ 2 - 0
client/components/sidebar/sidebar.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 Sidebar = null;
 
 const defaultView = 'home';

+ 2 - 0
client/components/sidebar/sidebarArchives.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 //archivedRequested = false;
 const subManager = new SubsManager();
 

+ 2 - 0
client/components/sidebar/sidebarCustomFields.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 BlazeComponent.extendComponent({
   customFields() {
     return CustomFields.find({

+ 11 - 95
client/components/users/userHeader.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 Template.headerUserBar.events({
   'click .js-open-header-member-menu': Popup.open('memberMenu'),
   'click .js-change-avatar': Popup.open('changeAvatar'),
@@ -256,101 +258,15 @@ Template.changePasswordPopup.onRendered(function() {
 
 Template.changeLanguagePopup.helpers({
   languages() {
-    return _.map(TAPi18n.getLanguages(), (lang, code) => {
-      // Same code in /client/components/main/layouts.js
-      // TODO : Make code reusable
-      const tag = code;
-      let name = lang.name;
-      if (lang.name === 'br') {
-        name = 'Brezhoneg';
-      } else if (lang.name === 'ar-EG') {
-        // ar-EG = Arabic (Egypt), simply Masri (مَصرى, [ˈmɑsˤɾi], Egyptian, Masr refers to Cairo)
-        name = 'مَصرى';
-      } else if (lang.name === 'de-CH') {
-        name = 'Deutsch (Schweiz)';
-      } else if (lang.name === 'de-AT') {
-        name = 'Deutsch (Österreich)';
-      } else if (lang.name === 'en-DE') {
-        name = 'English (Germany)';
-      } else if (lang.name === 'et-EE') {
-        name = 'eesti keel (Eesti)';
-      } else if (lang.name === 'fa-IR') {
-        // fa-IR = Persian (Iran)
-        name = 'فارسی/پارسی (ایران‎)';
-      } else if (lang.name === 'fr-BE') {
-        name = 'Français (Belgique)';
-      } else if (lang.name === 'fr-CA') {
-        name = 'Français (Canada)';
-      } else if (lang.name === 'fr-CH') {
-        name = 'Français (Schweiz)';
-      } else if (lang.name === 'gu-IN') {
-        // gu-IN = Gurajati (India)
-        name = 'ગુજરાતી';
-      } else if (lang.name === 'hi-IN') {
-        // hi-IN = Hindi (India)
-        name = 'हिंदी (भारत)';
-      } else if (lang.name === 'ig') {
-        name = 'Igbo';
-      } else if (lang.name === 'lv') {
-        name = 'Latviešu';
-      } else if (lang.name === 'latviešu valoda') {
-        name = 'Latviešu';
-      } else if (lang.name === 'ms-MY') {
-        // ms-MY = Malay (Malaysia)
-        name = 'بهاس ملايو';
-      } else if (lang.name === 'en-IT') {
-        name = 'English (Italy)';
-      } else if (lang.name === 'el-GR') {
-        // el-GR = Greek (Greece)
-        name = 'Ελληνικά (Ελλάδα)';
-      } else if (lang.name === 'Español') {
-        name = 'español';
-      } else if (lang.name === 'es_419') {
-        name = 'español de América Latina';
-      } else if (lang.name === 'es-419') {
-        name = 'español de América Latina';
-      } else if (lang.name === 'Español de América Latina') {
-        name = 'español de América Latina';
-      } else if (lang.name === 'es-LA') {
-        name = 'español de América Latina';
-      } else if (lang.name === 'Español de Argentina') {
-        name = 'español de Argentina';
-      } else if (lang.name === 'Español de Chile') {
-        name = 'español de Chile';
-      } else if (lang.name === 'Español de Colombia') {
-        name = 'español de Colombia';
-      } else if (lang.name === 'Español de México') {
-        name = 'español de México';
-      } else if (lang.name === 'es-PY') {
-        name = 'español de Paraguayo';
-      } else if (lang.name === 'Español de Paraguayo') {
-        name = 'español de Paraguayo';
-      } else if (lang.name === 'Español de Perú') {
-        name = 'español de Perú';
-      } else if (lang.name === 'Español de Puerto Rico') {
-        name = 'español de Puerto Rico';
-      } else if (lang.name === 'gl-ES') {
-        name = 'Galego (España)';
-      } else if (lang.name === 'oc') {
-        name = 'Occitan';
-      } else if (lang.name === 'ru-UA') {
-        name = 'Русский (Украина)';
-      } else if (lang.name === 'st') {
-        name = 'Sãotomense';
-      } else if (lang.name === 'uk-UA') {
-        name = 'українська (Україна)';
-      } else if (lang.name === '繁体中文(台湾)') {
-        // Traditional Chinese (Taiwan)
-        name = '繁體中文(台灣)';
-      }
-      return { tag, name };
-    }).sort(function(a, b) {
-      if (a.name === b.name) {
-        return 0;
-      } else {
-        return a.name > b.name ? 1 : -1;
-      }
-    });
+    return TAPi18n.getSupportedLanguages()
+      .map(({ isoCode, name }) => ({ tag: isoCode, name }))
+      .sort((a, b) => {
+        if (a.name === b.name) {
+          return 0;
+        } else {
+          return a.name > b.name ? 1 : -1;
+        }
+      });
   },
 
   isCurrentLanguage() {

+ 10 - 0
client/config/blazeHelpers.js

@@ -1,3 +1,7 @@
+import { Blaze } from 'meteor/blaze';
+import { Session } from 'meteor/session';
+import moment from 'moment';
+
 Blaze.registerHelper('currentBoard', () => {
   const ret = Utils.getCurrentBoard();
   return ret;
@@ -30,3 +34,9 @@ Blaze.registerHelper('isShowDesktopDragHandles', () =>
 Blaze.registerHelper('isMiniScreenOrShowDesktopDragHandles', () =>
   Utils.isMiniScreenOrShowDesktopDragHandles(),
 );
+
+Blaze.registerHelper('moment', (...args) => {
+  args.pop(); // hash
+  const [date, format] = args;
+  return moment(date).format(format);
+});

+ 1 - 0
client/lib/cardSearch.js

@@ -1,3 +1,4 @@
+import { TAPi18n } from '/imports/i18n';
 import Cards from '../../models/cards';
 import SessionData from '../../models/usersessiondata';
 import {QueryDebug} from "../../config/query-classes";

+ 3 - 0
client/lib/datepicker.js

@@ -1,3 +1,6 @@
+import { TAPi18n } from '/imports/i18n';
+import moment from 'moment';
+
 // Helper function to replace HH with H for 24 hours format, because H allows also single-digit hours
 function adjustedTimeFormat() {
   return moment

+ 3 - 1
client/lib/filter.js

@@ -1,3 +1,5 @@
+import moment from 'moment';
+
 // Filtered view manager
 // We define local filter objects for each different type of field (SetFilter,
 // RangeFilter, dateFilter, etc.). We then define a global `Filter` object whose
@@ -721,7 +723,7 @@ Filter = {
       isFilterActive = true;
       selectors.push(this.advanced._getMongoSelector());
     }
-    
+
     if(isFilterActive) {
       return {
         $or: selectors,

+ 11 - 17
client/lib/i18n.js

@@ -1,27 +1,21 @@
+import { TAPi18n } from '/imports/i18n';
+
 // We save the user language preference in the user profile, and use that to set
 // the language reactively. If the user is not connected we use the language
 // information provided by the browser, and default to english.
 
 Meteor.startup(() => {
-  TAPi18n.conf.i18n_files_route = Meteor._relativeToSiteRootUrl('/tap-i18n');
   const currentUser = Meteor.user();
-  let language;
-  if (currentUser) {
-    language = currentUser.profile && currentUser.profile.language;
-  }
-
-  if (!language) {
-    if (navigator.languages) {
-      language = navigator.languages[0];
-    } else {
-      language = navigator.language || navigator.userLanguage;
-    }
-  }
-
+  // Select first available language
+  const [language] = [
+    // User profile
+    currentUser?.profile?.language,
+    // Browser locale
+    navigator.languages?.at(0),
+    navigator.language,
+    navigator.userLanguage,
+  ].filter(Boolean);
   if (language) {
     TAPi18n.setLanguage(language);
-    // eslint-disable-next-line no-console
-    // console.log('language set!');
-    T9n.setLanguage(language);
   }
 });

+ 2 - 0
client/lib/popup.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 window.Popup = new (class {
   constructor() {
     // The template we use to render popups

+ 2 - 3
config/accounts.js

@@ -1,4 +1,5 @@
-/*
+import { TAPi18n } from '/imports/i18n';
+
 const passwordField = AccountsTemplates.removeField('password');
 const emailField = AccountsTemplates.removeField('email');
 
@@ -89,5 +90,3 @@ if (Meteor.isServer) {
     };
   });
 }
-
-*/

+ 2 - 1
config/query-classes.js

@@ -1,3 +1,5 @@
+import moment from 'moment';
+import { TAPi18n } from '/imports/i18n';
 import {
   OPERATOR_ASSIGNEE,
   OPERATOR_BOARD,
@@ -46,7 +48,6 @@ import {
   PREDICATE_YEAR,
 } from './search-const';
 import Boards from '../models/boards';
-import moment from 'moment';
 
 export class QueryDebug {
   predicate = null;

+ 12 - 10
config/router.js

@@ -1,3 +1,5 @@
+import { TAPi18n } from '/imports/i18n';
+
 let previousPath;
 FlowRouter.triggers.exit([
   ({ path }) => {
@@ -7,7 +9,7 @@ FlowRouter.triggers.exit([
 
 FlowRouter.route('/', {
   name: 'home',
-  //triggersEnter: [qAccountsTemplates.ensureSignedIn],
+  triggersEnter: [AccountsTemplates.ensureSignedIn],
   action() {
     Session.set('currentBoard', null);
     Session.set('currentList', null);
@@ -31,7 +33,7 @@ FlowRouter.route('/', {
 
 FlowRouter.route('/public', {
   name: 'public',
-  //triggersEnter: [AccountsTemplates.ensureSignedIn],
+  triggersEnter: [AccountsTemplates.ensureSignedIn],
   action() {
     Session.set('currentBoard', null);
     Session.set('currentList', null);
@@ -150,7 +152,7 @@ FlowRouter.route('/b/templates', {
 
 FlowRouter.route('/my-cards', {
   name: 'my-cards',
-  //triggersEnter: [AccountsTemplates.ensureSignedIn],
+  triggersEnter: [AccountsTemplates.ensureSignedIn],
   action() {
     Filter.reset();
     Session.set('sortBy', '');
@@ -170,7 +172,7 @@ FlowRouter.route('/my-cards', {
 
 FlowRouter.route('/due-cards', {
   name: 'due-cards',
-  //triggersEnter: [AccountsTemplates.ensureSignedIn],
+  triggersEnter: [AccountsTemplates.ensureSignedIn],
   action() {
     Filter.reset();
     Session.set('sortBy', '');
@@ -190,7 +192,7 @@ FlowRouter.route('/due-cards', {
 
 FlowRouter.route('/global-search', {
   name: 'global-search',
-  //triggersEnter: [AccountsTemplates.ensureSignedIn],
+  triggersEnter: [AccountsTemplates.ensureSignedIn],
   action() {
     Filter.reset();
     Session.set('sortBy', '');
@@ -236,7 +238,7 @@ FlowRouter.route('/broken-cards', {
 
 FlowRouter.route('/import/:source', {
   name: 'import',
-  //triggersEnter: [AccountsTemplates.ensureSignedIn],
+  triggersEnter: [AccountsTemplates.ensureSignedIn],
   action(params) {
     if (Session.get('currentBoard')) {
       Session.set('fromBoard', Session.get('currentBoard'));
@@ -261,7 +263,7 @@ FlowRouter.route('/import/:source', {
 FlowRouter.route('/setting', {
   name: 'setting',
   triggersEnter: [
-    //AccountsTemplates.ensureSignedIn,
+    AccountsTemplates.ensureSignedIn,
     () => {
       Session.set('currentBoard', null);
       Session.set('currentList', null);
@@ -286,7 +288,7 @@ FlowRouter.route('/setting', {
 FlowRouter.route('/information', {
   name: 'information',
   triggersEnter: [
-    //AccountsTemplates.ensureSignedIn,
+    AccountsTemplates.ensureSignedIn,
     () => {
       Session.set('currentBoard', null);
       Session.set('currentList', null);
@@ -310,7 +312,7 @@ FlowRouter.route('/information', {
 FlowRouter.route('/people', {
   name: 'people',
   triggersEnter: [
-    //AccountsTemplates.ensureSignedIn,
+    AccountsTemplates.ensureSignedIn,
     () => {
       Session.set('currentBoard', null);
       Session.set('currentList', null);
@@ -334,7 +336,7 @@ FlowRouter.route('/people', {
 FlowRouter.route('/admin-reports', {
   name: 'admin-reports',
   triggersEnter: [
-    //AccountsTemplates.ensureSignedIn,
+    AccountsTemplates.ensureSignedIn,
     () => {
       Session.set('currentBoard', null);
       Session.set('currentList', null);

+ 63 - 0
imports/i18n/accounts.js

@@ -0,0 +1,63 @@
+// Load all useraccounts translations at once
+import { Tracker } from 'meteor/tracker';
+import { T9n } from 'meteor-accounts-t9n';
+import { TAPi18n } from './tap';
+
+T9n.setTracker({ Tracker });
+
+T9n.map('ar', require('meteor-accounts-t9n/build/ar').ar);
+T9n.map('ca', require('meteor-accounts-t9n/build/ca').ca);
+T9n.map('cs', require('meteor-accounts-t9n/build/cs').cs);
+T9n.map('da', require('meteor-accounts-t9n/build/da').da);
+T9n.map('de', require('meteor-accounts-t9n/build/de').de);
+T9n.map('el', require('meteor-accounts-t9n/build/el').el);
+T9n.map('en', require('meteor-accounts-t9n/build/en').en);
+T9n.map('es', require('meteor-accounts-t9n/build/es').es);
+T9n.map('es-ES', require('meteor-accounts-t9n/build/es_ES').es_ES);
+T9n.map('es-ES-formal', require('meteor-accounts-t9n/build/es_ES_formal').es_ES_formal);
+T9n.map('es-formal', require('meteor-accounts-t9n/build/es_formal').es_formal);
+T9n.map('et', require('meteor-accounts-t9n/build/et').et);
+T9n.map('fa', require('meteor-accounts-t9n/build/fa').fa);
+T9n.map('fi', require('meteor-accounts-t9n/build/fi').fi);
+T9n.map('fr', require('meteor-accounts-t9n/build/fr').fr);
+T9n.map('fr-CA', require('meteor-accounts-t9n/build/fr_CA').fr_CA);
+T9n.map('he', require('meteor-accounts-t9n/build/he').he);
+T9n.map('hr', require('meteor-accounts-t9n/build/hr').hr);
+T9n.map('hu', require('meteor-accounts-t9n/build/hu').hu);
+T9n.map('id', require('meteor-accounts-t9n/build/id').id);
+T9n.map('it', require('meteor-accounts-t9n/build/it').it);
+T9n.map('ja', require('meteor-accounts-t9n/build/ja').ja);
+T9n.map('kh', require('meteor-accounts-t9n/build/kh').kh);
+T9n.map('ko', require('meteor-accounts-t9n/build/ko').ko);
+T9n.map('nl', require('meteor-accounts-t9n/build/nl').nl);
+T9n.map('no-NB', require('meteor-accounts-t9n/build/no_NB').no_NB);
+T9n.map('pl', require('meteor-accounts-t9n/build/pl').pl);
+T9n.map('pt', require('meteor-accounts-t9n/build/pt').pt);
+T9n.map('pt-PT', require('meteor-accounts-t9n/build/pt_PT').pt_PT);
+T9n.map('ro', require('meteor-accounts-t9n/build/ro').ro);
+T9n.map('ru', require('meteor-accounts-t9n/build/ru').ru);
+T9n.map('sk', require('meteor-accounts-t9n/build/sk').sk);
+T9n.map('sl', require('meteor-accounts-t9n/build/sl').sl);
+T9n.map('sv', require('meteor-accounts-t9n/build/sv').sv);
+T9n.map('th', require('meteor-accounts-t9n/build/th').th);
+T9n.map('tr', require('meteor-accounts-t9n/build/tr').tr);
+T9n.map('uk', require('meteor-accounts-t9n/build/uk').uk);
+T9n.map('vi', require('meteor-accounts-t9n/build/vi').vi);
+T9n.map('zh-CN', require('meteor-accounts-t9n/build/zh_CN').zh_CN);
+T9n.map('zh-HK', require('meteor-accounts-t9n/build/zh_HK').zh_HK);
+T9n.map('zh-TW', require('meteor-accounts-t9n/build/zh_TW').zh_TW);
+
+// Reactively adjust useraccounts:core translations
+Tracker.autorun(() => {
+  const language = TAPi18n.getLanguage();
+  try {
+    T9n.setLanguage(language);
+  } catch (err) {
+    // Try to extract & set the language part only (e.g. "en" instead of "en-UK")
+    try {
+      T9n.setLanguage(language.split('-')[0]);
+    } catch (err) {
+      console.error(err);
+    }
+  }
+});

+ 8 - 0
imports/i18n/blaze.js

@@ -0,0 +1,8 @@
+import { Blaze } from 'meteor/blaze';
+import { TAPi18n } from './tap';
+
+Blaze.registerHelper('_', (...args) => {
+  const { hash } = args.pop();
+  const [key] = args.splice(0, 1);
+  return TAPi18n.__(key, { ...hash, sprintf: args });
+});

+ 0 - 0
i18n/ar-EG.i18n.json → imports/i18n/data/ar-EG.i18n.json


+ 0 - 0
i18n/ar.i18n.json → imports/i18n/data/ar.i18n.json


+ 0 - 0
i18n/bg.i18n.json → imports/i18n/data/bg.i18n.json


+ 0 - 0
i18n/br.i18n.json → imports/i18n/data/br.i18n.json


+ 0 - 0
i18n/ca.i18n.json → imports/i18n/data/ca.i18n.json


+ 0 - 0
i18n/cs.i18n.json → imports/i18n/data/cs.i18n.json


+ 0 - 0
i18n/da.i18n.json → imports/i18n/data/da.i18n.json


+ 0 - 0
i18n/de-AT.i18n.json → imports/i18n/data/de-AT.i18n.json


+ 0 - 0
i18n/de-CH.i18n.json → imports/i18n/data/de-CH.i18n.json


+ 0 - 0
i18n/de.i18n.json → imports/i18n/data/de.i18n.json


+ 0 - 0
i18n/el-GR.i18n.json → imports/i18n/data/el-GR.i18n.json


+ 1148 - 0
imports/i18n/data/el.i18n.json

@@ -0,0 +1,1148 @@
+{
+    "accept": "Αποδοχή",
+    "act-activity-notify": "Ειδοποίηση δραστηριότητας",
+    "act-addAttachment": "προσετέθη το συνημμένο __attachment__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-deleteAttachment": "διεγράφη το συνημμένο __attachment__ από την κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-addSubtask": "προστέθηκε η υποεργασία __subtask__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-addLabel": "Προστέθηκε η ετικέτα __label__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-addedLabel": "Προστέθηκε η ετικέτα __label__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-removeLabel": "Διεγράφη η ετικέτα __label__ από την κάρτα __card__ της λίστας __list__ της λωρίδας __swimlane__ του πίνακα __board__",
+    "act-removedLabel": "Διεγράφη η ετικέτα __label__ από την κάρτα __card__ της λίστας __list__ της λωρίδας __swimlane__ του πίνακα __board__",
+    "act-addChecklist": "προστέθηκε η λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-addChecklistItem": "προστέθηκε το στοιχείο  __checklistItem__ στη λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-removeChecklist": "διεγράφη η λίστα ελέγχου - checklist __checklist__ από την κάρτα __card__ της λίστας __list__ της λωρίδας __swimlane__ του πίνακα __board__",
+    "act-removeChecklistItem": "διεγράφη το στοιχείο __checklistItem__ από τη λίστα ελέγχου - checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__\nεπιλέχθηκε το στοιχείο __checklistItem__ της λίστας ελέγχου - checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-uncheckedItem": "αποεπιλέχθηκε το στοιχείο __checklistItem__ της λίστας ελέγχου - checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-completeChecklist": "ολοκληρώθηκε η λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-uncompleteChecklist": "σημάνθηκε ως ημιτελής η λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-addComment": "προσέθεσε σχόλιο στην κάρτα __card__: __comment__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-editComment": "μετέβαλε σχόλιο στην κάρτα __card__: __comment__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-deleteComment": "διεγράφη σχόλιο στην κάρτα __card__: __comment__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-createBoard": "δημιουργήθηκε ο πίνακας __board__",
+    "act-createSwimlane": "δημιουργήθηκε η λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-createCard": "δημιουργήθηκε η κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-createCustomField": "δημιουργήθηκε το προσαρμοσμένο πεδίο __customField__ στον πίνακα __board__",
+    "act-deleteCustomField": "διεγράφη το προσαρμοσμένο πεδίο __customField__ στον πίνακα __board__",
+    "act-setCustomField": "υπέστη επεξεργασία η τιμή του προσαρμοσμένου πεδίου __customField__: __customFieldValue__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-createList": "προστέθηκε η λίστα __list__ στον πίνακα __board__",
+    "act-addBoardMember": "προστέθηκε το μέλος __member__ στον πίνακα __board__",
+    "act-archivedBoard": "Ο πίνακας __board__ μεταφέρθηκε στο Αρχείο",
+    "act-archivedCard": "Η κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__ μεταφέρθηκε στο Αρχείο",
+    "act-archivedList": "Η λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__ μεταφέρθηκε στο Αρχείο",
+    "act-archivedSwimlane": "Η λωρίδα __swimlane__ στον πίνακα __board__ μεταφέρθηκε στο Αρχείο",
+    "act-importBoard": "Εισήχθη ο πίνακας __board__",
+    "act-importCard": "εισήχθη η κάρτα  __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-importList": "εισήχθη η λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-joinMember": "προστέθηκε το μέλος __member__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-moveCard": "μετακίνησε την κάρτα __card__ στον πίνακα __board__ από τη λίστα __oldList__ της λωρίδας __oldSwimlane__ στη λίστα __list__ στη λωρίδα __swimlane__",
+    "act-moveCardToOtherBoard": "μετακίνησε την κάρτα __card__ από τη λίστα __oldList__ της λωρίδας __oldSwimlane__ του πίνακα __oldBoard__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-removeBoardMember": "αφαιρέθηκε το μέλος __member__ από τον πίνακα __board__",
+    "act-restoredCard": "επαναφορά της κάρτας __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-unjoinMember": "διαγραφή του μέλους __member__ από την κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "act-withBoardTitle": "__board__",
+    "act-withCardTitle": "[__board__] __card__",
+    "actions": "Ενέργειες",
+    "activities": "Δραστηριότητες",
+    "activity": "Δραστηριότητα",
+    "activity-added": "προστέθηκε %s στο %s",
+    "activity-archived": "%s μετακινήθηκε στο Αρχείο",
+    "activity-attached": "επισυνάφθηκε %s στο %s",
+    "activity-created": "δημιουργήθηκε %s",
+    "activity-customfield-created": "δημιούργησε το προσαρμοσμένο πεδίο %s",
+    "activity-excluded": "εξαιρέθηκε %s από %s",
+    "activity-imported": "εισήχθη %s στο %s από %s",
+    "activity-imported-board": "εισήχθη %s από %s",
+    "activity-joined": "joined %s",
+    "activity-moved": "μετακινήθηκε το %s από %s στο %s",
+    "activity-on": "στό %s",
+    "activity-removed": "διεγράφη %s από %s",
+    "activity-sent": "εστάλη %s στο %s",
+    "activity-unjoined": "unjoined %s",
+    "activity-subtask-added": "προστέθηκε υποεργασία στο %s",
+    "activity-checked-item": "επιλέχθηκε %s στη λίστα ελέγχου - checlist %s του %s",
+    "activity-unchecked-item": "unchecked %s in checklist %s of %s",
+    "activity-checklist-added": "added checklist to %s",
+    "activity-checklist-removed": "removed a checklist from %s",
+    "activity-checklist-completed": "completed checklist %s of %s",
+    "activity-checklist-uncompleted": "uncompleted the checklist %s of %s",
+    "activity-checklist-item-added": "προστέθηκε ένα στοιχείο λίστας ελέγου στη '%s' στο %s",
+    "activity-checklist-item-removed": "removed a checklist item from '%s' in %s",
+    "add": "Προσθήκη",
+    "activity-checked-item-card": "επιλέχθηκε το %s στη λίστα ελέγχου - checklist %s",
+    "activity-unchecked-item-card": "αποεπιλέχθηκε το %s στη λίστα ελέγχου - checklist %s",
+    "activity-checklist-completed-card": "ολοκληρώθηκε η λίστα ελέγχου checklist __checklist__ στην κάρτα __card__ στη λίστα __list__ στη λωρίδα __swimlane__ στον πίνακα __board__",
+    "activity-checklist-uncompleted-card": "uncompleted the checklist %s",
+    "activity-editComment": "επεξεργασία σχολίου %s",
+    "activity-deleteComment": "διεγράφη το σχόλιο %s",
+    "activity-receivedDate": "η ημερομηνία λήψης άλλαξε σε %s από %s",
+    "activity-startDate": "η ημερομηνία έναρξης άλλαξε σε %s από %s",
+    "activity-dueDate": "υπέστη επεξεργασία η τιμή της προθεσμίας σε %s από %s",
+    "activity-endDate": "η ημερομηνία λήξης άλλαξε σε %s από %s",
+    "add-attachment": "Προσθήκη Συνημμένου",
+    "add-board": "Προσθήκη Πίνακα",
+    "add-template": "Add Template",
+    "add-card": "Προσθήκη Κάρτας",
+    "add-card-to-top-of-list": "Add Card to Top of List",
+    "add-card-to-bottom-of-list": "Add Card to Bottom of List",
+    "add-swimlane": "Προσθήκη Λωρίδας",
+    "add-subtask": "Προσθήκη Υποεργασίας",
+    "add-checklist": "Προσθήκη Λίστας ελέγχου",
+    "add-checklist-item": "Προσθήκη ενός στοιχείου στη λίστα ελέγχου - checklist",
+    "convertChecklistItemToCardPopup-title": "Convert to Card",
+    "add-cover": "Add Cover",
+    "add-label": "Προσθήκη Ετικέτας",
+    "add-list": "Προσθήκη Λίστας",
+    "add-members": "Προσθήκη Μελών",
+    "added": "Προστέθηκε",
+    "addMemberPopup-title": "Μέλη",
+    "memberPopup-title": "Ρυθμίσεις Μελών",
+    "admin": "Διαχειριστής",
+    "admin-desc": "Μπορεί να δει, να επεξεργαστεί κάρτες, να διαγράψει μέλη και να μεταβάλει τις ρυθμίσεις του πίνακα.",
+    "admin-announcement": "Ανακοίνωση",
+    "admin-announcement-active": "Ενεργή Ανακοίνωση που είναι ορατή σε όλο το σύστημα",
+    "admin-announcement-title": "Ανακοίνωση από το Διαχειριστή Συστήματος",
+    "all-boards": "Όλοι οι πίνακες",
+    "and-n-other-card": "Και __count__ επιπλέον κάρτα",
+    "and-n-other-card_plural": "Και __count__ επιπλέον κάρτες",
+    "apply": "Εφαρμογή",
+    "app-is-offline": "Φορτώνει, παρακαλώ περιμένετε. Η ανανέωση της σελίδας θα προκαλέσει απώλεια δεδομένων. Αν η φόρτωση δεν επιτύχει, παρακαλούμε ελέγξτε ότι ο server δεν έχει σταματήσει.",
+    "app-try-reconnect": "Try to reconnect.",
+    "archive": "Μετακίνηση στο Αρχείο",
+    "archive-all": "Μετακίνηση Όλων στο Αρχείο",
+    "archive-board": "Μετακίνηση Πίνακα στο Αρχείο",
+    "archive-card": "Μετακίνηση Κάρτας στο Αρχείο",
+    "archive-list": "Μετακίνηση Λίστας στο Αρχείο",
+    "archive-swimlane": "Μετακίνηση της Λωρίδας στο Αρχείο",
+    "archive-selection": "Μετακίνηση επιλογής στο Αρχείο",
+    "archiveBoardPopup-title": "Να μετακινηθεί ο Πίνακας στο Αρχείο;",
+    "archived-items": "Αρχείο",
+    "archived-boards": "Πίνακες στο Αρχείο",
+    "restore-board": "Επαναφορά Πίνακα",
+    "no-archived-boards": "Δεν υπάρχουν Πίνακες στο Αρχείο.",
+    "archives": "Αρχείο",
+    "template": "Πρότυπο",
+    "templates": "Πρότυπα",
+    "template-container": "Template Container",
+    "add-template-container": "Add Template Container",
+    "assign-member": "Ανάθεση μέλους",
+    "attached": "επισυνάφθηκε",
+    "attachment": "Συνημμένο",
+    "attachment-delete-pop": "Η διαγραφή του συνημμένου είναι μόνιμη. Δεν υπάρχει δυνατότητα επαναφοράς.",
+    "attachmentDeletePopup-title": "Διαγραφή Συνημμένου;",
+    "attachments": "Συνημμένα",
+    "auto-watch": "Αυτόματη παρακολούθηση των πινάκων από τη στιγμή που δημιουργούνται.",
+    "avatar-too-big": "Το avatar είναι πολύ μεγάλο (μέγιστο 520KB)",
+    "back": "Πίσω",
+    "board-change-color": "Αλλαγή χρώματος",
+    "board-nb-stars": "%s αστέρια",
+    "board-not-found": "Ο πίνακας δε βρέθηκε",
+    "board-private-info": "Αυτός ο πίνακας θα είναι <strong>κρυφός</strong>.",
+    "board-public-info": "Αυτός ο πίνακας θα είναι <strong>δημόσιος</strong>.",
+    "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
+    "boardChangeColorPopup-title": "Αλλαγή Φόντου Πίνακα",
+    "boardChangeTitlePopup-title": "Μετονομασία Πίνακα",
+    "boardChangeVisibilityPopup-title": "Αλλαγή Ορατότητας",
+    "boardChangeWatchPopup-title": "Change Watch",
+    "boardMenuPopup-title": "Ρυθμίσεις Πίνακα",
+    "boardChangeViewPopup-title": "Προβολή Πίνακα",
+    "boards": "Πίνακες",
+    "board-view": "Προβολή Πίνακα",
+    "board-view-cal": "Ημερολόγιο",
+    "board-view-swimlanes": "Λωρίδες",
+    "board-view-collapse": "Σύμπτυξη",
+    "board-view-gantt": "Διάγραμμα Gantt",
+    "board-view-lists": "Λίστες",
+    "bucket-example": "Like “Bucket List” for example",
+    "cancel": "Ακύρωση",
+    "card-archived": "Αυτή η κάρτα μετακινήθηκε στο Αρχείο.",
+    "board-archived": "Αυτός ο πίνακας μετακινήθηκε στο Αρχείο.",
+    "card-comments-title": "Αυτή η κάρτα έχει %s σχόλιο.",
+    "card-delete-notice": "Η Διαγραφή είναι μόνιμη. Θα χάσετε όλες τις ενέργειες που σχετίζονται με αυτή την κάρτα.",
+    "card-delete-pop": "Όλες οι ενέργειες θα αφαιρεθούν από τη ροή δραστηριοτήτων και δε θα μπορείτε να ξανανοίξετε την κάρτα. Δεν υπάρχει δυνατότητα επαναφοράς.",
+    "card-delete-suggest-archive": "Μπορείτε να μετακινήσετε μια κάρτα στο Αρχείο για να την αφαιρέσετε από τον πίνακα και να διατηρήσετε τη δραστηριότητα.",
+    "card-archive-pop": "Card will not be visible at this list after archiving card.",
+    "card-archive-suggest-cancel": "You can later restore card from Archive.",
+    "card-due": "Έως",
+    "card-due-on": "Έως τις",
+    "card-spent": "Δαπανηθείς Χρόνος",
+    "card-edit-attachments": "Επεξεργασία συνημμένων",
+    "card-edit-custom-fields": "Επεξεργασία προσαρμοσμένων πεδίων",
+    "card-edit-labels": "Επεξεργασία ετικετών",
+    "card-edit-members": "Επεξεργασία μελών",
+    "card-labels-title": "Αλλαγή ετικετών για την κάρτα.",
+    "card-members-title": "Προσθήκη ή διαγραφή μελών του πίνακα από την κάρτα.",
+    "card-start": "Έναρξη",
+    "card-start-on": "Αρχίζει σε",
+    "cardAttachmentsPopup-title": "Συνημμένο Από",
+    "cardCustomField-datePopup-title": "Αλλαγή ημερομηνίας",
+    "cardCustomFieldsPopup-title": "Επεξεργασία προσαρμοσμένων πεδίων",
+    "cardStartVotingPopup-title": "Έναρξη ψηφοφορίας",
+    "positiveVoteMembersPopup-title": "Υποστηρικτές",
+    "negativeVoteMembersPopup-title": "Αντιτιθέμενοι",
+    "card-edit-voting": "Επεξεργασία ψηφοφορίας",
+    "editVoteEndDatePopup-title": "Αλλαγή της ημερομηνίας λήξης ψηφοφορίας",
+    "allowNonBoardMembers": "Επίτρεψε όλους τους συνδεδεμένους χρήστες",
+    "vote-question": "Ερώτηση ψηφοφορίας",
+    "vote-public": "Εμφάνισε ποιός ψήφισε τι",
+    "vote-for-it": "για αυτό",
+    "vote-against": "εναντίον",
+    "deleteVotePopup-title": "Διαγραφή ψήφου;",
+    "vote-delete-pop": "Μόνιμη Διαγραφή. Θα χάσετε όλες τις ενέργειες που σχετίζονται με αυτή την ψήφο.",
+    "cardStartPlanningPokerPopup-title": "Start a Planning Poker",
+    "card-edit-planning-poker": "Edit Planning Poker",
+    "editPokerEndDatePopup-title": "Change Planning Poker vote end date",
+    "poker-question": "Planning Poker",
+    "poker-one": "1",
+    "poker-two": "2",
+    "poker-three": "3",
+    "poker-five": "5",
+    "poker-eight": "8",
+    "poker-thirteen": "13",
+    "poker-twenty": "20",
+    "poker-forty": "40",
+    "poker-oneHundred": "100",
+    "poker-unsure": "?",
+    "poker-finish": "Finish",
+    "poker-result-votes": "Votes",
+    "poker-result-who": "Who",
+    "poker-replay": "Replay",
+    "set-estimation": "Set Estimation",
+    "deletePokerPopup-title": "Delete planning poker?",
+    "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.",
+    "cardDeletePopup-title": "Διαγραφή Κάρτας;",
+    "cardArchivePopup-title": "Archive Card?",
+    "cardDetailsActionsPopup-title": "Ενέργειες κάρτας",
+    "cardLabelsPopup-title": "Ετικέτες",
+    "cardMembersPopup-title": "Μέλοι",
+    "cardMorePopup-title": "Περισσότερα",
+    "cardTemplatePopup-title": "Δημιουργία προτύπου",
+    "cards": "Κάρτες",
+    "cards-count": "Κάρτες",
+    "cards-count-one": "Κάρτα",
+    "casSignIn": "Σύνδεση χρήστη με CAS",
+    "cardType-card": "Κάρτα",
+    "cardType-linkedCard": "Συνδεδεμένη Κάρτα",
+    "cardType-linkedBoard": "Συνδεδεμένος Πίνακας",
+    "change": "Αλλαγή",
+    "change-avatar": "Αλλαγή Avatar",
+    "change-password": "Αλλαγή Κωδικού",
+    "change-permissions": "Αλλαγή δικαιωμάτων",
+    "change-settings": "Αλλαγή Ρυθμίσεων",
+    "changeAvatarPopup-title": "Αλλαγή Avatar",
+    "changeLanguagePopup-title": "Αλλαγή Γλώσσας",
+    "changePasswordPopup-title": "Αλλαγή Κωδικού",
+    "changePermissionsPopup-title": "Αλλαγή Δικαιωμάτων",
+    "changeSettingsPopup-title": "Αλλαγή Ρυθμίσεων",
+    "subtasks": "Υποεργασίες",
+    "checklists": "Λίστες Ελέγχου - Checklists",
+    "click-to-star": "Κλικ για να προσθέσετε αστεράκι στον πίνακα",
+    "click-to-unstar": "Κλικ για να αφαιρέσετε αστεράκι από τον πίνακα",
+    "clipboard": "Clipboard ή drag & drop",
+    "close": "Κλείσιμο",
+    "close-board": "Κλείσιμο Πίνακα",
+    "close-board-pop": "Μελλοντικά μπορείτε να επαναφέρετε τον πίνακα κάνοντας κλικ στο κουμπί \"Αρχειοθέτηση\" από την αρχική επικεφαλίδα.",
+    "close-card": "Close Card",
+    "color-black": "μαύρο",
+    "color-blue": "μπλε",
+    "color-crimson": "βυσσινί",
+    "color-darkgreen": "σκούρο πράσινο",
+    "color-gold": "χρυσό",
+    "color-gray": "γκρι",
+    "color-green": "πράσινο",
+    "color-indigo": "λουλάκι",
+    "color-lime": "λάιμ",
+    "color-magenta": "ματζέντα",
+    "color-mistyrose": "mistyrose",
+    "color-navy": "navy",
+    "color-orange": "πορτοκαλί",
+    "color-paleturquoise": "paleturquoise",
+    "color-peachpuff": "peachpuff",
+    "color-pink": "ροζ",
+    "color-plum": "plum",
+    "color-purple": "μωβ",
+    "color-red": "κόκκινο",
+    "color-saddlebrown": "saddlebrown",
+    "color-silver": "ασημί",
+    "color-sky": "ουρανός",
+    "color-slateblue": "slateblue",
+    "color-white": "λευκό",
+    "color-yellow": "κίτρινο",
+    "unset-color": "Unset",
+    "comment": "Σχόλιο",
+    "comment-placeholder": "Συγγραφή Σχολίου",
+    "comment-only": "Μόνο σχόλιο",
+    "comment-only-desc": "Μπορεί μόνο να σχολιάζει σε κάρτες.",
+    "comment-delete": "Are you sure you want to delete the comment?",
+    "deleteCommentPopup-title": "Delete comment?",
+    "no-comments": "Χωρίς σχόλια",
+    "no-comments-desc": "Δε μπορεί να δει σχόλια και δραστηριότητες.",
+    "worker": "Worker",
+    "worker-desc": "Μπορεί μόνο να μετακινεί κάρτες, να αναθέτει μια κάρτα στον εαυτό του και να σχολιάζει.",
+    "computer": "Υπολογιστής",
+    "confirm-subtask-delete-dialog": "Είστε σίγουροι ότι θέλετε να σβήσετε την υποεργασία;",
+    "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?",
+    "checklistDeletePopup-title": "Delete Checklist?",
+    "copy-card-link-to-clipboard": "Αντιγραφή του συνδέσμου της κάρτας στο clipboard",
+    "copy-text-to-clipboard": "Copy text to clipboard",
+    "linkCardPopup-title": "Σύνδεση Κάρτας",
+    "searchElementPopup-title": "Αναζήτηση",
+    "copyCardPopup-title": "Αντιγραφή Κάρτας",
+    "copyChecklistToManyCardsPopup-title": "Αντιγραφή του Προτύπου Λίστας Ελέγχου - Checklist σε πολλές Κάρτες",
+    "copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
+    "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]",
+    "create": "Δημιουργία",
+    "createBoardPopup-title": "Δημιουργία Πίνακα",
+    "chooseBoardSourcePopup-title": "Εισαγωγή πίνακα",
+    "createLabelPopup-title": "Δημιουργία Ετικέτας",
+    "createCustomField": "Δημιουργία Πεδίου",
+    "createCustomFieldPopup-title": "Δημιουργία Πεδίου",
+    "current": "τρέχων",
+    "custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.",
+    "custom-field-checkbox": "Checkbox",
+    "custom-field-currency": "Νόμισμα",
+    "custom-field-currency-option": "Κωδικός Νομίσματος",
+    "custom-field-date": "Ημερομηνία",
+    "custom-field-dropdown": "Λίστα επιλογών",
+    "custom-field-dropdown-none": "(κανένα)",
+    "custom-field-dropdown-options": "Επιλογές Λίστας",
+    "custom-field-dropdown-options-placeholder": "Πιέστε enter για να προσθέσετε περισσότερες επιλογές",
+    "custom-field-dropdown-unknown": "(άγνωστο)",
+    "custom-field-number": "Αριθμός",
+    "custom-field-text": "Κείμενο",
+    "custom-fields": "Προσαρμοσμένα Πεδία",
+    "date": "Ημερομηνία",
+    "decline": "Απόρριψη",
+    "default-avatar": "Default avatar",
+    "delete": "Διαγραφή",
+    "deleteCustomFieldPopup-title": "Διαγραφή Προσαρμοσμένου Πεδίου;",
+    "deleteLabelPopup-title": "Διαγραφή Ετικέτας;",
+    "description": "Περιγραφή",
+    "disambiguateMultiLabelPopup-title": "Disambiguate Label Action",
+    "disambiguateMultiMemberPopup-title": "Disambiguate Member Action",
+    "discard": "Απόρριψη",
+    "done": "Ολοκληρώθηκε",
+    "download": "Λήψη",
+    "edit": "Επεξεργασία",
+    "edit-avatar": "Αλλαγή Avatar",
+    "edit-profile": "Επεξεργασία Προφίλ",
+    "edit-wip-limit": "Edit WIP Limit",
+    "soft-wip-limit": "Soft WIP Limit",
+    "editCardStartDatePopup-title": "Αλλαγή ημερομηνίας έναρξης",
+    "editCardDueDatePopup-title": "Αλλαγή ημερομηνίας λήξης προθεσμίας",
+    "editCustomFieldPopup-title": "Επεξεργασία Πεδίου",
+    "addReactionPopup-title": "Add reaction",
+    "editCardSpentTimePopup-title": "Αλλαγή δαπανηθέντος χρόνου",
+    "editLabelPopup-title": "Αλλαγή Ετικέτας",
+    "editNotificationPopup-title": "Επεξεργασία Ειδοποίησης",
+    "editProfilePopup-title": "Επεξεργασία Προφίλ",
+    "email": "Email",
+    "email-enrollAccount-subject": "Ένας λογαριασμός δημιουργήθηκε για εσάς στο __siteName__",
+    "email-enrollAccount-text": "Χαίρετε __user__,\n\nΓια να ξεκινήσετε να χρησιμοποιείτε αυτή την υπηρεσία, απλώς κάνετε κλικ στον παρακάτω σύνδεσμο.\n\n__url__\n\nΕυχαριστούμε.",
+    "email-fail": "Η αποστολή του email απέτυχε",
+    "email-fail-text": "Σφάλμα κατά την αποστολή του email",
+    "email-invalid": "Μη έγκυρο email",
+    "email-invite": "Πρόσκληση μέσω Email",
+    "email-invite-subject": "__inviter__ σας έστειλε μια πρόσκληση",
+    "email-invite-text": "Αγαπητέ/ή __user__,\n\n__inviter__ σας προσκαλεί να λάβετε μέρος στον πίνακα \"__board__\" για να συνεργαστείτε.\n\nΠαρακαλούμε επιλέξτε τον παρακάτω σύνδεσμο:\n\n__url__\n\nΕυχαριστούμε.",
+    "email-resetPassword-subject": "Επαναφορά του κωδικού σας για το __siteName__",
+    "email-resetPassword-text": "Χαίρετε __user__,\n\nΓια να αλλάξετε τον κωδικό πρόσβασής σας, κάνετε κλικ στον παρακάτω σύνδεσμο.\n\n__url__\n\nΕυχαριστούμε.",
+    "email-sent": "Εστάλη Email",
+    "email-verifyEmail-subject": "Verify your email address on __siteName__",
+    "email-verifyEmail-text": "Χαίρετε __user__,\n\nΓια να επιβεβαιώσετε το email που χρησιμοποιεί ο λογαριασμός σας, απλώς κάνετε κλικ στον παρακάτω σύνδεσμο.\n\n__url__\n\nΕυχαριστούμε.",
+    "enable-wip-limit": "Enable WIP Limit",
+    "error-board-doesNotExist": "Αυτός ο πίνακας δεν υφίσταται",
+    "error-board-notAdmin": "Πρέπει να είστε διαχειριστής του πίνακα αυτού για να προβείτε σε αυτό",
+    "error-board-notAMember": "Πρέπει να είστε μέλος του πίνακα αυτού για να προβείτε σε αυτό",
+    "error-json-malformed": "Το κείμενο δεν είναι έγκυρο JSON",
+    "error-json-schema": "Τα JSON δεδομένα σας δεν περιλαμβάνουν την ορθή πληροφορία στην ορθή μορφοποίηση",
+    "error-csv-schema": "Το CSV(Comma Separated Values)/TSV (Tab Separated Values) σας δεν περιλαμβάνει την ορθή πληροφορία σε ορθή μορφοποίηση",
+    "error-list-doesNotExist": "Η λίστα δεν υπάρχει",
+    "error-user-doesNotExist": "Ο χρήστης δεν υπάρχει",
+    "error-user-notAllowSelf": "Δε μπορείτε να αυτοπροσκληθείτε",
+    "error-user-notCreated": "Ο χρήστης δε δημιουργήθηκε",
+    "error-username-taken": "Το όνομα χρήστη είναι ήδη κατειλημμένο",
+    "error-orgname-taken": "This organization name is already taken",
+    "error-teamname-taken": "This team name is already taken",
+    "error-email-taken": "Το email είναι ήδη κατειλημμένο",
+    "export-board": "Εξαγωγή πίνακα",
+    "export-board-json": "Εξαγωγή πίνακα σε JSON",
+    "export-board-csv": "Εξαγωγή πίνακα σε CSV",
+    "export-board-tsv": "Εξαγωγή πίνακα σε TSV",
+    "export-board-excel": "Εξαγωγή πίνακα σε Excel",
+    "user-can-not-export-excel": "Ο χρήστης δε μπορεί να εξάγει σε Excel",
+    "export-board-html": "Εξαγωγή πίνακα σε HTML",
+    "export-card": "Export card",
+    "export-card-pdf": "Export card to PDF",
+    "user-can-not-export-card-to-pdf": "User can not export card to PDF",
+    "exportBoardPopup-title": "Εξαγωγή πίνακα",
+    "exportCardPopup-title": "Export card",
+    "sort": "Ταξινόμηση",
+    "sorted": "Sorted",
+    "remove-sort": "Remove sort",
+    "sort-desc": "Κάντε κλικ για να ταξινομήστε τη λίστα",
+    "list-sort-by": "Ταξινόμηση λίστας βάσει:",
+    "list-label-modifiedAt": "Τελευταία Προσπέλαση",
+    "list-label-title": "Ονομασία Λίστας",
+    "list-label-sort": "Η καθορισμένη σας Ταξινόμηση",
+    "list-label-short-modifiedAt": "(L)",
+    "list-label-short-title": "(N)",
+    "list-label-short-sort": "(M)",
+    "filter": "Φίλτρο",
+    "filter-cards": "Φιλτράρετε Κάρτες ή Λίστες",
+    "filter-dates-label": "Filter by date",
+    "filter-no-due-date": "No due date",
+    "filter-overdue": "Overdue",
+    "filter-due-today": "Due today",
+    "filter-due-this-week": "Due this week",
+    "filter-due-tomorrow": "Due tomorrow",
+    "list-filter-label": "Φιλτράρετε Λίστα βάσει Τίτλου",
+    "filter-clear": "Καθαρισμός φίλτρου",
+    "filter-labels-label": "Φίλτρο βάσει ετικέτας",
+    "filter-no-label": "Καμμία ετικέτα",
+    "filter-member-label": "Φίλτρο βάσει μέλους",
+    "filter-no-member": "Κανένα μέλος",
+    "filter-assignee-label": "Φίλτρο βάσει ανάθεσης μέλους",
+    "filter-no-assignee": "Κανένας ανατεθείς",
+    "filter-custom-fields-label": "Filter by Custom Fields",
+    "filter-no-custom-fields": "Κανένα Προσαρμοσμένο Πεδίο",
+    "filter-show-archive": "Προβολή αρχειοθετημένων λιστών",
+    "filter-hide-empty": "Απόκρυψη άδειων λιστών",
+    "filter-on": "Φίλτρο Ενεργό",
+    "filter-on-desc": "Έχετε ενεργοποιημένο το φίλτρο καρτών σε αυτόν τον πίνακα. Κάνετε κλικ εδώ για να αλλάξετε το φίλτρο.",
+    "filter-to-selection": "Filter to selection",
+    "other-filters-label": "Άλλα φίλτρα",
+    "advanced-filter-label": "Φιλτράρισμα για Προχωρημένους",
+    "advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i",
+    "fullname": "Πλήρες Όνομα",
+    "header-logo-title": "Επιστροφή στη σελίδα των πινάκων σας.",
+    "hide-system-messages": "Απόκρυψη μηνυμάτων συστήματος",
+    "headerBarCreateBoardPopup-title": "Δημιουργία Πίνακα",
+    "home": "Αρχική",
+    "import": "Εισαγωγή",
+    "impersonate-user": "Impersonate user",
+    "link": "Σύνδεσμος",
+    "import-board": "Εισαγωγή πίνακα",
+    "import-board-c": "Εισαγωγή πίνακα",
+    "import-board-title-trello": "Εισαγωγή πίνακα από το Trello",
+    "import-board-title-wekan": "Εισαγωγή πίνακα από προηγούμενη εξαγωγή",
+    "import-board-title-csv": "Εισαγωγή πίνακα από CSV/TSV",
+    "from-trello": "Από το Trello",
+    "from-wekan": "Aπό προηγούμενη εξαγωγή",
+    "from-csv": "Από CSV/TSV",
+    "import-board-instruction-trello": "Στον πίνακα του Trello, πλοηγηθείτε στο 'Menu', έπειτα 'More', 'Print and Export', 'Export JSON'  και αντιγράψτε το παραχθέν κείμενο.",
+    "import-board-instruction-csv": "Επικολλήστε τις Τιμές Διαχωρισμένες με Κόμμα (CSV)/ Τιμές Διαχωρισμένες με Tab (TSV) .",
+    "import-board-instruction-wekan": "Στον πίνακά σας, πλοηγηθείτε στο 'Menu', έπειτα 'Export board' και αντιγράψετε το κείμενο στο ληφθένα αρχείο.",
+    "import-board-instruction-about-errors": "If you get errors when importing board, sometimes importing still works, and board is at All Boards page.",
+    "import-json-placeholder": "Επικολλήστε τα ορθά JSON δεδομένα σας εδώ",
+    "import-csv-placeholder": "Επικολλήστε τα ορθά CSV/TSV δεδομένα σας εδώ",
+    "import-map-members": "Αντιστοίχιση μελών",
+    "import-members-map": "Ο εισαχθείς πίνακας έχει κάποια μέλη. Παρακαλούμε αντιστοιχίστε τα μέλη που θέλετε να εισάγετε στους χρήστες σας",
+    "import-members-map-note": "Note: Unmapped members will be assigned to the current user.",
+    "import-show-user-mapping": "Αναθεώρηση αντιστοίχισης μελών",
+    "import-user-select": "Επιλέξτε τον ήδη υπάρχοντα χρήστη που επιθυμείτε να χρησιμοποιήσετε ως αυτό το μέλος",
+    "importMapMembersAddPopup-title": "Επιλογή μέλους",
+    "info": "Έκδοση",
+    "initials": "Αρχικά",
+    "invalid-date": "Λανθασμένη ημερομηνία",
+    "invalid-time": "Λανθασμένη ώρα",
+    "invalid-user": "Λανθασμένος χρήστης",
+    "joined": "joined",
+    "just-invited": "Μόλις προσκληθήκατε σε αυτόν τον πίνακα",
+    "keyboard-shortcuts": "Συντομεύσεις πληκτρολογίου",
+    "label-create": "Δημιουργία Ετικέτας",
+    "label-default": "%s ετικέτα (προεπιλογή)",
+    "label-delete-pop": "Δεν υπάρχει δυνατότητα επαναφοράς. Θα διαγραφεί η ετικέτα από όλες τις κάρτες και θα καταστραφεί το ιστορικό της.",
+    "labels": "Ετικέτες",
+    "language": "Γλώσσα",
+    "last-admin-desc": "Δε μπορείτε να μεταβάλετε ρόλους επειδή πρέπει να υπάρχει τουλάχιστον ένας διαχειριστής.",
+    "leave-board": "Αποχώρηση από Πίνακα",
+    "leave-board-pop": "Είστε σίγουροι ότι θέλετε να αποχωρήσετε από το __boardTitle__? Θα αφαιρεθείτε από όλες τις κάρτες αυτού του πίνακα.",
+    "leaveBoardPopup-title": "Αποχωρείτε απο τον Πίνακα;",
+    "link-card": "Σύνδεσμος σε αυτή την κάρτα",
+    "list-archive-cards": "Μεταφορά όλων των καρτών αυτής της λίστας στο Αρχείο",
+    "list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Archive and bring them back to the board, click “Menu” > “Archive”.",
+    "list-move-cards": "Μεταφορά όλων των καρτών αυτής της λίστας",
+    "list-select-cards": "Επιλογή όλων των καρτών αυτής της λίστας",
+    "set-color-list": "Ρύθμιση Χρώματος",
+    "listActionPopup-title": "Ενέργειες Λίστας",
+    "settingsUserPopup-title": "Ρυθμίσεις Χρήστη",
+    "settingsTeamPopup-title": "Team Settings",
+    "settingsOrgPopup-title": "Organization Settings",
+    "swimlaneActionPopup-title": "Ενέργειες λωρίδας",
+    "swimlaneAddPopup-title": "Προσθήκη μιας Λωρίδας παρακάτω",
+    "listImportCardPopup-title": "Εισαγωγή μιας κάρτας Trello",
+    "listImportCardsTsvPopup-title": "Εισαγωγή Excel CSV/TSV",
+    "listMorePopup-title": "Περισσότερα",
+    "link-list": "Σύνδεσμος σε αυτή τη λίστα",
+    "list-delete-pop": "Όλες οι ενέργειες θα αφαιρεθούν από τη ροή δραστηριοτήτων και δε θα μπορείτε να ανακτήσετε τη λίστα. Δεν υπάρχει δυνατότητα επαναφοράς.",
+    "list-delete-suggest-archive": "Μπορείτε να μετακινήσετε μια λίστα στο Αρχείο για να την αφαιρέσετε από τον πίνακα και να διατηρήσετε τη δραστηριότητα.",
+    "lists": "Λίστες",
+    "swimlanes": "Λωρίδες",
+    "log-out": "Αποσύνδεση",
+    "log-in": "Σύνδεση",
+    "loginPopup-title": "Σύνδεση",
+    "memberMenuPopup-title": "Ρυθμίσεις Μελών",
+    "members": "Μέλοι",
+    "menu": "Μενού",
+    "move-selection": "Μετακίνηση επιλογής",
+    "moveCardPopup-title": "Μετακίνηση Κάρτας",
+    "moveCardToBottom-title": "Μετακίνηση στην Αρχή",
+    "moveCardToTop-title": "Μετακίνηση στο Τέλος",
+    "moveSelectionPopup-title": "Μετακίνηση επιλογής",
+    "multi-selection": "Πολλαπλή Επιλογή",
+    "multi-selection-label": "Set label for selection",
+    "multi-selection-member": "Set member for selection",
+    "multi-selection-on": "Πολλαπλή Επιλογή ενεργοποιημένη",
+    "muted": "Σίγαση",
+    "muted-info": "Δεν πρόκειται να ενημερωθείτε ποτέ για οποιεσδήποτε αλλαγές σε αυτόν τον πίνακα",
+    "my-boards": "Οι Πίνακες μου",
+    "name": "Όνομα",
+    "no-archived-cards": "Δεν υπάρχουν κάρτες στο Αρχείο.",
+    "no-archived-lists": "Δεν υπάρχουν λίστες στο Αρχείο.",
+    "no-archived-swimlanes": "Δεν υπάρχουν λωρίδες στο Αρχείο.",
+    "no-results": "Κανένα αποτέλεσμα",
+    "normal": "Κανονικό",
+    "normal-desc": "Can view and edit cards. Can't change settings.",
+    "not-accepted-yet": "Η πρόσκληση δεν έχει λάβει αποδοχή ακόμη",
+    "notify-participate": "Receive updates to any cards you participate as creater or member",
+    "notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
+    "optional": "προεραιτικό",
+    "or": "ή",
+    "page-maybe-private": "This page may be private. You may be able to view it by <a href='%s'>logging in</a>.",
+    "page-not-found": "Η σελίδα δεν βρέθηκε.",
+    "password": "Κωδικός",
+    "paste-or-dragdrop": "to paste, or drag & drop image file to it (image only)",
+    "participating": "Συμμετέχει",
+    "preview": "Προεπισκόπηση",
+    "previewAttachedImagePopup-title": "Προεπισκόπηση",
+    "previewClipboardImagePopup-title": "Προεπισκόπηση",
+    "private": "Private",
+    "private-desc": "Ο πίνακας αυτός είναι προσωπικός. Μόνο άτομα που έχουν προστεθεί σε αυτόν τον πίνακα μπορούν να τον δουν και να τον μεταβάλλουν.",
+    "profile": "Προφίλ",
+    "public": "Δημόσιο",
+    "public-desc": "Αυτός ο πίνακας είναι δημόσιος. Είναι ορατός σε οποιονδήποτε κατέχει το σύνδεσμο προς αυτόν και θα εμφανίζεται σε μηχανές αναζήτησης όπως η Google. Ο πίνακας μπορεί να μεταβληθεί μόνο από άτομα που έχουν προστεθεί σε αυτόν.",
+    "quick-access-description": "Star a board to add a shortcut in this bar.",
+    "remove-cover": "Αφαίρεση Σκεπάσματος",
+    "remove-from-board": "Αφαίρεση από Πίνακα",
+    "remove-label": "Αφαίρεση Ετικέτας",
+    "listDeletePopup-title": "Διαγραφή Λίστας;",
+    "remove-member": "Αφαίρεση Μέλους",
+    "remove-member-from-card": "Αφαίρεση από την Κάρτα",
+    "remove-member-pop": "Remove __name__ (__username__) from __boardTitle__? The member will be removed from all cards on this board. They will receive a notification.",
+    "removeMemberPopup-title": "Αφαίρεση Μέλους;",
+    "rename": "Μετανομασία",
+    "rename-board": "Μετονομασία Πίνακα",
+    "restore": "Επαναφορά",
+    "save": "Αποθήκευση",
+    "search": "Αναζήτηση",
+    "rules": "Κανόνες",
+    "search-cards": "Search from card/list titles, descriptions and custom fields on this board",
+    "search-example": "Write text you search and press Enter",
+    "select-color": "Επιλέξτε Χρώμα",
+    "select-board": "Επιλογή Πίνακα",
+    "set-wip-limit-value": "Προσδιορισμός ορίου στο μέγιστο αριθμό εργασιών σε αυτή τη λίστα.",
+    "setWipLimitPopup-title": "Set WIP Limit",
+    "shortcut-assign-self": "Assign yourself to current card",
+    "shortcut-autocomplete-emoji": "Autocomplete emoji",
+    "shortcut-autocomplete-members": "Autocomplete members",
+    "shortcut-clear-filters": "Καθαρισμός φίλτρων",
+    "shortcut-close-dialog": "Κλείσιμο Διαλόγου",
+    "shortcut-filter-my-cards": "Φιλτράρισμα των καρτών μου",
+    "shortcut-show-shortcuts": "Bring up this shortcuts list",
+    "shortcut-toggle-filterbar": "Toggle Filter Sidebar",
+    "shortcut-toggle-searchbar": "Toggle Search Sidebar",
+    "shortcut-toggle-sidebar": "Toggle Board Sidebar",
+    "show-cards-minimum-count": "Show cards count if list contains more than",
+    "sidebar-open": "Άνοιγμα Πλευρικού Μενού",
+    "sidebar-close": "Κλείσιμο Πλευρικού Μενού",
+    "signupPopup-title": "Δημιουργία Λογαριασμού",
+    "star-board-title": "Click to star this board. It will show up at top of your boards list.",
+    "starred-boards": "Starred Boards",
+    "starred-boards-description": "Starred boards show up at the top of your boards list.",
+    "subscribe": "Εγγραφή",
+    "team": "Ομάδα",
+    "this-board": "αυτόν τον πίνακα",
+    "this-card": "αυτή η κάρτα",
+    "spent-time-hours": "Δαπανηθείς Χρόνος (ώρες)",
+    "overtime-hours": "Υπερωρία (ώρες)",
+    "overtime": "Υπερωρία",
+    "has-overtime-cards": "Έχει κάρτες με υπερωρία",
+    "has-spenttime-cards": "Έχει κάρτες με δαπανηθέντα χρόνο",
+    "time": "Ώρα",
+    "title": "Τίτλος",
+    "tracking": "Καταγραφή",
+    "tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
+    "type": "Τύπος",
+    "unassign-member": "Απο-ανάθεση μέλους",
+    "unsaved-description": "Έχετε μια μη αποθηκευμένη περιγραφή.",
+    "unwatch": "Unwatch",
+    "upload": "Μεταφόρτωση",
+    "upload-avatar": "Μεταφόρτωση ενός avatar",
+    "uploaded-avatar": "Μεταφόρτωσε ένα avatar",
+    "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
+    "custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
+    "custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
+    "custom-login-logo-image-url": "Custom Login Logo Image URL",
+    "custom-login-logo-link-url": "Custom Login Logo Link URL",
+    "text-below-custom-login-logo": "Text below Custom Login Logo",
+    "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
+    "username": "Όνομα Χρήστη",
+    "import-usernames": "Import Usernames",
+    "view-it": "View it",
+    "warn-list-archived": "warning: this card is in an list at Archive",
+    "watch": "Παρακολούθηση",
+    "watching": "Παρακολουθούν",
+    "watching-info": "Θα ενημερωθείτε για οποιαδήποτε αλλαγή σε αυτόν τον πίνακα",
+    "welcome-board": "Πίνακας Καλωσορίσματος",
+    "welcome-swimlane": "Milestone 1",
+    "welcome-list1": "Basics",
+    "welcome-list2": "Advanced",
+    "card-templates-swimlane": "Πρότυπα Καρτών",
+    "list-templates-swimlane": "Πρότυπα Λίστας",
+    "board-templates-swimlane": "Πρότυπα Πινάκων",
+    "what-to-do": "What do you want to do?",
+    "wipLimitErrorPopup-title": "Invalid WIP Limit",
+    "wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
+    "wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
+    "admin-panel": "Admin Panel",
+    "settings": "Ρυθμίσεις",
+    "people": "Άνθρωποι",
+    "registration": "Εγγραφή",
+    "disable-self-registration": "Απενεργοποίηση Αυτό-Εγγραφής",
+    "invite": "Πρόσκληση",
+    "invite-people": "Πρόσκάλεσε Ανθρώπους",
+    "to-boards": "Στον πίνακα(ες)",
+    "email-addresses": "Email Διευθύνσεις",
+    "smtp-host-description": "Η διεύθυνση του SMTP server που διαχειρίζεται τα emails σας.",
+    "smtp-port-description": "Η πόρτα που ο SMTP server χρησιμοποιεί για τα εξερχόμενα emails.",
+    "smtp-tls-description": "Ενεργοποίηση υποστήριξης TLS για το SMTP server",
+    "smtp-host": "Διακομιστής SMTP (host)",
+    "smtp-port": "Πόρτα SMTP (Port)",
+    "smtp-username": "Όνομα Χρήστη",
+    "smtp-password": "Κωδικός",
+    "smtp-tls": "TLS υποστήριξη",
+    "send-from": "Από",
+    "send-smtp-test": "Στείλε ένα δοκιμαστικό email στον εαυτό σου",
+    "invitation-code": "Κωδικός Πρόσκλησης",
+    "email-invite-register-subject": "__inviter__ σας έστειλε μια πρόσκληση",
+    "email-invite-register-text": "Αγαπητέ __user__,\n\n__inviter__ σας προσκαλεί για να συμμετάσχετε στον πίνακα kanban.\n\nΠαρακαλούμε πιέστε την παρακάτω διεύθυνση:\n__url__\n\nΟ κωδικός πρόσκλησής σας είναι: __icode__\n\nΕυχαριστούμε.",
+    "email-smtp-test-subject": "SMTP Δοκιμαστικό Email",
+    "email-smtp-test-text": "Στείλατε επιτυχώς ένα email",
+    "error-invitation-code-not-exist": "Ο κωδικός πρόσκλησης δεν υπάρχει",
+    "error-notAuthorized": "Δεν έχετε εξουσιοδότηση για να δείτε αυτή τη σελίδα.",
+    "webhook-title": "Όνομα Webhook",
+    "webhook-token": "Token (Προεραιτικό για Αυθεντικοποίηση)",
+    "outgoing-webhooks": "Εξερχόμενα Webhooks",
+    "bidirectional-webhooks": "Αμφίδρομα Webhooks",
+    "outgoingWebhooksPopup-title": "Εξερχόμενα Webhooks",
+    "boardCardTitlePopup-title": "Card Title Filter",
+    "disable-webhook": "Απενεργοποίηση αυτού του Webhook",
+    "global-webhook": "Global Webhooks",
+    "new-outgoing-webhook": "Νέο Εξερχόμενο Webhook",
+    "no-name": "(Άγνωστο)",
+    "Node_version": "Έκδοση Node",
+    "Meteor_version": "Έκδοση Meteor",
+    "MongoDB_version": "Έκδοση MongoDB",
+    "MongoDB_storage_engine": "MongoDB storage engine",
+    "MongoDB_Oplog_enabled": "MongoDB Oplog ενεργοποιημένο",
+    "OS_Arch": "OS Arch",
+    "OS_Cpus": "OS CPU Count",
+    "OS_Freemem": "OS Free Memory",
+    "OS_Loadavg": "OS Load Average",
+    "OS_Platform": "OS Platform",
+    "OS_Release": "OS Release",
+    "OS_Totalmem": "OS Total Memory",
+    "OS_Type": "OS Type",
+    "OS_Uptime": "OS Uptime",
+    "days": "ημέρες",
+    "hours": "ώρες",
+    "minutes": "λεπτά",
+    "seconds": "δευτερόλεπτα",
+    "show-field-on-card": "Προβολή αυτού του πεδίου στην κάρτα",
+    "automatically-field-on-card": "Add field to new cards",
+    "always-field-on-card": "Add field to all cards",
+    "showLabel-field-on-card": "Show field label on minicard",
+    "showSum-field-on-list": "Show sum of fields at top of list",
+    "yes": "Ναι",
+    "no": "Όχι",
+    "accounts": "Λογαριασμοί",
+    "accounts-allowEmailChange": "Επίτρεψε Αλλαγή Email",
+    "accounts-allowUserNameChange": "Επίτρεψε Αλλαγή Ονόματος χρήστη",
+    "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only",
+    "tableVisibilityMode": "Boards visibility",
+    "createdAt": "Δημιουργήθηκε στις",
+    "modifiedAt": "Modified at",
+    "verified": "Επιβεβαιώθηκε",
+    "active": "Ενεργό",
+    "card-received": "Ελήφθη",
+    "card-received-on": "Ελήφθη στις",
+    "card-end": "Τέλος",
+    "card-end-on": "Λήγει στις",
+    "editCardReceivedDatePopup-title": "Αλλαγή ημερομηνίας λήψης",
+    "editCardEndDatePopup-title": "Αλλαγή ημερομηνίας λήξης",
+    "setCardColorPopup-title": "Ρύθμιση χρώματος",
+    "setCardActionsColorPopup-title": "Επιλέξτε ένα χρώμα",
+    "setSwimlaneColorPopup-title": "Επιλέξτε ένα χρώμα",
+    "setListColorPopup-title": "Επιλέξτε ένα χρώμα",
+    "assigned-by": "Ανατέθηκε Από",
+    "requested-by": "Αιτήθηκε Από",
+    "card-sorting-by-number": "Card sorting by number",
+    "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
+    "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
+    "boardDeletePopup-title": "Διαγραφή Πίνακα;",
+    "delete-board": "Διαγραφή Πίνακα",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Προεπιλογή",
+    "queue": "Ουρά αναμονής",
+    "subtask-settings": "Ρυθμίσεις υποεργασιών (subtasks)",
+    "card-settings": "Ρυθμίσεις Κάρτας",
+    "boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
+    "boardCardSettingsPopup-title": "Ρυθμίσεις Κάρτας",
+    "deposit-subtasks-board": "Deposit subtasks to this board:",
+    "deposit-subtasks-list": "Landing list for subtasks deposited here:",
+    "show-parent-in-minicard": "Show parent in minicard:",
+    "prefix-with-full-path": "Prefix with full path",
+    "prefix-with-parent": "Prefix with parent",
+    "subtext-with-full-path": "Subtext with full path",
+    "subtext-with-parent": "Subtext with parent",
+    "change-card-parent": "Change card's parent",
+    "parent-card": "Μητρική κάρτα",
+    "source-board": "Κάρτα προέλευσης",
+    "no-parent": "Don't show parent",
+    "activity-added-label": "added label '%s' to %s",
+    "activity-removed-label": "διεγράφη ετικέτα '%s' από %s",
+    "activity-delete-attach": "διεγράφη ένα συνημμένο από %s",
+    "activity-added-label-card": "προσετέθη ετικέτα '%s'",
+    "activity-removed-label-card": "διεγράφη ετικέτα '%s'",
+    "activity-delete-attach-card": "διεγραφη ένα συνημμένο",
+    "activity-set-customfield": "ανάθεση τιμής του custom πεδίου '%s' στο '%s' στο %s",
+    "activity-unset-customfield": "unset custom field '%s' in %s",
+    "r-rule": "Κανόνας",
+    "r-add-trigger": "Add trigger",
+    "r-add-action": "Προσθήκη ενέργειας",
+    "r-board-rules": "Κανόνες πίνακα",
+    "r-add-rule": "Προσθήκη κανόνα",
+    "r-view-rule": "Προβολή κανόνα",
+    "r-delete-rule": "Διαγραφή κανόνα",
+    "r-new-rule-name": "Νέος τίτλος κανόνα",
+    "r-no-rules": "Κανένας κανόνας",
+    "r-trigger": "Trigger",
+    "r-action": "Ενέργεια",
+    "r-when-a-card": "Όταν μία κάρτα",
+    "r-is": "είναι",
+    "r-is-moved": "έχει μετακινηθεί",
+    "r-added-to": "Προσετέθη στο",
+    "r-removed-from": "Διεγράφη από",
+    "r-the-board": "ο πίνακας",
+    "r-list": "λίστα",
+    "list": "List",
+    "set-filter": "Καθορισμός Φίλτρου",
+    "r-moved-to": "Μετακινήθηκε σε",
+    "r-moved-from": "Μετακινήθηκε από",
+    "r-archived": "Μετακινήθηκε στο Αρχείο",
+    "r-unarchived": "Επαναφέρθηκε από το Αρχείο",
+    "r-a-card": "μία κάρτα",
+    "r-when-a-label-is": "Όταν μια ετικέτα είναι",
+    "r-when-the-label": "Όταν η ετικέτα",
+    "r-list-name": "όνομα λίστα",
+    "r-when-a-member": "Όταν ένα μέλος είναι",
+    "r-when-the-member": "Όταν το μέλος",
+    "r-name": "όνομα",
+    "r-when-a-attach": "Όταν ένα συνημμένο",
+    "r-when-a-checklist": "When a checklist is",
+    "r-when-the-checklist": "When the checklist",
+    "r-completed": "Completed",
+    "r-made-incomplete": "Made incomplete",
+    "r-when-a-item": "When a checklist item is",
+    "r-when-the-item": "When the checklist item",
+    "r-checked": "Checked",
+    "r-unchecked": "Unchecked",
+    "r-move-card-to": "Move card to",
+    "r-top-of": "Top of",
+    "r-bottom-of": "Bottom of",
+    "r-its-list": "its list",
+    "r-archive": "Μετακίνηση στο Αρχείο",
+    "r-unarchive": "Επαναφορά από το Αρχείο",
+    "r-card": "card",
+    "r-add": "Προσθήκη",
+    "r-remove": "Remove",
+    "r-label": "label",
+    "r-member": "member",
+    "r-remove-all": "Remove all members from the card",
+    "r-set-color": "Set color to",
+    "r-checklist": "checklist",
+    "r-check-all": "Check all",
+    "r-uncheck-all": "Uncheck all",
+    "r-items-check": "items of checklist",
+    "r-check": "Check",
+    "r-uncheck": "Uncheck",
+    "r-item": "item",
+    "r-of-checklist": "of checklist",
+    "r-send-email": "Send an email",
+    "r-to": "to",
+    "r-of": "of",
+    "r-subject": "subject",
+    "r-rule-details": "Rule details",
+    "r-d-move-to-top-gen": "Μετακίνηση κάρτας στην αρχή της λίστας της",
+    "r-d-move-to-top-spec": "Μετακίνηση κάρτας στην αρχή της λίστας",
+    "r-d-move-to-bottom-gen": "Μετακίνηση κάρτας στο τέλος της λίστας της",
+    "r-d-move-to-bottom-spec": "Μετακίνηση κάρτας στο τέλος της λίστας",
+    "r-d-send-email": "Send email",
+    "r-d-send-email-to": "to",
+    "r-d-send-email-subject": "subject",
+    "r-d-send-email-message": "message",
+    "r-d-archive": "Μετακίνηση κάρτας στο Αρχείο",
+    "r-d-unarchive": "Επαναφορά κάρτας από το Αρχείο",
+    "r-d-add-label": "Προσθήκη ετικέτας",
+    "r-d-remove-label": "Αφαίρεση ετικέτας",
+    "r-create-card": "Δημιουργία νέας κάρτας",
+    "r-in-list": "in list",
+    "r-in-swimlane": "in swimlane",
+    "r-d-add-member": "Add member",
+    "r-d-remove-member": "Remove member",
+    "r-d-remove-all-member": "Remove all member",
+    "r-d-check-all": "Check all items of a list",
+    "r-d-uncheck-all": "Uncheck all items of a list",
+    "r-d-check-one": "Επιλογή στοιχείου",
+    "r-d-uncheck-one": "Αποεπιλογή στοιχείου",
+    "r-d-check-of-list": "of checklist",
+    "r-d-add-checklist": "Προσθήκη λίστας ελέγχου",
+    "r-d-remove-checklist": "Διαγραφή λίστας ελέγχου",
+    "r-by": "by",
+    "r-add-checklist": "Προσθήκη λίστας ελέγχου",
+    "r-with-items": "με στοιχεία",
+    "r-items-list": "στοιχείο1,στοιχείο2,στοιχείο3",
+    "r-add-swimlane": "Προσθήκη λωρίδας",
+    "r-swimlane-name": "ονομασία λωρίδας",
+    "r-board-note": "Note: leave a field empty to match every possible value.",
+    "r-checklist-note": "Note: checklist's items have to be written as comma separated values.",
+    "r-when-a-card-is-moved": "Όταν η κάρτα μετακινηθεί σε μια άλλη λίστα",
+    "r-set": "Set",
+    "r-update": "Update",
+    "r-datefield": "date field",
+    "r-df-start-at": "start",
+    "r-df-due-at": "due",
+    "r-df-end-at": "end",
+    "r-df-received-at": "received",
+    "r-to-current-datetime": "to current date/time",
+    "r-remove-value-from": "Remove value from",
+    "ldap": "LDAP",
+    "oauth2": "OAuth2",
+    "cas": "CAS",
+    "authentication-method": "Authentication method",
+    "authentication-type": "Authentication type",
+    "custom-product-name": "Custom Product Name",
+    "layout": "Layout",
+    "hide-logo": "Hide Logo",
+    "add-custom-html-after-body-start": "Add Custom HTML after <body> start",
+    "add-custom-html-before-body-end": "Add Custom HTML before </body> end",
+    "error-undefined": "Something went wrong",
+    "error-ldap-login": "An error occurred while trying to login",
+    "display-authentication-method": "Display Authentication Method",
+    "oidc-button-text": "Customize the OIDC button text",
+    "default-authentication-method": "Default Authentication Method",
+    "duplicate-board": "Duplicate Board",
+    "org-number": "The number of organizations is:",
+    "team-number": "The number of teams is:",
+    "people-number": "The number of people is:",
+    "swimlaneDeletePopup-title": "Delete Swimlane ?",
+    "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
+    "restore-all": "Restore all",
+    "delete-all": "Delete all",
+    "loading": "Loading, please wait.",
+    "previous_as": "last time was",
+    "act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__",
+    "act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)",
+    "act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)",
+    "act-a-receivedAt": "modified received time to __timeValue__ from (__timeOldValue__)",
+    "a-dueAt": "modified due time to be",
+    "a-endAt": "modified ending time to be",
+    "a-startAt": "modified starting time to be",
+    "a-receivedAt": "modified received time to be",
+    "almostdue": "current due time %s is approaching",
+    "pastdue": "current due time %s is past",
+    "duenow": "current due time %s is today",
+    "act-newDue": "__list__/__card__ has 1st due reminder [__board__]",
+    "act-withDue": "__list__/__card__ due reminders [__board__]",
+    "act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
+    "act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
+    "act-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
+    "act-atUserComment": "You were mentioned in [__board__] __list__/__card__",
+    "delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
+    "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.",
+    "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.",
+    "accounts-allowUserDelete": "Allow users to self delete their account",
+    "hide-minicard-label-text": "Hide minicard label text",
+    "show-desktop-drag-handles": "Show desktop drag handles",
+    "assignee": "Assignee",
+    "cardAssigneesPopup-title": "Assignee",
+    "addmore-detail": "Add a more detailed description",
+    "show-on-card": "Show on Card",
+    "new": "New",
+    "editOrgPopup-title": "Edit Organization",
+    "newOrgPopup-title": "New Organization",
+    "editTeamPopup-title": "Edit Team",
+    "newTeamPopup-title": "New Team",
+    "editUserPopup-title": "Edit User",
+    "newUserPopup-title": "New User",
+    "notifications": "Notifications",
+    "view-all": "View All",
+    "filter-by-unread": "Filter by Unread",
+    "mark-all-as-read": "Mark all as read",
+    "remove-all-read": "Remove all read",
+    "allow-rename": "Allow Rename",
+    "allowRenamePopup-title": "Allow Rename",
+    "start-day-of-week": "Set day of the week start",
+    "monday": "Monday",
+    "tuesday": "Tuesday",
+    "wednesday": "Wednesday",
+    "thursday": "Thursday",
+    "friday": "Friday",
+    "saturday": "Saturday",
+    "sunday": "Sunday",
+    "status": "Status",
+    "swimlane": "Swimlane",
+    "owner": "Owner",
+    "last-modified-at": "Last modified at",
+    "last-activity": "Last activity",
+    "voting": "Voting",
+    "archived": "Archived",
+    "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has",
+    "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list",
+    "hide-checked-items": "Hide checked items",
+    "task": "Task",
+    "create-task": "Create Task",
+    "ok": "OK",
+    "organizations": "Organizations",
+    "teams": "Teams",
+    "displayName": "Display Name",
+    "shortName": "Short Name",
+    "website": "Website",
+    "person": "Person",
+    "my-cards": "My Cards",
+    "card": "Κάρτα",
+    "board": "Board",
+    "context-separator": "/",
+    "myCardsSortChange-title": "My Cards Sort",
+    "myCardsSortChangePopup-title": "My Cards Sort",
+    "myCardsSortChange-choice-board": "By Board",
+    "myCardsSortChange-choice-dueat": "By Due Date",
+    "dueCards-title": "Due Cards",
+    "dueCardsViewChange-title": "Due Cards View",
+    "dueCardsViewChangePopup-title": "Due Cards View",
+    "dueCardsViewChange-choice-me": "Me",
+    "dueCardsViewChange-choice-all": "All Users",
+    "dueCardsViewChange-choice-all-description": "Shows all incomplete cards with a *Due* date from boards for which the user has permission.",
+    "broken-cards": "Broken Cards",
+    "board-title-not-found": "Board '%s' not found.",
+    "swimlane-title-not-found": "Swimlane '%s' not found.",
+    "list-title-not-found": "List '%s' not found.",
+    "label-not-found": "Label '%s' not found.",
+    "label-color-not-found": "Label color %s not found.",
+    "user-username-not-found": "Username '%s' not found.",
+    "comment-not-found": "Card with comment containing text '%s' not found.",
+    "org-name-not-found": "Organization '%s' not found.",
+    "team-name-not-found": "Team '%s' not found.",
+    "globalSearch-title": "Search All Boards",
+    "no-cards-found": "No Cards Found",
+    "one-card-found": "One Card Found",
+    "n-cards-found": "%s Cards Found",
+    "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found",
+    "operator-board": "board",
+    "operator-board-abbrev": "b",
+    "operator-swimlane": "swimlane",
+    "operator-swimlane-abbrev": "s",
+    "operator-list": "λίστα",
+    "operator-list-abbrev": "l",
+    "operator-label": "label",
+    "operator-label-abbrev": "#",
+    "operator-user": "user",
+    "operator-user-abbrev": "@",
+    "operator-member": "member",
+    "operator-member-abbrev": "m",
+    "operator-assignee": "assignee",
+    "operator-assignee-abbrev": "a",
+    "operator-creator": "creator",
+    "operator-status": "status",
+    "operator-due": "due",
+    "operator-created": "created",
+    "operator-modified": "modified",
+    "operator-sort": "sort",
+    "operator-comment": "comment",
+    "operator-has": "has",
+    "operator-limit": "limit",
+    "operator-debug": "debug",
+    "operator-org": "org",
+    "operator-team": "team",
+    "predicate-archived": "archived",
+    "predicate-open": "open",
+    "predicate-ended": "ended",
+    "predicate-all": "all",
+    "predicate-overdue": "overdue",
+    "predicate-week": "week",
+    "predicate-month": "month",
+    "predicate-quarter": "quarter",
+    "predicate-year": "year",
+    "predicate-due": "due",
+    "predicate-modified": "modified",
+    "predicate-created": "created",
+    "predicate-attachment": "attachment",
+    "predicate-description": "description",
+    "predicate-checklist": "checklist",
+    "predicate-start": "start",
+    "predicate-end": "end",
+    "predicate-assignee": "assignee",
+    "predicate-member": "member",
+    "predicate-public": "public",
+    "predicate-private": "private",
+    "predicate-selector": "selector",
+    "predicate-projection": "projection",
+    "operator-unknown-error": "%s is not an operator",
+    "operator-number-expected": "operator __operator__ expected a number, got '__value__'",
+    "operator-sort-invalid": "sort of '%s' is invalid",
+    "operator-status-invalid": "'%s' is not a valid status",
+    "operator-has-invalid": "%s is not a valid existence check",
+    "operator-limit-invalid": "%s is not a valid limit.  Limit should be a positive integer.",
+    "operator-debug-invalid": "%s is not a valid debug predicate",
+    "next-page": "Next Page",
+    "previous-page": "Previous Page",
+    "heading-notes": "Notes",
+    "globalSearch-instructions-heading": "Search Instructions",
+    "globalSearch-instructions-description": "Searches can include operators to refine the search.  Operators are specified by writing the operator name and value separated by a colon.  For example, an operator specification of `list:Blocked` would limit the search to cards that are contained in a list named *Blocked*.  If the value contains spaces or special characters it must be enclosed in quotation marks (e.g. `__operator_list__:\"To Review\"`).",
+    "globalSearch-instructions-operators": "Available operators:",
+    "globalSearch-instructions-operator-board": "`__operator_board__:<title>` - cards in boards matching the specified *<title>*",
+    "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - cards in lists matching the specified *<title>*",
+    "globalSearch-instructions-operator-swimlane": "`__operator_swimlane__:<title>` - cards in swimlanes matching the specified *<title>*",
+    "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - cards with a comment containing *<text>*.",
+    "globalSearch-instructions-operator-label": "`__operator_label__:<color>` `__operator_label__:<name>` - cards that have a label matching *<color>* or *<name>",
+    "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__<name|color>` - shorthand for `__operator_label__:<color>` or `__operator_label__:<name>`",
+    "globalSearch-instructions-operator-user": "`__operator_user__:<username>` - cards where *<username>* is a *member* or *assignee*",
+    "globalSearch-instructions-operator-at": "`__operator_user_abbrev__username` - shorthand for `user:<username>`",
+    "globalSearch-instructions-operator-member": "`__operator_member__:<username>` - cards where *<username>* is a *member*",
+    "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - cards where *<username>* is an *assignee*",
+    "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator",
+    "globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*",
+    "globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*",
+    "globalSearch-instructions-operator-due": "`__operator_due__:<n>` - cards which are due up to *<n>* days from now.  `__operator_due__:__predicate_overdue__ lists all cards past their due date.",
+    "globalSearch-instructions-operator-created": "`__operator_created__:<n>` - cards which were created *<n>* days ago or less",
+    "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - cards which were modified *<n>* days ago or less",
+    "globalSearch-instructions-operator-status": "`__operator_status__:<status>` - where *<status>* is one of the following:",
+    "globalSearch-instructions-status-archived": "`__predicate_archived__` - archived cards",
+    "globalSearch-instructions-status-all": "`__predicate_all__` - all archived and unarchived cards",
+    "globalSearch-instructions-status-ended": "`__predicate_ended__` - cards with an end date",
+    "globalSearch-instructions-status-public": "`__predicate_public__` - cards only in public boards",
+    "globalSearch-instructions-status-private": "`__predicate_private__` - cards only in private boards",
+    "globalSearch-instructions-operator-has": "`__operator_has__:<field>` - where *<field>* is one of `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` or `__predicate_member__`.  Placing a `-` in front of *<field>* searches for the absence of a value in that field (e.g. `has:-due` searches for cards without a due date).",
+    "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` - where *<sort-name>* is one of `__predicate_due__`, `__predicate_created__` or `__predicate_modified__`.  For a descending sort, place a `-` in front of the sort name.",
+    "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - where *<n>* is a positive integer expressing the number of cards to be displayed per page.",
+    "globalSearch-instructions-notes-1": "Multiple operators may be specified.",
+    "globalSearch-instructions-notes-2": "Similar operators are *OR*ed together.  Cards that match any of the conditions will be returned.\n`__operator_list__:Available __operator_list__:Blocked` would return cards contained in any list named *Blocked* or *Available*.",
+    "globalSearch-instructions-notes-3": "Differing operators are *AND*ed together.  Only cards that match all of the differing operators are returned.  `__operator_list__:Available __operator_label__:red` returns only cards in the list *Available* with a *red* label.",
+    "globalSearch-instructions-notes-3-2": "Days can be specified as a positive or negative integer or using `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` or `__predicate_year__` for the current period.",
+    "globalSearch-instructions-notes-4": "Text searches are case insensitive.",
+    "globalSearch-instructions-notes-5": "By default archived cards are not searched.",
+    "link-to-search": "Link to this search",
+    "excel-font": "Arial",
+    "number": "Αριθμός",
+    "label-colors": "Label Colors",
+    "label-names": "Label Names",
+    "archived-at": "archived at",
+    "sort-cards": "Sort Cards",
+    "cardsSortPopup-title": "Sort Cards",
+    "due-date": "Due Date",
+    "server-error": "Server Error",
+    "server-error-troubleshooting": "Please submit the error generated by the server.\nFor a snap installation, run: `sudo snap logs wekan.wekan`\nFor a Docker installation, run: `sudo docker logs wekan-app`",
+    "title-alphabetically": "Title (Alphabetically)",
+    "created-at-newest-first": "Created At (Newest First)",
+    "created-at-oldest-first": "Created At (Oldest First)",
+    "links-heading": "Links",
+    "hide-system-messages-of-all-users": "Hide system messages of all users",
+    "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden",
+    "move-swimlane": "Move Swimlane",
+    "moveSwimlanePopup-title": "Move Swimlane",
+    "custom-field-stringtemplate": "String Template",
+    "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)",
+    "custom-field-stringtemplate-separator": "Separator (use &#32; or &nbsp; for a space)",
+    "custom-field-stringtemplate-item-placeholder": "Press enter to add more items",
+    "creator": "Creator",
+    "filesReportTitle": "Files Report",
+    "orphanedFilesReportTitle": "Orphaned Files Report",
+    "reports": "Reports",
+    "rulesReportTitle": "Rules Report",
+    "boardsReportTitle": "Boards Report",
+    "cardsReportTitle": "Cards Report",
+    "copy-swimlane": "Copy Swimlane",
+    "copySwimlanePopup-title": "Copy Swimlane",
+    "display-card-creator": "Display Card Creator",
+    "wait-spinner": "Wait Spinner",
+    "Bounce": "Bounce Wait Spinner",
+    "Cube": "Cube Wait Spinner",
+    "Cube-Grid": "Cube-Grid Wait Spinner",
+    "Dot": "Dot Wait Spinner",
+    "Double-Bounce": "Double Bounce Wait Spinner",
+    "Rotateplane": "Rotateplane Wait Spinner",
+    "Scaleout": "Scaleout Wait Spinner",
+    "Wave": "Wave Wait Spinner",
+    "maximize-card": "Maximize Card",
+    "minimize-card": "Minimize Card",
+    "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
+    "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it",
+    "subject": "Subject",
+    "details": "Details",
+    "carbon-copy": "Carbon Copy (Cc:)",
+    "ticket": "Ticket",
+    "tickets": "Tickets",
+    "ticket-number": "Ticket Number",
+    "open": "Open",
+    "pending": "Pending",
+    "closed": "Closed",
+    "resolved": "Resolved",
+    "cancelled": "Cancelled",
+    "history": "History",
+    "request": "Request",
+    "requests": "Requests",
+    "help-request": "Help Request",
+    "editCardSortOrderPopup-title": "Change Sorting",
+    "cardDetailsPopup-title": "Card Details",
+    "add-teams": "Add teams",
+    "add-teams-label": "Added teams are displayed below:",
+    "remove-team-from-table": "Are you sure you want to remove this team from the board ?",
+    "confirm-btn": "Confirm",
+    "remove-btn": "Remove",
+    "filter-card-title-label": "Filter by card title",
+    "invite-people-success": "Invitation to register sent with success",
+    "invite-people-error": "Error while sending invitation to register",
+    "can-invite-if-same-mailDomainName": "Email domain name",
+    "to-create-teams-contact-admin": "To create teams, please contact the administrator.",
+    "Node_heap_total_heap_size": "Node heap: total heap size",
+    "Node_heap_total_heap_size_executable": "Node heap: total heap size executable",
+    "Node_heap_total_physical_size": "Node heap: total physical size",
+    "Node_heap_total_available_size": "Node heap: total available size",
+    "Node_heap_used_heap_size": "Node heap: used heap size",
+    "Node_heap_heap_size_limit": "Node heap: heap size limit",
+    "Node_heap_malloced_memory": "Node heap: malloced memory",
+    "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory",
+    "Node_heap_does_zap_garbage": "Node heap: does zap garbage",
+    "Node_heap_number_of_native_contexts": "Node heap: number of native contexts",
+    "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts",
+    "Node_memory_usage_rss": "Node memory usage: resident set size",
+    "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap",
+    "Node_memory_usage_heap_used": "Node memory usage: actual memory used",
+    "Node_memory_usage_external": "Node memory usage: external",
+    "add-organizations": "Add organizations",
+    "add-organizations-label": "Added organizations are displayed below:",
+    "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?",
+    "to-create-organizations-contact-admin": "To create organizations, please contact administrator.",
+    "custom-legal-notice-link-url": "Custom legal notice page URL",
+    "acceptance_of_our_legalNotice": "By continuing, you accept our",
+    "legalNotice": "legal notice",
+    "copied": "Copied!",
+    "checklistActionsPopup-title": "Checklist Actions",
+    "moveChecklist": "Move Checklist",
+    "moveChecklistPopup-title": "Move Checklist",
+    "newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
+    "copyChecklist": "Copy Checklist",
+    "copyChecklistPopup-title": "Copy Checklist",
+    "card-show-lists": "Card Show Lists"
+}

+ 0 - 0
i18n/en-DE.i18n.json → imports/i18n/data/en-DE.i18n.json


+ 0 - 0
i18n/en-GB.i18n.json → imports/i18n/data/en-GB.i18n.json


+ 0 - 0
i18n/en-IT.i18n.json → imports/i18n/data/en-IT.i18n.json


+ 0 - 0
i18n/en.i18n.json → imports/i18n/data/en.i18n.json


+ 0 - 0
i18n/eo.i18n.json → imports/i18n/data/eo.i18n.json


+ 0 - 0
i18n/es-AR.i18n.json → imports/i18n/data/es-AR.i18n.json


+ 0 - 0
i18n/es-CL.i18n.json → imports/i18n/data/es-CL.i18n.json


+ 0 - 0
i18n/es-LA.i18n.json → imports/i18n/data/es-LA.i18n.json


+ 0 - 0
i18n/es-MX.i18n.json → imports/i18n/data/es-MX.i18n.json


+ 0 - 0
i18n/es-PE.i18n.json → imports/i18n/data/es-PE.i18n.json


+ 0 - 0
i18n/es-PY.i18n.json → imports/i18n/data/es-PY.i18n.json


+ 0 - 0
i18n/es.i18n.json → imports/i18n/data/es.i18n.json


+ 0 - 0
i18n/et-EE.i18n.json → imports/i18n/data/et-EE.i18n.json


+ 0 - 0
i18n/eu.i18n.json → imports/i18n/data/eu.i18n.json


+ 0 - 0
i18n/fa-IR.i18n.json → imports/i18n/data/fa-IR.i18n.json


+ 0 - 0
i18n/fa.i18n.json → imports/i18n/data/fa.i18n.json


+ 0 - 0
i18n/fi.i18n.json → imports/i18n/data/fi.i18n.json


+ 0 - 0
i18n/fr-CH.i18n.json → imports/i18n/data/fr-CH.i18n.json


+ 0 - 0
i18n/fr.i18n.json → imports/i18n/data/fr.i18n.json


+ 0 - 0
i18n/gl-ES.i18n.json → imports/i18n/data/gl-ES.i18n.json


+ 0 - 0
i18n/gl.i18n.json → imports/i18n/data/gl.i18n.json


+ 0 - 0
i18n/gu-IN.i18n.json → imports/i18n/data/gu-IN.i18n.json


+ 0 - 0
i18n/he.i18n.json → imports/i18n/data/he.i18n.json


+ 0 - 0
i18n/hi-IN.i18n.json → imports/i18n/data/hi-IN.i18n.json


+ 0 - 0
i18n/hi.i18n.json → imports/i18n/data/hi.i18n.json


+ 0 - 0
i18n/hr.i18n.json → imports/i18n/data/hr.i18n.json


+ 0 - 0
i18n/hu.i18n.json → imports/i18n/data/hu.i18n.json


+ 0 - 0
i18n/hy.i18n.json → imports/i18n/data/hy.i18n.json


+ 0 - 0
i18n/id.i18n.json → imports/i18n/data/id.i18n.json


+ 0 - 0
i18n/ig.i18n.json → imports/i18n/data/ig.i18n.json


+ 0 - 0
i18n/it.i18n.json → imports/i18n/data/it.i18n.json


+ 0 - 0
i18n/ja.i18n.json → imports/i18n/data/ja.i18n.json


+ 0 - 0
i18n/ka.i18n.json → imports/i18n/data/ka.i18n.json


+ 0 - 0
i18n/km.i18n.json → imports/i18n/data/km.i18n.json


+ 0 - 0
i18n/ko.i18n.json → imports/i18n/data/ko.i18n.json


+ 0 - 0
i18n/lt.i18n.json → imports/i18n/data/lt.i18n.json


+ 0 - 0
i18n/lv.i18n.json → imports/i18n/data/lv.i18n.json


+ 0 - 0
i18n/mk.i18n.json → imports/i18n/data/mk.i18n.json


+ 0 - 0
i18n/mn.i18n.json → imports/i18n/data/mn.i18n.json


+ 0 - 0
i18n/ms-MY.i18n.json → imports/i18n/data/ms-MY.i18n.json


+ 0 - 0
i18n/nb.i18n.json → imports/i18n/data/nb.i18n.json


+ 0 - 0
i18n/nl.i18n.json → imports/i18n/data/nl.i18n.json


+ 0 - 0
i18n/oc.i18n.json → imports/i18n/data/oc.i18n.json


+ 0 - 0
i18n/pa.i18n.json → imports/i18n/data/pa.i18n.json


+ 0 - 0
i18n/pl.i18n.json → imports/i18n/data/pl.i18n.json


+ 0 - 0
i18n/pt-BR.i18n.json → imports/i18n/data/pt-BR.i18n.json


+ 0 - 0
i18n/pt.i18n.json → imports/i18n/data/pt.i18n.json


+ 0 - 0
i18n/ro.i18n.json → imports/i18n/data/ro.i18n.json


+ 0 - 0
i18n/ru-UA.i18n.json → imports/i18n/data/ru-UA.i18n.json


+ 0 - 0
i18n/ru.i18n.json → imports/i18n/data/ru.i18n.json


+ 0 - 0
i18n/sk.i18n.json → imports/i18n/data/sk.i18n.json


+ 0 - 0
i18n/sl.i18n.json → imports/i18n/data/sl.i18n.json


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません