diff --git a/Dockerfile b/Dockerfile
index 621472736ef..2579bcf8524 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:20.5-slim
+FROM node:20.2.0-slim
WORKDIR /app
# Define node.js environment variables
@@ -18,17 +18,29 @@ COPY .next/standalone ./
COPY .next/static ./.next/static
COPY ./scripts/run.sh ./scripts/run.sh
COPY ./drizzle ./drizzle
+
+COPY ./drizzle/migrate ./migrate
+COPY ./tsconfig.json ./migrate/tsconfig.json
+
RUN mkdir /data
-COPY ./src/migrate.ts ./src/migrate.ts
# Install dependencies
-RUN apt-get update -y && apt-get install -y openssl wget
+RUN apt update && apt install -y openssl wget
-# Required for migration
+# Move node_modules to temp location to avoid overwriting
RUN mv node_modules _node_modules
RUN rm package.json
-RUN yarn add typescript ts-node dotenv drizzle-orm@0.28.6 better-sqlite3@8.6.0 @types/better-sqlite3
-RUN mv node_modules node_modules_migrate
+
+# Install dependencies for migration
+RUN cp ./migrate/package.json ./package.json
+RUN yarn
+
+# Copy better_sqlite3 build for current platform
+RUN cp /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/_node_modules/better-sqlite3/build/Release/better_sqlite3.node
+
+# Copy node_modules for migration to migrate folder for migration script
+RUN mv node_modules ./migrate/node_modules
+# Copy temp node_modules of app to app folder
RUN mv _node_modules node_modules
# Expose the default application port
@@ -36,11 +48,13 @@ EXPOSE $PORT
ENV PORT=${PORT}
ENV DATABASE_URL "file:/data/db.sqlite"
-ENV NEXTAUTH_URL "http://localhost:3000"
+ENV NEXTAUTH_URL "http://localhost:7575"
ENV PORT 7575
ENV NEXTAUTH_SECRET NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED
HEALTHCHECK --interval=10s --timeout=5s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:${PORT} || exit 1
-CMD ["sh", "./scripts/run.sh"]
+VOLUME [ "/app/data/configs" ]
+VOLUME [ "/data" ]
+ENTRYPOINT ["sh", "./scripts/run.sh"]
diff --git a/data/crowdin-report.json b/data/crowdin-report.json
index d1a889f0314..dc43a0c171e 100644
--- a/data/crowdin-report.json
+++ b/data/crowdin-report.json
@@ -1,6 +1,6 @@
{
"name": "homarr Top Members Report",
- "url": "https://crowdin.com/project/homarr",
+ "url": "https://translate.homarr.dev/project/homarr",
"unit": "words",
"dateRange": {
"from": "2022-08-25",
@@ -8,6 +8,28 @@
},
"language": "All",
"data": [
+ {
+ "user": {
+ "id": "15491798",
+ "username": "lupineDK",
+ "fullName": "Anders Ecklon (lupineDK)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png",
+ "joined": "2022-10-15 01:14:33"
+ },
+ "languages": [
+ {
+ "id": "da",
+ "name": "Danish"
+ }
+ ],
+ "translated": 5893,
+ "target": 5686,
+ "approved": 5911,
+ "voted": 0,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 5893
+ },
{
"user": {
"id": "15492732",
@@ -22,35 +44,35 @@
"name": "Hebrew"
}
],
- "translated": 5404,
- "target": 4717,
- "approved": 5437,
+ "translated": 5815,
+ "target": 5068,
+ "approved": 5848,
"voted": 0,
"positiveVotes": 12,
"negativeVotes": 0,
- "winning": 5395
+ "winning": 5806
},
{
"user": {
- "id": "15491798",
- "username": "lupineDK",
- "fullName": "Anders Ecklon (lupineDK)",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png",
- "joined": "2022-10-15 01:14:33"
+ "id": "15554645",
+ "username": "crendasien",
+ "fullName": "Nicole (crendasien)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg",
+ "joined": "2022-11-28 14:18:44"
},
"languages": [
{
- "id": "da",
- "name": "Danish"
+ "id": "it",
+ "name": "Italian"
}
],
- "translated": 5353,
- "target": 5159,
- "approved": 5371,
+ "translated": 5288,
+ "target": 5378,
+ "approved": 5613,
"voted": 0,
- "positiveVotes": 0,
+ "positiveVotes": 11,
"negativeVotes": 0,
- "winning": 5353
+ "winning": 5285
},
{
"user": {
@@ -90,28 +112,6 @@
"negativeVotes": 1,
"winning": 5074
},
- {
- "user": {
- "id": "15554645",
- "username": "crendasien",
- "fullName": "Nicole (crendasien)",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg",
- "joined": "2022-11-28 14:18:44"
- },
- "languages": [
- {
- "id": "it",
- "name": "Italian"
- }
- ],
- "translated": 4910,
- "target": 5000,
- "approved": 5235,
- "voted": 0,
- "positiveVotes": 11,
- "negativeVotes": 0,
- "winning": 4907
- },
{
"user": {
"id": "12701640",
@@ -130,35 +130,13 @@
"name": "Spanish"
}
],
- "translated": 4446,
- "target": 4685,
+ "translated": 4822,
+ "target": 5078,
"approved": 0,
"voted": 166,
- "positiveVotes": 24,
- "negativeVotes": 0,
- "winning": 963
- },
- {
- "user": {
- "id": "15674593",
- "username": "Marty88",
- "fullName": "Marty (Marty88)",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg",
- "joined": "2023-02-08 16:28:53"
- },
- "languages": [
- {
- "id": "sk",
- "name": "Slovak"
- }
- ],
- "translated": 4302,
- "target": 3955,
- "approved": 3732,
- "voted": 0,
- "positiveVotes": 0,
+ "positiveVotes": 30,
"negativeVotes": 0,
- "winning": 3726
+ "winning": 1017
},
{
"user": {
@@ -174,13 +152,13 @@
"name": "German"
}
],
- "translated": 4245,
- "target": 4326,
- "approved": 3964,
+ "translated": 4652,
+ "target": 4751,
+ "approved": 4371,
"voted": 0,
"positiveVotes": 25,
"negativeVotes": 0,
- "winning": 3685
+ "winning": 4092
},
{
"user": {
@@ -196,8 +174,8 @@
"name": "Swedish"
}
],
- "translated": 4142,
- "target": 3889,
+ "translated": 4557,
+ "target": 4273,
"approved": 0,
"voted": 0,
"positiveVotes": 0,
@@ -218,8 +196,74 @@
"name": "Turkish"
}
],
- "translated": 3845,
- "target": 3244,
+ "translated": 4384,
+ "target": 3701,
+ "approved": 0,
+ "voted": 0,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 0
+ },
+ {
+ "user": {
+ "id": "15674593",
+ "username": "Marty88",
+ "fullName": "Marty (Marty88)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg",
+ "joined": "2023-02-08 16:28:53"
+ },
+ "languages": [
+ {
+ "id": "sk",
+ "name": "Slovak"
+ }
+ ],
+ "translated": 4347,
+ "target": 3995,
+ "approved": 3777,
+ "voted": 0,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 3771
+ },
+ {
+ "user": {
+ "id": "15709853",
+ "username": "RJSkudra",
+ "fullName": "RJS (RJSkudra)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png",
+ "joined": "2023-04-08 13:07:46"
+ },
+ "languages": [
+ {
+ "id": "lv",
+ "name": "Latvian"
+ }
+ ],
+ "translated": 4280,
+ "target": 3758,
+ "approved": 4195,
+ "voted": 0,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 4184
+ },
+ {
+ "user": {
+ "id": "16077170",
+ "username": "Topbcy",
+ "fullName": "Turbo (Topbcy)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg",
+ "joined": "2023-10-29 07:14:20"
+ },
+ "languages": [
+ {
+ "id": "zh-TW",
+ "name": "Chinese Traditional"
+ }
+ ],
+ "translated": 4171,
+ "target": 6555,
"approved": 0,
"voted": 0,
"positiveVotes": 0,
@@ -240,14 +284,36 @@
"name": "Hungarian"
}
],
- "translated": 3734,
- "target": 3409,
+ "translated": 4135,
+ "target": 3788,
"approved": 0,
"voted": 0,
"positiveVotes": 0,
"negativeVotes": 0,
"winning": 0
},
+ {
+ "user": {
+ "id": "15617065",
+ "username": "somerlev",
+ "fullName": "somerlev",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg",
+ "joined": "2023-01-01 15:03:01"
+ },
+ "languages": [
+ {
+ "id": "ru",
+ "name": "Russian"
+ }
+ ],
+ "translated": 3866,
+ "target": 3432,
+ "approved": 4640,
+ "voted": 160,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 3655
+ },
{
"user": {
"id": "15644717",
@@ -262,35 +328,35 @@
"name": "Chinese Simplified"
}
],
- "translated": 3296,
- "target": 5128,
- "approved": 3666,
+ "translated": 3836,
+ "target": 5983,
+ "approved": 4206,
"voted": 1,
"positiveVotes": 1,
"negativeVotes": 2,
- "winning": 2873
+ "winning": 3413
},
{
"user": {
- "id": "15709853",
- "username": "RJSkudra",
- "fullName": "RJS (RJSkudra)",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png",
- "joined": "2023-04-08 13:07:46"
+ "id": "15677023",
+ "username": "Spillebulle",
+ "fullName": "Spillebulle",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15677023/medium/096cf68fccf4b666954a0a57a974af64_default.png",
+ "joined": "2023-02-08 02:51:18"
},
"languages": [
{
- "id": "lv",
- "name": "Latvian"
+ "id": "no",
+ "name": "Norwegian"
}
],
- "translated": 3074,
- "target": 2734,
- "approved": 2987,
+ "translated": 3234,
+ "target": 3063,
+ "approved": 4451,
"voted": 0,
"positiveVotes": 0,
"negativeVotes": 0,
- "winning": 2980
+ "winning": 3225
},
{
"user": {
@@ -306,36 +372,14 @@
"name": "Vietnamese"
}
],
- "translated": 2929,
- "target": 4087,
- "approved": 4,
+ "translated": 3001,
+ "target": 4174,
+ "approved": 23,
"voted": 0,
"positiveVotes": 0,
"negativeVotes": 0,
"winning": 4
},
- {
- "user": {
- "id": "15428592",
- "username": "flar.anton",
- "fullName": "Anton Chernyshev (flar.anton)",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg",
- "joined": "2022-08-31 11:31:25"
- },
- "languages": [
- {
- "id": "uk",
- "name": "Ukrainian"
- }
- ],
- "translated": 2883,
- "target": 2551,
- "approved": 2748,
- "voted": 0,
- "positiveVotes": 0,
- "negativeVotes": 0,
- "winning": 2681
- },
{
"user": {
"id": "15875457",
@@ -354,35 +398,35 @@
"name": "Spanish"
}
],
- "translated": 2740,
- "target": 3061,
- "approved": 3553,
+ "translated": 2924,
+ "target": 3268,
+ "approved": 3791,
"voted": 5,
"positiveVotes": 0,
"negativeVotes": 0,
- "winning": 2717
+ "winning": 2901
},
{
"user": {
- "id": "15617065",
- "username": "somerlev",
- "fullName": "somerlev",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg",
- "joined": "2023-01-01 15:03:01"
+ "id": "15428592",
+ "username": "flar.anton",
+ "fullName": "Anton Chernyshev (flar.anton)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg",
+ "joined": "2022-08-31 11:31:25"
},
"languages": [
{
- "id": "ru",
- "name": "Russian"
+ "id": "uk",
+ "name": "Ukrainian"
}
],
- "translated": 2688,
- "target": 2379,
- "approved": 2987,
- "voted": 160,
+ "translated": 2883,
+ "target": 2551,
+ "approved": 2748,
+ "voted": 0,
"positiveVotes": 0,
"negativeVotes": 0,
- "winning": 2557
+ "winning": 2681
},
{
"user": {
@@ -402,8 +446,8 @@
"name": "German"
}
],
- "translated": 2474,
- "target": 2463,
+ "translated": 2607,
+ "target": 2595,
"approved": 0,
"voted": 27,
"positiveVotes": 0,
@@ -412,25 +456,25 @@
},
{
"user": {
- "id": "15677023",
- "username": "Spillebulle",
- "fullName": "Spillebulle",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15677023/medium/096cf68fccf4b666954a0a57a974af64_default.png",
- "joined": "2023-02-08 02:51:18"
+ "id": "15865139",
+ "username": "Beardy",
+ "fullName": "Beardy",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png",
+ "joined": "2023-06-07 06:24:20"
},
"languages": [
{
- "id": "no",
- "name": "Norwegian"
+ "id": "el",
+ "name": "Greek"
}
],
- "translated": 2342,
- "target": 2195,
- "approved": 2342,
- "voted": 0,
+ "translated": 2386,
+ "target": 2567,
+ "approved": 0,
+ "voted": 3,
"positiveVotes": 0,
"negativeVotes": 0,
- "winning": 2338
+ "winning": 0
},
{
"user": {
@@ -498,28 +542,6 @@
"negativeVotes": 0,
"winning": 0
},
- {
- "user": {
- "id": "15865139",
- "username": "Beardy",
- "fullName": "Beardy",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png",
- "joined": "2023-06-07 06:24:20"
- },
- "languages": [
- {
- "id": "el",
- "name": "Greek"
- }
- ],
- "translated": 1975,
- "target": 2118,
- "approved": 0,
- "voted": 3,
- "positiveVotes": 0,
- "negativeVotes": 0,
- "winning": 0
- },
{
"user": {
"id": "15149958",
@@ -534,11 +556,11 @@
"name": "French"
}
],
- "translated": 1720,
- "target": 1943,
+ "translated": 1753,
+ "target": 1978,
"approved": 1103,
"voted": 20,
- "positiveVotes": 8,
+ "positiveVotes": 16,
"negativeVotes": 0,
"winning": 774
},
@@ -659,6 +681,10 @@
"id": "ru",
"name": "Russian"
},
+ {
+ "id": "sk",
+ "name": "Slovak"
+ },
{
"id": "sl",
"name": "Slovenian"
@@ -671,6 +697,10 @@
"id": "sv-SE",
"name": "Swedish"
},
+ {
+ "id": "tr",
+ "name": "Turkish"
+ },
{
"id": "uk",
"name": "Ukrainian"
@@ -680,12 +710,12 @@
"name": "Vietnamese"
}
],
- "translated": 1461,
- "target": 1547,
+ "translated": 1576,
+ "target": 1691,
"approved": 1463,
"voted": 0,
"positiveVotes": 189,
- "negativeVotes": 20,
+ "negativeVotes": 21,
"winning": 1215
},
{
@@ -708,7 +738,7 @@
"voted": 0,
"positiveVotes": 0,
"negativeVotes": 0,
- "winning": 0
+ "winning": 351
},
{
"user": {
@@ -832,6 +862,32 @@
"negativeVotes": 1,
"winning": 0
},
+ {
+ "user": {
+ "id": "15977271",
+ "username": "tagaishi",
+ "fullName": "tagaishi",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png",
+ "joined": "2023-08-22 07:09:16"
+ },
+ "languages": [
+ {
+ "id": "zh-CN",
+ "name": "Chinese Simplified"
+ },
+ {
+ "id": "fr",
+ "name": "French"
+ }
+ ],
+ "translated": 588,
+ "target": 693,
+ "approved": 0,
+ "voted": 2,
+ "positiveVotes": 2,
+ "negativeVotes": 0,
+ "winning": 95
+ },
{
"user": {
"id": "15925879",
@@ -850,7 +906,7 @@
"target": 711,
"approved": 0,
"voted": 1,
- "positiveVotes": 12,
+ "positiveVotes": 16,
"negativeVotes": 0,
"winning": 153
},
@@ -940,7 +996,7 @@
"voted": 0,
"positiveVotes": 0,
"negativeVotes": 0,
- "winning": 198
+ "winning": 250
},
{
"user": {
@@ -986,6 +1042,28 @@
"negativeVotes": 0,
"winning": 0
},
+ {
+ "user": {
+ "id": "15454038",
+ "username": "sebekmartin",
+ "fullName": "Martin Sebek (sebekmartin)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg",
+ "joined": "2023-10-08 09:26:03"
+ },
+ "languages": [
+ {
+ "id": "cs",
+ "name": "Czech"
+ }
+ ],
+ "translated": 393,
+ "target": 355,
+ "approved": 0,
+ "voted": 0,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 0
+ },
{
"user": {
"id": "13330448",
@@ -1030,32 +1108,6 @@
"negativeVotes": 3,
"winning": 119
},
- {
- "user": {
- "id": "15977271",
- "username": "tagaishi",
- "fullName": "tagaishi",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png",
- "joined": "2023-08-22 07:09:16"
- },
- "languages": [
- {
- "id": "zh-CN",
- "name": "Chinese Simplified"
- },
- {
- "id": "fr",
- "name": "French"
- }
- ],
- "translated": 328,
- "target": 395,
- "approved": 0,
- "voted": 2,
- "positiveVotes": 2,
- "negativeVotes": 0,
- "winning": 95
- },
{
"user": {
"id": "15685239",
@@ -1124,22 +1176,22 @@
},
{
"user": {
- "id": "14949159",
- "username": "f1refa11",
- "fullName": "FireFall (f1refa11)",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png",
- "joined": "2023-09-06 14:55:13"
+ "id": "7795",
+ "username": "zielmann",
+ "fullName": "Luke (zielmann)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png",
+ "joined": "2023-10-12 09:50:59"
},
"languages": [
{
- "id": "ru",
- "name": "Russian"
+ "id": "pl",
+ "name": "Polish"
}
],
- "translated": 228,
- "target": 203,
+ "translated": 266,
+ "target": 258,
"approved": 0,
- "voted": 0,
+ "voted": 7,
"positiveVotes": 0,
"negativeVotes": 0,
"winning": 0
@@ -1158,14 +1210,58 @@
"name": "Chinese Simplified"
}
],
- "translated": 210,
- "target": 339,
+ "translated": 264,
+ "target": 429,
"approved": 0,
"voted": 0,
"positiveVotes": 4,
"negativeVotes": 0,
"winning": 126
},
+ {
+ "user": {
+ "id": "16084674",
+ "username": "ai5d02sb",
+ "fullName": "ai5d02sb",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png",
+ "joined": "2023-11-02 15:47:09"
+ },
+ "languages": [
+ {
+ "id": "fr",
+ "name": "French"
+ }
+ ],
+ "translated": 264,
+ "target": 275,
+ "approved": 0,
+ "voted": 12,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 0
+ },
+ {
+ "user": {
+ "id": "14949159",
+ "username": "f1refa11",
+ "fullName": "FireFall (f1refa11)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png",
+ "joined": "2023-09-06 14:55:13"
+ },
+ "languages": [
+ {
+ "id": "ru",
+ "name": "Russian"
+ }
+ ],
+ "translated": 228,
+ "target": 203,
+ "approved": 0,
+ "voted": 0,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 134
+ },
{
"user": {
"id": "13641407",
@@ -1208,7 +1304,7 @@
"voted": 0,
"positiveVotes": 54,
"negativeVotes": 3,
- "winning": 20
+ "winning": 17
},
{
"user": {
@@ -1232,6 +1328,28 @@
"negativeVotes": 3,
"winning": 75
},
+ {
+ "user": {
+ "id": "14934947",
+ "username": "djismgaming",
+ "fullName": "Ismael (djismgaming)",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg",
+ "joined": "2023-11-12 08:36:15"
+ },
+ "languages": [
+ {
+ "id": "es-ES",
+ "name": "Spanish"
+ }
+ ],
+ "translated": 164,
+ "target": 181,
+ "approved": 0,
+ "voted": 6,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 0
+ },
{
"user": {
"id": "12580457",
@@ -1922,28 +2040,6 @@
"negativeVotes": 0,
"winning": 0
},
- {
- "user": {
- "id": "7795",
- "username": "zielmann",
- "fullName": "Luke (zielmann)",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png",
- "joined": "2023-10-12 09:50:59"
- },
- "languages": [
- {
- "id": "pl",
- "name": "Polish"
- }
- ],
- "translated": 4,
- "target": 4,
- "approved": 0,
- "voted": 6,
- "positiveVotes": 0,
- "negativeVotes": 0,
- "winning": 0
- },
{
"user": {
"id": "15643771",
@@ -2672,23 +2768,6 @@
"negativeVotes": 0,
"winning": 0
},
- {
- "user": {
- "id": "15454038",
- "username": "sebekmartin",
- "fullName": "Martin Sebek (sebekmartin)",
- "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg",
- "joined": "2023-10-08 09:26:03"
- },
- "languages": [],
- "translated": 0,
- "target": 0,
- "approved": 0,
- "voted": 0,
- "positiveVotes": 0,
- "negativeVotes": 0,
- "winning": 0
- },
{
"user": {
"id": "16051620",
@@ -2727,6 +2806,23 @@
"positiveVotes": 0,
"negativeVotes": 0,
"winning": 0
+ },
+ {
+ "user": {
+ "id": "16097722",
+ "username": "explosiveparrot",
+ "fullName": "explosiveparrot",
+ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png",
+ "joined": "2023-11-10 21:23:11"
+ },
+ "languages": [],
+ "translated": 0,
+ "target": 0,
+ "approved": 0,
+ "voted": 0,
+ "positiveVotes": 0,
+ "negativeVotes": 0,
+ "winning": 0
}
]
}
\ No newline at end of file
diff --git a/data/default.json b/data/default.json
new file mode 100644
index 00000000000..910d736f7b6
--- /dev/null
+++ b/data/default.json
@@ -0,0 +1,513 @@
+{
+ "schemaVersion": 1,
+ "configProperties": {
+ "name": "default"
+ },
+ "categories": [],
+ "wrappers": [
+ {
+ "id": "default",
+ "position": 0
+ }
+ ],
+ "apps": [
+ {
+ "id": "5df743d9-5cb1-457c-85d2-64ff86855652",
+ "name": "Documentation",
+ "url": "https://homarr.dev",
+ "behaviour": {
+ "onClickUrl": "https://homarr.dev",
+ "externalUrl": "https://homarr.dev",
+ "isOpeningNewTab": true
+ },
+ "network": {
+ "enabledStatusChecker": false,
+ "statusCodes": [
+ "200"
+ ]
+ },
+ "appearance": {
+ "iconUrl": "/imgs/logo/logo.png",
+ "appNameStatus": "normal",
+ "positionAppName": "column",
+ "lineClampAppName": 1
+ },
+ "integration": {
+ "type": null,
+ "properties": []
+ },
+ "area": {
+ "type": "wrapper",
+ "properties": {
+ "id": "default"
+ }
+ },
+ "shape": {
+ "md": {
+ "location": {
+ "x": 5,
+ "y": 1
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "sm": {
+ "location": {
+ "x": 0,
+ "y": 1
+ },
+ "size": {
+ "width": 1,
+ "height": 2
+ }
+ },
+ "lg": {
+ "location": {
+ "x": 6,
+ "y": 1
+ },
+ "size": {
+ "width": 2,
+ "height": 2
+ }
+ }
+ }
+ },
+ {
+ "id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a337",
+ "name": "Discord",
+ "url": "https://discord.com/invite/aCsmEV5RgA",
+ "behaviour": {
+ "onClickUrl": "https://discord.com/invite/aCsmEV5RgA",
+ "isOpeningNewTab": true,
+ "externalUrl": "https://discord.com/invite/aCsmEV5RgA",
+ "tooltipDescription": "Join our Discord server! We're waiting for your ideas and feedback. "
+ },
+ "network": {
+ "enabledStatusChecker": false,
+ "statusCodes": [
+ "200"
+ ]
+ },
+ "appearance": {
+ "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/discord.png",
+ "appNameStatus": "normal",
+ "positionAppName": "row-reverse",
+ "lineClampAppName": 1
+ },
+ "integration": {
+ "type": null,
+ "properties": []
+ },
+ "area": {
+ "type": "wrapper",
+ "properties": {
+ "id": "default"
+ }
+ },
+ "shape": {
+ "md": {
+ "location": {
+ "x": 3,
+ "y": 1
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "sm": {
+ "location": {
+ "x": 1,
+ "y": 4
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "lg": {
+ "location": {
+ "x": 4,
+ "y": 0
+ },
+ "size": {
+ "width": 2,
+ "height": 1
+ }
+ }
+ }
+ },
+ {
+ "id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a330",
+ "name": "Contribute",
+ "url": "https://github.com/ajnart/homarr",
+ "behaviour": {
+ "onClickUrl": "https://github.com/ajnart/homarr",
+ "externalUrl": "https://github.com/ajnart/homarr",
+ "isOpeningNewTab": true,
+ "tooltipDescription": ""
+ },
+ "network": {
+ "enabledStatusChecker": false,
+ "statusCodes": []
+ },
+ "appearance": {
+ "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/github.png",
+ "appNameStatus": "normal",
+ "positionAppName": "row-reverse",
+ "lineClampAppName": 2
+ },
+ "integration": {
+ "type": null,
+ "properties": []
+ },
+ "area": {
+ "type": "wrapper",
+ "properties": {
+ "id": "default"
+ }
+ },
+ "shape": {
+ "md": {
+ "location": {
+ "x": 3,
+ "y": 2
+ },
+ "size": {
+ "width": 2,
+ "height": 1
+ }
+ },
+ "sm": {
+ "location": {
+ "x": 1,
+ "y": 3
+ },
+ "size": {
+ "width": 2,
+ "height": 1
+ }
+ },
+ "lg": {
+ "location": {
+ "x": 2,
+ "y": 0
+ },
+ "size": {
+ "width": 2,
+ "height": 1
+ }
+ }
+ }
+ },
+ {
+ "id": "47af36c0-47c1-4e5b-bfc7-ad645ee6a990",
+ "name": "Donate",
+ "url": "https://ko-fi.com/ajnart",
+ "behaviour": {
+ "onClickUrl": "https://ko-fi.com/ajnart",
+ "externalUrl": "https://ko-fi.com/ajnart",
+ "isOpeningNewTab": true,
+ "tooltipDescription": "Please consider making a donation"
+ },
+ "network": {
+ "enabledStatusChecker": false,
+ "statusCodes": [
+ "200"
+ ]
+ },
+ "appearance": {
+ "iconUrl": "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/ko-fi.png",
+ "appNameStatus": "normal",
+ "positionAppName": "row-reverse",
+ "lineClampAppName": 1
+ },
+ "integration": {
+ "type": null,
+ "properties": []
+ },
+ "area": {
+ "type": "wrapper",
+ "properties": {
+ "id": "default"
+ }
+ },
+ "shape": {
+ "md": {
+ "location": {
+ "x": 4,
+ "y": 1
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "sm": {
+ "location": {
+ "x": 2,
+ "y": 4
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "lg": {
+ "location": {
+ "x": 6,
+ "y": 0
+ },
+ "size": {
+ "width": 2,
+ "height": 1
+ }
+ }
+ }
+ }
+ ],
+ "widgets": [
+ {
+ "id": "e3004052-6b83-480e-b458-56e8ccdca5f0",
+ "type": "weather",
+ "properties": {
+ "displayInFahrenheit": false,
+ "location": {
+ "name": "Paris",
+ "latitude": 48.85341,
+ "longitude": 2.3488
+ },
+ "displayCityName": true
+ },
+ "area": {
+ "type": "wrapper",
+ "properties": {
+ "id": "default"
+ }
+ },
+ "shape": {
+ "md": {
+ "location": {
+ "x": 5,
+ "y": 0
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "sm": {
+ "location": {
+ "x": 2,
+ "y": 0
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "lg": {
+ "location": {
+ "x": 0,
+ "y": 0
+ },
+ "size": {
+ "width": 2,
+ "height": 1
+ }
+ }
+ }
+ },
+ {
+ "id": "971aa859-8570-49a1-8d34-dd5c7b3638d1",
+ "type": "date",
+ "properties": {
+ "display24HourFormat": true,
+ "dateFormat": "hide",
+ "enableTimezone": false,
+ "timezoneLocation": {
+ "name": "Paris",
+ "latitude": 48.85341,
+ "longitude": 2.3488
+ },
+ "titleState": "city"
+ },
+ "area": {
+ "type": "wrapper",
+ "properties": {
+ "id": "default"
+ }
+ },
+ "shape": {
+ "sm": {
+ "location": {
+ "x": 1,
+ "y": 0
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "md": {
+ "location": {
+ "x": 4,
+ "y": 0
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "lg": {
+ "location": {
+ "x": 8,
+ "y": 0
+ },
+ "size": {
+ "width": 2,
+ "height": 1
+ }
+ }
+ }
+ },
+ {
+ "id": "f252768d-9e69-491b-b6b4-8cad04fa30e8",
+ "type": "date",
+ "properties": {
+ "display24HourFormat": true,
+ "dateFormat": "hide",
+ "enableTimezone": true,
+ "timezoneLocation": {
+ "name": "Tokyo",
+ "latitude": 35.6895,
+ "longitude": 139.69171
+ },
+ "titleState": "city"
+ },
+ "area": {
+ "type": "wrapper",
+ "properties": {
+ "id": "default"
+ }
+ },
+ "shape": {
+ "sm": {
+ "location": {
+ "x": 0,
+ "y": 0
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "md": {
+ "location": {
+ "x": 3,
+ "y": 0
+ },
+ "size": {
+ "width": 1,
+ "height": 1
+ }
+ },
+ "lg": {
+ "location": {
+ "x": 8,
+ "y": 1
+ },
+ "size": {
+ "width": 2,
+ "height": 1
+ }
+ }
+ }
+ },
+ {
+ "id": "86b1921f-efa7-410f-92dd-79553bf3264d",
+ "type": "notebook",
+ "properties": {
+ "showToolbar": true,
+ "content": "
Welcome to Homarr 🚀👋 We're glad that you're here! Homarr is a modern and easy to use dashboard that helps you to organize and manage your home network from one place. Control is at your fingertips .
We recommend you to read the getting started guide first. To edit this board you must enter the edit mode - only administrators can do this. Adding an app is the first step you should take. You can do this by clicking the Add tile
button at the top right and select App
. After you provided an internal URL, external URL and selected an icon you can drag it around when holding down the left mouse button. Make it bigger or smaller using the drag icon at the bottom right. When you're happy with it's position, you must exit edit mode to save your board . Adding widgets works the same way but may require additional configuration - read the documentation for more information.
To remove this widget, you must log in to your administrator account and click on the menu to delete it.
Your TODO list:
"
+ },
+ "area": {
+ "type": "wrapper",
+ "properties": {
+ "id": "default"
+ }
+ },
+ "shape": {
+ "sm": {
+ "location": {
+ "x": 0,
+ "y": 0
+ },
+ "size": {
+ "width": 3,
+ "height": 2
+ }
+ },
+ "md": {
+ "location": {
+ "x": 0,
+ "y": 0
+ },
+ "size": {
+ "width": 3,
+ "height": 4
+ }
+ },
+ "lg": {
+ "location": {
+ "x": 0,
+ "y": 1
+ },
+ "size": {
+ "width": 6,
+ "height": 3
+ }
+ }
+ }
+ }
+ ],
+ "settings": {
+ "common": {
+ "searchEngine": {
+ "type": "google",
+ "properties": {}
+ }
+ },
+ "customization": {
+ "layout": {
+ "enabledLeftSidebar": false,
+ "enabledRightSidebar": false,
+ "enabledDocker": false,
+ "enabledPing": false,
+ "enabledSearchbar": true
+ },
+ "pageTitle": "Homarr ⭐️",
+ "logoImageUrl": "/imgs/logo/logo.png",
+ "faviconUrl": "/imgs/favicon/favicon-squared.png",
+ "backgroundImageUrl": "",
+ "customCss": "",
+ "colors": {
+ "primary": "red",
+ "secondary": "yellow",
+ "shade": 7
+ },
+ "appOpacity": 100,
+ "gridstack": {
+ "columnCountSmall": 3,
+ "columnCountMedium": 6,
+ "columnCountLarge": 10
+ }
+ },
+ "access": {
+ "allowGuests": false
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/migrate.ts b/drizzle/migrate/migrate.ts
similarity index 83%
rename from src/migrate.ts
rename to drizzle/migrate/migrate.ts
index 5c4abeb88f4..cacf32fe82c 100644
--- a/src/migrate.ts
+++ b/drizzle/migrate/migrate.ts
@@ -5,6 +5,8 @@ import dotenv from 'dotenv';
import { drizzle } from 'drizzle-orm/better-sqlite3';
import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
+const migrationsFolder = process.argv[2] ?? '../drizzle';
+
dotenv.config({ path: __dirname + '/../.env' });
const sqlite = new Database(process.env.DATABASE_URL!.replace('file:', ''));
@@ -12,7 +14,7 @@ const sqlite = new Database(process.env.DATABASE_URL!.replace('file:', ''));
const db = drizzle(sqlite);
const migrateDatabase = async () => {
- await migrate(db, { migrationsFolder: './drizzle' });
+ await migrate(db, { migrationsFolder });
};
migrateDatabase();
diff --git a/drizzle/migrate/package.json b/drizzle/migrate/package.json
new file mode 100644
index 00000000000..35772f2169e
--- /dev/null
+++ b/drizzle/migrate/package.json
@@ -0,0 +1,14 @@
+{
+ "description": "This package.json is used for the migration script the dependencies are only installed within the Dockerfile.",
+ "scripts": {
+ "db:migrate": "ts-node ./migrate.ts"
+ },
+ "dependencies": {
+ "@types/better-sqlite3": "^7.6.7",
+ "better-sqlite3": "8.6.0",
+ "drizzle-orm": "^0.28.6",
+ "dotenv": "^16.3.1",
+ "ts-node": "^10.9.1",
+ "typescript": "^5.2.2"
+ }
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index 9a480b3dad5..3724f70c2ea 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "homarr",
- "version": "0.14.0",
+ "version": "0.14.1",
"description": "Homarr - A homepage for your server.",
"license": "MIT",
"repository": {
@@ -24,7 +24,7 @@
"test:coverage": "SKIP_ENV_VALIDATION=1 vitest run --coverage",
"docker:build": "turbo build && docker build . -t homarr:local-dev",
"docker:start": "docker run -p 7575:7575 --name homarr-development homarr:local-dev",
- "db:migrate": "ts-node src/migrate.ts"
+ "db:migrate": "dotenv ts-node drizzle/migrate/migrate.ts ./drizzle"
},
"dependencies": {
"@auth/drizzle-adapter": "^0.3.2",
@@ -127,6 +127,7 @@
"@vitest/coverage-c8": "^0.33.0",
"@vitest/coverage-v8": "^0.34.5",
"@vitest/ui": "^0.34.4",
+ "dotenv-cli": "^7.3.0",
"eslint": "^8.0.1",
"eslint-config-next": "^13.4.5",
"eslint-plugin-promise": "^6.0.0",
@@ -232,4 +233,4 @@
]
}
}
-}
+}
\ No newline at end of file
diff --git a/public/locales/cn/layout/header.json b/public/locales/cn/layout/header.json
index 4c5215ae1c8..456a8a0aa8e 100644
--- a/public/locales/cn/layout/header.json
+++ b/public/locales/cn/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "这是 Homarr 的一项实验性功能。请在 GitHub 或 Discord 上报告任何问题。"
- },
"search": {
"label": "搜索",
"engines": {
diff --git a/public/locales/cn/settings/customization/page-appearance.json b/public/locales/cn/settings/customization/page-appearance.json
index 928245782a7..dc18d7a4b36 100644
--- a/public/locales/cn/settings/customization/page-appearance.json
+++ b/public/locales/cn/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "背景"
},
+ "backgroundImageAttachment": {
+ "label": "背景图片附件",
+ "options": {
+ "fixed": "固定 - 背景保持在同一位置(推荐)",
+ "scroll": "滚动 - 背景随鼠标滚动"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "背景图像大小",
+ "options": {
+ "cover": "覆盖 - 通过裁剪多余的空间,将图像缩放得尽可能小以覆盖整个窗口。 (推荐使用)",
+ "contain": "包含 - 在不裁剪或拉伸图像的情况下,在容器内尽可能大地缩放图像。"
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "背景图片附件",
+ "options": {
+ "repeat": "重复 - 根据需要重复图像,以覆盖整个背景图像绘制区域。",
+ "no-repeat": "无重复 - 图像不重复且可能不会填满整个空间(推荐)",
+ "repeat-x": "重复 X - 与 \"重复 \"相同,但只在水平轴上重复。",
+ "repeat-y": "重复 Y - 与 \"重复 \"相同,但只在垂直轴上重复。"
+ }
+ },
"customCSS": {
"label": "自定义 CSS",
"description": "只推荐有经验的用户使用 CSS 自定义面板",
"placeholder": "自定义 CSS 将在最后应用",
"applying": "应用CSS中..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/cr/layout/header.json b/public/locales/cr/layout/header.json
index d0cfa45a694..5aa1313a156 100644
--- a/public/locales/cr/layout/header.json
+++ b/public/locales/cr/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "crwdns3445:0crwdne3445:0"
- },
"search": {
"label": "crwdns3447:0crwdne3447:0",
"engines": {
diff --git a/public/locales/cr/settings/customization/page-appearance.json b/public/locales/cr/settings/customization/page-appearance.json
index a06ab514b36..3895e53899e 100644
--- a/public/locales/cr/settings/customization/page-appearance.json
+++ b/public/locales/cr/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "crwdns1628:0crwdne1628:0"
},
+ "backgroundImageAttachment": {
+ "label": "crwdns4010:0crwdne4010:0",
+ "options": {
+ "fixed": "crwdns4012:0crwdne4012:0",
+ "scroll": "crwdns4014:0crwdne4014:0"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "crwdns4016:0crwdne4016:0",
+ "options": {
+ "cover": "crwdns4018:0crwdne4018:0",
+ "contain": "crwdns4020:0crwdne4020:0"
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "crwdns4022:0crwdne4022:0",
+ "options": {
+ "repeat": "crwdns4024:0crwdne4024:0",
+ "no-repeat": "crwdns4032:0crwdne4032:0",
+ "repeat-x": "crwdns4028:0crwdne4028:0",
+ "repeat-y": "crwdns4030:0crwdne4030:0"
+ }
+ },
"customCSS": {
"label": "crwdns1702:0crwdne1702:0",
"description": "crwdns2723:0crwdne2723:0",
"placeholder": "crwdns2389:0crwdne2389:0",
"applying": "crwdns2561:0crwdne2561:0"
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/cr/tools/docker.json b/public/locales/cr/tools/docker.json
index 998b0210e4f..ff103e2a1dc 100644
--- a/public/locales/cr/tools/docker.json
+++ b/public/locales/cr/tools/docker.json
@@ -2,7 +2,7 @@
"title": "crwdns3821:0crwdne3821:0",
"alerts": {
"notConfigured": {
- "text": "crwdns3823:0crwdne3823:0"
+ "text": "crwdns4008:0crwdne4008:0"
}
},
"modals": {
diff --git a/public/locales/cs/boards/customize.json b/public/locales/cs/boards/customize.json
index 67fbe9da0e4..11da29d04ae 100644
--- a/public/locales/cs/boards/customize.json
+++ b/public/locales/cs/boards/customize.json
@@ -1,5 +1,5 @@
{
- "metaTitle": "",
+ "metaTitle": "Přizpůsobení {{name}} plochy",
"pageTitle": "Přizpůsobení {{name}} plochy",
"backToBoard": "Zpět na plochu",
"settings": {
diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 69e78f046aa..065f41b13ac 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -1,5 +1,5 @@
{
- "save": "",
+ "save": "Uložit",
"apply": "",
"insert": "",
"about": "",
@@ -17,13 +17,13 @@
"enableAll": "",
"disableAll": "",
"version": "",
- "changePosition": "",
+ "changePosition": "Změnit pozici",
"remove": "",
"removeConfirm": "",
"createItem": "",
"sections": {
"settings": "",
- "dangerZone": ""
+ "dangerZone": "Nebezpečná zóna"
},
"secrets": {
"apiKey": "",
diff --git a/public/locales/cs/layout/header.json b/public/locales/cs/layout/header.json
index 6957b47125b..0b40bc882b9 100644
--- a/public/locales/cs/layout/header.json
+++ b/public/locales/cs/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": ""
- },
"search": {
"label": "Vyhledat",
"engines": {
@@ -17,7 +14,7 @@
"preferences": "Uživatelská nastavení",
"defaultBoard": "Výchozí plocha",
"manage": "Spravovat",
- "logout": "Odhlásit z {{username}}",
+ "logout": "Odhlásit {{username}}",
"login": ""
}
},
diff --git a/public/locales/cs/layout/modals/add-app.json b/public/locales/cs/layout/modals/add-app.json
index f5a7aa4eaf8..efadec3f787 100644
--- a/public/locales/cs/layout/modals/add-app.json
+++ b/public/locales/cs/layout/modals/add-app.json
@@ -1,21 +1,21 @@
{
"tabs": {
- "general": "",
- "behaviour": "",
+ "general": "Obecné",
+ "behaviour": "Chování",
"network": "",
- "appearance": "",
- "integration": ""
+ "appearance": "Vzhled",
+ "integration": "Integrace"
},
"general": {
"appname": {
- "label": "",
+ "label": "Název aplikace",
"description": ""
},
"internalAddress": {
"label": "",
"description": "",
"troubleshoot": {
- "label": "",
+ "label": "Narazili jste na problém?",
"header": "",
"lines": {
"nothingAfterPort": "",
@@ -36,11 +36,11 @@
},
"behaviour": {
"isOpeningNewTab": {
- "label": "",
- "description": ""
+ "label": "Otevřít na nové kartě",
+ "description": "Otevřete aplikaci na nové kartě místo aktuální."
},
"tooltipDescription": {
- "label": "",
+ "label": "Popis aplikace",
"description": ""
},
"customProtocolWarning": ""
diff --git a/public/locales/cs/manage/users.json b/public/locales/cs/manage/users.json
index 3cbdfa7068b..d717de76ccd 100644
--- a/public/locales/cs/manage/users.json
+++ b/public/locales/cs/manage/users.json
@@ -7,7 +7,7 @@
},
"table": {
"header": {
- "user": ""
+ "user": "Uživatel"
}
},
"tooltips": {
diff --git a/public/locales/cs/modules/bookmark.json b/public/locales/cs/modules/bookmark.json
index 6fedba2d90a..87bf684c74e 100644
--- a/public/locales/cs/modules/bookmark.json
+++ b/public/locales/cs/modules/bookmark.json
@@ -35,7 +35,7 @@
},
"name": "",
"url": "",
- "newTab": "",
+ "newTab": "Otevřít na nové kartě",
"hideHostname": "",
"hideIcon": "",
"delete": ""
diff --git a/public/locales/cs/modules/dlspeed.json b/public/locales/cs/modules/dlspeed.json
index 1dfd395d36a..7704885917f 100644
--- a/public/locales/cs/modules/dlspeed.json
+++ b/public/locales/cs/modules/dlspeed.json
@@ -18,7 +18,7 @@
}
},
"lineChart": {
- "title": "",
+ "title": "Aktuální rychlost stahování",
"download": "",
"upload": "",
"timeSpan": "",
diff --git a/public/locales/cs/modules/media-requests-list.json b/public/locales/cs/modules/media-requests-list.json
index 05e700def08..bef8c144b49 100644
--- a/public/locales/cs/modules/media-requests-list.json
+++ b/public/locales/cs/modules/media-requests-list.json
@@ -14,7 +14,7 @@
},
"noRequests": "",
"state": {
- "approved": "",
+ "approved": "Schváleno",
"pendingApproval": "",
"declined": ""
},
diff --git a/public/locales/cs/modules/media-requests-stats.json b/public/locales/cs/modules/media-requests-stats.json
index f152af280f4..8ad032e2645 100644
--- a/public/locales/cs/modules/media-requests-stats.json
+++ b/public/locales/cs/modules/media-requests-stats.json
@@ -13,15 +13,15 @@
}
},
"mediaStats": {
- "title": "",
- "pending": "",
- "tvRequests": "",
- "movieRequests": "",
- "approved": "",
- "totalRequests": ""
+ "title": "Statistiky médií",
+ "pending": "Čeká na schválení",
+ "tvRequests": "Požadavky seriálů",
+ "movieRequests": "Požadavky filmů",
+ "approved": "Již schváleno",
+ "totalRequests": "Celkem"
},
"userStats": {
- "title": "",
- "requests": ""
+ "title": "Top uživatelé",
+ "requests": "Požadavků: {{number}}"
}
}
diff --git a/public/locales/cs/modules/media-server.json b/public/locales/cs/modules/media-server.json
index 3e8852626d9..16a686ef70e 100644
--- a/public/locales/cs/modules/media-server.json
+++ b/public/locales/cs/modules/media-server.json
@@ -1,18 +1,18 @@
{
"descriptor": {
- "name": "",
+ "name": "Mediální server",
"description": "",
"settings": {
"title": ""
}
},
- "loading": "",
+ "loading": "Načítání streamů",
"card": {
"table": {
"header": {
- "session": "",
- "user": "",
- "currentlyPlaying": ""
+ "session": "Relace",
+ "user": "Uživatel",
+ "currentlyPlaying": "Právě přehráváno"
}
},
"errors": {
diff --git a/public/locales/cs/modules/torrents-status.json b/public/locales/cs/modules/torrents-status.json
index 910e0093545..4d700fe7591 100644
--- a/public/locales/cs/modules/torrents-status.json
+++ b/public/locales/cs/modules/torrents-status.json
@@ -35,9 +35,9 @@
"card": {
"footer": {
"error": "",
- "lastUpdated": "",
- "ratioGlobal": "",
- "ratioWithFilter": ""
+ "lastUpdated": "Naposledy aktualizováno před {{time}}",
+ "ratioGlobal": "Globální poměr",
+ "ratioWithFilter": "Filtrovaný poměr"
},
"table": {
"header": {
@@ -57,7 +57,7 @@
}
},
"lineChart": {
- "title": "",
+ "title": "Aktuální rychlost stahování",
"download": "",
"upload": "",
"timeSpan": "",
@@ -75,8 +75,8 @@
}
},
"loading": {
- "title": "",
- "description": ""
+ "title": "Načítání",
+ "description": "Navazování spojení"
},
"popover": {
"introductionPrefix": "",
diff --git a/public/locales/cs/settings/customization/general.json b/public/locales/cs/settings/customization/general.json
index 75854abaed2..ed76ad44d50 100644
--- a/public/locales/cs/settings/customization/general.json
+++ b/public/locales/cs/settings/customization/general.json
@@ -14,7 +14,7 @@
"description": "Upravte názvy, logo a PWA"
},
"appereance": {
- "name": "",
+ "name": "Vzhled",
"description": "Přizpůsobte pozadí, barvy a zobrazení aplikací"
},
"accessibility": {
@@ -22,7 +22,7 @@
"description": ""
},
"access": {
- "name": "",
+ "name": "Oprávnění",
"description": "Nastavte, kdo má přístup k Vaší ploše"
}
}
diff --git a/public/locales/cs/settings/customization/page-appearance.json b/public/locales/cs/settings/customization/page-appearance.json
index 2ca24630342..7f98a8ed094 100644
--- a/public/locales/cs/settings/customization/page-appearance.json
+++ b/public/locales/cs/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Pozadí"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Vlastní CSS",
"description": "Dále si můžete přizpůsobit ovládací panel pomocí CSS, doporučujeme pouze zkušeným uživatelům",
"placeholder": "",
"applying": ""
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/cs/tools/docker.json b/public/locales/cs/tools/docker.json
index 8d403475c6a..54e726b7336 100644
--- a/public/locales/cs/tools/docker.json
+++ b/public/locales/cs/tools/docker.json
@@ -2,7 +2,7 @@
"title": "",
"alerts": {
"notConfigured": {
- "text": "Vaše instance Homarr nemá nakonfigurovaný Docker nebo se nepodařilo načíst kontejnery. Podívejte se prosím do dokumentace, jak integraci nastavit."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/da/layout/header.json b/public/locales/da/layout/header.json
index 3d63ce72053..c20d632bb6c 100644
--- a/public/locales/da/layout/header.json
+++ b/public/locales/da/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Dette er en eksperimentel funktion i Homarr. Rapporter venligst eventuelle problemer på GitHub eller Discord ."
- },
"search": {
"label": "Søg",
"engines": {
diff --git a/public/locales/da/settings/customization/page-appearance.json b/public/locales/da/settings/customization/page-appearance.json
index 6df6a8617c7..7f567f72fcb 100644
--- a/public/locales/da/settings/customization/page-appearance.json
+++ b/public/locales/da/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Baggrund"
},
+ "backgroundImageAttachment": {
+ "label": "Vedhæftning af baggrundsbillede",
+ "options": {
+ "fixed": "Fast - Baggrunden forbliver i samme position (anbefales)",
+ "scroll": "Scroll - Baggrunden scroller med musen"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Baggrundsbilledets størrelse",
+ "options": {
+ "cover": "Cover - Skalerer billedet så lille som muligt for at dække hele vinduet ved at beskære for overskydende materiale. (anbefalede)",
+ "contain": "Indehold - Skalerer billedet så stort som muligt i dets ramme uden at beskære eller strække billedet."
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Vedhæftning af baggrundsbillede",
+ "options": {
+ "repeat": "Gentag - Billedet gentages så meget som nødvendigt for at dække hele baggrundsbilledets maleområde.",
+ "no-repeat": "Ingen gentagelse - Billedet gentages ikke og fylder muligvis ikke hele rummet (anbefales)",
+ "repeat-x": "Gentag X - Samme som 'Gentag' men kun på vandret akse.",
+ "repeat-y": "Gentag Y - Samme som 'Gentag' men kun på lodret akse."
+ }
+ },
"customCSS": {
"label": "Tilpasset CSS",
"description": "Yderligere, tilpasse dit dashboard ved hjælp af CSS, anbefales kun til erfarne brugere",
"placeholder": "Brugerdefineret CSS vil blive anvendt sidst",
"applying": "Anvender CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/da/tools/docker.json b/public/locales/da/tools/docker.json
index 4ff6d913a34..eabaff8785a 100644
--- a/public/locales/da/tools/docker.json
+++ b/public/locales/da/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Din Homarr-instans har ikke Docker konfigureret, eller den har fejlet i at hente containere. Se i dokumentationen, hvordan du sætter integrationen op."
+ "text": "Din Homarr-instans har ikke Docker konfigureret, eller den har ikke kunne hente containere. Se venligst dokumentationen for, hvordan du opsætter integrationen."
}
},
"modals": {
diff --git a/public/locales/de/layout/header.json b/public/locales/de/layout/header.json
index 2e00f717acf..2450f8f8673 100644
--- a/public/locales/de/layout/header.json
+++ b/public/locales/de/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Dies ist eine experimentelle Funktion von Homarr. Bitte melde Probleme auf GitHub oder Discord ."
- },
"search": {
"label": "Suchen",
"engines": {
diff --git a/public/locales/de/settings/customization/page-appearance.json b/public/locales/de/settings/customization/page-appearance.json
index b67918dacc8..c35ff49ce8b 100644
--- a/public/locales/de/settings/customization/page-appearance.json
+++ b/public/locales/de/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Hintergrund"
},
+ "backgroundImageAttachment": {
+ "label": "Anhang des Hintergrundbildes",
+ "options": {
+ "fixed": "Fixiert - Hintergrund bleibt in der gleichen Position (empfohlen)",
+ "scroll": "Scrollen – Scrollt mit der Maus im Hintergrund"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Hintergrundbild-Größe",
+ "options": {
+ "cover": "Abdecken - Skaliert das Bild so klein wie möglich, um das gesamte Fenster abzudecken, indem überschüssiger Platz abgeschnitten wird. (empfohlen)",
+ "contain": "Einschließen – Skaliert das Bild innerhalb seines Containers so groß wie möglich, ohne das Bild zu beschneiden oder zu strecken."
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Anhang des Hintergrundbildes",
+ "options": {
+ "repeat": "Wiederholen - Das Bild wird so oft wiederholt, bis es den gesamten Bereich des Hintergrundbildes abdeckt.",
+ "no-repeat": "Keine Wiederholung – Das Bild wird nicht wiederholt und füllt möglicherweise nicht den gesamten Raum aus (empfohlen)",
+ "repeat-x": "Wiederholen X – Wie „Wiederholen“, jedoch nur auf der horizontalen Achse.",
+ "repeat-y": "Wiederholen Y – Wie „Wiederholen“, jedoch nur auf der vertikalen Achse."
+ }
+ },
"customCSS": {
"label": "Benutzerdefiniertes CSS",
"description": "Außerdem können Sie Ihr Dashboard mittels CSS anpassen, dies wird nur für erfahrene Benutzer empfohlen",
"placeholder": "Benutzerdefiniertes CSS wird zuletzt angewendet",
"applying": "CSS wird übernommen..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/de/tools/docker.json b/public/locales/de/tools/docker.json
index 622947e1ff5..5f6ed9797fe 100644
--- a/public/locales/de/tools/docker.json
+++ b/public/locales/de/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Auf Ihrer Homarr-Instanz ist Docker nicht konfiguriert oder es ist nicht möglich, Container zu erkennen. Bitte lesen Sie in der Dokumentation nach, wie Sie diese Integration einrichten können."
+ "text": "Auf Ihrer Homarr-Instanz ist Docker nicht konfiguriert oder es war nicht möglich, Container abzurufen. Bitte lesen Sie in der Dokumentation nach, wie Sie diese Integration einrichten können."
}
},
"modals": {
diff --git a/public/locales/el/common.json b/public/locales/el/common.json
index 44d0cc3b1a9..3f3b132c9a1 100644
--- a/public/locales/el/common.json
+++ b/public/locales/el/common.json
@@ -1,7 +1,7 @@
{
"save": "Αποθήκευση",
- "apply": "",
- "insert": "",
+ "apply": "Εφαρμογή",
+ "insert": "Εισαγωγή",
"about": "Σχετικά",
"cancel": "Ακύρωση",
"close": "Κλείσιμο",
@@ -45,7 +45,7 @@
"seeMore": "Δείτε περισσότερα...",
"position": {
"left": "Αριστερά",
- "center": "",
+ "center": "Κέντρο",
"right": "Δεξιά"
},
"attributes": {
diff --git a/public/locales/el/layout/header.json b/public/locales/el/layout/header.json
index d762e5e3587..9d73a3a3095 100644
--- a/public/locales/el/layout/header.json
+++ b/public/locales/el/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Αυτή είναι μια πειραματική λειτουργία του Homarr. Αναφέρετε τυχόν προβλήματα στο GitHub ή στο Discord ."
- },
"search": {
"label": "Αναζήτηση",
"engines": {
diff --git a/public/locales/el/layout/modals/about.json b/public/locales/el/layout/modals/about.json
index ba1d01c4730..29672758f4a 100644
--- a/public/locales/el/layout/modals/about.json
+++ b/public/locales/el/layout/modals/about.json
@@ -5,10 +5,10 @@
"key": "Πλήκτρο συντόμευσης",
"action": "Ενέργεια",
"keybinds": "Δεσμοί πλήκτρων",
- "translators": "",
- "translatorsDescription": "",
- "contributors": "",
- "contributorsDescription": "",
+ "translators": "Μεταφραστές ({{count}})",
+ "translatorsDescription": "Χάρη σε αυτούς τους ανθρώπους, το Homarr είναι διαθέσιμο σε {{languages}} γλώσσες! Θέλετε να βοηθήσετε στη μετάφραση του Homarr στη γλώσσα σας; Διαβάστε πώς να το κάνετε εδώ .",
+ "contributors": "Συνεισφέροντες ({{count}})",
+ "contributorsDescription": "Αυτοί οι άνθρωποι έχουν δημιουργήσει τον κώδικα που κάνει το homarr να λειτουργεί! Θέλετε να βοηθήσετε στην κατασκευή του Homarr; Διαβάστε πώς να το κάνετε εδώ ",
"actions": {
"toggleTheme": "Αλλαγή φωτεινού / σκοτεινού θέματος",
"focusSearchBar": "Εστίαση στο πλαίσιο αναζήτησης",
diff --git a/public/locales/el/modules/dns-hole-summary.json b/public/locales/el/modules/dns-hole-summary.json
index 101b1138195..199c15fa495 100644
--- a/public/locales/el/modules/dns-hole-summary.json
+++ b/public/locales/el/modules/dns-hole-summary.json
@@ -21,8 +21,8 @@
"metrics": {
"domainsOnAdlist": "Domains σε λίστες διαφημίσεων",
"queriesToday": "Σημερινά queries",
- "queriesBlockedTodayPercentage": "",
- "queriesBlockedToday": ""
+ "queriesBlockedTodayPercentage": "Σημερινοί αποκλεισμοί",
+ "queriesBlockedToday": "Σημερινοί αποκλεισμοί"
}
}
}
diff --git a/public/locales/el/modules/notebook.json b/public/locales/el/modules/notebook.json
index 242341a423c..549cdbd3ea6 100644
--- a/public/locales/el/modules/notebook.json
+++ b/public/locales/el/modules/notebook.json
@@ -8,7 +8,7 @@
"label": "Εμφάνιση γραμμής εργαλείων για να σας βοηθήσει να γράψετε σημάνσεις"
},
"allowReadOnlyCheck": {
- "label": ""
+ "label": "Να επιτρέπεται η επιλογή σε λειτουργία μόνο ανάγνωσης"
},
"content": {
"label": "Το περιεχόμενο του σημειωματάριου"
@@ -17,43 +17,43 @@
},
"card": {
"controls": {
- "bold": "",
- "italic": "",
- "strikethrough": "",
- "underline": "",
- "colorText": "",
- "colorHighlight": "",
- "code": "",
- "clear": "",
- "heading": "",
- "align": "",
- "blockquote": "",
- "horizontalLine": "",
- "bulletList": "",
- "orderedList": "",
- "checkList": "",
- "increaseIndent": "",
- "decreaseIndent": "",
- "link": "",
- "unlink": "",
- "image": "",
- "addTable": "",
- "deleteTable": "",
- "colorCell": "",
- "mergeCell": "",
- "addColumnLeft": "",
- "addColumnRight": "",
- "deleteColumn": "",
- "addRowTop": "",
- "addRowBelow": "",
- "deleteRow": ""
+ "bold": "Έντονη γραφή",
+ "italic": "Πλάγια γραφή",
+ "strikethrough": "Διαγραμμισμένο Κείμενο",
+ "underline": "Υπογραμμισμένο Κείμενο",
+ "colorText": "Έγχρωμο κείμενο",
+ "colorHighlight": "Έγχρωμο κείμενο επισήμανσης",
+ "code": "Κωδικός",
+ "clear": "Εκκαθάριση μορφοποίησης",
+ "heading": "Επικεφαλίδα {{level}}",
+ "align": "Στοίχιση κειμένου: {{position}}",
+ "blockquote": "Μπλοκ κειμένου παράθεσης",
+ "horizontalLine": "Οριζόντια γραμμή",
+ "bulletList": "Λίστα με κουκκίδες",
+ "orderedList": "Ταξινομημένη λίστα",
+ "checkList": "Λίστα ελέγχου",
+ "increaseIndent": "Αύξηση εσοχής",
+ "decreaseIndent": "Μείωση εσοχής",
+ "link": "Σύνδεσμος",
+ "unlink": "Αφαίρεση συνδέσμου",
+ "image": "Ενσωμάτωση εικόνας",
+ "addTable": "Προσθήκη πίνακα",
+ "deleteTable": "Διαγραφή πίνακα",
+ "colorCell": "Χρώμα κελιού",
+ "mergeCell": "Εναλλαγή συγχώνευσης κελιού",
+ "addColumnLeft": "Προσθήκη στήλης πριν",
+ "addColumnRight": "Προσθήκη στήλης μετά",
+ "deleteColumn": "Διαγραφή στήλης",
+ "addRowTop": "Προσθήκη γραμμής πριν",
+ "addRowBelow": "Προσθήκη γραμμής μετά",
+ "deleteRow": "Διαγραφή γραμμής"
},
"modals": {
- "clearColor": "",
- "source": "",
- "widthPlaceholder": "",
- "columns": "",
- "rows": ""
+ "clearColor": "Καθαρισμός χρώματος",
+ "source": "Πηγή",
+ "widthPlaceholder": "Τιμή σε % ή εικονοστοιχεία",
+ "columns": "Στήλες",
+ "rows": "Γραμμές"
}
}
}
\ No newline at end of file
diff --git a/public/locales/el/modules/torrents-status.json b/public/locales/el/modules/torrents-status.json
index 35e850f6385..f3828f9b1b9 100644
--- a/public/locales/el/modules/torrents-status.json
+++ b/public/locales/el/modules/torrents-status.json
@@ -11,10 +11,10 @@
"label": "Εμφάνιση ολοκληρωμένων torrents"
},
"displayActiveTorrents": {
- "label": ""
+ "label": "Εμφάνιση ενεργών torrents"
},
"speedLimitOfActiveTorrents": {
- "label": ""
+ "label": "Ταχύτητα μεταφόρτωσης για να θεωρηθεί ένα torrent ενεργό (kB/s)"
},
"displayStaleTorrents": {
"label": "Εμφάνιση stale torrents"
@@ -27,8 +27,8 @@
"description": "Όταν είναι επιλεγμένο το 'is whitelist', τότε θα συμπεριφερθεί σαν επιτρεπόμενη λίστα. Εάν δεν είναι επιλεγμένο, τότε είναι αποκλεισμένη λίστα. Εάν είναι άδειο δε θα κάνει τίποτα"
},
"displayRatioWithFilter": {
- "label": "",
- "info": ""
+ "label": "Εμφάνιση φιλτραρισμένης αναλογίας λίστας torrents",
+ "info": "Εάν απενεργοποιηθεί, θα εμφανιστεί μόνο η συνολική αναλογία. Η συνολική αναλογία θα εξακολουθεί να χρησιμοποιεί τις ετικέτες αν έχει οριστεί"
}
}
},
@@ -36,8 +36,8 @@
"footer": {
"error": "Σφάλμα",
"lastUpdated": "Τελευταία ενημέρωση {{time}} πριν",
- "ratioGlobal": "",
- "ratioWithFilter": ""
+ "ratioGlobal": "Συνολική αναλογία",
+ "ratioWithFilter": "Αναλογία με φίλτρο"
},
"table": {
"header": {
diff --git a/public/locales/el/settings/customization/general.json b/public/locales/el/settings/customization/general.json
index 0856af5101a..0bbfc3be811 100644
--- a/public/locales/el/settings/customization/general.json
+++ b/public/locales/el/settings/customization/general.json
@@ -22,7 +22,7 @@
"description": "Διαμόρφωση του Homarr για χρήστες με αναπηρία και άτομα με ειδικές ανάγκες"
},
"access": {
- "name": "",
+ "name": "Πρόσβαση",
"description": "Ρυθμίστε ποιος έχει πρόσβαση στο ταμπλό σας"
}
}
diff --git a/public/locales/el/settings/customization/page-appearance.json b/public/locales/el/settings/customization/page-appearance.json
index 7be2dfb8fed..4f8e0ed7a85 100644
--- a/public/locales/el/settings/customization/page-appearance.json
+++ b/public/locales/el/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Φόντο"
},
+ "backgroundImageAttachment": {
+ "label": "Συνημμένη εικόνα φόντου",
+ "options": {
+ "fixed": "Σταθερό - Το φόντο παραμένει στην ίδια θέση (συνιστάται)",
+ "scroll": "Κύλιση - Κύλιση φόντου με το ποντίκι σας"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Μέγεθος εικόνας φόντου",
+ "options": {
+ "cover": "Κάλυψη - Κλιμακώνει την εικόνα όσο το δυνατόν μικρότερα για να καλύψει ολόκληρο το παράθυρο, περικόπτοντας τον υπερβολικό χώρο. (συνιστάται)",
+ "contain": "Περιέχει - Κλιμακώνει την εικόνα όσο το δυνατόν περισσότερο μέσα στο χώρο περιέλευσής της, χωρίς περικοπή ή τέντωμα της εικόνας."
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Συνημμένη εικόνα φόντου",
+ "options": {
+ "repeat": "Επανάληψη - Η εικόνα επαναλαμβάνεται όσο χρειάζεται για να καλύψει ολόκληρη την περιοχή ζωγραφικής της εικόνας φόντου.",
+ "no-repeat": "Χωρίς επανάληψη - Η εικόνα δεν επαναλαμβάνεται και δεν μπορεί να γεμίσει ολόκληρο το χώρο (συνιστάται)",
+ "repeat-x": "Επανάληψη X - Ίδιο με το 'Επανάληψη' αλλά μόνο στον οριζόντιο άξονα.",
+ "repeat-y": "Επανάληψη Y - Ίδιο με το 'Επανάληψη' αλλά μόνο στον κατακόρυφο άξονα."
+ }
+ },
"customCSS": {
"label": "Προσαρμοσμένη CSS",
"description": "Περαιτέρω, προσαρμόστε τον πίνακα ελέγχου σας χρησιμοποιώντας CSS, συνιστάται μόνο για έμπειρους χρήστες",
"placeholder": "Το προσαρμοσμένο CSS θα εφαρμοστεί τελευταίο",
"applying": "Εφαρμογή CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/el/tools/docker.json b/public/locales/el/tools/docker.json
index 7df956ae92e..3a28ee8f053 100644
--- a/public/locales/el/tools/docker.json
+++ b/public/locales/el/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Η Homarr εγκατάσταση σας δεν έχει το Docker εγκατεστημένο ή απέτυχε να ανακτήσει τα containers. Ελέγξτε την τεκμηρίωση για το πώς να ρυθμίσετε την ενσωμάτωση."
+ "text": "Η Homarr εγκατάσταση σας δεν έχει το Docker εγκατεστημένο ή απέτυχε να ανακτήσει containers. Ελέγξτε την τεκμηρίωση για το πώς να ρυθμίσετε την ενσωμάτωση."
}
},
"modals": {
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 31f4af7b109..18cc8e65060 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -44,12 +44,14 @@
},
"seeMore": "See more...",
"position": {
- "left": "Left",
- "center": "Center",
- "right": "Right"
+ "left": "Left",
+ "center": "Center",
+ "right": "Right"
},
"attributes": {
"width": "Width",
"height": "Height"
- }
+ },
+ "public": "Public",
+ "restricted": "Restricted"
}
\ No newline at end of file
diff --git a/public/locales/en/settings/customization/page-appearance.json b/public/locales/en/settings/customization/page-appearance.json
index 36d24c33ce9..9e2afedb99e 100644
--- a/public/locales/en/settings/customization/page-appearance.json
+++ b/public/locales/en/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Background"
},
+ "backgroundImageAttachment": {
+ "label": "Background image attachment",
+ "options": {
+ "fixed": "Fixed - Background stays in the same position (recommended)",
+ "scroll": "Scroll - Background scrolls with your mouse"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Background image size",
+ "options": {
+ "cover": "Cover - Scales the image as small as possible to cover the entire window by cropping excessive space. (recommended)",
+ "contain": "Contain - Scales the image as large as possible within its container without cropping or stretching the image."
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Background image attachment",
+ "options": {
+ "repeat": "Repeat - The image is repeated as much as needed to cover the whole background image painting area.",
+ "no-repeat": "No repeat - The image is not repeated and may not fill the entire space (recommended)",
+ "repeat-x": "Repeat X - Same as 'Repeat' but only on horizontal axis.",
+ "repeat-y": "Repeat Y - Same as 'Repeat' but only on vertical axis."
+ }
+ },
"customCSS": {
"label": "Custom CSS",
"description": "Further, customize your dashboard using CSS, only recommended for experienced users",
"placeholder": "Custom CSS will be applied last",
"applying": "Applying CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/en/tools/docker.json b/public/locales/en/tools/docker.json
index 95c67f0d831..c9ea3b63509 100644
--- a/public/locales/en/tools/docker.json
+++ b/public/locales/en/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Your Homarr instance does not have Docker configured or it has falied to fetch containers. Please check the documentation on how to set up the integration."
+ "text": "Your Homarr instance does not have Docker configured or it has failed to fetch containers. Please check the documentation on how to set up the integration."
}
},
"modals": {
diff --git a/public/locales/es/layout/header.json b/public/locales/es/layout/header.json
index 5b5d2daba9b..6cd12acd026 100644
--- a/public/locales/es/layout/header.json
+++ b/public/locales/es/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Esta es una característica experimental de Homarr. Por favor, reporta cualquier problema en GitHub o Discord ."
- },
"search": {
"label": "Buscar",
"engines": {
diff --git a/public/locales/es/layout/modals/about.json b/public/locales/es/layout/modals/about.json
index b74557ce9ce..b9e4085099a 100644
--- a/public/locales/es/layout/modals/about.json
+++ b/public/locales/es/layout/modals/about.json
@@ -7,7 +7,7 @@
"keybinds": "Combinaciones de teclas",
"translators": "Traductores ({{count}})",
"translatorsDescription": "Gracias a estas personas, ¡Homarr está disponible en {{languages}} idiomas! ¿Quieres ayudar a traducir Homarr en tu idioma? Lee cómo hacerlo aquí .",
- "contributors": "Contribuidores ({{count}})",
+ "contributors": "Colaboradores ({{count}})",
"contributorsDescription": "¡Estas personas han creado el código que hace que Homarr funcione! ¿Quieres ayudar a construir Homarr? Lee cómo hacerlo aquí ",
"actions": {
"toggleTheme": "Alternar modo claro/oscuro",
diff --git a/public/locales/es/modules/notebook.json b/public/locales/es/modules/notebook.json
index 4bf4cbf3510..b9cf184dd64 100644
--- a/public/locales/es/modules/notebook.json
+++ b/public/locales/es/modules/notebook.json
@@ -20,7 +20,7 @@
"bold": "Negrita",
"italic": "Cursiva",
"strikethrough": "Tachado",
- "underline": "Subrayar",
+ "underline": "Subrayado",
"colorText": "Color de texto",
"colorHighlight": "Texto resaltado en color",
"code": "Código",
@@ -29,23 +29,23 @@
"align": "Alinear texto: {{position}}",
"blockquote": "Cita",
"horizontalLine": "Línea horizontal",
- "bulletList": "Lista de viñetas",
+ "bulletList": "Lista sin ordenar",
"orderedList": "Lista ordenada",
- "checkList": "",
- "increaseIndent": "Aumentar Sangría",
- "decreaseIndent": "Disminuir Sangría",
+ "checkList": "Lista de control",
+ "increaseIndent": "Aumentar sangría",
+ "decreaseIndent": "Disminuir sangría",
"link": "Enlace",
"unlink": "Eliminar enlace",
- "image": "Adjuntar Imagen",
+ "image": "Insertar imagen",
"addTable": "Añadir tabla",
- "deleteTable": "Eliminar Tabla",
+ "deleteTable": "Eliminar tabla",
"colorCell": "Color de celda",
"mergeCell": "Alternar combinación de celdas",
- "addColumnLeft": "Añadir columna antes de",
- "addColumnRight": "Añadir columna después de",
+ "addColumnLeft": "Añadir columna a la izquierda",
+ "addColumnRight": "Añadir columna a la derecha",
"deleteColumn": "Eliminar columna",
- "addRowTop": "Añadir fila antes de",
- "addRowBelow": "Añador fila después de",
+ "addRowTop": "Añadir fila encima",
+ "addRowBelow": "Añadir fila debajo",
"deleteRow": "Eliminar fila"
},
"modals": {
diff --git a/public/locales/es/modules/torrents-status.json b/public/locales/es/modules/torrents-status.json
index 0518b784421..493c911534c 100644
--- a/public/locales/es/modules/torrents-status.json
+++ b/public/locales/es/modules/torrents-status.json
@@ -27,8 +27,8 @@
"description": "Cuando se marca 'está en la lista blanca', actuará como una lista blanca. Si no se marca, esta es una lista negra. No hará nada cuando esté vacío"
},
"displayRatioWithFilter": {
- "label": "",
- "info": ""
+ "label": "Mostrar la relación de la lista de torrents filtrados",
+ "info": "Si está deshabilitado, solo se mostrará la relación global. La relación global seguirá usando las etiquetas si están configuradas"
}
}
},
@@ -36,8 +36,8 @@
"footer": {
"error": "Error",
"lastUpdated": "Última actualización hace {{time}}",
- "ratioGlobal": "",
- "ratioWithFilter": ""
+ "ratioGlobal": "Relación global",
+ "ratioWithFilter": "Relación con filtro"
},
"table": {
"header": {
diff --git a/public/locales/es/settings/customization/page-appearance.json b/public/locales/es/settings/customization/page-appearance.json
index b20a02e232d..9035148aff4 100644
--- a/public/locales/es/settings/customization/page-appearance.json
+++ b/public/locales/es/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Fondo"
},
+ "backgroundImageAttachment": {
+ "label": "Adjuntar imagen de fondo",
+ "options": {
+ "fixed": "Fijo - El fondo permanece en la misma posición (recomendado)",
+ "scroll": "Desplazar - El fondo se desplaza con el ratón"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Tamaño de la imagen de fondo",
+ "options": {
+ "cover": "Cubrir - Escala la imagen lo mínimo posible para cubrir toda la ventana recortando el espacio excesivo (recomendado)",
+ "contain": "Contener - Escala la imagen lo más grande posible dentro de su contenedor sin recortarla ni estirarla"
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Adjuntar imagen de fondo",
+ "options": {
+ "repeat": "Repetir - La imagen se repite tanto como sea necesario para cubrir toda el área de pintura de la imagen de fondo",
+ "no-repeat": "Sin repetir - La imagen no se repite y puede no ocupar todo el espacio (recomendado)",
+ "repeat-x": "Repetir X - Igual que 'Repetir' pero sólo en el eje horizontal",
+ "repeat-y": "Repetir Y: igual que 'Repetir' pero solo en el eje vertical"
+ }
+ },
"customCSS": {
"label": "CSS Personalizado",
"description": "Además, personaliza tu panel usando CSS, solo recomendado para usuarios avanzados",
"placeholder": "El CSS personalizado se aplicará en último lugar",
"applying": "Aplicando CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/es/tools/docker.json b/public/locales/es/tools/docker.json
index 0f89db477d6..18db9e146e9 100644
--- a/public/locales/es/tools/docker.json
+++ b/public/locales/es/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Tu instancia de Homarr no tiene Docker configurado o no pudo recuperar contenedores. Por favor, consulta la documentación sobre cómo configurar la integración."
+ "text": "Tu instancia de Homarr no tiene Docker configurado o ha fallado al obtener los contenedores. Consulta la documentación sobre cómo configurar la integración."
}
},
"modals": {
diff --git a/public/locales/fr/layout/header.json b/public/locales/fr/layout/header.json
index d5cfe667d4c..ebe522a12ed 100644
--- a/public/locales/fr/layout/header.json
+++ b/public/locales/fr/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Ceci est une fonctionnalité expérimentale de Homarr. Veuilez signaler tout problème sur GitHub ou sur Discord ."
- },
"search": {
"label": "Rechercher",
"engines": {
diff --git a/public/locales/fr/layout/modals/about.json b/public/locales/fr/layout/modals/about.json
index 973583e3a2e..5f8506523cd 100644
--- a/public/locales/fr/layout/modals/about.json
+++ b/public/locales/fr/layout/modals/about.json
@@ -5,10 +5,10 @@
"key": "Raccourci clavier",
"action": "Action",
"keybinds": "Affectation des touches",
- "translators": "",
- "translatorsDescription": "",
- "contributors": "",
- "contributorsDescription": "",
+ "translators": "Traducteurs ({{count}})",
+ "translatorsDescription": "Grâce à ces personnes, Homarr est disponible dans {{languages}} langues ! Vous voulez aider à traduire Homarr dans votre langue ? Lisez comment le faire ici .",
+ "contributors": "Contributeurs ({{count}})",
+ "contributorsDescription": "Ces personnes ont développé le code qui fait fonctionner homarr ! Vous voulez aider à développer Homarr ? Lisez comment procéder ici ",
"actions": {
"toggleTheme": "Basculer entre mode clair/sombre",
"focusSearchBar": "Focus sur la barre de recherche",
diff --git a/public/locales/fr/modules/torrents-status.json b/public/locales/fr/modules/torrents-status.json
index adea26bb886..7ef7a58b641 100644
--- a/public/locales/fr/modules/torrents-status.json
+++ b/public/locales/fr/modules/torrents-status.json
@@ -27,8 +27,8 @@
"description": "Si la case \"La liste des libellés est une liste blanche\" est cochée, elle sera appliquée comme une liste blanche. Si la case n'est pas cochée, elle s'appliquera comme une liste noire. Rien ne se passera si elle est vide"
},
"displayRatioWithFilter": {
- "label": "",
- "info": ""
+ "label": "Afficher le ratio de la liste des torrents filtrés",
+ "info": "Si désactivé, seul le ratio global sera affiché. Le ratio global utilisera toujours les labels si définis"
}
}
},
@@ -36,8 +36,8 @@
"footer": {
"error": "Erreur",
"lastUpdated": "Dernière mise à jour : {{time}}",
- "ratioGlobal": "",
- "ratioWithFilter": ""
+ "ratioGlobal": "Ratio global",
+ "ratioWithFilter": "Ratio avec filtre"
},
"table": {
"header": {
diff --git a/public/locales/fr/settings/customization/page-appearance.json b/public/locales/fr/settings/customization/page-appearance.json
index f7ac74c4c66..dd0df8fc217 100644
--- a/public/locales/fr/settings/customization/page-appearance.json
+++ b/public/locales/fr/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Fond"
},
+ "backgroundImageAttachment": {
+ "label": "Pièce jointe de l'image d'arrière-plan",
+ "options": {
+ "fixed": "Fixe - L'arrière-plan reste dans la même position (recommandé)",
+ "scroll": "Défilement - L'arrière-plan défile avec la souris"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Taille de l'image d'arrière-plan",
+ "options": {
+ "cover": "Couverture - Mise à l'échelle de l'image aussi petite que possible pour couvrir la fenêtre entière en recadrant l'espace excessif. (recommandé)",
+ "contain": "Contient - Mise à l'échelle de l'image aussi grande que possible dans son conteneur sans recadrer ou étirer l'image."
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Pièce jointe de l'image d'arrière-plan",
+ "options": {
+ "repeat": "Répéter - L'image est répétée autant que nécessaire pour couvrir toute la surface d'arrière-plan.",
+ "no-repeat": "Pas de répétition - L'image n'est pas répétée et peut ne pas remplir tout l'espace (recommandé)",
+ "repeat-x": "Répéter X - Identique à 'Répéter' mais uniquement sur l'axe horizontal.",
+ "repeat-y": "Répéter Y - Identique à 'Répéter' mais uniquement sur l'axe vertical."
+ }
+ },
"customCSS": {
"label": "CSS personnalisé",
"description": "En outre, vous pouvez personnaliser votre tableau de bord à l'aide de CSS. Réservé aux utilisateurs expérimentés.",
"placeholder": "Le CSS personnalisé sera appliqué en dernier",
"applying": "Application du code CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/fr/tools/docker.json b/public/locales/fr/tools/docker.json
index 0ffe2a29ab7..586fe02aadb 100644
--- a/public/locales/fr/tools/docker.json
+++ b/public/locales/fr/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Docker n'est pas configuré sur votre instance Homarr ou a échoué à trouver les conteneurs. Veuillez vérifier la documentation pour savoir comment configurer cette intégration."
+ "text": "Votre instance Homarr n'a pas configuré Docker ou n'a pas réussi à récupérer les conteneurs. Veuillez consulter la documentation pour savoir comment configurer l'intégration."
}
},
"modals": {
diff --git a/public/locales/he/layout/header.json b/public/locales/he/layout/header.json
index e653b0b8e74..d4abe6db023 100644
--- a/public/locales/he/layout/header.json
+++ b/public/locales/he/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "זוהי תכונה ניסיונית של Homarr. אנא דווח על בעיות ב-GitHub או Discord ."
- },
"search": {
"label": "חיפוש",
"engines": {
diff --git a/public/locales/he/settings/customization/page-appearance.json b/public/locales/he/settings/customization/page-appearance.json
index 9645a135633..70d34cfad15 100644
--- a/public/locales/he/settings/customization/page-appearance.json
+++ b/public/locales/he/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "רקע"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "CSS מותאם אישית",
"description": "יתר על כן, התאם את לוח המחוונים שלך באמצעות CSS, מומלץ רק למשתמשים מנוסים",
"placeholder": "CSS מותאם אישית יוחל אחרון",
"applying": "מחיל CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/he/tools/docker.json b/public/locales/he/tools/docker.json
index c2ef87e55fd..3affb1371bf 100644
--- a/public/locales/he/tools/docker.json
+++ b/public/locales/he/tools/docker.json
@@ -2,7 +2,7 @@
"title": "דוקר",
"alerts": {
"notConfigured": {
- "text": "למופע ה-Homarr שלך לא הוגדר Docker או שהוא נכשל באחזור קונטיינרים. אנא עיין בתיעוד כיצד להגדיר את האינטגרציה."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/hr/layout/header.json b/public/locales/hr/layout/header.json
index 3ff54b12ee9..771849ccb8c 100644
--- a/public/locales/hr/layout/header.json
+++ b/public/locales/hr/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Ovo je eksperimentalna značajka Homarra. Prijavite sve probleme na GitHub ili Discord ."
- },
"search": {
"label": "traži",
"engines": {
diff --git a/public/locales/hr/settings/customization/page-appearance.json b/public/locales/hr/settings/customization/page-appearance.json
index 3163b9698f8..0e04c9cd1fe 100644
--- a/public/locales/hr/settings/customization/page-appearance.json
+++ b/public/locales/hr/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Pozadina"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Prilagođeni CSS",
"description": "Dodatno, prilagodite svoju nadzornu ploču koristeći CSS, što se preporučuje samo iskusnim korisnicima",
"placeholder": "Prilagođeni CSS će se primijeniti posljednji",
"applying": "Primjena CSS-a..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/hr/tools/docker.json b/public/locales/hr/tools/docker.json
index b642a53bdb0..592a7142080 100644
--- a/public/locales/hr/tools/docker.json
+++ b/public/locales/hr/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Vaša Homarr instanca nema konfiguriran Docker ili nije uspjela dohvatiti spremnike. Provjerite dokumentaciju o tome kako postaviti integraciju."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/hu/layout/header.json b/public/locales/hu/layout/header.json
index 5a2a81efeee..b638a46f1dd 100644
--- a/public/locales/hu/layout/header.json
+++ b/public/locales/hu/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Ez a Homarr kísérleti funkciója. Kérjük, jelezz bármilyen problémát a GitHubon vagy a Discordon ."
- },
"search": {
"label": "Keresés",
"engines": {
diff --git a/public/locales/hu/settings/customization/page-appearance.json b/public/locales/hu/settings/customization/page-appearance.json
index 50bb74371e0..258a0405399 100644
--- a/public/locales/hu/settings/customization/page-appearance.json
+++ b/public/locales/hu/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Háttér"
},
+ "backgroundImageAttachment": {
+ "label": "Háttérkép csatolása",
+ "options": {
+ "fixed": "Rögzített – a háttér ugyanabban a helyzetben marad (ajánlott)",
+ "scroll": "Görgetés - A háttér gördül az egérrel"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Háttér kép mérete",
+ "options": {
+ "cover": "Cover - A képet a lehető legkisebbre méretezi, hogy a felesleges terület levágásával a teljes ablakot lefedje. (ajánlott)",
+ "contain": "Tartalom - A képet a lehető legnagyobb méretre méretezi a tárolón belül anélkül, hogy a képet levágná vagy megnyújtaná."
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Háttérkép csatolása",
+ "options": {
+ "repeat": "Ismétlés – A kép annyiszor ismétlődik, amennyire szükséges, hogy a teljes háttérkép festési területet lefedje.",
+ "no-repeat": "Nincs ismétlés - A kép nem ismétlődik, és nem tölti ki a teljes helyet (ajánlott)",
+ "repeat-x": "Ismétlés X - Ugyanaz, mint az 'Ismétlés', de csak a vízszintes tengelyen.",
+ "repeat-y": "Ismétlés Y - Ugyanaz, mint az 'Ismétlés', de csak a függőleges tengelyen."
+ }
+ },
"customCSS": {
"label": "Egyéni CSS",
"description": "Továbbá, testreszabhatja műszerfalát CSS segítségével, csak tapasztalt felhasználóknak ajánlott",
"placeholder": "Az egyéni CSS utoljára kerül alkalmazásra",
"applying": "CSS alkalmazása..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/hu/tools/docker.json b/public/locales/hu/tools/docker.json
index f2406909f9e..8111cde62c0 100644
--- a/public/locales/hu/tools/docker.json
+++ b/public/locales/hu/tools/docker.json
@@ -7,7 +7,7 @@
},
"modals": {
"selectBoard": {
- "title": "Válasszon egy táblát",
+ "title": "Válasszon vezérlőt",
"text": "Válassza ki azt a táblát, ahová a kiválasztott Docker-konténerekhez tartozó alkalmazásokat szeretné hozzáadni.",
"form": {
"board": {
diff --git a/public/locales/it/layout/header.json b/public/locales/it/layout/header.json
index 315f990e74a..a1f2a9222e8 100644
--- a/public/locales/it/layout/header.json
+++ b/public/locales/it/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Questa è una caratteristica sperimentale di Homarr. Si prega di segnalare qualsiasi problema su GitHub o Discord ."
- },
"search": {
"label": "Cerca",
"engines": {
diff --git a/public/locales/it/modules/torrents-status.json b/public/locales/it/modules/torrents-status.json
index 40f924aa93d..86b78fe33ed 100644
--- a/public/locales/it/modules/torrents-status.json
+++ b/public/locales/it/modules/torrents-status.json
@@ -27,8 +27,8 @@
"description": "Quando 'è whitelist' è selezionato, agirà come una whitelist. Se non selezionato, è una blacklist. Non farà nulla quando vuoto"
},
"displayRatioWithFilter": {
- "label": "",
- "info": ""
+ "label": "Visualizza il ratio dell'elenco dei torrent filtrati",
+ "info": "Se disabilitato, verrà visualizzato solo il ratio globale. Il ratio globale utilizzerà comunque i label, se impostati"
}
}
},
@@ -36,8 +36,8 @@
"footer": {
"error": "Errore",
"lastUpdated": "Ultimo aggiornamento {{time}} fa",
- "ratioGlobal": "",
- "ratioWithFilter": ""
+ "ratioGlobal": "Ratio globale",
+ "ratioWithFilter": "Ratio con filtro"
},
"table": {
"header": {
diff --git a/public/locales/it/settings/customization/page-appearance.json b/public/locales/it/settings/customization/page-appearance.json
index 47ff7bc3e14..941a814c259 100644
--- a/public/locales/it/settings/customization/page-appearance.json
+++ b/public/locales/it/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Sfondo"
},
+ "backgroundImageAttachment": {
+ "label": "Allegato immagine di sfondo",
+ "options": {
+ "fixed": "Fisso - Lo sfondo rimane nella stessa posizione (consigliato)",
+ "scroll": "Scorrimento - Lo sfondo scorre con il mouse"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Dimensioni dell'immagine di sfondo",
+ "options": {
+ "cover": "Copertura - Ridimensiona l'immagine il più possibile per coprire l'intera finestra ritagliando lo spazio eccessivo. (consigliato)",
+ "contain": "Contieni - ridimensiona l'immagine il più grande possibile all'interno del suo container senza ritagliare o allungare l'immagine."
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Allegato immagine di sfondo",
+ "options": {
+ "repeat": "Ripeti - l'immagine viene ripetuta quanto necessario per coprire l'intera area di disegno dell'immagine di sfondo.",
+ "no-repeat": "Nessuna ripetizione - l'immagine non viene ripetuta e potrebbe non riempire l'intero spazio (consigliato)",
+ "repeat-x": "Ripeti X - Come 'Ripeti' ma solo sull'asse orizzontale.",
+ "repeat-y": "Ripeti Y - Come 'Ripeti' ma solo sull'asse verticale."
+ }
+ },
"customCSS": {
"label": "CSS personalizzato",
"description": "Inoltre, personalizza la dashboard utilizzando i CSS, consigliato solo agli utenti esperti",
"placeholder": "I CSS personalizzati saranno applicati per ultimi",
"applying": "Applicazione CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/ja/layout/header.json b/public/locales/ja/layout/header.json
index 01224f634c1..2c94f2cc8ba 100644
--- a/public/locales/ja/layout/header.json
+++ b/public/locales/ja/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "これはHomarrの実験的な機能です。問題があれば GitHub または Discord に報告してください。"
- },
"search": {
"label": "検索",
"engines": {
diff --git a/public/locales/ja/settings/customization/page-appearance.json b/public/locales/ja/settings/customization/page-appearance.json
index c616930674d..3c7f56f6107 100644
--- a/public/locales/ja/settings/customization/page-appearance.json
+++ b/public/locales/ja/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "背景"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "カスタムCSS",
"description": "さらに、CSS を使用してダッシュボードをカスタマイズします。経験豊富なユーザーにのみお勧めします。",
"placeholder": "カスタムCSSは最後に適用されます",
"applying": "CSSを適用中..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/ja/tools/docker.json b/public/locales/ja/tools/docker.json
index 2aa379d7165..21b96a1cade 100644
--- a/public/locales/ja/tools/docker.json
+++ b/public/locales/ja/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "HomarrインスタンスにDockerが設定されていないか、コンテナの取得に失敗しています。統合の設定方法についてはドキュメントを確認してください。"
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/ko/layout/header.json b/public/locales/ko/layout/header.json
index 5eccda41885..333309a779c 100644
--- a/public/locales/ko/layout/header.json
+++ b/public/locales/ko/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "이 기능은 Homarr의 실험적인 기능입니다. 문제가 있으면 GitHub 또는 Discord 으로 신고해 주세요."
- },
"search": {
"label": "검색",
"engines": {
diff --git a/public/locales/ko/settings/customization/page-appearance.json b/public/locales/ko/settings/customization/page-appearance.json
index 8ab9a02eadb..c98bccd4b39 100644
--- a/public/locales/ko/settings/customization/page-appearance.json
+++ b/public/locales/ko/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "배경"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "커스텀 CSS",
"description": "또한 숙련된 사용자에게만 권장되는 CSS를 사용하여 대시보드를 사용자 지정할 수 있습니다.",
"placeholder": "사용자 정의 CSS는 마지막에 적용됩니다.",
"applying": "CSS 적용하기..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/ko/tools/docker.json b/public/locales/ko/tools/docker.json
index f063f840be1..379e81c1cf5 100644
--- a/public/locales/ko/tools/docker.json
+++ b/public/locales/ko/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Homarr 인스턴스에 Docker가 구성되어 있지 않거나 컨테이너 가져오기에 실패했습니다. 연동 설정 방법에 대한 설명서를 확인하세요."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/lv/layout/header.json b/public/locales/lv/layout/header.json
index eb8a67519a9..7505af39674 100644
--- a/public/locales/lv/layout/header.json
+++ b/public/locales/lv/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Šī ir eksperimentāla Homarr funkcija. Lūdzu, ziņojiet par jebkādām problēmām GitHub vai Discord ."
- },
"search": {
"label": "Meklēt",
"engines": {
diff --git a/public/locales/lv/settings/customization/page-appearance.json b/public/locales/lv/settings/customization/page-appearance.json
index 733c577ab9d..cfbb998c90e 100644
--- a/public/locales/lv/settings/customization/page-appearance.json
+++ b/public/locales/lv/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Fons"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Pielāgotais CSS",
"description": "Turklāt pielāgojiet paneli, izmantojot CSS, ieteicams tikai pieredzējušiem lietotājiem",
"placeholder": "Pielāgotais CSS tiks piemērots pēdējais",
"applying": "CSS piemērošana..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/lv/tools/docker.json b/public/locales/lv/tools/docker.json
index 8d85a5b11ba..453131d1e64 100644
--- a/public/locales/lv/tools/docker.json
+++ b/public/locales/lv/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Jūsu Homarr instancē nav konfigurēts Docker vai arī tai nav izdevies iegūtu konteinerus. Lūdzu, pārbaudiet dokumentāciju par to, kā iestatīt integrāciju."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/nl/layout/header.json b/public/locales/nl/layout/header.json
index d36e46b2d9d..26a2fbcc95a 100644
--- a/public/locales/nl/layout/header.json
+++ b/public/locales/nl/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Dit is een experimentele functie van Homarr. Meld problemen alsjeblieft op GitHub of Discord ."
- },
"search": {
"label": "Zoek op",
"engines": {
diff --git a/public/locales/nl/settings/customization/page-appearance.json b/public/locales/nl/settings/customization/page-appearance.json
index 2cb43086715..fd600c6774a 100644
--- a/public/locales/nl/settings/customization/page-appearance.json
+++ b/public/locales/nl/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Achtergrond"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Eigen CSS",
"description": "Pas uw dashboard verder aan met behulp van CSS, alleen aanbevolen voor ervaren gebruikers",
"placeholder": "Eigen CSS wordt als laatste toegepast",
"applying": "CSS toepassen..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/nl/tools/docker.json b/public/locales/nl/tools/docker.json
index edb19541383..a85983df609 100644
--- a/public/locales/nl/tools/docker.json
+++ b/public/locales/nl/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Docker is niet geconfigureerd in je Homarr instance of het is mislukt om containers op te halen. Raadpleeg de documentatie over het opzetten van de integratie."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/no/layout/header.json b/public/locales/no/layout/header.json
index db5cc4b8761..2c6643ee6a7 100644
--- a/public/locales/no/layout/header.json
+++ b/public/locales/no/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Dette er et eksperimentelt funksjon i Homarr. Vennligst rapporter eventuelle problemer på GitHub eller Discord ."
- },
"search": {
"label": "Søk",
"engines": {
diff --git a/public/locales/no/settings/customization/page-appearance.json b/public/locales/no/settings/customization/page-appearance.json
index 480a2407445..ab5c95018dc 100644
--- a/public/locales/no/settings/customization/page-appearance.json
+++ b/public/locales/no/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Bakgrunn"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Egendefinert CSS",
"description": "Videre kan du tilpasse dashbordet ved hjelp av CSS, dette er bare anbefalt for erfarne brukere",
"placeholder": "Egendefinert CSS vil bli brukt sist",
"applying": "Tar i bruk CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/no/tools/docker.json b/public/locales/no/tools/docker.json
index 70f359ea124..d3895345b58 100644
--- a/public/locales/no/tools/docker.json
+++ b/public/locales/no/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Din Homarr-forekomst har ikke Docker konfigurert eller den har mislyktes i å hente containere. Vennligst sjekk dokumentasjonen for hvordan du setter opp integrasjonen."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/pl/layout/header.json b/public/locales/pl/layout/header.json
index 1a8ac94ca0c..7d97ce2201e 100644
--- a/public/locales/pl/layout/header.json
+++ b/public/locales/pl/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "To jest eksperymentalna funkcja Homarr. Zgłoś wszelkie problemy na GitHub lub Discord ."
- },
"search": {
"label": "Szukaj",
"engines": {
diff --git a/public/locales/pl/settings/customization/page-appearance.json b/public/locales/pl/settings/customization/page-appearance.json
index 38a94be1640..4cdb44fa86b 100644
--- a/public/locales/pl/settings/customization/page-appearance.json
+++ b/public/locales/pl/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Tło"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Niestandardowy CSS",
"description": "Jeszcze bardziej dostosuj swój pulpit za pomocą CSS, zalecane tylko dla doświadczonych użytkowników",
"placeholder": "Custom CSS zostanie zastosowany jako ostatni",
"applying": "Zastosowanie CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/pl/tools/docker.json b/public/locales/pl/tools/docker.json
index af1ad0e110f..5eccbe96adb 100644
--- a/public/locales/pl/tools/docker.json
+++ b/public/locales/pl/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Twoja instancja Homarr nie ma skonfigurowanego Dockera lub nie była w stanie pobrać listę kontenerów. Sprawdź dokumentację, aby dowiedzieć się, jak skonfigurować integrację."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/pt/layout/header.json b/public/locales/pt/layout/header.json
index 208e6443161..6cee768e8ee 100644
--- a/public/locales/pt/layout/header.json
+++ b/public/locales/pt/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Este é um recurso experimental do Homarr. Informe qualquer problema em GitHub ou Discord ."
- },
"search": {
"label": "Pesquisa",
"engines": {
diff --git a/public/locales/pt/settings/customization/page-appearance.json b/public/locales/pt/settings/customization/page-appearance.json
index 23432dd2f52..8f8a32ec957 100644
--- a/public/locales/pt/settings/customization/page-appearance.json
+++ b/public/locales/pt/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Antecedentes"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "CSS Personalizado",
"description": "Além disso, personalize seu painel usando CSS, recomendado apenas para usuários experientes",
"placeholder": "O CSS personalizado será aplicado por último",
"applying": "Aplicando CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/pt/tools/docker.json b/public/locales/pt/tools/docker.json
index cb36d10c54b..b81fe732ed0 100644
--- a/public/locales/pt/tools/docker.json
+++ b/public/locales/pt/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Sua instância Homarr não tem o Docker configurado ou falhou ao buscar contêineres. Consulte a documentação para saber como configurar a integração."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/ru/layout/header.json b/public/locales/ru/layout/header.json
index 228a558ea15..c87e17662d2 100644
--- a/public/locales/ru/layout/header.json
+++ b/public/locales/ru/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Это экспериментальная функция Homarr. Пожалуйста, сообщайте о любых проблемах на GitHub или Discord ."
- },
"search": {
"label": "Поиск",
"engines": {
diff --git a/public/locales/ru/settings/customization/page-appearance.json b/public/locales/ru/settings/customization/page-appearance.json
index 59b33ee801b..12a05f72c28 100644
--- a/public/locales/ru/settings/customization/page-appearance.json
+++ b/public/locales/ru/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Фон"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Пользовательский CSS",
"description": "Дополнительная настройка вашей панели с использованием CSS, рекомендуется только опытным пользователям",
"placeholder": "Пользовательский CSS будет применяться в последнюю очередь",
"applying": "Применение CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/ru/tools/docker.json b/public/locales/ru/tools/docker.json
index f39f5582c94..a2c8e69a0c8 100644
--- a/public/locales/ru/tools/docker.json
+++ b/public/locales/ru/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "В вашем экземпляре Homarr не настроен Docker или произошла ошибка при получении контейнеров. Пожалуйста, ознакомьтесь с документацией по настройке интеграции."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json
index f77d5f23d24..86fc75c7a49 100644
--- a/public/locales/sk/common.json
+++ b/public/locales/sk/common.json
@@ -1,7 +1,7 @@
{
"save": "Uložiť",
- "apply": "",
- "insert": "",
+ "apply": "Použiť",
+ "insert": "Vložiť",
"about": "O aplikácii",
"cancel": "Zrušiť",
"close": "Zavrieť",
@@ -45,7 +45,7 @@
"seeMore": "Viac informácií...",
"position": {
"left": "Vľavo",
- "center": "",
+ "center": "Na stred",
"right": "Vpravo"
},
"attributes": {
diff --git a/public/locales/sk/layout/header.json b/public/locales/sk/layout/header.json
index 4bbffdb64aa..b353fbc110d 100644
--- a/public/locales/sk/layout/header.json
+++ b/public/locales/sk/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Ide o experimentálnu funkciu systému Homarr. Akékoľvek problémy nahláste na GitHub alebo Discord ."
- },
"search": {
"label": "Hladať",
"engines": {
diff --git a/public/locales/sk/layout/modals/about.json b/public/locales/sk/layout/modals/about.json
index c3decebc7f0..cc4879bf99e 100644
--- a/public/locales/sk/layout/modals/about.json
+++ b/public/locales/sk/layout/modals/about.json
@@ -5,10 +5,10 @@
"key": "Klávesová skratka",
"action": "Akcia",
"keybinds": "Kľúčové väzby",
- "translators": "",
- "translatorsDescription": "",
- "contributors": "",
- "contributorsDescription": "",
+ "translators": "Prekladatelia ({{count}})",
+ "translatorsDescription": "Vďaka týmto ľuďom je Homarr dostupný v {{languages}} jazykoch! Chcete pomôcť preložiť Homarr do vášho jazyka? Prečítajte si ako na to tu .",
+ "contributors": "Prispievatelia ({{count}})",
+ "contributorsDescription": "Títo ľudia vytvorili kód, vďaka ktorému funguje homarr! Chcete pomôcť vybudovať Homarr? Prečítajte si, ako to urobiť tu ",
"actions": {
"toggleTheme": "Prepínanie režimu svetlo/tma",
"focusSearchBar": "Zameranie na vyhľadávací panel",
diff --git a/public/locales/sk/modules/dns-hole-summary.json b/public/locales/sk/modules/dns-hole-summary.json
index 02727a12f4a..2a88fe64efd 100644
--- a/public/locales/sk/modules/dns-hole-summary.json
+++ b/public/locales/sk/modules/dns-hole-summary.json
@@ -21,8 +21,8 @@
"metrics": {
"domainsOnAdlist": "Domény na adlistoch",
"queriesToday": "Poziadavky dnes",
- "queriesBlockedTodayPercentage": "",
- "queriesBlockedToday": ""
+ "queriesBlockedTodayPercentage": "Zablokované dnes",
+ "queriesBlockedToday": "Zablokované dnes"
}
}
}
diff --git a/public/locales/sk/modules/notebook.json b/public/locales/sk/modules/notebook.json
index 15f725a3465..332215067a5 100644
--- a/public/locales/sk/modules/notebook.json
+++ b/public/locales/sk/modules/notebook.json
@@ -8,7 +8,7 @@
"label": "Zobrazenie panela nástrojov na pomoc pri písaní poznámok"
},
"allowReadOnlyCheck": {
- "label": ""
+ "label": "Povolenie kontroly v režime len na čítanie"
},
"content": {
"label": "Obsah zápisníka"
@@ -17,43 +17,43 @@
},
"card": {
"controls": {
- "bold": "",
- "italic": "",
- "strikethrough": "",
- "underline": "",
- "colorText": "",
- "colorHighlight": "",
- "code": "",
- "clear": "",
- "heading": "",
- "align": "",
- "blockquote": "",
- "horizontalLine": "",
- "bulletList": "",
- "orderedList": "",
- "checkList": "",
- "increaseIndent": "",
- "decreaseIndent": "",
- "link": "",
- "unlink": "",
- "image": "",
- "addTable": "",
- "deleteTable": "",
- "colorCell": "",
- "mergeCell": "",
- "addColumnLeft": "",
- "addColumnRight": "",
- "deleteColumn": "",
- "addRowTop": "",
- "addRowBelow": "",
- "deleteRow": ""
+ "bold": "Tučné",
+ "italic": "Kurzíva",
+ "strikethrough": "Prečiarknuté",
+ "underline": "Podčiarknuté",
+ "colorText": "Farebný text",
+ "colorHighlight": "Farebné zvýraznenie textu",
+ "code": "Kód",
+ "clear": "Vyčistiť formátovanie",
+ "heading": "Nadpis {{level}}",
+ "align": "Zarovnanie textu: {{position}}",
+ "blockquote": "Citát",
+ "horizontalLine": "Horizontálna čiara",
+ "bulletList": "Zoznam odrážok",
+ "orderedList": "Objednaný zoznam",
+ "checkList": "Kontrolný zoznam",
+ "increaseIndent": "Zväčšenie odstupu",
+ "decreaseIndent": "Zníženie odstupu",
+ "link": "Odkaz",
+ "unlink": "Odstrániť odkaz",
+ "image": "Vložiť obrázok",
+ "addTable": "Pridať tabuľku",
+ "deleteTable": "Odstrániť tabuľku",
+ "colorCell": "Farebná bunka",
+ "mergeCell": "Prepnúť zlúčenie buniek",
+ "addColumnLeft": "Pridať stĺpec pred",
+ "addColumnRight": "Pridať stĺpec po",
+ "deleteColumn": "Vymazať stĺpec",
+ "addRowTop": "Pridať riadok pred",
+ "addRowBelow": "Pridať riadok po",
+ "deleteRow": "Vymazať riadok"
},
"modals": {
- "clearColor": "",
- "source": "",
- "widthPlaceholder": "",
- "columns": "",
- "rows": ""
+ "clearColor": "Vymazať farbu",
+ "source": "Zdroj",
+ "widthPlaceholder": "Hodnota v % alebo pixeloch",
+ "columns": "Stĺpce",
+ "rows": "Riadky"
}
}
}
\ No newline at end of file
diff --git a/public/locales/sk/modules/torrents-status.json b/public/locales/sk/modules/torrents-status.json
index 58247faa10f..9a67b43a813 100644
--- a/public/locales/sk/modules/torrents-status.json
+++ b/public/locales/sk/modules/torrents-status.json
@@ -11,10 +11,10 @@
"label": "Zobraz dokončené torrenty"
},
"displayActiveTorrents": {
- "label": ""
+ "label": "Zobraziť aktívne torrenty"
},
"speedLimitOfActiveTorrents": {
- "label": ""
+ "label": "Rýchlosť odosielania, aby sa torrent považoval za aktívny (kB/s)"
},
"displayStaleTorrents": {
"label": "Zobraz zastarané torrenty"
@@ -27,8 +27,8 @@
"description": "Ak je začiarknuté políčko 'is whitelist', bude sa toto políčko správať ako biela listina. Ak nie je začiarknuté, ide o čiernu listinu. Ak je prázdny, nerobí nič"
},
"displayRatioWithFilter": {
- "label": "",
- "info": ""
+ "label": "Zobraziť pomer zoznamu filtrovaných torrentov",
+ "info": "Ak je vypnutý, zobrazí sa iba globálny pomer. Globálny pomer bude stále používať štítky, ak je nastavený"
}
}
},
@@ -36,8 +36,8 @@
"footer": {
"error": "Chyba",
"lastUpdated": "Naposledy aktualizované pred {{time}}",
- "ratioGlobal": "",
- "ratioWithFilter": ""
+ "ratioGlobal": "Globálny pomer",
+ "ratioWithFilter": "Pomer s filtrom"
},
"table": {
"header": {
diff --git a/public/locales/sk/settings/customization/general.json b/public/locales/sk/settings/customization/general.json
index 3e0bbb6bc1d..942e7baf55b 100644
--- a/public/locales/sk/settings/customization/general.json
+++ b/public/locales/sk/settings/customization/general.json
@@ -22,7 +22,7 @@
"description": "Konfigurácia aplikácie Homarr pre zdravotne postihnutých a hendikepovaných používateľov"
},
"access": {
- "name": "",
+ "name": "Prístup",
"description": "Konfigurácia osôb, ktoré majú prístup k vašej nástenke"
}
}
diff --git a/public/locales/sk/settings/customization/page-appearance.json b/public/locales/sk/settings/customization/page-appearance.json
index d290a9d2571..e9bb8429186 100644
--- a/public/locales/sk/settings/customization/page-appearance.json
+++ b/public/locales/sk/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Pozadie"
},
+ "backgroundImageAttachment": {
+ "label": "Pripojenie obrázku na pozadí",
+ "options": {
+ "fixed": "Pevné - pozadie zostáva v rovnakej polohe (odporúčané)",
+ "scroll": "Posúvanie - Pozadie sa posúva myšou"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Veľkosť obrázka na pozadí",
+ "options": {
+ "cover": "Cover (Zakryť) - zmenší obrázok na čo najmenšiu veľkosť, aby zakryl celé okno orezaním nadmerného priestoru. (odporúčané)",
+ "contain": "Obsahovať - zmenší obrázok na čo najväčšiu veľkosť v rámci kontajnera bez orezania alebo roztiahnutia obrázka."
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Pripojenie obrázku na pozadí",
+ "options": {
+ "repeat": "Opakovať - Obrázok sa opakuje toľkokrát, koľko je potrebné na pokrytie celej oblasti maľovania obrázka na pozadí.",
+ "no-repeat": "Žiadne opakovanie - obrázok sa neopakuje a nemusí vyplniť celý priestor (odporúčané)",
+ "repeat-x": "Opakovať X - Rovnaké ako \"Opakovať\", ale len na horizontálnej osi.",
+ "repeat-y": "Opakovať Y - Rovnaké ako \"Opakovať\", ale len na zvislej osi."
+ }
+ },
"customCSS": {
"label": "Vlastné CSS",
"description": "Ďalej si prispôsobte ovládací panel pomocou CSS, odporúča sa len pre skúsených používateľov",
"placeholder": "Vlastné CSS sa použije ako posledné",
"applying": "Aplikuje sa CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/sl/layout/header.json b/public/locales/sl/layout/header.json
index cd43ad67ca9..12421a8e50f 100644
--- a/public/locales/sl/layout/header.json
+++ b/public/locales/sl/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": ""
- },
"search": {
"label": "",
"engines": {
diff --git a/public/locales/sl/settings/customization/page-appearance.json b/public/locales/sl/settings/customization/page-appearance.json
index 6702f672310..de935c1a5c3 100644
--- a/public/locales/sl/settings/customization/page-appearance.json
+++ b/public/locales/sl/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Ozadje"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Po meri CSS",
"description": "Dadatno prilagodite pogled s CSS. Priporočljivo le za izkušene uporabnike",
"placeholder": "Prilagojeni CSS bo uporabljen kot zadnji",
"applying": "Uporaba CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/sv/layout/header.json b/public/locales/sv/layout/header.json
index ce11e3bf25b..0a8f2477079 100644
--- a/public/locales/sv/layout/header.json
+++ b/public/locales/sv/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Detta är en experimentell funktion i Homarr. Vänligen rapportera eventuella problem på GitHub eller Discord ."
- },
"search": {
"label": "Sök",
"engines": {
diff --git a/public/locales/sv/settings/customization/page-appearance.json b/public/locales/sv/settings/customization/page-appearance.json
index 01dc814bcf6..81aecb90b48 100644
--- a/public/locales/sv/settings/customization/page-appearance.json
+++ b/public/locales/sv/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Bakgrund"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Anpassad CSS",
"description": "Vidare kan du anpassa din instrumentpanel med CSS, vilket endast rekommenderas för erfarna användare",
"placeholder": "Anpassad CSS tillämpas sist",
"applying": "Tillämpar CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/tr/layout/header.json b/public/locales/tr/layout/header.json
index 85ba192fafb..48c9f527306 100644
--- a/public/locales/tr/layout/header.json
+++ b/public/locales/tr/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Bu Homarr'ın deneysel bir özelliğidir. Lütfen herhangi bir sorunu GitHub veya Discord adresinden bildirin."
- },
"search": {
"label": "Ara",
"engines": {
diff --git a/public/locales/tr/settings/customization/page-appearance.json b/public/locales/tr/settings/customization/page-appearance.json
index a2b32588acd..7689630872f 100644
--- a/public/locales/tr/settings/customization/page-appearance.json
+++ b/public/locales/tr/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Arkaplan"
},
+ "backgroundImageAttachment": {
+ "label": "Arkaplan resim ekle",
+ "options": {
+ "fixed": "Düzeltildi - Arka plan aynı konumda kalıyor (tavsiye edilen)",
+ "scroll": "Kaydırma - Arka plan farenizle kaydırılır"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "Arkaplan resim boyutu",
+ "options": {
+ "cover": "Kapak - Fazla alanı kırparak tüm pencereyi kaplamak için görüntüyü mümkün olduğunca küçük ölçeklendirir. (tavsiye edilen)",
+ "contain": "Kapsam - Görüntüyü kırpmadan veya genişletmeden, kapsayıcısı içinde mümkün olduğu kadar büyük ölçeklendirir."
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "Arkaplan resim ekle",
+ "options": {
+ "repeat": "Tekrarla - Resim, arka plan görüntü alanının tamamını kapsayacak şekilde gerektiği kadar tekrarlanır.",
+ "no-repeat": "",
+ "repeat-x": "Tekrarla X - 'Tekrarla' ile aynıdır ancak yalnızca yatay eksende.",
+ "repeat-y": "Tekrar Y - 'Tekrarla' ile aynıdır, ancak yalnızca dikey eksende."
+ }
+ },
"customCSS": {
"label": "Özel CSS",
"description": "Ayrıca, yalnızca deneyimli kullanıcılar için önerilen CSS kullanarak kontrol panelinizi özelleştirin",
"placeholder": "Özel CSS en son uygulanacaktır",
"applying": "CSS uygulanıyor..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/tr/tools/docker.json b/public/locales/tr/tools/docker.json
index 7c0e3e97d8d..bceffabd061 100644
--- a/public/locales/tr/tools/docker.json
+++ b/public/locales/tr/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Homarr örneğinizde Docker yapılandırılmış değil veya konteynırları getirmede başarısız oldu. Lütfen entegrasyonun nasıl kurulacağına ilişkin belgeleri kontrol edin."
+ "text": "Homarr yapılandırmanızda, Docker yapılandırılmamış veya konteynırları getirmede başarısız oldu. Lütfen entegrasyonun nasıl yapılacağına ilişkin belgeleri kontrol edin."
}
},
"modals": {
diff --git a/public/locales/tw/layout/header.json b/public/locales/tw/layout/header.json
index 076c98a7d28..f3c2c658a22 100644
--- a/public/locales/tw/layout/header.json
+++ b/public/locales/tw/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "這是 Homarr 的一項實現性功能。請在 Github 或 Discord 上回報任何問題"
- },
"search": {
"label": "搜尋",
"engines": {
diff --git a/public/locales/tw/settings/customization/page-appearance.json b/public/locales/tw/settings/customization/page-appearance.json
index 65fb4d33e23..4aa50d4d468 100644
--- a/public/locales/tw/settings/customization/page-appearance.json
+++ b/public/locales/tw/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "背景"
},
+ "backgroundImageAttachment": {
+ "label": "背景圖片附件",
+ "options": {
+ "fixed": "固定 - 背景保持在同一位置 (推薦)",
+ "scroll": "滾動 - 背景隨滑鼠滾動"
+ }
+ },
+ "backgroundImageSize": {
+ "label": "背景圖像大小",
+ "options": {
+ "cover": "覆蓋 - 通過剪裁多餘的區域,將圖像縮放到盡可能小的方式來覆蓋整個窗口 (推薦)",
+ "contain": "包含 - 在不剪裁或拉伸圖像的方式下,在容器中盡可能大的方式來縮放圖像"
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "背景圖片附件",
+ "options": {
+ "repeat": "重複 - 根據需要重複圖像,以覆蓋整個背景圖像繪製區域",
+ "no-repeat": "不重複 - 圖像不重複且不填滿整個區域 (推薦)",
+ "repeat-x": "重複 X 軸 - 與\"重複\"相同,但只在水平軸上重複",
+ "repeat-y": "重複 Y 軸 - 與\"重複\"相同,但只在垂直上重複"
+ }
+ },
"customCSS": {
"label": "自定義 CSS",
"description": "此外,只推薦有經驗的使用者使用 CSS 自定義面板",
"placeholder": "自定義 CSS 將最後應用",
"applying": "應用 CSS 中..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/tw/tools/docker.json b/public/locales/tw/tools/docker.json
index 57f79d87751..fd70d287f4c 100644
--- a/public/locales/tw/tools/docker.json
+++ b/public/locales/tw/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "您的 Homarr 實例未設定 Docker,或無法獲取容器,請查看文檔了解如設定集成"
+ "text": "您的 Homarr 實例未配置 Docker,或無法獲取容器。請查說明,了解如何設定集成"
}
},
"modals": {
diff --git a/public/locales/uk/layout/header.json b/public/locales/uk/layout/header.json
index 997a7e38d84..158a9cd8389 100644
--- a/public/locales/uk/layout/header.json
+++ b/public/locales/uk/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Це експериментальна функція Homarr. Будь ласка, повідомляйте про будь-які проблеми на GitHub або Discord ."
- },
"search": {
"label": "Пошук",
"engines": {
diff --git a/public/locales/uk/settings/customization/page-appearance.json b/public/locales/uk/settings/customization/page-appearance.json
index 3c5adce8f38..f4ca83a4df6 100644
--- a/public/locales/uk/settings/customization/page-appearance.json
+++ b/public/locales/uk/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Фон"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "Власний CSS",
"description": "Крім того, налаштуйте дашборд за допомогою CSS, що рекомендується лише досвідченим користувачам",
"placeholder": "Власний CSS буде оброблятися в останню чергу",
"applying": "Застосувати CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/uk/tools/docker.json b/public/locales/uk/tools/docker.json
index e75f23653fe..d553bf75882 100644
--- a/public/locales/uk/tools/docker.json
+++ b/public/locales/uk/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "У вашому екземплярі Homarr не налаштовано Docker або він помилково завантажив контейнери. Будь ласка, зверніться до документації про те, як налаштувати інтеграцію."
+ "text": ""
}
},
"modals": {
diff --git a/public/locales/vi/layout/header.json b/public/locales/vi/layout/header.json
index b0de249ad37..2111a48eec7 100644
--- a/public/locales/vi/layout/header.json
+++ b/public/locales/vi/layout/header.json
@@ -1,7 +1,4 @@
{
- "experimentalNote": {
- "label": "Đây là một tính năng thử nghiệm của Homarr. Vui lòng báo cáo mọi vấn đề trên GitHub hoặc Discord ."
- },
"search": {
"label": "Tìm kiếm",
"engines": {
diff --git a/public/locales/vi/layout/modals/about.json b/public/locales/vi/layout/modals/about.json
index faa72a6065a..a22c0b2744e 100644
--- a/public/locales/vi/layout/modals/about.json
+++ b/public/locales/vi/layout/modals/about.json
@@ -5,10 +5,10 @@
"key": "Phím tắt",
"action": "Hành động",
"keybinds": "Phím tắt",
- "translators": "",
- "translatorsDescription": "",
- "contributors": "",
- "contributorsDescription": "",
+ "translators": "Phiên dịch viên ({{count}})",
+ "translatorsDescription": "Nhờ những người này, Homarr hiện có sẵn {{languages}} ngôn ngữ khác nhau! Bạn muốn giúp dịch Homarr sang ngôn ngữ của bạn? Đọc cách thực hiện tại đây .",
+ "contributors": "Người đóng góp ({{count}})",
+ "contributorsDescription": "Những người này đã lập trình nên Homarr! Bạn muốn giúp xây dựng Homarr? Đọc cách thực hiện tại đây ",
"actions": {
"toggleTheme": "Đổi chế độ sáng/tối",
"focusSearchBar": "Tập trung vào thanh tìm kiếm",
diff --git a/public/locales/vi/modules/dns-hole-summary.json b/public/locales/vi/modules/dns-hole-summary.json
index ca0ee3754aa..d90896743e8 100644
--- a/public/locales/vi/modules/dns-hole-summary.json
+++ b/public/locales/vi/modules/dns-hole-summary.json
@@ -21,8 +21,8 @@
"metrics": {
"domainsOnAdlist": "Tên miền trên danh sách quảng cáo",
"queriesToday": "Truy vấn hôm nay",
- "queriesBlockedTodayPercentage": "",
- "queriesBlockedToday": ""
+ "queriesBlockedTodayPercentage": "Đã chặn hôm nay",
+ "queriesBlockedToday": "Đã chặn hôm nay"
}
}
}
diff --git a/public/locales/vi/modules/notebook.json b/public/locales/vi/modules/notebook.json
index b174e558c47..e9efa7765a8 100644
--- a/public/locales/vi/modules/notebook.json
+++ b/public/locales/vi/modules/notebook.json
@@ -1,9 +1,9 @@
{
"descriptor": {
- "name": "Sổ tay",
+ "name": "Ghi chú",
"description": "Tiện ích tương tác dựa trên đánh dấu để bạn viết ra ghi chú của mình!",
"settings": {
- "title": "Cài đặt cho tiện ích sổ ghi chép",
+ "title": "Cài đặt cho tiện ích ghi chú",
"showToolbar": {
"label": "Hiển thị thanh công cụ giúp bạn viết markdown"
},
@@ -11,7 +11,7 @@
"label": ""
},
"content": {
- "label": "Nội dung của sổ ghi chép"
+ "label": "Nội dung của ghi chú"
}
}
},
@@ -51,9 +51,9 @@
"modals": {
"clearColor": "",
"source": "",
- "widthPlaceholder": "",
- "columns": "",
- "rows": ""
+ "widthPlaceholder": "Giá trị tính bằng % hoặc pixel",
+ "columns": "Cột",
+ "rows": "Dòng"
}
}
}
\ No newline at end of file
diff --git a/public/locales/vi/settings/customization/page-appearance.json b/public/locales/vi/settings/customization/page-appearance.json
index ff16304c09d..ef0e7f90fb7 100644
--- a/public/locales/vi/settings/customization/page-appearance.json
+++ b/public/locales/vi/settings/customization/page-appearance.json
@@ -18,10 +18,33 @@
"background": {
"label": "Hình nền"
},
+ "backgroundImageAttachment": {
+ "label": "",
+ "options": {
+ "fixed": "",
+ "scroll": ""
+ }
+ },
+ "backgroundImageSize": {
+ "label": "",
+ "options": {
+ "cover": "",
+ "contain": ""
+ }
+ },
+ "backgroundImageRepeat": {
+ "label": "",
+ "options": {
+ "repeat": "",
+ "no-repeat": "",
+ "repeat-x": "",
+ "repeat-y": ""
+ }
+ },
"customCSS": {
"label": "CSS tuỳ chỉnh",
"description": "Ngoài ra có thể tùy chỉnh bảng điều khiển của bạn bằng CSS, chỉ được đề xuất cho người dùng có kinh nghiệm",
"placeholder": "CSS tùy chỉnh sẽ được áp dụng sau cùng",
"applying": "Đang áp dụng CSS..."
}
-}
\ No newline at end of file
+}
diff --git a/public/locales/vi/tools/docker.json b/public/locales/vi/tools/docker.json
index 7542e70c151..5f57baf16c6 100644
--- a/public/locales/vi/tools/docker.json
+++ b/public/locales/vi/tools/docker.json
@@ -2,7 +2,7 @@
"title": "Docker",
"alerts": {
"notConfigured": {
- "text": "Phiên bản Homarr của bạn không được định cấu hình Docker hoặc không thể tìm nạp vùng chứa. Vui lòng kiểm tra tài liệu về cách thiết lập tích hợp."
+ "text": ""
}
},
"modals": {
diff --git a/scripts/run.sh b/scripts/run.sh
index 3f1651783f3..ba017d05e6f 100644
--- a/scripts/run.sh
+++ b/scripts/run.sh
@@ -2,22 +2,16 @@
echo "Exporting hostname..."
export NEXTAUTH_URL_INTERNAL="http://$HOSTNAME:7575"
-mv node_modules _node_modules
-mv node_modules_migrate node_modules
+
echo "Migrating database..."
-yarn ts-node src/migrate.ts & PID=$!
+cd ./migrate; yarn db:migrate & PID=$!
# Wait for migration to finish
wait $PID
-echo "Reverting to production node_modules..."
-# Copy specific sqlite3 binary to node_modules
-cp /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/_node_modules/better-sqlite3/build/Release/better_sqlite3.node
-
-# Remove node_modules and copy cached node_modules
-mv node_modules node_modules_migrate
-mv _node_modules node_modules
-cp ./temp_package.json package.json
-cp ./temp_yarn.lock yarn.lock
+## If 'default.json' does not exist in '/app/data/configs', we copy it from '/app/data/default.json'
+cp -n /app/data/default.json /app/data/configs/default.json
echo "Starting production server..."
-node /app/server.js
\ No newline at end of file
+node /app/server.js & PID=$!
+
+wait $PID
\ No newline at end of file
diff --git a/src/components/Board/Customize/Appearance/AppearanceCustomization.tsx b/src/components/Board/Customize/Appearance/AppearanceCustomization.tsx
index 248f4e8551e..4f1411124e8 100644
--- a/src/components/Board/Customize/Appearance/AppearanceCustomization.tsx
+++ b/src/components/Board/Customize/Appearance/AppearanceCustomization.tsx
@@ -4,9 +4,9 @@ import {
Group,
Input,
MantineTheme,
+ Select,
Slider,
Stack,
- Text,
TextInput,
createStyles,
rem,
@@ -16,6 +16,7 @@ import { useTranslation } from 'next-i18next';
import { highlight, languages } from 'prismjs';
import Editor from 'react-simple-code-editor';
import { useColorTheme } from '~/tools/color';
+import { BackgroundImageAttachment, BackgroundImageRepeat, BackgroundImageSize } from '~/types/settings';
import { useBoardCustomizationFormContext } from '../form';
@@ -30,6 +31,32 @@ export const AppearanceCustomization = () => {
placeholder="/imgs/backgrounds/background.png"
{...form.getInputProps('appearance.backgroundSrc')}
/>
+ ({
+ value: attachment,
+ label: t(`backgroundImageAttachment.options.${attachment}`) as string,
+ }))}
+ {...form.getInputProps('appearance.backgroundImageAttachment')}
+ />
+
+ ({
+ value: size,
+ label: t(`backgroundImageSize.options.${size}`) as string,
+ }))}
+ {...form.getInputProps('appearance.backgroundImageSize')}
+ />
+
+ ({
+ value: repeat,
+ label: t(`backgroundImageRepeat.options.${repeat}`) as string,
+ }))}
+ {...form.getInputProps('appearance.backgroundImageRepeat')}
+ />
diff --git a/src/components/Onboarding/database-not-writeable.tsx b/src/components/Onboarding/database-not-writeable.tsx
new file mode 100644
index 00000000000..b2d313a9dcc
--- /dev/null
+++ b/src/components/Onboarding/database-not-writeable.tsx
@@ -0,0 +1,46 @@
+import { Center, Code, List, Stack, Text, Title } from '@mantine/core';
+import Head from 'next/head';
+
+export const DatabaseNotWriteable = ({
+ stringifiedError,
+ errorMessage,
+}: {
+ stringifiedError: string | undefined;
+ errorMessage: string | undefined;
+}) => {
+ return (
+ <>
+
+ Onboard - Error • Homarr
+
+
+
+
+
+ Critical error while starting Homarr
+
+
+ We detected that Homarr is unable to write to the database. Please troubleshoot using
+ the following steps:
+
+
+
+ Ensure that you mounted the path /data
to a writeable location with
+ enough disk space. For this, you must add the following mounting point to your docker
+ compose: {' - /data:/data'}
+
+
+ Ensure that you followed the installation instructions at{' '}
+
+ https://homarr.dev/docs/introduction/installation
+
+
+
+ {stringifiedError}
+
+ {errorMessage && {errorMessage}
}
+
+
+ >
+ );
+};
diff --git a/src/components/layout/Common/Logo.tsx b/src/components/layout/Common/Logo.tsx
index 891ea36d741..25a8c5bbf92 100644
--- a/src/components/layout/Common/Logo.tsx
+++ b/src/components/layout/Common/Logo.tsx
@@ -17,7 +17,13 @@ export function Logo({ size = 'md', withoutText = false }: LogoProps) {
return (
{
minHeight: '100vh',
backgroundImage: `url('${config?.settings.customization.backgroundImageUrl}')`,
backgroundPosition: 'center center',
- backgroundSize: 'cover',
- backgroundRepeat: 'no-repeat',
+ backgroundSize: config?.settings.customization.backgroundImageSize ?? 'cover',
+ backgroundRepeat: config?.settings.customization.backgroundImageRepeat ?? 'no-repeat',
+ backgroundAttachment: config?.settings.customization.backgroundImageAttachment ?? 'fixed'
},
}}
/>
diff --git a/src/components/layout/header/About/Translators.tsx b/src/components/layout/header/About/Translators.tsx
index 0ccd7ba43c5..acd0b13c7b8 100644
--- a/src/components/layout/header/About/Translators.tsx
+++ b/src/components/layout/header/About/Translators.tsx
@@ -74,8 +74,8 @@ export function TranslatorsTable({ loadedLanguages }: { loadedLanguages: number
}}
>
- {translator.languages.map((language) => (
- {language.name},
+ {translator.languages.map((language, index) => (
+ {language.name}{(index < translator.languages.length - 1 ? ", " : "")}
))}
diff --git a/src/components/layout/header/Search/MovieModal.tsx b/src/components/layout/header/Search/MovieModal.tsx
index 2b043dd670e..0855d26cfa6 100644
--- a/src/components/layout/header/Search/MovieModal.tsx
+++ b/src/components/layout/header/Search/MovieModal.tsx
@@ -2,7 +2,6 @@ import {
Button,
Card,
Center,
- Divider,
Grid,
Group,
Loader,
@@ -134,8 +133,11 @@ const MovieDisplay = ({ movie, type }: MovieDisplayProps) => {
const service = config.apps.find((service) => service.integration.type === type);
const mediaUrl = movie.mediaInfo?.plexUrl ?? movie.mediaInfo?.mediaUrl;
- const serviceUrl = service?.behaviour.externalUrl ? service.behaviour.externalUrl : service?.url;
- const externalUrl = movie.mediaInfo?.serviceUrl;
+ const serviceUrl = service?.behaviour.externalUrl ?? service?.url;
+ const externalUrl = new URL(
+ `${movie.mediaType}/${movie.id}`,
+ serviceUrl ?? 'https://www.themoviedb.org'
+ );
return (
@@ -192,16 +194,16 @@ const MovieDisplay = ({ movie, type }: MovieDisplayProps) => {
{t('buttons.play')}
)}
- {serviceUrl && (
+ {externalUrl && (
}
>
- {type === 'jellyseerr' ? 'Jellyfin' : 'Overseerr'}
+ {serviceUrl ? (type === 'jellyseerr' ? 'Jellyfin' : 'Overseerr') : 'TMDB'}
)}
diff --git a/src/middleware.ts b/src/middleware.ts
index 63e2b45d080..ee139deca3e 100644
--- a/src/middleware.ts
+++ b/src/middleware.ts
@@ -47,11 +47,5 @@ const shouldRedirectToOnboard = async (): Promise => {
return cachedUserCount === 0;
};
- if (!process.env.DATABASE_URL?.startsWith('file:')) {
- return await cacheAndGetUserCount();
- }
-
- const fileUri = process.env.DATABASE_URL.substring(4);
return await cacheAndGetUserCount();
- // TODO: Show an error page if the database file is read-only
};
diff --git a/src/pages/board/[slug]/customize.tsx b/src/pages/board/[slug]/customize.tsx
index 45d465b54ad..a83ecf33cd8 100644
--- a/src/pages/board/[slug]/customize.tsx
+++ b/src/pages/board/[slug]/customize.tsx
@@ -42,10 +42,12 @@ import {
import { useBoardLink } from '~/components/layout/Templates/BoardLayout';
import { MainLayout } from '~/components/layout/Templates/MainLayout';
import { createTrpcServersideHelpers } from '~/server/api/helper';
+import { configRouter } from '~/server/api/routers/config';
import { getServerAuthSession } from '~/server/auth';
import { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';
import { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';
import { firstUpperCase } from '~/tools/shared/strings';
+import { ConfigType } from '~/types/config';
import { api } from '~/utils/api';
import { useI18nZodResolver } from '~/utils/i18n-zod-resolver';
import { boardCustomizationSchema } from '~/validations/boards';
@@ -59,14 +61,20 @@ export default function CustomizationPage({
slug: string;
};
const utils = api.useContext();
- const { data: config } = api.config.byName.useQuery(
+ const {
+ data: config,
+ error,
+ isError,
+ } = api.config.byName.useQuery(
{ name: query.slug },
{
initialData: initialConfig,
refetchOnMount: false,
+ useErrorBoundary: false,
+ suspense: false,
}
);
- const { mutateAsync: saveCusomization, isLoading } = api.config.saveCusomization.useMutation();
+ const { mutateAsync: saveCustomization, isLoading } = api.config.saveCustomization.useMutation();
const { i18nZodResolver } = useI18nZodResolver();
const { t } = useTranslation('boards/customize');
const form = useBoardCustomizationForm({
@@ -86,6 +94,9 @@ export default function CustomizationPage({
shade: (config?.settings.customization.colors.shade as number | undefined) ?? 8,
opacity: config?.settings.customization.appOpacity ?? 50,
customCss: config?.settings.customization.customCss ?? '',
+ backgroundImageAttachment: config?.settings.customization.backgroundImageAttachment ?? 'fixed',
+ backgroundImageRepeat: config?.settings.customization.backgroundImageRepeat ?? 'no-repeat',
+ backgroundImageSize: config?.settings.customization.backgroundImageSize ?? 'cover',
},
gridstack: {
sm: config?.settings.customization.gridstack?.columnCountSmall ?? 3,
@@ -114,7 +125,7 @@ export default function CustomizationPage({
message: t('notifications.pending.message'),
loading: true,
});
- await saveCusomization(
+ await saveCustomization(
{
name: query.slug,
...values,
@@ -150,6 +161,12 @@ export default function CustomizationPage({
name: firstUpperCase(query.slug),
})} • Homarr`;
+ if (isError || error) {
+ return {
+ notFound: true,
+ };
+ }
+
return (
{
}
const session = await getServerAuthSession({ req: context.req, res: context.res });
-
- const result = checkForSessionOrAskForLogin(context, session, () => session?.user.isAdmin == true);
+
+ const result = checkForSessionOrAskForLogin(
+ context,
+ session,
+ () => session?.user.isAdmin == true
+ );
if (result) {
return result;
}
const helpers = await createTrpcServersideHelpers({ req: context.req, res: context.res });
+ const caller = configRouter.createCaller({
+ session: session,
+ cookies: context.req.cookies,
+ });
- const config = await helpers.config.byName.fetch({ name: routeParams.data.slug });
+ let config: ConfigType;
+ try {
+ config = await caller.byName({ name: routeParams.data.slug });
+ } catch {
+ return {
+ notFound: true
+ };
+ }
const translations = await getServerSideTranslations(
[
diff --git a/src/pages/board/index.tsx b/src/pages/board/index.tsx
index df32ce8e8c1..9822d125bed 100644
--- a/src/pages/board/index.tsx
+++ b/src/pages/board/index.tsx
@@ -25,7 +25,6 @@ export default function BoardPage({
type BoardGetServerSideProps = {
config: ConfigType;
- dockerEnabled: boolean;
_nextI18Next?: SSRConfig['_nextI18Next'];
};
@@ -41,7 +40,11 @@ export const getServerSideProps: GetServerSideProps = a
);
const config = await getFrontendConfig(boardName);
- const result = checkForSessionOrAskForLogin(ctx, session, () => true);
+ const result = checkForSessionOrAskForLogin(
+ ctx,
+ session,
+ () => config.settings.access.allowGuests || session?.user != undefined
+ );
if (result) {
return result;
}
diff --git a/src/pages/manage/boards/index.tsx b/src/pages/manage/boards/index.tsx
index d79e7394785..822bfeef1b6 100644
--- a/src/pages/manage/boards/index.tsx
+++ b/src/pages/manage/boards/index.tsx
@@ -18,19 +18,21 @@ import {
IconDeviceFloppy,
IconDotsVertical,
IconFolderFilled,
+ IconLock,
+ IconLockOff,
IconPlus,
IconStack,
IconStarFilled,
IconTrash,
} from '@tabler/icons-react';
-import { GetServerSideProps } from 'next';
-import { useSession } from 'next-auth/react';
+import { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';
import { useTranslation } from 'next-i18next';
import Head from 'next/head';
import Link from 'next/link';
import { openCreateBoardModal } from '~/components/Manage/Board/create-board.modal';
import { openDeleteBoardModal } from '~/components/Manage/Board/delete-board.modal';
import { ManageLayout } from '~/components/layout/Templates/ManageLayout';
+import { boardRouter } from '~/server/api/routers/board';
import { getServerAuthSession } from '~/server/auth';
import { sleep } from '~/tools/client/time';
import { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';
@@ -38,13 +40,18 @@ import { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';
import { manageNamespaces } from '~/tools/server/translation-namespaces';
import { api } from '~/utils/api';
-const BoardsPage = () => {
- const context = api.useContext();
- const { data: sessionData } = useSession();
- const { data } = api.boards.all.useQuery();
+// Infer return type from the `getServerSideProps` function
+export default function BoardsPage({
+ boards,
+ session,
+}: InferGetServerSidePropsType) {
+ const { data, refetch } = api.boards.all.useQuery(undefined, {
+ initialData: boards,
+ cacheTime: 1000 * 60 * 5, // Cache for 5 minutes
+ });
const { mutateAsync } = api.user.makeDefaultDashboard.useMutation({
onSettled: () => {
- void context.boards.invalidate();
+ refetch();
},
});
@@ -62,7 +69,7 @@ const BoardsPage = () => {
{t('pageTitle')}
- {sessionData?.user.isAdmin && (
+ {session?.user.isAdmin && (
}
@@ -73,153 +80,167 @@ const BoardsPage = () => {
)}
- {data && (
-
- {data.map((board, index) => (
-
-
-
-
-
- {board.name}
-
-
+
+ {data.map((board, index) => (
+
+
+
+
+
+ {board.name}
+
+
+ } color="pink" variant="light">
+ {t('cards.badges.fileSystem')}
+
+ :
+ }
+ color="green"
+ variant="light"
+ >
+ {board.allowGuests ? t('common:public') : t('common:restricted')}
+
+ {board.isDefaultForUser && (
}
- color="pink"
+ leftSection={ }
+ color="yellow"
variant="light"
>
- {t('cards.badges.fileSystem')}
+ {t('cards.badges.default')}
- {board.isDefaultForUser && (
- }
- color="yellow"
- variant="light"
- >
- {t('cards.badges.default')}
-
- )}
-
+ )}
+
-
-
-
-
- {t('cards.statistics.apps')}
-
- {board.countApps}
+
+
+
+
+ {t('cards.statistics.apps')}
+ {board.countApps}
+
-
-
-
- {t('cards.statistics.widgets')}
-
- {board.countWidgets}
+
+
+
+ {t('cards.statistics.widgets')}
+ {board.countWidgets}
+
-
-
-
- {t('cards.statistics.categories')}
-
- {board.countCategories}
+
+
+
+ {t('cards.statistics.categories')}
-
-
-
-
- {t('cards.buttons.view')}
-
-
-
-
-
-
-
-
- }
- onClick={async () => {
- void mutateAsync({
- board: board.name,
- });
- }}
- >
- {t('cards.menu.setAsDefault')}
-
- {sessionData?.user.isAdmin && (
- <>
-
- {
- openDeleteBoardModal({
- boardName: board.name,
- onConfirm: async () => {
- append(board.name);
- // give user feedback, that it's being deleted
- await sleep(500);
- filter((item, _) => item !== board.name);
- },
- });
- }}
- disabled={board.name === 'default'}
- icon={ }
- color="red"
- >
- {t('cards.menu.delete.label')}
- {board.name === 'default' && (
- {t('cards.menu.delete.disabled')}
- )}
-
- >
- )}
-
-
+ {board.countCategories}
-
- ))}
-
- )}
+
+
+
+
+ {t('cards.buttons.view')}
+
+
+
+
+
+
+
+
+ }
+ onClick={async () => {
+ void mutateAsync({
+ board: board.name,
+ });
+ }}
+ >
+ {t('cards.menu.setAsDefault')}
+
+ {session?.user.isAdmin && (
+ <>
+
+ {
+ openDeleteBoardModal({
+ boardName: board.name,
+ onConfirm: async () => {
+ append(board.name);
+ // give user feedback, that it's being deleted
+ await sleep(500);
+ filter((item, _) => item !== board.name);
+ },
+ });
+ }}
+ disabled={board.name === 'default'}
+ icon={ }
+ color="red"
+ >
+ {t('cards.menu.delete.label')}
+ {board.name === 'default' && (
+ {t('cards.menu.delete.disabled')}
+ )}
+
+ >
+ )}
+
+
+
+
+ ))}
+
);
-};
-
-export const getServerSideProps: GetServerSideProps = async (ctx) => {
- const session = await getServerAuthSession(ctx);
-
- const result = checkForSessionOrAskForLogin(ctx, session, () => true);
- if (result) {
+}
+
+export const getServerSideProps = async (context: GetServerSidePropsContext) => {
+ const session = await getServerAuthSession({ req: context.req, res: context.res });
+ const result = checkForSessionOrAskForLogin(
+ context,
+ session,
+ () => session?.user.isAdmin == true
+ );
+ if (result !== undefined) {
return result;
}
+ const caller = boardRouter.createCaller({
+ session: session,
+ cookies: context.req.cookies,
+ });
+
+ const boards = await caller.all();
+
const translations = await getServerSideTranslations(
manageNamespaces,
- ctx.locale,
- ctx.req,
- ctx.res
+ context.locale,
+ context.req,
+ context.res
);
+
return {
props: {
+ boards,
+ session,
...translations,
},
};
};
-
-export default BoardsPage;
diff --git a/src/pages/onboard.tsx b/src/pages/onboard.tsx
index 01c248131fc..de85c4eff1e 100644
--- a/src/pages/onboard.tsx
+++ b/src/pages/onboard.tsx
@@ -1,19 +1,25 @@
-import { Box, Button, Center, Image, Stack, Text, Title, useMantineTheme } from '@mantine/core';
+import { Button, Center, Image, Stack, Text, Title, useMantineTheme } from '@mantine/core';
import { useDisclosure } from '@mantine/hooks';
import { IconArrowRight } from '@tabler/icons-react';
+import Consola from 'consola';
import fs from 'fs';
+import fsPromises from 'fs/promises';
import { GetServerSideProps, InferGetServerSidePropsType } from 'next';
import Head from 'next/head';
+import { DatabaseNotWriteable } from '~/components/Onboarding/database-not-writeable';
import { OnboardingSteps } from '~/components/Onboarding/onboarding-steps';
import { ThemeSchemeToggle } from '~/components/ThemeSchemeToggle/ThemeSchemeToggle';
import { FloatingBackground } from '~/components/layout/Background/FloatingBackground';
-import { db } from '~/server/db';
+import { env } from '~/env';
import { getTotalUserCountAsync } from '~/server/db/queries/user';
import { getConfig } from '~/tools/config/getConfig';
import { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';
export default function OnboardPage({
configSchemaVersions,
+ databaseNotWriteable,
+ stringifiedError,
+ errorMessage,
}: InferGetServerSidePropsType) {
const { fn, colors, colorScheme } = useMantineTheme();
const background = colorScheme === 'dark' ? 'dark.6' : 'gray.1';
@@ -39,29 +45,35 @@ export default function OnboardPage({
- {onboardingSteps ? (
-
+ {databaseNotWriteable == true ? (
+
) : (
-
-
-
- Welcome to Homarr!
-
-
- Your favorite dashboard has received a big upgrade.
-
- We'll help you update within the next few steps
-
+ <>
+ {onboardingSteps ? (
+
+ ) : (
+
+
+
+ Welcome to Homarr!
+
+
+ Your favorite dashboard has received a big upgrade.
+
+ We'll help you update within the next few steps
+
- }
- variant="default"
- >
- Start update process
-
-
-
+ }
+ variant="default"
+ >
+ Start update process
+
+
+
+ )}
+ >
)}
>
@@ -87,10 +99,34 @@ export const getServerSideProps: GetServerSideProps = async (ctx) => {
ctx.res
);
+ if (env.DATABASE_URL.startsWith('file:')) {
+ const rawDatabaseUrl = env.DATABASE_URL.substring('file:'.length);
+ Consola.info(
+ `Instance is using a database on the file system. Checking if file '${rawDatabaseUrl}' is writable...`
+ );
+ try {
+ await fsPromises.access(rawDatabaseUrl, fs.constants.W_OK);
+ } catch (error) {
+ // this usually occurs when the database path is not mounted in Docker
+ Consola.error(`Database '${rawDatabaseUrl}' is not writable.`, error);
+ return {
+ props: {
+ ...translations,
+ configSchemaVersions: configSchemaVersions,
+ databaseNotWriteable: true,
+ errorMessage: 'Database is not writeable',
+ stringifiedError: JSON.stringify(error),
+ },
+ };
+ }
+ Consola.info('Database is writeable');
+ }
+
return {
props: {
...translations,
configSchemaVersions: configSchemaVersions,
+ databaseNotWriteable: false,
},
};
};
diff --git a/src/pages/user/preferences.tsx b/src/pages/user/preferences.tsx
index e2eba85f0b4..85b81532f27 100644
--- a/src/pages/user/preferences.tsx
+++ b/src/pages/user/preferences.tsx
@@ -11,7 +11,6 @@ import {
} from '@mantine/core';
import { createFormContext } from '@mantine/form';
import { IconArrowLeft } from '@tabler/icons-react';
-import { changeLanguage } from 'i18next';
import { GetServerSideProps } from 'next';
import { useTranslation } from 'next-i18next';
import Head from 'next/head';
@@ -74,6 +73,7 @@ const SettingsComponent = ({
label: language.originalName,
description: language.translatedName,
value: language.shortName,
+ country: language.country,
}));
const { t, i18n } = useTranslation(['user/preferences', 'common']);
diff --git a/src/server/api/routers/board.ts b/src/server/api/routers/board.ts
index ce244302d60..05c74c2e4c8 100644
--- a/src/server/api/routers/board.ts
+++ b/src/server/api/routers/board.ts
@@ -25,6 +25,7 @@ export const boardRouter = createTRPCRouter({
return {
name: name,
+ allowGuests: config.settings.access.allowGuests,
countApps: countApps,
countWidgets: config.widgets.length,
countCategories: config.categories.length,
diff --git a/src/server/api/routers/config.ts b/src/server/api/routers/config.ts
index 8958511380f..7bad169405a 100644
--- a/src/server/api/routers/config.ts
+++ b/src/server/api/routers/config.ts
@@ -177,7 +177,7 @@ export const configRouter = createTRPCRouter({
return await getFrontendConfig(input.name);
}),
- saveCusomization: adminProcedure
+ saveCustomization: adminProcedure
.input(boardCustomizationSchema.and(z.object({ name: configNameSchema })))
.mutation(async ({ input }) => {
const previousConfig = getConfig(input.name);
@@ -193,6 +193,9 @@ export const configRouter = createTRPCRouter({
...previousConfig.settings.customization,
appOpacity: input.appearance.opacity,
backgroundImageUrl: input.appearance.backgroundSrc,
+ backgroundImageAttachment: input.appearance.backgroundImageAttachment,
+ backgroundImageRepeat: input.appearance.backgroundImageRepeat,
+ backgroundImageSize: input.appearance.backgroundImageSize,
colors: {
primary: input.appearance.primaryColor,
secondary: input.appearance.secondaryColor,
diff --git a/src/server/api/routers/docker/router.ts b/src/server/api/routers/docker/router.ts
index 942d31b0586..44b2a35da71 100644
--- a/src/server/api/routers/docker/router.ts
+++ b/src/server/api/routers/docker/router.ts
@@ -10,7 +10,7 @@ const dockerActionSchema = z.enum(['remove', 'start', 'stop', 'restart']);
export const dockerRouter = createTRPCRouter({
containers: adminProcedure.query(async () => {
try {
- const docker = DockerSingleton.getInstance();
+ const docker = new Dockerode({});
const containers = await docker.listContainers({ all: true });
return containers;
} catch (err) {
diff --git a/src/styles/global.scss b/src/styles/global.scss
index 2702181b5b0..a4332a8bb88 100644
--- a/src/styles/global.scss
+++ b/src/styles/global.scss
@@ -42,7 +42,7 @@
}
.grid-stack>.grid-stack-item {
- min-width: calc(percentage(1) * #{var(--gridstack-widget-width)});
+ min-width: #{var(--gridstack-widget-width)};
}
// Styling for sidebar grid-stack elements
diff --git a/src/tools/config/getFallbackConfig.ts b/src/tools/config/getFallbackConfig.ts
index cbb7607438d..dbc74888e7c 100644
--- a/src/tools/config/getFallbackConfig.ts
+++ b/src/tools/config/getFallbackConfig.ts
@@ -1,6 +1,6 @@
import { ConfigType } from '~/types/config';
-import defaultConfig from '../../../data/configs/default.json';
+import defaultConfig from '../../../data/default.json';
export const getFallbackConfig = (name?: string) => ({
...defaultConfig,
diff --git a/src/tools/language.ts b/src/tools/language.ts
index b351e1e76d4..62c3abc86a5 100644
--- a/src/tools/language.ts
+++ b/src/tools/language.ts
@@ -6,7 +6,7 @@ export type Language = {
/**
* https://www.iso.org/obp/ui/#search
*/
-
+ country: string;
locale: string;
};
@@ -15,6 +15,7 @@ export const languages = [
shortName: 'en',
originalName: 'English',
translatedName: 'English',
+ country: 'GB',
locale: 'en-gb',
},
{
@@ -22,161 +23,188 @@ export const languages = [
originalName: 'Crowdin',
translatedName: '(Live translation)',
locale: 'cr',
+ country: 'CROWDIN',
},
{
shortName: 'fr',
originalName: 'Français',
translatedName: 'French',
+ country: 'FR',
locale: 'fr',
},
{
shortName: 'cn',
originalName: '中文',
translatedName: 'Chinese (Simplified)',
+ country: 'CN',
locale: 'zh-cn',
},
{
shortName: 'cs',
originalName: 'Čeština',
translatedName: 'Czech',
+ country: 'CZ',
locale: 'cs',
},
{
shortName: 'da',
originalName: 'Dansk',
translatedName: 'Danish',
+ country: 'DK',
locale: 'da',
},
{
shortName: 'de',
originalName: 'Deutsch',
translatedName: 'German',
+ country: 'DE',
locale: 'de',
},
{
+ shortName: 'el',
originalName: 'Ελληνικά',
translatedName: 'Greek',
- shortName: 'el',
+ country: 'GR',
locale: 'el',
},
{
shortName: 'es',
originalName: 'Español',
translatedName: 'Spanish',
+ country: 'ES',
locale: 'es',
},
{
shortName: 'he',
originalName: 'עברית',
translatedName: 'Hebrew',
+ country: 'IL',
locale: 'he',
},
{
shortName: 'hr',
originalName: 'Hrvatski',
translatedName: 'Croatian',
+ country: 'HR',
locale: 'hr',
},
{
shortName: 'hu',
originalName: 'Magyar',
translatedName: 'Hungarian',
+ country: 'HU',
locale: 'hu',
},
{
shortName: 'it',
originalName: 'Italiano',
translatedName: 'Italian',
+ country: 'IT',
locale: 'it',
},
{
shortName: 'ja',
originalName: '日本語',
translatedName: 'Japanese',
+ country: 'JP',
locale: 'ja',
},
{
shortName: 'ko',
originalName: '한국어',
translatedName: 'Korean',
+ country: 'KR',
locale: 'ko',
},
{
shortName: 'lv',
originalName: 'Latvian',
translatedName: 'Latvian',
+ country: 'LV',
locale: 'lv',
},
{
shortName: 'nl',
originalName: 'Nederlands',
translatedName: 'Dutch',
+ country: 'NL',
locale: 'nl',
},
{
shortName: 'no',
originalName: 'Norsk',
translatedName: 'Norwegian',
+ country: 'NO',
locale: 'no',
},
{
shortName: 'pl',
originalName: 'Polski',
translatedName: 'Polish',
+ country: 'PL',
locale: 'pl',
},
{
shortName: 'pt',
originalName: 'Português',
translatedName: 'Portuguese',
+ country: 'PT',
locale: 'pt',
},
{
shortName: 'ru',
originalName: 'Русский',
translatedName: 'Russian',
+ country: 'RU',
locale: 'ru',
},
{
shortName: 'sk',
originalName: 'Slovenčina',
translatedName: 'Slovak',
+ country: 'SK',
locale: 'sk',
},
{
shortName: 'sl',
originalName: 'Slovenščina',
translatedName: 'Slovenian',
+ country: 'SI',
locale: 'sl',
},
{
shortName: 'sv',
originalName: 'Svenska',
translatedName: 'Swedish',
+ country: 'SE',
locale: 'sv',
},
{
shortName: 'tr',
originalName: 'Türkçe',
translatedName: 'Turkish',
+ country: 'TR',
locale: 'tr',
},
{
shortName: 'tw',
originalName: '中文',
translatedName: 'Chinese (Traditional)',
+ country: 'TW',
locale: 'zh-tw',
},
{
shortName: 'uk',
originalName: 'Українська',
translatedName: 'Ukrainian',
+ country: 'UA',
locale: 'uk',
},
{
shortName: 'vi',
originalName: 'Tiếng Việt',
translatedName: 'Vietnamese',
+ country: 'VN',
locale: 'vi',
},
] as const satisfies Readonly;
diff --git a/src/tools/server/loginBuilder.ts b/src/tools/server/loginBuilder.ts
index 9f9a3a2cd42..44b8da848d4 100644
--- a/src/tools/server/loginBuilder.ts
+++ b/src/tools/server/loginBuilder.ts
@@ -1,8 +1,8 @@
import {
- GetServerSideProps,
GetServerSidePropsContext,
GetServerSidePropsResult,
PreviewData,
+ Redirect
} from 'next';
import { Session } from 'next-auth';
@@ -13,13 +13,12 @@ export const checkForSessionOrAskForLogin = (
context: GetServerSidePropsContext,
session: Session | null,
accessCallback: () => boolean
-): GetServerSidePropsResult | undefined => {
+): GetServerSidePropsResult | undefined => {
const permitted = accessCallback();
// user is logged in but does not have the required access
if (session?.user && !permitted) {
return {
- props: {},
redirect: {
destination: '/401',
permanent: false
@@ -34,7 +33,6 @@ export const checkForSessionOrAskForLogin = (
// user is logged out and needs to sign in
return {
- props: {},
redirect: {
destination: `/auth/login?redirectAfterLogin=${context.resolvedUrl}`,
permanent: false,
diff --git a/src/types/settings.ts b/src/types/settings.ts
index 1d4ba5cf20c..acb1e7c6d5e 100644
--- a/src/types/settings.ts
+++ b/src/types/settings.ts
@@ -45,6 +45,9 @@ export interface CustomizationSettingsType {
logoImageUrl?: string;
faviconUrl?: string;
backgroundImageUrl?: string;
+ backgroundImageAttachment?: typeof BackgroundImageAttachment[number];
+ backgroundImageSize?: typeof BackgroundImageSize[number];
+ backgroundImageRepeat?: typeof BackgroundImageRepeat[number];
customCss?: string;
colors: ColorsCustomizationSettingsType;
appOpacity?: number;
@@ -52,6 +55,12 @@ export interface CustomizationSettingsType {
accessibility: AccessibilitySettings;
}
+export const BackgroundImageAttachment = ['fixed', 'scroll'] as const;
+
+export const BackgroundImageSize = ['cover', 'contain'] as const;
+
+export const BackgroundImageRepeat = ['no-repeat', 'repeat', 'repeat-x', 'repeat-y'] as const;
+
export interface AccessibilitySettings {
disablePingPulse: boolean;
replacePingDotsWithIcons: boolean;
diff --git a/src/validations/boards.ts b/src/validations/boards.ts
index 598e9f63eee..0fcedd7d5db 100644
--- a/src/validations/boards.ts
+++ b/src/validations/boards.ts
@@ -1,5 +1,6 @@
import { DEFAULT_THEME, MANTINE_COLORS, MantineColor } from '@mantine/core';
import { z } from 'zod';
+import { BackgroundImageAttachment, BackgroundImageRepeat, BackgroundImageSize } from '~/types/settings';
export const createBoardSchemaValidation = z.object({
name: z.string().min(2).max(25),
@@ -27,6 +28,9 @@ export const boardCustomizationSchema = z.object({
}),
appearance: z.object({
backgroundSrc: z.string(),
+ backgroundImageAttachment: z.enum(BackgroundImageAttachment),
+ backgroundImageSize: z.enum(BackgroundImageSize),
+ backgroundImageRepeat: z.enum(BackgroundImageRepeat),
primaryColor: z.custom(
(value) => typeof value === 'string' && MANTINE_COLORS.includes(value)
),
diff --git a/src/widgets/notebook/NotebookEditor.tsx b/src/widgets/notebook/NotebookEditor.tsx
index b52c4899cce..63ca613107e 100644
--- a/src/widgets/notebook/NotebookEditor.tsx
+++ b/src/widgets/notebook/NotebookEditor.tsx
@@ -49,9 +49,9 @@ import TextStyle from '@tiptap/extension-text-style';
import Underline from '@tiptap/extension-underline';
import { BubbleMenu, useEditor } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';
+import { useSession } from 'next-auth/react';
import { useTranslation } from 'next-i18next';
import { Dispatch, SetStateAction, useState } from 'react';
-import { useEditModeStore } from '~/components/Dashboard/Views/useEditModeStore';
import { useConfigContext } from '~/config/provider';
import { useConfigStore } from '~/config/store';
import { api } from '~/utils/api';
@@ -63,7 +63,8 @@ export function Editor({ widget }: { widget: INotebookWidget }) {
const [content, setContent] = useState(widget.properties.content);
const [toSaveContent, setToSaveContent] = useState(content);
- const { enabled } = useEditModeStore();
+ const { data: sessionData } = useSession();
+ const enabled = !!sessionData?.user.isAdmin;
const [isEditing, setIsEditing] = useState(false);
const { config, name: configName } = useConfigContext();
@@ -119,11 +120,12 @@ export function Editor({ widget }: { widget: INotebookWidget }) {
TaskItem.configure({
nested: true,
onReadOnlyChecked: (node, checked) => {
- if (widget.properties.allowReadOnlyCheck) {
+ if (widget.properties.allowReadOnlyCheck && enabled) {
const event = new CustomEvent('onReadOnlyCheck', { detail: { node, checked } });
dispatchEvent(event);
+ return true;
}
- return widget.properties.allowReadOnlyCheck;
+ return false;
},
}),
TaskList.configure({ itemTypeName: 'taskItem' }),
@@ -327,7 +329,7 @@ export function Editor({ widget }: { widget: INotebookWidget }) {
- {!enabled && (
+ {enabled && (
<>
{
destination: '/auth/login?redirectAfterLogin=/board/my-authentication-board',
permanent: false,
},
- props: {},
});
expect(serverAuthModule.getServerAuthSession).toHaveBeenCalledOnce();
expect(configExistsModule.configExists).toHaveBeenCalledOnce();
diff --git a/yarn.lock b/yarn.lock
index 0979a03e74e..e000ebb4e8e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4754,7 +4754,7 @@ __metadata:
languageName: node
linkType: hard
-"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2":
+"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3":
version: 7.0.3
resolution: "cross-spawn@npm:7.0.3"
dependencies:
@@ -5346,7 +5346,28 @@ __metadata:
languageName: node
linkType: hard
-"dotenv@npm:^16.3.1":
+"dotenv-cli@npm:^7.3.0":
+ version: 7.3.0
+ resolution: "dotenv-cli@npm:7.3.0"
+ dependencies:
+ cross-spawn: ^7.0.3
+ dotenv: ^16.3.0
+ dotenv-expand: ^10.0.0
+ minimist: ^1.2.6
+ bin:
+ dotenv: cli.js
+ checksum: bc48e9872ed451aa7633cfde0079f5e4b40837d49dca4eab947682c80f524bd1e63ec31ff69b7cf955ff969185a05a343dd5d754dd5569e4ae31f8e9a790ab1b
+ languageName: node
+ linkType: hard
+
+"dotenv-expand@npm:^10.0.0":
+ version: 10.0.0
+ resolution: "dotenv-expand@npm:10.0.0"
+ checksum: 2a38b470efe0abcb1ac8490421a55e1d764dc9440fd220942bce40965074f3fb00b585f4346020cb0f0f219966ee6b4ee5023458b3e2953fe5b3214de1b314ee
+ languageName: node
+ linkType: hard
+
+"dotenv@npm:^16.3.0, dotenv@npm:^16.3.1":
version: 16.3.1
resolution: "dotenv@npm:16.3.1"
checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd
@@ -7120,6 +7141,7 @@ __metadata:
dayjs: ^1.11.7
dockerode: ^3.3.2
dotenv: ^16.3.1
+ dotenv-cli: ^7.3.0
drizzle-kit: ^0.19.13
drizzle-orm: ^0.28.6
eslint: ^8.0.1