diff options
Diffstat (limited to 'apps')
199 files changed, 2176 insertions, 1437 deletions
diff --git a/apps/comments/src/components/Comment.vue b/apps/comments/src/components/Comment.vue index fb08778b9d2..c8b2b176f42 100644 --- a/apps/comments/src/components/Comment.vue +++ b/apps/comments/src/components/Comment.vue @@ -364,7 +364,7 @@ $comment-padding: 10px; &__message { white-space: pre-wrap; - word-break: break-word; + word-break: normal; max-height: 70px; overflow: hidden; margin-top: -6px; diff --git a/apps/dashboard/l10n/ar.js b/apps/dashboard/l10n/ar.js index cbc7e805515..abe91d4bf28 100644 --- a/apps/dashboard/l10n/ar.js +++ b/apps/dashboard/l10n/ar.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "أهلا، {name} ", "Happy birthday 🥳🤩🎂🎉" : "عيد ميلاد سعيد 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "عيد ميلاد سعيد, يا {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} أيقونة\"", "Customize" : "تعديل", "Edit widgets" : "تعديل أدوات الصفحة الرئيسية", "Get more widgets from the App Store" : "يمكنك الحصول على المزيد من الأدوات من متجر التطبيقات", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "للحفاظ على خصوصيتك، يتم استدعاء بيانات حالة الطقس عبر خادم NextCloud الخاص بك نيابه عنك، وبالتالي فإن خدمة حالة الطقس لا تشارك معلوماتك الشخصية.", "Weather data from Met.no" : "بيانات الطقس من Met.no", "geocoding with Nominatim" : "الترميز الجغرافي مع Nominatim", - "elevation data from OpenTopoData" : "بيانات التقييم من OpenTopoData" + "elevation data from OpenTopoData" : "بيانات التقييم من OpenTopoData", + "\"{title} icon\"" : "\"{title} أيقونة\"" }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/dashboard/l10n/ar.json b/apps/dashboard/l10n/ar.json index 15ec6f00dcb..caad4cc7e32 100644 --- a/apps/dashboard/l10n/ar.json +++ b/apps/dashboard/l10n/ar.json @@ -14,7 +14,6 @@ "Hello, {name}" : "أهلا، {name} ", "Happy birthday 🥳🤩🎂🎉" : "عيد ميلاد سعيد 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "عيد ميلاد سعيد, يا {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} أيقونة\"", "Customize" : "تعديل", "Edit widgets" : "تعديل أدوات الصفحة الرئيسية", "Get more widgets from the App Store" : "يمكنك الحصول على المزيد من الأدوات من متجر التطبيقات", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "للحفاظ على خصوصيتك، يتم استدعاء بيانات حالة الطقس عبر خادم NextCloud الخاص بك نيابه عنك، وبالتالي فإن خدمة حالة الطقس لا تشارك معلوماتك الشخصية.", "Weather data from Met.no" : "بيانات الطقس من Met.no", "geocoding with Nominatim" : "الترميز الجغرافي مع Nominatim", - "elevation data from OpenTopoData" : "بيانات التقييم من OpenTopoData" + "elevation data from OpenTopoData" : "بيانات التقييم من OpenTopoData", + "\"{title} icon\"" : "\"{title} أيقونة\"" },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ast.js b/apps/dashboard/l10n/ast.js index 068a13291f2..2817983e456 100644 --- a/apps/dashboard/l10n/ast.js +++ b/apps/dashboard/l10n/ast.js @@ -14,7 +14,6 @@ OC.L10N.register( "Good evening, {name}" : "Bones nueches, {name}", "Hello" : "Hola", "Hello, {name}" : "Hola, {name}", - "\"{title} icon\"" : "«Iconu de: {title}»", "Customize" : "Personalizar", "Edit widgets" : "Editar los widgets", "Get more widgets from the App Store" : "Consigui más widgets de l'App Store", @@ -22,6 +21,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Pa la to privacidá, los datos del clima solicítense dende esta instancia de Nextcloud y, polo tanto, el serviciu del clima no recibe nenguna información personal.", "Weather data from Met.no" : "datos del clima de Met.no", "geocoding with Nominatim" : "xeocodificación con Nominatim", - "elevation data from OpenTopoData" : "datos d'elevaciones d'OpenTopoData" + "elevation data from OpenTopoData" : "datos d'elevaciones d'OpenTopoData", + "\"{title} icon\"" : "«Iconu de: {title}»" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/ast.json b/apps/dashboard/l10n/ast.json index 6adf8dae335..1f194cf8b54 100644 --- a/apps/dashboard/l10n/ast.json +++ b/apps/dashboard/l10n/ast.json @@ -12,7 +12,6 @@ "Good evening, {name}" : "Bones nueches, {name}", "Hello" : "Hola", "Hello, {name}" : "Hola, {name}", - "\"{title} icon\"" : "«Iconu de: {title}»", "Customize" : "Personalizar", "Edit widgets" : "Editar los widgets", "Get more widgets from the App Store" : "Consigui más widgets de l'App Store", @@ -20,6 +19,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Pa la to privacidá, los datos del clima solicítense dende esta instancia de Nextcloud y, polo tanto, el serviciu del clima no recibe nenguna información personal.", "Weather data from Met.no" : "datos del clima de Met.no", "geocoding with Nominatim" : "xeocodificación con Nominatim", - "elevation data from OpenTopoData" : "datos d'elevaciones d'OpenTopoData" + "elevation data from OpenTopoData" : "datos d'elevaciones d'OpenTopoData", + "\"{title} icon\"" : "«Iconu de: {title}»" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/bg.js b/apps/dashboard/l10n/bg.js index a3d874b9dde..aa438921262 100644 --- a/apps/dashboard/l10n/bg.js +++ b/apps/dashboard/l10n/bg.js @@ -13,7 +13,6 @@ OC.L10N.register( "Good evening, {name}" : "Добър вечер, {name}", "Hello" : "Здравейте", "Hello, {name}" : "Здравейте, {name}", - "\"{title} icon\"" : "„икона {title}“", "Customize" : "Персонизиране", "Edit widgets" : "Редактиране на изпълнимите модули", "Get more widgets from the App Store" : "Вземете повече приспособления от App Store", @@ -21,6 +20,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "За вашата поверителност данните за времето се изискват от Nextcloud сървъра ви от ваше име, така че метеорологичната служба не получава лична информация.", "Weather data from Met.no" : "Данни за времето от Met.no", "geocoding with Nominatim" : "геокодиране с Nominatim", - "elevation data from OpenTopoData" : " кота данни от OpenTopoData" + "elevation data from OpenTopoData" : " кота данни от OpenTopoData", + "\"{title} icon\"" : "„икона {title}“" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/bg.json b/apps/dashboard/l10n/bg.json index 6efd79f09be..4917c61e5f2 100644 --- a/apps/dashboard/l10n/bg.json +++ b/apps/dashboard/l10n/bg.json @@ -11,7 +11,6 @@ "Good evening, {name}" : "Добър вечер, {name}", "Hello" : "Здравейте", "Hello, {name}" : "Здравейте, {name}", - "\"{title} icon\"" : "„икона {title}“", "Customize" : "Персонизиране", "Edit widgets" : "Редактиране на изпълнимите модули", "Get more widgets from the App Store" : "Вземете повече приспособления от App Store", @@ -19,6 +18,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "За вашата поверителност данните за времето се изискват от Nextcloud сървъра ви от ваше име, така че метеорологичната служба не получава лична информация.", "Weather data from Met.no" : "Данни за времето от Met.no", "geocoding with Nominatim" : "геокодиране с Nominatim", - "elevation data from OpenTopoData" : " кота данни от OpenTopoData" + "elevation data from OpenTopoData" : " кота данни от OpenTopoData", + "\"{title} icon\"" : "„икона {title}“" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ca.js b/apps/dashboard/l10n/ca.js index 9866240236a..333cdbac223 100644 --- a/apps/dashboard/l10n/ca.js +++ b/apps/dashboard/l10n/ca.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Hola, {name}", "Happy birthday 🥳🤩🎂🎉" : "Per molts anys 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Per molts anys, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"icona de {title}\"", "Customize" : "Personalitza", "Edit widgets" : "Edita els ginys", "Get more widgets from the App Store" : "Obtén més ginys a la botiga d'aplicacions", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Per a la vostra privadesa, les dades meteorològiques les sol·licita el servidor del Nextcloud en nom vostre perquè el servei meteorològic no rebi cap informació personal.", "Weather data from Met.no" : "Dades meteorològiques de Met.no", "geocoding with Nominatim" : "codis geogràfics amb Nominatim", - "elevation data from OpenTopoData" : "dades d'altitud d'OpenTopoData" + "elevation data from OpenTopoData" : "dades d'altitud d'OpenTopoData", + "\"{title} icon\"" : "\"icona de {title}\"" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/ca.json b/apps/dashboard/l10n/ca.json index 6a568cb896b..0c54b9c57ad 100644 --- a/apps/dashboard/l10n/ca.json +++ b/apps/dashboard/l10n/ca.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Hola, {name}", "Happy birthday 🥳🤩🎂🎉" : "Per molts anys 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Per molts anys, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"icona de {title}\"", "Customize" : "Personalitza", "Edit widgets" : "Edita els ginys", "Get more widgets from the App Store" : "Obtén més ginys a la botiga d'aplicacions", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Per a la vostra privadesa, les dades meteorològiques les sol·licita el servidor del Nextcloud en nom vostre perquè el servei meteorològic no rebi cap informació personal.", "Weather data from Met.no" : "Dades meteorològiques de Met.no", "geocoding with Nominatim" : "codis geogràfics amb Nominatim", - "elevation data from OpenTopoData" : "dades d'altitud d'OpenTopoData" + "elevation data from OpenTopoData" : "dades d'altitud d'OpenTopoData", + "\"{title} icon\"" : "\"icona de {title}\"" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/cs.js b/apps/dashboard/l10n/cs.js index 9210dc79f46..6c390e5a041 100644 --- a/apps/dashboard/l10n/cs.js +++ b/apps/dashboard/l10n/cs.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Dobrý den, {name}", "Happy birthday 🥳🤩🎂🎉" : "Všechno nejlepší k narozeninám 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Všechno nejlepší k narozeninám, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„ikona {title}“", "Customize" : "Přizpůsobit si", "Edit widgets" : "Upravit ovládací prvky", "Get more widgets from the App Store" : "Získat další ovládací prvky z katalogu aplikací", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Vaše soukromí je chráněno tím, že komunikaci se službou předpovědi počasí zprostředkovává vámi využívaný Nextcloud server. Díky tomu služba, která tyto údaje poskytuje, neobdrží z vašeho počítače žádné osobní údaje.", "Weather data from Met.no" : "Údaje o počasí z Met.no", "geocoding with Nominatim" : "z popisu polohy na souřadnice převáděno službou Nominatim", - "elevation data from OpenTopoData" : "data o nadmořských výškách z OpenTopoData" + "elevation data from OpenTopoData" : "data o nadmořských výškách z OpenTopoData", + "\"{title} icon\"" : "„ikona {title}“" }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); diff --git a/apps/dashboard/l10n/cs.json b/apps/dashboard/l10n/cs.json index c64b3280635..6252d433e6f 100644 --- a/apps/dashboard/l10n/cs.json +++ b/apps/dashboard/l10n/cs.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Dobrý den, {name}", "Happy birthday 🥳🤩🎂🎉" : "Všechno nejlepší k narozeninám 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Všechno nejlepší k narozeninám, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„ikona {title}“", "Customize" : "Přizpůsobit si", "Edit widgets" : "Upravit ovládací prvky", "Get more widgets from the App Store" : "Získat další ovládací prvky z katalogu aplikací", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Vaše soukromí je chráněno tím, že komunikaci se službou předpovědi počasí zprostředkovává vámi využívaný Nextcloud server. Díky tomu služba, která tyto údaje poskytuje, neobdrží z vašeho počítače žádné osobní údaje.", "Weather data from Met.no" : "Údaje o počasí z Met.no", "geocoding with Nominatim" : "z popisu polohy na souřadnice převáděno službou Nominatim", - "elevation data from OpenTopoData" : "data o nadmořských výškách z OpenTopoData" + "elevation data from OpenTopoData" : "data o nadmořských výškách z OpenTopoData", + "\"{title} icon\"" : "„ikona {title}“" },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/da.js b/apps/dashboard/l10n/da.js index 6dbf3240587..c118af726c4 100644 --- a/apps/dashboard/l10n/da.js +++ b/apps/dashboard/l10n/da.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Hej {name}", "Happy birthday 🥳🤩🎂🎉" : "Tillykke med fødselsdagen 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Tillykke med fødselsdagen, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} ikon\"", "Customize" : "Brugerdefiner", "Edit widgets" : "Rediger widgets", "Get more widgets from the App Store" : "Få flere widgets fra App Store", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Af hensyn til dit privatliv, er det din Nextcloud-server der henter vejr-data og udbyderen modtager således ingen oplysninger om dig.", "Weather data from Met.no" : "Vejr-data leveres af Met.no", "geocoding with Nominatim" : "Geocoding med Nominatim", - "elevation data from OpenTopoData" : "Højde-data fra OpenTopoData" + "elevation data from OpenTopoData" : "Højde-data fra OpenTopoData", + "\"{title} icon\"" : "\"{title} ikon\"" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/da.json b/apps/dashboard/l10n/da.json index 8b184ce6989..71fcc7bc9c9 100644 --- a/apps/dashboard/l10n/da.json +++ b/apps/dashboard/l10n/da.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Hej {name}", "Happy birthday 🥳🤩🎂🎉" : "Tillykke med fødselsdagen 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Tillykke med fødselsdagen, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} ikon\"", "Customize" : "Brugerdefiner", "Edit widgets" : "Rediger widgets", "Get more widgets from the App Store" : "Få flere widgets fra App Store", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Af hensyn til dit privatliv, er det din Nextcloud-server der henter vejr-data og udbyderen modtager således ingen oplysninger om dig.", "Weather data from Met.no" : "Vejr-data leveres af Met.no", "geocoding with Nominatim" : "Geocoding med Nominatim", - "elevation data from OpenTopoData" : "Højde-data fra OpenTopoData" + "elevation data from OpenTopoData" : "Højde-data fra OpenTopoData", + "\"{title} icon\"" : "\"{title} ikon\"" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/de.js b/apps/dashboard/l10n/de.js index 9fc197d7167..2885e6a657a 100644 --- a/apps/dashboard/l10n/de.js +++ b/apps/dashboard/l10n/de.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Hallo, {name}", "Happy birthday 🥳🤩🎂🎉" : "Alles Gute zum Geburtstag 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Alles Gute zum Geburtstag, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title}-Symbol\"", "Customize" : "Anpassen", "Edit widgets" : "Widgets bearbeiten", "Get more widgets from the App Store" : "Hole dir weitere Widgets aus dem App-Store", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zu deinem Datenschutz werden die Wetterdaten von deinem Nextcloud-Server für dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.", "Weather data from Met.no" : "Wetterdaten von Met.no", "geocoding with Nominatim" : "Geokodierung mit Nominatim", - "elevation data from OpenTopoData" : "Höhendaten von OpenTopoData" + "elevation data from OpenTopoData" : "Höhendaten von OpenTopoData", + "\"{title} icon\"" : "\"{title}-Symbol\"" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/de.json b/apps/dashboard/l10n/de.json index 230f4a87ece..d3ff6b42dda 100644 --- a/apps/dashboard/l10n/de.json +++ b/apps/dashboard/l10n/de.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Hallo, {name}", "Happy birthday 🥳🤩🎂🎉" : "Alles Gute zum Geburtstag 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Alles Gute zum Geburtstag, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title}-Symbol\"", "Customize" : "Anpassen", "Edit widgets" : "Widgets bearbeiten", "Get more widgets from the App Store" : "Hole dir weitere Widgets aus dem App-Store", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zu deinem Datenschutz werden die Wetterdaten von deinem Nextcloud-Server für dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.", "Weather data from Met.no" : "Wetterdaten von Met.no", "geocoding with Nominatim" : "Geokodierung mit Nominatim", - "elevation data from OpenTopoData" : "Höhendaten von OpenTopoData" + "elevation data from OpenTopoData" : "Höhendaten von OpenTopoData", + "\"{title} icon\"" : "\"{title}-Symbol\"" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/de_DE.js b/apps/dashboard/l10n/de_DE.js index f1b2916cd67..3d18e6f7837 100644 --- a/apps/dashboard/l10n/de_DE.js +++ b/apps/dashboard/l10n/de_DE.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Hallo, {name}", "Happy birthday 🥳🤩🎂🎉" : "Alles Gute zum Geburtstag 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Alles Gute zum Geburtstag, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title}-Symbol\"", "Customize" : "Anpassen", "Edit widgets" : "Widgets bearbeiten", "Get more widgets from the App Store" : "Holen Sie sich weitere Widgets aus dem App-Store", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zu Ihrem Datenschutz werden die Wetterdaten von Ihrem Nextcloud-Server für Sie angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.", "Weather data from Met.no" : "Wetterdaten von Met.no", "geocoding with Nominatim" : "Geokodierung mit Nominatim", - "elevation data from OpenTopoData" : "Höhendaten von OpenTopoData" + "elevation data from OpenTopoData" : "Höhendaten von OpenTopoData", + "\"{title} icon\"" : "\"{title}-Symbol\"" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/de_DE.json b/apps/dashboard/l10n/de_DE.json index ba2ab517a4a..edfbc1c1273 100644 --- a/apps/dashboard/l10n/de_DE.json +++ b/apps/dashboard/l10n/de_DE.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Hallo, {name}", "Happy birthday 🥳🤩🎂🎉" : "Alles Gute zum Geburtstag 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Alles Gute zum Geburtstag, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title}-Symbol\"", "Customize" : "Anpassen", "Edit widgets" : "Widgets bearbeiten", "Get more widgets from the App Store" : "Holen Sie sich weitere Widgets aus dem App-Store", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zu Ihrem Datenschutz werden die Wetterdaten von Ihrem Nextcloud-Server für Sie angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.", "Weather data from Met.no" : "Wetterdaten von Met.no", "geocoding with Nominatim" : "Geokodierung mit Nominatim", - "elevation data from OpenTopoData" : "Höhendaten von OpenTopoData" + "elevation data from OpenTopoData" : "Höhendaten von OpenTopoData", + "\"{title} icon\"" : "\"{title}-Symbol\"" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/en_GB.js b/apps/dashboard/l10n/en_GB.js index f4050daff2a..9c160f2b279 100644 --- a/apps/dashboard/l10n/en_GB.js +++ b/apps/dashboard/l10n/en_GB.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Hello, {name}", "Happy birthday 🥳🤩🎂🎉" : "Happy birthday 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Happy birthday, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} icon\"", "Customize" : "Customise", "Edit widgets" : "Edit widgets", "Get more widgets from the App Store" : "Get more widgets from the App Store", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information.", "Weather data from Met.no" : "Weather data from Met.no", "geocoding with Nominatim" : "geocoding with Nominatim", - "elevation data from OpenTopoData" : "elevation data from OpenTopoData" + "elevation data from OpenTopoData" : "elevation data from OpenTopoData", + "\"{title} icon\"" : "\"{title} icon\"" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/en_GB.json b/apps/dashboard/l10n/en_GB.json index c0d7640f04b..5ca0a16478b 100644 --- a/apps/dashboard/l10n/en_GB.json +++ b/apps/dashboard/l10n/en_GB.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Hello, {name}", "Happy birthday 🥳🤩🎂🎉" : "Happy birthday 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Happy birthday, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} icon\"", "Customize" : "Customise", "Edit widgets" : "Edit widgets", "Get more widgets from the App Store" : "Get more widgets from the App Store", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information.", "Weather data from Met.no" : "Weather data from Met.no", "geocoding with Nominatim" : "geocoding with Nominatim", - "elevation data from OpenTopoData" : "elevation data from OpenTopoData" + "elevation data from OpenTopoData" : "elevation data from OpenTopoData", + "\"{title} icon\"" : "\"{title} icon\"" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/es.js b/apps/dashboard/l10n/es.js index 3c27523d67b..850943a86de 100644 --- a/apps/dashboard/l10n/es.js +++ b/apps/dashboard/l10n/es.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Hola, {name}", "Happy birthday 🥳🤩🎂🎉" : "Feliz cumpleaños 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Feliz cumpleaños, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"icono {title}\"", "Customize" : "Personalizar", "Edit widgets" : "Editar widgets", "Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Por privacidad, los datos meteorológicos son solicitados por tu servidor Nextcloud en tu nombre de tal forma que el servicio no recibe información personal.", "Weather data from Met.no" : "Datos meteorológicos de Met.no", "geocoding with Nominatim" : "geocoding con Nominatim", - "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData" + "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData", + "\"{title} icon\"" : "\"icono {title}\"" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/es.json b/apps/dashboard/l10n/es.json index 5099c13e47a..44bda12c440 100644 --- a/apps/dashboard/l10n/es.json +++ b/apps/dashboard/l10n/es.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Hola, {name}", "Happy birthday 🥳🤩🎂🎉" : "Feliz cumpleaños 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Feliz cumpleaños, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"icono {title}\"", "Customize" : "Personalizar", "Edit widgets" : "Editar widgets", "Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Por privacidad, los datos meteorológicos son solicitados por tu servidor Nextcloud en tu nombre de tal forma que el servicio no recibe información personal.", "Weather data from Met.no" : "Datos meteorológicos de Met.no", "geocoding with Nominatim" : "geocoding con Nominatim", - "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData" + "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData", + "\"{title} icon\"" : "\"icono {title}\"" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/es_EC.js b/apps/dashboard/l10n/es_EC.js index 2bad48d3946..215599661a9 100644 --- a/apps/dashboard/l10n/es_EC.js +++ b/apps/dashboard/l10n/es_EC.js @@ -13,7 +13,6 @@ OC.L10N.register( "Good evening, {name}" : "Buenas noches, {name}", "Hello" : "Hola", "Hello, {name}" : "Hola, {name}", - "\"{title} icon\"" : "\"icono {title}\"", "Customize" : "Personalizar", "Edit widgets" : "Editar widgets", "Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps", @@ -21,6 +20,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Por privacidad, los datos meteorológicos son solicitados por tu servidor Nextcloud en tu nombre de tal forma que el servicio no recibe información personal.", "Weather data from Met.no" : "Datos meteorológicos de Met.no", "geocoding with Nominatim" : "geocoding con Nominatim", - "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData" + "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData", + "\"{title} icon\"" : "\"icono {title}\"" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/es_EC.json b/apps/dashboard/l10n/es_EC.json index aa891ede5fb..1a5496448e0 100644 --- a/apps/dashboard/l10n/es_EC.json +++ b/apps/dashboard/l10n/es_EC.json @@ -11,7 +11,6 @@ "Good evening, {name}" : "Buenas noches, {name}", "Hello" : "Hola", "Hello, {name}" : "Hola, {name}", - "\"{title} icon\"" : "\"icono {title}\"", "Customize" : "Personalizar", "Edit widgets" : "Editar widgets", "Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps", @@ -19,6 +18,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Por privacidad, los datos meteorológicos son solicitados por tu servidor Nextcloud en tu nombre de tal forma que el servicio no recibe información personal.", "Weather data from Met.no" : "Datos meteorológicos de Met.no", "geocoding with Nominatim" : "geocoding con Nominatim", - "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData" + "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData", + "\"{title} icon\"" : "\"icono {title}\"" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/es_MX.js b/apps/dashboard/l10n/es_MX.js index 34da665b988..641db816eaa 100644 --- a/apps/dashboard/l10n/es_MX.js +++ b/apps/dashboard/l10n/es_MX.js @@ -14,7 +14,6 @@ OC.L10N.register( "Good evening, {name}" : "Buenas tardes, {name}", "Hello" : "Hola", "Hello, {name}" : "Hola, {name}", - "\"{title} icon\"" : "\"ícono de {title}\"", "Customize" : "Personalizar", "Edit widgets" : "Editar widgets", "Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps", @@ -22,6 +21,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Por privacidad, los datos meteorológicos son solicitados por tu servidor Nextcloud en tu nombre de tal forma que el servicio no recibe información personal.", "Weather data from Met.no" : "Datos meteorológicos de Met.no", "geocoding with Nominatim" : "geocoding con Nominatim", - "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData" + "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData", + "\"{title} icon\"" : "\"ícono de {title}\"" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/es_MX.json b/apps/dashboard/l10n/es_MX.json index bbe9417cd30..6f86e0dad2c 100644 --- a/apps/dashboard/l10n/es_MX.json +++ b/apps/dashboard/l10n/es_MX.json @@ -12,7 +12,6 @@ "Good evening, {name}" : "Buenas tardes, {name}", "Hello" : "Hola", "Hello, {name}" : "Hola, {name}", - "\"{title} icon\"" : "\"ícono de {title}\"", "Customize" : "Personalizar", "Edit widgets" : "Editar widgets", "Get more widgets from the App Store" : "Conseguir más widgets desde la tienda de Apps", @@ -20,6 +19,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Por privacidad, los datos meteorológicos son solicitados por tu servidor Nextcloud en tu nombre de tal forma que el servicio no recibe información personal.", "Weather data from Met.no" : "Datos meteorológicos de Met.no", "geocoding with Nominatim" : "geocoding con Nominatim", - "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData" + "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData", + "\"{title} icon\"" : "\"ícono de {title}\"" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/et_EE.js b/apps/dashboard/l10n/et_EE.js index 8c313ee08e8..1b5d84af336 100644 --- a/apps/dashboard/l10n/et_EE.js +++ b/apps/dashboard/l10n/et_EE.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Tere, {name}", "Happy birthday 🥳🤩🎂🎉" : "Palju õnne sünnipäevaks 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Palju õnne, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„{title} ikoon“", "Customize" : "Kohanda", "Edit widgets" : "Muuda vidinaid", "Get more widgets from the App Store" : "Hangi rohkem vidinaid Rakenduste Poest", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Sinu privaatsuse huvides küsib su nimel ilmaandmeid Nextcloudi server, nii et ilmateenistus ei saa isiklikku teavet.", "Weather data from Met.no" : "Ilmaandmed Met.no-st", "geocoding with Nominatim" : "geoprogrammeerimine Nominatimiga", - "elevation data from OpenTopoData" : "kõrgusandmed OpenTopoDatast" + "elevation data from OpenTopoData" : "kõrgusandmed OpenTopoDatast", + "\"{title} icon\"" : "„{title} ikoon“" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/et_EE.json b/apps/dashboard/l10n/et_EE.json index 39b5fa632f1..39bd54a58fa 100644 --- a/apps/dashboard/l10n/et_EE.json +++ b/apps/dashboard/l10n/et_EE.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Tere, {name}", "Happy birthday 🥳🤩🎂🎉" : "Palju õnne sünnipäevaks 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Palju õnne, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„{title} ikoon“", "Customize" : "Kohanda", "Edit widgets" : "Muuda vidinaid", "Get more widgets from the App Store" : "Hangi rohkem vidinaid Rakenduste Poest", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Sinu privaatsuse huvides küsib su nimel ilmaandmeid Nextcloudi server, nii et ilmateenistus ei saa isiklikku teavet.", "Weather data from Met.no" : "Ilmaandmed Met.no-st", "geocoding with Nominatim" : "geoprogrammeerimine Nominatimiga", - "elevation data from OpenTopoData" : "kõrgusandmed OpenTopoDatast" + "elevation data from OpenTopoData" : "kõrgusandmed OpenTopoDatast", + "\"{title} icon\"" : "„{title} ikoon“" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/eu.js b/apps/dashboard/l10n/eu.js index eccb212ea76..7a911ec279f 100644 --- a/apps/dashboard/l10n/eu.js +++ b/apps/dashboard/l10n/eu.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Kaixo, {name}", "Happy birthday 🥳🤩🎂🎉" : "Zorionak 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Zorionak, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} ikonoa\"", "Customize" : "Pertsonalizatu", "Edit widgets" : "Editatu trepetak", "Get more widgets from the App Store" : "Lortu trepeta (widget) gehiago Aplikazioen Dendatik", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zure pribatutasunaren mesedetan, eguraldiaren datuak Nextcloud zerbitzariak eskatzen ditu zure izenean, eguraldi zerbitzuak informazio pertsonalik ez jasotzeko.", "Weather data from Met.no" : "Met.no-ko eguraldiaren datuak", "geocoding with Nominatim" : "geokodetzea Nominatim-ekin", - "elevation data from OpenTopoData" : "altitude datuak OpenTopoData-tik" + "elevation data from OpenTopoData" : "altitude datuak OpenTopoData-tik", + "\"{title} icon\"" : "\"{title} ikonoa\"" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/eu.json b/apps/dashboard/l10n/eu.json index 7d07259c94b..9d3c3d08214 100644 --- a/apps/dashboard/l10n/eu.json +++ b/apps/dashboard/l10n/eu.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Kaixo, {name}", "Happy birthday 🥳🤩🎂🎉" : "Zorionak 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Zorionak, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} ikonoa\"", "Customize" : "Pertsonalizatu", "Edit widgets" : "Editatu trepetak", "Get more widgets from the App Store" : "Lortu trepeta (widget) gehiago Aplikazioen Dendatik", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zure pribatutasunaren mesedetan, eguraldiaren datuak Nextcloud zerbitzariak eskatzen ditu zure izenean, eguraldi zerbitzuak informazio pertsonalik ez jasotzeko.", "Weather data from Met.no" : "Met.no-ko eguraldiaren datuak", "geocoding with Nominatim" : "geokodetzea Nominatim-ekin", - "elevation data from OpenTopoData" : "altitude datuak OpenTopoData-tik" + "elevation data from OpenTopoData" : "altitude datuak OpenTopoData-tik", + "\"{title} icon\"" : "\"{title} ikonoa\"" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/fa.js b/apps/dashboard/l10n/fa.js index 18f97b30576..e184f76c85c 100644 --- a/apps/dashboard/l10n/fa.js +++ b/apps/dashboard/l10n/fa.js @@ -14,13 +14,16 @@ OC.L10N.register( "Good evening, {name}" : " عصر بهخیر {name}", "Hello" : "درود", "Hello, {name}" : "درود {name}", - "\"{title} icon\"" : "«نقشک {title}»", + "Happy birthday 🥳🤩🎂🎉" : "تولدت مبارک 🥳🤩🎂🎉", + "Happy birthday, {name} 🥳🤩🎂🎉" : "تولدت مبارک، {name} 🥳🤩🎂🎉", "Customize" : "سفارشیسازی", "Edit widgets" : "ویرایش ابزارکها", - "Get more widgets from the App Store" : "گرفتن ابزارکهای بیشتر از فروشکاه کاره", + "Get more widgets from the App Store" : "گرفتن ابزارکهای بیشتر از فروشگاه کاره", "Weather service" : "خدمت هواشناسی", "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "برای محرمانگیتان، دادههای آب و هوا از طرف کارساز نکستکلودتان درخواست میشود تا خدمت آب و هوا هیچ اطّلاعات شخصیای دریافت نکند.", "Weather data from Met.no" : "اطلاعات هواشناسی از Met.no", - "elevation data from OpenTopoData" : "دادههای ارتفاع از OpenTopoData" + "geocoding with Nominatim" : "کدگذاری جغرافیایی با Nominatim", + "elevation data from OpenTopoData" : "دادههای ارتفاع از OpenTopoData", + "\"{title} icon\"" : "«نقشک {title}»" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/dashboard/l10n/fa.json b/apps/dashboard/l10n/fa.json index 512ebbe0a1d..6120f6657c4 100644 --- a/apps/dashboard/l10n/fa.json +++ b/apps/dashboard/l10n/fa.json @@ -12,13 +12,16 @@ "Good evening, {name}" : " عصر بهخیر {name}", "Hello" : "درود", "Hello, {name}" : "درود {name}", - "\"{title} icon\"" : "«نقشک {title}»", + "Happy birthday 🥳🤩🎂🎉" : "تولدت مبارک 🥳🤩🎂🎉", + "Happy birthday, {name} 🥳🤩🎂🎉" : "تولدت مبارک، {name} 🥳🤩🎂🎉", "Customize" : "سفارشیسازی", "Edit widgets" : "ویرایش ابزارکها", - "Get more widgets from the App Store" : "گرفتن ابزارکهای بیشتر از فروشکاه کاره", + "Get more widgets from the App Store" : "گرفتن ابزارکهای بیشتر از فروشگاه کاره", "Weather service" : "خدمت هواشناسی", "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "برای محرمانگیتان، دادههای آب و هوا از طرف کارساز نکستکلودتان درخواست میشود تا خدمت آب و هوا هیچ اطّلاعات شخصیای دریافت نکند.", "Weather data from Met.no" : "اطلاعات هواشناسی از Met.no", - "elevation data from OpenTopoData" : "دادههای ارتفاع از OpenTopoData" + "geocoding with Nominatim" : "کدگذاری جغرافیایی با Nominatim", + "elevation data from OpenTopoData" : "دادههای ارتفاع از OpenTopoData", + "\"{title} icon\"" : "«نقشک {title}»" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/fr.js b/apps/dashboard/l10n/fr.js index 7f3470a59f0..3a1afaf8326 100644 --- a/apps/dashboard/l10n/fr.js +++ b/apps/dashboard/l10n/fr.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Bonjour {name}", "Happy birthday 🥳🤩🎂🎉" : "Joyeux anniversaire ! 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Joyeux anniversaire, {name}! 🥳🤩🎂🎉", - "\"{title} icon\"" : "« Icône {title} »", "Customize" : "Personnaliser", "Edit widgets" : "Modifier les widgets", "Get more widgets from the App Store" : "Obtenez plus de widgets depuis le magasin d’applications", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Afin de protéger votre vie privée, les données météorologiques sont demandées par votre serveur Nextcloud à votre place afin que le service météo ne reçoive aucune information personnelle.", "Weather data from Met.no" : "Données météo fournies par Met.no", "geocoding with Nominatim" : "Géocodage avec Nominatim", - "elevation data from OpenTopoData" : "Données d’altitude provenant d’OpenTopoData" + "elevation data from OpenTopoData" : "Données d’altitude provenant d’OpenTopoData", + "\"{title} icon\"" : "« Icône {title} »" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/fr.json b/apps/dashboard/l10n/fr.json index 9f4fd034b6e..8ca7aff83f4 100644 --- a/apps/dashboard/l10n/fr.json +++ b/apps/dashboard/l10n/fr.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Bonjour {name}", "Happy birthday 🥳🤩🎂🎉" : "Joyeux anniversaire ! 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Joyeux anniversaire, {name}! 🥳🤩🎂🎉", - "\"{title} icon\"" : "« Icône {title} »", "Customize" : "Personnaliser", "Edit widgets" : "Modifier les widgets", "Get more widgets from the App Store" : "Obtenez plus de widgets depuis le magasin d’applications", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Afin de protéger votre vie privée, les données météorologiques sont demandées par votre serveur Nextcloud à votre place afin que le service météo ne reçoive aucune information personnelle.", "Weather data from Met.no" : "Données météo fournies par Met.no", "geocoding with Nominatim" : "Géocodage avec Nominatim", - "elevation data from OpenTopoData" : "Données d’altitude provenant d’OpenTopoData" + "elevation data from OpenTopoData" : "Données d’altitude provenant d’OpenTopoData", + "\"{title} icon\"" : "« Icône {title} »" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ga.js b/apps/dashboard/l10n/ga.js index 2ad756df2c0..9fbee59ddd1 100644 --- a/apps/dashboard/l10n/ga.js +++ b/apps/dashboard/l10n/ga.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Dia dhuit, {name}", "Happy birthday 🥳🤩🎂🎉" : "Lá breithe shona duit 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Lá breithe shona duit, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} deilbhín\"", "Customize" : "Saincheap", "Edit widgets" : "Cuir giuirléidí in eagar", "Get more widgets from the App Store" : "Faigh tuilleadh giuirléidí ón Siopa Aip", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Ar mhaithe le do phríobháideachas, iarrann do fhreastalaí Nextcloud na sonraí aimsire ar do shon agus mar sin ní fhaigheann an tseirbhís aimsire aon fhaisnéis phearsanta.", "Weather data from Met.no" : "Sonraí aimsire ó Met.no", "geocoding with Nominatim" : "geochódú le Nominatim", - "elevation data from OpenTopoData" : "sonraí ardaithe ó OpenTopoData" + "elevation data from OpenTopoData" : "sonraí ardaithe ó OpenTopoData", + "\"{title} icon\"" : "\"{title} deilbhín\"" }, "nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"); diff --git a/apps/dashboard/l10n/ga.json b/apps/dashboard/l10n/ga.json index afc8137bab7..69e239a1d01 100644 --- a/apps/dashboard/l10n/ga.json +++ b/apps/dashboard/l10n/ga.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Dia dhuit, {name}", "Happy birthday 🥳🤩🎂🎉" : "Lá breithe shona duit 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Lá breithe shona duit, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} deilbhín\"", "Customize" : "Saincheap", "Edit widgets" : "Cuir giuirléidí in eagar", "Get more widgets from the App Store" : "Faigh tuilleadh giuirléidí ón Siopa Aip", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Ar mhaithe le do phríobháideachas, iarrann do fhreastalaí Nextcloud na sonraí aimsire ar do shon agus mar sin ní fhaigheann an tseirbhís aimsire aon fhaisnéis phearsanta.", "Weather data from Met.no" : "Sonraí aimsire ó Met.no", "geocoding with Nominatim" : "geochódú le Nominatim", - "elevation data from OpenTopoData" : "sonraí ardaithe ó OpenTopoData" + "elevation data from OpenTopoData" : "sonraí ardaithe ó OpenTopoData", + "\"{title} icon\"" : "\"{title} deilbhín\"" },"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/gl.js b/apps/dashboard/l10n/gl.js index 2f81e867b15..c332320e538 100644 --- a/apps/dashboard/l10n/gl.js +++ b/apps/dashboard/l10n/gl.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Ola, {name}", "Happy birthday 🥳🤩🎂🎉" : "Feliz aniversario 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Feliz aniversario, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "«icona {title}»", "Customize" : "Personalizar", "Edit widgets" : "Editar trebellos", "Get more widgets from the App Store" : "Obter máis trebellos na tenda de aplicacións", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor de Nextcloud solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.", "Weather data from Met.no" : "Datos meteorolóxicos de Met.no", "geocoding with Nominatim" : "xeocodificación con Nominatim", - "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData" + "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData", + "\"{title} icon\"" : "«icona {title}»" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/gl.json b/apps/dashboard/l10n/gl.json index 9793d2e25a1..9a3d57da111 100644 --- a/apps/dashboard/l10n/gl.json +++ b/apps/dashboard/l10n/gl.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Ola, {name}", "Happy birthday 🥳🤩🎂🎉" : "Feliz aniversario 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Feliz aniversario, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "«icona {title}»", "Customize" : "Personalizar", "Edit widgets" : "Editar trebellos", "Get more widgets from the App Store" : "Obter máis trebellos na tenda de aplicacións", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para a súa privacidade, o servidor de Nextcloud solicita os datos meteorolóxicos no seu nome para que o servizo meteorolóxico non reciba información persoal.", "Weather data from Met.no" : "Datos meteorolóxicos de Met.no", "geocoding with Nominatim" : "xeocodificación con Nominatim", - "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData" + "elevation data from OpenTopoData" : "datos de elevación de OpenTopoData", + "\"{title} icon\"" : "«icona {title}»" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/hu.js b/apps/dashboard/l10n/hu.js index 615abab2904..b4564e6a2ce 100644 --- a/apps/dashboard/l10n/hu.js +++ b/apps/dashboard/l10n/hu.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Üdv {name}!", "Happy birthday 🥳🤩🎂🎉" : "Boldog születésnapot 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Boldog születésnapot, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„{title} ikon”", "Customize" : "Testreszabás", "Edit widgets" : "Modulok szerkesztése", "Get more widgets from the App Store" : "További modulok letöltése az alkalmazástárból.", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Az adatvédelem érdekében az információt a Nextcloud kiszolgáló kéri le az Ön nevében, így az Ön személyes adatai nem kerülnek az időjárási adatok szolgáltatójához.", "Weather data from Met.no" : "Időjárási adatok a Met.no-tól", "geocoding with Nominatim" : "geokódolás a Nominatimmal", - "elevation data from OpenTopoData" : "magassági adatok az OpenTopoDatától" + "elevation data from OpenTopoData" : "magassági adatok az OpenTopoDatától", + "\"{title} icon\"" : "„{title} ikon”" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/hu.json b/apps/dashboard/l10n/hu.json index 29eb14f730d..36b2b3de0de 100644 --- a/apps/dashboard/l10n/hu.json +++ b/apps/dashboard/l10n/hu.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Üdv {name}!", "Happy birthday 🥳🤩🎂🎉" : "Boldog születésnapot 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Boldog születésnapot, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„{title} ikon”", "Customize" : "Testreszabás", "Edit widgets" : "Modulok szerkesztése", "Get more widgets from the App Store" : "További modulok letöltése az alkalmazástárból.", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Az adatvédelem érdekében az információt a Nextcloud kiszolgáló kéri le az Ön nevében, így az Ön személyes adatai nem kerülnek az időjárási adatok szolgáltatójához.", "Weather data from Met.no" : "Időjárási adatok a Met.no-tól", "geocoding with Nominatim" : "geokódolás a Nominatimmal", - "elevation data from OpenTopoData" : "magassági adatok az OpenTopoDatától" + "elevation data from OpenTopoData" : "magassági adatok az OpenTopoDatától", + "\"{title} icon\"" : "„{title} ikon”" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/is.js b/apps/dashboard/l10n/is.js index 2d9e5e89ca5..16e91b972a2 100644 --- a/apps/dashboard/l10n/is.js +++ b/apps/dashboard/l10n/is.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Halló, {name}", "Happy birthday 🥳🤩🎂🎉" : "Til hamingju með afmælið 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Til hamingju með afmælið {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} táknmynd\"", "Customize" : "Sérsníða", "Edit widgets" : "Breyta viðmótshlutum", "Get more widgets from the App Store" : "Náðu í fleiri viðmótshluta í forritasafninu", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Til að vernda friðhelgi þína, eru veðurgögn sótt af Nextcloud-þjóninum fyrir þína hönd, þannig að veðurþjónustan fær engin persónuleg gögn.", "Weather data from Met.no" : "Veðurgögn frá Met.no", "geocoding with Nominatim" : "staðsetningarkóðun með Nominatim", - "elevation data from OpenTopoData" : "hæðargögn frá OpenTopoData" + "elevation data from OpenTopoData" : "hæðargögn frá OpenTopoData", + "\"{title} icon\"" : "\"{title} táknmynd\"" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/dashboard/l10n/is.json b/apps/dashboard/l10n/is.json index c943afc1f47..1e5c30add7d 100644 --- a/apps/dashboard/l10n/is.json +++ b/apps/dashboard/l10n/is.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Halló, {name}", "Happy birthday 🥳🤩🎂🎉" : "Til hamingju með afmælið 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Til hamingju með afmælið {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} táknmynd\"", "Customize" : "Sérsníða", "Edit widgets" : "Breyta viðmótshlutum", "Get more widgets from the App Store" : "Náðu í fleiri viðmótshluta í forritasafninu", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Til að vernda friðhelgi þína, eru veðurgögn sótt af Nextcloud-þjóninum fyrir þína hönd, þannig að veðurþjónustan fær engin persónuleg gögn.", "Weather data from Met.no" : "Veðurgögn frá Met.no", "geocoding with Nominatim" : "staðsetningarkóðun með Nominatim", - "elevation data from OpenTopoData" : "hæðargögn frá OpenTopoData" + "elevation data from OpenTopoData" : "hæðargögn frá OpenTopoData", + "\"{title} icon\"" : "\"{title} táknmynd\"" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/it.js b/apps/dashboard/l10n/it.js index f8fc5449f76..c77e8a25ec5 100644 --- a/apps/dashboard/l10n/it.js +++ b/apps/dashboard/l10n/it.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Ciao {name}", "Happy birthday 🥳🤩🎂🎉" : "Buon compleanno 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Buon compleanno, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"Icona {title}\"", "Customize" : "Personalizza", "Edit widgets" : "Modifica widget", "Get more widgets from the App Store" : "Ottieni altri widget dal negozio delle applicazioni", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Per la tua riservatezza, i dati meteorologici sono richiesti dal tuo server Nextcloud per tuo conto, per cui il servizio meteo non riceve informazioni personali.", "Weather data from Met.no" : "Dati meteo da Met.no", "geocoding with Nominatim" : "geocodifica conh Nominatim", - "elevation data from OpenTopoData" : "dati di elevazione da OpenTopoData" + "elevation data from OpenTopoData" : "dati di elevazione da OpenTopoData", + "\"{title} icon\"" : "\"Icona {title}\"" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/it.json b/apps/dashboard/l10n/it.json index 13fb2b32604..ff05385033a 100644 --- a/apps/dashboard/l10n/it.json +++ b/apps/dashboard/l10n/it.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Ciao {name}", "Happy birthday 🥳🤩🎂🎉" : "Buon compleanno 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Buon compleanno, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"Icona {title}\"", "Customize" : "Personalizza", "Edit widgets" : "Modifica widget", "Get more widgets from the App Store" : "Ottieni altri widget dal negozio delle applicazioni", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Per la tua riservatezza, i dati meteorologici sono richiesti dal tuo server Nextcloud per tuo conto, per cui il servizio meteo non riceve informazioni personali.", "Weather data from Met.no" : "Dati meteo da Met.no", "geocoding with Nominatim" : "geocodifica conh Nominatim", - "elevation data from OpenTopoData" : "dati di elevazione da OpenTopoData" + "elevation data from OpenTopoData" : "dati di elevazione da OpenTopoData", + "\"{title} icon\"" : "\"Icona {title}\"" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ja.js b/apps/dashboard/l10n/ja.js index 97410539843..2ed45a7ac08 100644 --- a/apps/dashboard/l10n/ja.js +++ b/apps/dashboard/l10n/ja.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "こんにちは、{name} さん", "Happy birthday 🥳🤩🎂🎉" : "お誕生日おめでとう 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "お誕生日おめでとう、{name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} アイコン\"", "Customize" : "カスタマイズ", "Edit widgets" : "ウィジェットを編集", "Get more widgets from the App Store" : "アプリストアから他のガジェットを入手", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "あなたのプライバシーを保護するため、あなたに変わって Nextcloud サーバーが気象データをウェザーサービスに要求します。そのため、ウェザーサービスはあなたの個人情報を受け取ることはありません。", "Weather data from Met.no" : "気象データ提供元は Met.no", "geocoding with Nominatim" : "Nominatim でジオコーディング", - "elevation data from OpenTopoData" : "標高データ提供元は OpenTopoData です" + "elevation data from OpenTopoData" : "標高データ提供元は OpenTopoData です", + "\"{title} icon\"" : "\"{title} アイコン\"" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/ja.json b/apps/dashboard/l10n/ja.json index ff121e729e4..eb5f9a75715 100644 --- a/apps/dashboard/l10n/ja.json +++ b/apps/dashboard/l10n/ja.json @@ -14,7 +14,6 @@ "Hello, {name}" : "こんにちは、{name} さん", "Happy birthday 🥳🤩🎂🎉" : "お誕生日おめでとう 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "お誕生日おめでとう、{name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} アイコン\"", "Customize" : "カスタマイズ", "Edit widgets" : "ウィジェットを編集", "Get more widgets from the App Store" : "アプリストアから他のガジェットを入手", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "あなたのプライバシーを保護するため、あなたに変わって Nextcloud サーバーが気象データをウェザーサービスに要求します。そのため、ウェザーサービスはあなたの個人情報を受け取ることはありません。", "Weather data from Met.no" : "気象データ提供元は Met.no", "geocoding with Nominatim" : "Nominatim でジオコーディング", - "elevation data from OpenTopoData" : "標高データ提供元は OpenTopoData です" + "elevation data from OpenTopoData" : "標高データ提供元は OpenTopoData です", + "\"{title} icon\"" : "\"{title} アイコン\"" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/lt_LT.js b/apps/dashboard/l10n/lt_LT.js index 40181a59310..04c14b11924 100644 --- a/apps/dashboard/l10n/lt_LT.js +++ b/apps/dashboard/l10n/lt_LT.js @@ -15,7 +15,6 @@ OC.L10N.register( "Hello, {name}" : "Sveiki, {name},", "Happy birthday 🥳🤩🎂🎉" : "Su gimtadieniu 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Su gimtadieniu, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„{title} piktograma“", "Customize" : "Tinkinti", "Edit widgets" : "Taisyti valdiklius", "Get more widgets from the App Store" : "Parsisiųsti įskiepių iš App Store", @@ -23,6 +22,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Dėl jūsų privatumo, orų duomenys yra jūsų vardu užklausiami jūsų Nextcloud serverio, todėl orų tarnyba negauna jokios asmeninės informacijos.", "Weather data from Met.no" : "Orų duomenys iš Met.no", "geocoding with Nominatim" : "geografinis kodavimas naudojant Nominatim", - "elevation data from OpenTopoData" : "aukščio duomenys iš OpenTopoData" + "elevation data from OpenTopoData" : "aukščio duomenys iš OpenTopoData", + "\"{title} icon\"" : "„{title} piktograma“" }, "nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/dashboard/l10n/lt_LT.json b/apps/dashboard/l10n/lt_LT.json index c2df9016135..d3711e0f743 100644 --- a/apps/dashboard/l10n/lt_LT.json +++ b/apps/dashboard/l10n/lt_LT.json @@ -13,7 +13,6 @@ "Hello, {name}" : "Sveiki, {name},", "Happy birthday 🥳🤩🎂🎉" : "Su gimtadieniu 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Su gimtadieniu, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„{title} piktograma“", "Customize" : "Tinkinti", "Edit widgets" : "Taisyti valdiklius", "Get more widgets from the App Store" : "Parsisiųsti įskiepių iš App Store", @@ -21,6 +20,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Dėl jūsų privatumo, orų duomenys yra jūsų vardu užklausiami jūsų Nextcloud serverio, todėl orų tarnyba negauna jokios asmeninės informacijos.", "Weather data from Met.no" : "Orų duomenys iš Met.no", "geocoding with Nominatim" : "geografinis kodavimas naudojant Nominatim", - "elevation data from OpenTopoData" : "aukščio duomenys iš OpenTopoData" + "elevation data from OpenTopoData" : "aukščio duomenys iš OpenTopoData", + "\"{title} icon\"" : "„{title} piktograma“" },"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/mk.js b/apps/dashboard/l10n/mk.js index 650179098bd..5c985bcdcc8 100644 --- a/apps/dashboard/l10n/mk.js +++ b/apps/dashboard/l10n/mk.js @@ -13,7 +13,6 @@ OC.L10N.register( "Good evening, {name}" : "Добровечер, {name}", "Hello" : "Здраво", "Hello, {name}" : "Здраво, {name}", - "\"{title} icon\"" : "\"{title} икона\"", "Customize" : "Прилагоди", "Edit widgets" : "Уреди графички контроли", "Get more widgets from the App Store" : "Преземи повеќе графички контроли од продавницата со апликации", @@ -21,6 +20,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "За ваша приватност, податоците за времето ги бара вашиот сервер во ваше име, така што метеоролошката служба не добива лични информации.", "Weather data from Met.no" : "Податоци за временето од Met.no", "geocoding with Nominatim" : "Геокодирање со Nominatim", - "elevation data from OpenTopoData" : "Податоци за височина од OpenTopoData" + "elevation data from OpenTopoData" : "Податоци за височина од OpenTopoData", + "\"{title} icon\"" : "\"{title} икона\"" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/dashboard/l10n/mk.json b/apps/dashboard/l10n/mk.json index 163c188073e..f225e912978 100644 --- a/apps/dashboard/l10n/mk.json +++ b/apps/dashboard/l10n/mk.json @@ -11,7 +11,6 @@ "Good evening, {name}" : "Добровечер, {name}", "Hello" : "Здраво", "Hello, {name}" : "Здраво, {name}", - "\"{title} icon\"" : "\"{title} икона\"", "Customize" : "Прилагоди", "Edit widgets" : "Уреди графички контроли", "Get more widgets from the App Store" : "Преземи повеќе графички контроли од продавницата со апликации", @@ -19,6 +18,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "За ваша приватност, податоците за времето ги бара вашиот сервер во ваше име, така што метеоролошката служба не добива лични информации.", "Weather data from Met.no" : "Податоци за временето од Met.no", "geocoding with Nominatim" : "Геокодирање со Nominatim", - "elevation data from OpenTopoData" : "Податоци за височина од OpenTopoData" + "elevation data from OpenTopoData" : "Податоци за височина од OpenTopoData", + "\"{title} icon\"" : "\"{title} икона\"" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/nb.js b/apps/dashboard/l10n/nb.js index 5bc7a9ba998..7091be8f0ee 100644 --- a/apps/dashboard/l10n/nb.js +++ b/apps/dashboard/l10n/nb.js @@ -14,7 +14,6 @@ OC.L10N.register( "Good evening, {name}" : "God kveld, {name}", "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", - "\"{title} icon\"" : "\"{title} ikon\"", "Customize" : "Tilpass", "Edit widgets" : "Rediger widgets", "Get more widgets from the App Store" : "Få flere widgets fra app-butikken", @@ -22,6 +21,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Av hensyn til personvernet ditt blir værdataene bedt om av Nextcloud-serveren din på dine vegne, slik at værtjenesten ikke mottar personlig informasjon.", "Weather data from Met.no" : "Værmelding fra Met.no", "geocoding with Nominatim" : "geokoding med Nominatim", - "elevation data from OpenTopoData" : "høydedata fra OpenTopoData" + "elevation data from OpenTopoData" : "høydedata fra OpenTopoData", + "\"{title} icon\"" : "\"{title} ikon\"" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/nb.json b/apps/dashboard/l10n/nb.json index fccc6d0686a..95f68c74a9c 100644 --- a/apps/dashboard/l10n/nb.json +++ b/apps/dashboard/l10n/nb.json @@ -12,7 +12,6 @@ "Good evening, {name}" : "God kveld, {name}", "Hello" : "Hallo", "Hello, {name}" : "Hallo, {name}", - "\"{title} icon\"" : "\"{title} ikon\"", "Customize" : "Tilpass", "Edit widgets" : "Rediger widgets", "Get more widgets from the App Store" : "Få flere widgets fra app-butikken", @@ -20,6 +19,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Av hensyn til personvernet ditt blir værdataene bedt om av Nextcloud-serveren din på dine vegne, slik at værtjenesten ikke mottar personlig informasjon.", "Weather data from Met.no" : "Værmelding fra Met.no", "geocoding with Nominatim" : "geokoding med Nominatim", - "elevation data from OpenTopoData" : "høydedata fra OpenTopoData" + "elevation data from OpenTopoData" : "høydedata fra OpenTopoData", + "\"{title} icon\"" : "\"{title} ikon\"" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/pl.js b/apps/dashboard/l10n/pl.js index 34c60ac18ba..8c0dd99508f 100644 --- a/apps/dashboard/l10n/pl.js +++ b/apps/dashboard/l10n/pl.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Witaj {name}", "Happy birthday 🥳🤩🎂🎉" : "Najlepsze życzenia urodzinowe 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Najlepsze życzenia urodzinowe, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"ikona {title}\"", "Customize" : "Dostosuj", "Edit widgets" : "Edytuj widżety", "Get more widgets from the App Store" : "Pobierz więcej widżetów z Nextcloud App Store", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Ze względu na Twoją prywatność dane pogodowe są pobierane przez serwer Nextcloud w Twoim imieniu. Usługa pogodowa nie otrzymuje żadnych danych osobowych.", "Weather data from Met.no" : "Dane pogodowe z Met.no", "geocoding with Nominatim" : "geokodowanie z Nominatim", - "elevation data from OpenTopoData" : "dane wysokościowe z OpenTopoData" + "elevation data from OpenTopoData" : "dane wysokościowe z OpenTopoData", + "\"{title} icon\"" : "\"ikona {title}\"" }, "nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"); diff --git a/apps/dashboard/l10n/pl.json b/apps/dashboard/l10n/pl.json index 3e80ee3ca3d..cdd254abf25 100644 --- a/apps/dashboard/l10n/pl.json +++ b/apps/dashboard/l10n/pl.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Witaj {name}", "Happy birthday 🥳🤩🎂🎉" : "Najlepsze życzenia urodzinowe 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Najlepsze życzenia urodzinowe, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"ikona {title}\"", "Customize" : "Dostosuj", "Edit widgets" : "Edytuj widżety", "Get more widgets from the App Store" : "Pobierz więcej widżetów z Nextcloud App Store", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Ze względu na Twoją prywatność dane pogodowe są pobierane przez serwer Nextcloud w Twoim imieniu. Usługa pogodowa nie otrzymuje żadnych danych osobowych.", "Weather data from Met.no" : "Dane pogodowe z Met.no", "geocoding with Nominatim" : "geokodowanie z Nominatim", - "elevation data from OpenTopoData" : "dane wysokościowe z OpenTopoData" + "elevation data from OpenTopoData" : "dane wysokościowe z OpenTopoData", + "\"{title} icon\"" : "\"ikona {title}\"" },"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/pt_BR.js b/apps/dashboard/l10n/pt_BR.js index 0843b517b11..dbfe53359f7 100644 --- a/apps/dashboard/l10n/pt_BR.js +++ b/apps/dashboard/l10n/pt_BR.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Olá, {name}", "Happy birthday 🥳🤩🎂🎉" : "Feliz Aniversário 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Feliz Aniversário, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"ícone de {title} \"", "Customize" : "Personalizar", "Edit widgets" : "Editar widgets", "Get more widgets from the App Store" : "Obtenha mais widgets na Loja de Aplicativos", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para sua privacidade, as informações de Tempo são solicitadas pelo servidor Nextcloud de forma que o serviço de Tempo não receba suas informações pessoais.", "Weather data from Met.no" : "Dados de Tempo do Met.no", "geocoding with Nominatim" : "geocodificado com Nominatim", - "elevation data from OpenTopoData" : "dados topográficos de OpenTopoData" + "elevation data from OpenTopoData" : "dados topográficos de OpenTopoData", + "\"{title} icon\"" : "\"ícone de {title} \"" }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/dashboard/l10n/pt_BR.json b/apps/dashboard/l10n/pt_BR.json index 4750d3b61a5..a9715dc07f2 100644 --- a/apps/dashboard/l10n/pt_BR.json +++ b/apps/dashboard/l10n/pt_BR.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Olá, {name}", "Happy birthday 🥳🤩🎂🎉" : "Feliz Aniversário 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Feliz Aniversário, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"ícone de {title} \"", "Customize" : "Personalizar", "Edit widgets" : "Editar widgets", "Get more widgets from the App Store" : "Obtenha mais widgets na Loja de Aplicativos", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Para sua privacidade, as informações de Tempo são solicitadas pelo servidor Nextcloud de forma que o serviço de Tempo não receba suas informações pessoais.", "Weather data from Met.no" : "Dados de Tempo do Met.no", "geocoding with Nominatim" : "geocodificado com Nominatim", - "elevation data from OpenTopoData" : "dados topográficos de OpenTopoData" + "elevation data from OpenTopoData" : "dados topográficos de OpenTopoData", + "\"{title} icon\"" : "\"ícone de {title} \"" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ru.js b/apps/dashboard/l10n/ru.js index 16c595ac1cf..724f9c70712 100644 --- a/apps/dashboard/l10n/ru.js +++ b/apps/dashboard/l10n/ru.js @@ -14,7 +14,6 @@ OC.L10N.register( "Good evening, {name}" : "Добрый вечер, {name}", "Hello" : "Здравствуйте", "Hello, {name}" : "Здравствуйте, {name}!", - "\"{title} icon\"" : "\"{title} иконка\"", "Customize" : "Настроить", "Edit widgets" : "Редактировать виджеты", "Get more widgets from the App Store" : "Загрузить виджеты из магазина приложений", @@ -22,6 +21,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "В целях вашей конфиденциальности данные о погоде запрашиваются вашим сервером Nextcloud от вашего имени, поэтому служба погоды не получает никакой личной информации.", "Weather data from Met.no" : "Погода от Met.no", "geocoding with Nominatim" : "геокодирование с Nominatim", - "elevation data from OpenTopoData" : "данные о высоте из OpenTopoData" + "elevation data from OpenTopoData" : "данные о высоте из OpenTopoData", + "\"{title} icon\"" : "\"{title} иконка\"" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/dashboard/l10n/ru.json b/apps/dashboard/l10n/ru.json index 14dac286388..f2949da650b 100644 --- a/apps/dashboard/l10n/ru.json +++ b/apps/dashboard/l10n/ru.json @@ -12,7 +12,6 @@ "Good evening, {name}" : "Добрый вечер, {name}", "Hello" : "Здравствуйте", "Hello, {name}" : "Здравствуйте, {name}!", - "\"{title} icon\"" : "\"{title} иконка\"", "Customize" : "Настроить", "Edit widgets" : "Редактировать виджеты", "Get more widgets from the App Store" : "Загрузить виджеты из магазина приложений", @@ -20,6 +19,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "В целях вашей конфиденциальности данные о погоде запрашиваются вашим сервером Nextcloud от вашего имени, поэтому служба погоды не получает никакой личной информации.", "Weather data from Met.no" : "Погода от Met.no", "geocoding with Nominatim" : "геокодирование с Nominatim", - "elevation data from OpenTopoData" : "данные о высоте из OpenTopoData" + "elevation data from OpenTopoData" : "данные о высоте из OpenTopoData", + "\"{title} icon\"" : "\"{title} иконка\"" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/sk.js b/apps/dashboard/l10n/sk.js index 5a37ecbc0a5..d254adbb5b5 100644 --- a/apps/dashboard/l10n/sk.js +++ b/apps/dashboard/l10n/sk.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Ahoj, {name}", "Happy birthday 🥳🤩🎂🎉" : "Všetko najlepšie k narodeninám 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Všetko najlepšie k narodeninám, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} ikona\"", "Customize" : "Prispôsobiť", "Edit widgets" : "Upraviť miniaplikácie", "Get more widgets from the App Store" : "Získať viac miniaplikácií v Obchode s aplikáciami", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "V záujme vášho súkromia údaje o počasí vyžaduje váš server Nextcloud vo vašom mene, aby meteorologická služba nedostávala žiadne osobné informácie.", "Weather data from Met.no" : "Dáta počasia z Met.no", "geocoding with Nominatim" : "geokódovanie pomocou Nominatim", - "elevation data from OpenTopoData" : "dáta o nadmorskej výške z OpenTopoData" + "elevation data from OpenTopoData" : "dáta o nadmorskej výške z OpenTopoData", + "\"{title} icon\"" : "\"{title} ikona\"" }, "nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/dashboard/l10n/sk.json b/apps/dashboard/l10n/sk.json index 615529d33e4..0193916f3e3 100644 --- a/apps/dashboard/l10n/sk.json +++ b/apps/dashboard/l10n/sk.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Ahoj, {name}", "Happy birthday 🥳🤩🎂🎉" : "Všetko najlepšie k narodeninám 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Všetko najlepšie k narodeninám, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} ikona\"", "Customize" : "Prispôsobiť", "Edit widgets" : "Upraviť miniaplikácie", "Get more widgets from the App Store" : "Získať viac miniaplikácií v Obchode s aplikáciami", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "V záujme vášho súkromia údaje o počasí vyžaduje váš server Nextcloud vo vašom mene, aby meteorologická služba nedostávala žiadne osobné informácie.", "Weather data from Met.no" : "Dáta počasia z Met.no", "geocoding with Nominatim" : "geokódovanie pomocou Nominatim", - "elevation data from OpenTopoData" : "dáta o nadmorskej výške z OpenTopoData" + "elevation data from OpenTopoData" : "dáta o nadmorskej výške z OpenTopoData", + "\"{title} icon\"" : "\"{title} ikona\"" },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/sl.js b/apps/dashboard/l10n/sl.js index e198ee9d615..9422670f2ed 100644 --- a/apps/dashboard/l10n/sl.js +++ b/apps/dashboard/l10n/sl.js @@ -14,7 +14,6 @@ OC.L10N.register( "Good evening, {name}" : "Dober večer, {name}", "Hello" : "Pozdravljeni", "Hello, {name}" : "Pozdravljeni, {name}", - "\"{title} icon\"" : "»Ikona {title}«", "Customize" : "Prilagodi", "Edit widgets" : "Izbor gradnikov", "Get more widgets from the App Store" : "Pridobi več gradnikov s spletišča App Store", @@ -22,6 +21,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Za večjo zasebnost so podatki vremena pridobljeni prek strežnika Nextcloud, zato tretje osebe ne pridobijo nobenega vašega osebnega podatka.", "Weather data from Met.no" : "Podatke vremena omogoča Met.no", "geocoding with Nominatim" : "geokodiranje Nominatim", - "elevation data from OpenTopoData" : "podatke nadmorske višine OpenTopoData" + "elevation data from OpenTopoData" : "podatke nadmorske višine OpenTopoData", + "\"{title} icon\"" : "»Ikona {title}«" }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/dashboard/l10n/sl.json b/apps/dashboard/l10n/sl.json index bb34855f945..7d3de876695 100644 --- a/apps/dashboard/l10n/sl.json +++ b/apps/dashboard/l10n/sl.json @@ -12,7 +12,6 @@ "Good evening, {name}" : "Dober večer, {name}", "Hello" : "Pozdravljeni", "Hello, {name}" : "Pozdravljeni, {name}", - "\"{title} icon\"" : "»Ikona {title}«", "Customize" : "Prilagodi", "Edit widgets" : "Izbor gradnikov", "Get more widgets from the App Store" : "Pridobi več gradnikov s spletišča App Store", @@ -20,6 +19,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Za večjo zasebnost so podatki vremena pridobljeni prek strežnika Nextcloud, zato tretje osebe ne pridobijo nobenega vašega osebnega podatka.", "Weather data from Met.no" : "Podatke vremena omogoča Met.no", "geocoding with Nominatim" : "geokodiranje Nominatim", - "elevation data from OpenTopoData" : "podatke nadmorske višine OpenTopoData" + "elevation data from OpenTopoData" : "podatke nadmorske višine OpenTopoData", + "\"{title} icon\"" : "»Ikona {title}«" },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/sr.js b/apps/dashboard/l10n/sr.js index 00ebbddca65..7ba1ba4ed65 100644 --- a/apps/dashboard/l10n/sr.js +++ b/apps/dashboard/l10n/sr.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Здраво, {name}", "Happy birthday 🥳🤩🎂🎉" : "Срећан рођендан 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Срећан рођендан {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„{title} икона”", "Customize" : "Прилагођавање", "Edit widgets" : "Уређивање виџета", "Get more widgets from the App Store" : "Преузмите још виџета из Продавнице апликација", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Ради чувања ваше приватности, временске податке са метеоролошког сервиса у ваше име захтева Nextcloud сервер, тако да се метеоролошком сервису не шаљу лични подаци.", "Weather data from Met.no" : "Метеоролошки подаци са Met.no", "geocoding with Nominatim" : "геокодирање са Nominatim", - "elevation data from OpenTopoData" : "висински подаци са OpenTopoData" + "elevation data from OpenTopoData" : "висински подаци са OpenTopoData", + "\"{title} icon\"" : "„{title} икона”" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/dashboard/l10n/sr.json b/apps/dashboard/l10n/sr.json index c8d6cf78e3b..d835955518a 100644 --- a/apps/dashboard/l10n/sr.json +++ b/apps/dashboard/l10n/sr.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Здраво, {name}", "Happy birthday 🥳🤩🎂🎉" : "Срећан рођендан 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Срећан рођендан {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "„{title} икона”", "Customize" : "Прилагођавање", "Edit widgets" : "Уређивање виџета", "Get more widgets from the App Store" : "Преузмите још виџета из Продавнице апликација", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Ради чувања ваше приватности, временске податке са метеоролошког сервиса у ваше име захтева Nextcloud сервер, тако да се метеоролошком сервису не шаљу лични подаци.", "Weather data from Met.no" : "Метеоролошки подаци са Met.no", "geocoding with Nominatim" : "геокодирање са Nominatim", - "elevation data from OpenTopoData" : "висински подаци са OpenTopoData" + "elevation data from OpenTopoData" : "висински подаци са OpenTopoData", + "\"{title} icon\"" : "„{title} икона”" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/sv.js b/apps/dashboard/l10n/sv.js index 5760124eb6e..ed82166c66d 100644 --- a/apps/dashboard/l10n/sv.js +++ b/apps/dashboard/l10n/sv.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Hej, {name}", "Happy birthday 🥳🤩🎂🎉" : "Grattis på födelsedagen 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Grattis på födelsedagen, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title}-ikon\"", "Customize" : "Anpassa", "Edit widgets" : "Ändra widgetar", "Get more widgets from the App Store" : "Hämta fler widgetar från Appstore", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "För din integritet skull hämtas väderdata av din Nextcloud-server på dina vägnar så att vädertjänsten inte får någon personlig information.", "Weather data from Met.no" : "Väderdata från Met.no", "geocoding with Nominatim" : "geokodning med Nominatim", - "elevation data from OpenTopoData" : "höjddata från OpenTopoData" + "elevation data from OpenTopoData" : "höjddata från OpenTopoData", + "\"{title} icon\"" : "\"{title}-ikon\"" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/sv.json b/apps/dashboard/l10n/sv.json index 942930ce188..0b06dcbcccc 100644 --- a/apps/dashboard/l10n/sv.json +++ b/apps/dashboard/l10n/sv.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Hej, {name}", "Happy birthday 🥳🤩🎂🎉" : "Grattis på födelsedagen 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Grattis på födelsedagen, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title}-ikon\"", "Customize" : "Anpassa", "Edit widgets" : "Ändra widgetar", "Get more widgets from the App Store" : "Hämta fler widgetar från Appstore", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "För din integritet skull hämtas väderdata av din Nextcloud-server på dina vägnar så att vädertjänsten inte får någon personlig information.", "Weather data from Met.no" : "Väderdata från Met.no", "geocoding with Nominatim" : "geokodning med Nominatim", - "elevation data from OpenTopoData" : "höjddata från OpenTopoData" + "elevation data from OpenTopoData" : "höjddata från OpenTopoData", + "\"{title} icon\"" : "\"{title}-ikon\"" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/tr.js b/apps/dashboard/l10n/tr.js index d20d2426fdd..1cd70679514 100644 --- a/apps/dashboard/l10n/tr.js +++ b/apps/dashboard/l10n/tr.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Merhaba {name}", "Happy birthday 🥳🤩🎂🎉" : "Mutlu yıllar 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Mutlu yıllar, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} simgesi\"", "Customize" : "Özelleştir", "Edit widgets" : "Pano bileşenlerini düzenle", "Get more widgets from the App Store" : "Uygulama mağazasından başka pano bileşenleri alın", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Kişisel gizliliğinizi korumak için Nextcloud sunucunuz hava durumu verilerini sizin adınıza ister. Böylece hava durumu hizmetine hiçbir kişisel bilgi aktarılmaz.", "Weather data from Met.no" : "Hava durumu verileri Met.no tarafından sağlanıyor", "geocoding with Nominatim" : "Nominatim ile coğrafi kodlama", - "elevation data from OpenTopoData" : "yükseklik verileri OpenTopoData tarafından sağlanıyor" + "elevation data from OpenTopoData" : "yükseklik verileri OpenTopoData tarafından sağlanıyor", + "\"{title} icon\"" : "\"{title} simgesi\"" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/dashboard/l10n/tr.json b/apps/dashboard/l10n/tr.json index 7bb9204043a..4f8759f5261 100644 --- a/apps/dashboard/l10n/tr.json +++ b/apps/dashboard/l10n/tr.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Merhaba {name}", "Happy birthday 🥳🤩🎂🎉" : "Mutlu yıllar 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Mutlu yıllar, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} simgesi\"", "Customize" : "Özelleştir", "Edit widgets" : "Pano bileşenlerini düzenle", "Get more widgets from the App Store" : "Uygulama mağazasından başka pano bileşenleri alın", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Kişisel gizliliğinizi korumak için Nextcloud sunucunuz hava durumu verilerini sizin adınıza ister. Böylece hava durumu hizmetine hiçbir kişisel bilgi aktarılmaz.", "Weather data from Met.no" : "Hava durumu verileri Met.no tarafından sağlanıyor", "geocoding with Nominatim" : "Nominatim ile coğrafi kodlama", - "elevation data from OpenTopoData" : "yükseklik verileri OpenTopoData tarafından sağlanıyor" + "elevation data from OpenTopoData" : "yükseklik verileri OpenTopoData tarafından sağlanıyor", + "\"{title} icon\"" : "\"{title} simgesi\"" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/ug.js b/apps/dashboard/l10n/ug.js index d3ff800a05d..75ca90442a9 100644 --- a/apps/dashboard/l10n/ug.js +++ b/apps/dashboard/l10n/ug.js @@ -14,7 +14,6 @@ OC.L10N.register( "Good evening, {name}" : "خەيرلىك كەچ ، {name}", "Hello" : "ياخشىمۇسىز", "Hello, {name}" : "ياخشىمۇسىز ، {name}", - "\"{title} icon\"" : "\"{title} سىنبەلگىسى\"", "Customize" : "Customize", "Edit widgets" : "كىچىك قوراللارنى تەھرىرلەش", "Get more widgets from the App Store" : "ئەپ دۇكىنىدىن تېخىمۇ كۆپ كىچىك قوراللارغا ئېرىشىڭ", @@ -22,6 +21,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "شەخسىي مەخپىيەتلىكىڭىز ئۈچۈن ھاۋارايى سانلىق مەلۇماتلىرىڭىزنى Nextcloud مۇلازىمېتىرىڭىز تەلەپ قىلىدۇ ، شۇڭا ھاۋارايى مۇلازىمىتى ھېچقانداق شەخسىي ئۇچۇرغا ئېرىشەلمەيدۇ.", "Weather data from Met.no" : "Met.no دىن كەلگەن ھاۋارايى سانلىق مەلۇماتلىرى", "geocoding with Nominatim" : "Nominatim بىلەن جۇغراپىيىلىك كودلاش", - "elevation data from OpenTopoData" : "OpenTopoData دىن ئېگىزلىك سانلىق مەلۇماتلىرى" + "elevation data from OpenTopoData" : "OpenTopoData دىن ئېگىزلىك سانلىق مەلۇماتلىرى", + "\"{title} icon\"" : "\"{title} سىنبەلگىسى\"" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dashboard/l10n/ug.json b/apps/dashboard/l10n/ug.json index e962429e80f..cecbee79dbc 100644 --- a/apps/dashboard/l10n/ug.json +++ b/apps/dashboard/l10n/ug.json @@ -12,7 +12,6 @@ "Good evening, {name}" : "خەيرلىك كەچ ، {name}", "Hello" : "ياخشىمۇسىز", "Hello, {name}" : "ياخشىمۇسىز ، {name}", - "\"{title} icon\"" : "\"{title} سىنبەلگىسى\"", "Customize" : "Customize", "Edit widgets" : "كىچىك قوراللارنى تەھرىرلەش", "Get more widgets from the App Store" : "ئەپ دۇكىنىدىن تېخىمۇ كۆپ كىچىك قوراللارغا ئېرىشىڭ", @@ -20,6 +19,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "شەخسىي مەخپىيەتلىكىڭىز ئۈچۈن ھاۋارايى سانلىق مەلۇماتلىرىڭىزنى Nextcloud مۇلازىمېتىرىڭىز تەلەپ قىلىدۇ ، شۇڭا ھاۋارايى مۇلازىمىتى ھېچقانداق شەخسىي ئۇچۇرغا ئېرىشەلمەيدۇ.", "Weather data from Met.no" : "Met.no دىن كەلگەن ھاۋارايى سانلىق مەلۇماتلىرى", "geocoding with Nominatim" : "Nominatim بىلەن جۇغراپىيىلىك كودلاش", - "elevation data from OpenTopoData" : "OpenTopoData دىن ئېگىزلىك سانلىق مەلۇماتلىرى" + "elevation data from OpenTopoData" : "OpenTopoData دىن ئېگىزلىك سانلىق مەلۇماتلىرى", + "\"{title} icon\"" : "\"{title} سىنبەلگىسى\"" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/uk.js b/apps/dashboard/l10n/uk.js index 9c7131b52e7..7cccfefbc78 100644 --- a/apps/dashboard/l10n/uk.js +++ b/apps/dashboard/l10n/uk.js @@ -15,7 +15,6 @@ OC.L10N.register( "Hello, {name}" : "Привіт, {name}", "Happy birthday 🥳🤩🎂🎉" : "З Днем народження 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "З Днем народження, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} \"іконка\"", "Customize" : "Редагувати", "Edit widgets" : "Редагувати віджети", "Get more widgets from the App Store" : "Більше віджетів у каталозі застосунків", @@ -23,6 +22,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Для забезпечення вашої конфіденційності дані про погоду запитуються вашим сервером Nextcloud від вашого імені, тому служба погоди не отримує особисту інформацію.", "Weather data from Met.no" : "Дані про погоду з Met.no", "geocoding with Nominatim" : "геокодування за допомогою Nominatim", - "elevation data from OpenTopoData" : "дані про висоту з OpenTopoData" + "elevation data from OpenTopoData" : "дані про висоту з OpenTopoData", + "\"{title} icon\"" : "\"{title} \"іконка\"" }, "nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"); diff --git a/apps/dashboard/l10n/uk.json b/apps/dashboard/l10n/uk.json index 231c1aa9cbc..09438fdc22c 100644 --- a/apps/dashboard/l10n/uk.json +++ b/apps/dashboard/l10n/uk.json @@ -13,7 +13,6 @@ "Hello, {name}" : "Привіт, {name}", "Happy birthday 🥳🤩🎂🎉" : "З Днем народження 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "З Днем народження, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} \"іконка\"", "Customize" : "Редагувати", "Edit widgets" : "Редагувати віджети", "Get more widgets from the App Store" : "Більше віджетів у каталозі застосунків", @@ -21,6 +20,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Для забезпечення вашої конфіденційності дані про погоду запитуються вашим сервером Nextcloud від вашого імені, тому служба погоди не отримує особисту інформацію.", "Weather data from Met.no" : "Дані про погоду з Met.no", "geocoding with Nominatim" : "геокодування за допомогою Nominatim", - "elevation data from OpenTopoData" : "дані про висоту з OpenTopoData" + "elevation data from OpenTopoData" : "дані про висоту з OpenTopoData", + "\"{title} icon\"" : "\"{title} \"іконка\"" },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/uz.js b/apps/dashboard/l10n/uz.js index e85d5ea9296..2140c308e7d 100644 --- a/apps/dashboard/l10n/uz.js +++ b/apps/dashboard/l10n/uz.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "Assalomu aleykum, {name}", "Happy birthday 🥳🤩🎂🎉" : "Tug'ilgan kun muborak bo'lsin 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Tug'ilgan kun muborak bo'lsin, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} belgisi\"", "Customize" : "Moslashtirish", "Edit widgets" : "Vidjetlarni tahrirlash", "Get more widgets from the App Store" : "App Store'dan ko'proq vidjetlarni oling", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Maxfiyligingiz uchun ob-havo maʼlumotlari sizning nomingizdan Nextcloud serveringiz tomonidan soʻraladi, shuning uchun ob-havo xizmati shaxsiy maʼlumotlarni olmaydi.", "Weather data from Met.no" : "Met.no dan ob-havo ma'lumotlari", "geocoding with Nominatim" : "Nominatim bilan geokodlash", - "elevation data from OpenTopoData" : "OpenTopoData dan balandlik ma'lumotlari" + "elevation data from OpenTopoData" : "OpenTopoData dan balandlik ma'lumotlari", + "\"{title} icon\"" : "\"{title} belgisi\"" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/uz.json b/apps/dashboard/l10n/uz.json index 22ce852402a..912c35d409f 100644 --- a/apps/dashboard/l10n/uz.json +++ b/apps/dashboard/l10n/uz.json @@ -14,7 +14,6 @@ "Hello, {name}" : "Assalomu aleykum, {name}", "Happy birthday 🥳🤩🎂🎉" : "Tug'ilgan kun muborak bo'lsin 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "Tug'ilgan kun muborak bo'lsin, {name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} belgisi\"", "Customize" : "Moslashtirish", "Edit widgets" : "Vidjetlarni tahrirlash", "Get more widgets from the App Store" : "App Store'dan ko'proq vidjetlarni oling", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Maxfiyligingiz uchun ob-havo maʼlumotlari sizning nomingizdan Nextcloud serveringiz tomonidan soʻraladi, shuning uchun ob-havo xizmati shaxsiy maʼlumotlarni olmaydi.", "Weather data from Met.no" : "Met.no dan ob-havo ma'lumotlari", "geocoding with Nominatim" : "Nominatim bilan geokodlash", - "elevation data from OpenTopoData" : "OpenTopoData dan balandlik ma'lumotlari" + "elevation data from OpenTopoData" : "OpenTopoData dan balandlik ma'lumotlari", + "\"{title} icon\"" : "\"{title} belgisi\"" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/vi.js b/apps/dashboard/l10n/vi.js index 6be5e56c41a..05d2d143c9c 100644 --- a/apps/dashboard/l10n/vi.js +++ b/apps/dashboard/l10n/vi.js @@ -13,7 +13,6 @@ OC.L10N.register( "Good evening, {name}" : "Chào buổi tối, {name}", "Hello" : "Xin chào", "Hello, {name}" : "Xin chào, {name}", - "\"{title} icon\"" : "\"{title} icon\"", "Customize" : "Tuỳ chỉnh", "Edit widgets" : "Chỉnh sửa widget", "Get more widgets from the App Store" : "Tải thêm widget từ App Store", @@ -21,6 +20,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Vì quyền riêng tư của bạn, dữ liệu thời tiết được yêu cầu bởi máy chủ Nextcloud thay mặt bạn để dịch vụ thời tiết không nhận được thông tin cá nhân.", "Weather data from Met.no" : "Dữ liệu thời tiết từ Met.no", "geocoding with Nominatim" : "mã hóa địa lý với Nominatim", - "elevation data from OpenTopoData" : "dữ liệu độ cao từ OpenTopoData" + "elevation data from OpenTopoData" : "dữ liệu độ cao từ OpenTopoData", + "\"{title} icon\"" : "\"{title} icon\"" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/vi.json b/apps/dashboard/l10n/vi.json index bd2743a9b1d..d3da5f426e8 100644 --- a/apps/dashboard/l10n/vi.json +++ b/apps/dashboard/l10n/vi.json @@ -11,7 +11,6 @@ "Good evening, {name}" : "Chào buổi tối, {name}", "Hello" : "Xin chào", "Hello, {name}" : "Xin chào, {name}", - "\"{title} icon\"" : "\"{title} icon\"", "Customize" : "Tuỳ chỉnh", "Edit widgets" : "Chỉnh sửa widget", "Get more widgets from the App Store" : "Tải thêm widget từ App Store", @@ -19,6 +18,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Vì quyền riêng tư của bạn, dữ liệu thời tiết được yêu cầu bởi máy chủ Nextcloud thay mặt bạn để dịch vụ thời tiết không nhận được thông tin cá nhân.", "Weather data from Met.no" : "Dữ liệu thời tiết từ Met.no", "geocoding with Nominatim" : "mã hóa địa lý với Nominatim", - "elevation data from OpenTopoData" : "dữ liệu độ cao từ OpenTopoData" + "elevation data from OpenTopoData" : "dữ liệu độ cao từ OpenTopoData", + "\"{title} icon\"" : "\"{title} icon\"" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/zh_CN.js b/apps/dashboard/l10n/zh_CN.js index 18a0d42f636..dcaad44161e 100644 --- a/apps/dashboard/l10n/zh_CN.js +++ b/apps/dashboard/l10n/zh_CN.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "你好, {name}", "Happy birthday 🥳🤩🎂🎉" : "生日快乐 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "生日快乐,{name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "{title} 图标", "Customize" : "自定义", "Edit widgets" : "编辑小部件", "Get more widgets from the App Store" : "从应用商店获取更多小部件", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "为了您的隐私,天气数据由您的 Nextcloud 服务器为您获取,这样天气服务就无法获得您的个人信息。", "Weather data from Met.no" : "天气数据来自 Met.no", "geocoding with Nominatim" : "使用 Nominatim 地理编码", - "elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData" + "elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData", + "\"{title} icon\"" : "{title} 图标" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/zh_CN.json b/apps/dashboard/l10n/zh_CN.json index 32ae48e0a52..4569ab5ec98 100644 --- a/apps/dashboard/l10n/zh_CN.json +++ b/apps/dashboard/l10n/zh_CN.json @@ -14,7 +14,6 @@ "Hello, {name}" : "你好, {name}", "Happy birthday 🥳🤩🎂🎉" : "生日快乐 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "生日快乐,{name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "{title} 图标", "Customize" : "自定义", "Edit widgets" : "编辑小部件", "Get more widgets from the App Store" : "从应用商店获取更多小部件", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "为了您的隐私,天气数据由您的 Nextcloud 服务器为您获取,这样天气服务就无法获得您的个人信息。", "Weather data from Met.no" : "天气数据来自 Met.no", "geocoding with Nominatim" : "使用 Nominatim 地理编码", - "elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData" + "elevation data from OpenTopoData" : "海拔数据来自 OpenTopoData", + "\"{title} icon\"" : "{title} 图标" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/zh_HK.js b/apps/dashboard/l10n/zh_HK.js index 15905b4633d..557ec2bedc0 100644 --- a/apps/dashboard/l10n/zh_HK.js +++ b/apps/dashboard/l10n/zh_HK.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "哈囉,{name}", "Happy birthday 🥳🤩🎂🎉" : "生日快樂 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "生日快樂,{name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} 圖示\"", "Customize" : "自訂", "Edit widgets" : "編輯小工具", "Get more widgets from the App Store" : "從 App Store 取得更多小工具", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,Nextcloud 會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。", "Weather data from Met.no" : "氣象資訊來自 Met.no", "geocoding with Nominatim" : "使用 Nominatim 來進行地理編碼", - "elevation data from OpenTopoData" : "來自 OpenTopoData 的海拔資料" + "elevation data from OpenTopoData" : "來自 OpenTopoData 的海拔資料", + "\"{title} icon\"" : "\"{title} 圖示\"" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/zh_HK.json b/apps/dashboard/l10n/zh_HK.json index 46333510a82..a7cede02590 100644 --- a/apps/dashboard/l10n/zh_HK.json +++ b/apps/dashboard/l10n/zh_HK.json @@ -14,7 +14,6 @@ "Hello, {name}" : "哈囉,{name}", "Happy birthday 🥳🤩🎂🎉" : "生日快樂 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "生日快樂,{name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "\"{title} 圖示\"", "Customize" : "自訂", "Edit widgets" : "編輯小工具", "Get more widgets from the App Store" : "從 App Store 取得更多小工具", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,Nextcloud 會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。", "Weather data from Met.no" : "氣象資訊來自 Met.no", "geocoding with Nominatim" : "使用 Nominatim 來進行地理編碼", - "elevation data from OpenTopoData" : "來自 OpenTopoData 的海拔資料" + "elevation data from OpenTopoData" : "來自 OpenTopoData 的海拔資料", + "\"{title} icon\"" : "\"{title} 圖示\"" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dashboard/l10n/zh_TW.js b/apps/dashboard/l10n/zh_TW.js index 472c1ecb5bd..10aa30c9fe7 100644 --- a/apps/dashboard/l10n/zh_TW.js +++ b/apps/dashboard/l10n/zh_TW.js @@ -16,7 +16,6 @@ OC.L10N.register( "Hello, {name}" : "嗨,{name}", "Happy birthday 🥳🤩🎂🎉" : "生日快樂 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "生日快樂,{name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "「{title} 圖示」", "Customize" : "自訂", "Edit widgets" : "編輯小工具", "Get more widgets from the App Store" : "從應用程式商店取得更多小工具", @@ -24,6 +23,7 @@ OC.L10N.register( "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,Nextcloud 伺服器會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。", "Weather data from Met.no" : "氣象資訊來自 Met.no", "geocoding with Nominatim" : "地理編碼使用 Nominatim", - "elevation data from OpenTopoData" : "海拔資料來自 OpenTopoData" + "elevation data from OpenTopoData" : "海拔資料來自 OpenTopoData", + "\"{title} icon\"" : "「{title} 圖示」" }, "nplurals=1; plural=0;"); diff --git a/apps/dashboard/l10n/zh_TW.json b/apps/dashboard/l10n/zh_TW.json index 142e61dac51..3b8a8776418 100644 --- a/apps/dashboard/l10n/zh_TW.json +++ b/apps/dashboard/l10n/zh_TW.json @@ -14,7 +14,6 @@ "Hello, {name}" : "嗨,{name}", "Happy birthday 🥳🤩🎂🎉" : "生日快樂 🥳🤩🎂🎉", "Happy birthday, {name} 🥳🤩🎂🎉" : "生日快樂,{name} 🥳🤩🎂🎉", - "\"{title} icon\"" : "「{title} 圖示」", "Customize" : "自訂", "Edit widgets" : "編輯小工具", "Get more widgets from the App Store" : "從應用程式商店取得更多小工具", @@ -22,6 +21,7 @@ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "為了保護您的隱私,Nextcloud 伺服器會代您請求氣象資料,因此天氣服務不會收到您的個人資訊。", "Weather data from Met.no" : "氣象資訊來自 Met.no", "geocoding with Nominatim" : "地理編碼使用 Nominatim", - "elevation data from OpenTopoData" : "海拔資料來自 OpenTopoData" + "elevation data from OpenTopoData" : "海拔資料來自 OpenTopoData", + "\"{title} icon\"" : "「{title} 圖示」" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dav/css/schedule-response.css b/apps/dav/css/schedule-response.css index eef571027c5..85a03cb63e1 100644 --- a/apps/dav/css/schedule-response.css +++ b/apps/dav/css/schedule-response.css @@ -56,6 +56,7 @@ form #selectPartStatForm label span { display: block; line-height: normal; } + form #selectPartStatForm label.ui-state-hover, form #selectPartStatForm label.ui-state-active { color:#000; diff --git a/apps/dav/l10n/fa.js b/apps/dav/l10n/fa.js index dd654921916..692e4fff45e 100644 --- a/apps/dav/l10n/fa.js +++ b/apps/dav/l10n/fa.js @@ -4,96 +4,170 @@ OC.L10N.register( "Calendar" : "تقویم", "Tasks" : "وظایف", "Personal" : "شخصی", - "{actor} created calendar {calendar}" : "{actor} created calendar {calendar}", - "You created calendar {calendar}" : "تقویم ساخته شد", - "{actor} deleted calendar {calendar}" : "{actor} deleted calendar {calendar}", - "You deleted calendar {calendar}" : "You deleted calendar {calendar}", - "{actor} updated calendar {calendar}" : "{actor} updated calendar {calendar}", - "You updated calendar {calendar}" : "You updated calendar {calendar}", - "{actor} restored calendar {calendar}" : "{actor} restored calendar {calendar}", - "You restored calendar {calendar}" : "You restored calendar {calendar}", - "You shared calendar {calendar} as public link" : "You shared calendar {calendar} as public link", - "You removed public link for calendar {calendar}" : "You removed public link for calendar {calendar}", - "{actor} shared calendar {calendar} with you" : "{actor} shared calendar {calendar} with you", - "You shared calendar {calendar} with {user}" : "You shared calendar {calendar} with {user}", - "{actor} shared calendar {calendar} with {user}" : "{actor} shared calendar {calendar} with {user}", - "{actor} unshared calendar {calendar} from you" : "{actor} unshared calendar {calendar} from you", - "You unshared calendar {calendar} from {user}" : "You unshared calendar {calendar} from {user}", - "{actor} unshared calendar {calendar} from {user}" : "{actor} unshared calendar {calendar} from {user}", - "{actor} unshared calendar {calendar} from themselves" : "{actor} unshared calendar {calendar} from themselves", - "You shared calendar {calendar} with group {group}" : "You shared calendar {calendar} with group {group}", - "{actor} shared calendar {calendar} with group {group}" : "{actor} shared calendar {calendar} with group {group}", - "You unshared calendar {calendar} from group {group}" : "You unshared calendar {calendar} from group {group}", - "{actor} unshared calendar {calendar} from group {group}" : "{actor} unshared calendar {calendar} from group {group}", + "{actor} created calendar {calendar}" : "{actor} تقویم {calendar} را ایجاد کرد", + "You created calendar {calendar}" : "شما تقویم {calendar} را ایجاد کردید", + "{actor} deleted calendar {calendar}" : "{actor} تقویم {calendar} را حذف کرد", + "You deleted calendar {calendar}" : "شما تقویم {calendar} را حذف کردید", + "{actor} updated calendar {calendar}" : "{actor} تقویم {calendar} را بهروزرسانی کرد", + "You updated calendar {calendar}" : "شما تقویم {calendar} را بهروزرسانی کردید", + "{actor} restored calendar {calendar}" : "{actor} تقویم {calendar} را بازیابی کرد", + "You restored calendar {calendar}" : "شما تقویم {calendar} را بازیابی کردید", + "You shared calendar {calendar} as public link" : "شما تقویم {calendar} را بهعنوان پیوند عمومی به اشتراک گذاشتید", + "You removed public link for calendar {calendar}" : "شما پیوند عمومی تقویم {calendar} را حذف کردید", + "{actor} shared calendar {calendar} with you" : "{actor} تقویم {calendar} را با شما به اشتراک گذاشت", + "You shared calendar {calendar} with {user}" : "شما تقویم {calendar} را با {user} به اشتراک گذاشتید", + "{actor} shared calendar {calendar} with {user}" : "{actor} تقویم {calendar} را با {user} به اشتراک گذاشت", + "{actor} unshared calendar {calendar} from you" : "{actor} اشتراکگذاری تقویم {calendar} را از شما لغو کرد", + "You unshared calendar {calendar} from {user}" : "شما اشتراکگذاری تقویم {calendar} را از {user} لغو کردید", + "{actor} unshared calendar {calendar} from {user}" : "{actor} اشتراکگذاری تقویم {calendar} را از {user} لغو کرد", + "{actor} unshared calendar {calendar} from themselves" : "{actor} اشتراکگذاری تقویم {calendar} را از خود لغو کرد", + "You shared calendar {calendar} with group {group}" : "شما تقویم {calendar} را با گروه {group} به اشتراک گذاشتید", + "{actor} shared calendar {calendar} with group {group}" : "{actor} تقویم {calendar} را با گروه {group} به اشتراک گذاشت", + "You unshared calendar {calendar} from group {group}" : "شما اشتراکگذاری تقویم {calendar} را از گروه {group} لغو کردید", + "{actor} unshared calendar {calendar} from group {group}" : "{actor} اشتراکگذاری تقویم {calendar} را از گروه {group} لغو کرد", "Untitled event" : "رویداد بدون عنوان", - "{actor} created event {event} in calendar {calendar}" : "{actor} created event {event} in calendar {calendar}", - "You created event {event} in calendar {calendar}" : "You created event {event} in calendar {calendar}", - "{actor} deleted event {event} from calendar {calendar}" : "{actor} deleted event {event} from calendar {calendar}", - "You deleted event {event} from calendar {calendar}" : "You deleted event {event} from calendar {calendar}", - "{actor} updated event {event} in calendar {calendar}" : "{actor} updated event {event} in calendar {calendar}", - "You updated event {event} in calendar {calendar}" : "You updated event {event} in calendar {calendar}", - "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}", - "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}", - "{actor} restored event {event} of calendar {calendar}" : "{actor} restored event {event} of calendar {calendar}", - "You restored event {event} of calendar {calendar}" : "You restored event {event} of calendar {calendar}", + "{actor} created event {event} in calendar {calendar}" : "{actor} رویداد {event} را در تقویم {calendar} ایجاد کرد", + "You created event {event} in calendar {calendar}" : "شما رویداد {event} را در تقویم {calendar} ایجاد کردید", + "{actor} deleted event {event} from calendar {calendar}" : "{actor} رویداد {event} را از تقویم {calendar} حذف کرد", + "You deleted event {event} from calendar {calendar}" : "شما رویداد {event} را از تقویم {calendar} حذف کردید", + "{actor} updated event {event} in calendar {calendar}" : "{actor} رویداد {event} را در تقویم {calendar} بهروزرسانی کرد", + "You updated event {event} in calendar {calendar}" : "شما رویداد {event} را در تقویم {calendar} بهروزرسانی کردید", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} رویداد {event} را از تقویم {sourceCalendar} به تقویم {targetCalendar} منتقل کرد", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "شما رویداد {event} را از تقویم {sourceCalendar} به تقویم {targetCalendar} منتقل کردید", + "{actor} restored event {event} of calendar {calendar}" : "{actor} رویداد {event} را از تقویم {calendar} بازیابی کرد", + "You restored event {event} of calendar {calendar}" : "شما رویداد {event} را از تقویم {calendar} بازیابی کردید", "Busy" : "مشغول", - "{actor} created to-do {todo} in list {calendar}" : "{actor} created to-do {todo} in list {calendar}", - "You created to-do {todo} in list {calendar}" : "You created to-do {todo} in list {calendar}", - "{actor} deleted to-do {todo} from list {calendar}" : "{actor} deleted to-do {todo} from list {calendar}", - "You deleted to-do {todo} from list {calendar}" : "You deleted to-do {todo} from list {calendar}", - "{actor} updated to-do {todo} in list {calendar}" : "{actor} updated to-do {todo} in list {calendar}", - "You updated to-do {todo} in list {calendar}" : "You updated to-do {todo} in list {calendar}", - "{actor} solved to-do {todo} in list {calendar}" : "{actor} solved to-do {todo} in list {calendar}", - "You solved to-do {todo} in list {calendar}" : "You solved to-do {todo} in list {calendar}", - "{actor} reopened to-do {todo} in list {calendar}" : "{actor} reopened to-do {todo} in list {calendar}", - "You reopened to-do {todo} in list {calendar}" : "You reopened to-do {todo} in list {calendar}", - "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}", - "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}", - "Calendar, contacts and tasks" : "Calendar, contacts and tasks", - "A <strong>calendar</strong> was modified" : "یک تقویم تغییر کرد", - "A calendar <strong>event</strong> was modified" : "یک رویداد ثبت شده در تقویم تغییر کرد", - "A calendar <strong>to-do</strong> was modified" : "یک کار ثبت شده در تقویم تغییر کرد", - "Contact birthdays" : "Contact birthdays", - "Death of %s" : "Death of %s", + "{actor} created to-do {todo} in list {calendar}" : "{actor} کار {todo} را در لیست {calendar} ایجاد کرد", + "You created to-do {todo} in list {calendar}" : "شما کار {todo} را در لیست {calendar} ایجاد کردید", + "{actor} deleted to-do {todo} from list {calendar}" : "{actor} کار {todo} را از لیست {calendar} حذف کرد", + "You deleted to-do {todo} from list {calendar}" : "شما کار {todo} را از لیست {calendar} حذف کردید", + "{actor} updated to-do {todo} in list {calendar}" : "{actor} کار {todo} را در لیست {calendar} بهروزرسانی کرد", + "You updated to-do {todo} in list {calendar}" : "شما کار {todo} را در لیست {calendar} بهروزرسانی کردید", + "{actor} solved to-do {todo} in list {calendar}" : "{actor} کار {todo} را در لیست {calendar} حل کرد", + "You solved to-do {todo} in list {calendar}" : "شما کار {todo} را در لیست {calendar} حل کردید", + "{actor} reopened to-do {todo} in list {calendar}" : "{actor} کار {todo} را در لیست {calendar} بازگشایی کرد", + "You reopened to-do {todo} in list {calendar}" : "شما کار {todo} را در لیست {calendar} بازگشایی کردید", + "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} کار {todo} را از لیست {sourceCalendar} به لیست {targetCalendar} منتقل کرد", + "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "شما کار {todo} را از لیست {sourceCalendar} به لیست {targetCalendar} منتقل کردید", + "Calendar, contacts and tasks" : "تقویم، مخاطبین و وظایف", + "A <strong>calendar</strong> was modified" : "یک <strong>تقویم</strong> تغییر کرد", + "A calendar <strong>event</strong> was modified" : "یک <strong>رویداد</strong> تقویم تغییر کرد", + "A calendar <strong>to-do</strong> was modified" : "یک <strong>کار</strong> تقویم تغییر کرد", + "Contact birthdays" : "تولد مخاطبین", + "Death of %s" : "فوت %s", "Untitled calendar" : "تقویم بدون عنوان", - "Calendar:" : "Calendar:", + "Calendar:" : "تقویم:", "Date:" : "تاریخ:", "Where:" : "مکان:", "Description:" : "توضیحات:", - "_%n year_::_%n years_" : ["%n year","%n years"], - "_%n month_::_%n months_" : ["%n month","%n months"], - "_%n day_::_%n days_" : ["%n day","%n days"], - "_%n hour_::_%n hours_" : ["%n hour","%n hours"], - "_%n minute_::_%n minutes_" : ["%n minute","%n minutes"], - "%s (in %s)" : "%s (in %s)", - "%s (%s ago)" : "%s (%s ago)", - "Calendar: %s" : "Calendar: %s", - "Date: %s" : "Date: %s", - "Description: %s" : "Description: %s", - "Where: %s" : "Where: %s", + "_%n year_::_%n years_" : ["%n سال","%n سال"], + "_%n month_::_%n months_" : ["%n ماه","%n ماه"], + "_%n day_::_%n days_" : ["%n روز","%n روز"], + "_%n hour_::_%n hours_" : ["%n ساعت","%n ساعت"], + "_%n minute_::_%n minutes_" : ["%n دقیقه","%n دقیقه"], + "%s (in %s)" : "%s (در %s)", + "%s (%s ago)" : "%s (%s پیش)", + "Calendar: %s" : "تقویم: %s", + "Date: %s" : "تاریخ: %s", + "Description: %s" : "توضیحات: %s", + "Where: %s" : "مکان: %s", "%1$s via %2$s" : "%1$s از طریق %2$s", - "Cancelled: %1$s" : "Cancelled: %1$s", - "\"%1$s\" has been canceled" : "\"%1$s\" has been canceled", - "Re: %1$s" : "Re: %1$s", - "%1$s has accepted your invitation" : "%1$s has accepted your invitation", - "%1$s has tentatively accepted your invitation" : "%1$s has tentatively accepted your invitation", - "%1$s has declined your invitation" : "%1$s has declined your invitation", - "%1$s has responded to your invitation" : "%1$s has responded to your invitation", - "Invitation updated: %1$s" : "Invitation updated: %1$s", - "%1$s updated the event \"%2$s\"" : "%1$s updated the event \"%2$s\"", - "Invitation: %1$s" : "Invitation: %1$s", - "%1$s would like to invite you to \"%2$s\"" : "%1$s would like to invite you to \"%2$s\"", - "Organizer:" : "Organizer:", - "Attendees:" : "Attendees:", + "In the past on %1$s for the entire day" : "در گذشته در %1$s برای کل روز", + "_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["در یک دقیقه در %1$s برای کل روز","در %n دقیقه در %1$s برای کل روز"], + "_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["در یک ساعت در %1$s برای کل روز","در %n ساعت در %1$s برای کل روز"], + "_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["در یک روز در %1$s برای کل روز","در %n روز در %1$s برای کل روز"], + "_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["در یک هفته در %1$s برای کل روز","در %n هفته در %1$s برای کل روز"], + "_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["در یک ماه در %1$s برای کل روز","در %n ماه در %1$s برای کل روز"], + "_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["در یک سال در %1$s برای کل روز","در %n سال در %1$s برای کل روز"], + "In the past on %1$s between %2$s - %3$s" : "در گذشته در %1$s بین %2$s - %3$s", + "_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["در یک دقیقه در %1$s بین %2$s - %3$s","در %n دقیقه در %1$s بین %2$s - %3$s"], + "_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["در یک ساعت در %1$s بین %2$s - %3$s","در %n ساعت در %1$s بین %2$s - %3$s"], + "_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["در یک روز در %1$s بین %2$s - %3$s","در %n روز در %1$s بین %2$s - %3$s"], + "_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["در یک هفته در %1$s بین %2$s - %3$s","در %n هفته در %1$s بین %2$s - %3$s"], + "_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["در یک ماه در %1$s بین %2$s - %3$s","در %n ماه در %1$s بین %2$s - %3$s"], + "_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["در یک سال در %1$s بین %2$s - %3$s","در %n سال در %1$s بین %2$s - %3$s"], + "Could not generate when statement" : "امکان ایجاد عبارت زمان وجود ندارد", + "Every Day for the entire day" : "هر روز برای کل روز", + "Every Day for the entire day until %1$s" : "هر روز برای کل روز تا %1$s", + "Every Day between %1$s - %2$s" : "هر روز بین %1$s - %2$s", + "Every Day between %1$s - %2$s until %3$s" : "هر روز بین %1$s - %2$s تا %3$s", + "Every %1$d Days for the entire day" : "هر %1$d روز برای کل روز", + "Every %1$d Days for the entire day until %2$s" : "هر %1$d روز برای کل روز تا %2$s", + "Every %1$d Days between %2$s - %3$s" : "هر %1$d روز بین %2$s - %3$s", + "Every %1$d Days between %2$s - %3$s until %4$s" : "هر %1$d روز بین %2$s - %3$s تا %4$s", + "Could not generate event recurrence statement" : "امکان ایجاد عبارت تکرار رویداد وجود ندارد", + "Every Week on %1$s for the entire day" : "هر هفته در %1$s برای کل روز", + "Every Week on %1$s for the entire day until %2$s" : "هر هفته در %1$s برای کل روز تا %2$s", + "Every Week on %1$s between %2$s - %3$s" : "هر هفته در %1$s بین %2$s - %3$s", + "Every Week on %1$s between %2$s - %3$s until %4$s" : "هر هفته در %1$s بین %2$s - %3$s تا %4$s", + "Every %1$d Weeks on %2$s for the entire day" : "هر %1$d هفته در %2$s برای کل روز", + "Every %1$d Weeks on %2$s for the entire day until %3$s" : "هر %1$d هفته در %2$s برای کل روز تا %3$s", + "Every %1$d Weeks on %2$s between %3$s - %4$s" : "هر %1$d هفته در %2$s بین %3$s - %4$s", + "Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "هر %1$d هفته در %2$s بین %3$s - %4$s تا %5$s", + "Every Month on the %1$s for the entire day" : "هر ماه در %1$s برای کل روز", + "Every Month on the %1$s for the entire day until %2$s" : "هر ماه در %1$s برای کل روز تا %2$s", + "Every Month on the %1$s between %2$s - %3$s" : "هر ماه در %1$s بین %2$s - %3$s", + "Every Month on the %1$s between %2$s - %3$s until %4$s" : "هر ماه در %1$s بین %2$s - %3$s تا %4$s", + "Every %1$d Months on the %2$s for the entire day" : "هر %1$d ماه در %2$s برای کل روز", + "Every %1$d Months on the %2$s for the entire day until %3$s" : "هر %1$d ماه در %2$s برای کل روز تا %3$s", + "Every %1$d Months on the %2$s between %3$s - %4$s" : "هر %1$d ماه در %2$s بین %3$s - %4$s", + "Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "هر %1$d ماه در %2$s بین %3$s - %4$s تا %5$s", + "Every Year in %1$s on the %2$s for the entire day" : "هر سال در %1$s در %2$s برای کل روز", + "Every Year in %1$s on the %2$s for the entire day until %3$s" : "هر سال در %1$s در %2$s برای کل روز تا %3$s", + "Every Year in %1$s on the %2$s between %3$s - %4$s" : "هر سال در %1$s در %2$s بین %3$s - %4$s", + "Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "هر سال در %1$s در %2$s بین %3$s - %4$s تا %5$s", + "Every %1$d Years in %2$s on the %3$s for the entire day" : "هر %1$d سال در %2$s در %3$s برای کل روز", + "Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "هر %1$d سال در %2$s در %3$s برای کل روز تا %4$s", + "Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "هر %1$d سال در %2$s در %3$s بین %4$s - %5$s", + "Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "هر %1$d سال در %2$s در %3$s بین %4$s - %5$s تا %6$s", + "On specific dates for the entire day until %1$s" : "در تاریخهای مشخص برای کل روز تا %1$s", + "On specific dates between %1$s - %2$s until %3$s" : "در تاریخهای مشخص بین %1$s - %2$s تا %3$s", + "In the past on %1$s" : "در گذشته در %1$s", + "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["در یک دقیقه در %1$s","در %n دقیقه در %1$s"], + "_In a hour on %1$s_::_In %n hours on %1$s_" : ["در یک ساعت در %1$s","در %n ساعت در %1$s"], + "_In a day on %1$s_::_In %n days on %1$s_" : ["در یک روز در %1$s","در %n روز در %1$s"], + "_In a week on %1$s_::_In %n weeks on %1$s_" : ["در یک هفته در %1$s","در %n هفته در %1$s"], + "_In a month on %1$s_::_In %n months on %1$s_" : ["در یک ماه در %1$s","در %n ماه در %1$s"], + "_In a year on %1$s_::_In %n years on %1$s_" : ["در یک سال در %1$s","در %n سال در %1$s"], + "In the past on %1$s then on %2$s" : "در گذشته در %1$s سپس در %2$s", + "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["در یک دقیقه در %1$s سپس در %2$s","در %n دقیقه در %1$s سپس در %2$s"], + "_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["در یک ساعت در %1$s سپس در %2$s","در %n ساعت در %1$s سپس در %2$s"], + "_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["در یک روز در %1$s سپس در %2$s","در %n روز در %1$s سپس در %2$s"], + "_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["در یک هفته در %1$s سپس در %2$s","در %n هفته در %1$s سپس در %2$s"], + "_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["در یک ماه در %1$s سپس در %2$s","در %n ماه در %1$s سپس در %2$s"], + "_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["در یک سال در %1$s سپس در %2$s","در %n سال در %1$s سپس در %2$s"], + "In the past on %1$s then on %2$s and %3$s" : "در گذشته در %1$s سپس در %2$s و %3$s", + "_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["در یک دقیقه در %1$s سپس در %2$s و %3$s","در %n دقیقه در %1$s سپس در %2$s و %3$s"], + "_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["در یک ساعت در %1$s سپس در %2$s و %3$s","در %n ساعت در %1$s سپس در %2$s و %3$s"], + "_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["در یک روز در %1$s سپس در %2$s و %3$s","در %n روز در %1$s سپس در %2$s و %3$s"], + "_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["در یک هفته در %1$s سپس در %2$s و %3$s","در %n هفته در %1$s سپس در %2$s و %3$s"], + "_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["در یک ماه در %1$s سپس در %2$s و %3$s","در %n ماه در %1$s سپس در %2$s و %3$s"], + "_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["در یک سال در %1$s سپس در %2$s و %3$s","در %n سال در %1$s سپس در %2$s و %3$s"], + "Could not generate next recurrence statement" : "امکان ایجاد عبارت تکرار بعدی وجود ندارد", + "Cancelled: %1$s" : "لغو شد: %1$s", + "\"%1$s\" has been canceled" : "\"%1$s\" لغو شده است", + "Re: %1$s" : "پاسخ: %1$s", + "%1$s has accepted your invitation" : "%1$s دعوت شما را پذیرفته است", + "%1$s has tentatively accepted your invitation" : "%1$s دعوت شما را بهطور آزمایشی پذیرفته است", + "%1$s has declined your invitation" : "%1$s دعوت شما را رد کرده است", + "%1$s has responded to your invitation" : "%1$s به دعوت شما پاسخ داده است", + "Invitation updated: %1$s" : "دعوت بهروزرسانی شد: %1$s", + "%1$s updated the event \"%2$s\"" : "%1$s رویداد \"%2$s\" را بهروزرسانی کرد", + "Invitation: %1$s" : "دعوت: %1$s", + "%1$s would like to invite you to \"%2$s\"" : "%1$s مایل است شما را به \"%2$s\" دعوت کند", + "Organizer:" : "برگزارکننده:", + "Attendees:" : "شرکتکنندگان:", "Title:" : "عنوان:", + "When:" : "چه زمانی:", "Location:" : "مکان:", - "Link:" : "Link:", - "Accept" : "قبول", - "Decline" : "کاهش می یابد", - "More options …" : "More options …", - "More options at %s" : "More options at %s", + "Link:" : "پیوند:", + "Occurring:" : "در حال وقوع:", + "Accept" : "پذیرفتن", + "Decline" : "رد کردن", + "More options …" : "گزینههای بیشتر…", + "More options at %s" : "گزینههای بیشتر در %s", "Monday" : "دوشنبه", - "Tuesday" : "سه شنبه", + "Tuesday" : "سهشنبه", "Wednesday" : "چهارشنبه", "Thursday" : "پنجشنبه", "Friday" : "جمعه", @@ -105,101 +179,150 @@ OC.L10N.register( "April" : "آوریل", "May" : "مه", "June" : "ژوئن", - "July" : "جولای", + "July" : "ژوئیه", "August" : "اوت", "September" : "سپتامبر", "October" : "اکتبر", "November" : "نوامبر", "December" : "دسامبر", - "First" : "First", - "Last" : "Last", + "First" : "اول", + "Second" : "دوم", + "Third" : "سوم", + "Fourth" : "چهارم", + "Fifth" : "پنجم", + "Last" : "آخر", + "Second Last" : "دومی از آخر", + "Third Last" : "سومی از آخر", + "Fourth Last" : "چهارمی از آخر", + "Fifth Last" : "پنجمی از آخر", "Contacts" : "مخاطبین", - "{actor} created address book {addressbook}" : "{actor} created address book {addressbook}", - "You created address book {addressbook}" : "دفترچه آدرس ساخته شد", - "{actor} deleted address book {addressbook}" : "{actor} deleted address book {addressbook}", - "You deleted address book {addressbook}" : "You deleted address book {addressbook}", - "{actor} updated address book {addressbook}" : "{actor} updated address book {addressbook}", - "You updated address book {addressbook}" : "You updated address book {addressbook}", - "{actor} shared address book {addressbook} with you" : "{actor} shared address book {addressbook} with you", - "You shared address book {addressbook} with {user}" : "You shared address book {addressbook} with {user}", - "{actor} shared address book {addressbook} with {user}" : "{actor} shared address book {addressbook} with {user}", - "{actor} unshared address book {addressbook} from you" : "{actor} unshared address book {addressbook} from you", - "You unshared address book {addressbook} from {user}" : "You unshared address book {addressbook} from {user}", - "{actor} unshared address book {addressbook} from {user}" : "{actor} unshared address book {addressbook} from {user}", - "{actor} unshared address book {addressbook} from themselves" : "{actor} unshared address book {addressbook} from themselves", - "You shared address book {addressbook} with group {group}" : "You shared address book {addressbook} with group {group}", - "{actor} shared address book {addressbook} with group {group}" : "{actor} shared address book {addressbook} with group {group}", - "You unshared address book {addressbook} from group {group}" : "You unshared address book {addressbook} from group {group}", - "{actor} unshared address book {addressbook} from group {group}" : "{actor} unshared address book {addressbook} from group {group}", - "{actor} created contact {card} in address book {addressbook}" : "{actor} created contact {card} in address book {addressbook}", - "You created contact {card} in address book {addressbook}" : "You created contact {card} in address book {addressbook}", - "{actor} deleted contact {card} from address book {addressbook}" : "{actor} deleted contact {card} from address book {addressbook}", - "You deleted contact {card} from address book {addressbook}" : "You deleted contact {card} from address book {addressbook}", - "{actor} updated contact {card} in address book {addressbook}" : "{actor} updated contact {card} in address book {addressbook}", - "You updated contact {card} in address book {addressbook}" : "You updated contact {card} in address book {addressbook}", - "A <strong>contact</strong> or <strong>address book</strong> was modified" : "یک مخاطب یا دفترچه آدرس تغییر کرد", + "{actor} created address book {addressbook}" : "{actor} دفترچه آدرس {addressbook} را ایجاد کرد", + "You created address book {addressbook}" : "شما دفترچه آدرس {addressbook} را ایجاد کردید", + "{actor} deleted address book {addressbook}" : "{actor} دفترچه آدرس {addressbook} را حذف کرد", + "You deleted address book {addressbook}" : "شما دفترچه آدرس {addressbook} را حذف کردید", + "{actor} updated address book {addressbook}" : "{actor} دفترچه آدرس {addressbook} را بهروزرسانی کرد", + "You updated address book {addressbook}" : "شما دفترچه آدرس {addressbook} را بهروزرسانی کردید", + "{actor} shared address book {addressbook} with you" : "{actor} دفترچه آدرس {addressbook} را با شما به اشتراک گذاشت", + "You shared address book {addressbook} with {user}" : "شما دفترچه آدرس {addressbook} را با {user} به اشتراک گذاشتید", + "{actor} shared address book {addressbook} with {user}" : "{actor} دفترچه آدرس {addressbook} را با {user} به اشتراک گذاشت", + "{actor} unshared address book {addressbook} from you" : "{actor} اشتراکگذاری دفترچه آدرس {addressbook} را از شما لغو کرد", + "You unshared address book {addressbook} from {user}" : "شما اشتراکگذاری دفترچه آدرس {addressbook} را از {user} لغو کردید", + "{actor} unshared address book {addressbook} from {user}" : "{actor} اشتراکگذاری دفترچه آدرس {addressbook} را از {user} لغو کرد", + "{actor} unshared address book {addressbook} from themselves" : "{actor} اشتراکگذاری دفترچه آدرس {addressbook} را از خود لغو کرد", + "You shared address book {addressbook} with group {group}" : "شما دفترچه آدرس {addressbook} را با گروه {group} به اشتراک گذاشتید", + "{actor} shared address book {addressbook} with group {group}" : "{actor} دفترچه آدرس {addressbook} را با گروه {group} به اشتراک گذاشت", + "You unshared address book {addressbook} from group {group}" : "شما اشتراکگذاری دفترچه آدرس {addressbook} را از گروه {group} لغو کردید", + "{actor} unshared address book {addressbook} from group {group}" : "{actor} اشتراکگذاری دفترچه آدرس {addressbook} را از گروه {group} لغو کرد", + "{actor} created contact {card} in address book {addressbook}" : "{actor} مخاطب {card} را در دفترچه آدرس {addressbook} ایجاد کرد", + "You created contact {card} in address book {addressbook}" : "شما مخاطب {card} را در دفترچه آدرس {addressbook} ایجاد کردید", + "{actor} deleted contact {card} from address book {addressbook}" : "{actor} مخاطب {card} را از دفترچه آدرس {addressbook} حذف کرد", + "You deleted contact {card} from address book {addressbook}" : "شما مخاطب {card} را از دفترچه آدرس {addressbook} حذف کردید", + "{actor} updated contact {card} in address book {addressbook}" : "{actor} مخاطب {card} را در دفترچه آدرس {addressbook} بهروزرسانی کرد", + "You updated contact {card} in address book {addressbook}" : "شما مخاطب {card} را در دفترچه آدرس {addressbook} بهروزرسانی کردید", + "A <strong>contact</strong> or <strong>address book</strong> was modified" : "یک <strong>مخاطب</strong> یا <strong>دفترچه آدرس</strong> تغییر کرد", "Accounts" : "حسابها", - "File is not updatable: %1$s" : "File is not updatable: %1$s", - "Could not write to final file, canceled by hook" : "Could not write to final file, canceled by hook", - "Could not write file contents" : "Could not write file contents", - "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], - "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)", - "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side.", - "Could not rename part file to final file, canceled by hook" : "Could not rename part file to final file, canceled by hook", - "Could not rename part file to final file" : "Could not rename part file to final file", - "Failed to check file size: %1$s" : "Failed to check file size: %1$s", - "Encryption not ready: %1$s" : "Encryption not ready: %1$s", - "Failed to open file: %1$s" : "Failed to open file: %1$s", - "Failed to unlink: %1$s" : "Failed to unlink: %1$s", - "Failed to write file contents: %1$s" : "Failed to write file contents: %1$s", - "File not found: %1$s" : "File not found: %1$s", - "System is in maintenance mode." : "System is in maintenance mode.", - "Upgrade needed" : "Upgrade needed", - "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS.", - "Configures a CalDAV account" : "Configures a CalDAV account", - "Configures a CardDAV account" : "Configures a CardDAV account", - "Events" : "Events", + "System address book which holds all accounts" : "دفترچه آدرس سیستمی که شامل تمام حسابها است", + "File is not updatable: %1$s" : "فایل قابل بهروزرسانی نیست: %1$s", + "Failed to get storage for file" : "دریافت فضای ذخیرهسازی برای فایل با شکست مواجه شد", + "Could not write to final file, canceled by hook" : "نوشتن در فایل نهایی امکانپذیر نبود، توسط هوک لغو شد", + "Could not write file contents" : "امکان نوشتن محتویات فایل وجود ندارد", + "_%n byte_::_%n bytes_" : ["%n بایت","%n بایت"], + "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "خطا هنگام کپی فایل به مکان مقصد (کپی شده: %1$s، حجم فایل مورد انتظار: %2$s)", + "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "حجم فایل مورد انتظار %1$s بود اما %2$s خوانده (از کلاینت Nextcloud) و نوشته (در فضای ذخیرهسازی Nextcloud) شد. این میتواند ناشی از مشکل شبکه در سمت ارسال یا مشکل نوشتن در فضای ذخیرهسازی در سمت سرور باشد.", + "Could not rename part file to final file, canceled by hook" : "امکان تغییر نام فایل جزئی به فایل نهایی وجود نداشت، توسط هوک لغو شد", + "Could not rename part file to final file" : "امکان تغییر نام فایل جزئی به فایل نهایی وجود ندارد", + "Failed to check file size: %1$s" : "بررسی حجم فایل با شکست مواجه شد: %1$s", + "Could not open file: %1$s, file does seem to exist" : "امکان باز کردن فایل وجود ندارد: %1$s، به نظر میرسد فایل وجود دارد", + "Could not open file: %1$s, file doesn't seem to exist" : "امکان باز کردن فایل وجود ندارد: %1$s، به نظر میرسد فایل وجود ندارد", + "Encryption not ready: %1$s" : "رمزگذاری آماده نیست: %1$s", + "Failed to open file: %1$s" : "باز کردن فایل با شکست مواجه شد: %1$s", + "Failed to unlink: %1$s" : "حذف پیوند با شکست مواجه شد: %1$s", + "Failed to write file contents: %1$s" : "نوشتن محتویات فایل با شکست مواجه شد: %1$s", + "File not found: %1$s" : "فایل یافت نشد: %1$s", + "Invalid target path" : "مسیر مقصد نامعتبر است", + "System is in maintenance mode." : "سیستم در حالت نگهداری است.", + "Upgrade needed" : "نیاز به ارتقا", + "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "برای استفاده از CalDAV و CardDAV با iOS/macOS، %s شما باید برای استفاده از HTTPS پیکربندی شود.", + "Configures a CalDAV account" : "یک حساب CalDAV را پیکربندی میکند", + "Configures a CardDAV account" : "یک حساب CardDAV را پیکربندی میکند", + "Events" : "رویدادها", "Untitled task" : "کار بدون عنوان", - "Completed on %s" : "Completed on %s", - "Due on %s by %s" : "Due on %s by %s", - "Due on %s" : "Due on %s", - "WebDAV endpoint" : "WebDAV endpoint", - "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken.", - "Migrated calendar (%1$s)" : "Migrated calendar (%1$s)", - "Calendars including events, details and attendees" : "Calendars including events, details and attendees", - "Contacts and groups" : "Contacts and groups", - "WebDAV" : "WebDAV", - "First day" : "First day", + "Completed on %s" : "تکمیل شده در %s", + "Due on %s by %s" : "موعد در %s توسط %s", + "Due on %s" : "موعد در %s", + "System Address Book" : "دفترچه آدرس سیستم", + "The system address book contains contact information for all users in your instance." : "دفترچه آدرس سیستم شامل اطلاعات تماس برای همه کاربران در نمونه شما است.", + "Enable System Address Book" : "فعال کردن دفترچه آدرس سیستم", + "DAV system address book" : "دفترچه آدرس سیستم DAV", + "No outstanding DAV system address book sync." : "هیچ همگامسازی دفترچه آدرس سیستم DAV در انتظار نیست.", + "The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "همگامسازی دفترچه آدرس سیستم DAV هنوز اجرا نشده است زیرا نمونه شما بیش از ۱۰۰۰ کاربر دارد یا خطایی رخ داده است. لطفاً آن را بهصورت دستی با فراخوانی \"occ dav:sync-system-addressbook\" اجرا کنید.", + "WebDAV endpoint" : "نقطه پایانی WebDAV", + "Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "امکان بررسی اینکه سرور وب شما به درستی برای همگامسازی فایل از طریق WebDAV تنظیم شده است، وجود ندارد. لطفاً به صورت دستی بررسی کنید.", + "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "سرور وب شما هنوز به درستی برای همگامسازی فایل تنظیم نشده است، زیرا به نظر میرسد رابط WebDAV خراب است.", + "Your web server is properly set up to allow file synchronization over WebDAV." : "سرور وب شما به درستی برای همگامسازی فایل از طریق WebDAV تنظیم شده است.", + "Migrated calendar (%1$s)" : "تقویم منتقل شده (%1$s)", + "Calendars including events, details and attendees" : "تقویمها شامل رویدادها، جزئیات و شرکتکنندگان", + "Contacts and groups" : "مخاطبین و گروهها", + "WebDAV" : "وبدَو", + "Absence saved" : "غیبت ذخیره شد", + "Failed to save your absence settings" : "ذخیره تنظیمات غیبت شما با شکست مواجه شد", + "Absence cleared" : "غیبت پاک شد", + "Failed to clear your absence settings" : "پاک کردن تنظیمات غیبت شما با شکست مواجه شد", + "First day" : "روز اول", + "Last day (inclusive)" : "روز آخر (شامل)", + "Out of office replacement (optional)" : "جایگزین خارج از دفتر (اختیاری)", + "Name of the replacement" : "نام جایگزین", + "No results." : "نتیجهای یافت نشد.", + "Start typing." : "شروع به تایپ کنید.", + "Short absence status" : "وضعیت کوتاه غیبت", + "Long absence Message" : "پیام طولانی غیبت", "Save" : "ذخیره", - "Failed to load availability" : "Failed to load availability", - "Saved availability" : "Saved availability", - "Failed to save availability" : "Failed to save availability", + "Disable absence" : "غیرفعال کردن غیبت", + "Failed to load availability" : "بارگذاری در دسترس بودن با شکست مواجه شد", + "Saved availability" : "در دسترس بودن ذخیره شد", + "Failed to save availability" : "ذخیره در دسترس بودن با شکست مواجه شد", "Time zone:" : "منطقه زمانی:", - "to" : "به", - "Delete slot" : "Delete slot", + "to" : "تا", + "Delete slot" : "حذف بازه زمانی", "No working hours set" : "ساعات کاری تعیین نشده است", - "Add slot" : "Add slot", - "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "وضعیت کاربر بصورت خودکار به \"مزاحم نشوید\" تغییر داده شود تا همه ی اعلان ها خاموش شوند", - "Availability" : "موجود بودن", - "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}.", - "Please make sure to properly set up {emailopen}the email server{linkclose}." : "Please make sure to properly set up {emailopen}the email server{linkclose}.", - "Calendar server" : "Calendar server", - "Send invitations to attendees" : "Send invitations to attendees", - "Automatically generate a birthday calendar" : "Automatically generate a birthday calendar", - "Birthday calendars will be generated by a background job." : "Birthday calendars will be generated by a background job.", - "Hence they will not be available immediately after enabling but will show up after some time." : "Hence they will not be available immediately after enabling but will show up after some time.", - "Send notifications for events" : "Send notifications for events", - "Notifications are sent via background jobs, so these must occur often enough." : "Notifications are sent via background jobs, so these must occur often enough.", - "Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well", - "Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.", - "Enable notifications for events via push" : "Enable notifications for events via push", - "Cancel" : "ردکردن", + "Add slot" : "افزودن بازه زمانی", + "Weekdays" : "روزهای هفته", + "Pick a start time for {dayName}" : "زمان شروع برای {dayName} را انتخاب کنید", + "Pick a end time for {dayName}" : "زمان پایان برای {dayName} را انتخاب کنید", + "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "وضعیت کاربر بصورت خودکار به \"مزاحم نشوید\" تغییر داده شود تا همه ی اعلان ها خاموش شوند.", + "Availability" : "در دسترس بودن", + "If you configure your working hours, other people will see when you are out of office when they book a meeting." : "اگر ساعات کاری خود را پیکربندی کنید، دیگران هنگام رزرو جلسه متوجه خواهند شد که شما در دفتر نیستید.", + "Absence" : "غیبت", + "Configure your next absence period." : "دوره غیبت بعدی خود را پیکربندی کنید.", + "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "همچنین {calendarappstoreopen}برنامه تقویم{linkclose} را نصب کنید، یا {calendardocopen}دسکتاپ و موبایل خود را برای همگامسازی متصل کنید ↗{linkclose}.", + "Please make sure to properly set up {emailopen}the email server{linkclose}." : "لطفاً مطمئن شوید که {emailopen}سرور ایمیل{linkclose} را به درستی تنظیم کردهاید.", + "Calendar server" : "سرور تقویم", + "Send invitations to attendees" : "ارسال دعوتنامهها به شرکتکنندگان", + "Automatically generate a birthday calendar" : "بهطور خودکار یک تقویم تولد ایجاد کنید", + "Birthday calendars will be generated by a background job." : "تقویمهای تولد توسط یک کار پسزمینه ایجاد خواهند شد.", + "Hence they will not be available immediately after enabling but will show up after some time." : "بنابراین بلافاصله پس از فعالسازی در دسترس نخواهند بود، اما پس از مدتی نمایان میشوند.", + "Send notifications for events" : "ارسال اعلانها برای رویدادها", + "Notifications are sent via background jobs, so these must occur often enough." : "اعلانها از طریق کارهای پسزمینه ارسال میشوند، بنابراین این کارها باید به اندازه کافی مکرر انجام شوند.", + "Send reminder notifications to calendar sharees as well" : "ارسال اعلانهای یادآوری به اشتراکگذاران تقویم نیز", + "Reminders are always sent to organizers and attendees." : "یادآوریها همیشه برای برگزارکنندگان و شرکتکنندگان ارسال میشوند.", + "Enable notifications for events via push" : "فعال کردن اعلانها برای رویدادها از طریق پوش", + "Cancel" : "لغو", "Import" : "وارد کردن", - "Error while saving settings" : "Error while saving settings", - "There was an error updating your attendance status." : "There was an error updating your attendance status.", - "Please contact the organizer directly." : "Please contact the organizer directly.", - "Are you accepting the invitation?" : "Are you accepting the invitation?", + "Error while saving settings" : "خطا هنگام ذخیره تنظیمات", + "Contact reset successfully" : "مخاطب با موفقیت بازنشانی شد", + "Error while resetting contact" : "خطا هنگام بازنشانی مخاطب", + "Contact imported successfully" : "مخاطب با موفقیت وارد شد", + "Error while importing contact" : "خطا هنگام وارد کردن مخاطب", + "Example Content" : "محتوای نمونه", + "Set example content to be created on new user first login." : "محتوای نمونه را برای ایجاد در اولین ورود کاربر جدید تنظیم کنید.", + "Import contact" : "وارد کردن مخاطب", + "Reset to default contact" : "بازنشانی به مخاطب پیشفرض", + "Import contacts" : "وارد کردن مخاطبین", + "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "وارد کردن یک فایل .vcf جدید، مخاطب پیشفرض موجود را حذف کرده و آن را با مخاطب جدید جایگزین میکند. آیا میخواهید ادامه دهید؟", + "There was an error updating your attendance status." : "خطایی در بهروزرسانی وضعیت حضور شما رخ داد.", + "Please contact the organizer directly." : "لطفاً مستقیماً با برگزارکننده تماس بگیرید.", + "Are you accepting the invitation?" : "آیا دعوت را میپذیرید؟", "Tentative" : "آزمایشی", - "Your attendance was updated successfully." : "Your attendance was updated successfully." + "Your attendance was updated successfully." : "وضعیت حضور شما با موفقیت بهروزرسانی شد." }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/dav/l10n/fa.json b/apps/dav/l10n/fa.json index 0248714b572..adb640cb47e 100644 --- a/apps/dav/l10n/fa.json +++ b/apps/dav/l10n/fa.json @@ -2,96 +2,170 @@ "Calendar" : "تقویم", "Tasks" : "وظایف", "Personal" : "شخصی", - "{actor} created calendar {calendar}" : "{actor} created calendar {calendar}", - "You created calendar {calendar}" : "تقویم ساخته شد", - "{actor} deleted calendar {calendar}" : "{actor} deleted calendar {calendar}", - "You deleted calendar {calendar}" : "You deleted calendar {calendar}", - "{actor} updated calendar {calendar}" : "{actor} updated calendar {calendar}", - "You updated calendar {calendar}" : "You updated calendar {calendar}", - "{actor} restored calendar {calendar}" : "{actor} restored calendar {calendar}", - "You restored calendar {calendar}" : "You restored calendar {calendar}", - "You shared calendar {calendar} as public link" : "You shared calendar {calendar} as public link", - "You removed public link for calendar {calendar}" : "You removed public link for calendar {calendar}", - "{actor} shared calendar {calendar} with you" : "{actor} shared calendar {calendar} with you", - "You shared calendar {calendar} with {user}" : "You shared calendar {calendar} with {user}", - "{actor} shared calendar {calendar} with {user}" : "{actor} shared calendar {calendar} with {user}", - "{actor} unshared calendar {calendar} from you" : "{actor} unshared calendar {calendar} from you", - "You unshared calendar {calendar} from {user}" : "You unshared calendar {calendar} from {user}", - "{actor} unshared calendar {calendar} from {user}" : "{actor} unshared calendar {calendar} from {user}", - "{actor} unshared calendar {calendar} from themselves" : "{actor} unshared calendar {calendar} from themselves", - "You shared calendar {calendar} with group {group}" : "You shared calendar {calendar} with group {group}", - "{actor} shared calendar {calendar} with group {group}" : "{actor} shared calendar {calendar} with group {group}", - "You unshared calendar {calendar} from group {group}" : "You unshared calendar {calendar} from group {group}", - "{actor} unshared calendar {calendar} from group {group}" : "{actor} unshared calendar {calendar} from group {group}", + "{actor} created calendar {calendar}" : "{actor} تقویم {calendar} را ایجاد کرد", + "You created calendar {calendar}" : "شما تقویم {calendar} را ایجاد کردید", + "{actor} deleted calendar {calendar}" : "{actor} تقویم {calendar} را حذف کرد", + "You deleted calendar {calendar}" : "شما تقویم {calendar} را حذف کردید", + "{actor} updated calendar {calendar}" : "{actor} تقویم {calendar} را بهروزرسانی کرد", + "You updated calendar {calendar}" : "شما تقویم {calendar} را بهروزرسانی کردید", + "{actor} restored calendar {calendar}" : "{actor} تقویم {calendar} را بازیابی کرد", + "You restored calendar {calendar}" : "شما تقویم {calendar} را بازیابی کردید", + "You shared calendar {calendar} as public link" : "شما تقویم {calendar} را بهعنوان پیوند عمومی به اشتراک گذاشتید", + "You removed public link for calendar {calendar}" : "شما پیوند عمومی تقویم {calendar} را حذف کردید", + "{actor} shared calendar {calendar} with you" : "{actor} تقویم {calendar} را با شما به اشتراک گذاشت", + "You shared calendar {calendar} with {user}" : "شما تقویم {calendar} را با {user} به اشتراک گذاشتید", + "{actor} shared calendar {calendar} with {user}" : "{actor} تقویم {calendar} را با {user} به اشتراک گذاشت", + "{actor} unshared calendar {calendar} from you" : "{actor} اشتراکگذاری تقویم {calendar} را از شما لغو کرد", + "You unshared calendar {calendar} from {user}" : "شما اشتراکگذاری تقویم {calendar} را از {user} لغو کردید", + "{actor} unshared calendar {calendar} from {user}" : "{actor} اشتراکگذاری تقویم {calendar} را از {user} لغو کرد", + "{actor} unshared calendar {calendar} from themselves" : "{actor} اشتراکگذاری تقویم {calendar} را از خود لغو کرد", + "You shared calendar {calendar} with group {group}" : "شما تقویم {calendar} را با گروه {group} به اشتراک گذاشتید", + "{actor} shared calendar {calendar} with group {group}" : "{actor} تقویم {calendar} را با گروه {group} به اشتراک گذاشت", + "You unshared calendar {calendar} from group {group}" : "شما اشتراکگذاری تقویم {calendar} را از گروه {group} لغو کردید", + "{actor} unshared calendar {calendar} from group {group}" : "{actor} اشتراکگذاری تقویم {calendar} را از گروه {group} لغو کرد", "Untitled event" : "رویداد بدون عنوان", - "{actor} created event {event} in calendar {calendar}" : "{actor} created event {event} in calendar {calendar}", - "You created event {event} in calendar {calendar}" : "You created event {event} in calendar {calendar}", - "{actor} deleted event {event} from calendar {calendar}" : "{actor} deleted event {event} from calendar {calendar}", - "You deleted event {event} from calendar {calendar}" : "You deleted event {event} from calendar {calendar}", - "{actor} updated event {event} in calendar {calendar}" : "{actor} updated event {event} in calendar {calendar}", - "You updated event {event} in calendar {calendar}" : "You updated event {event} in calendar {calendar}", - "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}", - "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}", - "{actor} restored event {event} of calendar {calendar}" : "{actor} restored event {event} of calendar {calendar}", - "You restored event {event} of calendar {calendar}" : "You restored event {event} of calendar {calendar}", + "{actor} created event {event} in calendar {calendar}" : "{actor} رویداد {event} را در تقویم {calendar} ایجاد کرد", + "You created event {event} in calendar {calendar}" : "شما رویداد {event} را در تقویم {calendar} ایجاد کردید", + "{actor} deleted event {event} from calendar {calendar}" : "{actor} رویداد {event} را از تقویم {calendar} حذف کرد", + "You deleted event {event} from calendar {calendar}" : "شما رویداد {event} را از تقویم {calendar} حذف کردید", + "{actor} updated event {event} in calendar {calendar}" : "{actor} رویداد {event} را در تقویم {calendar} بهروزرسانی کرد", + "You updated event {event} in calendar {calendar}" : "شما رویداد {event} را در تقویم {calendar} بهروزرسانی کردید", + "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} رویداد {event} را از تقویم {sourceCalendar} به تقویم {targetCalendar} منتقل کرد", + "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "شما رویداد {event} را از تقویم {sourceCalendar} به تقویم {targetCalendar} منتقل کردید", + "{actor} restored event {event} of calendar {calendar}" : "{actor} رویداد {event} را از تقویم {calendar} بازیابی کرد", + "You restored event {event} of calendar {calendar}" : "شما رویداد {event} را از تقویم {calendar} بازیابی کردید", "Busy" : "مشغول", - "{actor} created to-do {todo} in list {calendar}" : "{actor} created to-do {todo} in list {calendar}", - "You created to-do {todo} in list {calendar}" : "You created to-do {todo} in list {calendar}", - "{actor} deleted to-do {todo} from list {calendar}" : "{actor} deleted to-do {todo} from list {calendar}", - "You deleted to-do {todo} from list {calendar}" : "You deleted to-do {todo} from list {calendar}", - "{actor} updated to-do {todo} in list {calendar}" : "{actor} updated to-do {todo} in list {calendar}", - "You updated to-do {todo} in list {calendar}" : "You updated to-do {todo} in list {calendar}", - "{actor} solved to-do {todo} in list {calendar}" : "{actor} solved to-do {todo} in list {calendar}", - "You solved to-do {todo} in list {calendar}" : "You solved to-do {todo} in list {calendar}", - "{actor} reopened to-do {todo} in list {calendar}" : "{actor} reopened to-do {todo} in list {calendar}", - "You reopened to-do {todo} in list {calendar}" : "You reopened to-do {todo} in list {calendar}", - "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}", - "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}", - "Calendar, contacts and tasks" : "Calendar, contacts and tasks", - "A <strong>calendar</strong> was modified" : "یک تقویم تغییر کرد", - "A calendar <strong>event</strong> was modified" : "یک رویداد ثبت شده در تقویم تغییر کرد", - "A calendar <strong>to-do</strong> was modified" : "یک کار ثبت شده در تقویم تغییر کرد", - "Contact birthdays" : "Contact birthdays", - "Death of %s" : "Death of %s", + "{actor} created to-do {todo} in list {calendar}" : "{actor} کار {todo} را در لیست {calendar} ایجاد کرد", + "You created to-do {todo} in list {calendar}" : "شما کار {todo} را در لیست {calendar} ایجاد کردید", + "{actor} deleted to-do {todo} from list {calendar}" : "{actor} کار {todo} را از لیست {calendar} حذف کرد", + "You deleted to-do {todo} from list {calendar}" : "شما کار {todo} را از لیست {calendar} حذف کردید", + "{actor} updated to-do {todo} in list {calendar}" : "{actor} کار {todo} را در لیست {calendar} بهروزرسانی کرد", + "You updated to-do {todo} in list {calendar}" : "شما کار {todo} را در لیست {calendar} بهروزرسانی کردید", + "{actor} solved to-do {todo} in list {calendar}" : "{actor} کار {todo} را در لیست {calendar} حل کرد", + "You solved to-do {todo} in list {calendar}" : "شما کار {todo} را در لیست {calendar} حل کردید", + "{actor} reopened to-do {todo} in list {calendar}" : "{actor} کار {todo} را در لیست {calendar} بازگشایی کرد", + "You reopened to-do {todo} in list {calendar}" : "شما کار {todo} را در لیست {calendar} بازگشایی کردید", + "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} کار {todo} را از لیست {sourceCalendar} به لیست {targetCalendar} منتقل کرد", + "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "شما کار {todo} را از لیست {sourceCalendar} به لیست {targetCalendar} منتقل کردید", + "Calendar, contacts and tasks" : "تقویم، مخاطبین و وظایف", + "A <strong>calendar</strong> was modified" : "یک <strong>تقویم</strong> تغییر کرد", + "A calendar <strong>event</strong> was modified" : "یک <strong>رویداد</strong> تقویم تغییر کرد", + "A calendar <strong>to-do</strong> was modified" : "یک <strong>کار</strong> تقویم تغییر کرد", + "Contact birthdays" : "تولد مخاطبین", + "Death of %s" : "فوت %s", "Untitled calendar" : "تقویم بدون عنوان", - "Calendar:" : "Calendar:", + "Calendar:" : "تقویم:", "Date:" : "تاریخ:", "Where:" : "مکان:", "Description:" : "توضیحات:", - "_%n year_::_%n years_" : ["%n year","%n years"], - "_%n month_::_%n months_" : ["%n month","%n months"], - "_%n day_::_%n days_" : ["%n day","%n days"], - "_%n hour_::_%n hours_" : ["%n hour","%n hours"], - "_%n minute_::_%n minutes_" : ["%n minute","%n minutes"], - "%s (in %s)" : "%s (in %s)", - "%s (%s ago)" : "%s (%s ago)", - "Calendar: %s" : "Calendar: %s", - "Date: %s" : "Date: %s", - "Description: %s" : "Description: %s", - "Where: %s" : "Where: %s", + "_%n year_::_%n years_" : ["%n سال","%n سال"], + "_%n month_::_%n months_" : ["%n ماه","%n ماه"], + "_%n day_::_%n days_" : ["%n روز","%n روز"], + "_%n hour_::_%n hours_" : ["%n ساعت","%n ساعت"], + "_%n minute_::_%n minutes_" : ["%n دقیقه","%n دقیقه"], + "%s (in %s)" : "%s (در %s)", + "%s (%s ago)" : "%s (%s پیش)", + "Calendar: %s" : "تقویم: %s", + "Date: %s" : "تاریخ: %s", + "Description: %s" : "توضیحات: %s", + "Where: %s" : "مکان: %s", "%1$s via %2$s" : "%1$s از طریق %2$s", - "Cancelled: %1$s" : "Cancelled: %1$s", - "\"%1$s\" has been canceled" : "\"%1$s\" has been canceled", - "Re: %1$s" : "Re: %1$s", - "%1$s has accepted your invitation" : "%1$s has accepted your invitation", - "%1$s has tentatively accepted your invitation" : "%1$s has tentatively accepted your invitation", - "%1$s has declined your invitation" : "%1$s has declined your invitation", - "%1$s has responded to your invitation" : "%1$s has responded to your invitation", - "Invitation updated: %1$s" : "Invitation updated: %1$s", - "%1$s updated the event \"%2$s\"" : "%1$s updated the event \"%2$s\"", - "Invitation: %1$s" : "Invitation: %1$s", - "%1$s would like to invite you to \"%2$s\"" : "%1$s would like to invite you to \"%2$s\"", - "Organizer:" : "Organizer:", - "Attendees:" : "Attendees:", + "In the past on %1$s for the entire day" : "در گذشته در %1$s برای کل روز", + "_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["در یک دقیقه در %1$s برای کل روز","در %n دقیقه در %1$s برای کل روز"], + "_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["در یک ساعت در %1$s برای کل روز","در %n ساعت در %1$s برای کل روز"], + "_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["در یک روز در %1$s برای کل روز","در %n روز در %1$s برای کل روز"], + "_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["در یک هفته در %1$s برای کل روز","در %n هفته در %1$s برای کل روز"], + "_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["در یک ماه در %1$s برای کل روز","در %n ماه در %1$s برای کل روز"], + "_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["در یک سال در %1$s برای کل روز","در %n سال در %1$s برای کل روز"], + "In the past on %1$s between %2$s - %3$s" : "در گذشته در %1$s بین %2$s - %3$s", + "_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["در یک دقیقه در %1$s بین %2$s - %3$s","در %n دقیقه در %1$s بین %2$s - %3$s"], + "_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["در یک ساعت در %1$s بین %2$s - %3$s","در %n ساعت در %1$s بین %2$s - %3$s"], + "_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["در یک روز در %1$s بین %2$s - %3$s","در %n روز در %1$s بین %2$s - %3$s"], + "_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["در یک هفته در %1$s بین %2$s - %3$s","در %n هفته در %1$s بین %2$s - %3$s"], + "_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["در یک ماه در %1$s بین %2$s - %3$s","در %n ماه در %1$s بین %2$s - %3$s"], + "_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["در یک سال در %1$s بین %2$s - %3$s","در %n سال در %1$s بین %2$s - %3$s"], + "Could not generate when statement" : "امکان ایجاد عبارت زمان وجود ندارد", + "Every Day for the entire day" : "هر روز برای کل روز", + "Every Day for the entire day until %1$s" : "هر روز برای کل روز تا %1$s", + "Every Day between %1$s - %2$s" : "هر روز بین %1$s - %2$s", + "Every Day between %1$s - %2$s until %3$s" : "هر روز بین %1$s - %2$s تا %3$s", + "Every %1$d Days for the entire day" : "هر %1$d روز برای کل روز", + "Every %1$d Days for the entire day until %2$s" : "هر %1$d روز برای کل روز تا %2$s", + "Every %1$d Days between %2$s - %3$s" : "هر %1$d روز بین %2$s - %3$s", + "Every %1$d Days between %2$s - %3$s until %4$s" : "هر %1$d روز بین %2$s - %3$s تا %4$s", + "Could not generate event recurrence statement" : "امکان ایجاد عبارت تکرار رویداد وجود ندارد", + "Every Week on %1$s for the entire day" : "هر هفته در %1$s برای کل روز", + "Every Week on %1$s for the entire day until %2$s" : "هر هفته در %1$s برای کل روز تا %2$s", + "Every Week on %1$s between %2$s - %3$s" : "هر هفته در %1$s بین %2$s - %3$s", + "Every Week on %1$s between %2$s - %3$s until %4$s" : "هر هفته در %1$s بین %2$s - %3$s تا %4$s", + "Every %1$d Weeks on %2$s for the entire day" : "هر %1$d هفته در %2$s برای کل روز", + "Every %1$d Weeks on %2$s for the entire day until %3$s" : "هر %1$d هفته در %2$s برای کل روز تا %3$s", + "Every %1$d Weeks on %2$s between %3$s - %4$s" : "هر %1$d هفته در %2$s بین %3$s - %4$s", + "Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "هر %1$d هفته در %2$s بین %3$s - %4$s تا %5$s", + "Every Month on the %1$s for the entire day" : "هر ماه در %1$s برای کل روز", + "Every Month on the %1$s for the entire day until %2$s" : "هر ماه در %1$s برای کل روز تا %2$s", + "Every Month on the %1$s between %2$s - %3$s" : "هر ماه در %1$s بین %2$s - %3$s", + "Every Month on the %1$s between %2$s - %3$s until %4$s" : "هر ماه در %1$s بین %2$s - %3$s تا %4$s", + "Every %1$d Months on the %2$s for the entire day" : "هر %1$d ماه در %2$s برای کل روز", + "Every %1$d Months on the %2$s for the entire day until %3$s" : "هر %1$d ماه در %2$s برای کل روز تا %3$s", + "Every %1$d Months on the %2$s between %3$s - %4$s" : "هر %1$d ماه در %2$s بین %3$s - %4$s", + "Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "هر %1$d ماه در %2$s بین %3$s - %4$s تا %5$s", + "Every Year in %1$s on the %2$s for the entire day" : "هر سال در %1$s در %2$s برای کل روز", + "Every Year in %1$s on the %2$s for the entire day until %3$s" : "هر سال در %1$s در %2$s برای کل روز تا %3$s", + "Every Year in %1$s on the %2$s between %3$s - %4$s" : "هر سال در %1$s در %2$s بین %3$s - %4$s", + "Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "هر سال در %1$s در %2$s بین %3$s - %4$s تا %5$s", + "Every %1$d Years in %2$s on the %3$s for the entire day" : "هر %1$d سال در %2$s در %3$s برای کل روز", + "Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "هر %1$d سال در %2$s در %3$s برای کل روز تا %4$s", + "Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "هر %1$d سال در %2$s در %3$s بین %4$s - %5$s", + "Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "هر %1$d سال در %2$s در %3$s بین %4$s - %5$s تا %6$s", + "On specific dates for the entire day until %1$s" : "در تاریخهای مشخص برای کل روز تا %1$s", + "On specific dates between %1$s - %2$s until %3$s" : "در تاریخهای مشخص بین %1$s - %2$s تا %3$s", + "In the past on %1$s" : "در گذشته در %1$s", + "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["در یک دقیقه در %1$s","در %n دقیقه در %1$s"], + "_In a hour on %1$s_::_In %n hours on %1$s_" : ["در یک ساعت در %1$s","در %n ساعت در %1$s"], + "_In a day on %1$s_::_In %n days on %1$s_" : ["در یک روز در %1$s","در %n روز در %1$s"], + "_In a week on %1$s_::_In %n weeks on %1$s_" : ["در یک هفته در %1$s","در %n هفته در %1$s"], + "_In a month on %1$s_::_In %n months on %1$s_" : ["در یک ماه در %1$s","در %n ماه در %1$s"], + "_In a year on %1$s_::_In %n years on %1$s_" : ["در یک سال در %1$s","در %n سال در %1$s"], + "In the past on %1$s then on %2$s" : "در گذشته در %1$s سپس در %2$s", + "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["در یک دقیقه در %1$s سپس در %2$s","در %n دقیقه در %1$s سپس در %2$s"], + "_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["در یک ساعت در %1$s سپس در %2$s","در %n ساعت در %1$s سپس در %2$s"], + "_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["در یک روز در %1$s سپس در %2$s","در %n روز در %1$s سپس در %2$s"], + "_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["در یک هفته در %1$s سپس در %2$s","در %n هفته در %1$s سپس در %2$s"], + "_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["در یک ماه در %1$s سپس در %2$s","در %n ماه در %1$s سپس در %2$s"], + "_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["در یک سال در %1$s سپس در %2$s","در %n سال در %1$s سپس در %2$s"], + "In the past on %1$s then on %2$s and %3$s" : "در گذشته در %1$s سپس در %2$s و %3$s", + "_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["در یک دقیقه در %1$s سپس در %2$s و %3$s","در %n دقیقه در %1$s سپس در %2$s و %3$s"], + "_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["در یک ساعت در %1$s سپس در %2$s و %3$s","در %n ساعت در %1$s سپس در %2$s و %3$s"], + "_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["در یک روز در %1$s سپس در %2$s و %3$s","در %n روز در %1$s سپس در %2$s و %3$s"], + "_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["در یک هفته در %1$s سپس در %2$s و %3$s","در %n هفته در %1$s سپس در %2$s و %3$s"], + "_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["در یک ماه در %1$s سپس در %2$s و %3$s","در %n ماه در %1$s سپس در %2$s و %3$s"], + "_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["در یک سال در %1$s سپس در %2$s و %3$s","در %n سال در %1$s سپس در %2$s و %3$s"], + "Could not generate next recurrence statement" : "امکان ایجاد عبارت تکرار بعدی وجود ندارد", + "Cancelled: %1$s" : "لغو شد: %1$s", + "\"%1$s\" has been canceled" : "\"%1$s\" لغو شده است", + "Re: %1$s" : "پاسخ: %1$s", + "%1$s has accepted your invitation" : "%1$s دعوت شما را پذیرفته است", + "%1$s has tentatively accepted your invitation" : "%1$s دعوت شما را بهطور آزمایشی پذیرفته است", + "%1$s has declined your invitation" : "%1$s دعوت شما را رد کرده است", + "%1$s has responded to your invitation" : "%1$s به دعوت شما پاسخ داده است", + "Invitation updated: %1$s" : "دعوت بهروزرسانی شد: %1$s", + "%1$s updated the event \"%2$s\"" : "%1$s رویداد \"%2$s\" را بهروزرسانی کرد", + "Invitation: %1$s" : "دعوت: %1$s", + "%1$s would like to invite you to \"%2$s\"" : "%1$s مایل است شما را به \"%2$s\" دعوت کند", + "Organizer:" : "برگزارکننده:", + "Attendees:" : "شرکتکنندگان:", "Title:" : "عنوان:", + "When:" : "چه زمانی:", "Location:" : "مکان:", - "Link:" : "Link:", - "Accept" : "قبول", - "Decline" : "کاهش می یابد", - "More options …" : "More options …", - "More options at %s" : "More options at %s", + "Link:" : "پیوند:", + "Occurring:" : "در حال وقوع:", + "Accept" : "پذیرفتن", + "Decline" : "رد کردن", + "More options …" : "گزینههای بیشتر…", + "More options at %s" : "گزینههای بیشتر در %s", "Monday" : "دوشنبه", - "Tuesday" : "سه شنبه", + "Tuesday" : "سهشنبه", "Wednesday" : "چهارشنبه", "Thursday" : "پنجشنبه", "Friday" : "جمعه", @@ -103,101 +177,150 @@ "April" : "آوریل", "May" : "مه", "June" : "ژوئن", - "July" : "جولای", + "July" : "ژوئیه", "August" : "اوت", "September" : "سپتامبر", "October" : "اکتبر", "November" : "نوامبر", "December" : "دسامبر", - "First" : "First", - "Last" : "Last", + "First" : "اول", + "Second" : "دوم", + "Third" : "سوم", + "Fourth" : "چهارم", + "Fifth" : "پنجم", + "Last" : "آخر", + "Second Last" : "دومی از آخر", + "Third Last" : "سومی از آخر", + "Fourth Last" : "چهارمی از آخر", + "Fifth Last" : "پنجمی از آخر", "Contacts" : "مخاطبین", - "{actor} created address book {addressbook}" : "{actor} created address book {addressbook}", - "You created address book {addressbook}" : "دفترچه آدرس ساخته شد", - "{actor} deleted address book {addressbook}" : "{actor} deleted address book {addressbook}", - "You deleted address book {addressbook}" : "You deleted address book {addressbook}", - "{actor} updated address book {addressbook}" : "{actor} updated address book {addressbook}", - "You updated address book {addressbook}" : "You updated address book {addressbook}", - "{actor} shared address book {addressbook} with you" : "{actor} shared address book {addressbook} with you", - "You shared address book {addressbook} with {user}" : "You shared address book {addressbook} with {user}", - "{actor} shared address book {addressbook} with {user}" : "{actor} shared address book {addressbook} with {user}", - "{actor} unshared address book {addressbook} from you" : "{actor} unshared address book {addressbook} from you", - "You unshared address book {addressbook} from {user}" : "You unshared address book {addressbook} from {user}", - "{actor} unshared address book {addressbook} from {user}" : "{actor} unshared address book {addressbook} from {user}", - "{actor} unshared address book {addressbook} from themselves" : "{actor} unshared address book {addressbook} from themselves", - "You shared address book {addressbook} with group {group}" : "You shared address book {addressbook} with group {group}", - "{actor} shared address book {addressbook} with group {group}" : "{actor} shared address book {addressbook} with group {group}", - "You unshared address book {addressbook} from group {group}" : "You unshared address book {addressbook} from group {group}", - "{actor} unshared address book {addressbook} from group {group}" : "{actor} unshared address book {addressbook} from group {group}", - "{actor} created contact {card} in address book {addressbook}" : "{actor} created contact {card} in address book {addressbook}", - "You created contact {card} in address book {addressbook}" : "You created contact {card} in address book {addressbook}", - "{actor} deleted contact {card} from address book {addressbook}" : "{actor} deleted contact {card} from address book {addressbook}", - "You deleted contact {card} from address book {addressbook}" : "You deleted contact {card} from address book {addressbook}", - "{actor} updated contact {card} in address book {addressbook}" : "{actor} updated contact {card} in address book {addressbook}", - "You updated contact {card} in address book {addressbook}" : "You updated contact {card} in address book {addressbook}", - "A <strong>contact</strong> or <strong>address book</strong> was modified" : "یک مخاطب یا دفترچه آدرس تغییر کرد", + "{actor} created address book {addressbook}" : "{actor} دفترچه آدرس {addressbook} را ایجاد کرد", + "You created address book {addressbook}" : "شما دفترچه آدرس {addressbook} را ایجاد کردید", + "{actor} deleted address book {addressbook}" : "{actor} دفترچه آدرس {addressbook} را حذف کرد", + "You deleted address book {addressbook}" : "شما دفترچه آدرس {addressbook} را حذف کردید", + "{actor} updated address book {addressbook}" : "{actor} دفترچه آدرس {addressbook} را بهروزرسانی کرد", + "You updated address book {addressbook}" : "شما دفترچه آدرس {addressbook} را بهروزرسانی کردید", + "{actor} shared address book {addressbook} with you" : "{actor} دفترچه آدرس {addressbook} را با شما به اشتراک گذاشت", + "You shared address book {addressbook} with {user}" : "شما دفترچه آدرس {addressbook} را با {user} به اشتراک گذاشتید", + "{actor} shared address book {addressbook} with {user}" : "{actor} دفترچه آدرس {addressbook} را با {user} به اشتراک گذاشت", + "{actor} unshared address book {addressbook} from you" : "{actor} اشتراکگذاری دفترچه آدرس {addressbook} را از شما لغو کرد", + "You unshared address book {addressbook} from {user}" : "شما اشتراکگذاری دفترچه آدرس {addressbook} را از {user} لغو کردید", + "{actor} unshared address book {addressbook} from {user}" : "{actor} اشتراکگذاری دفترچه آدرس {addressbook} را از {user} لغو کرد", + "{actor} unshared address book {addressbook} from themselves" : "{actor} اشتراکگذاری دفترچه آدرس {addressbook} را از خود لغو کرد", + "You shared address book {addressbook} with group {group}" : "شما دفترچه آدرس {addressbook} را با گروه {group} به اشتراک گذاشتید", + "{actor} shared address book {addressbook} with group {group}" : "{actor} دفترچه آدرس {addressbook} را با گروه {group} به اشتراک گذاشت", + "You unshared address book {addressbook} from group {group}" : "شما اشتراکگذاری دفترچه آدرس {addressbook} را از گروه {group} لغو کردید", + "{actor} unshared address book {addressbook} from group {group}" : "{actor} اشتراکگذاری دفترچه آدرس {addressbook} را از گروه {group} لغو کرد", + "{actor} created contact {card} in address book {addressbook}" : "{actor} مخاطب {card} را در دفترچه آدرس {addressbook} ایجاد کرد", + "You created contact {card} in address book {addressbook}" : "شما مخاطب {card} را در دفترچه آدرس {addressbook} ایجاد کردید", + "{actor} deleted contact {card} from address book {addressbook}" : "{actor} مخاطب {card} را از دفترچه آدرس {addressbook} حذف کرد", + "You deleted contact {card} from address book {addressbook}" : "شما مخاطب {card} را از دفترچه آدرس {addressbook} حذف کردید", + "{actor} updated contact {card} in address book {addressbook}" : "{actor} مخاطب {card} را در دفترچه آدرس {addressbook} بهروزرسانی کرد", + "You updated contact {card} in address book {addressbook}" : "شما مخاطب {card} را در دفترچه آدرس {addressbook} بهروزرسانی کردید", + "A <strong>contact</strong> or <strong>address book</strong> was modified" : "یک <strong>مخاطب</strong> یا <strong>دفترچه آدرس</strong> تغییر کرد", "Accounts" : "حسابها", - "File is not updatable: %1$s" : "File is not updatable: %1$s", - "Could not write to final file, canceled by hook" : "Could not write to final file, canceled by hook", - "Could not write file contents" : "Could not write file contents", - "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], - "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)", - "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side.", - "Could not rename part file to final file, canceled by hook" : "Could not rename part file to final file, canceled by hook", - "Could not rename part file to final file" : "Could not rename part file to final file", - "Failed to check file size: %1$s" : "Failed to check file size: %1$s", - "Encryption not ready: %1$s" : "Encryption not ready: %1$s", - "Failed to open file: %1$s" : "Failed to open file: %1$s", - "Failed to unlink: %1$s" : "Failed to unlink: %1$s", - "Failed to write file contents: %1$s" : "Failed to write file contents: %1$s", - "File not found: %1$s" : "File not found: %1$s", - "System is in maintenance mode." : "System is in maintenance mode.", - "Upgrade needed" : "Upgrade needed", - "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS.", - "Configures a CalDAV account" : "Configures a CalDAV account", - "Configures a CardDAV account" : "Configures a CardDAV account", - "Events" : "Events", + "System address book which holds all accounts" : "دفترچه آدرس سیستمی که شامل تمام حسابها است", + "File is not updatable: %1$s" : "فایل قابل بهروزرسانی نیست: %1$s", + "Failed to get storage for file" : "دریافت فضای ذخیرهسازی برای فایل با شکست مواجه شد", + "Could not write to final file, canceled by hook" : "نوشتن در فایل نهایی امکانپذیر نبود، توسط هوک لغو شد", + "Could not write file contents" : "امکان نوشتن محتویات فایل وجود ندارد", + "_%n byte_::_%n bytes_" : ["%n بایت","%n بایت"], + "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "خطا هنگام کپی فایل به مکان مقصد (کپی شده: %1$s، حجم فایل مورد انتظار: %2$s)", + "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "حجم فایل مورد انتظار %1$s بود اما %2$s خوانده (از کلاینت Nextcloud) و نوشته (در فضای ذخیرهسازی Nextcloud) شد. این میتواند ناشی از مشکل شبکه در سمت ارسال یا مشکل نوشتن در فضای ذخیرهسازی در سمت سرور باشد.", + "Could not rename part file to final file, canceled by hook" : "امکان تغییر نام فایل جزئی به فایل نهایی وجود نداشت، توسط هوک لغو شد", + "Could not rename part file to final file" : "امکان تغییر نام فایل جزئی به فایل نهایی وجود ندارد", + "Failed to check file size: %1$s" : "بررسی حجم فایل با شکست مواجه شد: %1$s", + "Could not open file: %1$s, file does seem to exist" : "امکان باز کردن فایل وجود ندارد: %1$s، به نظر میرسد فایل وجود دارد", + "Could not open file: %1$s, file doesn't seem to exist" : "امکان باز کردن فایل وجود ندارد: %1$s، به نظر میرسد فایل وجود ندارد", + "Encryption not ready: %1$s" : "رمزگذاری آماده نیست: %1$s", + "Failed to open file: %1$s" : "باز کردن فایل با شکست مواجه شد: %1$s", + "Failed to unlink: %1$s" : "حذف پیوند با شکست مواجه شد: %1$s", + "Failed to write file contents: %1$s" : "نوشتن محتویات فایل با شکست مواجه شد: %1$s", + "File not found: %1$s" : "فایل یافت نشد: %1$s", + "Invalid target path" : "مسیر مقصد نامعتبر است", + "System is in maintenance mode." : "سیستم در حالت نگهداری است.", + "Upgrade needed" : "نیاز به ارتقا", + "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "برای استفاده از CalDAV و CardDAV با iOS/macOS، %s شما باید برای استفاده از HTTPS پیکربندی شود.", + "Configures a CalDAV account" : "یک حساب CalDAV را پیکربندی میکند", + "Configures a CardDAV account" : "یک حساب CardDAV را پیکربندی میکند", + "Events" : "رویدادها", "Untitled task" : "کار بدون عنوان", - "Completed on %s" : "Completed on %s", - "Due on %s by %s" : "Due on %s by %s", - "Due on %s" : "Due on %s", - "WebDAV endpoint" : "WebDAV endpoint", - "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken.", - "Migrated calendar (%1$s)" : "Migrated calendar (%1$s)", - "Calendars including events, details and attendees" : "Calendars including events, details and attendees", - "Contacts and groups" : "Contacts and groups", - "WebDAV" : "WebDAV", - "First day" : "First day", + "Completed on %s" : "تکمیل شده در %s", + "Due on %s by %s" : "موعد در %s توسط %s", + "Due on %s" : "موعد در %s", + "System Address Book" : "دفترچه آدرس سیستم", + "The system address book contains contact information for all users in your instance." : "دفترچه آدرس سیستم شامل اطلاعات تماس برای همه کاربران در نمونه شما است.", + "Enable System Address Book" : "فعال کردن دفترچه آدرس سیستم", + "DAV system address book" : "دفترچه آدرس سیستم DAV", + "No outstanding DAV system address book sync." : "هیچ همگامسازی دفترچه آدرس سیستم DAV در انتظار نیست.", + "The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "همگامسازی دفترچه آدرس سیستم DAV هنوز اجرا نشده است زیرا نمونه شما بیش از ۱۰۰۰ کاربر دارد یا خطایی رخ داده است. لطفاً آن را بهصورت دستی با فراخوانی \"occ dav:sync-system-addressbook\" اجرا کنید.", + "WebDAV endpoint" : "نقطه پایانی WebDAV", + "Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "امکان بررسی اینکه سرور وب شما به درستی برای همگامسازی فایل از طریق WebDAV تنظیم شده است، وجود ندارد. لطفاً به صورت دستی بررسی کنید.", + "Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "سرور وب شما هنوز به درستی برای همگامسازی فایل تنظیم نشده است، زیرا به نظر میرسد رابط WebDAV خراب است.", + "Your web server is properly set up to allow file synchronization over WebDAV." : "سرور وب شما به درستی برای همگامسازی فایل از طریق WebDAV تنظیم شده است.", + "Migrated calendar (%1$s)" : "تقویم منتقل شده (%1$s)", + "Calendars including events, details and attendees" : "تقویمها شامل رویدادها، جزئیات و شرکتکنندگان", + "Contacts and groups" : "مخاطبین و گروهها", + "WebDAV" : "وبدَو", + "Absence saved" : "غیبت ذخیره شد", + "Failed to save your absence settings" : "ذخیره تنظیمات غیبت شما با شکست مواجه شد", + "Absence cleared" : "غیبت پاک شد", + "Failed to clear your absence settings" : "پاک کردن تنظیمات غیبت شما با شکست مواجه شد", + "First day" : "روز اول", + "Last day (inclusive)" : "روز آخر (شامل)", + "Out of office replacement (optional)" : "جایگزین خارج از دفتر (اختیاری)", + "Name of the replacement" : "نام جایگزین", + "No results." : "نتیجهای یافت نشد.", + "Start typing." : "شروع به تایپ کنید.", + "Short absence status" : "وضعیت کوتاه غیبت", + "Long absence Message" : "پیام طولانی غیبت", "Save" : "ذخیره", - "Failed to load availability" : "Failed to load availability", - "Saved availability" : "Saved availability", - "Failed to save availability" : "Failed to save availability", + "Disable absence" : "غیرفعال کردن غیبت", + "Failed to load availability" : "بارگذاری در دسترس بودن با شکست مواجه شد", + "Saved availability" : "در دسترس بودن ذخیره شد", + "Failed to save availability" : "ذخیره در دسترس بودن با شکست مواجه شد", "Time zone:" : "منطقه زمانی:", - "to" : "به", - "Delete slot" : "Delete slot", + "to" : "تا", + "Delete slot" : "حذف بازه زمانی", "No working hours set" : "ساعات کاری تعیین نشده است", - "Add slot" : "Add slot", - "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "وضعیت کاربر بصورت خودکار به \"مزاحم نشوید\" تغییر داده شود تا همه ی اعلان ها خاموش شوند", - "Availability" : "موجود بودن", - "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}.", - "Please make sure to properly set up {emailopen}the email server{linkclose}." : "Please make sure to properly set up {emailopen}the email server{linkclose}.", - "Calendar server" : "Calendar server", - "Send invitations to attendees" : "Send invitations to attendees", - "Automatically generate a birthday calendar" : "Automatically generate a birthday calendar", - "Birthday calendars will be generated by a background job." : "Birthday calendars will be generated by a background job.", - "Hence they will not be available immediately after enabling but will show up after some time." : "Hence they will not be available immediately after enabling but will show up after some time.", - "Send notifications for events" : "Send notifications for events", - "Notifications are sent via background jobs, so these must occur often enough." : "Notifications are sent via background jobs, so these must occur often enough.", - "Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well", - "Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.", - "Enable notifications for events via push" : "Enable notifications for events via push", - "Cancel" : "ردکردن", + "Add slot" : "افزودن بازه زمانی", + "Weekdays" : "روزهای هفته", + "Pick a start time for {dayName}" : "زمان شروع برای {dayName} را انتخاب کنید", + "Pick a end time for {dayName}" : "زمان پایان برای {dayName} را انتخاب کنید", + "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "وضعیت کاربر بصورت خودکار به \"مزاحم نشوید\" تغییر داده شود تا همه ی اعلان ها خاموش شوند.", + "Availability" : "در دسترس بودن", + "If you configure your working hours, other people will see when you are out of office when they book a meeting." : "اگر ساعات کاری خود را پیکربندی کنید، دیگران هنگام رزرو جلسه متوجه خواهند شد که شما در دفتر نیستید.", + "Absence" : "غیبت", + "Configure your next absence period." : "دوره غیبت بعدی خود را پیکربندی کنید.", + "Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "همچنین {calendarappstoreopen}برنامه تقویم{linkclose} را نصب کنید، یا {calendardocopen}دسکتاپ و موبایل خود را برای همگامسازی متصل کنید ↗{linkclose}.", + "Please make sure to properly set up {emailopen}the email server{linkclose}." : "لطفاً مطمئن شوید که {emailopen}سرور ایمیل{linkclose} را به درستی تنظیم کردهاید.", + "Calendar server" : "سرور تقویم", + "Send invitations to attendees" : "ارسال دعوتنامهها به شرکتکنندگان", + "Automatically generate a birthday calendar" : "بهطور خودکار یک تقویم تولد ایجاد کنید", + "Birthday calendars will be generated by a background job." : "تقویمهای تولد توسط یک کار پسزمینه ایجاد خواهند شد.", + "Hence they will not be available immediately after enabling but will show up after some time." : "بنابراین بلافاصله پس از فعالسازی در دسترس نخواهند بود، اما پس از مدتی نمایان میشوند.", + "Send notifications for events" : "ارسال اعلانها برای رویدادها", + "Notifications are sent via background jobs, so these must occur often enough." : "اعلانها از طریق کارهای پسزمینه ارسال میشوند، بنابراین این کارها باید به اندازه کافی مکرر انجام شوند.", + "Send reminder notifications to calendar sharees as well" : "ارسال اعلانهای یادآوری به اشتراکگذاران تقویم نیز", + "Reminders are always sent to organizers and attendees." : "یادآوریها همیشه برای برگزارکنندگان و شرکتکنندگان ارسال میشوند.", + "Enable notifications for events via push" : "فعال کردن اعلانها برای رویدادها از طریق پوش", + "Cancel" : "لغو", "Import" : "وارد کردن", - "Error while saving settings" : "Error while saving settings", - "There was an error updating your attendance status." : "There was an error updating your attendance status.", - "Please contact the organizer directly." : "Please contact the organizer directly.", - "Are you accepting the invitation?" : "Are you accepting the invitation?", + "Error while saving settings" : "خطا هنگام ذخیره تنظیمات", + "Contact reset successfully" : "مخاطب با موفقیت بازنشانی شد", + "Error while resetting contact" : "خطا هنگام بازنشانی مخاطب", + "Contact imported successfully" : "مخاطب با موفقیت وارد شد", + "Error while importing contact" : "خطا هنگام وارد کردن مخاطب", + "Example Content" : "محتوای نمونه", + "Set example content to be created on new user first login." : "محتوای نمونه را برای ایجاد در اولین ورود کاربر جدید تنظیم کنید.", + "Import contact" : "وارد کردن مخاطب", + "Reset to default contact" : "بازنشانی به مخاطب پیشفرض", + "Import contacts" : "وارد کردن مخاطبین", + "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "وارد کردن یک فایل .vcf جدید، مخاطب پیشفرض موجود را حذف کرده و آن را با مخاطب جدید جایگزین میکند. آیا میخواهید ادامه دهید؟", + "There was an error updating your attendance status." : "خطایی در بهروزرسانی وضعیت حضور شما رخ داد.", + "Please contact the organizer directly." : "لطفاً مستقیماً با برگزارکننده تماس بگیرید.", + "Are you accepting the invitation?" : "آیا دعوت را میپذیرید؟", "Tentative" : "آزمایشی", - "Your attendance was updated successfully." : "Your attendance was updated successfully." + "Your attendance was updated successfully." : "وضعیت حضور شما با موفقیت بهروزرسانی شد." },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/dav/lib/CalDAV/Activity/Provider/Event.php b/apps/dav/lib/CalDAV/Activity/Provider/Event.php index 41b610542df..f498a47a0b4 100644 --- a/apps/dav/lib/CalDAV/Activity/Provider/Event.php +++ b/apps/dav/lib/CalDAV/Activity/Provider/Event.php @@ -78,14 +78,9 @@ class Event extends Base { // as seen from the affected user. $objectId = base64_encode($this->url->getWebroot() . '/remote.php/dav/calendars/' . $affectedUser . '/' . $calendarUri . '_shared_by_' . $linkData['owner'] . '/' . $linkData['object_uri']); } - $link = [ - 'view' => 'dayGridMonth', - 'timeRange' => 'now', - 'mode' => 'sidebar', + $params['link'] = $this->url->linkToRouteAbsolute('calendar.view.indexdirect.edit', [ 'objectId' => $objectId, - 'recurrenceId' => 'next' - ]; - $params['link'] = $this->url->linkToRouteAbsolute('calendar.view.indexview.timerange.edit', $link); + ]); } catch (\Exception $error) { // Do nothing } diff --git a/apps/dav/lib/CalDAV/CachedSubscriptionImpl.php b/apps/dav/lib/CalDAV/CachedSubscriptionImpl.php index 74efebb6e2a..cc1bab6d4fc 100644 --- a/apps/dav/lib/CalDAV/CachedSubscriptionImpl.php +++ b/apps/dav/lib/CalDAV/CachedSubscriptionImpl.php @@ -55,16 +55,6 @@ class CachedSubscriptionImpl implements ICalendar, ICalendarIsEnabled, ICalendar return $this->calendarInfo['{http://apple.com/ns/ical/}calendar-color']; } - /** - * @param string $pattern which should match within the $searchProperties - * @param array $searchProperties defines the properties within the query pattern should match - * @param array $options - optional parameters: - * ['timerange' => ['start' => new DateTime(...), 'end' => new DateTime(...)]] - * @param int|null $limit - limit number of search results - * @param int|null $offset - offset for paging of search results - * @return array an array of events/journals/todos which are arrays of key-value-pairs - * @since 13.0.0 - */ public function search(string $pattern, array $searchProperties = [], array $options = [], $limit = null, $offset = null): array { return $this->backend->search($this->calendarInfo, $pattern, $searchProperties, $options, $limit, $offset); } diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 5643e89d797..1c2b4e54c03 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -1538,25 +1538,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription }, $this->db); } - - /** - * @param int $calendarObjectId - * @param int $classification - */ - public function setClassification($calendarObjectId, $classification) { - $this->cachedObjects = []; - if (!in_array($classification, [ - self::CLASSIFICATION_PUBLIC, self::CLASSIFICATION_PRIVATE, self::CLASSIFICATION_CONFIDENTIAL - ])) { - throw new \InvalidArgumentException(); - } - $query = $this->db->getQueryBuilder(); - $query->update('calendarobjects') - ->set('classification', $query->createNamedParameter($classification)) - ->where($query->expr()->eq('id', $query->createNamedParameter($calendarObjectId))) - ->executeStatement(); - } - /** * Deletes an existing calendar object. * diff --git a/apps/dav/lib/CalDAV/CalendarImpl.php b/apps/dav/lib/CalDAV/CalendarImpl.php index d36f46df901..b79bf7ea2d0 100644 --- a/apps/dav/lib/CalDAV/CalendarImpl.php +++ b/apps/dav/lib/CalDAV/CalendarImpl.php @@ -93,16 +93,6 @@ class CalendarImpl implements ICreateFromString, IHandleImipMessage, ICalendarIs return $vtimezone; } - /** - * @param string $pattern which should match within the $searchProperties - * @param array $searchProperties defines the properties within the query pattern should match - * @param array $options - optional parameters: - * ['timerange' => ['start' => new DateTime(...), 'end' => new DateTime(...)]] - * @param int|null $limit - limit number of search results - * @param int|null $offset - offset for paging of search results - * @return array an array of events/journals/todos which are arrays of key-value-pairs - * @since 13.0.0 - */ public function search(string $pattern, array $searchProperties = [], array $options = [], $limit = null, $offset = null): array { return $this->backend->search($this->calendarInfo, $pattern, $searchProperties, $options, $limit, $offset); diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index de209754ae4..d874ca2ce2b 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -127,7 +127,6 @@ class CardDavBackend implements BackendInterface, SyncSupport { // query for shared addressbooks $principals = $this->principalBackend->getGroupMembership($principalUriOriginal, true); - $principals = array_merge($principals, $this->principalBackend->getCircleMembership($principalUriOriginal)); $principals[] = $principalUri; diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php index 98e0f2e9e4b..218d38e1c4b 100644 --- a/apps/dav/lib/Connector/Sabre/File.php +++ b/apps/dav/lib/Connector/Sabre/File.php @@ -216,7 +216,9 @@ class File extends Node implements IFile { try { /** @var IWriteStreamStorage $partStorage */ $count = $partStorage->writeStream($internalPartPath, $wrappedData); - } catch (GenericFileException) { + } catch (GenericFileException $e) { + $logger = Server::get(LoggerInterface::class); + $logger->error('Error while writing stream to storage: ' . $e->getMessage(), ['exception' => $e, 'app' => 'webdav']); $result = $isEOF; if (is_resource($wrappedData)) { $result = feof($wrappedData); diff --git a/apps/dav/openapi.json b/apps/dav/openapi.json index 48d6ae03ee0..27904636def 100644 --- a/apps/dav/openapi.json +++ b/apps/dav/openapi.json @@ -399,7 +399,8 @@ "description": "location/URL to filter by", "schema": { "type": "string", - "nullable": true + "nullable": true, + "default": null } }, { diff --git a/apps/dav/tests/unit/CalDAV/Activity/Provider/EventTest.php b/apps/dav/tests/unit/CalDAV/Activity/Provider/EventTest.php index 748360adf79..52d3dfa64cb 100644 --- a/apps/dav/tests/unit/CalDAV/Activity/Provider/EventTest.php +++ b/apps/dav/tests/unit/CalDAV/Activity/Provider/EventTest.php @@ -75,11 +75,7 @@ class EventTest extends TestCase { if ($link) { $affectedUser = $link['owner']; $generatedLink = [ - 'view' => 'dayGridMonth', - 'timeRange' => 'now', - 'mode' => 'sidebar', 'objectId' => base64_encode('/remote.php/dav/calendars/' . $link['owner'] . '/' . $link['calendar_uri'] . '/' . $link['object_uri']), - 'recurrenceId' => 'next' ]; $this->appManager->expects($this->once()) ->method('isEnabledForUser') @@ -90,7 +86,7 @@ class EventTest extends TestCase { ->method('getWebroot'); $this->url->expects($this->once()) ->method('linkToRouteAbsolute') - ->with('calendar.view.indexview.timerange.edit', $generatedLink) + ->with('calendar.view.indexdirect.edit', $generatedLink) ->willReturn('fullLink'); } } @@ -159,11 +155,7 @@ class EventTest extends TestCase { */ public function testGenerateObjectParameterLinkEncoding(array $link, string $objectId): void { $generatedLink = [ - 'view' => 'dayGridMonth', - 'timeRange' => 'now', - 'mode' => 'sidebar', 'objectId' => $objectId, - 'recurrenceId' => 'next' ]; $this->appManager->expects($this->once()) ->method('isEnabledForUser') @@ -173,7 +165,7 @@ class EventTest extends TestCase { ->method('getWebroot'); $this->url->expects($this->once()) ->method('linkToRouteAbsolute') - ->with('calendar.view.indexview.timerange.edit', $generatedLink) + ->with('calendar.view.indexdirect.edit', $generatedLink) ->willReturn('fullLink'); $objectParameter = ['id' => 42, 'name' => 'calendar', 'link' => $link]; $result = [ diff --git a/apps/federatedfilesharing/l10n/fa.js b/apps/federatedfilesharing/l10n/fa.js index 08abe157524..a50cb263c88 100644 --- a/apps/federatedfilesharing/l10n/fa.js +++ b/apps/federatedfilesharing/l10n/fa.js @@ -8,6 +8,7 @@ OC.L10N.register( "Federated Share request sent, you will receive an invitation. Check your notifications." : "درخواست اشتراک فدرال ارسال شد، یک دعوت نامه دریافت خواهید کرد. اعلان های خود را بررسی کنید.", "Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "نمیتوان یک اشتراک فدرال ایجاد کرد، به نظر میرسد سروری که باید با آن فدرال شود خیلی قدیمی است (Nextcloud <= 9).", "It is not allowed to send federated group shares from this server." : "ارسال اشتراک های گروه فدرال از این سرور مجاز نیست.", + "Sharing %1$s failed, because this item is already shared with the account %2$s" : "اشتراکگذاری %1$s ناموفق بود، زیرا این مورد قبلاً با حساب %2$s به اشتراک گذاشته شده است", "Federated shares require read permissions" : "سهام فدرال به مجوز خواندن نیاز دارد", "File is already shared with %s" : "فایل قبلاً با به اشتراک گذاشته شده است%s", "Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "اشتراکگذاری %1$s انجام نشد، پیدا نشد%2$s، شاید سرور در حال حاضر غیرقابل دسترسی باشد یا از گواهی امضا شده استفاده میکند.", diff --git a/apps/federatedfilesharing/l10n/fa.json b/apps/federatedfilesharing/l10n/fa.json index f2cbe156d59..60e78b275c8 100644 --- a/apps/federatedfilesharing/l10n/fa.json +++ b/apps/federatedfilesharing/l10n/fa.json @@ -6,6 +6,7 @@ "Federated Share request sent, you will receive an invitation. Check your notifications." : "درخواست اشتراک فدرال ارسال شد، یک دعوت نامه دریافت خواهید کرد. اعلان های خود را بررسی کنید.", "Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "نمیتوان یک اشتراک فدرال ایجاد کرد، به نظر میرسد سروری که باید با آن فدرال شود خیلی قدیمی است (Nextcloud <= 9).", "It is not allowed to send federated group shares from this server." : "ارسال اشتراک های گروه فدرال از این سرور مجاز نیست.", + "Sharing %1$s failed, because this item is already shared with the account %2$s" : "اشتراکگذاری %1$s ناموفق بود، زیرا این مورد قبلاً با حساب %2$s به اشتراک گذاشته شده است", "Federated shares require read permissions" : "سهام فدرال به مجوز خواندن نیاز دارد", "File is already shared with %s" : "فایل قبلاً با به اشتراک گذاشته شده است%s", "Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "اشتراکگذاری %1$s انجام نشد، پیدا نشد%2$s، شاید سرور در حال حاضر غیرقابل دسترسی باشد یا از گواهی امضا شده استفاده میکند.", diff --git a/apps/federatedfilesharing/openapi.json b/apps/federatedfilesharing/openapi.json index 990cbf50bfa..411ff856b18 100644 --- a/apps/federatedfilesharing/openapi.json +++ b/apps/federatedfilesharing/openapi.json @@ -158,47 +158,56 @@ "remote": { "type": "string", "nullable": true, + "default": null, "description": "Address of the remote" }, "token": { "type": "string", "nullable": true, + "default": null, "description": "Shared secret between servers" }, "name": { "type": "string", "nullable": true, + "default": null, "description": "Name of the shared resource" }, "owner": { "type": "string", "nullable": true, + "default": null, "description": "Display name of the receiver" }, "sharedBy": { "type": "string", "nullable": true, + "default": null, "description": "Display name of the sender" }, "shareWith": { "type": "string", "nullable": true, + "default": null, "description": "ID of the user that receives the share" }, "remoteId": { "type": "integer", "format": "int64", "nullable": true, + "default": null, "description": "ID of the remote" }, "sharedByFederatedId": { "type": "string", "nullable": true, + "default": null, "description": "Federated ID of the sender" }, "ownerFederatedId": { "type": "string", "nullable": true, + "default": null, "description": "Federated ID of the receiver" } } @@ -276,11 +285,13 @@ "token": { "type": "string", "nullable": true, + "default": null, "description": "Shared secret between servers" }, "shareWith": { "type": "string", "nullable": true, + "default": null, "description": "ID of the user that receives the share" }, "remoteId": { @@ -417,12 +428,14 @@ "token": { "type": "string", "nullable": true, + "default": null, "description": "Shared secret between servers" }, "permissions": { "type": "integer", "format": "int64", "nullable": true, + "default": null, "description": "New permissions" } } @@ -538,6 +551,7 @@ "token": { "type": "string", "nullable": true, + "default": null, "description": "Shared secret between servers" } } @@ -635,6 +649,7 @@ "token": { "type": "string", "nullable": true, + "default": null, "description": "Shared secret between servers" } } @@ -722,6 +737,7 @@ "token": { "type": "string", "nullable": true, + "default": null, "description": "Shared secret between servers" } } @@ -809,6 +825,7 @@ "token": { "type": "string", "nullable": true, + "default": null, "description": "Shared secret between servers" } } @@ -924,16 +941,19 @@ "token": { "type": "string", "nullable": true, + "default": null, "description": "Shared secret between servers" }, "remote": { "type": "string", "nullable": true, + "default": null, "description": "Address of the remote" }, "remote_id": { "type": "string", "nullable": true, + "default": null, "description": "ID of the remote" } } diff --git a/apps/federatedfilesharing/tests/AddressHandlerTest.php b/apps/federatedfilesharing/tests/AddressHandlerTest.php index ffb34d965ce..232ac21a869 100644 --- a/apps/federatedfilesharing/tests/AddressHandlerTest.php +++ b/apps/federatedfilesharing/tests/AddressHandlerTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -16,31 +17,20 @@ use OCP\ICacheFactory; use OCP\IL10N; use OCP\IURLGenerator; use OCP\IUserManager; +use PHPUnit\Framework\MockObject\MockObject; class AddressHandlerTest extends \Test\TestCase { - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $contactsManager; - - /** @var AddressHandler */ - private $addressHandler; - - /** @var IURLGenerator | \PHPUnit\Framework\MockObject\MockObject */ - private $urlGenerator; - - /** @var IL10N | \PHPUnit\Framework\MockObject\MockObject */ - private $il10n; - - /** @var CloudIdManager */ - private $cloudIdManager; + protected IManager&MockObject $contactsManager; + private IURLGenerator&MockObject $urlGenerator; + private IL10N&MockObject $il10n; + private CloudIdManager $cloudIdManager; + private AddressHandler $addressHandler; protected function setUp(): void { parent::setUp(); - $this->urlGenerator = $this->getMockBuilder(IURLGenerator::class) - ->getMock(); - $this->il10n = $this->getMockBuilder(IL10N::class) - ->getMock(); - + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->il10n = $this->createMock(IL10N::class); $this->contactsManager = $this->createMock(IManager::class); $this->cloudIdManager = new CloudIdManager( @@ -54,7 +44,7 @@ class AddressHandlerTest extends \Test\TestCase { $this->addressHandler = new AddressHandler($this->urlGenerator, $this->il10n, $this->cloudIdManager); } - public function dataTestSplitUserRemote() { + public static function dataTestSplitUserRemote(): array { $userPrefix = ['user@name', 'username']; $protocols = ['', 'http://', 'https://']; $remotes = [ @@ -92,12 +82,8 @@ class AddressHandlerTest extends \Test\TestCase { /** * @dataProvider dataTestSplitUserRemote - * - * @param string $remote - * @param string $expectedUser - * @param string $expectedUrl */ - public function testSplitUserRemote($remote, $expectedUser, $expectedUrl): void { + public function testSplitUserRemote(string $remote, string $expectedUser, string $expectedUrl): void { $this->contactsManager->expects($this->any()) ->method('search') ->willReturn([]); @@ -107,7 +93,7 @@ class AddressHandlerTest extends \Test\TestCase { $this->assertSame($expectedUrl, $remoteUrl); } - public function dataTestSplitUserRemoteError() { + public static function dataTestSplitUserRemoteError(): array { return [ // Invalid path ['user@'], @@ -127,10 +113,8 @@ class AddressHandlerTest extends \Test\TestCase { /** * @dataProvider dataTestSplitUserRemoteError - * - * @param string $id */ - public function testSplitUserRemoteError($id): void { + public function testSplitUserRemoteError(string $id): void { $this->expectException(HintException::class); $this->addressHandler->splitUserRemote($id); @@ -138,20 +122,14 @@ class AddressHandlerTest extends \Test\TestCase { /** * @dataProvider dataTestCompareAddresses - * - * @param string $user1 - * @param string $server1 - * @param string $user2 - * @param string $server2 - * @param bool $expected */ - public function testCompareAddresses($user1, $server1, $user2, $server2, $expected): void { + public function testCompareAddresses(string $user1, string $server1, string $user2, string $server2, bool $expected): void { $this->assertSame($expected, $this->addressHandler->compareAddresses($user1, $server1, $user2, $server2) ); } - public function dataTestCompareAddresses() { + public static function dataTestCompareAddresses(): array { return [ ['user1', 'http://server1', 'user1', 'http://server1', true], ['user1', 'https://server1', 'user1', 'http://server1', true], @@ -173,35 +151,29 @@ class AddressHandlerTest extends \Test\TestCase { /** * @dataProvider dataTestRemoveProtocolFromUrl - * - * @param string $url - * @param string $expectedResult */ - public function testRemoveProtocolFromUrl($url, $expectedResult): void { + public function testRemoveProtocolFromUrl(string $url, string $expectedResult): void { $result = $this->addressHandler->removeProtocolFromUrl($url); $this->assertSame($expectedResult, $result); } - public function dataTestRemoveProtocolFromUrl() { + public static function dataTestRemoveProtocolFromUrl(): array { return [ - ['http://owncloud.org', 'owncloud.org'], - ['https://owncloud.org', 'owncloud.org'], - ['owncloud.org', 'owncloud.org'], + ['http://example.tld', 'example.tld'], + ['https://example.tld', 'example.tld'], + ['example.tld', 'example.tld'], ]; } /** * @dataProvider dataTestUrlContainProtocol - * - * @param string $url - * @param bool $expectedResult */ - public function testUrlContainProtocol($url, $expectedResult): void { + public function testUrlContainProtocol(string $url, bool $expectedResult): void { $result = $this->addressHandler->urlContainProtocol($url); $this->assertSame($expectedResult, $result); } - public function dataTestUrlContainProtocol() { + public static function dataTestUrlContainProtocol(): array { return [ ['http://nextcloud.com', true], ['https://nextcloud.com', true], diff --git a/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php b/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php index 8222f25bb49..a6c10148425 100644 --- a/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php +++ b/apps/federatedfilesharing/tests/Controller/MountPublicLinkControllerTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -31,64 +33,35 @@ use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; class MountPublicLinkControllerTest extends \Test\TestCase { - /** @var IContactsManager|MockObject */ - protected $contactsManager; - - /** @var MountPublicLinkController */ - private $controller; - - /** @var IRequest|MockObject */ - private $request; - - /** @var FederatedShareProvider|MockObject */ - private $federatedShareProvider; - - /** @var IManager|MockObject */ - private $shareManager; - - /** @var AddressHandler|MockObject */ - private $addressHandler; - - /** @var IRootFolder|MockObject */ - private $rootFolder; - - /** @var IUserManager|MockObject */ - private $userManager; - - /** @var ISession|MockObject */ - private $session; - - /** @var IL10N|MockObject */ - private $l10n; - - /** @var IUserSession|MockObject */ - private $userSession; - - /** @var IClientService|MockObject */ - private $clientService; - - /** @var IShare */ - private $share; - - /** @var ICloudIdManager */ - private $cloudIdManager; + protected IContactsManager&MockObject $contactsManager; + private IRequest&MockObject $request; + private FederatedShareProvider&MockObject $federatedShareProvider; + private IManager&MockObject $shareManager; + private AddressHandler&MockObject $addressHandler; + private IRootFolder&MockObject $rootFolder; + private IUserManager&MockObject $userManager; + private ISession&MockObject $session; + private IL10N&MockObject $l10n; + private IUserSession&MockObject $userSession; + private IClientService&MockObject $clientService; + private IShare $share; + private ICloudIdManager $cloudIdManager; + private MountPublicLinkController $controller; protected function setUp(): void { parent::setUp(); - $this->request = $this->getMockBuilder(IRequest::class)->disableOriginalConstructor()->getMock(); - $this->federatedShareProvider = $this->getMockBuilder('OCA\FederatedFileSharing\FederatedShareProvider') - ->disableOriginalConstructor()->getMock(); - $this->shareManager = $this->getMockBuilder(IManager::class)->disableOriginalConstructor()->getMock(); - $this->addressHandler = $this->getMockBuilder('OCA\FederatedFileSharing\AddressHandler') - ->disableOriginalConstructor()->getMock(); - $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')->disableOriginalConstructor()->getMock(); - $this->userManager = $this->getMockBuilder(IUserManager::class)->disableOriginalConstructor()->getMock(); + $this->request = $this->createMock(IRequest::class); + $this->federatedShareProvider = $this->createMock(FederatedShareProvider::class); + $this->shareManager = $this->createMock(IManager::class); + $this->addressHandler = $this->createMock(AddressHandler::class); + $this->rootFolder = $this->createMock(IRootFolder::class); + $this->userManager = $this->createMock(IUserManager::class); $this->share = new Share($this->rootFolder, $this->userManager); - $this->session = $this->getMockBuilder(ISession::class)->disableOriginalConstructor()->getMock(); - $this->l10n = $this->getMockBuilder(IL10N::class)->disableOriginalConstructor()->getMock(); - $this->userSession = $this->getMockBuilder(IUserSession::class)->disableOriginalConstructor()->getMock(); - $this->clientService = $this->getMockBuilder('OCP\Http\Client\IClientService')->disableOriginalConstructor()->getMock(); + $this->session = $this->createMock(ISession::class); + $this->l10n = $this->createMock(IL10N::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->clientService = $this->createMock(IClientService::class); $this->contactsManager = $this->createMock(IContactsManager::class); $this->cloudIdManager = new CloudIdManager( $this->contactsManager, @@ -114,23 +87,16 @@ class MountPublicLinkControllerTest extends \Test\TestCase { /** * @dataProvider dataTestCreateFederatedShare - * - * @param string $shareWith - * @param bool $outgoingSharesAllowed - * @param bool $validShareWith - * @param string $token - * @param bool $validToken - * @param bool $createSuccessful - * @param string $expectedReturnData */ - public function testCreateFederatedShare($shareWith, - $outgoingSharesAllowed, - $validShareWith, - $token, - $validToken, - $createSuccessful, - $expectedReturnData, - $permissions, + public function testCreateFederatedShare( + string $shareWith, + bool $outgoingSharesAllowed, + bool $validShareWith, + string $token, + bool $validToken, + bool $createSuccessful, + string $expectedReturnData, + int $permissions, ): void { $this->federatedShareProvider->expects($this->any()) ->method('isOutgoingServer2serverShareEnabled') @@ -188,7 +154,7 @@ class MountPublicLinkControllerTest extends \Test\TestCase { } } - public function dataTestCreateFederatedShare() { + public static function dataTestCreateFederatedShare(): array { return [ //shareWith, outgoingSharesAllowed, validShareWith, token, validToken, createSuccessful, expectedReturnData ['user@server', true, true, 'token', true, true, 'server', 31], diff --git a/apps/federatedfilesharing/tests/Controller/RequestHandlerControllerTest.php b/apps/federatedfilesharing/tests/Controller/RequestHandlerControllerTest.php index c4c45c1aca5..81c67a29254 100644 --- a/apps/federatedfilesharing/tests/Controller/RequestHandlerControllerTest.php +++ b/apps/federatedfilesharing/tests/Controller/RequestHandlerControllerTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -23,6 +24,7 @@ use OCP\IRequest; use OCP\IUserManager; use OCP\Share; use OCP\Share\IShare; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; /** @@ -32,65 +34,32 @@ use Psr\Log\LoggerInterface; * @group DB */ class RequestHandlerControllerTest extends \Test\TestCase { - private $owner = 'owner'; - private $user1 = 'user1'; - private $user2 = 'user2'; - private $ownerCloudId = 'owner@server0.org'; - private $user1CloudId = 'user1@server1.org'; - private $user2CloudId = 'user2@server2.org'; - - /** @var RequestHandlerController */ - private $requestHandler; - - /** @var FederatedShareProvider|\PHPUnit\Framework\MockObject\MockObject */ - private $federatedShareProvider; - - /** @var Notifications|\PHPUnit\Framework\MockObject\MockObject */ - private $notifications; - - /** @var AddressHandler|\PHPUnit\Framework\MockObject\MockObject */ - private $addressHandler; - - /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ - private $userManager; - - /** @var IShare|\PHPUnit\Framework\MockObject\MockObject */ - private $share; - - /** @var ICloudIdManager|\PHPUnit\Framework\MockObject\MockObject */ - private $cloudIdManager; - - /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */ - private $logger; - - /** @var IRequest|\PHPUnit\Framework\MockObject\MockObject */ - private $request; - - /** @var IDBConnection|\PHPUnit\Framework\MockObject\MockObject */ - private $connection; - - /** @var Share\IManager|\PHPUnit\Framework\MockObject\MockObject */ - private $shareManager; - - /** @var ICloudFederationFactory|\PHPUnit\Framework\MockObject\MockObject */ - private $cloudFederationFactory; - - /** @var ICloudFederationProviderManager|\PHPUnit\Framework\MockObject\MockObject */ - private $cloudFederationProviderManager; - - /** @var ICloudFederationProvider|\PHPUnit\Framework\MockObject\MockObject */ - private $cloudFederationProvider; - - /** @var ICloudFederationShare|\PHPUnit\Framework\MockObject\MockObject */ - private $cloudFederationShare; - - /** @var IEventDispatcher|\PHPUnit\Framework\MockObject\MockObject */ - private $eventDispatcher; + private string $owner = 'owner'; + private string $user1 = 'user1'; + private string $user2 = 'user2'; + private string $ownerCloudId = 'owner@server0.org'; + private string $user1CloudId = 'user1@server1.org'; + + private RequestHandlerController $requestHandler; + private FederatedShareProvider&MockObject $federatedShareProvider; + private Notifications&MockObject $notifications; + private AddressHandler&MockObject $addressHandler; + private IUserManager&MockObject $userManager; + private IShare&MockObject $share; + private ICloudIdManager&MockObject $cloudIdManager; + private LoggerInterface&MockObject $logger; + private IRequest&MockObject $request; + private IDBConnection&MockObject $connection; + private Share\IManager&MockObject $shareManager; + private ICloudFederationFactory&MockObject $cloudFederationFactory; + private ICloudFederationProviderManager&MockObject $cloudFederationProviderManager; + private ICloudFederationProvider&MockObject $cloudFederationProvider; + private ICloudFederationShare&MockObject $cloudFederationShare; + private IEventDispatcher&MockObject $eventDispatcher; protected function setUp(): void { - $this->share = $this->getMockBuilder(IShare::class)->getMock(); - $this->federatedShareProvider = $this->getMockBuilder('OCA\FederatedFileSharing\FederatedShareProvider') - ->disableOriginalConstructor()->getMock(); + $this->share = $this->createMock(IShare::class); + $this->federatedShareProvider = $this->createMock(FederatedShareProvider::class); $this->federatedShareProvider->expects($this->any()) ->method('isOutgoingServer2serverShareEnabled')->willReturn(true); $this->federatedShareProvider->expects($this->any()) @@ -98,11 +67,9 @@ class RequestHandlerControllerTest extends \Test\TestCase { $this->federatedShareProvider->expects($this->any())->method('getShareById') ->willReturn($this->share); - $this->notifications = $this->getMockBuilder('OCA\FederatedFileSharing\Notifications') - ->disableOriginalConstructor()->getMock(); - $this->addressHandler = $this->getMockBuilder('OCA\FederatedFileSharing\AddressHandler') - ->disableOriginalConstructor()->getMock(); - $this->userManager = $this->getMockBuilder(IUserManager::class)->getMock(); + $this->notifications = $this->createMock(Notifications::class); + $this->addressHandler = $this->createMock(AddressHandler::class); + $this->userManager = $this->createMock(IUserManager::class); $this->cloudIdManager = $this->createMock(ICloudIdManager::class); $this->request = $this->createMock(IRequest::class); $this->connection = $this->createMock(IDBConnection::class); @@ -149,7 +116,7 @@ class RequestHandlerControllerTest extends \Test\TestCase { 'file' )->willReturn($this->cloudFederationShare); - /** @var ICloudFederationProvider|\PHPUnit\Framework\MockObject\MockObject $provider */ + /** @var ICloudFederationProvider&MockObject $provider */ $this->cloudFederationProviderManager->expects($this->once()) ->method('getCloudFederationProvider') ->with('file') diff --git a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php index 002a8bac374..fc6dbf7a699 100644 --- a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php +++ b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -38,61 +39,39 @@ use Psr\Log\LoggerInterface; * @group DB */ class FederatedShareProviderTest extends \Test\TestCase { - /** @var IDBConnection */ - protected $connection; - /** @var AddressHandler|MockObject */ - protected $addressHandler; - /** @var Notifications|MockObject */ - protected $notifications; - /** @var TokenHandler|MockObject */ - protected $tokenHandler; - /** @var IL10N */ - protected $l; - /** @var LoggerInterface */ - protected $logger; - /** @var IRootFolder|MockObject */ - protected $rootFolder; - /** @var IConfig|MockObject */ - protected $config; - /** @var IUserManager|MockObject */ - protected $userManager; - /** @var \OCP\GlobalScale\IConfig|MockObject */ - protected $gsConfig; - - /** @var IManager */ - protected $shareManager; - /** @var FederatedShareProvider */ - protected $provider; - /** @var IContactsManager|MockObject */ - protected $contactsManager; - - /** @var ICloudIdManager */ - private $cloudIdManager; - - /** @var MockObject|ICloudFederationProviderManager */ - private $cloudFederationProviderManager; + protected IDBConnection $connection; + protected AddressHandler&MockObject $addressHandler; + protected Notifications&MockObject $notifications; + protected TokenHandler&MockObject $tokenHandler; + protected IL10N $l; + protected LoggerInterface $logger; + protected IRootFolder&MockObject $rootFolder; + protected IConfig&MockObject $config; + protected IUserManager&MockObject $userManager; + protected \OCP\GlobalScale\IConfig&MockObject $gsConfig; + protected IManager $shareManager; + protected FederatedShareProvider $provider; + protected IContactsManager&MockObject $contactsManager; + private ICloudIdManager $cloudIdManager; + private ICloudFederationProviderManager&MockObject $cloudFederationProviderManager; protected function setUp(): void { parent::setUp(); $this->connection = Server::get(IDBConnection::class); - $this->notifications = $this->getMockBuilder('OCA\FederatedFileSharing\Notifications') - ->disableOriginalConstructor() - ->getMock(); - $this->tokenHandler = $this->getMockBuilder('OCA\FederatedFileSharing\TokenHandler') - ->disableOriginalConstructor() - ->getMock(); - $this->l = $this->getMockBuilder(IL10N::class)->getMock(); + $this->notifications = $this->createMock(Notifications::class); + $this->tokenHandler = $this->createMock(TokenHandler::class); + $this->l = $this->createMock(IL10N::class); $this->l->method('t') ->willReturnCallback(function ($text, $parameters = []) { return vsprintf($text, $parameters); }); - $this->logger = $this->getMockBuilder(LoggerInterface::class)->getMock(); - $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')->getMock(); - $this->config = $this->getMockBuilder(IConfig::class)->getMock(); - $this->userManager = $this->getMockBuilder(IUserManager::class)->getMock(); + $this->logger = $this->createMock(LoggerInterface::class); + $this->rootFolder = $this->createMock(IRootFolder::class); + $this->config = $this->createMock(IConfig::class); + $this->userManager = $this->createMock(IUserManager::class); //$this->addressHandler = new AddressHandler(\OC::$server->getURLGenerator(), $this->l); - $this->addressHandler = $this->getMockBuilder('OCA\FederatedFileSharing\AddressHandler')->disableOriginalConstructor()->getMock(); + $this->addressHandler = $this->createMock(AddressHandler::class); $this->contactsManager = $this->createMock(IContactsManager::class); $this->cloudIdManager = new CloudIdManager( $this->contactsManager, @@ -122,16 +101,16 @@ class FederatedShareProviderTest extends \Test\TestCase { $this->logger, ); - $this->shareManager = Server::get(\OCP\Share\IManager::class); + $this->shareManager = Server::get(IManager::class); } protected function tearDown(): void { - $this->connection->getQueryBuilder()->delete('share')->execute(); + $this->connection->getQueryBuilder()->delete('share')->executeStatement(); parent::tearDown(); } - public function dataTestCreate() { + public static function dataTestCreate(): array { return [ [null, null], [new \DateTime('2020-03-01T01:02:03'), '2020-03-01 01:02:03'], @@ -141,11 +120,11 @@ class FederatedShareProviderTest extends \Test\TestCase { /** * @dataProvider dataTestCreate */ - public function testCreate($expirationDate, $expectedDataDate): void { + public function testCreate(?\DateTime $expirationDate, ?string $expectedDataDate): void { $share = $this->shareManager->newShare(); - /** @var File|MockObject $node */ - $node = $this->getMockBuilder(File::class)->getMock(); + /** @var File&MockObject $node */ + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -190,7 +169,7 @@ class FederatedShareProviderTest extends \Test\TestCase { $stmt = $qb->select('*') ->from('share') ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))) - ->execute(); + ->executeQuery(); $data = $stmt->fetch(); $stmt->closeCursor(); @@ -227,7 +206,7 @@ class FederatedShareProviderTest extends \Test\TestCase { public function testCreateCouldNotFindServer(): void { $share = $this->shareManager->newShare(); - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -277,7 +256,7 @@ class FederatedShareProviderTest extends \Test\TestCase { $stmt = $qb->select('*') ->from('share') ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))) - ->execute(); + ->executeQuery(); $data = $stmt->fetch(); $stmt->closeCursor(); @@ -288,7 +267,7 @@ class FederatedShareProviderTest extends \Test\TestCase { public function testCreateException(): void { $share = $this->shareManager->newShare(); - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -338,7 +317,7 @@ class FederatedShareProviderTest extends \Test\TestCase { $stmt = $qb->select('*') ->from('share') ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))) - ->execute(); + ->executeQuery(); $data = $stmt->fetch(); $stmt->closeCursor(); @@ -349,7 +328,7 @@ class FederatedShareProviderTest extends \Test\TestCase { public function testCreateShareWithSelf(): void { $share = $this->shareManager->newShare(); - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -381,7 +360,7 @@ class FederatedShareProviderTest extends \Test\TestCase { $stmt = $qb->select('*') ->from('share') ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))) - ->execute(); + ->executeQuery(); $data = $stmt->fetch(); $stmt->closeCursor(); @@ -392,7 +371,7 @@ class FederatedShareProviderTest extends \Test\TestCase { public function testCreateAlreadyShared(): void { $share = $this->shareManager->newShare(); - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -443,8 +422,8 @@ class FederatedShareProviderTest extends \Test\TestCase { /** * @dataProvider dataTestUpdate */ - public function testUpdate($owner, $sharedBy, $expirationDate): void { - $this->provider = $this->getMockBuilder('OCA\FederatedFileSharing\FederatedShareProvider') + public function testUpdate(string $owner, string $sharedBy, ?\DateTime $expirationDate): void { + $this->provider = $this->getMockBuilder(FederatedShareProvider::class) ->setConstructorArgs( [ $this->connection, @@ -460,11 +439,13 @@ class FederatedShareProviderTest extends \Test\TestCase { $this->cloudFederationProviderManager, $this->logger, ] - )->setMethods(['sendPermissionUpdate'])->getMock(); + ) + ->onlyMethods(['sendPermissionUpdate']) + ->getMock(); $share = $this->shareManager->newShare(); - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -520,7 +501,7 @@ class FederatedShareProviderTest extends \Test\TestCase { $this->assertEquals($expirationDate, $share->getExpirationDate()); } - public function dataTestUpdate() { + public static function dataTestUpdate(): array { return [ ['sharedBy', 'shareOwner', new \DateTime('2020-03-01T01:02:03')], ['shareOwner', 'shareOwner', null], @@ -528,7 +509,7 @@ class FederatedShareProviderTest extends \Test\TestCase { } public function testGetSharedBy(): void { - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -574,7 +555,7 @@ class FederatedShareProviderTest extends \Test\TestCase { } public function testGetSharedByWithNode(): void { - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -621,7 +602,7 @@ class FederatedShareProviderTest extends \Test\TestCase { } public function testGetSharedByWithReshares(): void { - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -663,7 +644,7 @@ class FederatedShareProviderTest extends \Test\TestCase { } public function testGetSharedByWithLimit(): void { - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->method('getId')->willReturn(42); $node->method('getName')->willReturn('myFile'); @@ -713,7 +694,7 @@ class FederatedShareProviderTest extends \Test\TestCase { $this->assertEquals('user2@server.com', $shares[0]->getSharedWith()); } - public function dataDeleteUser() { + public static function dataDeleteUser(): array { return [ ['a', 'b', 'c', 'a', true], ['a', 'b', 'c', 'b', false], @@ -732,7 +713,7 @@ class FederatedShareProviderTest extends \Test\TestCase { * @param string $deletedUser The user that is deleted * @param bool $rowDeleted Is the row deleted in this setup */ - public function testDeleteUser($owner, $initiator, $recipient, $deletedUser, $rowDeleted): void { + public function testDeleteUser(string $owner, string $initiator, string $recipient, string $deletedUser, bool $rowDeleted): void { $qb = $this->connection->getQueryBuilder(); $qb->insert('share') ->setValue('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE)) @@ -742,7 +723,7 @@ class FederatedShareProviderTest extends \Test\TestCase { ->setValue('item_type', $qb->createNamedParameter('file')) ->setValue('item_source', $qb->createNamedParameter(42)) ->setValue('file_source', $qb->createNamedParameter(42)) - ->execute(); + ->executeStatement(); $id = $qb->getLastInsertId(); @@ -754,7 +735,7 @@ class FederatedShareProviderTest extends \Test\TestCase { ->where( $qb->expr()->eq('id', $qb->createNamedParameter($id)) ); - $cursor = $qb->execute(); + $cursor = $qb->executeQuery(); $data = $cursor->fetchAll(); $cursor->closeCursor(); @@ -763,11 +744,8 @@ class FederatedShareProviderTest extends \Test\TestCase { /** * @dataProvider dataTestIsOutgoingServer2serverShareEnabled - * - * @param string $isEnabled - * @param bool $expected */ - public function testIsOutgoingServer2serverShareEnabled($internalOnly, $isEnabled, $expected): void { + public function testIsOutgoingServer2serverShareEnabled(bool $internalOnly, string $isEnabled, bool $expected): void { $this->gsConfig->expects($this->once())->method('onlyInternalFederation') ->willReturn($internalOnly); $this->config->expects($this->any())->method('getAppValue') @@ -779,7 +757,7 @@ class FederatedShareProviderTest extends \Test\TestCase { ); } - public function dataTestIsOutgoingServer2serverShareEnabled() { + public static function dataTestIsOutgoingServer2serverShareEnabled(): array { return [ [false, 'yes', true], [false, 'no', false], @@ -790,11 +768,8 @@ class FederatedShareProviderTest extends \Test\TestCase { /** * @dataProvider dataTestIsIncomingServer2serverShareEnabled - * - * @param string $isEnabled - * @param bool $expected */ - public function testIsIncomingServer2serverShareEnabled($onlyInternal, $isEnabled, $expected): void { + public function testIsIncomingServer2serverShareEnabled(bool $onlyInternal, string $isEnabled, bool $expected): void { $this->gsConfig->expects($this->once())->method('onlyInternalFederation') ->willReturn($onlyInternal); $this->config->expects($this->any())->method('getAppValue') @@ -806,7 +781,7 @@ class FederatedShareProviderTest extends \Test\TestCase { ); } - public function dataTestIsIncomingServer2serverShareEnabled() { + public static function dataTestIsIncomingServer2serverShareEnabled(): array { return [ [false, 'yes', true], [false, 'no', false], @@ -817,11 +792,8 @@ class FederatedShareProviderTest extends \Test\TestCase { /** * @dataProvider dataTestIsLookupServerQueriesEnabled - * - * @param string $isEnabled - * @param bool $expected */ - public function testIsLookupServerQueriesEnabled($gsEnabled, $isEnabled, $expected): void { + public function testIsLookupServerQueriesEnabled(bool $gsEnabled, string $isEnabled, bool $expected): void { $this->gsConfig->expects($this->once())->method('isGlobalScaleEnabled') ->willReturn($gsEnabled); $this->config->expects($this->any())->method('getAppValue') @@ -834,7 +806,7 @@ class FederatedShareProviderTest extends \Test\TestCase { } - public function dataTestIsLookupServerQueriesEnabled() { + public static function dataTestIsLookupServerQueriesEnabled(): array { return [ [true, 'yes', true], [true, 'no', true], @@ -848,11 +820,8 @@ class FederatedShareProviderTest extends \Test\TestCase { /** * @dataProvider dataTestIsLookupServerUploadEnabled - * - * @param string $isEnabled - * @param bool $expected */ - public function testIsLookupServerUploadEnabled($gsEnabled, $isEnabled, $expected): void { + public function testIsLookupServerUploadEnabled(bool $gsEnabled, string $isEnabled, bool $expected): void { $this->gsConfig->expects($this->once())->method('isGlobalScaleEnabled') ->willReturn($gsEnabled); $this->config->expects($this->any())->method('getAppValue') @@ -864,7 +833,7 @@ class FederatedShareProviderTest extends \Test\TestCase { ); } - public function dataTestIsLookupServerUploadEnabled() { + public static function dataTestIsLookupServerUploadEnabled(): array { return [ [true, 'yes', false], [true, 'no', false], @@ -880,8 +849,8 @@ class FederatedShareProviderTest extends \Test\TestCase { $userManager = Server::get(IUserManager::class); $rootFolder = Server::get(IRootFolder::class); - $u1 = $userManager->createUser('testFed', md5(time())); - $u2 = $userManager->createUser('testFed2', md5(time())); + $u1 = $userManager->createUser('testFed', md5((string)time())); + $u2 = $userManager->createUser('testFed2', md5((string)time())); $folder1 = $rootFolder->getUserFolder($u1->getUID())->newFolder('foo'); $file1 = $folder1->newFile('bar1'); @@ -934,7 +903,7 @@ class FederatedShareProviderTest extends \Test\TestCase { $userManager = Server::get(IUserManager::class); $rootFolder = Server::get(IRootFolder::class); - $u1 = $userManager->createUser('testFed', md5(time())); + $u1 = $userManager->createUser('testFed', md5((string)time())); $folder1 = $rootFolder->getUserFolder($u1->getUID())->newFolder('foo'); $file1 = $folder1->newFile('bar1'); diff --git a/apps/federatedfilesharing/tests/NotificationsTest.php b/apps/federatedfilesharing/tests/NotificationsTest.php index 7ac4e964362..94d08b5aa5d 100644 --- a/apps/federatedfilesharing/tests/NotificationsTest.php +++ b/apps/federatedfilesharing/tests/NotificationsTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -8,6 +9,7 @@ namespace OCA\FederatedFileSharing\Tests; use OCA\FederatedFileSharing\AddressHandler; +use OCA\FederatedFileSharing\BackgroundJob\RetryJob; use OCA\FederatedFileSharing\Notifications; use OCP\BackgroundJob\IJobList; use OCP\EventDispatcher\IEventDispatcher; @@ -19,38 +21,22 @@ use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; class NotificationsTest extends \Test\TestCase { - /** @var AddressHandler|MockObject */ - private $addressHandler; - - /** @var IClientService|MockObject */ - private $httpClientService; - - /** @var IDiscoveryService|MockObject */ - private $discoveryService; - - /** @var IJobList|MockObject */ - private $jobList; - - /** @var ICloudFederationProviderManager|MockObject */ - private $cloudFederationProviderManager; - - /** @var ICloudFederationFactory|MockObject */ - private $cloudFederationFactory; - - /** @var IEventDispatcher|MockObject */ - private $eventDispatcher; - - /** @var LoggerInterface|MockObject */ - private $logger; + private AddressHandler&MockObject $addressHandler; + private IClientService&MockObject $httpClientService; + private IDiscoveryService&MockObject $discoveryService; + private IJobList&MockObject $jobList; + private ICloudFederationProviderManager&MockObject $cloudFederationProviderManager; + private ICloudFederationFactory&MockObject $cloudFederationFactory; + private IEventDispatcher&MockObject $eventDispatcher; + private LoggerInterface&MockObject $logger; protected function setUp(): void { parent::setUp(); - $this->jobList = $this->getMockBuilder('OCP\BackgroundJob\IJobList')->getMock(); - $this->discoveryService = $this->getMockBuilder(IDiscoveryService::class)->getMock(); - $this->httpClientService = $this->getMockBuilder('OCP\Http\Client\IClientService')->getMock(); - $this->addressHandler = $this->getMockBuilder('OCA\FederatedFileSharing\AddressHandler') - ->disableOriginalConstructor()->getMock(); + $this->jobList = $this->createMock(IJobList::class); + $this->discoveryService = $this->createMock(IDiscoveryService::class); + $this->httpClientService = $this->createMock(IClientService::class); + $this->addressHandler = $this->createMock(AddressHandler::class); $this->logger = $this->createMock(LoggerInterface::class); $this->cloudFederationProviderManager = $this->createMock(ICloudFederationProviderManager::class); $this->cloudFederationFactory = $this->createMock(ICloudFederationFactory::class); @@ -58,14 +44,11 @@ class NotificationsTest extends \Test\TestCase { } /** - * get instance of Notifications class - * - * @param array $mockedMethods methods which should be mocked - * @return Notifications | \PHPUnit\Framework\MockObject\MockObject + * @return Notifications|MockObject */ private function getInstance(array $mockedMethods = []) { if (empty($mockedMethods)) { - $instance = new Notifications( + return new Notifications( $this->addressHandler, $this->httpClientService, $this->discoveryService, @@ -75,34 +58,30 @@ class NotificationsTest extends \Test\TestCase { $this->eventDispatcher, $this->logger, ); - } else { - $instance = $this->getMockBuilder('OCA\FederatedFileSharing\Notifications') - ->setConstructorArgs( - [ - $this->addressHandler, - $this->httpClientService, - $this->discoveryService, - $this->jobList, - $this->cloudFederationProviderManager, - $this->cloudFederationFactory, - $this->eventDispatcher, - $this->logger, - ] - )->setMethods($mockedMethods)->getMock(); } - return $instance; + return $this->getMockBuilder(Notifications::class) + ->setConstructorArgs( + [ + $this->addressHandler, + $this->httpClientService, + $this->discoveryService, + $this->jobList, + $this->cloudFederationProviderManager, + $this->cloudFederationFactory, + $this->eventDispatcher, + $this->logger, + ] + ) + ->onlyMethods($mockedMethods) + ->getMock(); } /** * @dataProvider dataTestSendUpdateToRemote - * - * @param int $try - * @param array $httpRequestResult - * @param bool $expected */ - public function testSendUpdateToRemote($try, $httpRequestResult, $expected): void { + public function testSendUpdateToRemote(int $try, array $httpRequestResult, bool $expected): void { $remote = 'http://remote'; $id = 42; $timestamp = 63576; @@ -120,7 +99,7 @@ class NotificationsTest extends \Test\TestCase { if ($try === 0 && $expected === false) { $this->jobList->expects($this->once())->method('add') ->with( - 'OCA\FederatedFileSharing\BackgroundJob\RetryJob', + RetryJob::class, [ 'remote' => $remote, 'remoteId' => $id, @@ -141,7 +120,7 @@ class NotificationsTest extends \Test\TestCase { } - public function dataTestSendUpdateToRemote() { + public static function dataTestSendUpdateToRemote(): array { return [ // test if background job is added correctly [0, ['success' => true, 'result' => json_encode(['ocs' => ['meta' => ['statuscode' => 200]]])], true], diff --git a/apps/federatedfilesharing/tests/Settings/AdminTest.php b/apps/federatedfilesharing/tests/Settings/AdminTest.php index efbe763c633..1eb75003b4f 100644 --- a/apps/federatedfilesharing/tests/Settings/AdminTest.php +++ b/apps/federatedfilesharing/tests/Settings/AdminTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later @@ -12,17 +14,14 @@ use OCP\AppFramework\Services\IInitialState; use OCP\GlobalScale\IConfig; use OCP\IL10N; use OCP\IURLGenerator; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class AdminTest extends TestCase { - /** @var Admin */ - private $admin; - /** @var FederatedShareProvider */ - private $federatedShareProvider; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $gsConfig; - /** @var IInitialState|\PHPUnit\Framework\MockObject\MockObject */ - private $initialState; + private FederatedShareProvider&MockObject $federatedShareProvider; + private IConfig $gsConfig; + private IInitialState&MockObject $initialState; + private Admin $admin; protected function setUp(): void { parent::setUp(); @@ -43,7 +42,7 @@ class AdminTest extends TestCase { ); } - public function sharingStateProvider() { + public static function sharingStateProvider(): array { return [ [ true, @@ -56,9 +55,8 @@ class AdminTest extends TestCase { /** * @dataProvider sharingStateProvider - * @param bool $state */ - public function testGetForm($state): void { + public function testGetForm(bool $state): void { $this->federatedShareProvider ->expects($this->once()) ->method('isOutgoingServer2serverShareEnabled') @@ -98,20 +96,24 @@ class AdminTest extends TestCase { $this->gsConfig->expects($this->once())->method('onlyInternalFederation') ->willReturn($state); + $calls = [ + ['internalOnly', $state], + ['sharingFederatedDocUrl', 'doc-link'], + ['outgoingServer2serverShareEnabled', $state], + ['incomingServer2serverShareEnabled', $state], + ['federatedGroupSharingSupported', $state], + ['outgoingServer2serverGroupShareEnabled', $state], + ['incomingServer2serverGroupShareEnabled', $state], + ['lookupServerEnabled', $state], + ['lookupServerUploadEnabled', $state], + ['federatedTrustedShareAutoAccept', $state], + ]; $this->initialState->expects($this->exactly(10)) ->method('provideInitialState') - ->withConsecutive( - ['internalOnly', $state], - ['sharingFederatedDocUrl', 'doc-link'], - ['outgoingServer2serverShareEnabled', $state], - ['incomingServer2serverShareEnabled', $state], - ['federatedGroupSharingSupported', $state], - ['outgoingServer2serverGroupShareEnabled', $state], - ['incomingServer2serverGroupShareEnabled', $state], - ['lookupServerEnabled', $state], - ['lookupServerUploadEnabled', $state], - ['federatedTrustedShareAutoAccept', $state] - ); + ->willReturnCallback(function () use (&$calls) { + $expected = array_shift($calls); + $this->assertSame($expected, func_get_args()); + }); $expected = new TemplateResponse('federatedfilesharing', 'settings-admin', [], ''); $this->assertEquals($expected, $this->admin->getForm()); diff --git a/apps/federatedfilesharing/tests/TestCase.php b/apps/federatedfilesharing/tests/TestCase.php index b9787f2ffab..1536e1b3375 100644 --- a/apps/federatedfilesharing/tests/TestCase.php +++ b/apps/federatedfilesharing/tests/TestCase.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -9,6 +10,7 @@ namespace OCA\FederatedFileSharing\Tests; use OC\Files\Filesystem; use OC\Group\Database; +use OCP\Files\IRootFolder; use OCP\IGroupManager; use OCP\IUserManager; use OCP\IUserSession; @@ -70,12 +72,7 @@ abstract class TestCase extends \Test\TestCase { parent::tearDownAfterClass(); } - /** - * @param string $user - * @param bool $create - * @param bool $password - */ - protected static function loginHelper($user, $create = false, $password = false) { + protected static function loginHelper(string $user, bool $create = false, bool $password = false) { if ($password === false) { $password = $user; } @@ -96,7 +93,7 @@ abstract class TestCase extends \Test\TestCase { Server::get(IUserSession::class)->setUser(null); Filesystem::tearDown(); Server::get(IUserSession::class)->login($user, $password); - \OC::$server->getUserFolder($user); + \OCP\Server::get(IRootFolder::class)->getUserFolder($user); \OC_Util::setupFS($user); } diff --git a/apps/federatedfilesharing/tests/TokenHandlerTest.php b/apps/federatedfilesharing/tests/TokenHandlerTest.php index 9ed20779857..7a210274013 100644 --- a/apps/federatedfilesharing/tests/TokenHandlerTest.php +++ b/apps/federatedfilesharing/tests/TokenHandlerTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -9,17 +10,12 @@ namespace OCA\FederatedFileSharing\Tests; use OCA\FederatedFileSharing\TokenHandler; use OCP\Security\ISecureRandom; +use PHPUnit\Framework\MockObject\MockObject; class TokenHandlerTest extends \Test\TestCase { - - /** @var TokenHandler */ - private $tokenHandler; - - /** @var ISecureRandom | \PHPUnit\Framework\MockObject\MockObject */ - private $secureRandom; - - /** @var int */ - private $expectedTokenLength = 15; + private TokenHandler $tokenHandler; + private ISecureRandom&MockObject $secureRandom; + private int $expectedTokenLength = 15; protected function setUp(): void { parent::setUp(); diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js index ff277d8be18..a30878c6cf0 100644 --- a/apps/files/l10n/fa.js +++ b/apps/files/l10n/fa.js @@ -13,6 +13,7 @@ OC.L10N.register( "Restored by {user}" : "بازیابی شده توسط {user}", "Renamed by {user}" : "تغییر نام توسط {user}", "Moved by {user}" : "منتقل شده توسط {user}", + "\"remote account\"" : ""حساب از راه دور"", "You created {file}" : "شما {file} را ایجاد کردید", "You created an encrypted file in {file}" : "شما یک فایل رمزگذاری شده در {file} ایجاد کردید", "{user} created {file}" : "{user} {file} را ایجاد کرد", @@ -42,11 +43,23 @@ OC.L10N.register( "Files" : "پروندهها", "A file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه تغییر کرده است", "A favorite file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه مورد علاقه تغییر کرده است", + "Failed to authorize" : "مجوز صادر نشد", + "Invalid folder path" : "Invalid folder path", + "Folder not found" : "Folder not found", + "The file cannot be found" : "The file cannot be found", + "The destination path does not exist: %1$s" : "The destination path does not exist: %1$s", + "You do not have permission to create a file at the specified location" : "You do not have permission to create a file at the specified location", + "The file could not be converted." : "The file could not be converted.", + "Could not get relative path to converted file" : "Could not get relative path to converted file", + "Favorite files" : "Favorite files", "No favorites" : "هیچ برگزیده", + "More favorites" : "More favorites", "Accept" : "قبول", "Reject" : "رد کردن", "Incoming ownership transfer from {user}" : "انتقال مالکیت ورودی از {user}", "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "آیا می خواهید {path} را بپذیرید؟\n\nتوجه: فرآیند انتقال پس از پذیرش ممکن است تا 1 ساعت طول بکشد.", + "Ownership transfer denied" : "Ownership transfer denied", + "Your ownership transfer of {path} was denied by {user}." : "Your ownership transfer of {path} was denied by {user}.", "Ownership transfer failed" : "انتقال مالکیت ناموفق بود", "Your ownership transfer of {path} to {user} failed." : "انتقال مالکیت شما از {path} به {user} انجام نشد.", "The ownership transfer of {path} from {user} failed." : "انتقال مالکیت {path} از {user} انجام نشد.", @@ -54,42 +67,77 @@ OC.L10N.register( "Your ownership transfer of {path} to {user} has completed." : "انتقال مالکیت شما از {path} به {user} تکمیل شد.", "The ownership transfer of {path} from {user} has completed." : "انتقال مالکیت {path} از {user} تکمیل شد.", "in %s" : "در %s", + "Transferred from %1$s on %2$s" : "Transferred from %1$s on %2$s", + "Files compatibility" : "Files compatibility", + "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed.", + "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.", + "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command.", + "Enforce Windows compatibility" : "Enforce Windows compatibility", + "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity.", "File Management" : "مدیریت فایل", "Home" : "خانه", "Target folder does not exist any more" : "پوشه هدف وجود ندارد", "Reload current directory" : "دایرکتوری فعلی را دوباره بارگیری کنید", "Go to the \"{dir}\" directory" : "به دایرکتوری \"{dir}\" بروید", + "Current directory path" : "Current directory path", + "Your have used your space quota and cannot upload files anymore" : "Your have used your space quota and cannot upload files anymore", + "You do not have permission to upload or create files here." : "You do not have permission to upload or create files here.", "Drag and drop files here to upload" : "برای بارگذاری، فایلها را بکشید و اینجا بیاندازید", "Favorite" : "برگزیده", - "Back" : "Back", + "Back" : "بازگشت", + "Toggle selection for file \"{displayName}\"" : "Toggle selection for file \"{displayName}\"", + "Toggle selection for folder \"{displayName}\"" : "Toggle selection for folder \"{displayName}\"", + "File is loading" : "File is loading", + "Folder is loading" : "Folder is loading", "Filename" : "نام پرونده", "Folder name" : "نام پوشه", "This node is unavailable" : "گره شما در دسترس نیست", + "Another entry with the same name already exists." : "Another entry with the same name already exists.", + "Invalid filename." : "Invalid filename.", "Renamed \"{oldName}\" to \"{newName}\"" : "تغییر نام \"{oldName}\" به \"{newName}\"", "Rename file" : "تغییر نام فایل", "Folder" : "پوشه", + "Unknown file type" : "Unknown file type", + "{ext} image" : "{ext} image", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} audio", + "{ext} text" : "{ext} text", "Pending" : "در انتظار", + "Unknown date" : "Unknown date", "Clear filter" : "پاک کردن پالایه", "Modified" : "تاریخ", "Type" : "نوع", - "Active filters" : "Active filters", - "Remove filter" : "Remove filter", + "Active filters" : "فیلترهای فعال", + "Remove filter" : "فیلتر را بردارید", "Total rows summary" : "خلاصه کل ردیف ها", + "Toggle selection for all files and folders" : "Toggle selection for all files and folders", "Name" : "نام", + "File type" : "File type", "Size" : "اندازه", + "\"{displayName}\" failed on some elements" : "\"{displayName}\" failed on some elements", "\"{displayName}\" batch action executed successfully" : "عملکرد دستهای \"{displayName}\" با موفقیت اجرا شد", "\"{displayName}\" action failed" : "اقدام \"{displayName}\" ناموفق بود", "Actions" : "فعالیت ها", + "(selected)" : "(selected)", "List of files and folders." : "لیست فایل ها و پوشه ها", + "You have used your space quota and cannot upload files anymore." : "You have used your space quota and cannot upload files anymore.", + "Column headers with buttons are sortable." : "Column headers with buttons are sortable.", "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل عملکرد به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.", "File not found" : "فایل یافت نشد", + "{count} selected" : "{count} selected", "{usedQuotaByte} used" : "{usedQuotaByte} استفاده شده است", "{used} of {quota} used" : "{used} از {quota} استفاده شده", + "{relative}% used" : "{relative}% used", "Could not refresh storage stats" : "نمیتوان آمار ذخیرهسازی را بازخوانی کرد", "Your storage is full, files can not be updated or synced anymore!" : "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!", + "Storage information" : "اطلاعات ذخیرهسازی", + "Storage quota" : "محدودیت ذخیرهسازی", "New folder" : "پوشه جدید", "Create new folder" : "ساختن پوشه جدید", - "Create" : "ساخت", + "This name is already in use." : "This name is already in use.", + "Create" : "ایجاد", + "Fill template fields" : "Fill template fields", + "Submitting fields …" : "Submitting fields …", "Submit" : "ارسال", "Choose a file or folder to transfer" : "فایل یا پوشه ای را برای انتقال انتخاب کنید", "Transfer" : "انتقال", @@ -102,39 +150,84 @@ OC.L10N.register( "Choose file or folder to transfer" : "فایل یا پوشه را برای انتقال انتخاب کنید", "Change" : "تغییر", "New owner" : "مالک جدید", + "Keep {old}" : "Keep {old}", + "Keep without extension" : "Keep without extension", + "Use {new}" : "Use {new}", + "Remove extension" : "Remove extension", + "Change file extension" : "Change file extension", + "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable.", + "Removing the file extension \"{old}\" may render the file unreadable." : "Removing the file extension \"{old}\" may render the file unreadable.", + "Adding the file extension \"{new}\" may render the file unreadable." : "Adding the file extension \"{new}\" may render the file unreadable.", + "Do not show this dialog again." : "Do not show this dialog again.", "Select file or folder to link to" : "فایل یا پوشه را برای پیوند انتخاب کنید", "Choose {file}" : "انتخاب {file}", "Share" : "اشتراکگذاری", "Shared by link" : "اشتراک گذاشته شده از طریق لینک", "Shared" : "به اشتراک گذاشته شده ", - "Switch to list view" : "Switch to list view", + "Switch to list view" : "تغییر به نمای لیست", + "Switch to grid view" : "Switch to grid view", + "The file could not be found" : "The file could not be found", "Upload was cancelled by user" : "آپلود توسط کاربر لغو شد", "Not enough free space" : "فضای کافی در دسترس نیست", "Operation is blocked by access control" : "مدیریت دسترسی، عملیات را متوقف کرد", + "Error during upload: {message}" : "Error during upload: {message}", + "Error during upload, status code {status}" : "Error during upload, status code {status}", + "Unknown error during upload" : "Unknown error during upload", "\"{displayName}\" action executed successfully" : "عملکرد \"{displayName}\" با موفقیت اجرا شد", "Loading current folder" : "در حال بارگیری پوشه فعلی", "Retry" : "تلاش دوباره", "No files in here" : "هیچ فایلی اینجا وجود ندارد", "Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگامسازی کنید!", "Go back" : "برگرد", + "Filter file names …" : "Filter file names …", "Views" : "بازدیدها", "Files settings" : "تنظیمات پروندهها", - "Open in files" : "Open in files", + "Your files" : "Your files", + "Open in files" : "باز کردن در فایلها", "File cannot be accessed" : "فایل قابل دسترسی نیست", + "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "The file could not be found or you do not have permissions to view it. Ask the sender to share it.", "Clipboard is not available" : "کلیپ بورد در دسترس نیست", "WebDAV URL copied to clipboard" : "URL WebDAV در کلیپ بورد کپی شد", "Sort favorites first" : "ابتدا موارد دلخواه را مرتب کنید", + "Sort folders before files" : "Sort folders before files", "Show hidden files" : "نمایش پروندههای مخفی", + "Show file type column" : "Show file type column", "Crop image previews" : "پیش نمایش تصویر برش", + "Enable the grid view" : "Enable the grid view", + "Enable folder tree" : "Enable folder tree", "Additional settings" : "تنظیمات اضافی", "WebDAV" : "WebDAV", + "WebDAV URL" : "WebDAV URL", "Copy to clipboard" : "کپی به کلیپ بورد", "Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید", "If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.", + "Warnings" : "Warnings", + "Prevent warning dialogs from open or reenable them." : "Prevent warning dialogs from open or reenable them.", + "Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.", "Keyboard shortcuts" : "میانبرهای صفحهکلید", + "Speed up your Files experience with these quick shortcuts." : "Speed up your Files experience with these quick shortcuts.", + "Open the actions menu for a file" : "Open the actions menu for a file", + "Rename a file" : "Rename a file", + "Delete a file" : "Delete a file", + "Favorite or remove a file from favorites" : "Favorite or remove a file from favorites", + "Manage tags for a file" : "Manage tags for a file", "Selection" : "انتخاب", + "Select all files" : "Select all files", + "Deselect all files" : "Deselect all files", + "Select or deselect a file" : "Select or deselect a file", + "Select a range of files" : "Select a range of files", "Navigation" : "جهت یابی", + "Navigate to the parent folder" : "Navigate to the parent folder", + "Navigate to the file above" : "Navigate to the file above", + "Navigate to the file below" : "Navigate to the file below", + "Navigate to the file on the left (in grid mode)" : "Navigate to the file on the left (in grid mode)", + "Navigate to the file on the right (in grid mode)" : "Navigate to the file on the right (in grid mode)", "View" : "نمایش", + "Toggle the grid view" : "Toggle the grid view", + "Open the sidebar for a file" : "Open the sidebar for a file", + "Show those shortcuts" : "Show those shortcuts", + "You" : "You", + "Shared multiple times with different people" : "Shared multiple times with different people", "Error while loading the file data" : "خطا هنگام بارگیری داده های فایل", "Owner" : "مالک", "Remove from favorites" : "حذف کردن از برگزیده ها", @@ -145,45 +238,121 @@ OC.L10N.register( "Pick a template for {name}" : "یک الگو برای {name} انتخاب کنید", "Create a new file with the selected template" : "یک فایل جدید با الگوی انتخاب شده ایجاد کنید", "Creating file" : "ایجاد فایل", + "Save as {displayName}" : "Save as {displayName}", + "Save as …" : "Save as …", + "Converting files …" : "Converting files …", + "Failed to convert files: {message}" : "Failed to convert files: {message}", + "All files failed to be converted" : "All files failed to be converted", + "One file could not be converted: {message}" : "One file could not be converted: {message}", + "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n files could not be converted"], + "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n files successfully converted"], + "Files successfully converted" : "Files successfully converted", + "Failed to convert files" : "Failed to convert files", + "Converting file …" : "Converting file …", + "File successfully converted" : "File successfully converted", + "Failed to convert file: {message}" : "Failed to convert file: {message}", + "Failed to convert file" : "Failed to convert file", + "Deletion cancelled" : "Deletion cancelled", "Leave this share" : "ترک این اشتراک", + "Leave these shares" : "Leave these shares", "Disconnect storage" : "فضای ذخیره را جدا کنید", + "Disconnect storages" : "Disconnect storages", "Delete permanently" : "حذف قطعی", + "Delete and unshare" : "Delete and unshare", "Delete file" : "حذف پرونده", - "Delete files" : "Delete files", + "Delete files" : "حذف فایلها", "Delete folder" : "حذف پوشه", + "Delete folders" : "Delete folders", "Delete" : "حذف", + "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["You are about to permanently delete {count} item","You are about to permanently delete {count} items"], + "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["You are about to delete {count} item","You are about to delete {count} items"], + "Confirm deletion" : "Confirm deletion", "Cancel" : "لغو", + "Moving \"{source}\" to \"{destination}\" …" : "Moving \"{source}\" to \"{destination}\" …", + "Copying \"{source}\" to \"{destination}\" …" : "Copying \"{source}\" to \"{destination}\" …", + "You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself", + "(copy)" : "(copy)", + "(copy %n)" : "(copy %n)", + "Move cancelled" : "Move cancelled", + "A file or folder with that name already exists in this folder" : "A file or folder with that name already exists in this folder", + "The files are locked" : "The files are locked", + "The file does not exist anymore" : "The file does not exist anymore", + "Choose destination" : "Choose destination", "Copy to {target}" : "رونوشت به {target}", "Copy" : "رونوشت", "Move to {target}" : "جابجایی به {target}", "Move" : "انتقال", + "Move or copy operation failed" : "Move or copy operation failed", "Move or copy" : "انتقال یا رونوشت", + "Cancelled move or copy of \"{filename}\"." : "Cancelled move or copy of \"{filename}\".", + "Cancelled move or copy operation" : "Cancelled move or copy operation", "Open folder {displayName}" : "باز کردن پوشه {displayName}", "Open in Files" : "در فایل باز کنید", "Open locally" : "گشودن محلی", "Failed to redirect to client" : "هدایت به مشتری انجام نشد", "Open file locally" : "گشودن محلی پرونده", + "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "The file should now open on your device. If it doesn't, please check that you have the desktop app installed.", + "Retry and close" : "Retry and close", + "Open online" : "Open online", "Rename" : "تغییرنام", "Open details" : "باز کردن جزئیات", "View in folder" : "مشاهده در پوشه", "Today" : "امروز", "Last 7 days" : "۷ روز گذشته", "Last 30 days" : "۳۰ روز گذشته", + "This year ({year})" : "This year ({year})", + "Last year ({year})" : "Last year ({year})", "Documents" : "سندها", + "Spreadsheets" : "Spreadsheets", + "Presentations" : "Presentations", + "PDFs" : "PDFs", + "Folders" : "Folders", "Audio" : "صدا", + "Photos and images" : "Photos and images", "Videos" : "فیلم ها ", + "New folder creation cancelled" : "New folder creation cancelled", + "Created new folder \"{name}\"" : "Created new folder \"{name}\"", "Unable to initialize the templates directory" : "راه اندازی دایرکتوری الگوها ممکن نیست", + "Create templates folder" : "Create templates folder", "Templates" : "قالبها", + "New template folder" : "New template folder", + "In folder" : "In folder", + "Search in folder: {folder}" : "Search in folder: {folder}", + "One of the dropped files could not be processed" : "One of the dropped files could not be processed", + "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Your browser does not support the Filesystem API. Directories will not be uploaded", + "No files to upload" : "No files to upload", + "Unable to create the directory {directory}" : "Unable to create the directory {directory}", + "Some files could not be uploaded" : "Some files could not be uploaded", + "Files uploaded successfully" : "Files uploaded successfully", + "No files to process" : "No files to process", + "Some files could not be copied" : "Some files could not be copied", "Some files could not be moved" : "برخی از پروندهها قابل انتقال نیستند", + "Files copied successfully" : "Files copied successfully", + "Files moved successfully" : "Files moved successfully", + "Conflicts resolution skipped" : "Conflicts resolution skipped", + "Upload cancelled" : "Upload cancelled", "This operation is forbidden" : "این عملیات غیرمجاز است", "This directory is unavailable, please check the logs or contact the administrator" : "پوشه در دسترس نیست، لطفا لاگها را بررسی کنید یا به مدیر سیستم اطلاع دهید", "Storage is temporarily not available" : "ذخیره سازی به طور موقت در دسترس نیست", + "Unexpected error: {error}" : "Unexpected error: {error}", "_%n file_::_%n files_" : ["%n فایل","%n فایل"], "_%n folder_::_%n folders_" : ["%n پوشه","%n پوشه"], + "_%n hidden_::_%n hidden_" : ["%n hidden","%n hidden"], + "Filename must not be empty." : "Filename must not be empty.", + "\"{char}\" is not allowed inside a filename." : "\"{char}\" is not allowed inside a filename.", + "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" is a reserved name and not allowed for filenames.", + "\"{extension}\" is not an allowed filetype." : "\"{extension}\" is not an allowed filetype.", + "Filenames must not end with \"{extension}\"." : "Filenames must not end with \"{extension}\".", + "List of favorite files and folders." : "List of favorite files and folders.", "No favorites yet" : "هنوز مورد دلخواه وجود ندارد", "Files and folders you mark as favorite will show up here" : "فایلها و پوشههای انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده میشود", "All files" : "تمامی فایلها", + "List of your files and folders." : "List of your files and folders.", + "All folders" : "All folders", "Personal files" : "فایلهای شخصی", + "List of your files and folders that are not shared." : "List of your files and folders that are not shared.", + "No personal files found" : "No personal files found", + "Files that are not shared will show up here." : "Files that are not shared will show up here.", "Recent" : "اخیر", "List of recently modified files and folders." : "فهرست فایلها و پوشههایی که اخیراً اصلاح شدهاند.", "No recently modified files" : "هیچ فایلی که اخیراً اصلاح شده است", @@ -208,13 +377,13 @@ OC.L10N.register( "An unknown error has occurred" : "خطایی ناشناخته اتفاق افتاده است", "File could not be uploaded" : "پرونده بارگذاری نشد", "Uploading …" : "بارگذاری...", - "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})", + "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber} /{total} )", "Uploading … ({currentNumber}/{total})" : "در حال بارگذاری ... ({currentNumber}/{total})", "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} از {totalSize} ({bitrate})", "Uploading that item is not supported" : "بارگذاری آن مورد پشتیبانی نمیشود", "Error when assembling chunks, status code {status}" : "خطا هنگام جمع آوری قطعه ها، کد وضعیت {status}", "Choose target folder" : "پوشهٔ هدف را انتخاب کنید", - "Set reminder" : "Set reminder", + "Set reminder" : "تنظیم یادآوری", "Edit locally" : "ویرایش محلی", "Open" : "باز کردن", "Could not load info for file \"{file}\"" : "بارگیری اطلاعات برای پرونده امکان پذیر نیست \"{file}\"", @@ -227,6 +396,9 @@ OC.L10N.register( "Could not move \"{file}\", target exists" : "انتقال\"{file}\" امکان پذیر نیست ، هدف وجود دارد", "Could not move \"{file}\"" : "پروندهٔ \"{file}\" منتقل نمیشود", "copy" : "کپی", + "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists", + "Could not copy \"{file}\"" : "Could not copy \"{file}\"", + "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}", "Copied {origin} and {nbfiles} other files inside {destination}" : "رونوشت شده از {origin} و {nbfiles} پروندههای دیگر در {destination}", "{newName} already exists" : "{newName} قبلاً موجود است", "Could not rename \"{fileName}\", it does not exist any more" : "نمیتوان نام «{fileName}» را تغییر داد، دیگر وجود ندارد", @@ -261,14 +433,32 @@ OC.L10N.register( "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "حافظه خارجی \"{mountPoint}\" تقریباً پر است ({usedSpacePercent}%).", "Your storage is almost full ({usedSpacePercent}%)." : "فضای ذخیرهسازی شما تقریباً پر است ({usedSpacePercent}%).", "_matches \"{filter}\"_::_match \"{filter}\"_" : ["مطابقت با \"{filter}\"","مطابقت با \"{filter}\""], + "Direct link was copied (only works for people who have access to this file/folder)" : "Direct link was copied (only works for people who have access to this file/folder)", "Path" : "مسیر", "_%n byte_::_%n bytes_" : ["%n بایت","%n بایت"], + "Favored" : "Favored", + "Favor" : "Favor", + "Copy direct link (only works for people who have access to this file/folder)" : "Copy direct link (only works for people who have access to this file/folder)", "Upload file" : "بارگذاری پرونده", + "Not favored" : "Not favored", "An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسبها رخ داده است", "Upload (max. %s)" : "آپلود (بیشترین سایز %s)", + "Submitting fields…" : "Submitting fields…", + "Filter filenames…" : "Filter filenames…", + "Edit file locally" : "Edit file locally", + "Edit online" : "Edit online", "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} پوشه","{folderCount} پوشه"], "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} پرونده","{fileCount} پرونده"], + "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"], + "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} files and 1 folder"], + "{fileCount} files and {folderCount} folders" : "{fileCount} files and {folderCount} folders", + "Personal Files" : "Personal Files", "Text file" : "فایل متنی", - "New text file.txt" : "پروندهٔ متنی جدید با پسوند txt" + "New text file.txt" : "پروندهٔ متنی جدید با پسوند txt", + "%1$s (renamed)" : "%1$s (renamed)", + "renamed file" : "renamed file", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.", + "{count} files could not be converted" : "{count} files could not be converted", + "{count} files successfully converted" : "{count} files successfully converted" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json index 155eea0cd49..98bfc9a30a4 100644 --- a/apps/files/l10n/fa.json +++ b/apps/files/l10n/fa.json @@ -11,6 +11,7 @@ "Restored by {user}" : "بازیابی شده توسط {user}", "Renamed by {user}" : "تغییر نام توسط {user}", "Moved by {user}" : "منتقل شده توسط {user}", + "\"remote account\"" : ""حساب از راه دور"", "You created {file}" : "شما {file} را ایجاد کردید", "You created an encrypted file in {file}" : "شما یک فایل رمزگذاری شده در {file} ایجاد کردید", "{user} created {file}" : "{user} {file} را ایجاد کرد", @@ -40,11 +41,23 @@ "Files" : "پروندهها", "A file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه تغییر کرده است", "A favorite file or folder has been <strong>changed</strong>" : "یک فایل یا پوشه مورد علاقه تغییر کرده است", + "Failed to authorize" : "مجوز صادر نشد", + "Invalid folder path" : "Invalid folder path", + "Folder not found" : "Folder not found", + "The file cannot be found" : "The file cannot be found", + "The destination path does not exist: %1$s" : "The destination path does not exist: %1$s", + "You do not have permission to create a file at the specified location" : "You do not have permission to create a file at the specified location", + "The file could not be converted." : "The file could not be converted.", + "Could not get relative path to converted file" : "Could not get relative path to converted file", + "Favorite files" : "Favorite files", "No favorites" : "هیچ برگزیده", + "More favorites" : "More favorites", "Accept" : "قبول", "Reject" : "رد کردن", "Incoming ownership transfer from {user}" : "انتقال مالکیت ورودی از {user}", "Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "آیا می خواهید {path} را بپذیرید؟\n\nتوجه: فرآیند انتقال پس از پذیرش ممکن است تا 1 ساعت طول بکشد.", + "Ownership transfer denied" : "Ownership transfer denied", + "Your ownership transfer of {path} was denied by {user}." : "Your ownership transfer of {path} was denied by {user}.", "Ownership transfer failed" : "انتقال مالکیت ناموفق بود", "Your ownership transfer of {path} to {user} failed." : "انتقال مالکیت شما از {path} به {user} انجام نشد.", "The ownership transfer of {path} from {user} failed." : "انتقال مالکیت {path} از {user} انجام نشد.", @@ -52,42 +65,77 @@ "Your ownership transfer of {path} to {user} has completed." : "انتقال مالکیت شما از {path} به {user} تکمیل شد.", "The ownership transfer of {path} from {user} has completed." : "انتقال مالکیت {path} از {user} تکمیل شد.", "in %s" : "در %s", + "Transferred from %1$s on %2$s" : "Transferred from %1$s on %2$s", + "Files compatibility" : "Files compatibility", + "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed.", + "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.", + "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command.", + "Enforce Windows compatibility" : "Enforce Windows compatibility", + "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity.", "File Management" : "مدیریت فایل", "Home" : "خانه", "Target folder does not exist any more" : "پوشه هدف وجود ندارد", "Reload current directory" : "دایرکتوری فعلی را دوباره بارگیری کنید", "Go to the \"{dir}\" directory" : "به دایرکتوری \"{dir}\" بروید", + "Current directory path" : "Current directory path", + "Your have used your space quota and cannot upload files anymore" : "Your have used your space quota and cannot upload files anymore", + "You do not have permission to upload or create files here." : "You do not have permission to upload or create files here.", "Drag and drop files here to upload" : "برای بارگذاری، فایلها را بکشید و اینجا بیاندازید", "Favorite" : "برگزیده", - "Back" : "Back", + "Back" : "بازگشت", + "Toggle selection for file \"{displayName}\"" : "Toggle selection for file \"{displayName}\"", + "Toggle selection for folder \"{displayName}\"" : "Toggle selection for folder \"{displayName}\"", + "File is loading" : "File is loading", + "Folder is loading" : "Folder is loading", "Filename" : "نام پرونده", "Folder name" : "نام پوشه", "This node is unavailable" : "گره شما در دسترس نیست", + "Another entry with the same name already exists." : "Another entry with the same name already exists.", + "Invalid filename." : "Invalid filename.", "Renamed \"{oldName}\" to \"{newName}\"" : "تغییر نام \"{oldName}\" به \"{newName}\"", "Rename file" : "تغییر نام فایل", "Folder" : "پوشه", + "Unknown file type" : "Unknown file type", + "{ext} image" : "{ext} image", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} audio", + "{ext} text" : "{ext} text", "Pending" : "در انتظار", + "Unknown date" : "Unknown date", "Clear filter" : "پاک کردن پالایه", "Modified" : "تاریخ", "Type" : "نوع", - "Active filters" : "Active filters", - "Remove filter" : "Remove filter", + "Active filters" : "فیلترهای فعال", + "Remove filter" : "فیلتر را بردارید", "Total rows summary" : "خلاصه کل ردیف ها", + "Toggle selection for all files and folders" : "Toggle selection for all files and folders", "Name" : "نام", + "File type" : "File type", "Size" : "اندازه", + "\"{displayName}\" failed on some elements" : "\"{displayName}\" failed on some elements", "\"{displayName}\" batch action executed successfully" : "عملکرد دستهای \"{displayName}\" با موفقیت اجرا شد", "\"{displayName}\" action failed" : "اقدام \"{displayName}\" ناموفق بود", "Actions" : "فعالیت ها", + "(selected)" : "(selected)", "List of files and folders." : "لیست فایل ها و پوشه ها", + "You have used your space quota and cannot upload files anymore." : "You have used your space quota and cannot upload files anymore.", + "Column headers with buttons are sortable." : "Column headers with buttons are sortable.", "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل عملکرد به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.", "File not found" : "فایل یافت نشد", + "{count} selected" : "{count} selected", "{usedQuotaByte} used" : "{usedQuotaByte} استفاده شده است", "{used} of {quota} used" : "{used} از {quota} استفاده شده", + "{relative}% used" : "{relative}% used", "Could not refresh storage stats" : "نمیتوان آمار ذخیرهسازی را بازخوانی کرد", "Your storage is full, files can not be updated or synced anymore!" : "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!", + "Storage information" : "اطلاعات ذخیرهسازی", + "Storage quota" : "محدودیت ذخیرهسازی", "New folder" : "پوشه جدید", "Create new folder" : "ساختن پوشه جدید", - "Create" : "ساخت", + "This name is already in use." : "This name is already in use.", + "Create" : "ایجاد", + "Fill template fields" : "Fill template fields", + "Submitting fields …" : "Submitting fields …", "Submit" : "ارسال", "Choose a file or folder to transfer" : "فایل یا پوشه ای را برای انتقال انتخاب کنید", "Transfer" : "انتقال", @@ -100,39 +148,84 @@ "Choose file or folder to transfer" : "فایل یا پوشه را برای انتقال انتخاب کنید", "Change" : "تغییر", "New owner" : "مالک جدید", + "Keep {old}" : "Keep {old}", + "Keep without extension" : "Keep without extension", + "Use {new}" : "Use {new}", + "Remove extension" : "Remove extension", + "Change file extension" : "Change file extension", + "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable." : "Changing the file extension from \"{old}\" to \"{new}\" may render the file unreadable.", + "Removing the file extension \"{old}\" may render the file unreadable." : "Removing the file extension \"{old}\" may render the file unreadable.", + "Adding the file extension \"{new}\" may render the file unreadable." : "Adding the file extension \"{new}\" may render the file unreadable.", + "Do not show this dialog again." : "Do not show this dialog again.", "Select file or folder to link to" : "فایل یا پوشه را برای پیوند انتخاب کنید", "Choose {file}" : "انتخاب {file}", "Share" : "اشتراکگذاری", "Shared by link" : "اشتراک گذاشته شده از طریق لینک", "Shared" : "به اشتراک گذاشته شده ", - "Switch to list view" : "Switch to list view", + "Switch to list view" : "تغییر به نمای لیست", + "Switch to grid view" : "Switch to grid view", + "The file could not be found" : "The file could not be found", "Upload was cancelled by user" : "آپلود توسط کاربر لغو شد", "Not enough free space" : "فضای کافی در دسترس نیست", "Operation is blocked by access control" : "مدیریت دسترسی، عملیات را متوقف کرد", + "Error during upload: {message}" : "Error during upload: {message}", + "Error during upload, status code {status}" : "Error during upload, status code {status}", + "Unknown error during upload" : "Unknown error during upload", "\"{displayName}\" action executed successfully" : "عملکرد \"{displayName}\" با موفقیت اجرا شد", "Loading current folder" : "در حال بارگیری پوشه فعلی", "Retry" : "تلاش دوباره", "No files in here" : "هیچ فایلی اینجا وجود ندارد", "Upload some content or sync with your devices!" : "محتوایی را آپلود کنید یا با دستگاه خود همگامسازی کنید!", "Go back" : "برگرد", + "Filter file names …" : "Filter file names …", "Views" : "بازدیدها", "Files settings" : "تنظیمات پروندهها", - "Open in files" : "Open in files", + "Your files" : "Your files", + "Open in files" : "باز کردن در فایلها", "File cannot be accessed" : "فایل قابل دسترسی نیست", + "The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "The file could not be found or you do not have permissions to view it. Ask the sender to share it.", "Clipboard is not available" : "کلیپ بورد در دسترس نیست", "WebDAV URL copied to clipboard" : "URL WebDAV در کلیپ بورد کپی شد", "Sort favorites first" : "ابتدا موارد دلخواه را مرتب کنید", + "Sort folders before files" : "Sort folders before files", "Show hidden files" : "نمایش پروندههای مخفی", + "Show file type column" : "Show file type column", "Crop image previews" : "پیش نمایش تصویر برش", + "Enable the grid view" : "Enable the grid view", + "Enable folder tree" : "Enable folder tree", "Additional settings" : "تنظیمات اضافی", "WebDAV" : "WebDAV", + "WebDAV URL" : "WebDAV URL", "Copy to clipboard" : "کپی به کلیپ بورد", "Use this address to access your Files via WebDAV" : "از این آدرس برای دسترسی به فایل های خود از طریق WebDAV استفاده کنید", "If you have enabled 2FA, you must create and use a new app password by clicking here." : "اگر 2FA را فعال کرده اید، باید با کلیک کردن در اینجا یک رمز عبور برنامه جدید ایجاد و استفاده کنید.", + "Warnings" : "Warnings", + "Prevent warning dialogs from open or reenable them." : "Prevent warning dialogs from open or reenable them.", + "Show a warning dialog when changing a file extension." : "Show a warning dialog when changing a file extension.", "Keyboard shortcuts" : "میانبرهای صفحهکلید", + "Speed up your Files experience with these quick shortcuts." : "Speed up your Files experience with these quick shortcuts.", + "Open the actions menu for a file" : "Open the actions menu for a file", + "Rename a file" : "Rename a file", + "Delete a file" : "Delete a file", + "Favorite or remove a file from favorites" : "Favorite or remove a file from favorites", + "Manage tags for a file" : "Manage tags for a file", "Selection" : "انتخاب", + "Select all files" : "Select all files", + "Deselect all files" : "Deselect all files", + "Select or deselect a file" : "Select or deselect a file", + "Select a range of files" : "Select a range of files", "Navigation" : "جهت یابی", + "Navigate to the parent folder" : "Navigate to the parent folder", + "Navigate to the file above" : "Navigate to the file above", + "Navigate to the file below" : "Navigate to the file below", + "Navigate to the file on the left (in grid mode)" : "Navigate to the file on the left (in grid mode)", + "Navigate to the file on the right (in grid mode)" : "Navigate to the file on the right (in grid mode)", "View" : "نمایش", + "Toggle the grid view" : "Toggle the grid view", + "Open the sidebar for a file" : "Open the sidebar for a file", + "Show those shortcuts" : "Show those shortcuts", + "You" : "You", + "Shared multiple times with different people" : "Shared multiple times with different people", "Error while loading the file data" : "خطا هنگام بارگیری داده های فایل", "Owner" : "مالک", "Remove from favorites" : "حذف کردن از برگزیده ها", @@ -143,45 +236,121 @@ "Pick a template for {name}" : "یک الگو برای {name} انتخاب کنید", "Create a new file with the selected template" : "یک فایل جدید با الگوی انتخاب شده ایجاد کنید", "Creating file" : "ایجاد فایل", + "Save as {displayName}" : "Save as {displayName}", + "Save as …" : "Save as …", + "Converting files …" : "Converting files …", + "Failed to convert files: {message}" : "Failed to convert files: {message}", + "All files failed to be converted" : "All files failed to be converted", + "One file could not be converted: {message}" : "One file could not be converted: {message}", + "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n files could not be converted"], + "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n files successfully converted"], + "Files successfully converted" : "Files successfully converted", + "Failed to convert files" : "Failed to convert files", + "Converting file …" : "Converting file …", + "File successfully converted" : "File successfully converted", + "Failed to convert file: {message}" : "Failed to convert file: {message}", + "Failed to convert file" : "Failed to convert file", + "Deletion cancelled" : "Deletion cancelled", "Leave this share" : "ترک این اشتراک", + "Leave these shares" : "Leave these shares", "Disconnect storage" : "فضای ذخیره را جدا کنید", + "Disconnect storages" : "Disconnect storages", "Delete permanently" : "حذف قطعی", + "Delete and unshare" : "Delete and unshare", "Delete file" : "حذف پرونده", - "Delete files" : "Delete files", + "Delete files" : "حذف فایلها", "Delete folder" : "حذف پوشه", + "Delete folders" : "Delete folders", "Delete" : "حذف", + "_You are about to permanently delete {count} item_::_You are about to permanently delete {count} items_" : ["You are about to permanently delete {count} item","You are about to permanently delete {count} items"], + "_You are about to delete {count} item_::_You are about to delete {count} items_" : ["You are about to delete {count} item","You are about to delete {count} items"], + "Confirm deletion" : "Confirm deletion", "Cancel" : "لغو", + "Moving \"{source}\" to \"{destination}\" …" : "Moving \"{source}\" to \"{destination}\" …", + "Copying \"{source}\" to \"{destination}\" …" : "Copying \"{source}\" to \"{destination}\" …", + "You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself", + "(copy)" : "(copy)", + "(copy %n)" : "(copy %n)", + "Move cancelled" : "Move cancelled", + "A file or folder with that name already exists in this folder" : "A file or folder with that name already exists in this folder", + "The files are locked" : "The files are locked", + "The file does not exist anymore" : "The file does not exist anymore", + "Choose destination" : "Choose destination", "Copy to {target}" : "رونوشت به {target}", "Copy" : "رونوشت", "Move to {target}" : "جابجایی به {target}", "Move" : "انتقال", + "Move or copy operation failed" : "Move or copy operation failed", "Move or copy" : "انتقال یا رونوشت", + "Cancelled move or copy of \"{filename}\"." : "Cancelled move or copy of \"{filename}\".", + "Cancelled move or copy operation" : "Cancelled move or copy operation", "Open folder {displayName}" : "باز کردن پوشه {displayName}", "Open in Files" : "در فایل باز کنید", "Open locally" : "گشودن محلی", "Failed to redirect to client" : "هدایت به مشتری انجام نشد", "Open file locally" : "گشودن محلی پرونده", + "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "The file should now open on your device. If it doesn't, please check that you have the desktop app installed.", + "Retry and close" : "Retry and close", + "Open online" : "Open online", "Rename" : "تغییرنام", "Open details" : "باز کردن جزئیات", "View in folder" : "مشاهده در پوشه", "Today" : "امروز", "Last 7 days" : "۷ روز گذشته", "Last 30 days" : "۳۰ روز گذشته", + "This year ({year})" : "This year ({year})", + "Last year ({year})" : "Last year ({year})", "Documents" : "سندها", + "Spreadsheets" : "Spreadsheets", + "Presentations" : "Presentations", + "PDFs" : "PDFs", + "Folders" : "Folders", "Audio" : "صدا", + "Photos and images" : "Photos and images", "Videos" : "فیلم ها ", + "New folder creation cancelled" : "New folder creation cancelled", + "Created new folder \"{name}\"" : "Created new folder \"{name}\"", "Unable to initialize the templates directory" : "راه اندازی دایرکتوری الگوها ممکن نیست", + "Create templates folder" : "Create templates folder", "Templates" : "قالبها", + "New template folder" : "New template folder", + "In folder" : "In folder", + "Search in folder: {folder}" : "Search in folder: {folder}", + "One of the dropped files could not be processed" : "One of the dropped files could not be processed", + "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Your browser does not support the Filesystem API. Directories will not be uploaded", + "No files to upload" : "No files to upload", + "Unable to create the directory {directory}" : "Unable to create the directory {directory}", + "Some files could not be uploaded" : "Some files could not be uploaded", + "Files uploaded successfully" : "Files uploaded successfully", + "No files to process" : "No files to process", + "Some files could not be copied" : "Some files could not be copied", "Some files could not be moved" : "برخی از پروندهها قابل انتقال نیستند", + "Files copied successfully" : "Files copied successfully", + "Files moved successfully" : "Files moved successfully", + "Conflicts resolution skipped" : "Conflicts resolution skipped", + "Upload cancelled" : "Upload cancelled", "This operation is forbidden" : "این عملیات غیرمجاز است", "This directory is unavailable, please check the logs or contact the administrator" : "پوشه در دسترس نیست، لطفا لاگها را بررسی کنید یا به مدیر سیستم اطلاع دهید", "Storage is temporarily not available" : "ذخیره سازی به طور موقت در دسترس نیست", + "Unexpected error: {error}" : "Unexpected error: {error}", "_%n file_::_%n files_" : ["%n فایل","%n فایل"], "_%n folder_::_%n folders_" : ["%n پوشه","%n پوشه"], + "_%n hidden_::_%n hidden_" : ["%n hidden","%n hidden"], + "Filename must not be empty." : "Filename must not be empty.", + "\"{char}\" is not allowed inside a filename." : "\"{char}\" is not allowed inside a filename.", + "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" is a reserved name and not allowed for filenames.", + "\"{extension}\" is not an allowed filetype." : "\"{extension}\" is not an allowed filetype.", + "Filenames must not end with \"{extension}\"." : "Filenames must not end with \"{extension}\".", + "List of favorite files and folders." : "List of favorite files and folders.", "No favorites yet" : "هنوز مورد دلخواه وجود ندارد", "Files and folders you mark as favorite will show up here" : "فایلها و پوشههای انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده میشود", "All files" : "تمامی فایلها", + "List of your files and folders." : "List of your files and folders.", + "All folders" : "All folders", "Personal files" : "فایلهای شخصی", + "List of your files and folders that are not shared." : "List of your files and folders that are not shared.", + "No personal files found" : "No personal files found", + "Files that are not shared will show up here." : "Files that are not shared will show up here.", "Recent" : "اخیر", "List of recently modified files and folders." : "فهرست فایلها و پوشههایی که اخیراً اصلاح شدهاند.", "No recently modified files" : "هیچ فایلی که اخیراً اصلاح شده است", @@ -206,13 +375,13 @@ "An unknown error has occurred" : "خطایی ناشناخته اتفاق افتاده است", "File could not be uploaded" : "پرونده بارگذاری نشد", "Uploading …" : "بارگذاری...", - "{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})", + "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber} /{total} )", "Uploading … ({currentNumber}/{total})" : "در حال بارگذاری ... ({currentNumber}/{total})", "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} از {totalSize} ({bitrate})", "Uploading that item is not supported" : "بارگذاری آن مورد پشتیبانی نمیشود", "Error when assembling chunks, status code {status}" : "خطا هنگام جمع آوری قطعه ها، کد وضعیت {status}", "Choose target folder" : "پوشهٔ هدف را انتخاب کنید", - "Set reminder" : "Set reminder", + "Set reminder" : "تنظیم یادآوری", "Edit locally" : "ویرایش محلی", "Open" : "باز کردن", "Could not load info for file \"{file}\"" : "بارگیری اطلاعات برای پرونده امکان پذیر نیست \"{file}\"", @@ -225,6 +394,9 @@ "Could not move \"{file}\", target exists" : "انتقال\"{file}\" امکان پذیر نیست ، هدف وجود دارد", "Could not move \"{file}\"" : "پروندهٔ \"{file}\" منتقل نمیشود", "copy" : "کپی", + "Could not copy \"{file}\", target exists" : "Could not copy \"{file}\", target exists", + "Could not copy \"{file}\"" : "Could not copy \"{file}\"", + "Copied {origin} inside {destination}" : "Copied {origin} inside {destination}", "Copied {origin} and {nbfiles} other files inside {destination}" : "رونوشت شده از {origin} و {nbfiles} پروندههای دیگر در {destination}", "{newName} already exists" : "{newName} قبلاً موجود است", "Could not rename \"{fileName}\", it does not exist any more" : "نمیتوان نام «{fileName}» را تغییر داد، دیگر وجود ندارد", @@ -259,14 +431,32 @@ "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "حافظه خارجی \"{mountPoint}\" تقریباً پر است ({usedSpacePercent}%).", "Your storage is almost full ({usedSpacePercent}%)." : "فضای ذخیرهسازی شما تقریباً پر است ({usedSpacePercent}%).", "_matches \"{filter}\"_::_match \"{filter}\"_" : ["مطابقت با \"{filter}\"","مطابقت با \"{filter}\""], + "Direct link was copied (only works for people who have access to this file/folder)" : "Direct link was copied (only works for people who have access to this file/folder)", "Path" : "مسیر", "_%n byte_::_%n bytes_" : ["%n بایت","%n بایت"], + "Favored" : "Favored", + "Favor" : "Favor", + "Copy direct link (only works for people who have access to this file/folder)" : "Copy direct link (only works for people who have access to this file/folder)", "Upload file" : "بارگذاری پرونده", + "Not favored" : "Not favored", "An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسبها رخ داده است", "Upload (max. %s)" : "آپلود (بیشترین سایز %s)", + "Submitting fields…" : "Submitting fields…", + "Filter filenames…" : "Filter filenames…", + "Edit file locally" : "Edit file locally", + "Edit online" : "Edit online", "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} پوشه","{folderCount} پوشه"], "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} پرونده","{fileCount} پرونده"], + "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","1 file and {folderCount} folders"], + "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} files and 1 folder"], + "{fileCount} files and {folderCount} folders" : "{fileCount} files and {folderCount} folders", + "Personal Files" : "Personal Files", "Text file" : "فایل متنی", - "New text file.txt" : "پروندهٔ متنی جدید با پسوند txt" + "New text file.txt" : "پروندهٔ متنی جدید با پسوند txt", + "%1$s (renamed)" : "%1$s (renamed)", + "renamed file" : "renamed file", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.", + "{count} files could not be converted" : "{count} files could not be converted", + "{count} files successfully converted" : "{count} files successfully converted" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js index 6e6fd348feb..bf3bf2f5883 100644 --- a/apps/files/l10n/fi.js +++ b/apps/files/l10n/fi.js @@ -87,6 +87,11 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "Kohteen \"{oldName}\" uudeksi nimeksi asetettiin \"{newName}\"", "Rename file" : "Nimeä tiedosto uudelleen", "Folder" : "Kansio", + "Unknown file type" : "Tuntematon tiedostotyyppi", + "{ext} image" : "{ext} kuva", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} ääni", + "{ext} text" : "{ext} teksti", "Pending" : "Odottaa", "Unknown date" : "Tuntematon päivämäärä", "Clear filter" : "Tyhjennä suodatin", @@ -95,6 +100,7 @@ OC.L10N.register( "Active filters" : "Aktiiviset suodattimet", "Remove filter" : "Poista suodatin", "Name" : "Nimi", + "File type" : "Tiedoston tyyppi", "Size" : "Koko", "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" massatoiminto suoritettu", "Actions" : "Toiminnot", @@ -164,6 +170,7 @@ OC.L10N.register( "Sort favorites first" : "Järjestä suosikit ensiksi", "Sort folders before files" : "Järjestä kansiot ennen tiedostoja", "Show hidden files" : "Näytä piilotetut tiedostot", + "Show file type column" : "Näytä tiedostotyypin sarake", "Crop image previews" : "Rajaa kuvien esikatseluja", "Enable the grid view" : "Käytä ruudukkonäkymää", "Enable folder tree" : "Ota kansiopuu käyttöön", @@ -290,6 +297,7 @@ OC.L10N.register( "Unexpected error: {error}" : "Odottamaton virhe: {error}", "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"], "_%n folder_::_%n folders_" : ["%n kansio","%n kansiota"], + "_%n hidden_::_%n hidden_" : ["%n piilotettu","%n piilotettua"], "Filename must not be empty." : "Tiedostonimi ei voi olla tyhjä.", "\"{char}\" is not allowed inside a filename." : "\"{char}\" ei ole sallittu tiedoston nimessä.", "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ei ole sallitttu tiedostotyyppi.", @@ -402,6 +410,7 @@ OC.L10N.register( "Personal Files" : "Henkilökohtaiset tiedostot", "Text file" : "Tekstitiedosto", "New text file.txt" : "Uusi tekstitiedosto.txt", + "%1$s (renamed)" : "%1$s (nimetty uudelleen)", "{count} files could not be converted" : "{count} tiedostoa ei voitu muuntaa", "{count} files successfully converted" : "{count} tiedostoa muunnettu onnistuneesti" }, diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json index c40fef57d23..b9c53ba232c 100644 --- a/apps/files/l10n/fi.json +++ b/apps/files/l10n/fi.json @@ -85,6 +85,11 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "Kohteen \"{oldName}\" uudeksi nimeksi asetettiin \"{newName}\"", "Rename file" : "Nimeä tiedosto uudelleen", "Folder" : "Kansio", + "Unknown file type" : "Tuntematon tiedostotyyppi", + "{ext} image" : "{ext} kuva", + "{ext} video" : "{ext} video", + "{ext} audio" : "{ext} ääni", + "{ext} text" : "{ext} teksti", "Pending" : "Odottaa", "Unknown date" : "Tuntematon päivämäärä", "Clear filter" : "Tyhjennä suodatin", @@ -93,6 +98,7 @@ "Active filters" : "Aktiiviset suodattimet", "Remove filter" : "Poista suodatin", "Name" : "Nimi", + "File type" : "Tiedoston tyyppi", "Size" : "Koko", "\"{displayName}\" batch action executed successfully" : "\"{displayName}\" massatoiminto suoritettu", "Actions" : "Toiminnot", @@ -162,6 +168,7 @@ "Sort favorites first" : "Järjestä suosikit ensiksi", "Sort folders before files" : "Järjestä kansiot ennen tiedostoja", "Show hidden files" : "Näytä piilotetut tiedostot", + "Show file type column" : "Näytä tiedostotyypin sarake", "Crop image previews" : "Rajaa kuvien esikatseluja", "Enable the grid view" : "Käytä ruudukkonäkymää", "Enable folder tree" : "Ota kansiopuu käyttöön", @@ -288,6 +295,7 @@ "Unexpected error: {error}" : "Odottamaton virhe: {error}", "_%n file_::_%n files_" : ["%n tiedosto","%n tiedostoa"], "_%n folder_::_%n folders_" : ["%n kansio","%n kansiota"], + "_%n hidden_::_%n hidden_" : ["%n piilotettu","%n piilotettua"], "Filename must not be empty." : "Tiedostonimi ei voi olla tyhjä.", "\"{char}\" is not allowed inside a filename." : "\"{char}\" ei ole sallittu tiedoston nimessä.", "\"{extension}\" is not an allowed filetype." : "\"{extension}\" ei ole sallitttu tiedostotyyppi.", @@ -400,6 +408,7 @@ "Personal Files" : "Henkilökohtaiset tiedostot", "Text file" : "Tekstitiedosto", "New text file.txt" : "Uusi tekstitiedosto.txt", + "%1$s (renamed)" : "%1$s (nimetty uudelleen)", "{count} files could not be converted" : "{count} tiedostoa ei voitu muuntaa", "{count} files successfully converted" : "{count} tiedostoa muunnettu onnistuneesti" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index d52955e27a6..54b12237bf2 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -457,6 +457,7 @@ OC.L10N.register( "New text file.txt" : "新規のテキストファイル作成", "%1$s (renamed)" : "%1$s (リネーム済み)", "renamed file" : "リネーム済みファイル", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows 互換のファイル名を有効にすると、既存のファイルは変更できなくなりますが、所有者が有効な新しいファイル名に変更できるようになります。", "{count} files could not be converted" : "{count}個のファイルが変換できませんでした", "{count} files successfully converted" : "{count}個のファイルの変換に成功しました" }, diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json index e63921f177a..5a03f50eb2e 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -455,6 +455,7 @@ "New text file.txt" : "新規のテキストファイル作成", "%1$s (renamed)" : "%1$s (リネーム済み)", "renamed file" : "リネーム済みファイル", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Windows 互換のファイル名を有効にすると、既存のファイルは変更できなくなりますが、所有者が有効な新しいファイル名に変更できるようになります。", "{count} files could not be converted" : "{count}個のファイルが変換できませんでした", "{count} files successfully converted" : "{count}個のファイルの変換に成功しました" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js index 991e9aef5a1..e7e18117acb 100644 --- a/apps/files/l10n/uk.js +++ b/apps/files/l10n/uk.js @@ -70,6 +70,8 @@ OC.L10N.register( "Transferred from %1$s on %2$s" : "Перенесено від %1$s до %2$s", "Files compatibility" : "Сумісність файлів", "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Дозволити обмежувати імена файлів для забезпечення сумісності з різними клієнтами. Типово всі імена файлів, які відповідають моделі POSIX (напр., Linux, macOS), дозволені.", + "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Після увімкнення сумісности імен файлів з системою Windows наявні файли неможливо буде змінити, але власники зможуть перейменувати ці файли на нові з дійсними іменами.", + "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Також можлива автоматична міграція файлів після увімкнення цих налаштувань. Ознайомтеся з документацією відповідної команди occ.", "Enforce Windows compatibility" : "Увімкнути сумісність із Windows", "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Це унеможливить використання імен файлів, які не сумісні з системами Windows, напр., використанння зарезервованих імен або спеціальних символів. Зауважте, що це не обмежить сумісність за регістром символів.", "File Management" : "Керування файлами", @@ -95,6 +97,11 @@ OC.L10N.register( "Renamed \"{oldName}\" to \"{newName}\"" : "Перейменовано \"{oldName}\" на \"{newName}\"", "Rename file" : "Перейменувати файл", "Folder" : "Каталог", + "Unknown file type" : "Невідомий тип файлу", + "{ext} image" : "{ext} зображення", + "{ext} video" : "{ext} відео", + "{ext} audio" : "{ext} аудіо", + "{ext} text" : "{ext} текст", "Pending" : "Очікування", "Unknown date" : "Невідома дата", "Clear filter" : "Очистити фільтр", @@ -105,6 +112,7 @@ OC.L10N.register( "Total rows summary" : "Загалом рядків", "Toggle selection for all files and folders" : "Перемкнути вибір для всіх файлів та каталогів", "Name" : "Ім'я", + "File type" : "Тип файлу", "Size" : "Розмір", "\"{displayName}\" failed on some elements" : "\"{displayName}\" не спрацював у деяких елементах", "\"{displayName}\" batch action executed successfully" : "Операцію \"{displayName}\" успішно виконано", @@ -183,6 +191,7 @@ OC.L10N.register( "Sort favorites first" : "Спочатку показувати із зірочкою", "Sort folders before files" : "Показувати каталоги перед файлами", "Show hidden files" : "Показувати приховані файли", + "Show file type column" : "Показувати стовпець з типом файлу", "Crop image previews" : "Попередній перегляд перед кадруванням", "Enable the grid view" : "Увімкнути подання сіткою", "Enable folder tree" : "Увімкнути дерево каталогів", @@ -446,6 +455,9 @@ OC.L10N.register( "Personal Files" : "Мої документи", "Text file" : "Текстовий файл", "New text file.txt" : "Новий текстовий файл.txt", + "%1$s (renamed)" : "%1$s (перейменовано)", + "renamed file" : "перейменовано файл", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Після увімкнення сумісности імен файлів з системою Windows наявні файли неможливо буде змінити, але власники зможуть перейменувати ці файли на нові з дійсними іменами.", "{count} files could not be converted" : "Неможливо конвертувати {count} файлів", "{count} files successfully converted" : "Успішно конвертовано {count} файлів" }, diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json index d0b104bac89..8e5cc11949f 100644 --- a/apps/files/l10n/uk.json +++ b/apps/files/l10n/uk.json @@ -68,6 +68,8 @@ "Transferred from %1$s on %2$s" : "Перенесено від %1$s до %2$s", "Files compatibility" : "Сумісність файлів", "Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Дозволити обмежувати імена файлів для забезпечення сумісності з різними клієнтами. Типово всі імена файлів, які відповідають моделі POSIX (напр., Linux, macOS), дозволені.", + "After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Після увімкнення сумісности імен файлів з системою Windows наявні файли неможливо буде змінити, але власники зможуть перейменувати ці файли на нові з дійсними іменами.", + "It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Також можлива автоматична міграція файлів після увімкнення цих налаштувань. Ознайомтеся з документацією відповідної команди occ.", "Enforce Windows compatibility" : "Увімкнути сумісність із Windows", "This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Це унеможливить використання імен файлів, які не сумісні з системами Windows, напр., використанння зарезервованих імен або спеціальних символів. Зауважте, що це не обмежить сумісність за регістром символів.", "File Management" : "Керування файлами", @@ -93,6 +95,11 @@ "Renamed \"{oldName}\" to \"{newName}\"" : "Перейменовано \"{oldName}\" на \"{newName}\"", "Rename file" : "Перейменувати файл", "Folder" : "Каталог", + "Unknown file type" : "Невідомий тип файлу", + "{ext} image" : "{ext} зображення", + "{ext} video" : "{ext} відео", + "{ext} audio" : "{ext} аудіо", + "{ext} text" : "{ext} текст", "Pending" : "Очікування", "Unknown date" : "Невідома дата", "Clear filter" : "Очистити фільтр", @@ -103,6 +110,7 @@ "Total rows summary" : "Загалом рядків", "Toggle selection for all files and folders" : "Перемкнути вибір для всіх файлів та каталогів", "Name" : "Ім'я", + "File type" : "Тип файлу", "Size" : "Розмір", "\"{displayName}\" failed on some elements" : "\"{displayName}\" не спрацював у деяких елементах", "\"{displayName}\" batch action executed successfully" : "Операцію \"{displayName}\" успішно виконано", @@ -181,6 +189,7 @@ "Sort favorites first" : "Спочатку показувати із зірочкою", "Sort folders before files" : "Показувати каталоги перед файлами", "Show hidden files" : "Показувати приховані файли", + "Show file type column" : "Показувати стовпець з типом файлу", "Crop image previews" : "Попередній перегляд перед кадруванням", "Enable the grid view" : "Увімкнути подання сіткою", "Enable folder tree" : "Увімкнути дерево каталогів", @@ -444,6 +453,9 @@ "Personal Files" : "Мої документи", "Text file" : "Текстовий файл", "New text file.txt" : "Новий текстовий файл.txt", + "%1$s (renamed)" : "%1$s (перейменовано)", + "renamed file" : "перейменовано файл", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Після увімкнення сумісности імен файлів з системою Windows наявні файли неможливо буде змінити, але власники зможуть перейменувати ці файли на нові з дійсними іменами.", "{count} files could not be converted" : "Неможливо конвертувати {count} файлів", "{count} files successfully converted" : "Успішно конвертовано {count} файлів" },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" diff --git a/apps/files/openapi.json b/apps/files/openapi.json index c227b12d922..c5d6053075c 100644 --- a/apps/files/openapi.json +++ b/apps/files/openapi.json @@ -847,12 +847,14 @@ "editorId": { "type": "string", "nullable": true, + "default": null, "description": "ID of the editor" }, "fileId": { "type": "integer", "format": "int64", "nullable": true, + "default": null, "description": "ID of the file" } } @@ -1032,6 +1034,7 @@ "templateId": { "type": "string", "nullable": true, + "default": null, "description": "ID of the template" } } @@ -2366,6 +2369,7 @@ "destination": { "type": "string", "nullable": true, + "default": null, "description": "The target path of the converted file. Written to a temporary file if left empty" } } diff --git a/apps/files/src/services/HotKeysService.spec.ts b/apps/files/src/services/HotKeysService.spec.ts index c732c728ce5..7bbba77b222 100644 --- a/apps/files/src/services/HotKeysService.spec.ts +++ b/apps/files/src/services/HotKeysService.spec.ts @@ -61,6 +61,7 @@ describe('HotKeysService testing', () => { activeStore.setActiveNode(file) window.OCA = { Files: { Sidebar: { open: () => {}, setActiveTab: () => {} } } } + // We only mock what needed, we do not need Files.Router.goTo or Files.Navigation window.OCP = { Files: { Router: { goToRoute: goToRouteMock, params: {}, query: {} } } } initialState = document.createElement('input') @@ -73,26 +74,26 @@ describe('HotKeysService testing', () => { }) it('Pressing d should open the sidebar once', () => { - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'd', code: 'KeyD' })) + dispatchEvent({ key: 'd', code: 'KeyD' }) // Modifier keys should not trigger the action - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'd', code: 'KeyD', ctrlKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'd', code: 'KeyD', altKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'd', code: 'KeyD', shiftKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'd', code: 'KeyD', metaKey: true })) + dispatchEvent({ key: 'd', code: 'KeyD', ctrlKey: true }) + dispatchEvent({ key: 'd', code: 'KeyD', altKey: true }) + dispatchEvent({ key: 'd', code: 'KeyD', shiftKey: true }) + dispatchEvent({ key: 'd', code: 'KeyD', metaKey: true }) expect(sidebarAction.enabled).toHaveReturnedWith(true) expect(sidebarAction.exec).toHaveBeenCalledOnce() }) it('Pressing F2 should rename the file', () => { - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'F2', code: 'F2' })) + dispatchEvent({ key: 'F2', code: 'F2' }) // Modifier keys should not trigger the action - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'F2', code: 'F2', ctrlKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'F2', code: 'F2', altKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'F2', code: 'F2', shiftKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'F2', code: 'F2', metaKey: true })) + dispatchEvent({ key: 'F2', code: 'F2', ctrlKey: true }) + dispatchEvent({ key: 'F2', code: 'F2', altKey: true }) + dispatchEvent({ key: 'F2', code: 'F2', shiftKey: true }) + dispatchEvent({ key: 'F2', code: 'F2', metaKey: true }) expect(renameAction.enabled).toHaveReturnedWith(true) expect(renameAction.exec).toHaveBeenCalledOnce() @@ -100,29 +101,29 @@ describe('HotKeysService testing', () => { it('Pressing s should toggle favorite', () => { vi.spyOn(axios, 'post').mockImplementationOnce(() => Promise.resolve()) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 's', code: 'KeyS' })) + dispatchEvent({ key: 's', code: 'KeyS' }) // Modifier keys should not trigger the action - window.dispatchEvent(new KeyboardEvent('keydown', { key: 's', code: 'KeyS', ctrlKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 's', code: 'KeyS', altKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 's', code: 'KeyS', shiftKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 's', code: 'KeyS', metaKey: true })) + dispatchEvent({ key: 's', code: 'KeyS', ctrlKey: true }) + dispatchEvent({ key: 's', code: 'KeyS', altKey: true }) + dispatchEvent({ key: 's', code: 'KeyS', shiftKey: true }) + dispatchEvent({ key: 's', code: 'KeyS', metaKey: true }) expect(favoriteAction.enabled).toHaveReturnedWith(true) expect(favoriteAction.exec).toHaveBeenCalledOnce() }) it('Pressing Delete should delete the file', async () => { - // @ts-expect-error mocking private field + // @ts-expect-error unit testing vi.spyOn(deleteAction._action, 'exec').mockResolvedValue(() => true) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Delete', code: 'Delete' })) + dispatchEvent({ key: 'Delete', code: 'Delete' }) // Modifier keys should not trigger the action - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Delete', code: 'Delete', ctrlKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Delete', code: 'Delete', altKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Delete', code: 'Delete', shiftKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Delete', code: 'Delete', metaKey: true })) + dispatchEvent({ key: 'Delete', code: 'Delete', ctrlKey: true }) + dispatchEvent({ key: 'Delete', code: 'Delete', altKey: true }) + dispatchEvent({ key: 'Delete', code: 'Delete', shiftKey: true }) + dispatchEvent({ key: 'Delete', code: 'Delete', metaKey: true }) expect(deleteAction.enabled).toHaveReturnedWith(true) expect(deleteAction.exec).toHaveBeenCalledOnce() @@ -132,7 +133,7 @@ describe('HotKeysService testing', () => { expect(goToRouteMock).toHaveBeenCalledTimes(0) window.OCP.Files.Router.query = { dir: '/foo/bar' } - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', code: 'ArrowUp', altKey: true })) + dispatchEvent({ key: 'ArrowUp', code: 'ArrowUp', altKey: true }) expect(goToRouteMock).toHaveBeenCalledOnce() expect(goToRouteMock.mock.calls[0][2].dir).toBe('/foo') @@ -145,9 +146,7 @@ describe('HotKeysService testing', () => { userConfigStore.userConfig.grid_view = false expect(userConfigStore.userConfig.grid_view).toBe(false) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'v', code: 'KeyV' })) - await nextTick() - + dispatchEvent({ key: 'v', code: 'KeyV' }) expect(userConfigStore.userConfig.grid_view).toBe(true) }) @@ -164,9 +163,19 @@ describe('HotKeysService testing', () => { userConfigStore.userConfig.grid_view = false expect(userConfigStore.userConfig.grid_view).toBe(false) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 'v', code: 'KeyV', [modifier]: true })) + dispatchEvent(new KeyboardEvent('keydown', { key: 'v', code: 'KeyV', [modifier]: true })) + await nextTick() expect(userConfigStore.userConfig.grid_view).toBe(false) }) }) + +/** + * Helper to dispatch the correct event. + * + * @param init - KeyboardEvent options + */ +function dispatchEvent(init: KeyboardEventInit) { + document.body.dispatchEvent(new KeyboardEvent('keydown', { ...init, bubbles: true })) +} diff --git a/apps/files/tests/Activity/Filter/GenericTest.php b/apps/files/tests/Activity/Filter/GenericTest.php index dbb2538ed8a..f37a1cb2c9e 100644 --- a/apps/files/tests/Activity/Filter/GenericTest.php +++ b/apps/files/tests/Activity/Filter/GenericTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later @@ -18,7 +20,7 @@ use Test\TestCase; * @group DB */ class GenericTest extends TestCase { - public function dataFilters() { + public static function dataFilters(): array { return [ [Favorites::class], [FileChanges::class], @@ -27,18 +29,16 @@ class GenericTest extends TestCase { /** * @dataProvider dataFilters - * @param string $filterClass */ - public function testImplementsInterface($filterClass): void { + public function testImplementsInterface(string $filterClass): void { $filter = Server::get($filterClass); $this->assertInstanceOf(IFilter::class, $filter); } /** * @dataProvider dataFilters - * @param string $filterClass */ - public function testGetIdentifier($filterClass): void { + public function testGetIdentifier(string $filterClass): void { /** @var IFilter $filter */ $filter = Server::get($filterClass); $this->assertIsString($filter->getIdentifier()); @@ -46,9 +46,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataFilters - * @param string $filterClass */ - public function testGetName($filterClass): void { + public function testGetName(string $filterClass): void { /** @var IFilter $filter */ $filter = Server::get($filterClass); $this->assertIsString($filter->getName()); @@ -56,9 +55,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataFilters - * @param string $filterClass */ - public function testGetPriority($filterClass): void { + public function testGetPriority(string $filterClass): void { /** @var IFilter $filter */ $filter = Server::get($filterClass); $priority = $filter->getPriority(); @@ -69,9 +67,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataFilters - * @param string $filterClass */ - public function testGetIcon($filterClass): void { + public function testGetIcon(string $filterClass): void { /** @var IFilter $filter */ $filter = Server::get($filterClass); $this->assertIsString($filter->getIcon()); @@ -80,9 +77,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataFilters - * @param string $filterClass */ - public function testFilterTypes($filterClass): void { + public function testFilterTypes(string $filterClass): void { /** @var IFilter $filter */ $filter = Server::get($filterClass); $this->assertIsArray($filter->filterTypes([])); @@ -90,9 +86,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataFilters - * @param string $filterClass */ - public function testAllowedApps($filterClass): void { + public function testAllowedApps(string $filterClass): void { /** @var IFilter $filter */ $filter = Server::get($filterClass); $this->assertIsArray($filter->allowedApps()); diff --git a/apps/files/tests/Activity/ProviderTest.php b/apps/files/tests/Activity/ProviderTest.php index 7b91e980842..ed52c76ba28 100644 --- a/apps/files/tests/Activity/ProviderTest.php +++ b/apps/files/tests/Activity/ProviderTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later @@ -26,23 +28,14 @@ use Test\TestCase; * @package OCA\Files\Tests\Activity */ class ProviderTest extends TestCase { - - /** @var IFactory|MockObject */ - protected $l10nFactory; - /** @var IURLGenerator|MockObject */ - protected $url; - /** @var IManager|MockObject */ - protected $activityManager; - /** @var IUserManager|MockObject */ - protected $userManager; - /** @var IRootFolder|MockObject */ - protected $rootFolder; - /** @var ICloudIdManager|MockObject */ - protected $cloudIdManager; - /** @var IContactsManager|MockObject */ - protected $contactsManager; - /** @var IEventMerger|MockObject */ - protected $eventMerger; + protected IFactory&MockObject $l10nFactory; + protected IURLGenerator&MockObject $url; + protected IManager&MockObject $activityManager; + protected IUserManager&MockObject $userManager; + protected IRootFolder&MockObject $rootFolder; + protected ICloudIdManager&MockObject $cloudIdManager; + protected IContactsManager&MockObject $contactsManager; + protected IEventMerger&MockObject $eventMerger; protected function setUp(): void { parent::setUp(); @@ -74,7 +67,7 @@ class ProviderTest extends TestCase { $this->contactsManager, $this->eventMerger, ]) - ->setMethods($methods) + ->onlyMethods($methods) ->getMock(); } return new Provider( @@ -89,7 +82,7 @@ class ProviderTest extends TestCase { ); } - public function dataGetFile() { + public static function dataGetFile(): array { return [ [[42 => '/FortyTwo.txt'], null, '42', 'FortyTwo.txt', 'FortyTwo.txt'], [['23' => '/Twenty/Three.txt'], null, '23', 'Three.txt', 'Twenty/Three.txt'], @@ -99,13 +92,8 @@ class ProviderTest extends TestCase { /** * @dataProvider dataGetFile - * @param mixed $parameter - * @param mixed $eventId - * @param int $id - * @param string $name - * @param string $path */ - public function testGetFile($parameter, $eventId, $id, $name, $path): void { + public function testGetFile(array|string $parameter, ?int $eventId, string $id, string $name, string $path): void { $provider = $this->getProvider(); if ($eventId !== null) { @@ -139,7 +127,7 @@ class ProviderTest extends TestCase { self::invokePrivate($provider, 'getFile', ['/Foo/Bar.txt', null]); } - public function dataGetUser() { + public static function dataGetUser(): array { return [ ['test', 'Test user', null, ['type' => 'user', 'id' => 'test', 'name' => 'Test user']], ['test@http://localhost', null, ['user' => 'test', 'displayId' => 'test@localhost', 'remote' => 'localhost', 'name' => null], ['type' => 'user', 'id' => 'test', 'name' => 'test@localhost', 'server' => 'localhost']], @@ -150,10 +138,6 @@ class ProviderTest extends TestCase { /** * @dataProvider dataGetUser - * @param string $uid - * @param string|null $userDisplayName - * @param array|null $cloudIdData - * @param array $expected */ public function testGetUser(string $uid, ?string $userDisplayName, ?array $cloudIdData, array $expected): void { $provider = $this->getProvider(); diff --git a/apps/files/tests/Activity/Setting/GenericTest.php b/apps/files/tests/Activity/Setting/GenericTest.php index 1dc551be927..7e549ce9dc0 100644 --- a/apps/files/tests/Activity/Setting/GenericTest.php +++ b/apps/files/tests/Activity/Setting/GenericTest.php @@ -1,4 +1,6 @@ <?php + +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later @@ -12,7 +14,7 @@ use OCP\Server; use Test\TestCase; class GenericTest extends TestCase { - public function dataSettings() { + public static function dataSettings(): array { return [ [FavoriteAction::class], [FileChanged::class], @@ -22,18 +24,16 @@ class GenericTest extends TestCase { /** * @dataProvider dataSettings - * @param string $settingClass */ - public function testImplementsInterface($settingClass): void { + public function testImplementsInterface(string $settingClass): void { $setting = Server::get($settingClass); $this->assertInstanceOf(ISetting::class, $setting); } /** * @dataProvider dataSettings - * @param string $settingClass */ - public function testGetIdentifier($settingClass): void { + public function testGetIdentifier(string $settingClass): void { /** @var ISetting $setting */ $setting = Server::get($settingClass); $this->assertIsString($setting->getIdentifier()); @@ -41,9 +41,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataSettings - * @param string $settingClass */ - public function testGetName($settingClass): void { + public function testGetName(string $settingClass): void { /** @var ISetting $setting */ $setting = Server::get($settingClass); $this->assertIsString($setting->getName()); @@ -51,9 +50,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataSettings - * @param string $settingClass */ - public function testGetPriority($settingClass): void { + public function testGetPriority(string $settingClass): void { /** @var ISetting $setting */ $setting = Server::get($settingClass); $priority = $setting->getPriority(); @@ -64,9 +62,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataSettings - * @param string $settingClass */ - public function testCanChangeStream($settingClass): void { + public function testCanChangeStream(string $settingClass): void { /** @var ISetting $setting */ $setting = Server::get($settingClass); $this->assertIsBool($setting->canChangeStream()); @@ -74,9 +71,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataSettings - * @param string $settingClass */ - public function testIsDefaultEnabledStream($settingClass): void { + public function testIsDefaultEnabledStream(string $settingClass): void { /** @var ISetting $setting */ $setting = Server::get($settingClass); $this->assertIsBool($setting->isDefaultEnabledStream()); @@ -84,9 +80,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataSettings - * @param string $settingClass */ - public function testCanChangeMail($settingClass): void { + public function testCanChangeMail(string $settingClass): void { /** @var ISetting $setting */ $setting = Server::get($settingClass); $this->assertIsBool($setting->canChangeMail()); @@ -94,9 +89,8 @@ class GenericTest extends TestCase { /** * @dataProvider dataSettings - * @param string $settingClass */ - public function testIsDefaultEnabledMail($settingClass): void { + public function testIsDefaultEnabledMail(string $settingClass): void { /** @var ISetting $setting */ $setting = Server::get($settingClass); $this->assertIsBool($setting->isDefaultEnabledMail()); diff --git a/apps/files/tests/AdvancedCapabilitiesTest.php b/apps/files/tests/AdvancedCapabilitiesTest.php index af38c51a4a2..8f4a845b708 100644 --- a/apps/files/tests/AdvancedCapabilitiesTest.php +++ b/apps/files/tests/AdvancedCapabilitiesTest.php @@ -18,6 +18,7 @@ class AdvancedCapabilitiesTest extends TestCase { protected AdvancedCapabilities $capabilities; protected function setUp(): void { + parent::setUp(); $this->service = $this->createMock(SettingsService::class); $this->capabilities = new AdvancedCapabilities($this->service); } diff --git a/apps/files/tests/BackgroundJob/DeleteOrphanedItemsJobTest.php b/apps/files/tests/BackgroundJob/DeleteOrphanedItemsJobTest.php index e31b1574815..3f811fca407 100644 --- a/apps/files/tests/BackgroundJob/DeleteOrphanedItemsJobTest.php +++ b/apps/files/tests/BackgroundJob/DeleteOrphanedItemsJobTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -33,16 +34,16 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { $this->logger = Server::get(LoggerInterface::class); } - protected function cleanMapping($table) { + protected function cleanMapping(string $table): void { $query = $this->connection->getQueryBuilder(); - $query->delete($table)->execute(); + $query->delete($table)->executeStatement(); } - protected function getMappings($table) { + protected function getMappings(string $table): array { $query = $this->connection->getQueryBuilder(); $query->select('*') ->from($table); - $result = $query->execute(); + $result = $query->executeQuery(); $mapping = $result->fetchAll(); $result->closeCursor(); @@ -61,7 +62,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT), 'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'), 'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')), - ])->execute(); + ])->executeStatement(); $fileId = $query->getLastInsertId(); // Existing file @@ -71,7 +72,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'objectid' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT), 'objecttype' => $query->createNamedParameter('files'), 'systemtagid' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT), - ])->execute(); + ])->executeStatement(); // Non-existing file $query = $this->connection->getQueryBuilder(); @@ -80,13 +81,13 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'objectid' => $query->createNamedParameter($fileId + 1, IQueryBuilder::PARAM_INT), 'objecttype' => $query->createNamedParameter('files'), 'systemtagid' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT), - ])->execute(); + ])->executeStatement(); $mapping = $this->getMappings('systemtag_object_mapping'); $this->assertCount(2, $mapping); $job = new DeleteOrphanedItems($this->timeFactory, $this->connection, $this->logger); - $this->invokePrivate($job, 'cleanSystemTags'); + self::invokePrivate($job, 'cleanSystemTags'); $mapping = $this->getMappings('systemtag_object_mapping'); $this->assertCount(1, $mapping); @@ -94,7 +95,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { $query = $this->connection->getQueryBuilder(); $query->delete('filecache') ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT))) - ->execute(); + ->executeStatement(); $this->cleanMapping('systemtag_object_mapping'); } @@ -110,7 +111,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT), 'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'), 'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')), - ])->execute(); + ])->executeStatement(); $fileId = $query->getLastInsertId(); // Existing file @@ -120,7 +121,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'objid' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT), 'type' => $query->createNamedParameter('files'), 'categoryid' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT), - ])->execute(); + ])->executeStatement(); // Non-existing file $query = $this->connection->getQueryBuilder(); @@ -129,13 +130,13 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'objid' => $query->createNamedParameter($fileId + 1, IQueryBuilder::PARAM_INT), 'type' => $query->createNamedParameter('files'), 'categoryid' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT), - ])->execute(); + ])->executeStatement(); $mapping = $this->getMappings('vcategory_to_object'); $this->assertCount(2, $mapping); $job = new DeleteOrphanedItems($this->timeFactory, $this->connection, $this->logger); - $this->invokePrivate($job, 'cleanUserTags'); + self::invokePrivate($job, 'cleanUserTags'); $mapping = $this->getMappings('vcategory_to_object'); $this->assertCount(1, $mapping); @@ -143,7 +144,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { $query = $this->connection->getQueryBuilder(); $query->delete('filecache') ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT))) - ->execute(); + ->executeStatement(); $this->cleanMapping('vcategory_to_object'); } @@ -159,7 +160,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT), 'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'), 'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')), - ])->execute(); + ])->executeStatement(); $fileId = $query->getLastInsertId(); // Existing file @@ -170,7 +171,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'object_type' => $query->createNamedParameter('files'), 'actor_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT), 'actor_type' => $query->createNamedParameter('users'), - ])->execute(); + ])->executeStatement(); // Non-existing file $query = $this->connection->getQueryBuilder(); @@ -180,13 +181,13 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'object_type' => $query->createNamedParameter('files'), 'actor_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT), 'actor_type' => $query->createNamedParameter('users'), - ])->execute(); + ])->executeStatement(); $mapping = $this->getMappings('comments'); $this->assertCount(2, $mapping); $job = new DeleteOrphanedItems($this->timeFactory, $this->connection, $this->logger); - $this->invokePrivate($job, 'cleanComments'); + self::invokePrivate($job, 'cleanComments'); $mapping = $this->getMappings('comments'); $this->assertCount(1, $mapping); @@ -194,7 +195,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { $query = $this->connection->getQueryBuilder(); $query->delete('filecache') ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT))) - ->execute(); + ->executeStatement(); $this->cleanMapping('comments'); } @@ -210,7 +211,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'storage' => $query->createNamedParameter(1337, IQueryBuilder::PARAM_INT), 'path' => $query->createNamedParameter('apps/files/tests/deleteorphanedtagsjobtest.php'), 'path_hash' => $query->createNamedParameter(md5('apps/files/tests/deleteorphanedtagsjobtest.php')), - ])->execute(); + ])->executeStatement(); $fileId = $query->getLastInsertId(); // Existing file @@ -220,7 +221,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'object_id' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT), 'object_type' => $query->createNamedParameter('files'), 'user_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT), - ])->execute(); + ])->executeStatement(); // Non-existing file $query = $this->connection->getQueryBuilder(); @@ -229,13 +230,13 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { 'object_id' => $query->createNamedParameter($fileId + 1, IQueryBuilder::PARAM_INT), 'object_type' => $query->createNamedParameter('files'), 'user_id' => $query->createNamedParameter('Alice', IQueryBuilder::PARAM_INT), - ])->execute(); + ])->executeStatement(); $mapping = $this->getMappings('comments_read_markers'); $this->assertCount(2, $mapping); $job = new DeleteOrphanedItems($this->timeFactory, $this->connection, $this->logger); - $this->invokePrivate($job, 'cleanCommentMarkers'); + self::invokePrivate($job, 'cleanCommentMarkers'); $mapping = $this->getMappings('comments_read_markers'); $this->assertCount(1, $mapping); @@ -243,7 +244,7 @@ class DeleteOrphanedItemsJobTest extends \Test\TestCase { $query = $this->connection->getQueryBuilder(); $query->delete('filecache') ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT))) - ->execute(); + ->executeStatement(); $this->cleanMapping('comments_read_markers'); } } diff --git a/apps/files/tests/BackgroundJob/ScanFilesTest.php b/apps/files/tests/BackgroundJob/ScanFilesTest.php index ce602805aa2..00d9ed823f9 100644 --- a/apps/files/tests/BackgroundJob/ScanFilesTest.php +++ b/apps/files/tests/BackgroundJob/ScanFilesTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -32,10 +33,8 @@ class ScanFilesTest extends TestCase { use UserTrait; use MountProviderTrait; - /** @var ScanFiles */ - private $scanFiles; - /** @var IUserMountCache */ - private $mountCache; + private ScanFiles $scanFiles; + private IUserMountCache $mountCache; protected function setUp(): void { parent::setUp(); @@ -46,7 +45,7 @@ class ScanFilesTest extends TestCase { $connection = Server::get(IDBConnection::class); $this->mountCache = Server::get(IUserMountCache::class); - $this->scanFiles = $this->getMockBuilder('\OCA\Files\BackgroundJob\ScanFiles') + $this->scanFiles = $this->getMockBuilder(ScanFiles::class) ->setConstructorArgs([ $config, $dispatcher, @@ -54,12 +53,12 @@ class ScanFilesTest extends TestCase { $connection, $this->createMock(ITimeFactory::class) ]) - ->setMethods(['runScanner']) + ->onlyMethods(['runScanner']) ->getMock(); } - private function runJob() { - $this->invokePrivate($this->scanFiles, 'run', [[]]); + private function runJob(): void { + self::invokePrivate($this->scanFiles, 'run', [[]]); } private function getUser(string $userId): IUser { diff --git a/apps/files/tests/Command/DeleteOrphanedFilesTest.php b/apps/files/tests/Command/DeleteOrphanedFilesTest.php index 389ede2a74d..54b5ac6c12f 100644 --- a/apps/files/tests/Command/DeleteOrphanedFilesTest.php +++ b/apps/files/tests/Command/DeleteOrphanedFilesTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -56,7 +57,7 @@ class DeleteOrphanedFilesTest extends TestCase { parent::tearDown(); } - protected function getFile($fileId) { + protected function getFile(int $fileId): array { $query = $this->connection->getQueryBuilder(); $query->select('*') ->from('filecache') @@ -64,7 +65,7 @@ class DeleteOrphanedFilesTest extends TestCase { return $query->executeQuery()->fetchAll(); } - protected function getMounts($storageId) { + protected function getMounts(int $storageId): array { $query = $this->connection->getQueryBuilder(); $query->select('*') ->from('mounts') @@ -76,12 +77,8 @@ class DeleteOrphanedFilesTest extends TestCase { * Test clearing orphaned files */ public function testClearFiles(): void { - $input = $this->getMockBuilder(InputInterface::class) - ->disableOriginalConstructor() - ->getMock(); - $output = $this->getMockBuilder(OutputInterface::class) - ->disableOriginalConstructor() - ->getMock(); + $input = $this->createMock(InputInterface::class); + $output = $this->createMock(OutputInterface::class); $rootFolder = Server::get(IRootFolder::class); @@ -112,14 +109,18 @@ class DeleteOrphanedFilesTest extends TestCase { $this->assertSame(1, $deletedRows, 'Asserts that storage got deleted'); // parent folder, `files`, ´test` and `welcome.txt` => 4 elements + $calls = [ + '3 orphaned file cache entries deleted', + '0 orphaned file cache extended entries deleted', + '1 orphaned mount entries deleted', + ]; $output ->expects($this->exactly(3)) ->method('writeln') - ->withConsecutive( - ['3 orphaned file cache entries deleted'], - ['0 orphaned file cache extended entries deleted'], - ['1 orphaned mount entries deleted'], - ); + ->willReturnCallback(function (string $message) use (&$calls) { + $expected = array_shift($calls); + $this->assertSame($expected, $message); + }); $this->command->execute($input, $output); diff --git a/apps/files/tests/Controller/ApiControllerTest.php b/apps/files/tests/Controller/ApiControllerTest.php index 429d3c06f66..0c9d7a4fa6e 100644 --- a/apps/files/tests/Controller/ApiControllerTest.php +++ b/apps/files/tests/Controller/ApiControllerTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -31,6 +32,7 @@ use OCP\IUserSession; use OCP\Share\IAttributes; use OCP\Share\IManager; use OCP\Share\IShare; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; use Test\TestCase; @@ -40,41 +42,25 @@ use Test\TestCase; * @package OCA\Files\Controller */ class ApiControllerTest extends TestCase { - /** @var string */ - private $appName = 'files'; - /** @var IUser */ - private $user; - /** @var IRequest */ - private $request; - /** @var TagService */ - private $tagService; - /** @var IPreview|\PHPUnit\Framework\MockObject\MockObject */ - private $preview; - /** @var ApiController */ - private $apiController; - /** @var \OCP\Share\IManager */ - private $shareManager; - /** @var IConfig */ - private $config; - /** @var Folder|\PHPUnit\Framework\MockObject\MockObject */ - private $userFolder; - /** @var UserConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $userConfig; - /** @var ViewConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $viewConfig; - /** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */ - private $l10n; - /** @var IRootFolder|\PHPUnit\Framework\MockObject\MockObject */ - private $rootFolder; - /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */ - private $logger; + private string $appName = 'files'; + private IUser $user; + private IRequest $request; + private TagService $tagService; + private IPreview&MockObject $preview; + private ApiController $apiController; + private IManager $shareManager; + private IConfig $config; + private Folder&MockObject $userFolder; + private UserConfig&MockObject $userConfig; + private ViewConfig&MockObject $viewConfig; + private IL10N&MockObject $l10n; + private IRootFolder&MockObject $rootFolder; + private LoggerInterface&MockObject $logger; protected function setUp(): void { parent::setUp(); - $this->request = $this->getMockBuilder(IRequest::class) - ->disableOriginalConstructor() - ->getMock(); + $this->request = $this->createMock(IRequest::class); $this->user = $this->createMock(IUser::class); $this->user->expects($this->any()) ->method('getUID') @@ -83,19 +69,11 @@ class ApiControllerTest extends TestCase { $userSession->expects($this->any()) ->method('getUser') ->willReturn($this->user); - $this->tagService = $this->getMockBuilder(TagService::class) - ->disableOriginalConstructor() - ->getMock(); - $this->shareManager = $this->getMockBuilder(IManager::class) - ->disableOriginalConstructor() - ->getMock(); - $this->preview = $this->getMockBuilder(IPreview::class) - ->disableOriginalConstructor() - ->getMock(); + $this->tagService = $this->createMock(TagService::class); + $this->shareManager = $this->createMock(IManager::class); + $this->preview = $this->createMock(IPreview::class); $this->config = $this->createMock(IConfig::class); - $this->userFolder = $this->getMockBuilder(Folder::class) - ->disableOriginalConstructor() - ->getMock(); + $this->userFolder = $this->createMock(Folder::class); $this->userConfig = $this->createMock(UserConfig::class); $this->viewConfig = $this->createMock(ViewConfig::class); $this->l10n = $this->createMock(IL10N::class); diff --git a/apps/files/tests/Controller/ConversionApiControllerTest.php b/apps/files/tests/Controller/ConversionApiControllerTest.php index a2f1fccd978..659fbe1a956 100644 --- a/apps/files/tests/Controller/ConversionApiControllerTest.php +++ b/apps/files/tests/Controller/ConversionApiControllerTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later @@ -60,12 +61,12 @@ class ConversionApiControllerTest extends TestCase { ); } - public function testThrowsNotFoundException() { + public function testThrowsNotFoundException(): void { $this->expectException(OCSNotFoundException::class); $this->conversionApiController->convert(42, 'image/png'); } - public function testThrowsOcsException() { + public function testThrowsOcsException(): void { $this->userFolder->method('getFirstNodeById')->with(42)->willReturn($this->file); $this->fileConversionManager->method('convert')->willThrowException(new \Exception()); @@ -73,7 +74,7 @@ class ConversionApiControllerTest extends TestCase { $this->conversionApiController->convert(42, 'image/png'); } - public function testConvert() { + public function testConvert(): void { $convertedFileAbsolutePath = $this->user . '/files/test.png'; $this->userFolder->method('getFirstNodeById')->with(42)->willReturn($this->file); diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php index dd76e814054..93ef98bdec7 100644 --- a/apps/files/tests/Controller/ViewControllerTest.php +++ b/apps/files/tests/Controller/ViewControllerTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -192,7 +193,7 @@ class ViewControllerTest extends TestCase { $this->assertEquals($expected, $this->viewController->index('MyDir', 'MyView')); } - public function dataTestShortRedirect(): array { + public static function dataTestShortRedirect(): array { // openfile is true by default // opendetails is undefined by default // both will be evaluated as truthy @@ -212,7 +213,7 @@ class ViewControllerTest extends TestCase { /** * @dataProvider dataTestShortRedirect */ - public function testShortRedirect($openfile, $opendetails, $result) { + public function testShortRedirect(?string $openfile, ?string $opendetails, string $result): void { $this->appManager->expects($this->any()) ->method('isEnabledForUser') ->with('files') @@ -239,7 +240,7 @@ class ViewControllerTest extends TestCase { ->with(123456) ->willReturn($node); - $response = $this->viewController->showFile(123456, $opendetails, $openfile); + $response = $this->viewController->showFile('123456', $opendetails, $openfile); $this->assertStringContainsString($result, $response->getHeaders()['Location']); } @@ -248,13 +249,13 @@ class ViewControllerTest extends TestCase { ->method('isEnabledForUser') ->willReturn(true); - $parentNode = $this->getMockBuilder(Folder::class)->getMock(); + $parentNode = $this->createMock(Folder::class); $parentNode->expects($this->once()) ->method('getPath') ->willReturn('testuser1/files_trashbin/files/test.d1462861890/sub'); - $baseFolderFiles = $this->getMockBuilder(Folder::class)->getMock(); - $baseFolderTrash = $this->getMockBuilder(Folder::class)->getMock(); + $baseFolderFiles = $this->createMock(Folder::class); + $baseFolderTrash = $this->createMock(Folder::class); $this->rootFolder->expects($this->any()) ->method('getUserFolder') @@ -270,7 +271,7 @@ class ViewControllerTest extends TestCase { ->with(123) ->willReturn(null); - $node = $this->getMockBuilder(File::class)->getMock(); + $node = $this->createMock(File::class); $node->expects($this->once()) ->method('getParent') ->willReturn($parentNode); diff --git a/apps/files/tests/HelperTest.php b/apps/files/tests/HelperTest.php index 5900e94215c..cb1fc5ed66d 100644 --- a/apps/files/tests/HelperTest.php +++ b/apps/files/tests/HelperTest.php @@ -1,15 +1,17 @@ <?php -use OC\Files\FileInfo; -use OCA\Files\Helper; - +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. * SPDX-License-Identifier: AGPL-3.0-only */ + +use OC\Files\FileInfo; +use OCA\Files\Helper; + class HelperTest extends \Test\TestCase { - private function makeFileInfo($name, $size, $mtime, $isDir = false) { + private static function makeFileInfo($name, $size, $mtime, $isDir = false): FileInfo { return new FileInfo( '/' . $name, null, @@ -28,7 +30,7 @@ class HelperTest extends \Test\TestCase { /** * Returns a file list for testing */ - private function getTestFileList() { + private static function getTestFileList(): array { return [ self::makeFileInfo('a.txt', 4, 2.3 * pow(10, 9)), self::makeFileInfo('q.txt', 5, 150), @@ -39,7 +41,7 @@ class HelperTest extends \Test\TestCase { ]; } - public function sortDataProvider() { + public static function sortDataProvider(): array { return [ [ 'name', diff --git a/apps/files/tests/Service/TagServiceTest.php b/apps/files/tests/Service/TagServiceTest.php index 79dcf110f8a..74e58e674bb 100644 --- a/apps/files/tests/Service/TagServiceTest.php +++ b/apps/files/tests/Service/TagServiceTest.php @@ -1,5 +1,6 @@ <?php +declare(strict_types=1); /** * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2016 ownCloud, Inc. @@ -10,6 +11,7 @@ namespace OCA\Files\Tests\Service; use OCA\Files\Service\TagService; use OCP\Activity\IManager; use OCP\Files\Folder; +use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; use OCP\ITagManager; use OCP\ITags; @@ -17,6 +19,7 @@ use OCP\IUser; use OCP\IUserManager; use OCP\IUserSession; use OCP\Server; +use PHPUnit\Framework\MockObject\MockObject; /** * Class TagServiceTest @@ -26,32 +29,12 @@ use OCP\Server; * @package OCA\Files */ class TagServiceTest extends \Test\TestCase { - - /** - * @var string - */ - private $user; - - /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */ - private $userSession; - - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - private $activityManager; - - /** - * @var Folder - */ - private $root; - - /** - * @var TagService|\PHPUnit\Framework\MockObject\MockObject - */ - private $tagService; - - /** - * @var ITags - */ - private $tagger; + private string $user; + private IUserSession&MockObject $userSession; + private IManager&MockObject $activityManager; + private Folder $root; + private TagService&MockObject $tagService; + private ITags $tagger; protected function setUp(): void { parent::setUp(); @@ -70,17 +53,13 @@ class TagServiceTest extends \Test\TestCase { ->withAnyParameters() ->willReturn($user); - $this->root = \OC::$server->getUserFolder(); + $this->root = \OCP\Server::get(IRootFolder::class)->getUserFolder($this->user); $this->tagger = Server::get(ITagManager::class)->load('files'); - $this->tagService = $this->getTagService(['addActivity']); + $this->tagService = $this->getTagService(); } - /** - * @param array $methods - * @return TagService|\PHPUnit\Framework\MockObject\MockObject - */ - protected function getTagService(array $methods = []) { + protected function getTagService(array $methods = []): TagService&MockObject { return $this->getMockBuilder(TagService::class) ->setConstructorArgs([ $this->userSession, @@ -88,7 +67,7 @@ class TagServiceTest extends \Test\TestCase { $this->tagger, $this->root, ]) - ->setMethods($methods) + ->onlyMethods($methods) ->getMock(); } @@ -98,6 +77,8 @@ class TagServiceTest extends \Test\TestCase { if ($user !== null) { $user->delete(); } + + parent::tearDown(); } public function testUpdateFileTags(): void { diff --git a/apps/files_external/l10n/et_EE.js b/apps/files_external/l10n/et_EE.js index c43471fe499..9624cfcc025 100644 --- a/apps/files_external/l10n/et_EE.js +++ b/apps/files_external/l10n/et_EE.js @@ -2,13 +2,14 @@ OC.L10N.register( "files_external", { "Grant access" : "Anna ligipääs", - "Error configuring OAuth1" : "OAuth1 seadistamise tõrge", - "Please provide a valid app key and secret." : "Palun sisesta rakenduse ketiva võti ja saladus.", - "Error configuring OAuth2" : "OAuth2 seadistamise tõrge", + "Error configuring OAuth1" : "Viga OAuth1 seadistamisel", + "Please provide a valid app key and secret." : "Palun sisesta rakenduse kehtiv võti ja saladus.", + "Error configuring OAuth2" : "Viga OAuth2 seadistamisel", "Generate keys" : "Loo võtmed", "Error generating key pair" : "Viga võtmepaari loomisel", "You are not logged in" : "Sa pole sisse logitud.", "Permission denied" : "Õigus on keelatud", + "Forbidden to manage local mounts" : "Kohalike haakepunktide haldamine on keelatud", "Storage with ID \"%d\" not found" : "Andmeruumi tunnusega „%d“ ei leidu", "Invalid backend or authentication mechanism class" : "Vigane taustateenus või autentimismeetodi klass", "Invalid mount point" : "Vigane haakepunkt", @@ -19,6 +20,7 @@ OC.L10N.register( "Unsatisfied backend parameters" : "Rahuldamata taustarakenduse parameetrid", "Insufficient data: %s" : "Pole piisavalt andmeid: %s", "%s" : "%s", + "Storage with ID \"%d\" is not editable by non-admins" : "Andmeruumi tunnusega „%d“ on muudetav vaid peakasutajate poolt", "Access key" : "Ligipääsuvõti", "Secret key" : "Salavõti", "Builtin" : "Sisseehitatud", @@ -43,6 +45,7 @@ OC.L10N.register( "Login and password" : "Kasutajanimi ja salasõna", "Log-in credentials, save in session" : "Salvesta sisselogimise kasutajanimi/salasõna sessioonis", "Global credentials, manually entered" : "Käsitsi sisestatud üldine kasutajanimi/salasõna", + "Manually entered, store in database" : "Käsitsi sisestatud ja salvestub andmebaasis", "RSA public key" : "RSA avalik võti", "Public key" : "Avalik võti", "RSA private key" : "RSA privaatvõti", @@ -52,12 +55,13 @@ OC.L10N.register( "Hostname" : "Hostinimi", "Port" : "Port", "Region" : "Piirkond", + "Storage Class" : "Andmeruumi klass (Storage class)", "Enable SSL" : "SSL-i kasutamine", "Enable Path Style" : "Luba otsingtee stiilis", "Legacy (v2) authentication" : "Pärandvormis autentimine (v2)", "SSE-C encryption key" : "SSE-C krüptimisvõti", "WebDAV" : "WebDAV", - "URL" : "URL", + "URL" : "Võrguaadress", "Remote subfolder" : "Mujal olev alamkaust", "Secure https://" : "Turvaline https://", "FTP" : "FTP", @@ -73,6 +77,7 @@ OC.L10N.register( "Share" : "Jaga", "Show hidden files" : "Näita peidetud faile", "Case sensitive file system" : "Tõstutundlik failisüsteem", + "Disabling it will allow to use a case insensitive file system, but comes with a performance penalty" : "Selle valiku keelamisega saad kasutada tõstutundetut failisüsteemi, kuid sellega kaasneb jõudluskadu", "Timeout" : "Aegumine", "SMB/CIFS using OC login" : "SMB / CIFS kasutades OC sisselogimist", "OpenStack Object Storage" : "OpenStack Object Storage", @@ -80,25 +85,37 @@ OC.L10N.register( "Request timeout (seconds)" : "Päringu aegumine (sekundites)", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cURL-i tugi on PHP-s on kas paigaldamata või pole kasutusele võetud. „%s“ haakimine pole võimalik. Palun oma peakasutajat, et ta teeks cURL-i toe tagamiseks vajalikud muudatused.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP tugi on PHP-s on kas paigaldamata või pole kasutusele võetud. „%s“ haakimine pole võimalik. Palun oma peakasutajat, et ta teeks FTP toe tagamiseks vajalikud muudatused.", + "\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "„%1$s“ pole paigladatud. „%2$s“ haakimine pole võimalik. Palu oma peakasutajal või süsteemihalduril ta paigaldada.", "External storage" : "Väline andmehoidla", "External storage support" : "Väliste andmehoidlate tugi", - "Adds basic external storage support" : "Lisab väliste andmehoidlate toe baasiteratsioonis", + "Adds basic external storage support" : "Lisab väliste andmehoidlate toe põhivariandi", "Confirm" : "Kinnita", "Storage credentials" : "Andmeruumi kasutajanimi/salasõna", "To access the storage, you need to provide the authentication credentials." : "Selle andmeruumi jaoks pead autentimiseks lisama kasutajanime ja salasõna.", "Enter the storage login" : "Sisesta andmeruumi kasutajatunnus", "Enter the storage password" : "Sisesta andmeruumi kasutaja salasõna", + "Unable to update this external storage config. {statusMessage}" : "Selle välise andmeruumi seadistusi pole võimalik uuendada. {statusMessage}", + "New configuration successfully saved" : "Uue seadistuse salvestamine õnnestus", "Enter missing credentials" : "Lisa puuduvad kasutajanimi/salasõna", "Credentials successfully set" : "Kasutajanime/salasõna lisamine õnnestus", "Error while setting credentials: {error}" : "Viga kasutajanime/salasõna lisamisel: {error}", "Checking storage …" : "Kontrollin andmeruumi…", + "There was an error with this external storage." : "Selle välis andmeruumi kontekstis tekkis viga.", + "We were unable to check the external storage {basename}" : "Meil ei õnnestunud kontrollida välist andmeruumi „{basename}“", + "Examine this faulty external storage configuration" : "Kontrolli uuesti selle vigase välise andmeruumi seadistusi", "Open in Files" : "Ava failirakenduses", - "External mount error" : "Välise seostamise tõrge", - "Storage type" : "Andmehoidla tüüp", + "There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Selle välise andmeruumiga tekkis viga. Kas sa tahaksid seadistustest kontrollida haakepunkti konfiguratsiooni?", + "External mount error" : "Viga välise andmeruumi haakimisel", + "List of external storage." : "Väliste andmeruumide loend.", + "There is no external storage configured. You can configure them in your Personal settings." : "Ühtegi välist andmeruumi pole seadistatud. Saad seda teha isiklikest seadistustest.", + "There is no external storage configured and you don't have the permission to configure them." : "Ühtegi välist andmeruumi pole seadistatud ja sul pole õigust seda teha.", + "No external storage" : "Ühtegi välist andmeruumi ei leidu", + "Storage type" : "Andmeruumi tüüp", "Unknown" : "Teadmata", "Scope" : "Skoop", "Personal" : "Isiklik", "System" : "Süsteem", + "Type to select account or group." : "Kasutakonto või grupi leidmiseks kirjuta midagi.", "(Group)" : "(Grupp)", "Compatibility with Mac NFD encoding (slow)" : "Ühilduvus Mac NFD kodeeringuga (aeglane)", "Enable encryption" : "Luba krüptimine", @@ -124,6 +141,8 @@ OC.L10N.register( "Configuration" : "Seadistamine", "Available for" : "Saadaval", "Add storage" : "Lisa andmehoidla", - "Advanced settings" : "Lisavalikud" + "All people" : "Kõik inimesed", + "Advanced settings" : "Lisavalikud", + "Allow people to mount external storage" : "Luba kõigil haakida välist andmeruumi" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/et_EE.json b/apps/files_external/l10n/et_EE.json index 108e1ad18aa..eed33193c14 100644 --- a/apps/files_external/l10n/et_EE.json +++ b/apps/files_external/l10n/et_EE.json @@ -1,12 +1,13 @@ { "translations": { "Grant access" : "Anna ligipääs", - "Error configuring OAuth1" : "OAuth1 seadistamise tõrge", - "Please provide a valid app key and secret." : "Palun sisesta rakenduse ketiva võti ja saladus.", - "Error configuring OAuth2" : "OAuth2 seadistamise tõrge", + "Error configuring OAuth1" : "Viga OAuth1 seadistamisel", + "Please provide a valid app key and secret." : "Palun sisesta rakenduse kehtiv võti ja saladus.", + "Error configuring OAuth2" : "Viga OAuth2 seadistamisel", "Generate keys" : "Loo võtmed", "Error generating key pair" : "Viga võtmepaari loomisel", "You are not logged in" : "Sa pole sisse logitud.", "Permission denied" : "Õigus on keelatud", + "Forbidden to manage local mounts" : "Kohalike haakepunktide haldamine on keelatud", "Storage with ID \"%d\" not found" : "Andmeruumi tunnusega „%d“ ei leidu", "Invalid backend or authentication mechanism class" : "Vigane taustateenus või autentimismeetodi klass", "Invalid mount point" : "Vigane haakepunkt", @@ -17,6 +18,7 @@ "Unsatisfied backend parameters" : "Rahuldamata taustarakenduse parameetrid", "Insufficient data: %s" : "Pole piisavalt andmeid: %s", "%s" : "%s", + "Storage with ID \"%d\" is not editable by non-admins" : "Andmeruumi tunnusega „%d“ on muudetav vaid peakasutajate poolt", "Access key" : "Ligipääsuvõti", "Secret key" : "Salavõti", "Builtin" : "Sisseehitatud", @@ -41,6 +43,7 @@ "Login and password" : "Kasutajanimi ja salasõna", "Log-in credentials, save in session" : "Salvesta sisselogimise kasutajanimi/salasõna sessioonis", "Global credentials, manually entered" : "Käsitsi sisestatud üldine kasutajanimi/salasõna", + "Manually entered, store in database" : "Käsitsi sisestatud ja salvestub andmebaasis", "RSA public key" : "RSA avalik võti", "Public key" : "Avalik võti", "RSA private key" : "RSA privaatvõti", @@ -50,12 +53,13 @@ "Hostname" : "Hostinimi", "Port" : "Port", "Region" : "Piirkond", + "Storage Class" : "Andmeruumi klass (Storage class)", "Enable SSL" : "SSL-i kasutamine", "Enable Path Style" : "Luba otsingtee stiilis", "Legacy (v2) authentication" : "Pärandvormis autentimine (v2)", "SSE-C encryption key" : "SSE-C krüptimisvõti", "WebDAV" : "WebDAV", - "URL" : "URL", + "URL" : "Võrguaadress", "Remote subfolder" : "Mujal olev alamkaust", "Secure https://" : "Turvaline https://", "FTP" : "FTP", @@ -71,6 +75,7 @@ "Share" : "Jaga", "Show hidden files" : "Näita peidetud faile", "Case sensitive file system" : "Tõstutundlik failisüsteem", + "Disabling it will allow to use a case insensitive file system, but comes with a performance penalty" : "Selle valiku keelamisega saad kasutada tõstutundetut failisüsteemi, kuid sellega kaasneb jõudluskadu", "Timeout" : "Aegumine", "SMB/CIFS using OC login" : "SMB / CIFS kasutades OC sisselogimist", "OpenStack Object Storage" : "OpenStack Object Storage", @@ -78,25 +83,37 @@ "Request timeout (seconds)" : "Päringu aegumine (sekundites)", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cURL-i tugi on PHP-s on kas paigaldamata või pole kasutusele võetud. „%s“ haakimine pole võimalik. Palun oma peakasutajat, et ta teeks cURL-i toe tagamiseks vajalikud muudatused.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP tugi on PHP-s on kas paigaldamata või pole kasutusele võetud. „%s“ haakimine pole võimalik. Palun oma peakasutajat, et ta teeks FTP toe tagamiseks vajalikud muudatused.", + "\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "„%1$s“ pole paigladatud. „%2$s“ haakimine pole võimalik. Palu oma peakasutajal või süsteemihalduril ta paigaldada.", "External storage" : "Väline andmehoidla", "External storage support" : "Väliste andmehoidlate tugi", - "Adds basic external storage support" : "Lisab väliste andmehoidlate toe baasiteratsioonis", + "Adds basic external storage support" : "Lisab väliste andmehoidlate toe põhivariandi", "Confirm" : "Kinnita", "Storage credentials" : "Andmeruumi kasutajanimi/salasõna", "To access the storage, you need to provide the authentication credentials." : "Selle andmeruumi jaoks pead autentimiseks lisama kasutajanime ja salasõna.", "Enter the storage login" : "Sisesta andmeruumi kasutajatunnus", "Enter the storage password" : "Sisesta andmeruumi kasutaja salasõna", + "Unable to update this external storage config. {statusMessage}" : "Selle välise andmeruumi seadistusi pole võimalik uuendada. {statusMessage}", + "New configuration successfully saved" : "Uue seadistuse salvestamine õnnestus", "Enter missing credentials" : "Lisa puuduvad kasutajanimi/salasõna", "Credentials successfully set" : "Kasutajanime/salasõna lisamine õnnestus", "Error while setting credentials: {error}" : "Viga kasutajanime/salasõna lisamisel: {error}", "Checking storage …" : "Kontrollin andmeruumi…", + "There was an error with this external storage." : "Selle välis andmeruumi kontekstis tekkis viga.", + "We were unable to check the external storage {basename}" : "Meil ei õnnestunud kontrollida välist andmeruumi „{basename}“", + "Examine this faulty external storage configuration" : "Kontrolli uuesti selle vigase välise andmeruumi seadistusi", "Open in Files" : "Ava failirakenduses", - "External mount error" : "Välise seostamise tõrge", - "Storage type" : "Andmehoidla tüüp", + "There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Selle välise andmeruumiga tekkis viga. Kas sa tahaksid seadistustest kontrollida haakepunkti konfiguratsiooni?", + "External mount error" : "Viga välise andmeruumi haakimisel", + "List of external storage." : "Väliste andmeruumide loend.", + "There is no external storage configured. You can configure them in your Personal settings." : "Ühtegi välist andmeruumi pole seadistatud. Saad seda teha isiklikest seadistustest.", + "There is no external storage configured and you don't have the permission to configure them." : "Ühtegi välist andmeruumi pole seadistatud ja sul pole õigust seda teha.", + "No external storage" : "Ühtegi välist andmeruumi ei leidu", + "Storage type" : "Andmeruumi tüüp", "Unknown" : "Teadmata", "Scope" : "Skoop", "Personal" : "Isiklik", "System" : "Süsteem", + "Type to select account or group." : "Kasutakonto või grupi leidmiseks kirjuta midagi.", "(Group)" : "(Grupp)", "Compatibility with Mac NFD encoding (slow)" : "Ühilduvus Mac NFD kodeeringuga (aeglane)", "Enable encryption" : "Luba krüptimine", @@ -122,6 +139,8 @@ "Configuration" : "Seadistamine", "Available for" : "Saadaval", "Add storage" : "Lisa andmehoidla", - "Advanced settings" : "Lisavalikud" + "All people" : "Kõik inimesed", + "Advanced settings" : "Lisavalikud", + "Allow people to mount external storage" : "Luba kõigil haakida välist andmeruumi" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index 4df5dddd8db..233814a6abc 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -33,7 +33,7 @@ OC.L10N.register( "Client ID" : "ID do Cliente", "Client secret" : "Segredo do cliente", "OpenStack v2" : "OpenStack v2", - "Login" : "Entrar", + "Login" : "Nome de login", "Password" : "Senha", "Tenant name" : "Nome do inquilino", "Identity endpoint URL" : "URL do destino da identidade", @@ -42,17 +42,17 @@ OC.L10N.register( "Rackspace" : "Espaço no rack", "API key" : "Chave API", "Global credentials" : "Credenciais globais", - "Log-in credentials, save in database" : "Credenciais de acesso, salvas no banco de dados", - "Login and password" : "Login e senha", - "Log-in credentials, save in session" : "Credenciais de login, guardadas em sessão", + "Log-in credentials, save in database" : "Credenciais de acesso, armazenar no banco de dados", + "Login and password" : "Nome de login e senha", + "Log-in credentials, save in session" : "Credenciais de login, armazenar na sessão", "Global credentials, manually entered" : "Credenciais globais, inseridas manualmente", - "Manually entered, store in database" : "Inserido manualmente, armazenado no banco de dados", + "Manually entered, store in database" : "Inseridos manualmente, armazenados no banco de dados", "RSA public key" : "Chave pública RSA", "Public key" : "Chave pública", "RSA private key" : "Chave privada RSA", "Private key" : "Chave privada", - "Kerberos default realm, defaults to \"WORKGROUP\"" : "reino padrão do Kerberos, padrão para \"WORKGROUP\"", - "Kerberos ticket Apache mode" : "Bilhete Kerberos Modo Apache", + "Kerberos default realm, defaults to \"WORKGROUP\"" : "Reino padrão do Kerberos, o padrão é \"WORKGROUP\"", + "Kerberos ticket Apache mode" : "Modo Apache de Ticket Kerberos", "Kerberos ticket" : "Ticket Kerberos", "Amazon S3" : "Amazon S3", "Bucket" : "Cesta", @@ -81,13 +81,13 @@ OC.L10N.register( "SMB/CIFS" : "SMB/CIFS", "Share" : "Compartilhar", "Show hidden files" : "Mostrar arquivos ocultos", - "Case sensitive file system" : "Sistema de arquivos sensível a maiúsculas", + "Case sensitive file system" : "Sistema de arquivos diferenciando maiúsculas/minúsculas", "Disabling it will allow to use a case insensitive file system, but comes with a performance penalty" : "Desativá-lo permitirá usar um sistema de arquivos que não diferencia maiúsculas de minúsculas, mas acarretará uma penalidade de desempenho", "Verify ACL access when listing files" : "Verifique o acesso da ACL ao listar arquivos", "Check the ACL's of each file or folder inside a directory to filter out items where the account has no read permissions, comes with a performance penalty" : "Verifique as ACLs de cada arquivo ou pasta dentro de um diretório para filtrar itens onde a conta não tem permissões de leitura, o que acarreta uma penalidade de desempenho", "Timeout" : "Tempo limite", - "SMB/CIFS using OC login" : "SMB/CIFS usandoo login OC", - "Login as share" : "Faça login como compartilhar", + "SMB/CIFS using OC login" : "SMB/CIFS usando login OC", + "Login as share" : "Faça login como compartilhamento", "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo limite para requisição (segundos)", @@ -101,21 +101,21 @@ OC.L10N.register( "Confirm" : "Confirmar", "Storage credentials" : "Credenciais de armazenamento", "To access the storage, you need to provide the authentication credentials." : "Para acessar o armazenamento, você precisa fornecer as credenciais de autenticação.", - "Enter the storage login" : "Digite o login de armazenamento", + "Enter the storage login" : "Digite o nome de login de armazenamento", "Enter the storage password" : "Digite a senha de armazenamento", "Unable to update this external storage config. {statusMessage}" : "Não é possível atualizar esta configuração de armazenamento externo. {statusMessage}", "New configuration successfully saved" : "Nova configuração salva com sucesso", "Enter missing credentials" : "Digite as credenciais ausentes", - "Credentials successfully set" : "Credenciais configuradas com sucesso", - "Error while setting credentials: {error}" : "Erro ao configurar as credenciais: {error}", + "Credentials successfully set" : "Credenciais definidas com sucesso", + "Error while setting credentials: {error}" : "Erro ao definir as credenciais: {error}", "Checking storage …" : "Verificação do armazenamento …", "There was an error with this external storage." : "Ocorreu um erro com este armazenamento externo.", "We were unable to check the external storage {basename}" : "Não foi possível verificar o armazenamento externo {basename}", "Examine this faulty external storage configuration" : "Examine esta configuração de armazenamento externo com falha", - "Open in Files" : "Abrir em arquivos", + "Open in Files" : "Abrir em Arquivos", "There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Ocorreu um erro com este armazenamento externo. Deseja revisar esta configuração do ponto de montagem na página de configurações?", "External mount error" : "Erro de montagem externa", - "List of external storage." : "Lista de armazenamento externo.", + "List of external storage." : "Lista de armazenamentos externos.", "There is no external storage configured. You can configure them in your Personal settings." : "Não há armazenamento externo configurado. Você pode configurá-los em suas configurações pessoais.", "There is no external storage configured and you don't have the permission to configure them." : "Não há armazenamento externo configurado e você não tem permissão para configurá-los.", "No external storage" : "Sem armazenamento externo", @@ -135,10 +135,10 @@ OC.L10N.register( "Once every direct access" : "Uma vez a cada acesso direto", "Read only" : "Somente leitura", "Disconnect" : "Desconectar", - "Unknown backend: {backendName}" : "Backend desconhecido: {backendName}", + "Unknown backend: {backendName}" : "Back-end desconhecido: {backendName}", "Admin defined" : "Definido pelo administrador", "Automatic status checking is disabled due to the large number of configured storages, click to check status" : "A verificação automática de status está desabilitada devido ao grande número de armazenamentos configurados, clique para verificar o status", - "Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Tem certeza de que deseja desconectar este armazenamento externo? Isso tornará o armazenamento indisponível no Nextcloud e levará à exclusão desses arquivos e pastas em qualquer cliente de sincronização que esteja conectado no momento, mas não excluirá nenhum arquivo e pasta no próprio armazenamento externo.", + "Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Tem certeza de que deseja desconectar este armazenamento externo? Isso tornará o armazenamento indisponível no Nextcloud e levará à exclusão destes arquivos e pastas em qualquer cliente de sincronização que esteja conectado no momento, mas não excluirá nenhum arquivo e pasta do armazenamento externo em si.", "Delete storage?" : "Excluir armazenamento?", "Click to recheck the configuration" : "Clique para rechecar a configuração", "Saved" : "Salvo", diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index 02fd258d356..6002404e464 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -31,7 +31,7 @@ "Client ID" : "ID do Cliente", "Client secret" : "Segredo do cliente", "OpenStack v2" : "OpenStack v2", - "Login" : "Entrar", + "Login" : "Nome de login", "Password" : "Senha", "Tenant name" : "Nome do inquilino", "Identity endpoint URL" : "URL do destino da identidade", @@ -40,17 +40,17 @@ "Rackspace" : "Espaço no rack", "API key" : "Chave API", "Global credentials" : "Credenciais globais", - "Log-in credentials, save in database" : "Credenciais de acesso, salvas no banco de dados", - "Login and password" : "Login e senha", - "Log-in credentials, save in session" : "Credenciais de login, guardadas em sessão", + "Log-in credentials, save in database" : "Credenciais de acesso, armazenar no banco de dados", + "Login and password" : "Nome de login e senha", + "Log-in credentials, save in session" : "Credenciais de login, armazenar na sessão", "Global credentials, manually entered" : "Credenciais globais, inseridas manualmente", - "Manually entered, store in database" : "Inserido manualmente, armazenado no banco de dados", + "Manually entered, store in database" : "Inseridos manualmente, armazenados no banco de dados", "RSA public key" : "Chave pública RSA", "Public key" : "Chave pública", "RSA private key" : "Chave privada RSA", "Private key" : "Chave privada", - "Kerberos default realm, defaults to \"WORKGROUP\"" : "reino padrão do Kerberos, padrão para \"WORKGROUP\"", - "Kerberos ticket Apache mode" : "Bilhete Kerberos Modo Apache", + "Kerberos default realm, defaults to \"WORKGROUP\"" : "Reino padrão do Kerberos, o padrão é \"WORKGROUP\"", + "Kerberos ticket Apache mode" : "Modo Apache de Ticket Kerberos", "Kerberos ticket" : "Ticket Kerberos", "Amazon S3" : "Amazon S3", "Bucket" : "Cesta", @@ -79,13 +79,13 @@ "SMB/CIFS" : "SMB/CIFS", "Share" : "Compartilhar", "Show hidden files" : "Mostrar arquivos ocultos", - "Case sensitive file system" : "Sistema de arquivos sensível a maiúsculas", + "Case sensitive file system" : "Sistema de arquivos diferenciando maiúsculas/minúsculas", "Disabling it will allow to use a case insensitive file system, but comes with a performance penalty" : "Desativá-lo permitirá usar um sistema de arquivos que não diferencia maiúsculas de minúsculas, mas acarretará uma penalidade de desempenho", "Verify ACL access when listing files" : "Verifique o acesso da ACL ao listar arquivos", "Check the ACL's of each file or folder inside a directory to filter out items where the account has no read permissions, comes with a performance penalty" : "Verifique as ACLs de cada arquivo ou pasta dentro de um diretório para filtrar itens onde a conta não tem permissões de leitura, o que acarreta uma penalidade de desempenho", "Timeout" : "Tempo limite", - "SMB/CIFS using OC login" : "SMB/CIFS usandoo login OC", - "Login as share" : "Faça login como compartilhar", + "SMB/CIFS using OC login" : "SMB/CIFS usando login OC", + "Login as share" : "Faça login como compartilhamento", "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo limite para requisição (segundos)", @@ -99,21 +99,21 @@ "Confirm" : "Confirmar", "Storage credentials" : "Credenciais de armazenamento", "To access the storage, you need to provide the authentication credentials." : "Para acessar o armazenamento, você precisa fornecer as credenciais de autenticação.", - "Enter the storage login" : "Digite o login de armazenamento", + "Enter the storage login" : "Digite o nome de login de armazenamento", "Enter the storage password" : "Digite a senha de armazenamento", "Unable to update this external storage config. {statusMessage}" : "Não é possível atualizar esta configuração de armazenamento externo. {statusMessage}", "New configuration successfully saved" : "Nova configuração salva com sucesso", "Enter missing credentials" : "Digite as credenciais ausentes", - "Credentials successfully set" : "Credenciais configuradas com sucesso", - "Error while setting credentials: {error}" : "Erro ao configurar as credenciais: {error}", + "Credentials successfully set" : "Credenciais definidas com sucesso", + "Error while setting credentials: {error}" : "Erro ao definir as credenciais: {error}", "Checking storage …" : "Verificação do armazenamento …", "There was an error with this external storage." : "Ocorreu um erro com este armazenamento externo.", "We were unable to check the external storage {basename}" : "Não foi possível verificar o armazenamento externo {basename}", "Examine this faulty external storage configuration" : "Examine esta configuração de armazenamento externo com falha", - "Open in Files" : "Abrir em arquivos", + "Open in Files" : "Abrir em Arquivos", "There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Ocorreu um erro com este armazenamento externo. Deseja revisar esta configuração do ponto de montagem na página de configurações?", "External mount error" : "Erro de montagem externa", - "List of external storage." : "Lista de armazenamento externo.", + "List of external storage." : "Lista de armazenamentos externos.", "There is no external storage configured. You can configure them in your Personal settings." : "Não há armazenamento externo configurado. Você pode configurá-los em suas configurações pessoais.", "There is no external storage configured and you don't have the permission to configure them." : "Não há armazenamento externo configurado e você não tem permissão para configurá-los.", "No external storage" : "Sem armazenamento externo", @@ -133,10 +133,10 @@ "Once every direct access" : "Uma vez a cada acesso direto", "Read only" : "Somente leitura", "Disconnect" : "Desconectar", - "Unknown backend: {backendName}" : "Backend desconhecido: {backendName}", + "Unknown backend: {backendName}" : "Back-end desconhecido: {backendName}", "Admin defined" : "Definido pelo administrador", "Automatic status checking is disabled due to the large number of configured storages, click to check status" : "A verificação automática de status está desabilitada devido ao grande número de armazenamentos configurados, clique para verificar o status", - "Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Tem certeza de que deseja desconectar este armazenamento externo? Isso tornará o armazenamento indisponível no Nextcloud e levará à exclusão desses arquivos e pastas em qualquer cliente de sincronização que esteja conectado no momento, mas não excluirá nenhum arquivo e pasta no próprio armazenamento externo.", + "Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Tem certeza de que deseja desconectar este armazenamento externo? Isso tornará o armazenamento indisponível no Nextcloud e levará à exclusão destes arquivos e pastas em qualquer cliente de sincronização que esteja conectado no momento, mas não excluirá nenhum arquivo e pasta do armazenamento externo em si.", "Delete storage?" : "Excluir armazenamento?", "Click to recheck the configuration" : "Clique para rechecar a configuração", "Saved" : "Salvo", diff --git a/apps/files_sharing/css/404.css b/apps/files_sharing/css/404.css index 160a8f83fc3..7542c7cfae1 100644 --- a/apps/files_sharing/css/404.css +++ b/apps/files_sharing/css/404.css @@ -3,7 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ #body-login .error-broken-link{ - text-align:left;color:#fff; + text-align:start;color:#fff; } #body-login .error-broken-link ul{ diff --git a/apps/files_sharing/l10n/et_EE.js b/apps/files_sharing/l10n/et_EE.js index bbf9425b62d..3ab0c7c797b 100644 --- a/apps/files_sharing/l10n/et_EE.js +++ b/apps/files_sharing/l10n/et_EE.js @@ -80,11 +80,12 @@ OC.L10N.register( "Sharing %s failed because the back end does not support ScienceMesh shares" : "„%s“ jagamine ei õnnestunud, sest taustateenus ei toeta ScienceMeshi meedia jagamist", "Unknown share type" : "Tundmatu jagamise tüüp", "Not a directory" : "Ei ole kaust", - "Could not lock node" : "Sõlme ei õnnestunud lukustada", + "Could not lock node" : "Sõlme lukustamine ei õnnestunud", "Public upload is only possible for publicly shared folders" : "Avalik üleslaadminie on võimalik ainult avalikult jagatud kaustades", "Share must at least have READ or CREATE permissions" : "jaosmeedial peavad olema vähemalt logemis- ja loomisõigused", + "Share must have READ permission if UPDATE or DELETE permission is set" : "Kui jaosmeedial on muutmis ja kustutamisõigus, siis peab olema ka lugemisõigus", "Public upload disabled by the administrator" : "Avalik üleslaadimine on administraatori poolt keelatud", - "Could not lock path" : "Ei saanud rada lukustada", + "Could not lock path" : "Asukoha lukustamine ei õnnestunud", "no sharing rights on this item" : "selle objekti kontekstis pole jagamisõigusi", "You are not allowed to edit incoming shares" : "Sul pole lubatud vastuvõetud jaosmeediat muuta", "Wrong or no update parameter given" : "Antud vale või aegunud parameeter", @@ -230,7 +231,7 @@ OC.L10N.register( "Create a new share link" : "Loo uus jagamislink", "Quick share options, the current selected is \"{selectedOption}\"" : "Kiirjagamise valikud, hetkel on valitud „{selectedOption}“", "View only" : "Ainult vaatamine", - "Can edit" : "Võib redigeerida", + "Can edit" : "Võib muuta", "Custom permissions" : "Kohandatud õigused", "Resharing is not allowed" : "Edasijagamine pole lubatud", "Name or email …" : "Nimi või e-posti aadress…", @@ -253,6 +254,7 @@ OC.L10N.register( "File drop" : "Failiedastus", "Upload files to {foldername}." : "Laadi failid üles kausta {foldername}.", "By uploading files, you agree to the terms of service." : "Faile üleslaadides nõustud sa kasutustingimustega.", + "Successfully uploaded files" : "Failide üleslaadimine õnnestus", "View terms of service" : "Vaata kasutustingimusi", "Terms of service" : "Kasutustingimused", "Upload files to {folder}" : "Laadi failid üles kausta {folder}", @@ -356,7 +358,7 @@ OC.L10N.register( "File requests" : "Failipäringud", "List of file requests." : "Failipäringute loend.", "No file requests" : "Failipäringuid ei leidu", - "File requests you have created will show up here" : "Sinu loodud failipäringus saavad olema nähtavad siin.", + "File requests you have created will show up here" : "Sinu loodud failipäringud saavad olema nähtavad siin.", "Deleted shares" : "Kustutatud jagamised", "List of shares you left." : "Jaosmeedia loend, kust sa oled lahkunud.", "No deleted shares" : "Kustutatud jagamisi pole", diff --git a/apps/files_sharing/l10n/et_EE.json b/apps/files_sharing/l10n/et_EE.json index d5a086f454a..e746432509a 100644 --- a/apps/files_sharing/l10n/et_EE.json +++ b/apps/files_sharing/l10n/et_EE.json @@ -78,11 +78,12 @@ "Sharing %s failed because the back end does not support ScienceMesh shares" : "„%s“ jagamine ei õnnestunud, sest taustateenus ei toeta ScienceMeshi meedia jagamist", "Unknown share type" : "Tundmatu jagamise tüüp", "Not a directory" : "Ei ole kaust", - "Could not lock node" : "Sõlme ei õnnestunud lukustada", + "Could not lock node" : "Sõlme lukustamine ei õnnestunud", "Public upload is only possible for publicly shared folders" : "Avalik üleslaadminie on võimalik ainult avalikult jagatud kaustades", "Share must at least have READ or CREATE permissions" : "jaosmeedial peavad olema vähemalt logemis- ja loomisõigused", + "Share must have READ permission if UPDATE or DELETE permission is set" : "Kui jaosmeedial on muutmis ja kustutamisõigus, siis peab olema ka lugemisõigus", "Public upload disabled by the administrator" : "Avalik üleslaadimine on administraatori poolt keelatud", - "Could not lock path" : "Ei saanud rada lukustada", + "Could not lock path" : "Asukoha lukustamine ei õnnestunud", "no sharing rights on this item" : "selle objekti kontekstis pole jagamisõigusi", "You are not allowed to edit incoming shares" : "Sul pole lubatud vastuvõetud jaosmeediat muuta", "Wrong or no update parameter given" : "Antud vale või aegunud parameeter", @@ -228,7 +229,7 @@ "Create a new share link" : "Loo uus jagamislink", "Quick share options, the current selected is \"{selectedOption}\"" : "Kiirjagamise valikud, hetkel on valitud „{selectedOption}“", "View only" : "Ainult vaatamine", - "Can edit" : "Võib redigeerida", + "Can edit" : "Võib muuta", "Custom permissions" : "Kohandatud õigused", "Resharing is not allowed" : "Edasijagamine pole lubatud", "Name or email …" : "Nimi või e-posti aadress…", @@ -251,6 +252,7 @@ "File drop" : "Failiedastus", "Upload files to {foldername}." : "Laadi failid üles kausta {foldername}.", "By uploading files, you agree to the terms of service." : "Faile üleslaadides nõustud sa kasutustingimustega.", + "Successfully uploaded files" : "Failide üleslaadimine õnnestus", "View terms of service" : "Vaata kasutustingimusi", "Terms of service" : "Kasutustingimused", "Upload files to {folder}" : "Laadi failid üles kausta {folder}", @@ -354,7 +356,7 @@ "File requests" : "Failipäringud", "List of file requests." : "Failipäringute loend.", "No file requests" : "Failipäringuid ei leidu", - "File requests you have created will show up here" : "Sinu loodud failipäringus saavad olema nähtavad siin.", + "File requests you have created will show up here" : "Sinu loodud failipäringud saavad olema nähtavad siin.", "Deleted shares" : "Kustutatud jagamised", "List of shares you left." : "Jaosmeedia loend, kust sa oled lahkunud.", "No deleted shares" : "Kustutatud jagamisi pole", diff --git a/apps/files_sharing/l10n/eu.js b/apps/files_sharing/l10n/eu.js index 5ff41b708cb..5c933b4fec9 100644 --- a/apps/files_sharing/l10n/eu.js +++ b/apps/files_sharing/l10n/eu.js @@ -90,6 +90,8 @@ OC.L10N.register( "You are not allowed to edit incoming shares" : "Ez duzu baimenik zuri partekaturikoak editatzeko", "Wrong or no update parameter given" : "Eguneraketa parametrorik ez da eman edo okerra da", "\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "\"Nextcloud Talk-ek pasahitza bidaltzeak\" huts egin du ez dagoelako Nextcloud Talk gaituta fitxategi edo karpeta bat partekatzeko.", + "Custom share link tokens have been disabled by the administrator" : "Administratzaileak esteka pertsonalizatuen tokenak sortzeko aukera ezgaitu du", + "Tokens must contain at least 1 character and may only contain letters, numbers, or a hyphen" : "Tokenek gutxienez karaktere 1 izan behar dute, eta letrak, zenbakiak edo marratxo bat baino ezin dituzte eduki", "Invalid date. Format must be YYYY-MM-DD" : "Data baliogabea. UUU-HH-EE gisako formatua izan behar du", "No sharing rights on this item" : "Ez dago baimenik fitxategi hau partekatzeko", "Invalid share attributes provided: \"%s\"" : "Baliogabeko partekatze atributuak eman dira: \"%s\"", @@ -97,6 +99,7 @@ OC.L10N.register( "No mail notification configured for this share type" : "Partekatze mota honentzat ez dago email jakinarazpenik konfiguratuta", "Wrong password" : "Pasahitz okerra", "Error while sending mail notification" : "Errorea email jakinarazpena bidaltzean", + "Failed to generate a unique token" : "Ezin izan da token bakar bat sortu", "This share does not exist or is no longer available" : "Partekatze hau ez dago edo jada ez dago erabilgarri", "shared by %s" : "%s erabiltzaileak partekatua", "Download" : "Deskargatu", @@ -182,6 +185,8 @@ OC.L10N.register( "Set default folder for accepted shares" : "Ezarri onartutako partekatzeen karpeta lehenetsia", "Reset" : "Berrezarri", "Reset folder to system default" : "Berrezarri karpeta sistemaren balio lehenetsietara", + "Share expiration: " : "Partekatzearen iraungitze-data:", + "Share Expiration" : "Partekatzearen iraungitze-data", "group" : "taldea", "conversation" : "elkarrizketa", "remote" : "urrunekoa", @@ -245,11 +250,14 @@ OC.L10N.register( "Deck board" : "Deck mahaia", "ScienceMesh" : "ScienceMesh", "on {server}" : "{server} zerbitzarian", + "Enter external recipients" : "Sartu kanpoko hartzaileak", + "Search for internal recipients" : "Bilatu barruko hartzaileak", "Note from" : "Oharra bidali du", "Note:" : "Oharra:", "File drop" : "Fitxategiak jaregin", "Upload files to {foldername}." : "Igo fitxategiak {foldername}(e)ra.", "By uploading files, you agree to the terms of service." : "Fitxategiak igotzean, zerbitzu-baldintzak onartzen dituzu.", + "Successfully uploaded files" : "Fitxategiak ongi igo dira", "View terms of service" : "Ikusi zerbitzu-balditzak", "Terms of service" : "Erabilera baldintzak", "Upload files to {folder}" : "Igo fitxategiak {folder}(e)ra", @@ -272,12 +280,18 @@ OC.L10N.register( "Edit" : "Aldatu", "Share" : "Partekatu", "Delete" : "Ezabatu", + "Password field cannot be empty" : "Pasahitz-eremua ezin da hutsik egon", "Replace current password" : "Aldatu uneko pasahitza", + "Failed to generate a new token" : "Ezin izan da token berri bat sortu", "Allow upload and editing" : "Onartu igotzea eta editatzea", "Allow editing" : "Baimendu editatzea", "Upload only" : "Igoera soilik", "Advanced settings" : "Ezarpen aurreratuak", "Share label" : "Partekatu etiketa", + "Share link token" : "Partekatzeko esteka-tokena", + "Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Ezarri partekatze-estekaren token publikoa gogoratzeko erraza den zerbait, edo sortu token berria. Ez da gomendagarria informazio sentikorra duten partekatzeetako tokenak asma daitezkeenak erabiltzea.", + "Generating…" : "Sortzen...", + "Generate new token" : "Sortu token berria", "Set password" : "Pasahitza ezarri", "Password expires {passwordExpirationTime}" : "Pasahitza {passwordExpirationTime} iraungiko da", "Password expired" : "Pasahitza iraungi da", @@ -288,6 +302,7 @@ OC.L10N.register( "Allow download and sync" : "Baimendu deskargatu eta sinkronizatzea", "Note to recipient" : "Oharra hartzailearentzat", "Enter a note for the share recipient" : "Sartu ohar bat partekatzearen hartzailearentzat", + "Show files in grid view" : "Erakutsi fitxategiak sareta ikuspegian", "Delete share" : "Ezabatu partekatzea", "Others with access" : "Sarbidea duten beste erabiltzaileak", "No other accounts with access found" : "Ez da aurkitu sarbidea duen beste konturik", @@ -296,12 +311,22 @@ OC.L10N.register( "Unable to fetch inherited shares" : "Ezin izan dira heredatutako partekatzeak eskuratu", "Link shares" : "Lotu partekatzeak", "Shares" : "Partekatzeak", + "Use this method to share files with individuals or teams within your organization. If the recipient already has access to the share but cannot locate it, you can send them the internal share link for easy access." : "Erabili metodo hau zure erakundeko banako edo taldeekin fitxategiak partekatzeko. Hartzaileak dagoeneko baimena badu partekatutako elementurako baina ezin badu aurkitu, bidali iezaiozu barneko partekatze-esteka, sarbidea errazteko.", + "Use this method to share files with individuals or organizations outside your organization. Files and folders can be shared via public share links and email addresses. You can also share to other Nextcloud accounts hosted on different instances using their federated cloud ID." : "Erabili metodo hau zure erakundeaz kanpoko banako edo erakundeekin fitxategiak partekatzeko. Fitxategiak eta karpetak parteka ditzakezu esteka publikoen bidez edo helbide elektronikoen bidez. Bestelako Nextcloud kontuetara ere parteka ditzakezu, beste instantziatan daudenak, haien federatutako hodeiaren ID-a erabiliz.", + "Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Barneko zein kanpoko partekatzeetan sartzen ez diren partekatzeak. Hauetakoren bat aplikazioetatik edo beste iturri batzuetatik etorritako partekatzeak izan daitezke.", + "Share with accounts, teams, federated cloud IDs" : "Partekatu kontuekin, taldeekin edo federatutako hodeien ID-ekin", + "Share with accounts and teams" : "Partekatu kontuekin eta taldeekin", + "Email, federated cloud ID" : "Posta elektroniko, federatutako hodeien ID", "Unable to load the shares list" : "Ezin izan da partekatzeen zerrenda kargatu", "Expires {relativetime}" : "Iraungitzea: {relativetime}", "this share just expired." : "partekatze hau oraintxe iraungi da.", "Shared with you by {owner}" : "{owner} erabiltzaileak zurekin partekatua", "Internal shares" : "Barneko partekatzeak", + "Internal shares explanation" : "Barneko partekatzeen azalpena ", "External shares" : "Kanpoko sareak", + "External shares explanation" : "Kanpoko partekatzeen azalpena", + "Additional shares" : "Partekatze gehigarriak", + "Additional shares explanation" : "Partekatze gehigarrien azalpena", "Link to a file" : "Esteka fitxategi batera", "_Accept share_::_Accept shares_" : ["Onartu partekatzea","Onartu partekatzeak"], "Open in Files" : "Ireki Fitxategiak aplikazioan", @@ -395,6 +420,8 @@ OC.L10N.register( "_1 email address already added_::_{count} email addresses already added_" : ["Helbide elektroniko 1 gehitu da dagoeneko","{count} helbide elektroniko gehitu dira dagoeneko"], "_1 email address added_::_{count} email addresses added_" : ["Helbide elektroniko 1 gehitu da","{count} helbide elektroniko gehitu dira"], "Search for share recipients" : "Bilatu partekatze-hartzaileak", - "No recommendations. Start typing." : "Gomendiorik ez. Hasi idazten." + "No recommendations. Start typing." : "Gomendiorik ez. Hasi idazten.", + "Share with accounts, teams, federated cloud id" : "Partekatu kontuekin, taldeekin edo federatutako hodeien ID-ekin", + "Email, federated cloud id" : "Posta elektroniko, federatutako hodeien ID" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/eu.json b/apps/files_sharing/l10n/eu.json index fd592005648..40eac16d694 100644 --- a/apps/files_sharing/l10n/eu.json +++ b/apps/files_sharing/l10n/eu.json @@ -88,6 +88,8 @@ "You are not allowed to edit incoming shares" : "Ez duzu baimenik zuri partekaturikoak editatzeko", "Wrong or no update parameter given" : "Eguneraketa parametrorik ez da eman edo okerra da", "\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "\"Nextcloud Talk-ek pasahitza bidaltzeak\" huts egin du ez dagoelako Nextcloud Talk gaituta fitxategi edo karpeta bat partekatzeko.", + "Custom share link tokens have been disabled by the administrator" : "Administratzaileak esteka pertsonalizatuen tokenak sortzeko aukera ezgaitu du", + "Tokens must contain at least 1 character and may only contain letters, numbers, or a hyphen" : "Tokenek gutxienez karaktere 1 izan behar dute, eta letrak, zenbakiak edo marratxo bat baino ezin dituzte eduki", "Invalid date. Format must be YYYY-MM-DD" : "Data baliogabea. UUU-HH-EE gisako formatua izan behar du", "No sharing rights on this item" : "Ez dago baimenik fitxategi hau partekatzeko", "Invalid share attributes provided: \"%s\"" : "Baliogabeko partekatze atributuak eman dira: \"%s\"", @@ -95,6 +97,7 @@ "No mail notification configured for this share type" : "Partekatze mota honentzat ez dago email jakinarazpenik konfiguratuta", "Wrong password" : "Pasahitz okerra", "Error while sending mail notification" : "Errorea email jakinarazpena bidaltzean", + "Failed to generate a unique token" : "Ezin izan da token bakar bat sortu", "This share does not exist or is no longer available" : "Partekatze hau ez dago edo jada ez dago erabilgarri", "shared by %s" : "%s erabiltzaileak partekatua", "Download" : "Deskargatu", @@ -180,6 +183,8 @@ "Set default folder for accepted shares" : "Ezarri onartutako partekatzeen karpeta lehenetsia", "Reset" : "Berrezarri", "Reset folder to system default" : "Berrezarri karpeta sistemaren balio lehenetsietara", + "Share expiration: " : "Partekatzearen iraungitze-data:", + "Share Expiration" : "Partekatzearen iraungitze-data", "group" : "taldea", "conversation" : "elkarrizketa", "remote" : "urrunekoa", @@ -243,11 +248,14 @@ "Deck board" : "Deck mahaia", "ScienceMesh" : "ScienceMesh", "on {server}" : "{server} zerbitzarian", + "Enter external recipients" : "Sartu kanpoko hartzaileak", + "Search for internal recipients" : "Bilatu barruko hartzaileak", "Note from" : "Oharra bidali du", "Note:" : "Oharra:", "File drop" : "Fitxategiak jaregin", "Upload files to {foldername}." : "Igo fitxategiak {foldername}(e)ra.", "By uploading files, you agree to the terms of service." : "Fitxategiak igotzean, zerbitzu-baldintzak onartzen dituzu.", + "Successfully uploaded files" : "Fitxategiak ongi igo dira", "View terms of service" : "Ikusi zerbitzu-balditzak", "Terms of service" : "Erabilera baldintzak", "Upload files to {folder}" : "Igo fitxategiak {folder}(e)ra", @@ -270,12 +278,18 @@ "Edit" : "Aldatu", "Share" : "Partekatu", "Delete" : "Ezabatu", + "Password field cannot be empty" : "Pasahitz-eremua ezin da hutsik egon", "Replace current password" : "Aldatu uneko pasahitza", + "Failed to generate a new token" : "Ezin izan da token berri bat sortu", "Allow upload and editing" : "Onartu igotzea eta editatzea", "Allow editing" : "Baimendu editatzea", "Upload only" : "Igoera soilik", "Advanced settings" : "Ezarpen aurreratuak", "Share label" : "Partekatu etiketa", + "Share link token" : "Partekatzeko esteka-tokena", + "Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Ezarri partekatze-estekaren token publikoa gogoratzeko erraza den zerbait, edo sortu token berria. Ez da gomendagarria informazio sentikorra duten partekatzeetako tokenak asma daitezkeenak erabiltzea.", + "Generating…" : "Sortzen...", + "Generate new token" : "Sortu token berria", "Set password" : "Pasahitza ezarri", "Password expires {passwordExpirationTime}" : "Pasahitza {passwordExpirationTime} iraungiko da", "Password expired" : "Pasahitza iraungi da", @@ -286,6 +300,7 @@ "Allow download and sync" : "Baimendu deskargatu eta sinkronizatzea", "Note to recipient" : "Oharra hartzailearentzat", "Enter a note for the share recipient" : "Sartu ohar bat partekatzearen hartzailearentzat", + "Show files in grid view" : "Erakutsi fitxategiak sareta ikuspegian", "Delete share" : "Ezabatu partekatzea", "Others with access" : "Sarbidea duten beste erabiltzaileak", "No other accounts with access found" : "Ez da aurkitu sarbidea duen beste konturik", @@ -294,12 +309,22 @@ "Unable to fetch inherited shares" : "Ezin izan dira heredatutako partekatzeak eskuratu", "Link shares" : "Lotu partekatzeak", "Shares" : "Partekatzeak", + "Use this method to share files with individuals or teams within your organization. If the recipient already has access to the share but cannot locate it, you can send them the internal share link for easy access." : "Erabili metodo hau zure erakundeko banako edo taldeekin fitxategiak partekatzeko. Hartzaileak dagoeneko baimena badu partekatutako elementurako baina ezin badu aurkitu, bidali iezaiozu barneko partekatze-esteka, sarbidea errazteko.", + "Use this method to share files with individuals or organizations outside your organization. Files and folders can be shared via public share links and email addresses. You can also share to other Nextcloud accounts hosted on different instances using their federated cloud ID." : "Erabili metodo hau zure erakundeaz kanpoko banako edo erakundeekin fitxategiak partekatzeko. Fitxategiak eta karpetak parteka ditzakezu esteka publikoen bidez edo helbide elektronikoen bidez. Bestelako Nextcloud kontuetara ere parteka ditzakezu, beste instantziatan daudenak, haien federatutako hodeiaren ID-a erabiliz.", + "Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Barneko zein kanpoko partekatzeetan sartzen ez diren partekatzeak. Hauetakoren bat aplikazioetatik edo beste iturri batzuetatik etorritako partekatzeak izan daitezke.", + "Share with accounts, teams, federated cloud IDs" : "Partekatu kontuekin, taldeekin edo federatutako hodeien ID-ekin", + "Share with accounts and teams" : "Partekatu kontuekin eta taldeekin", + "Email, federated cloud ID" : "Posta elektroniko, federatutako hodeien ID", "Unable to load the shares list" : "Ezin izan da partekatzeen zerrenda kargatu", "Expires {relativetime}" : "Iraungitzea: {relativetime}", "this share just expired." : "partekatze hau oraintxe iraungi da.", "Shared with you by {owner}" : "{owner} erabiltzaileak zurekin partekatua", "Internal shares" : "Barneko partekatzeak", + "Internal shares explanation" : "Barneko partekatzeen azalpena ", "External shares" : "Kanpoko sareak", + "External shares explanation" : "Kanpoko partekatzeen azalpena", + "Additional shares" : "Partekatze gehigarriak", + "Additional shares explanation" : "Partekatze gehigarrien azalpena", "Link to a file" : "Esteka fitxategi batera", "_Accept share_::_Accept shares_" : ["Onartu partekatzea","Onartu partekatzeak"], "Open in Files" : "Ireki Fitxategiak aplikazioan", @@ -393,6 +418,8 @@ "_1 email address already added_::_{count} email addresses already added_" : ["Helbide elektroniko 1 gehitu da dagoeneko","{count} helbide elektroniko gehitu dira dagoeneko"], "_1 email address added_::_{count} email addresses added_" : ["Helbide elektroniko 1 gehitu da","{count} helbide elektroniko gehitu dira"], "Search for share recipients" : "Bilatu partekatze-hartzaileak", - "No recommendations. Start typing." : "Gomendiorik ez. Hasi idazten." + "No recommendations. Start typing." : "Gomendiorik ez. Hasi idazten.", + "Share with accounts, teams, federated cloud id" : "Partekatu kontuekin, taldeekin edo federatutako hodeien ID-ekin", + "Email, federated cloud id" : "Posta elektroniko, federatutako hodeien ID" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/fa.js b/apps/files_sharing/l10n/fa.js index 21c1715227e..e2148a257d0 100644 --- a/apps/files_sharing/l10n/fa.js +++ b/apps/files_sharing/l10n/fa.js @@ -15,6 +15,7 @@ OC.L10N.register( "You removed yourself" : "شما خدتان را حذف کردید", "Share for {user} expired" : "اشتراک برای {user} منقضی شده است", "Share expired" : "اشتراک منقضی شد", + "{actor} shared {file} with you" : "{actor} {file} را با شما به اشتراک گذاشت", "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "یک پرونده یا پوشه به اشتراک گذاشته شده از طریق پست یا از طریق لینک عمومی بارگیری شد", "A file or folder was shared from <strong>another server</strong>" : "یک پرونده یا پوشه از سرور دیگر به اشتراک گذاشته شد", "Sharing" : "اشتراک گذاری", @@ -150,6 +151,7 @@ OC.L10N.register( "Unable to fetch inherited shares" : "واگذاری سهام ارثی امکان پذیر نیست", "Shares" : "اشتراک گذاری ها", "Unable to load the shares list" : "لیست سهام بارگیری نمی شود", + "Expires {relativetime}" : "منقضی در {relativetime}", "this share just expired." : "این اشتراک تازه منقضی شد", "Shared with you by {owner}" : "به اشتراک گذاشته شده با شما توسط {owner}", "Link to a file" : "پیوند به یک پرونده", @@ -158,6 +160,7 @@ OC.L10N.register( "_Reject share_::_Reject shares_" : ["Reject share","Reject shares"], "_Restore share_::_Restore shares_" : ["Restore share","Restore shares"], "Shared" : "به اشتراک گذاشته شده ", + "Shared multiple times with different people" : "Shared multiple times with different people", "Shared with others" : "موارد به اشتراک گذاشته شده با دیگران", "Public file share" : "اشتراک عمومی پرونده", "Publicly shared file." : "پرونده بصورت عمومی به اشتراک گذاشته شده است", diff --git a/apps/files_sharing/l10n/fa.json b/apps/files_sharing/l10n/fa.json index 444d6173913..03df10efc91 100644 --- a/apps/files_sharing/l10n/fa.json +++ b/apps/files_sharing/l10n/fa.json @@ -13,6 +13,7 @@ "You removed yourself" : "شما خدتان را حذف کردید", "Share for {user} expired" : "اشتراک برای {user} منقضی شده است", "Share expired" : "اشتراک منقضی شد", + "{actor} shared {file} with you" : "{actor} {file} را با شما به اشتراک گذاشت", "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "یک پرونده یا پوشه به اشتراک گذاشته شده از طریق پست یا از طریق لینک عمومی بارگیری شد", "A file or folder was shared from <strong>another server</strong>" : "یک پرونده یا پوشه از سرور دیگر به اشتراک گذاشته شد", "Sharing" : "اشتراک گذاری", @@ -148,6 +149,7 @@ "Unable to fetch inherited shares" : "واگذاری سهام ارثی امکان پذیر نیست", "Shares" : "اشتراک گذاری ها", "Unable to load the shares list" : "لیست سهام بارگیری نمی شود", + "Expires {relativetime}" : "منقضی در {relativetime}", "this share just expired." : "این اشتراک تازه منقضی شد", "Shared with you by {owner}" : "به اشتراک گذاشته شده با شما توسط {owner}", "Link to a file" : "پیوند به یک پرونده", @@ -156,6 +158,7 @@ "_Reject share_::_Reject shares_" : ["Reject share","Reject shares"], "_Restore share_::_Restore shares_" : ["Restore share","Restore shares"], "Shared" : "به اشتراک گذاشته شده ", + "Shared multiple times with different people" : "Shared multiple times with different people", "Shared with others" : "موارد به اشتراک گذاشته شده با دیگران", "Public file share" : "اشتراک عمومی پرونده", "Publicly shared file." : "پرونده بصورت عمومی به اشتراک گذاشته شده است", diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js index 3c82171b04b..6185d4fcfc2 100644 --- a/apps/files_sharing/l10n/ja.js +++ b/apps/files_sharing/l10n/ja.js @@ -257,6 +257,7 @@ OC.L10N.register( "File drop" : "ファイルを転送", "Upload files to {foldername}." : "{foldername}にファイルをアップロード", "By uploading files, you agree to the terms of service." : "ファイルをアップロードすることで、利用規約に同意したことになります。", + "Successfully uploaded files" : "ファイルのアップロードに成功しました", "View terms of service" : "利用規約を見る", "Terms of service" : "サービス利用規約", "Upload files to {folder}" : "{folder}にファイルをアップロード", diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json index 30b967a6848..fe3629aa4da 100644 --- a/apps/files_sharing/l10n/ja.json +++ b/apps/files_sharing/l10n/ja.json @@ -255,6 +255,7 @@ "File drop" : "ファイルを転送", "Upload files to {foldername}." : "{foldername}にファイルをアップロード", "By uploading files, you agree to the terms of service." : "ファイルをアップロードすることで、利用規約に同意したことになります。", + "Successfully uploaded files" : "ファイルのアップロードに成功しました", "View terms of service" : "利用規約を見る", "Terms of service" : "サービス利用規約", "Upload files to {folder}" : "{folder}にファイルをアップロード", diff --git a/apps/files_sharing/l10n/sr.js b/apps/files_sharing/l10n/sr.js index 48323c82d47..4a2c7230e0e 100644 --- a/apps/files_sharing/l10n/sr.js +++ b/apps/files_sharing/l10n/sr.js @@ -257,6 +257,7 @@ OC.L10N.register( "File drop" : "Место за упуштање фајлова", "Upload files to {foldername}." : "Отпреми фајлове у {foldername}.", "By uploading files, you agree to the terms of service." : "Отпремањем фајлова, слажете се са условима коришћења.", + "Successfully uploaded files" : "Фајлови су успешно отпремљени", "View terms of service" : "Прикажи услове коришћења", "Terms of service" : "Услови коришћења", "Upload files to {folder}" : "Отпреми фајлове у {folder}", diff --git a/apps/files_sharing/l10n/sr.json b/apps/files_sharing/l10n/sr.json index 04897bc3598..64fb1ab2187 100644 --- a/apps/files_sharing/l10n/sr.json +++ b/apps/files_sharing/l10n/sr.json @@ -255,6 +255,7 @@ "File drop" : "Место за упуштање фајлова", "Upload files to {foldername}." : "Отпреми фајлове у {foldername}.", "By uploading files, you agree to the terms of service." : "Отпремањем фајлова, слажете се са условима коришћења.", + "Successfully uploaded files" : "Фајлови су успешно отпремљени", "View terms of service" : "Прикажи услове коришћења", "Terms of service" : "Услови коришћења", "Upload files to {folder}" : "Отпреми фајлове у {folder}", diff --git a/apps/files_sharing/l10n/sv.js b/apps/files_sharing/l10n/sv.js index e5af3c5e4c3..afd677b187b 100644 --- a/apps/files_sharing/l10n/sv.js +++ b/apps/files_sharing/l10n/sv.js @@ -257,6 +257,7 @@ OC.L10N.register( "File drop" : "Filinkast", "Upload files to {foldername}." : "Ladda upp filer till {foldername}.", "By uploading files, you agree to the terms of service." : "Genom att ladda upp filer godkänner du användarvillkoren.", + "Successfully uploaded files" : "Filer har laddats upp", "View terms of service" : "Visa användarvillkoren", "Terms of service" : "Användarvillkor", "Upload files to {folder}" : "Ladda upp filer till {folder}", diff --git a/apps/files_sharing/l10n/sv.json b/apps/files_sharing/l10n/sv.json index 8be901a9c3d..89e44650c43 100644 --- a/apps/files_sharing/l10n/sv.json +++ b/apps/files_sharing/l10n/sv.json @@ -255,6 +255,7 @@ "File drop" : "Filinkast", "Upload files to {foldername}." : "Ladda upp filer till {foldername}.", "By uploading files, you agree to the terms of service." : "Genom att ladda upp filer godkänner du användarvillkoren.", + "Successfully uploaded files" : "Filer har laddats upp", "View terms of service" : "Visa användarvillkoren", "Terms of service" : "Användarvillkor", "Upload files to {folder}" : "Ladda upp filer till {folder}", diff --git a/apps/files_sharing/l10n/zh_TW.js b/apps/files_sharing/l10n/zh_TW.js index fc86c1306e7..9f2a7ae3b85 100644 --- a/apps/files_sharing/l10n/zh_TW.js +++ b/apps/files_sharing/l10n/zh_TW.js @@ -257,6 +257,7 @@ OC.L10N.register( "File drop" : "檔案投遞", "Upload files to {foldername}." : "上傳檔案至 {foldername}。", "By uploading files, you agree to the terms of service." : "上傳檔案即表示您同意服務條款。", + "Successfully uploaded files" : "已成功上傳檔案", "View terms of service" : "檢視服務條款", "Terms of service" : "服務條款", "Upload files to {folder}" : "上傳檔案到 {folder}", diff --git a/apps/files_sharing/l10n/zh_TW.json b/apps/files_sharing/l10n/zh_TW.json index af5b6ecabf5..35e7ec603d5 100644 --- a/apps/files_sharing/l10n/zh_TW.json +++ b/apps/files_sharing/l10n/zh_TW.json @@ -255,6 +255,7 @@ "File drop" : "檔案投遞", "Upload files to {foldername}." : "上傳檔案至 {foldername}。", "By uploading files, you agree to the terms of service." : "上傳檔案即表示您同意服務條款。", + "Successfully uploaded files" : "已成功上傳檔案", "View terms of service" : "檢視服務條款", "Terms of service" : "服務條款", "Upload files to {folder}" : "上傳檔案到 {folder}", diff --git a/apps/files_sharing/openapi.json b/apps/files_sharing/openapi.json index 68420dde80e..89c82843939 100644 --- a/apps/files_sharing/openapi.json +++ b/apps/files_sharing/openapi.json @@ -1490,6 +1490,13 @@ 1 ] } + }, + { + "name": "X-NC-Preview", + "in": "header", + "schema": { + "type": "string" + } } ], "responses": { @@ -1574,11 +1581,13 @@ "password": { "type": "string", "nullable": true, + "default": null, "description": "Password of the share" }, "dir": { "type": "string", "nullable": true, + "default": null, "description": "Subdirectory to get info about" }, "depth": { @@ -1782,12 +1791,14 @@ "path": { "type": "string", "nullable": true, + "default": null, "description": "Path of the share" }, "permissions": { "type": "integer", "format": "int64", "nullable": true, + "default": null, "description": "Permissions for the share" }, "shareType": { @@ -1799,11 +1810,13 @@ "shareWith": { "type": "string", "nullable": true, + "default": null, "description": "The entity this should be shared with" }, "publicUpload": { "type": "string", "nullable": true, + "default": null, "enum": [ "true", "false" @@ -1818,11 +1831,13 @@ "sendPasswordByTalk": { "type": "string", "nullable": true, + "default": null, "description": "Send the password for the share over Talk" }, "expireDate": { "type": "string", "nullable": true, + "default": null, "description": "The expiry date of the share in the user's timezone at 00:00. If $expireDate is not supplied or set to `null`, the system default will be used." }, "note": { @@ -1838,11 +1853,13 @@ "attributes": { "type": "string", "nullable": true, + "default": null, "description": "Additional attributes for the share" }, "sendMail": { "type": "string", "nullable": true, + "default": null, "enum": [ "false", "true" @@ -2297,56 +2314,67 @@ "type": "integer", "format": "int64", "nullable": true, + "default": null, "description": "New permissions" }, "password": { "type": "string", "nullable": true, + "default": null, "description": "New password" }, "sendPasswordByTalk": { "type": "string", "nullable": true, + "default": null, "description": "New condition if the password should be send over Talk" }, "publicUpload": { "type": "string", "nullable": true, + "default": null, "description": "New condition if public uploading is allowed" }, "expireDate": { "type": "string", "nullable": true, + "default": null, "description": "New expiry date" }, "note": { "type": "string", "nullable": true, + "default": null, "description": "New note" }, "label": { "type": "string", "nullable": true, + "default": null, "description": "New label" }, "hideDownload": { "type": "string", "nullable": true, + "default": null, "description": "New condition if the download should be hidden" }, "attributes": { "type": "string", "nullable": true, + "default": null, "description": "New additional attributes" }, "sendMail": { "type": "string", "nullable": true, + "default": null, "description": "if the share should be send by mail. Considering the share already exists, no mail will be send after the share is updated. You will have to use the sendMail action to send the mail." }, "token": { "type": "string", "nullable": true, + "default": null, "description": "New token" } } @@ -3099,7 +3127,8 @@ "description": "Limit to specific item types", "schema": { "type": "string", - "nullable": true + "nullable": true, + "default": null } }, { @@ -3128,6 +3157,7 @@ "description": "Limit to specific share types", "schema": { "nullable": true, + "default": null, "oneOf": [ { "type": "integer", @@ -3267,6 +3297,7 @@ "description": "Limit to specific share types", "schema": { "nullable": true, + "default": null, "oneOf": [ { "type": "integer", diff --git a/apps/files_sharing/tests/Command/CleanupRemoteStoragesTest.php b/apps/files_sharing/tests/Command/CleanupRemoteStoragesTest.php index 888b2cdd596..769516cda85 100644 --- a/apps/files_sharing/tests/Command/CleanupRemoteStoragesTest.php +++ b/apps/files_sharing/tests/Command/CleanupRemoteStoragesTest.php @@ -11,6 +11,7 @@ use OCP\Federation\ICloudId; use OCP\Federation\ICloudIdManager; use OCP\IDBConnection; use OCP\Server; +use PHPUnit\Framework\MockObject\MockObject; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Test\TestCase; @@ -24,20 +25,9 @@ use Test\TestCase; */ class CleanupRemoteStoragesTest extends TestCase { - /** - * @var CleanupRemoteStorages - */ - private $command; - - /** - * @var IDBConnection - */ - private $connection; - - /** - * @var ICloudIdManager|\PHPUnit\Framework\MockObject\MockObject - */ - private $cloudIdManager; + protected IDBConnection $connection; + protected CleanupRemoteStorages $command; + private ICloudIdManager&MockObject $cloudIdManager; private $storages = [ ['id' => 'shared::7b4a322b22f9d0047c38d77d471ce3cf', 'share_token' => 'f2c69dad1dc0649f26976fd210fc62e1', 'remote' => 'https://hostname.tld/owncloud1', 'user' => 'user1'], @@ -77,7 +67,7 @@ class CleanupRemoteStoragesTest extends TestCase { foreach ($this->storages as &$storage) { if (isset($storage['id'])) { $storageQuery->setParameter('id', $storage['id']); - $storageQuery->execute(); + $storageQuery->executeStatement(); $storage['numeric_id'] = $storageQuery->getLastInsertId(); } @@ -121,13 +111,13 @@ class CleanupRemoteStoragesTest extends TestCase { foreach ($this->storages as $storage) { if (isset($storage['id'])) { $storageQuery->setParameter('id', $storage['id']); - $storageQuery->execute(); + $storageQuery->executeStatement(); } if (isset($storage['share_token'])) { $shareExternalQuery->setParameter('share_token', $storage['share_token']); $shareExternalQuery->setParameter('remote', $storage['remote']); - $shareExternalQuery->execute(); + $shareExternalQuery->executeStatement(); } } @@ -174,14 +164,13 @@ class CleanupRemoteStoragesTest extends TestCase { ->getMock(); // parent folder, `files`, ´test` and `welcome.txt` => 4 elements - + $outputCalls = []; $output ->expects($this->any()) ->method('writeln') - ->withConsecutive( - ['5 remote storage(s) need(s) to be checked'], - ['5 remote share(s) exist'], - ); + ->willReturnCallback(function (string $text) use (&$outputCalls) { + $outputCalls[] = $text; + }); $this->cloudIdManager ->expects($this->any()) @@ -206,5 +195,10 @@ class CleanupRemoteStoragesTest extends TestCase { $this->assertFalse($this->doesStorageExist($this->storages[3]['numeric_id'])); $this->assertTrue($this->doesStorageExist($this->storages[4]['numeric_id'])); $this->assertFalse($this->doesStorageExist($this->storages[5]['numeric_id'])); + + $this->assertEquals([ + '5 remote storage(s) need(s) to be checked', + '5 remote share(s) exist', + ], array_slice($outputCalls, 0, 2)); } } diff --git a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php index 02c133ee5d1..203e09e217e 100644 --- a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php +++ b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php @@ -1675,8 +1675,11 @@ class ShareAPIControllerTest extends TestCase { ->with('spreed') ->willReturn(true); - $helper = $this->getMockBuilder('\OCA\Talk\Share\Helper\ShareAPIController') - ->setMethods(['canAccessShare']) + // This is not possible anymore with PHPUnit 10+ + // as `setMethods` was removed and now real reflection is used, thus the class needs to exist. + // $helper = $this->getMockBuilder('\OCA\Talk\Share\Helper\ShareAPIController') + $helper = $this->getMockBuilder(\stdClass::class) + ->addMethods(['canAccessShare']) ->getMock(); $helper->method('canAccessShare') ->with($share, $this->currentUser) @@ -2492,8 +2495,11 @@ class ShareAPIControllerTest extends TestCase { ->with('spreed') ->willReturn(true); - $helper = $this->getMockBuilder('\OCA\Talk\Share\Helper\ShareAPIController') - ->setMethods(['createShare']) + // This is not possible anymore with PHPUnit 10+ + // as `setMethods` was removed and now real reflection is used, thus the class needs to exist. + // $helper = $this->getMockBuilder('\OCA\Talk\Share\Helper\ShareAPIController') + $helper = $this->getMockBuilder(\stdClass::class) + ->addMethods(['createShare']) ->getMock(); $helper->method('createShare') ->with( @@ -2598,7 +2604,10 @@ class ShareAPIControllerTest extends TestCase { ->with('spreed') ->willReturn(true); - $helper = $this->getMockBuilder('\OCA\Talk\Share\Helper\ShareAPIController') + // This is not possible anymore with PHPUnit 10+ + // as `setMethods` was removed and now real reflection is used, thus the class needs to exist. + // $helper = $this->getMockBuilder('\OCA\Talk\Share\Helper\ShareAPIController') + $helper = $this->getMockBuilder(\stdClass::class) ->addMethods(['createShare']) ->getMock(); $helper->method('createShare') @@ -5093,8 +5102,11 @@ class ShareAPIControllerTest extends TestCase { ->with('spreed') ->willReturn(true); - $helper = $this->getMockBuilder('\OCA\Talk\Share\Helper\ShareAPIController') - ->setMethods(['formatShare', 'canAccessShare']) + // This is not possible anymore with PHPUnit 10+ + // as `setMethods` was removed and now real reflection is used, thus the class needs to exist. + // $helper = $this->getMockBuilder('\OCA\Talk\Share\Helper\ShareAPIController') + $helper = $this->getMockBuilder(\stdClass::class) + ->addMethods(['formatShare', 'canAccessShare']) ->getMock(); $helper->method('formatShare') ->with($share) diff --git a/apps/files_sharing/tests/Controller/ShareInfoControllerTest.php b/apps/files_sharing/tests/Controller/ShareInfoControllerTest.php index f2df74fd01b..571647829f2 100644 --- a/apps/files_sharing/tests/Controller/ShareInfoControllerTest.php +++ b/apps/files_sharing/tests/Controller/ShareInfoControllerTest.php @@ -15,15 +15,13 @@ use OCP\IRequest; use OCP\Share\Exceptions\ShareNotFound; use OCP\Share\IManager as ShareManager; use OCP\Share\IShare; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class ShareInfoControllerTest extends TestCase { - /** @var ShareInfoController */ - private $controller; - - /** @var ShareManager|\PHPUnit\Framework\MockObject\MockObject */ - private $shareManager; + protected ShareInfoController $controller; + protected ShareManager&MockObject $shareManager; protected function setUp(): void { @@ -31,14 +29,11 @@ class ShareInfoControllerTest extends TestCase { $this->shareManager = $this->createMock(ShareManager::class); - $this->controller = $this->getMockBuilder(ShareInfoController::class) - ->setConstructorArgs([ - 'files_sharing', - $this->createMock(IRequest::class), - $this->shareManager - ]) - ->setMethods(['addROWrapper']) - ->getMock(); + $this->controller = new ShareInfoController( + 'files_sharing', + $this->createMock(IRequest::class), + $this->shareManager + ); } public function testNoShare(): void { diff --git a/apps/files_sharing/tests/External/ManagerTest.php b/apps/files_sharing/tests/External/ManagerTest.php index 611392c286e..5314d1ec00f 100644 --- a/apps/files_sharing/tests/External/ManagerTest.php +++ b/apps/files_sharing/tests/External/ManagerTest.php @@ -33,6 +33,7 @@ use OCP\IUserSession; use OCP\OCS\IDiscoveryService; use OCP\Server; use OCP\Share\IShare; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; use Test\Traits\UserTrait; @@ -46,42 +47,19 @@ use Test\Traits\UserTrait; class ManagerTest extends TestCase { use UserTrait; - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $contactsManager; - - /** @var Manager|\PHPUnit\Framework\MockObject\MockObject * */ - private $manager; - - /** @var \OC\Files\Mount\Manager */ - private $mountManager; - - /** @var IClientService|\PHPUnit\Framework\MockObject\MockObject */ - private $clientService; - - /** @var ICloudFederationProviderManager|\PHPUnit\Framework\MockObject\MockObject */ - private $cloudFederationProviderManager; - - /** @var ICloudFederationFactory|\PHPUnit\Framework\MockObject\MockObject */ - private $cloudFederationFactory; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IGroupManager */ - private $groupManager; - - /** @var \PHPUnit\Framework\MockObject\MockObject|IUserManager */ - private $userManager; - - /** @var LoggerInterface */ - private $logger; - - private $uid; - - /** - * @var IUser - */ - private $user; - private $testMountProvider; - /** @var IEventDispatcher|\PHPUnit\Framework\MockObject\MockObject */ - private $eventDispatcher; + protected string $uid; + protected IUser $user; + protected MountProvider $testMountProvider; + protected IEventDispatcher&MockObject $eventDispatcher; + protected LoggerInterface&MockObject $logger; + protected \OC\Files\Mount\Manager $mountManager; + protected IManager&MockObject $contactsManager; + protected Manager&MockObject $manager; + protected IClientService&MockObject $clientService; + protected ICloudFederationProviderManager&MockObject $cloudFederationProviderManager; + protected ICloudFederationFactory&MockObject $cloudFederationFactory; + protected IGroupManager&MockObject $groupManager; + protected IUserManager&MockObject $userManager; protected function setUp(): void { parent::setUp(); @@ -169,7 +147,7 @@ class ManagerTest extends TestCase { $this->eventDispatcher, $this->logger, ] - )->setMethods(['tryOCMEndPoint'])->getMock(); + )->onlyMethods(['tryOCMEndPoint'])->getMock(); } private function setupMounts() { @@ -222,14 +200,12 @@ class ManagerTest extends TestCase { if ($isGroup) { $this->manager->expects($this->never())->method('tryOCMEndPoint'); } else { - $this->manager->method('tryOCMEndPoint') - ->withConsecutive( - ['http://localhost', 'token1', '2342', 'accept'], - ['http://localhost', 'token3', '2342', 'decline'], - )->willReturnOnConsecutiveCalls( - false, - false, - ); + $this->manager->expects(self::atLeast(2)) + ->method('tryOCMEndPoint') + ->willReturnMap([ + ['http://localhost', 'token1', '2342', 'accept', false], + ['http://localhost', 'token3', '2342', 'decline', false], + ]); } // Add a share for "user" diff --git a/apps/files_sharing/tests/MountProviderTest.php b/apps/files_sharing/tests/MountProviderTest.php index 285af51f022..4a1eb673a06 100644 --- a/apps/files_sharing/tests/MountProviderTest.php +++ b/apps/files_sharing/tests/MountProviderTest.php @@ -20,29 +20,21 @@ use OCP\IUserManager; use OCP\Share\IAttributes as IShareAttributes; use OCP\Share\IManager; use OCP\Share\IShare; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; /** * @group DB */ class MountProviderTest extends \Test\TestCase { - /** @var MountProvider */ - private $provider; - /** @var IConfig|MockObject */ - private $config; + protected MountProvider $provider; - /** @var IUser|MockObject */ - private $user; - - /** @var IStorageFactory|MockObject */ - private $loader; - - /** @var IManager|MockObject */ - private $shareManager; - - /** @var LoggerInterface|MockObject */ - private $logger; + protected IUser&MockObject $user; + protected IConfig&MockObject $config; + protected IManager&MockObject $shareManager; + protected IStorageFactory&MockObject $loader; + protected LoggerInterface&MockObject $logger; protected function setUp(): void { parent::setUp(); @@ -144,38 +136,34 @@ class MountProviderTest extends \Test\TestCase { ]; // tests regarding circles and sciencemesh are made in the apps themselves. $circleShares = []; - $sciencemeshShares = []; + $scienceMeshShares = []; $this->user->expects($this->any()) ->method('getUID') ->willReturn('user1'); $this->shareManager->expects($this->exactly(6)) ->method('getSharedWith') - ->withConsecutive( - ['user1', IShare::TYPE_USER], - ['user1', IShare::TYPE_GROUP, null, -1], - ['user1', IShare::TYPE_CIRCLE, null, -1], - ['user1', IShare::TYPE_ROOM, null, -1], - ['user1', IShare::TYPE_DECK, null, -1], - ['user1', IShare::TYPE_SCIENCEMESH, null, -1], - )->willReturnOnConsecutiveCalls( - $userShares, - $groupShares, - $circleShares, - $roomShares, - $deckShares, - $sciencemeshShares - ); + ->willReturnMap([ + ['user1', IShare::TYPE_USER, null, -1, 0, $userShares], + ['user1', IShare::TYPE_GROUP, null, -1, 0, $groupShares], + ['user1', IShare::TYPE_CIRCLE, null, -1, 0, $circleShares], + ['user1', IShare::TYPE_ROOM, null, -1, 0, $roomShares], + ['user1', IShare::TYPE_DECK, null, -1, 0, $deckShares], + ['user1', IShare::TYPE_SCIENCEMESH, null, -1, 0, $scienceMeshShares], + ]); + $this->shareManager->expects($this->any()) ->method('newShare') ->willReturnCallback(function () use ($rootFolder, $userManager) { return new Share($rootFolder, $userManager); }); + $mounts = $this->provider->getMountsForUser($this->user, $this->loader); $this->assertCount(4, $mounts); $this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mounts[0]); $this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mounts[1]); $this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mounts[2]); $this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mounts[3]); + /** @var OCA\Files_Sharing\SharedMount[] $mounts */ $mountedShare1 = $mounts[0]->getShare(); $this->assertEquals('2', $mountedShare1->getId()); $this->assertEquals('user2', $mountedShare1->getShareOwner()); @@ -204,7 +192,7 @@ class MountProviderTest extends \Test\TestCase { $this->assertEquals(31, $mountedShare4->getPermissions()); } - public function mergeSharesDataProvider() { + public static function mergeSharesDataProvider(): array { // note: the user in the specs here is the shareOwner not recipient // the recipient is always "user1" return [ @@ -368,24 +356,18 @@ class MountProviderTest extends \Test\TestCase { $circleShares = []; $roomShares = []; $deckShares = []; - $sciencemeshShares = []; + $scienceMeshShares = []; $this->shareManager->expects($this->exactly(6)) ->method('getSharedWith') - ->withConsecutive( - ['user1', IShare::TYPE_USER], - ['user1', IShare::TYPE_GROUP, null, -1], - ['user1', IShare::TYPE_CIRCLE, null, -1], - ['user1', IShare::TYPE_ROOM, null, -1], - ['user1', IShare::TYPE_DECK, null, -1], - ['user1', IShare::TYPE_SCIENCEMESH, null, -1], - )->willReturnOnConsecutiveCalls( - $userShares, - $groupShares, - $circleShares, - $roomShares, - $deckShares, - $sciencemeshShares - ); + ->willReturnMap([ + ['user1', IShare::TYPE_USER, null, -1, 0, $userShares], + ['user1', IShare::TYPE_GROUP, null, -1, 0, $groupShares], + ['user1', IShare::TYPE_CIRCLE, null, -1, 0, $circleShares], + ['user1', IShare::TYPE_ROOM, null, -1, 0, $roomShares], + ['user1', IShare::TYPE_DECK, null, -1, 0, $deckShares], + ['user1', IShare::TYPE_SCIENCEMESH, null, -1, 0, $scienceMeshShares], + ]); + $this->shareManager->expects($this->any()) ->method('newShare') ->willReturnCallback(function () use ($rootFolder, $userManager) { @@ -407,6 +389,7 @@ class MountProviderTest extends \Test\TestCase { $this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mount); // supershare + /** @var OCA\Files_Sharing\SharedMount $mount */ $share = $mount->getShare(); $this->assertEquals($expectedShare[0], $share->getId()); diff --git a/apps/files_trashbin/l10n/fa.js b/apps/files_trashbin/l10n/fa.js index da76294a244..55b89e58982 100644 --- a/apps/files_trashbin/l10n/fa.js +++ b/apps/files_trashbin/l10n/fa.js @@ -6,10 +6,12 @@ OC.L10N.register( "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)", "Restore" : "بازیابی", "Cancel" : "منصرف شدن", + "Deletion cancelled" : "Deletion cancelled", "Deleted" : "حذف شده", "A long time ago" : "مدت ها پیش", "Unknown" : "ناشناخته", "All files" : "تمامی فایلها", + "You" : "You", "List of files that have been deleted." : "List of files that have been deleted.", "No deleted files" : "هیچ فایل حذف شده وجود ندارد", "Files and folders you have deleted will show up here" : "Files and folders you have deleted will show up here" diff --git a/apps/files_trashbin/l10n/fa.json b/apps/files_trashbin/l10n/fa.json index 22ee88dd2f0..18cdca47044 100644 --- a/apps/files_trashbin/l10n/fa.json +++ b/apps/files_trashbin/l10n/fa.json @@ -4,10 +4,12 @@ "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)", "Restore" : "بازیابی", "Cancel" : "منصرف شدن", + "Deletion cancelled" : "Deletion cancelled", "Deleted" : "حذف شده", "A long time ago" : "مدت ها پیش", "Unknown" : "ناشناخته", "All files" : "تمامی فایلها", + "You" : "You", "List of files that have been deleted." : "List of files that have been deleted.", "No deleted files" : "هیچ فایل حذف شده وجود ندارد", "Files and folders you have deleted will show up here" : "Files and folders you have deleted will show up here" diff --git a/apps/files_trashbin/l10n/fi.js b/apps/files_trashbin/l10n/fi.js index 20ad0ecdcfb..2ce9a4f2c18 100644 --- a/apps/files_trashbin/l10n/fi.js +++ b/apps/files_trashbin/l10n/fi.js @@ -4,6 +4,7 @@ OC.L10N.register( "restored" : "palautettu", "Deleted files" : "Poistetut tiedostot", "Restore" : "Palauta", + "Not enough free space to restore the file/folder" : "Tiedoston/kansion palauttamiseksi ei ole riittävästi vapaata tilaa", "Empty deleted files" : "Tyhjennä poistetut tiedostot", "Confirm permanent deletion" : "Vahvista lopullinen poistaminen", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "Haluatko varmasti poistaa pysyvästi kaikki roskakorissa olevat tiedostot ja kansiot? Tätä ei voi perua.", diff --git a/apps/files_trashbin/l10n/fi.json b/apps/files_trashbin/l10n/fi.json index cea7d0c42e1..9d2b9fd3a37 100644 --- a/apps/files_trashbin/l10n/fi.json +++ b/apps/files_trashbin/l10n/fi.json @@ -2,6 +2,7 @@ "restored" : "palautettu", "Deleted files" : "Poistetut tiedostot", "Restore" : "Palauta", + "Not enough free space to restore the file/folder" : "Tiedoston/kansion palauttamiseksi ei ole riittävästi vapaata tilaa", "Empty deleted files" : "Tyhjennä poistetut tiedostot", "Confirm permanent deletion" : "Vahvista lopullinen poistaminen", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "Haluatko varmasti poistaa pysyvästi kaikki roskakorissa olevat tiedostot ja kansiot? Tätä ei voi perua.", diff --git a/apps/files_trashbin/l10n/ja.js b/apps/files_trashbin/l10n/ja.js index cb018fc6275..a69b4f5179f 100644 --- a/apps/files_trashbin/l10n/ja.js +++ b/apps/files_trashbin/l10n/ja.js @@ -7,6 +7,7 @@ OC.L10N.register( "This application enables people to restore files that were deleted from the system." : "このアプリケーションを使用すると、利用者はシステムから削除されたファイルを復元できます。", "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "このアプリケーションを使用すると、システムから削除されたファイルを復元できます。Webインターフェイスには削除されたファイルのリストが表示され、これらの削除されたファイルを元の場所に復元するか、システムから完全に削除するかを選択できます。バージョン管理アプリが有効になっている場合、ファイルを復元すると関連するファイルのバージョンも復元されます。削除された共有ファイルは同じ方法で復元できますが、共有は復元されません。デフォルトでは、これらのファイルは30日間ごみ箱に残ります。\nアカウントのディスク容量が不足しないようにするため、削除済みファイルアプリでは削除済みファイルに現在利用可能な割り当て容量の50%を超える容量は使用されません。削除されたファイルがこの制限を超えると、この制限以下になるまでアプリは最も古いファイルを削除し続けます。詳細は「削除済みファイル」のドキュメントで確認できます。", "Restore" : "復元", + "Not enough free space to restore the file/folder" : "ファイル/フォルダーを復元するのに十分な空き容量がありません", "Empty deleted files" : "削除済みファイルを空にする", "Confirm permanent deletion" : "完全削除を承認", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "ごみ箱のすべてのファイルとフォルダーを完全に削除しますか?この操作は元に戻すことができません。", diff --git a/apps/files_trashbin/l10n/ja.json b/apps/files_trashbin/l10n/ja.json index 42e94b18508..b6f02fd21b7 100644 --- a/apps/files_trashbin/l10n/ja.json +++ b/apps/files_trashbin/l10n/ja.json @@ -5,6 +5,7 @@ "This application enables people to restore files that were deleted from the system." : "このアプリケーションを使用すると、利用者はシステムから削除されたファイルを復元できます。", "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "このアプリケーションを使用すると、システムから削除されたファイルを復元できます。Webインターフェイスには削除されたファイルのリストが表示され、これらの削除されたファイルを元の場所に復元するか、システムから完全に削除するかを選択できます。バージョン管理アプリが有効になっている場合、ファイルを復元すると関連するファイルのバージョンも復元されます。削除された共有ファイルは同じ方法で復元できますが、共有は復元されません。デフォルトでは、これらのファイルは30日間ごみ箱に残ります。\nアカウントのディスク容量が不足しないようにするため、削除済みファイルアプリでは削除済みファイルに現在利用可能な割り当て容量の50%を超える容量は使用されません。削除されたファイルがこの制限を超えると、この制限以下になるまでアプリは最も古いファイルを削除し続けます。詳細は「削除済みファイル」のドキュメントで確認できます。", "Restore" : "復元", + "Not enough free space to restore the file/folder" : "ファイル/フォルダーを復元するのに十分な空き容量がありません", "Empty deleted files" : "削除済みファイルを空にする", "Confirm permanent deletion" : "完全削除を承認", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "ごみ箱のすべてのファイルとフォルダーを完全に削除しますか?この操作は元に戻すことができません。", diff --git a/apps/files_trashbin/l10n/sr.js b/apps/files_trashbin/l10n/sr.js index 8b7cdafed96..cf8b15bda0e 100644 --- a/apps/files_trashbin/l10n/sr.js +++ b/apps/files_trashbin/l10n/sr.js @@ -7,6 +7,7 @@ OC.L10N.register( "This application enables people to restore files that were deleted from the system." : "Ова апликација омогућава људима да опораве фајлове који су обрисани са система.", "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Ова апликација омогућава корисницима да опораве фајлове који су обрисани са система . Она у веб интерфејсу приказује списак обрисаних фајлова и има опције да се они опораве назад у директоријуме или да се неповратно обришу са система. Ако је укључена апликација за управљање верзијама, враћање фајла такође враћа и све његове верзије. Када се фајл избрише из дељене фасцикле, може се повратити на исти начин, али више није дељен. Подразумевано, ови фајлови остају у канти 30 дана.\nДа би се спречило да налог остане без простора на диску, апликација за обрисане фајлове неће користити више од 50% тренутно доступне квоте. Ако обрисани фајлови пређу ову границу, апликација ће брисати најстарије фајлове док величина заузетих фајлова не падне испод ове границе. Више информација је доступно у документацији за Обрисане фајлове.", "Restore" : "Врати", + "Not enough free space to restore the file/folder" : "Нема довољно слободног простора за враћање фајла/фолдера", "Empty deleted files" : "Испразни обрисане фајлове", "Confirm permanent deletion" : "Потврдите трајно брисање", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "Да ли сте сигурни да желите трајно да обришете све фајлове и фолдере у корпи за отпад? Ово не може да се поништи.", diff --git a/apps/files_trashbin/l10n/sr.json b/apps/files_trashbin/l10n/sr.json index 31f8cd3b448..113eda95347 100644 --- a/apps/files_trashbin/l10n/sr.json +++ b/apps/files_trashbin/l10n/sr.json @@ -5,6 +5,7 @@ "This application enables people to restore files that were deleted from the system." : "Ова апликација омогућава људима да опораве фајлове који су обрисани са система.", "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Ова апликација омогућава корисницима да опораве фајлове који су обрисани са система . Она у веб интерфејсу приказује списак обрисаних фајлова и има опције да се они опораве назад у директоријуме или да се неповратно обришу са система. Ако је укључена апликација за управљање верзијама, враћање фајла такође враћа и све његове верзије. Када се фајл избрише из дељене фасцикле, може се повратити на исти начин, али више није дељен. Подразумевано, ови фајлови остају у канти 30 дана.\nДа би се спречило да налог остане без простора на диску, апликација за обрисане фајлове неће користити више од 50% тренутно доступне квоте. Ако обрисани фајлови пређу ову границу, апликација ће брисати најстарије фајлове док величина заузетих фајлова не падне испод ове границе. Више информација је доступно у документацији за Обрисане фајлове.", "Restore" : "Врати", + "Not enough free space to restore the file/folder" : "Нема довољно слободног простора за враћање фајла/фолдера", "Empty deleted files" : "Испразни обрисане фајлове", "Confirm permanent deletion" : "Потврдите трајно брисање", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "Да ли сте сигурни да желите трајно да обришете све фајлове и фолдере у корпи за отпад? Ово не може да се поништи.", diff --git a/apps/files_trashbin/l10n/sv.js b/apps/files_trashbin/l10n/sv.js index 39fe5bd3f27..fd50574e6fc 100644 --- a/apps/files_trashbin/l10n/sv.js +++ b/apps/files_trashbin/l10n/sv.js @@ -7,6 +7,7 @@ OC.L10N.register( "This application enables people to restore files that were deleted from the system." : "Denna app gör det möjligt för användare att återställa filer som raderats från systemet.", "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Denna applikation gör det möjligt för användare att återställa filer som tagits bort från systemet. Den visar en lista över borttagna filer i webbgränssnittet, och har alternativ för att återställa de borttagna filerna tillbaka till användarfilkataloger eller ta bort dem permanent från systemet. Återställa en fil återställer också relaterade filversioner, om versionsprogrammet är aktiverat. När en delad fil tas bort från kan den återställas på samma sätt, med är inte längre delad. Som standard ligger filerna i papperskorgen i 30 dagar.\nFör att förhindra att en användare får slut på diskutrymme kommer appen Borttagna filer inte att använda mer än 50% av den tillgängliga oanvända utrymmeskvoten för att lagra borttagna filer. Om storleken på borttagna filerna överskrider gränsen raderar appen de äldsta filerna tills den kommer under gränsen. Mer information finns i dokumentationen för Borttagna filer.", "Restore" : "Återskapa", + "Not enough free space to restore the file/folder" : "Inte tillräckligt med ledigt utrymme för att återställa filen/mappen", "Empty deleted files" : "Töm raderade filer", "Confirm permanent deletion" : "Bekräfta permanent radering", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "Är du säker på att du vill radera alla filer och mappar i papperskorgen permanent? Detta kan inte ångras.", diff --git a/apps/files_trashbin/l10n/sv.json b/apps/files_trashbin/l10n/sv.json index 5cc6c187a71..1bf54bf7379 100644 --- a/apps/files_trashbin/l10n/sv.json +++ b/apps/files_trashbin/l10n/sv.json @@ -5,6 +5,7 @@ "This application enables people to restore files that were deleted from the system." : "Denna app gör det möjligt för användare att återställa filer som raderats från systemet.", "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Denna applikation gör det möjligt för användare att återställa filer som tagits bort från systemet. Den visar en lista över borttagna filer i webbgränssnittet, och har alternativ för att återställa de borttagna filerna tillbaka till användarfilkataloger eller ta bort dem permanent från systemet. Återställa en fil återställer också relaterade filversioner, om versionsprogrammet är aktiverat. När en delad fil tas bort från kan den återställas på samma sätt, med är inte längre delad. Som standard ligger filerna i papperskorgen i 30 dagar.\nFör att förhindra att en användare får slut på diskutrymme kommer appen Borttagna filer inte att använda mer än 50% av den tillgängliga oanvända utrymmeskvoten för att lagra borttagna filer. Om storleken på borttagna filerna överskrider gränsen raderar appen de äldsta filerna tills den kommer under gränsen. Mer information finns i dokumentationen för Borttagna filer.", "Restore" : "Återskapa", + "Not enough free space to restore the file/folder" : "Inte tillräckligt med ledigt utrymme för att återställa filen/mappen", "Empty deleted files" : "Töm raderade filer", "Confirm permanent deletion" : "Bekräfta permanent radering", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "Är du säker på att du vill radera alla filer och mappar i papperskorgen permanent? Detta kan inte ångras.", diff --git a/apps/files_trashbin/l10n/zh_TW.js b/apps/files_trashbin/l10n/zh_TW.js index 879c5aee231..2deb89b49de 100644 --- a/apps/files_trashbin/l10n/zh_TW.js +++ b/apps/files_trashbin/l10n/zh_TW.js @@ -7,6 +7,7 @@ OC.L10N.register( "This application enables people to restore files that were deleted from the system." : "此應用程式讓使用者可以還原他們在系統當中刪除的檔案", "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "此應用程式讓使用可以還原從系統中刪除的檔案。其會在網路介面中顯示已刪除的檔案列表,並有選項可以復原那些檔案到使用者的檔案目錄,或是將它們從系統中永久移除。若啟用了版本應用程式,復原檔案也會復原相關的檔案版本。當檔案從分享中刪除時,雖然不再共享,但可以用相同的方式來還原。預設情況下,這些檔案會在回收桶中保留30天。\n為了避免使用者耗盡磁碟空間,「回收桶」應用程式將不會用於超過目前可用配額 50% 的已刪除檔案。如果已刪除的檔案超過此限制,應用程式將會刪除最舊的檔案,直到低於此限制為止。更多資訊在「回收桶」的文件中提供。", "Restore" : "還原", + "Not enough free space to restore the file/folder" : "空間不足,無法還原檔案/資料夾", "Empty deleted files" : "清空已刪除的檔案", "Confirm permanent deletion" : "確認永久刪除", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "您確定您想要永久刪除回收桶中的所有檔案與資料夾嗎?這無法還原。", diff --git a/apps/files_trashbin/l10n/zh_TW.json b/apps/files_trashbin/l10n/zh_TW.json index 176a8861e08..ba719d2b0e6 100644 --- a/apps/files_trashbin/l10n/zh_TW.json +++ b/apps/files_trashbin/l10n/zh_TW.json @@ -5,6 +5,7 @@ "This application enables people to restore files that were deleted from the system." : "此應用程式讓使用者可以還原他們在系統當中刪除的檔案", "This application enables people to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the people file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent an account from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "此應用程式讓使用可以還原從系統中刪除的檔案。其會在網路介面中顯示已刪除的檔案列表,並有選項可以復原那些檔案到使用者的檔案目錄,或是將它們從系統中永久移除。若啟用了版本應用程式,復原檔案也會復原相關的檔案版本。當檔案從分享中刪除時,雖然不再共享,但可以用相同的方式來還原。預設情況下,這些檔案會在回收桶中保留30天。\n為了避免使用者耗盡磁碟空間,「回收桶」應用程式將不會用於超過目前可用配額 50% 的已刪除檔案。如果已刪除的檔案超過此限制,應用程式將會刪除最舊的檔案,直到低於此限制為止。更多資訊在「回收桶」的文件中提供。", "Restore" : "還原", + "Not enough free space to restore the file/folder" : "空間不足,無法還原檔案/資料夾", "Empty deleted files" : "清空已刪除的檔案", "Confirm permanent deletion" : "確認永久刪除", "Are you sure you want to permanently delete all files and folders in the trash? This cannot be undone." : "您確定您想要永久刪除回收桶中的所有檔案與資料夾嗎?這無法還原。", diff --git a/apps/files_versions/l10n/fa.js b/apps/files_versions/l10n/fa.js index c2bbbcd6487..6f50077efdc 100644 --- a/apps/files_versions/l10n/fa.js +++ b/apps/files_versions/l10n/fa.js @@ -4,6 +4,7 @@ OC.L10N.register( "Versions" : "نسخه ها", "This application automatically maintains older versions of files that are changed." : "این برنامه به طور خودکار نسخه های قدیمی تر پرونده های تغییر یافته را حفظ می کند.", "Current version" : "نسخه فعلی", + "You" : "You", "Name this version" : "Name this version", "Edit version name" : "Edit version name", "Compare to current version" : "Compare to current version", diff --git a/apps/files_versions/l10n/fa.json b/apps/files_versions/l10n/fa.json index a5afce9ed79..a96d8d4cd31 100644 --- a/apps/files_versions/l10n/fa.json +++ b/apps/files_versions/l10n/fa.json @@ -2,6 +2,7 @@ "Versions" : "نسخه ها", "This application automatically maintains older versions of files that are changed." : "این برنامه به طور خودکار نسخه های قدیمی تر پرونده های تغییر یافته را حفظ می کند.", "Current version" : "نسخه فعلی", + "You" : "You", "Name this version" : "Name this version", "Edit version name" : "Edit version name", "Compare to current version" : "Compare to current version", diff --git a/apps/provisioning_api/openapi-administration.json b/apps/provisioning_api/openapi-administration.json index 3c54be68194..84b1a12d2dd 100644 --- a/apps/provisioning_api/openapi-administration.json +++ b/apps/provisioning_api/openapi-administration.json @@ -381,7 +381,8 @@ "description": "Filter for enabled or disabled apps", "schema": { "type": "string", - "nullable": true + "nullable": true, + "default": null } }, { @@ -1003,7 +1004,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { diff --git a/apps/provisioning_api/openapi-full.json b/apps/provisioning_api/openapi-full.json index 9079404c35c..734c588be6b 100644 --- a/apps/provisioning_api/openapi-full.json +++ b/apps/provisioning_api/openapi-full.json @@ -428,7 +428,8 @@ "description": "Filter for enabled or disabled apps", "schema": { "type": "string", - "nullable": true + "nullable": true, + "default": null } }, { @@ -885,7 +886,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -1230,7 +1232,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -2189,7 +2192,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -2438,7 +2442,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -2554,7 +2559,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -2695,6 +2701,7 @@ "manager": { "type": "string", "nullable": true, + "default": null, "description": "Manager of the user" } } @@ -2816,7 +2823,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -2932,7 +2940,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { diff --git a/apps/provisioning_api/openapi.json b/apps/provisioning_api/openapi.json index 59f31a2c25d..d2fd2378488 100644 --- a/apps/provisioning_api/openapi.json +++ b/apps/provisioning_api/openapi.json @@ -437,7 +437,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -538,7 +539,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -787,7 +789,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -986,7 +989,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -1127,6 +1131,7 @@ "manager": { "type": "string", "nullable": true, + "default": null, "description": "Manager of the user" } } @@ -1248,7 +1253,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -1364,7 +1370,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { diff --git a/apps/settings/l10n/et_EE.js b/apps/settings/l10n/et_EE.js index e7298146395..e7fe29f42dd 100644 --- a/apps/settings/l10n/et_EE.js +++ b/apps/settings/l10n/et_EE.js @@ -365,7 +365,7 @@ OC.L10N.register( "Last job ran {relativeTime}." : "Viimane käivitus kestis {relativeTime}.", "Unable to update profile default setting" : "Profiili vaikimisi seadistuste uuendamine ei õnnestu", "Profile" : "Profiil", - "Password confirmation is required" : "Parooli kinnitus on vajalik", + "Password confirmation is required" : "Salasõna kinnitamine on vajalik", "Failed to save setting" : "Seadistuse salvestamine ei õnnestunud", "Unable to update server side encryption config" : "Serveripoolse krüptimise seadistusi ei õnnestu uuendada", "Server-side encryption" : "Serveripoolne krüptimine", diff --git a/apps/settings/l10n/et_EE.json b/apps/settings/l10n/et_EE.json index 389f372023b..a27534910f2 100644 --- a/apps/settings/l10n/et_EE.json +++ b/apps/settings/l10n/et_EE.json @@ -363,7 +363,7 @@ "Last job ran {relativeTime}." : "Viimane käivitus kestis {relativeTime}.", "Unable to update profile default setting" : "Profiili vaikimisi seadistuste uuendamine ei õnnestu", "Profile" : "Profiil", - "Password confirmation is required" : "Parooli kinnitus on vajalik", + "Password confirmation is required" : "Salasõna kinnitamine on vajalik", "Failed to save setting" : "Seadistuse salvestamine ei õnnestunud", "Unable to update server side encryption config" : "Serveripoolse krüptimise seadistusi ei õnnestu uuendada", "Server-side encryption" : "Serveripoolne krüptimine", diff --git a/apps/settings/l10n/fa.js b/apps/settings/l10n/fa.js index 2d2fd8a8f02..a58a88386d8 100644 --- a/apps/settings/l10n/fa.js +++ b/apps/settings/l10n/fa.js @@ -402,6 +402,7 @@ OC.L10N.register( "Headline" : "عنوان", "Organisation" : "سازمان", "Phone number" : "شماره تلفن", + "Pronouns" : "ضمایر", "Role" : "نقش", "Website" : "وب سایت", "Profile visibility" : "امکان دیده شدن پروفایل", @@ -471,6 +472,7 @@ OC.L10N.register( "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "This community release of Nextcloud is unsupported and instant notifications are unavailable.", "Use a second factor besides your password to increase security for your account." : "برای افزایش امنیت حساب کاربری خود ، از یک عامل دوم علاوه بر رمز عبور خود استفاده کنید.", "If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication.", + "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "برای اجرای این بررسی، باید مطمئن شوید که وبسرور شما میتواند به خودش متصل شود. بنابراین باید بتواند حداقل یکی از `trusted_domains` یا `overwrite.cli.url` خود را حل و به آن متصل شود. این خطا ممکن است نتیجه عدم تطابق DNS سمت سرور یا قانون فایروال خروجی باشد.", "Set default expiration date for shares" : "تاریخ انقضا پیش فرض را برای اشتراک گذاری تعیین کنید", "Your biography" : "بیوگرافی شما", "You are using <strong>{usage}</strong>" : "فضای مورد استفاده: <strong>{usage}</strong>", diff --git a/apps/settings/l10n/fa.json b/apps/settings/l10n/fa.json index acb5746def6..89a923794ff 100644 --- a/apps/settings/l10n/fa.json +++ b/apps/settings/l10n/fa.json @@ -400,6 +400,7 @@ "Headline" : "عنوان", "Organisation" : "سازمان", "Phone number" : "شماره تلفن", + "Pronouns" : "ضمایر", "Role" : "نقش", "Website" : "وب سایت", "Profile visibility" : "امکان دیده شدن پروفایل", @@ -469,6 +470,7 @@ "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "This community release of Nextcloud is unsupported and instant notifications are unavailable.", "Use a second factor besides your password to increase security for your account." : "برای افزایش امنیت حساب کاربری خود ، از یک عامل دوم علاوه بر رمز عبور خود استفاده کنید.", "If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication." : "If you use third party applications to connect to Nextcloud, please make sure to create and configure an app password for each before enabling second factor authentication.", + "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "برای اجرای این بررسی، باید مطمئن شوید که وبسرور شما میتواند به خودش متصل شود. بنابراین باید بتواند حداقل یکی از `trusted_domains` یا `overwrite.cli.url` خود را حل و به آن متصل شود. این خطا ممکن است نتیجه عدم تطابق DNS سمت سرور یا قانون فایروال خروجی باشد.", "Set default expiration date for shares" : "تاریخ انقضا پیش فرض را برای اشتراک گذاری تعیین کنید", "Your biography" : "بیوگرافی شما", "You are using <strong>{usage}</strong>" : "فضای مورد استفاده: <strong>{usage}</strong>", diff --git a/apps/settings/l10n/fi.js b/apps/settings/l10n/fi.js index dd838928d3c..34e3ac3ba9c 100644 --- a/apps/settings/l10n/fi.js +++ b/apps/settings/l10n/fi.js @@ -122,6 +122,7 @@ OC.L10N.register( "Internet connectivity" : "Internet-yhdistettävyys", "Disabled" : "Pois käytöstä", "The old server-side-encryption format is enabled. We recommend disabling this." : "Vanha palvelinpuolen salausmenetelmä on käytössä. Suosittelemme sen ottamista pois käytöstä.", + "Logging level" : "Lokitustaso", "Maintenance window start" : "Huoltoikkunan alku", "Memcache" : "Memcache", "You are not using MySQL" : "Et käytä MySQL:ää", @@ -209,11 +210,13 @@ OC.L10N.register( "No apps found for your version" : "Sovelluksia ei löytynyt versiollesi", "_%n app has an update available_::_%n apps have an update available_" : ["%n sovelluksella on päivitys saatavilla","%n sovelluksella on päivitys saatavilla"], "_Update_::_Update all_" : ["Päivitä","Päivitä kaikki"], + "Failed to load groups" : "Ryhmien lataaminen epäonnistui", "Failed to create group" : "Ryhmän luonti epäonnistui", "Creating group…" : "Luodaan ryhmä…", "Create group" : "Luo ryhmä", "Group name" : "Ryhmän nimi", "Please enter a valid group name" : "Kirjoita kelvollinen ryhmän nimi", + "Search groups…" : "Etsi ryhmiä…", "Loading groups…" : "Ladataan ryhmiä…", "Nothing to show" : "Ei mitään näytettävää", "Loading" : "Ladataan", @@ -227,6 +230,7 @@ OC.L10N.register( "Type" : "Tyyppi", "Display Name" : "Näyttönimi", "Learn more" : "Opi lisää", + "Environment variables" : "Ympäristömuuttujat", "Confirm" : "Vahvista", "Cancel" : "Peru", "Description" : "Kuvaus", @@ -258,6 +262,8 @@ OC.L10N.register( "{productName} Talk for iOS" : "{productName} Talk iOS:lle", "{productName} Talk for Android" : "{productName} Talk Androidille", "This session" : "Tämä istunto", + "{client} - {version} ({system})" : "{client} - {version} ({system})", + "{client} - {version}" : "{client} - {version}", "Device name" : "Laitteen nimi", "Save new name" : "Tallenna uusi nimi", "Marked for remote wipe" : "Merkitty etätyhjennettäväksi", @@ -286,6 +292,7 @@ OC.L10N.register( "Use system cron service to call the cron.php file every 5 minutes." : "Käytä järjestelmän cron-palvelua cron.php-skriptin suorittamiseen 5 minuutin välein", "Last job execution ran {time}. Something seems wrong." : "Viimeisimmän työn suoritus {time}. Jokin vaikuttaa olevan pielessä.", "Last job ran {relativeTime}." : "Viimeisin työ ajettiin {relativeTime}.", + "AJAX" : "AJAX", "Cron (Recommended)" : "Cron (suositeltu)", "Unable to update profile default setting" : "Profiilin oletusasetuksen päivittäminen ei onnistunut", "Profile" : "Profiili", @@ -302,9 +309,11 @@ OC.L10N.register( "Be aware that encryption always increases the file size." : "Ota huomioon, että salaus kasvattaa aina tiedostojen kokoa.", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Säännöllisten varmuuskopioiden ottaminen on erittäin tärkeää. Jos olet ottanut salauksen käyttöön, huolehdi salausavainten varmuuskopioinnista.", "This is the final warning: Do you really want to enable encryption?" : "Tämä on viimeinen varoitus: haluatko varmasti ottaa salauksen käyttöön?", + "Failed to delete group \"{group}\"" : "Ryhmän \"{group}\" poistaminen epäonnistui", "Please confirm the group removal" : "Vahvista ryhmän poistaminen", "Submit" : "Lähetä", "Rename group" : "Nimeä ryhmä uudelleen", + "Delete group" : "Poista ryhmä", "Current password" : "Nykyinen salasana", "New password" : "Uusi salasana", "Change password" : "Vaihda salasana", @@ -400,7 +409,9 @@ OC.L10N.register( "Account deletion" : "Tilin poistaminen", "Delete {userid}'s account" : "Poista käyttäjän {userid} tili", "Display name was successfully changed" : "Näyttönimi vaihdettiin onnistuneesti", + "Password can't be empty" : "Salasana ei voi olla tyhjä", "Password was successfully changed" : "Salasana vaihdettiin onnistuneesti", + "Email can't be empty" : "Sähköposti ei voi olla tyhjä", "Email was successfully changed" : "Sähköpostiosoite vaihdettiin onnistuneesti", "Welcome mail sent!" : "Tervetuloviesti lähetetty!", "Loading account …" : "Ladataan tiliä…", @@ -439,6 +450,8 @@ OC.L10N.register( "Loading categories" : "Ladataan luokkia", "Developer documentation ↗" : "Kehittäjien dokumentaatio ↗", "Version {version}, {license}-licensed" : "Versio {version}, lisenssi {license}", + "Version {version}" : "Versio {version}", + "All accounts" : "Kaikki tilit", "Admins" : "Ylläpitäjät", "Account group: {group}" : "Tiliryhmä: {group}", "Account management" : "Tilihallinta", @@ -459,6 +472,7 @@ OC.L10N.register( "Website" : "Verkkosivusto", "Profile visibility" : "Profiilin näkyvyys", "Locale" : "Aluekohtainen asetus", + "First day of week" : "Viikon ensimmäinen päivä", "Your apps" : "Sovelluksesi", "Active apps" : "Aktiiviset sovellukset", "Disabled apps" : "Käytöstä poistetut sovellukset", diff --git a/apps/settings/l10n/fi.json b/apps/settings/l10n/fi.json index 6ce239de38d..d78cfde1069 100644 --- a/apps/settings/l10n/fi.json +++ b/apps/settings/l10n/fi.json @@ -120,6 +120,7 @@ "Internet connectivity" : "Internet-yhdistettävyys", "Disabled" : "Pois käytöstä", "The old server-side-encryption format is enabled. We recommend disabling this." : "Vanha palvelinpuolen salausmenetelmä on käytössä. Suosittelemme sen ottamista pois käytöstä.", + "Logging level" : "Lokitustaso", "Maintenance window start" : "Huoltoikkunan alku", "Memcache" : "Memcache", "You are not using MySQL" : "Et käytä MySQL:ää", @@ -207,11 +208,13 @@ "No apps found for your version" : "Sovelluksia ei löytynyt versiollesi", "_%n app has an update available_::_%n apps have an update available_" : ["%n sovelluksella on päivitys saatavilla","%n sovelluksella on päivitys saatavilla"], "_Update_::_Update all_" : ["Päivitä","Päivitä kaikki"], + "Failed to load groups" : "Ryhmien lataaminen epäonnistui", "Failed to create group" : "Ryhmän luonti epäonnistui", "Creating group…" : "Luodaan ryhmä…", "Create group" : "Luo ryhmä", "Group name" : "Ryhmän nimi", "Please enter a valid group name" : "Kirjoita kelvollinen ryhmän nimi", + "Search groups…" : "Etsi ryhmiä…", "Loading groups…" : "Ladataan ryhmiä…", "Nothing to show" : "Ei mitään näytettävää", "Loading" : "Ladataan", @@ -225,6 +228,7 @@ "Type" : "Tyyppi", "Display Name" : "Näyttönimi", "Learn more" : "Opi lisää", + "Environment variables" : "Ympäristömuuttujat", "Confirm" : "Vahvista", "Cancel" : "Peru", "Description" : "Kuvaus", @@ -256,6 +260,8 @@ "{productName} Talk for iOS" : "{productName} Talk iOS:lle", "{productName} Talk for Android" : "{productName} Talk Androidille", "This session" : "Tämä istunto", + "{client} - {version} ({system})" : "{client} - {version} ({system})", + "{client} - {version}" : "{client} - {version}", "Device name" : "Laitteen nimi", "Save new name" : "Tallenna uusi nimi", "Marked for remote wipe" : "Merkitty etätyhjennettäväksi", @@ -284,6 +290,7 @@ "Use system cron service to call the cron.php file every 5 minutes." : "Käytä järjestelmän cron-palvelua cron.php-skriptin suorittamiseen 5 minuutin välein", "Last job execution ran {time}. Something seems wrong." : "Viimeisimmän työn suoritus {time}. Jokin vaikuttaa olevan pielessä.", "Last job ran {relativeTime}." : "Viimeisin työ ajettiin {relativeTime}.", + "AJAX" : "AJAX", "Cron (Recommended)" : "Cron (suositeltu)", "Unable to update profile default setting" : "Profiilin oletusasetuksen päivittäminen ei onnistunut", "Profile" : "Profiili", @@ -300,9 +307,11 @@ "Be aware that encryption always increases the file size." : "Ota huomioon, että salaus kasvattaa aina tiedostojen kokoa.", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Säännöllisten varmuuskopioiden ottaminen on erittäin tärkeää. Jos olet ottanut salauksen käyttöön, huolehdi salausavainten varmuuskopioinnista.", "This is the final warning: Do you really want to enable encryption?" : "Tämä on viimeinen varoitus: haluatko varmasti ottaa salauksen käyttöön?", + "Failed to delete group \"{group}\"" : "Ryhmän \"{group}\" poistaminen epäonnistui", "Please confirm the group removal" : "Vahvista ryhmän poistaminen", "Submit" : "Lähetä", "Rename group" : "Nimeä ryhmä uudelleen", + "Delete group" : "Poista ryhmä", "Current password" : "Nykyinen salasana", "New password" : "Uusi salasana", "Change password" : "Vaihda salasana", @@ -398,7 +407,9 @@ "Account deletion" : "Tilin poistaminen", "Delete {userid}'s account" : "Poista käyttäjän {userid} tili", "Display name was successfully changed" : "Näyttönimi vaihdettiin onnistuneesti", + "Password can't be empty" : "Salasana ei voi olla tyhjä", "Password was successfully changed" : "Salasana vaihdettiin onnistuneesti", + "Email can't be empty" : "Sähköposti ei voi olla tyhjä", "Email was successfully changed" : "Sähköpostiosoite vaihdettiin onnistuneesti", "Welcome mail sent!" : "Tervetuloviesti lähetetty!", "Loading account …" : "Ladataan tiliä…", @@ -437,6 +448,8 @@ "Loading categories" : "Ladataan luokkia", "Developer documentation ↗" : "Kehittäjien dokumentaatio ↗", "Version {version}, {license}-licensed" : "Versio {version}, lisenssi {license}", + "Version {version}" : "Versio {version}", + "All accounts" : "Kaikki tilit", "Admins" : "Ylläpitäjät", "Account group: {group}" : "Tiliryhmä: {group}", "Account management" : "Tilihallinta", @@ -457,6 +470,7 @@ "Website" : "Verkkosivusto", "Profile visibility" : "Profiilin näkyvyys", "Locale" : "Aluekohtainen asetus", + "First day of week" : "Viikon ensimmäinen päivä", "Your apps" : "Sovelluksesi", "Active apps" : "Aktiiviset sovellukset", "Disabled apps" : "Käytöstä poistetut sovellukset", diff --git a/apps/settings/l10n/ja.js b/apps/settings/l10n/ja.js index 513687841b3..87cfe42f3ea 100644 --- a/apps/settings/l10n/ja.js +++ b/apps/settings/l10n/ja.js @@ -316,6 +316,9 @@ OC.L10N.register( "64-bit" : "64ビット", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "このシステムは32ビット版のPHPで動いているようです。Nextcloudを正常に動かすには64ビット版が必要です。OSとPHPを64ビット版にアップグレードしてください!", "Task Processing pickup speed" : "タスク処理のピックアップ速度", + "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["直近の%n時間に予定されたタスクはありません。"], + "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["タスクのピックアップ速度は、過去%n時間に問題ありませんでした。"], + "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["過去%n時間タスクのピックアップ速度が遅くなっています。多くのタスクが取得に4分以上かかりました。バックグラウンドでタスクを処理するようにワーカーを設定することを検討してください。"], "Temporary space available" : "テンポラリ領域が利用可能です", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "PHP のテンポラリパスのチェック中にエラーが発生しました - ディレクトリが正しく設定されていませんでした。返された値:%s", "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "PHPの関数 \"disk_free_space\"が無効になっており、一時的なディレクトリに十分な空き容量があるかどうかをチェックできません。", @@ -585,9 +588,12 @@ OC.L10N.register( "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "暗号化した場合には必ず、あなたのデータと共に暗号化キーをバックアップすることを確認し、定期的にデータをバックアップを作成することをお勧めします。", "Refer to the admin documentation on how to manually also encrypt existing files." : "既存のファイルを手動で暗号化する方法については、管理者のドキュメントを参照してください。", "This is the final warning: Do you really want to enable encryption?" : "これが最後の警告です:本当に暗号化を有効にしますか?", + "Failed to delete group \"{group}\"" : "グループ \"{group}\"の削除に失敗しました", "Please confirm the group removal" : "グループの削除を確認してください", + "You are about to delete the group \"{group}\". The accounts will NOT be deleted." : "グループ \"{group}\" を削除しようとしています。アカウントは削除されません。", "Submit" : "送信", "Rename group" : "グループの名称変更", + "Delete group" : "グループを削除", "Current password" : "現在のパスワード", "New password" : "新しいパスワード", "Change password" : "パスワードを変更", diff --git a/apps/settings/l10n/ja.json b/apps/settings/l10n/ja.json index eb344496110..a1ecd71d95e 100644 --- a/apps/settings/l10n/ja.json +++ b/apps/settings/l10n/ja.json @@ -314,6 +314,9 @@ "64-bit" : "64ビット", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "このシステムは32ビット版のPHPで動いているようです。Nextcloudを正常に動かすには64ビット版が必要です。OSとPHPを64ビット版にアップグレードしてください!", "Task Processing pickup speed" : "タスク処理のピックアップ速度", + "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["直近の%n時間に予定されたタスクはありません。"], + "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["タスクのピックアップ速度は、過去%n時間に問題ありませんでした。"], + "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["過去%n時間タスクのピックアップ速度が遅くなっています。多くのタスクが取得に4分以上かかりました。バックグラウンドでタスクを処理するようにワーカーを設定することを検討してください。"], "Temporary space available" : "テンポラリ領域が利用可能です", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "PHP のテンポラリパスのチェック中にエラーが発生しました - ディレクトリが正しく設定されていませんでした。返された値:%s", "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "PHPの関数 \"disk_free_space\"が無効になっており、一時的なディレクトリに十分な空き容量があるかどうかをチェックできません。", @@ -583,9 +586,12 @@ "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "暗号化した場合には必ず、あなたのデータと共に暗号化キーをバックアップすることを確認し、定期的にデータをバックアップを作成することをお勧めします。", "Refer to the admin documentation on how to manually also encrypt existing files." : "既存のファイルを手動で暗号化する方法については、管理者のドキュメントを参照してください。", "This is the final warning: Do you really want to enable encryption?" : "これが最後の警告です:本当に暗号化を有効にしますか?", + "Failed to delete group \"{group}\"" : "グループ \"{group}\"の削除に失敗しました", "Please confirm the group removal" : "グループの削除を確認してください", + "You are about to delete the group \"{group}\". The accounts will NOT be deleted." : "グループ \"{group}\" を削除しようとしています。アカウントは削除されません。", "Submit" : "送信", "Rename group" : "グループの名称変更", + "Delete group" : "グループを削除", "Current password" : "現在のパスワード", "New password" : "新しいパスワード", "Change password" : "パスワードを変更", diff --git a/apps/settings/l10n/pt_BR.js b/apps/settings/l10n/pt_BR.js index a8ff04cce27..f6056caf78c 100644 --- a/apps/settings/l10n/pt_BR.js +++ b/apps/settings/l10n/pt_BR.js @@ -315,6 +315,10 @@ OC.L10N.register( "Architecture" : "Arquitetura", "64-bit" : "64-bit", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Parece que você está executando uma versão PHP de 32 bits. Nextcloud precisa de 64 bits para funcionar bem. Atualize seu sistema operacional e PHP para 64 bits!", + "Task Processing pickup speed" : "Velocidade de captação do Processamento de Tarefas", + "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["Nenhuma tarefa agendada na última %n hora.","Nenhuma tarefa agendada nas últimas %n horas.","Nenhuma tarefa agendada nas últimas %n horas."], + "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["A velocidade de captação do processamento de tarefas tem sido boa na última %n hora.","A velocidade de captação do processamento de tarefas tem sido boa nas últimas %n horas.","A velocidade de captação do processamento de tarefas tem sido boa nas últimas %n horas."], + "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["A velocidade de captação do processamento de tarefas tem sido lenta na última %n hora. Muitas tarefas levaram mais de 4 minutos para serem coletadas. Considere a possibilidade de configurar um trabalhador para processar tarefas em segundo plano.","A velocidade de captação do processamento de tarefas tem sido lenta nas últimas %n horas. Muitas tarefas levaram mais de 4 minutos para serem coletadas. Considere a possibilidade de configurar um trabalhador para processar tarefas em segundo plano.","A velocidade de captação do processamento de tarefas tem sido lenta nas últimas %n horas. Muitas tarefas levaram mais de 4 minutos para serem coletadas. Considere a possibilidade de configurar um trabalhador para processar tarefas em segundo plano."], "Temporary space available" : "Espaço temporário disponível", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "Erro ao verificar o caminho temporário do PHP - ele não foi configurado corretamente para um diretório. Valor retornado:%s", "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "A função PHP \"disk_free_space\" está desativada, o que impede a verificação de espaço suficiente nos diretórios temporários.", diff --git a/apps/settings/l10n/pt_BR.json b/apps/settings/l10n/pt_BR.json index 66db502eec3..7dad6ae794d 100644 --- a/apps/settings/l10n/pt_BR.json +++ b/apps/settings/l10n/pt_BR.json @@ -313,6 +313,10 @@ "Architecture" : "Arquitetura", "64-bit" : "64-bit", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Parece que você está executando uma versão PHP de 32 bits. Nextcloud precisa de 64 bits para funcionar bem. Atualize seu sistema operacional e PHP para 64 bits!", + "Task Processing pickup speed" : "Velocidade de captação do Processamento de Tarefas", + "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["Nenhuma tarefa agendada na última %n hora.","Nenhuma tarefa agendada nas últimas %n horas.","Nenhuma tarefa agendada nas últimas %n horas."], + "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["A velocidade de captação do processamento de tarefas tem sido boa na última %n hora.","A velocidade de captação do processamento de tarefas tem sido boa nas últimas %n horas.","A velocidade de captação do processamento de tarefas tem sido boa nas últimas %n horas."], + "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["A velocidade de captação do processamento de tarefas tem sido lenta na última %n hora. Muitas tarefas levaram mais de 4 minutos para serem coletadas. Considere a possibilidade de configurar um trabalhador para processar tarefas em segundo plano.","A velocidade de captação do processamento de tarefas tem sido lenta nas últimas %n horas. Muitas tarefas levaram mais de 4 minutos para serem coletadas. Considere a possibilidade de configurar um trabalhador para processar tarefas em segundo plano.","A velocidade de captação do processamento de tarefas tem sido lenta nas últimas %n horas. Muitas tarefas levaram mais de 4 minutos para serem coletadas. Considere a possibilidade de configurar um trabalhador para processar tarefas em segundo plano."], "Temporary space available" : "Espaço temporário disponível", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "Erro ao verificar o caminho temporário do PHP - ele não foi configurado corretamente para um diretório. Valor retornado:%s", "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "A função PHP \"disk_free_space\" está desativada, o que impede a verificação de espaço suficiente nos diretórios temporários.", diff --git a/apps/settings/l10n/sr.js b/apps/settings/l10n/sr.js index 0af1825bde1..904dca70386 100644 --- a/apps/settings/l10n/sr.js +++ b/apps/settings/l10n/sr.js @@ -315,6 +315,10 @@ OC.L10N.register( "Architecture" : "Архитектура", "64-bit" : "64-бита", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Изгледа да покрећете 32-битну PHP верзију. За правилно извршавање Nextcloud захтева 64-битну верзију. Молимо вас да ажурирате свој оперативни систем и PHP на 64-бита!", + "Task Processing pickup speed" : "Брзина прихватања Обраде задатака", + "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["Нема ниједног заказаног задатка у последњих %n сат.","Нема ниједног заказаног задатка у последњих %n сата.","Нема ниједног заказаног задатка у последњих %n сати."], + "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["Брзина прихватања задатака је била у реду током последњег %n сата.","Брзина прихватања задатака је била у реду током последња %n сата.","Брзина прихватања задатака је била у реду током последњих %n сати."], + "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["Брзина прихватања задатака је била спора током последњег %n сата. За многе задатке је требало више од 4 минута да се прихвате. Размислите о подешавању радник-процеса за обраду задатака у позадини.","Брзина прихватања задатака је била спора током последња %n сата. За многе задатке је требало више од 4 минута да се прихвате. Размислите о подешавању радник-процеса за обраду задатака у позадини.","Брзина прихватања задатака је била спора током последњих %n сати. За многе задатке је требало више од 4 минута да се прихвате. Размислите о подешавању радник-процеса за обраду задатака у позадини."], "Temporary space available" : "Доступан привремени простор", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "Грешка приликом провере привремене PHP путање - није била исправно постављена на директоријум. Враћена вредност је: %s", "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "Искључена је PHP функција „disk_free_space”, па не може да се провери довољна количина слободног простора у привременим директоријумима.", @@ -584,9 +588,12 @@ OC.L10N.register( "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Увек је паметно да правите редовне резервне копије података. У случају када су подаци шифровани, онда поред њих и резервне копије кључева за шифровања.", "Refer to the admin documentation on how to manually also encrypt existing files." : "Погледајте админ документацију у вези са ручним шифровањем постојећих фајлова.", "This is the final warning: Do you really want to enable encryption?" : "Ово је последње упозорење: Да ли стварно желите да укључите шифровање?", + "Failed to delete group \"{group}\"" : "Није успело брисање групе „{group}”", "Please confirm the group removal" : "Молимо вас да потврдите уклањање групе", + "You are about to delete the group \"{group}\". The accounts will NOT be deleted." : "Управо ћете обрисати групу „{group}”. Налози се НЕЋЕ обрисати.", "Submit" : "Пошаљи", "Rename group" : "Промени име групе", + "Delete group" : "Брисање групе", "Current password" : "Тренутна лозинка", "New password" : "Нова лозинка", "Change password" : "Измени лозинку", diff --git a/apps/settings/l10n/sr.json b/apps/settings/l10n/sr.json index 147c4964243..a360c48f907 100644 --- a/apps/settings/l10n/sr.json +++ b/apps/settings/l10n/sr.json @@ -313,6 +313,10 @@ "Architecture" : "Архитектура", "64-bit" : "64-бита", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "Изгледа да покрећете 32-битну PHP верзију. За правилно извршавање Nextcloud захтева 64-битну верзију. Молимо вас да ажурирате свој оперативни систем и PHP на 64-бита!", + "Task Processing pickup speed" : "Брзина прихватања Обраде задатака", + "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["Нема ниједног заказаног задатка у последњих %n сат.","Нема ниједног заказаног задатка у последњих %n сата.","Нема ниједног заказаног задатка у последњих %n сати."], + "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["Брзина прихватања задатака је била у реду током последњег %n сата.","Брзина прихватања задатака је била у реду током последња %n сата.","Брзина прихватања задатака је била у реду током последњих %n сати."], + "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["Брзина прихватања задатака је била спора током последњег %n сата. За многе задатке је требало више од 4 минута да се прихвате. Размислите о подешавању радник-процеса за обраду задатака у позадини.","Брзина прихватања задатака је била спора током последња %n сата. За многе задатке је требало више од 4 минута да се прихвате. Размислите о подешавању радник-процеса за обраду задатака у позадини.","Брзина прихватања задатака је била спора током последњих %n сати. За многе задатке је требало више од 4 минута да се прихвате. Размислите о подешавању радник-процеса за обраду задатака у позадини."], "Temporary space available" : "Доступан привремени простор", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "Грешка приликом провере привремене PHP путање - није била исправно постављена на директоријум. Враћена вредност је: %s", "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "Искључена је PHP функција „disk_free_space”, па не може да се провери довољна количина слободног простора у привременим директоријумима.", @@ -582,9 +586,12 @@ "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Увек је паметно да правите редовне резервне копије података. У случају када су подаци шифровани, онда поред њих и резервне копије кључева за шифровања.", "Refer to the admin documentation on how to manually also encrypt existing files." : "Погледајте админ документацију у вези са ручним шифровањем постојећих фајлова.", "This is the final warning: Do you really want to enable encryption?" : "Ово је последње упозорење: Да ли стварно желите да укључите шифровање?", + "Failed to delete group \"{group}\"" : "Није успело брисање групе „{group}”", "Please confirm the group removal" : "Молимо вас да потврдите уклањање групе", + "You are about to delete the group \"{group}\". The accounts will NOT be deleted." : "Управо ћете обрисати групу „{group}”. Налози се НЕЋЕ обрисати.", "Submit" : "Пошаљи", "Rename group" : "Промени име групе", + "Delete group" : "Брисање групе", "Current password" : "Тренутна лозинка", "New password" : "Нова лозинка", "Change password" : "Измени лозинку", diff --git a/apps/settings/l10n/zh_HK.js b/apps/settings/l10n/zh_HK.js index e6e9d177ca4..ab2f321716b 100644 --- a/apps/settings/l10n/zh_HK.js +++ b/apps/settings/l10n/zh_HK.js @@ -565,6 +565,7 @@ OC.L10N.register( "Unable to update profile default setting" : "無法更新個人檔案默認設定。", "Profile" : "個人設定", "Enable or disable profile by default for new accounts." : "預設情況下為新帳戶啟用或停用個人檔案。", + "Password confirmation is required" : "需要密碼確認", "Failed to save setting" : "儲存設定失敗", "{app}'s declarative setting field: {name}" : "{app} 的聲明性設定欄位:{name}", "Unable to update server side encryption config" : "無法更新伺服器端加密配置", diff --git a/apps/settings/l10n/zh_HK.json b/apps/settings/l10n/zh_HK.json index 398f2554973..6f4a48888ef 100644 --- a/apps/settings/l10n/zh_HK.json +++ b/apps/settings/l10n/zh_HK.json @@ -563,6 +563,7 @@ "Unable to update profile default setting" : "無法更新個人檔案默認設定。", "Profile" : "個人設定", "Enable or disable profile by default for new accounts." : "預設情況下為新帳戶啟用或停用個人檔案。", + "Password confirmation is required" : "需要密碼確認", "Failed to save setting" : "儲存設定失敗", "{app}'s declarative setting field: {name}" : "{app} 的聲明性設定欄位:{name}", "Unable to update server side encryption config" : "無法更新伺服器端加密配置", diff --git a/apps/settings/l10n/zh_TW.js b/apps/settings/l10n/zh_TW.js index 413ef1dc362..d5628c8501a 100644 --- a/apps/settings/l10n/zh_TW.js +++ b/apps/settings/l10n/zh_TW.js @@ -315,6 +315,10 @@ OC.L10N.register( "Architecture" : "架構", "64-bit" : "64 位元", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "您似乎正在執行 32 位元版本的 PHP。Nextcloud 需要 64 位元才能運作良好。請將您的作業系統與 PHP 升級至 64 位元!", + "Task Processing pickup speed" : "任務處理擷取速度", + "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["最近%n小時內沒有安排好的任務。"], + "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["最近%n小時內的任務擷取速度正常。"], + "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["最近%n小時內,任務擷取速度緩慢。許多任務的擷取時間超過4分鐘。請考慮設定 worker 在背景處理任務。"], "Temporary space available" : "可用臨時空間", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "檢查臨時 PHP 路徑時發生錯誤 - 未正確設定為目錄。回傳值:%s", "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "PHP 函式「disk_free_space」已停用,這會阻止檢查暫存目錄中是否有足夠的空間。", @@ -584,9 +588,12 @@ OC.L10N.register( "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "定期備份您的資料常有幫助,若您有啟用加密,請確保您也有備份加密金鑰。", "Refer to the admin documentation on how to manually also encrypt existing files." : "請參考管理說明文件,了解如何手動加密現有檔案。", "This is the final warning: Do you really want to enable encryption?" : "這是最後的警告:請問您真的要開啟加密模式?", + "Failed to delete group \"{group}\"" : "刪除群組「{group}」失敗", "Please confirm the group removal" : "請確認移除群組", + "You are about to delete the group \"{group}\". The accounts will NOT be deleted." : "您將要刪除群組「{group}」。帳號將不會被刪除。", "Submit" : "提交", "Rename group" : "重新命名群組", + "Delete group" : "刪除群組", "Current password" : "目前密碼", "New password" : "新密碼", "Change password" : "變更密碼", diff --git a/apps/settings/l10n/zh_TW.json b/apps/settings/l10n/zh_TW.json index b9b92bcd6c4..0f2c6f6653e 100644 --- a/apps/settings/l10n/zh_TW.json +++ b/apps/settings/l10n/zh_TW.json @@ -313,6 +313,10 @@ "Architecture" : "架構", "64-bit" : "64 位元", "It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit!" : "您似乎正在執行 32 位元版本的 PHP。Nextcloud 需要 64 位元才能運作良好。請將您的作業系統與 PHP 升級至 64 位元!", + "Task Processing pickup speed" : "任務處理擷取速度", + "_No scheduled tasks in the last %n hour._::_No scheduled tasks in the last %n hours._" : ["最近%n小時內沒有安排好的任務。"], + "_The task pickup speed has been ok in the last %n hour._::_The task pickup speed has been ok in the last %n hours._" : ["最近%n小時內的任務擷取速度正常。"], + "_The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._::_The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background._" : ["最近%n小時內,任務擷取速度緩慢。許多任務的擷取時間超過4分鐘。請考慮設定 worker 在背景處理任務。"], "Temporary space available" : "可用臨時空間", "Error while checking the temporary PHP path - it was not properly set to a directory. Returned value: %s" : "檢查臨時 PHP 路徑時發生錯誤 - 未正確設定為目錄。回傳值:%s", "The PHP function \"disk_free_space\" is disabled, which prevents the check for enough space in the temporary directories." : "PHP 函式「disk_free_space」已停用,這會阻止檢查暫存目錄中是否有足夠的空間。", @@ -582,9 +586,12 @@ "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "定期備份您的資料常有幫助,若您有啟用加密,請確保您也有備份加密金鑰。", "Refer to the admin documentation on how to manually also encrypt existing files." : "請參考管理說明文件,了解如何手動加密現有檔案。", "This is the final warning: Do you really want to enable encryption?" : "這是最後的警告:請問您真的要開啟加密模式?", + "Failed to delete group \"{group}\"" : "刪除群組「{group}」失敗", "Please confirm the group removal" : "請確認移除群組", + "You are about to delete the group \"{group}\". The accounts will NOT be deleted." : "您將要刪除群組「{group}」。帳號將不會被刪除。", "Submit" : "提交", "Rename group" : "重新命名群組", + "Delete group" : "刪除群組", "Current password" : "目前密碼", "New password" : "新密碼", "Change password" : "變更密碼", diff --git a/apps/settings/src/components/PersonalInfo/shared/AccountPropertySection.vue b/apps/settings/src/components/PersonalInfo/shared/AccountPropertySection.vue index 8cdde6b7d9a..d039641ec72 100644 --- a/apps/settings/src/components/PersonalInfo/shared/AccountPropertySection.vue +++ b/apps/settings/src/components/PersonalInfo/shared/AccountPropertySection.vue @@ -155,6 +155,7 @@ export default { methods: { async updateProperty(value) { try { + this.hasError = false const responseData = await savePrimaryAccountProperty( this.name, value, @@ -180,10 +181,8 @@ export default { this.isSuccess = true setTimeout(() => { this.isSuccess = false }, 2000) } else { - this.$emit('update:value', this.initialValue) handleError(error, errorMessage) this.hasError = true - setTimeout(() => { this.hasError = false }, 2000) } }, }, diff --git a/apps/sharebymail/l10n/fa.js b/apps/sharebymail/l10n/fa.js index aabadad2fb0..e9328c5b102 100644 --- a/apps/sharebymail/l10n/fa.js +++ b/apps/sharebymail/l10n/fa.js @@ -14,12 +14,18 @@ OC.L10N.register( "Password to access {file} was sent to {email}" : "رمز عبور برای دسترسی به {file} به {email} ارسال شد", "Password to access {file} was sent to you" : "رمز ورود برای دسترسی به {file} برای شما ارسال شد", "Share by mail" : "اشتراک از طریق پست", + "Sharing %1$s failed, because this item is already shared with the account %2$s" : "اشتراکگذاری %1$s ناموفق بود، زیرا این مورد قبلاً با حساب %2$s به اشتراک گذاشته شده است", "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "ما نمی توانیم رمز عبور ایجاد شده به صورت خودکار را برای شما ارسال کنیم. لطفاً یک آدرس ایمیل معتبر در تنظیمات شخصی خود تنظیم کنید و دوباره امتحان کنید.", "Failed to send share by email. Got an invalid email address" : "اشتراک از طریق ایمیل ارسال نشد. یک آدرس ایمیل نامعتبر دریافت کردم", "Failed to send share by email" : "ارسال اشتراک از طریق ایمیل انجام نشد", + "%1$s shared %2$s with you" : "%1$s %2$s را با شما به اشتراک گذاشت", + "Open %s" : "باز کردن %s", "%1$s via %2$s" : "%1$s از طریق %2$s", "It is protected with the following password:" : "با رمز عبور زیر محافظت می شود:", "This password will expire at %s" : "این رمز عبور در تاریخ منقضی می شود %s", + "%1$s shared %2$s with you and wants to add:" : "%1$s %2$s را با شما به اشتراک گذاشت و میخواهد اضافه کند:", + "%1$s shared %2$s with you and wants to add" : "%1$s %2$s را با شما به اشتراک گذاشت و میخواهد اضافه کند", + "%s added a note to a file shared with you" : "%s یک یادداشت به فایلی که با شما به اشتراک گذاشته شده است اضافه کرد", "This is the password:" : "این رمز عبور است:", "You can choose a different password at any time in the share dialog." : "می توانید در هر زمان و در گفتگوی اشتراک ، رمزعبور دیگری را انتخاب کنید.", "Could not find share" : "اشتراک یافت نشد", diff --git a/apps/sharebymail/l10n/fa.json b/apps/sharebymail/l10n/fa.json index e585745bdb2..4459f308770 100644 --- a/apps/sharebymail/l10n/fa.json +++ b/apps/sharebymail/l10n/fa.json @@ -12,12 +12,18 @@ "Password to access {file} was sent to {email}" : "رمز عبور برای دسترسی به {file} به {email} ارسال شد", "Password to access {file} was sent to you" : "رمز ورود برای دسترسی به {file} برای شما ارسال شد", "Share by mail" : "اشتراک از طریق پست", + "Sharing %1$s failed, because this item is already shared with the account %2$s" : "اشتراکگذاری %1$s ناموفق بود، زیرا این مورد قبلاً با حساب %2$s به اشتراک گذاشته شده است", "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "ما نمی توانیم رمز عبور ایجاد شده به صورت خودکار را برای شما ارسال کنیم. لطفاً یک آدرس ایمیل معتبر در تنظیمات شخصی خود تنظیم کنید و دوباره امتحان کنید.", "Failed to send share by email. Got an invalid email address" : "اشتراک از طریق ایمیل ارسال نشد. یک آدرس ایمیل نامعتبر دریافت کردم", "Failed to send share by email" : "ارسال اشتراک از طریق ایمیل انجام نشد", + "%1$s shared %2$s with you" : "%1$s %2$s را با شما به اشتراک گذاشت", + "Open %s" : "باز کردن %s", "%1$s via %2$s" : "%1$s از طریق %2$s", "It is protected with the following password:" : "با رمز عبور زیر محافظت می شود:", "This password will expire at %s" : "این رمز عبور در تاریخ منقضی می شود %s", + "%1$s shared %2$s with you and wants to add:" : "%1$s %2$s را با شما به اشتراک گذاشت و میخواهد اضافه کند:", + "%1$s shared %2$s with you and wants to add" : "%1$s %2$s را با شما به اشتراک گذاشت و میخواهد اضافه کند", + "%s added a note to a file shared with you" : "%s یک یادداشت به فایلی که با شما به اشتراک گذاشته شده است اضافه کرد", "This is the password:" : "این رمز عبور است:", "You can choose a different password at any time in the share dialog." : "می توانید در هر زمان و در گفتگوی اشتراک ، رمزعبور دیگری را انتخاب کنید.", "Could not find share" : "اشتراک یافت نشد", diff --git a/apps/systemtags/l10n/fa.js b/apps/systemtags/l10n/fa.js index 3fee766ae74..ff0c4bba17b 100644 --- a/apps/systemtags/l10n/fa.js +++ b/apps/systemtags/l10n/fa.js @@ -53,6 +53,7 @@ OC.L10N.register( "Update" : "به روز رسانی", "Delete" : "حذف", "Reset" : "ریست", + "Loading …" : "در حال بارگذاری...", "Manage tags" : "مدیریت برچسب ها", "Cancel" : "منصرف شدن", "Failed to load tags" : "بارگیری برچسب ها انجام نشد", diff --git a/apps/systemtags/l10n/fa.json b/apps/systemtags/l10n/fa.json index d7e21f03c45..7a542ff1a52 100644 --- a/apps/systemtags/l10n/fa.json +++ b/apps/systemtags/l10n/fa.json @@ -51,6 +51,7 @@ "Update" : "به روز رسانی", "Delete" : "حذف", "Reset" : "ریست", + "Loading …" : "در حال بارگذاری...", "Manage tags" : "مدیریت برچسب ها", "Cancel" : "منصرف شدن", "Failed to load tags" : "بارگیری برچسب ها انجام نشد", diff --git a/apps/systemtags/src/components/SystemTagsCreationControl.vue b/apps/systemtags/src/components/SystemTagsCreationControl.vue index 1b69983839f..2133387ec06 100644 --- a/apps/systemtags/src/components/SystemTagsCreationControl.vue +++ b/apps/systemtags/src/components/SystemTagsCreationControl.vue @@ -6,17 +6,17 @@ <template> <div id="system-tags-creation-control"> <h4 class="inlineblock"> - {{ t('settings', 'System tag management') }} + {{ t('systemtags', 'System tag management') }} </h4> <p class="settings-hint"> - {{ t('settings', 'If enabled, only administrators can create and edit tags. Accounts can still assign and remove them from files.') }} + {{ t('systemtags', 'If enabled, only administrators can create and edit tags. Accounts can still assign and remove them from files.') }} </p> <NcCheckboxRadioSwitch type="switch" :checked.sync="systemTagsCreationRestrictedToAdmin" @update:checked="updateSystemTagsDefault"> - {{ t('settings', 'Restrict tag creation and editing to administrators') }} + {{ t('systemtags', 'Restrict tag creation and editing to administrators') }} </NcCheckboxRadioSwitch> </div> </template> @@ -47,7 +47,7 @@ export default { data() { return { // By default, system tags creation is not restricted to admins - systemTagsCreationRestrictedToAdmin: loadState('settings', 'restrictSystemTagsCreationToAdmin', false), + systemTagsCreationRestrictedToAdmin: loadState('systemtags', 'restrictSystemTagsCreationToAdmin', false), } }, methods: { @@ -61,7 +61,7 @@ export default { }) } catch (e) { this.handleResponse({ - errorMessage: t('settings', 'Unable to update setting'), + errorMessage: t('systemtags', 'Unable to update setting'), error: e, }) } @@ -71,8 +71,8 @@ export default { if (status === 'ok') { this.systemTagsCreationRestrictedToAdmin = isRestricted showSuccess(isRestricted - ? t('settings', 'System tag creation is now restricted to administrators') - : t('settings', 'System tag creation is now allowed for everybody'), + ? t('systemtags', 'System tag creation is now restricted to administrators') + : t('systemtags', 'System tag creation is now allowed for everybody'), ) return } diff --git a/apps/systemtags/src/services/HotKeysService.spec.ts b/apps/systemtags/src/services/HotKeysService.spec.ts index 2e329444f54..92d9f56f56d 100644 --- a/apps/systemtags/src/services/HotKeysService.spec.ts +++ b/apps/systemtags/src/services/HotKeysService.spec.ts @@ -42,15 +42,24 @@ describe('HotKeysService testing', () => { }) it('Pressing t should open the tag management dialog', () => { - window.dispatchEvent(new KeyboardEvent('keydown', { key: 't', code: 'KeyT' })) + dispatchEvent({ key: 't', code: 'KeyT' }) // Modifier keys should not trigger the action - window.dispatchEvent(new KeyboardEvent('keydown', { key: 't', code: 'KeyT', ctrlKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 't', code: 'KeyT', altKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 't', code: 'KeyT', shiftKey: true })) - window.dispatchEvent(new KeyboardEvent('keydown', { key: 't', code: 'KeyT', metaKey: true })) + dispatchEvent({ key: 't', code: 'KeyT', ctrlKey: true }) + dispatchEvent({ key: 't', code: 'KeyT', altKey: true }) + dispatchEvent({ key: 't', code: 'KeyT', shiftKey: true }) + dispatchEvent({ key: 't', code: 'KeyT', metaKey: true }) expect(bulkSystemTagsAction.enabled).toHaveReturnedWith(true) expect(bulkSystemTagsAction.exec).toHaveBeenCalledOnce() }) }) + +/** + * Helper to dispatch the correct event. + * + * @param init - KeyboardEvent options + */ +function dispatchEvent(init: KeyboardEventInit) { + document.body.dispatchEvent(new KeyboardEvent('keydown', { ...init, bubbles: true })) +} diff --git a/apps/theming/openapi.json b/apps/theming/openapi.json index 2518f4acb73..26f5e7b8120 100644 --- a/apps/theming/openapi.json +++ b/apps/theming/openapi.json @@ -701,6 +701,7 @@ "color": { "type": "string", "nullable": true, + "default": null, "description": "Color for the background" } } diff --git a/apps/updatenotification/openapi.json b/apps/updatenotification/openapi.json index 969dfc7cfaa..f635b0839ef 100644 --- a/apps/updatenotification/openapi.json +++ b/apps/updatenotification/openapi.json @@ -248,7 +248,8 @@ "description": "The version to search the changelog entry for (defaults to the latest installed)", "schema": { "type": "string", - "nullable": true + "nullable": true, + "default": null } }, { diff --git a/apps/user_ldap/css/renewPassword.css b/apps/user_ldap/css/renewPassword.css index 0fe8c4d183e..8acd97254fa 100644 --- a/apps/user_ldap/css/renewPassword.css +++ b/apps/user_ldap/css/renewPassword.css @@ -33,7 +33,6 @@ letter-spacing:normal; line-break:auto; line-height:1.6; - text-align:left; text-align:start; text-decoration:none; text-shadow:none; diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css index 3aa9b2a168e..a1048031fa2 100644 --- a/apps/user_ldap/css/settings.css +++ b/apps/user_ldap/css/settings.css @@ -202,10 +202,12 @@ select[multiple=multiple] + button { width: 16px; vertical-align: text-bottom; } + .ldap_config_state_indicator_sign.success { background: #37ce02; border-radius: 8px; } + .ldap_config_state_indicator_sign.error { background: #ce3702; } diff --git a/apps/user_ldap/l10n/et_EE.js b/apps/user_ldap/l10n/et_EE.js index 6cec49027af..a024012d43d 100644 --- a/apps/user_ldap/l10n/et_EE.js +++ b/apps/user_ldap/l10n/et_EE.js @@ -10,14 +10,15 @@ OC.L10N.register( "No action specified" : "Tegevusi pole määratletud", "No configuration specified" : "Seadistust pole määratletud", "No data specified" : "Andmeid pole määratletud", + "Invalid data specified" : "Kirjeldatud on vigased andmed", "Could not set configuration %1$s to %2$s" : "Ei õnnestunud muuta „%1$s“ seadistuse väärtuseks „%2$s“", "Action does not exist" : "Toimingut pole olemas", "Renewing …" : "Värskendamine ...", - "Very weak password" : "Väga nõrk parool", - "Weak password" : "Nõrk parool", - "So-so password" : "Enam-vähem sobiv parool", - "Good password" : "Hea parool", - "Strong password" : "Väga hea parool", + "Very weak password" : "Väga nõrk salasõna", + "Weak password" : "Nõrk salasõna", + "So-so password" : "Enam-vähem sobiv salasõna", + "Good password" : "Hea salasõna", + "Strong password" : "Väga hea salasõna", "The Base DN appears to be wrong" : "Näib, et Base DN on vale", "Testing configuration…" : "Seadistuse testimine", "Configuration incorrect" : "Seadistus on vigane", @@ -47,10 +48,19 @@ OC.L10N.register( "Password change rejected. Hint: %s" : "Salasõna muutmine polnud võimalik. Selgitus: %s", "Mandatory field \"%s\" left empty" : "Kohustuslik väli „%s“ on jäänud tühjaks", "Login filter does not contain %s placeholder." : "Kasutajanimede filtris puudub kohatäitja „%s“", - "Please login with the new password" : "Palun logi uue parooliga sisse", - "Your password will expire tomorrow." : "Su parool aegub homme.", - "Your password will expire today." : "Su parool aegub täna.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Su parool aegub %n päeva jooksul.","Su parool aegub %n päeva jooksul."], + "Please login with the new password" : "Palun logi uue salasõnaga sisse", + "LDAP User backend" : "LPAD-i põhine tausteteenus kasutajate jaoks", + "Your password will expire tomorrow." : "Su salasõna aegub homme.", + "Your password will expire today." : "Su salasõna aegub täna.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Su salasõna aegub %n päeva jooksul.","Su salasõna aegub %n päeva jooksul."], + "LDAP/AD integration" : "LDAP/AD lõiming", + "LDAP Connection" : "LDAP ühendus", + "Invalid LDAP UUIDs" : "Vigased LDAP UUID-d", + "None found" : "Mitte midagi ei leidu", + "_%n group found_::_%n groups found_" : ["Leidus %n grupp","Leidus %n gruppi"], + "> 1000 groups found" : "Leidus üle 1000 grupi", + "> 1000 users found" : "Leidus üle 1000 kasutaja", + "_%n user found_::_%n users found_" : ["Leidus %n kasutaja","Leidus %n kasutajat"], "Could not find the desired feature" : "Ei suuda leida soovitud funktsioonaalsust", "Invalid Host" : "Vigane server", "Test Configuration" : "Testi seadistust", @@ -73,9 +83,9 @@ OC.L10N.register( "Port" : "Port", "Detect Port" : "Tuvasta port", "User DN" : "Kasutaja DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja parool tühjaks.", - "Password" : "Parool", - "For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja parool tühjaks.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja salasõna tühjaks.", + "Password" : "Salasõna", + "For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja salasõna tühjaks.", "Save Credentials" : "Salvesta kasutajaandmed", "One Base DN per line" : "Üks baas-DN rea kohta", "You can specify Base DN for users and groups in the Advanced tab" : "Sa saad kasutajate ja gruppide baas DN-i määrata lisavalikute vahekaardilt", @@ -89,13 +99,13 @@ OC.L10N.register( "Saving" : "Salvestamine", "Back" : "Tagasi", "Continue" : "Jätka", - "Please renew your password." : "Palun uuenda oma parool.", + "Please renew your password." : "Palun uuenda oma salasõna.", "An internal error occurred." : "Tekkis sisemine tõrge.", "Please try again or contact your administrator." : "Proovi uuesti või võta ühendust administraatoriga.", - "Current password" : "Praegune parool", - "New password" : "Uus parool", - "Renew password" : "Uuenda parooli", - "Wrong password." : "Vale parool.", + "Current password" : "Praegune salasõna", + "New password" : "Uus salasõna", + "Renew password" : "Uuenda salasõna", + "Wrong password." : "Vale salasõna.", "Cancel" : "Loobu", "Server" : "Server", "Users" : "Kasutajad", diff --git a/apps/user_ldap/l10n/et_EE.json b/apps/user_ldap/l10n/et_EE.json index 52d283fdf5b..3d90e2d17ce 100644 --- a/apps/user_ldap/l10n/et_EE.json +++ b/apps/user_ldap/l10n/et_EE.json @@ -8,14 +8,15 @@ "No action specified" : "Tegevusi pole määratletud", "No configuration specified" : "Seadistust pole määratletud", "No data specified" : "Andmeid pole määratletud", + "Invalid data specified" : "Kirjeldatud on vigased andmed", "Could not set configuration %1$s to %2$s" : "Ei õnnestunud muuta „%1$s“ seadistuse väärtuseks „%2$s“", "Action does not exist" : "Toimingut pole olemas", "Renewing …" : "Värskendamine ...", - "Very weak password" : "Väga nõrk parool", - "Weak password" : "Nõrk parool", - "So-so password" : "Enam-vähem sobiv parool", - "Good password" : "Hea parool", - "Strong password" : "Väga hea parool", + "Very weak password" : "Väga nõrk salasõna", + "Weak password" : "Nõrk salasõna", + "So-so password" : "Enam-vähem sobiv salasõna", + "Good password" : "Hea salasõna", + "Strong password" : "Väga hea salasõna", "The Base DN appears to be wrong" : "Näib, et Base DN on vale", "Testing configuration…" : "Seadistuse testimine", "Configuration incorrect" : "Seadistus on vigane", @@ -45,10 +46,19 @@ "Password change rejected. Hint: %s" : "Salasõna muutmine polnud võimalik. Selgitus: %s", "Mandatory field \"%s\" left empty" : "Kohustuslik väli „%s“ on jäänud tühjaks", "Login filter does not contain %s placeholder." : "Kasutajanimede filtris puudub kohatäitja „%s“", - "Please login with the new password" : "Palun logi uue parooliga sisse", - "Your password will expire tomorrow." : "Su parool aegub homme.", - "Your password will expire today." : "Su parool aegub täna.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Su parool aegub %n päeva jooksul.","Su parool aegub %n päeva jooksul."], + "Please login with the new password" : "Palun logi uue salasõnaga sisse", + "LDAP User backend" : "LPAD-i põhine tausteteenus kasutajate jaoks", + "Your password will expire tomorrow." : "Su salasõna aegub homme.", + "Your password will expire today." : "Su salasõna aegub täna.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Su salasõna aegub %n päeva jooksul.","Su salasõna aegub %n päeva jooksul."], + "LDAP/AD integration" : "LDAP/AD lõiming", + "LDAP Connection" : "LDAP ühendus", + "Invalid LDAP UUIDs" : "Vigased LDAP UUID-d", + "None found" : "Mitte midagi ei leidu", + "_%n group found_::_%n groups found_" : ["Leidus %n grupp","Leidus %n gruppi"], + "> 1000 groups found" : "Leidus üle 1000 grupi", + "> 1000 users found" : "Leidus üle 1000 kasutaja", + "_%n user found_::_%n users found_" : ["Leidus %n kasutaja","Leidus %n kasutajat"], "Could not find the desired feature" : "Ei suuda leida soovitud funktsioonaalsust", "Invalid Host" : "Vigane server", "Test Configuration" : "Testi seadistust", @@ -71,9 +81,9 @@ "Port" : "Port", "Detect Port" : "Tuvasta port", "User DN" : "Kasutaja DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja parool tühjaks.", - "Password" : "Parool", - "For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja parool tühjaks.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja salasõna tühjaks.", + "Password" : "Salasõna", + "For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja salasõna tühjaks.", "Save Credentials" : "Salvesta kasutajaandmed", "One Base DN per line" : "Üks baas-DN rea kohta", "You can specify Base DN for users and groups in the Advanced tab" : "Sa saad kasutajate ja gruppide baas DN-i määrata lisavalikute vahekaardilt", @@ -87,13 +97,13 @@ "Saving" : "Salvestamine", "Back" : "Tagasi", "Continue" : "Jätka", - "Please renew your password." : "Palun uuenda oma parool.", + "Please renew your password." : "Palun uuenda oma salasõna.", "An internal error occurred." : "Tekkis sisemine tõrge.", "Please try again or contact your administrator." : "Proovi uuesti või võta ühendust administraatoriga.", - "Current password" : "Praegune parool", - "New password" : "Uus parool", - "Renew password" : "Uuenda parooli", - "Wrong password." : "Vale parool.", + "Current password" : "Praegune salasõna", + "New password" : "Uus salasõna", + "Renew password" : "Uuenda salasõna", + "Wrong password." : "Vale salasõna.", "Cancel" : "Loobu", "Server" : "Server", "Users" : "Kasutajad", diff --git a/apps/user_status/lib/Service/StatusService.php b/apps/user_status/lib/Service/StatusService.php index 9adc13e4dbf..188eb26d1d7 100644 --- a/apps/user_status/lib/Service/StatusService.php +++ b/apps/user_status/lib/Service/StatusService.php @@ -167,7 +167,7 @@ class StatusService { $userStatus->setIsBackup(false); if ($userStatus->getId() === null) { - return $this->mapper->insert($userStatus); + return $this->insertWithoutThrowingUniqueConstrain($userStatus); } return $this->mapper->update($userStatus); @@ -211,7 +211,7 @@ class StatusService { $userStatus->setStatusMessageTimestamp($this->timeFactory->now()->getTimestamp()); if ($userStatus->getId() === null) { - return $this->mapper->insert($userStatus); + return $this->insertWithoutThrowingUniqueConstrain($userStatus); } return $this->mapper->update($userStatus); @@ -313,7 +313,7 @@ class StatusService { if ($userStatus->getId() !== null) { return $this->mapper->update($userStatus); } - return $this->mapper->insert($userStatus); + return $this->insertWithoutThrowingUniqueConstrain($userStatus); } /** @@ -360,7 +360,7 @@ class StatusService { $userStatus->setStatusMessageTimestamp($this->timeFactory->now()->getTimestamp()); if ($userStatus->getId() === null) { - return $this->mapper->insert($userStatus); + return $this->insertWithoutThrowingUniqueConstrain($userStatus); } return $this->mapper->update($userStatus); @@ -584,4 +584,16 @@ class StatusService { // For users that matched restore the previous status $this->mapper->restoreBackupStatuses($restoreIds); } + + protected function insertWithoutThrowingUniqueConstrain(UserStatus $userStatus): UserStatus { + try { + return $this->mapper->insert($userStatus); + } catch (Exception $e) { + // Ignore if a parallel request already set the status + if ($e->getReason() !== Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) { + throw $e; + } + } + return $userStatus; + } } diff --git a/apps/user_status/openapi.json b/apps/user_status/openapi.json index a0d30693e37..65d9af59fef 100644 --- a/apps/user_status/openapi.json +++ b/apps/user_status/openapi.json @@ -427,7 +427,8 @@ "schema": { "type": "integer", "format": "int64", - "nullable": true + "nullable": true, + "default": null } }, { @@ -438,6 +439,7 @@ "type": "integer", "format": "int64", "nullable": true, + "default": null, "minimum": 0 } }, diff --git a/apps/webhook_listeners/openapi.json b/apps/webhook_listeners/openapi.json index 9e7acc5c6f8..84610d204bb 100644 --- a/apps/webhook_listeners/openapi.json +++ b/apps/webhook_listeners/openapi.json @@ -121,7 +121,8 @@ "description": "The callback URI to filter by", "schema": { "type": "string", - "nullable": true + "nullable": true, + "default": null } }, { @@ -255,6 +256,13 @@ }, "parameters": [ { + "name": "EX-APP-ID", + "in": "header", + "schema": { + "type": "string" + } + }, + { "name": "OCS-APIRequest", "in": "header", "description": "Required to be true for the API request to pass", @@ -548,6 +556,13 @@ } }, { + "name": "EX-APP-ID", + "in": "header", + "schema": { + "type": "string" + } + }, + { "name": "OCS-APIRequest", "in": "header", "description": "Required to be true for the API request to pass", |