Compare commits
55 Commits
ldap-insec
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f92f0593f | ||
|
|
783a12b444 | ||
|
|
a48a06e680 | ||
|
|
9a2c56a5dc | ||
|
|
83a8546521 | ||
|
|
e881ec6cb5 | ||
|
|
ce336311b1 | ||
|
|
da138c5b54 | ||
|
|
69f5cd47ad | ||
|
|
638885466e | ||
|
|
523fe30452 | ||
|
|
cd78714da9 | ||
|
|
2982c146a4 | ||
|
|
989cc7de58 | ||
|
|
677224f8de | ||
|
|
8da6d33c61 | ||
|
|
9be9e3963a | ||
|
|
1d3a4af259 | ||
|
|
1251a89a9b | ||
|
|
274eaa9208 | ||
|
|
3236402d2b | ||
|
|
c86c69158a | ||
|
|
ed3d143b8a | ||
|
|
136032f920 | ||
|
|
150e9bf53f | ||
|
|
a3d92d6a73 | ||
|
|
d3a48ae0e0 | ||
|
|
4aa7e7602b | ||
|
|
d63c610cf5 | ||
|
|
0a31b0fc1c | ||
|
|
3737543766 | ||
|
|
85547277d1 | ||
|
|
8e962abc16 | ||
|
|
31a7559b86 | ||
|
|
b59921b843 | ||
|
|
95c126f2c6 | ||
|
|
c8425acd34 | ||
|
|
7ea9c00c18 | ||
|
|
3651585271 | ||
|
|
22732e33e5 | ||
|
|
9caf72aae7 | ||
|
|
5a73166d70 | ||
|
|
5b23f7d13a | ||
|
|
26ae001b5a | ||
|
|
59e5c0306f | ||
|
|
baedc001d9 | ||
|
|
6469aa2350 | ||
|
|
d4765c1e7f | ||
|
|
4bba516fdf | ||
|
|
ddde9992c5 | ||
|
|
c81612e39b | ||
|
|
993739ab8e | ||
|
|
20a84da5dc | ||
|
|
dbadcd8f7a | ||
|
|
9b95ac3c91 |
11
.env.example
11
.env.example
@@ -4,11 +4,16 @@ DATABASE_URL="file:./database/db.sqlite"
|
||||
# You can generate a new secret on the command line with:
|
||||
# openssl rand -base64 32
|
||||
# https://next-auth.js.org/configuration/options#secret
|
||||
NEXTAUTH_URL="http://localhost:3000"
|
||||
|
||||
AUTH_TRUST_HOST="true"
|
||||
NEXTAUTH_SECRET="anything"
|
||||
|
||||
# Disable analytics
|
||||
NEXT_PUBLIC_DISABLE_ANALYTICS="true"
|
||||
|
||||
DEFAULT_COLOR_SCHEME="light"
|
||||
DEFAULT_COLOR_SCHEME="light"
|
||||
|
||||
# Unraid API Configuration
|
||||
UNRAID_HOST=192.168.10.20
|
||||
UNRAID_API_KEY=your-api-key-here
|
||||
UNRAID_USE_SSL=false
|
||||
UNRAID_PORT=80
|
||||
5
.github/ISSUE_TEMPLATE/bug.yml
vendored
5
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -3,6 +3,11 @@ description: Report something that's broken, or not working like intented!
|
||||
title: '<title>'
|
||||
labels: ['🐛 Bug']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> [!WARNING]
|
||||
> If you want to report a bug for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
|
||||
- type: dropdown
|
||||
id: environment
|
||||
attributes:
|
||||
|
||||
13
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
13
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
@@ -3,6 +3,11 @@ description: Request a feature to help improve Homarr!
|
||||
title: '<title>'
|
||||
labels: ['✨ Feature']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> [!WARNING]
|
||||
> If you want to request a feature for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
@@ -22,3 +27,11 @@ body:
|
||||
- High (App breaking feature)
|
||||
validations:
|
||||
required: true
|
||||
- type: checkboxes
|
||||
id: idiot-check
|
||||
attributes:
|
||||
label: Please tick the boxes
|
||||
description: Before submitting, please ensure that
|
||||
options:
|
||||
- label: You are **NOT** using a version superior to v1. if that is the case, please fill this issue on the new repository.
|
||||
required: true
|
||||
|
||||
5
.github/ISSUE_TEMPLATE/idea.yml
vendored
5
.github/ISSUE_TEMPLATE/idea.yml
vendored
@@ -3,6 +3,11 @@ description: Tell us your idea! We may implement it.
|
||||
title: '<title>'
|
||||
labels: ['🤔 Idea']
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> [!WARNING]
|
||||
> If you have an idea for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
|
||||
5
.github/ISSUE_TEMPLATE/module.yml
vendored
5
.github/ISSUE_TEMPLATE/module.yml
vendored
@@ -2,6 +2,11 @@ name: 🏗️ Module request
|
||||
description: Request for a module to be added / an integration with you favourite service !
|
||||
title: '<title>'
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> [!WARNING]
|
||||
> If you want to request a new integration for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
|
||||
- type: textarea
|
||||
id: name
|
||||
attributes:
|
||||
|
||||
2
.github/workflows/greetings.yml
vendored
2
.github/workflows/greetings.yml
vendored
@@ -12,5 +12,5 @@ jobs:
|
||||
- uses: actions/first-interaction@v1
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
issue-message: "Hi 👋. Thank you for submitting your first issue to Homarr. Please ensure that you've provided all nessesary information. You can use the three dots > Edit button to update your post with additional images and information. Depending on the current volume of requests, the team should get in conact with you shortly."
|
||||
issue-message: "Hi 👋. Thank you for submitting your first issue to Homarr. Please ensure that you've opened this issue on the correct repository. Homarr v1 has been moved to github.com/homarr-labs/homarr "
|
||||
pr-message: "Hi 👋. Thank you for making your first contribution to Homarr. Please ensure that you've completed all the points in the TODO checklist. We'll review your changes shortly."
|
||||
|
||||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -11,7 +11,7 @@
|
||||
"layout.manage.navigation.**",
|
||||
],
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": true
|
||||
"source.organizeImports": "explicit"
|
||||
},
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"explorer.fileNesting.patterns": {
|
||||
|
||||
@@ -52,7 +52,7 @@ EXPOSE $PORT
|
||||
ENV PORT=${PORT}
|
||||
|
||||
ENV DATABASE_URL "file:/data/db.sqlite"
|
||||
ENV NEXTAUTH_URL "http://localhost:7575"
|
||||
ENV AUTH_TRUST_HOST="true"
|
||||
ENV PORT 7575
|
||||
ENV NEXTAUTH_SECRET NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED
|
||||
|
||||
|
||||
105
Dockerfile.unraid
Normal file
105
Dockerfile.unraid
Normal file
@@ -0,0 +1,105 @@
|
||||
# Multi-stage Dockerfile for Homarr Unraid UI
|
||||
# Builds entirely inside Docker to avoid native module issues
|
||||
|
||||
# Build stage
|
||||
FROM node:20.2.0-slim AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Install build dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
python3 \
|
||||
make \
|
||||
g++ \
|
||||
git \
|
||||
openssl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy package files
|
||||
COPY package.json yarn.lock ./
|
||||
COPY .yarnrc.yml ./
|
||||
COPY .yarn ./.yarn
|
||||
|
||||
# Install dependencies
|
||||
RUN yarn install --immutable
|
||||
|
||||
# Copy source code
|
||||
COPY . .
|
||||
|
||||
# Build the application
|
||||
ENV SKIP_ENV_VALIDATION=1
|
||||
ENV NEXTAUTH_SECRET=build-time-secret
|
||||
ENV DATABASE_URL=file:build.sqlite
|
||||
RUN yarn build
|
||||
|
||||
# Production stage
|
||||
FROM node:20.2.0-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Define node.js environment variables
|
||||
ARG PORT=7575
|
||||
|
||||
ENV NEXT_TELEMETRY_DISABLED=1
|
||||
ENV NODE_ENV=production
|
||||
ENV NODE_OPTIONS='--no-experimental-fetch'
|
||||
|
||||
# Copy built application from builder
|
||||
COPY --from=builder /app/next.config.js ./
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder /app/package.json ./temp_package.json
|
||||
COPY --from=builder /app/yarn.lock ./temp_yarn.lock
|
||||
COPY --from=builder /app/.next/standalone ./
|
||||
COPY --from=builder /app/.next/static ./.next/static
|
||||
COPY --from=builder /app/scripts/run.sh ./scripts/run.sh
|
||||
COPY --from=builder /app/drizzle ./drizzle
|
||||
COPY --from=builder /app/drizzle/migrate ./migrate
|
||||
COPY --from=builder /app/tsconfig.json ./migrate/tsconfig.json
|
||||
COPY --from=builder /app/cli ./cli
|
||||
|
||||
RUN chmod +x ./scripts/run.sh
|
||||
RUN mkdir -p /data
|
||||
|
||||
# Install runtime dependencies
|
||||
RUN apt-get update && apt-get install -y openssl wget && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Move node_modules to temp location to avoid overwriting
|
||||
RUN mv node_modules _node_modules
|
||||
RUN rm package.json
|
||||
|
||||
# Install dependencies for migration
|
||||
RUN cp ./migrate/package.json ./package.json
|
||||
RUN yarn install --production=false
|
||||
|
||||
# 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 || true
|
||||
|
||||
# Copy node_modules for migration to migrate folder
|
||||
RUN mv node_modules ./migrate/node_modules
|
||||
|
||||
# Restore app node_modules
|
||||
RUN mv _node_modules node_modules
|
||||
|
||||
# Setup CLI
|
||||
RUN echo '#!/bin/bash\nnode /app/cli/cli.js "$@"' > /usr/bin/homarr
|
||||
RUN chmod +x /usr/bin/homarr
|
||||
RUN cd /app/cli && yarn install --production || true
|
||||
|
||||
# Expose the default application port
|
||||
EXPOSE $PORT
|
||||
ENV PORT=${PORT}
|
||||
|
||||
# Environment defaults
|
||||
ENV DATABASE_URL="file:/data/db.sqlite"
|
||||
ENV AUTH_TRUST_HOST="true"
|
||||
ENV PORT=7575
|
||||
ENV NEXTAUTH_SECRET=NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=10s --timeout=5s --start-period=5s --retries=3 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:${PORT} || exit 1
|
||||
|
||||
VOLUME [ "/app/data/configs" ]
|
||||
VOLUME [ "/data" ]
|
||||
|
||||
ENTRYPOINT ["sh", "./scripts/run.sh"]
|
||||
24
README.md
24
README.md
@@ -1,6 +1,5 @@
|
||||
|
||||
<!-- Project Title -->
|
||||

|
||||
[](https://homarr.dev/)
|
||||
|
||||
<!-- Badges -->
|
||||
<p align="center">
|
||||
@@ -25,7 +24,7 @@
|
||||
<strong>Demo ✨</strong>
|
||||
</a>
|
||||
•
|
||||
<a href="https://homarr.dev/docs/getting-started/installation/">
|
||||
<a href="https://homarr.dev/docs/getting-started/">
|
||||
<strong>Install 💻</strong>
|
||||
</a> •
|
||||
<a href="https://translate.homarr.dev/">
|
||||
@@ -41,7 +40,14 @@ Simplify the management of your server with Homarr - a sleek, modern dashboard t
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
|
||||
> [!IMPORTANT]
|
||||
> # The Homarr repository has been moved to [HomarrLabs](https://github.com/homarr-labs/homarr)
|
||||
> # Please create issues related to 1.0 there. This repository will be archived once the 1.0 is fully polished.
|
||||
> # 1.0 is a complete rewrite and to migrate you have to change your compose file. Please follow the [Migration Guide](https://homarr.dev/blog/2025/01/19/migration-guide-1.0) and read the [Breaking Changes](https://homarr.dev/blog/2024/09/23/version-1.0#breaking-changes)
|
||||
|
||||
|
||||
[](https://homarr.dev/)
|
||||
|
||||
- 🖌️ Highly customizable with an extensive drag and drop grid system
|
||||
- ✨ Integrates seamlessly with your favorite self-hosted applications
|
||||
@@ -57,7 +63,7 @@ Simplify the management of your server with Homarr - a sleek, modern dashboard t
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
[](https://homarr.dev/docs/category/widgets)
|
||||
|
||||
Homarr has a [built-in collection of widgets and integrations](https://homarr.dev/docs/category/integrations), that connect to your applications and enable you to control them directly from the dashboard.
|
||||
Each widget and integration has a comprehensive documentation
|
||||
@@ -99,25 +105,25 @@ We're constantly adding new integrations and widgets, which will enhance your ex
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
[](https://demo.homarr.dev/)
|
||||
|
||||
https://user-images.githubusercontent.com/30572287/217098893-5880e7de-13d0-42c5-b505-f7921593396f.mp4
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
[](https://homarr.dev/docs/category/installation-1)
|
||||
|
||||
Since we are updating Homarr very frequently, we recommend reading our official installation guides:
|
||||
|
||||
<a href="https://homarr.dev/docs/getting-started/installation/">
|
||||
<a href="https://homarr.dev/docs/category/installation-1">
|
||||
<img src="docs/installation-button.png" width="200" />
|
||||
</a>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||

|
||||
[](https://github.com/ajnart/homarr/blob/dev/CONTRIBUTING.md)
|
||||
Homarr is maintained by motivated developers in their free-time.
|
||||
We work for fun and learning on this project.
|
||||
|
||||
|
||||
@@ -432,7 +432,7 @@
|
||||
"type": "notebook",
|
||||
"properties": {
|
||||
"showToolbar": true,
|
||||
"content": "<h2><strong>Welcome to Homarr 🚀👋</strong></h2><p>We're glad that you're here! Homarr is a <em>modern </em>and <em>easy to use</em> dashboard that helps you to <strong>organize and manage</strong> your home network from one place. Control is <strong>at your fingertips</strong>.</p><p>We recommend you to read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev/docs/introduction/after-the-installation\">getting started guide</a> 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 <code>Add tile</code> button at the top right and select <code>App</code>. 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 <strong>must exit edit mode to save your board</strong>. Adding widgets works the same way but may require additional configuration - read the documentation for more information.</p><p>To remove this widget, you must log in to your administrator account and click on the menu to delete it.</p><p><strong><u>Your TODO list:</u></strong></p><ul data-type=\"taskList\"><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev\">documentation</a></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add your <em>first app</em></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p><em>Resize </em>and <em>drag</em> your app to a different position</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add the <em>clock widget</em> to your dashboard</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Create a <em>new user</em></p></div></li></ul>"
|
||||
"content": "<h2><strong>Welcome to Homarr 🚀👋</strong></h2><p>We're glad that you're here! Homarr is a <em>modern </em>and <em>easy to use</em> dashboard that helps you to <strong>organize and manage</strong> your home network from one place. Control is <strong>at your fingertips</strong>.</p><p>We recommend you to read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev/docs/getting-started/after-the-installation\">getting started guide</a> 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 <code>Add tile</code> button at the top right and select <code>App</code>. 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 <strong>must exit edit mode to save your board</strong>. Adding widgets works the same way but may require additional configuration - read the documentation for more information.</p><p>To remove this widget, you must log in to your administrator account and click on the menu to delete it.</p><p><strong><u>Your TODO list:</u></strong></p><ul data-type=\"taskList\"><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev\">documentation</a></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add your <em>first app</em></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p><em>Resize </em>and <em>drag</em> your app to a different position</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add the <em>clock widget</em> to your dashboard</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Create a <em>new user</em></p></div></li></ul>"
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
@@ -510,4 +510,4 @@
|
||||
"allowGuests": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
42
docker-compose.unraid.yml
Normal file
42
docker-compose.unraid.yml
Normal file
@@ -0,0 +1,42 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
unmarr:
|
||||
image: git.xtrm-lab.org/jazzymc/homarr:latest
|
||||
container_name: unmarr
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
# Unraid API Configuration
|
||||
- UNRAID_HOST=192.168.10.20
|
||||
- UNRAID_API_KEY=${UNRAID_API_KEY}
|
||||
- UNRAID_USE_SSL=false
|
||||
- UNRAID_PORT=80
|
||||
# App Configuration
|
||||
- TZ=Europe/Sofia
|
||||
- DATABASE_URL=file:/data/db.sqlite
|
||||
- AUTH_TRUST_HOST=true
|
||||
- NEXTAUTH_URL=https://unmarr.xtrm-lab.org
|
||||
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET:-changeme}
|
||||
volumes:
|
||||
- /mnt/user/appdata/unmarr/data:/data
|
||||
- /mnt/user/appdata/unmarr/configs:/app/data/configs
|
||||
networks:
|
||||
dockerproxy:
|
||||
ipv4_address: 172.18.0.5
|
||||
labels:
|
||||
# Traefik
|
||||
- "traefik.enable=true"
|
||||
- "traefik.constraint=valid"
|
||||
- "traefik.http.routers.unmarr.rule=Host(`unmarr.xtrm-lab.org`)"
|
||||
- "traefik.http.routers.unmarr.entrypoints=https"
|
||||
- "traefik.http.routers.unmarr.tls=true"
|
||||
- "traefik.http.routers.unmarr.tls.certresolver=cloudflare"
|
||||
- "traefik.http.services.unmarr.loadbalancer.server.port=7575"
|
||||
# Unraid
|
||||
- "net.unraid.docker.managed=true"
|
||||
- "net.unraid.docker.icon=https://homarr.dev/img/logo.png"
|
||||
- "net.unraid.docker.webui=https://unmarr.xtrm-lab.org"
|
||||
|
||||
networks:
|
||||
dockerproxy:
|
||||
external: true
|
||||
148
docs/unraid-ui-project/README.md
Normal file
148
docs/unraid-ui-project/README.md
Normal file
@@ -0,0 +1,148 @@
|
||||
# Unraid Custom UI Project
|
||||
|
||||
This project transforms the Homarr fork into a custom Unraid management UI with an Orchis GTK theme.
|
||||
|
||||
## Project Goals
|
||||
|
||||
1. **Step 1**: Recreate all current Unraid WebGUI pages using Homarr as a base, with data from the Unraid GraphQL API
|
||||
2. **Step 2**: Apply a custom theme based on the Orchis GTK theme
|
||||
|
||||
## Project Resources
|
||||
|
||||
| Document | Description |
|
||||
|----------|-------------|
|
||||
| [WEBGUI-COMPLETE-INVENTORY.md](./WEBGUI-COMPLETE-INVENTORY.md) | Complete inventory of ~100 Unraid WebGUI pages |
|
||||
| [unraid-api-research.md](./unraid-api-research.md) | Unraid GraphQL API documentation |
|
||||
| [homarr-architecture.md](./homarr-architecture.md) | Homarr codebase architecture |
|
||||
| [orchis-design-system.ts](./orchis-design-system.ts) | Orchis theme design tokens (TypeScript) |
|
||||
|
||||
## Unraid Server Connection
|
||||
|
||||
- **GraphQL Endpoint**: `http://192.168.10.20/graphql`
|
||||
- **Auth**: `x-api-key` header
|
||||
- **Socket**: `/var/run/unraid-api.sock`
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
### Phase 1: Foundation Setup
|
||||
- [ ] Create Unraid GraphQL client integration
|
||||
- [ ] Set up API authentication layer
|
||||
- [ ] Configure environment variables for Unraid connection
|
||||
- [ ] Create base types for Unraid data models
|
||||
|
||||
### Phase 2: Core Pages (Priority Order)
|
||||
1. **Dashboard** - System overview with real-time metrics
|
||||
- System info, CPU/RAM usage, array status
|
||||
- Docker/VM summaries, network, UPS
|
||||
|
||||
2. **Array Management** (Main)
|
||||
- Array devices, pool devices, boot device
|
||||
- Parity check, array operations
|
||||
|
||||
3. **Docker Management**
|
||||
- Container list, start/stop/restart
|
||||
- Container details, logs
|
||||
|
||||
4. **VM Management**
|
||||
- VM list, power controls
|
||||
- VM details, console access
|
||||
|
||||
5. **Shares**
|
||||
- User shares, disk shares
|
||||
- Share settings, SMB/NFS security
|
||||
|
||||
### Phase 3: Orchis Theme Integration
|
||||
- [ ] Copy design tokens to `src/styles/`
|
||||
- [ ] Create Mantine theme override with Orchis values
|
||||
- [ ] Implement light/dark mode with Orchis palettes
|
||||
- [ ] Replace default components with Orchis-styled versions
|
||||
|
||||
### Phase 4: Settings & Tools
|
||||
- Settings pages (identification, disk, network, etc.)
|
||||
- Tools pages (syslog, diagnostics, system devices)
|
||||
- User management
|
||||
- Notifications system
|
||||
|
||||
### Phase 5: Real-time Features
|
||||
- GraphQL subscriptions for CPU/memory metrics
|
||||
- Nchan integration for legacy real-time features
|
||||
- WebSocket connections for live updates
|
||||
|
||||
## Key Technical Decisions
|
||||
|
||||
### Homarr Stack
|
||||
- Next.js 13 (Pages Router in this version)
|
||||
- Mantine UI v6
|
||||
- tRPC for type-safe API
|
||||
- Zustand for state management
|
||||
- React Query for server state
|
||||
|
||||
### Data Sources
|
||||
| Feature | Source |
|
||||
|---------|--------|
|
||||
| System info, array, shares | Unraid GraphQL API |
|
||||
| Docker containers | Unraid GraphQL API |
|
||||
| VMs | Unraid GraphQL API |
|
||||
| Real-time CPU/RAM | GraphQL Subscriptions |
|
||||
| Real-time disk I/O | Nchan WebSocket (`/sub/diskload`) |
|
||||
| Legacy features | PHP endpoints where needed |
|
||||
|
||||
### API Gaps (Require Legacy Endpoints)
|
||||
- Docker create/delete/restart/logs
|
||||
- VM create/delete
|
||||
- Share CRUD, User CRUD
|
||||
- System reboot/shutdown
|
||||
- Mover operations
|
||||
|
||||
## Directory Structure (New Files)
|
||||
|
||||
```
|
||||
src/
|
||||
├── lib/
|
||||
│ └── unraid/
|
||||
│ ├── client.ts # GraphQL client
|
||||
│ ├── types.ts # TypeScript types
|
||||
│ └── queries/ # GraphQL queries
|
||||
├── pages/
|
||||
│ └── unraid/
|
||||
│ ├── dashboard.tsx # Dashboard page
|
||||
│ ├── array/ # Array pages
|
||||
│ ├── docker/ # Docker pages
|
||||
│ ├── vms/ # VM pages
|
||||
│ ├── shares/ # Share pages
|
||||
│ ├── settings/ # Settings pages
|
||||
│ └── tools/ # Tools pages
|
||||
├── components/
|
||||
│ └── unraid/
|
||||
│ ├── Dashboard/ # Dashboard components
|
||||
│ ├── Array/ # Array components
|
||||
│ ├── Docker/ # Docker components
|
||||
│ └── ...
|
||||
└── styles/
|
||||
└── orchis/
|
||||
├── theme.ts # Mantine theme config
|
||||
├── variables.css # CSS custom properties
|
||||
└── components.css # Component overrides
|
||||
```
|
||||
|
||||
## Getting Started
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
yarn install
|
||||
|
||||
# Set up environment
|
||||
cp .env.example .env.local
|
||||
# Edit .env.local with your Unraid API key
|
||||
|
||||
# Run development server
|
||||
yarn dev
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
```env
|
||||
UNRAID_HOST=192.168.10.20
|
||||
UNRAID_API_KEY=your-api-key-here
|
||||
UNRAID_USE_SSL=false
|
||||
```
|
||||
1505
docs/unraid-ui-project/WEBGUI-COMPLETE-INVENTORY.md
Normal file
1505
docs/unraid-ui-project/WEBGUI-COMPLETE-INVENTORY.md
Normal file
File diff suppressed because it is too large
Load Diff
60
docs/unraid-ui-project/homarr-architecture.md
Normal file
60
docs/unraid-ui-project/homarr-architecture.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# Homarr Architecture
|
||||
|
||||
## Tech Stack
|
||||
- Next.js 13+ (App Router), React 18, TypeScript
|
||||
- Mantine UI (component library)
|
||||
- Zustand (client state), React Query (server state)
|
||||
- Prisma ORM (SQLite default / PostgreSQL)
|
||||
- Turbo monorepo, pnpm workspaces
|
||||
|
||||
## Project Structure
|
||||
```
|
||||
homarr/
|
||||
├── apps/web/src/ # Main Next.js app
|
||||
│ ├── app/ # App Router pages
|
||||
│ ├── components/ # React components
|
||||
│ ├── modules/ # Widgets & integrations
|
||||
│ ├── stores/ # Zustand stores
|
||||
│ └── styles/ # Themes & global CSS
|
||||
├── packages/
|
||||
│ ├── api-client/ # API client lib
|
||||
│ ├── common/ # Shared types/utils
|
||||
│ ├── definitions/ # Widget/integration defs
|
||||
│ ├── auth/ # Auth logic
|
||||
│ └── ui/ # Shared UI components
|
||||
├── prisma/ # DB schema & migrations
|
||||
└── turbo.json
|
||||
```
|
||||
|
||||
## Widget System
|
||||
Each widget in `apps/web/src/modules/`:
|
||||
- `definition.ts` - Metadata + Zod config schema
|
||||
- `component.tsx` - React component
|
||||
- `settings.tsx` - Config panel
|
||||
- `server-actions.ts` - Backend operations
|
||||
- Registered in module index, auto-discovered
|
||||
|
||||
## Integration System
|
||||
External service connectors with:
|
||||
- API client abstraction, credential management
|
||||
- URL/hostname config, SSL handling
|
||||
- Error handling, retry, rate limiting, caching
|
||||
|
||||
## Theming
|
||||
- CSS variables + Mantine theming + Tailwind
|
||||
- Light/dark mode, custom color palettes, accent colors
|
||||
- Wallpaper/background, font size, border radius customization
|
||||
- Theme persisted in database
|
||||
|
||||
## Adding New Pages
|
||||
1. Create in `apps/web/src/app/(group)/page-name/page.tsx`
|
||||
2. Use Mantine UI components
|
||||
3. Add API routes in `src/app/api/`
|
||||
4. Create Zustand store or use React Query
|
||||
5. Update navigation config
|
||||
|
||||
## Key Patterns
|
||||
- Server Components by default, `'use client'` for interactive
|
||||
- TRPC for type-safe RPC
|
||||
- Zod schemas for validation
|
||||
- Prisma for DB operations
|
||||
1329
docs/unraid-ui-project/orchis-design-system.ts
Normal file
1329
docs/unraid-ui-project/orchis-design-system.ts
Normal file
File diff suppressed because it is too large
Load Diff
81
docs/unraid-ui-project/unraid-api-research.md
Normal file
81
docs/unraid-ui-project/unraid-api-research.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# Unraid API Research (Live from XTRM-Unraid v7.2.3)
|
||||
|
||||
## API: unraid-api v4.29.2 (NestJS + Apollo GraphQL)
|
||||
|
||||
### Connection
|
||||
- HTTP: `http://192.168.10.20/graphql`
|
||||
- WebSocket: `ws://192.168.10.20/graphql` (graphql-ws protocol)
|
||||
- Unix socket: `/var/run/unraid-api.sock`
|
||||
- Auth: `x-api-key` header
|
||||
|
||||
### GraphQL Queries
|
||||
| Query | Description |
|
||||
|-------|-------------|
|
||||
| `info` | System info (cpu, memory, os, baseboard, devices, display, versions) |
|
||||
| `array` | Array state, capacity, disks, parities, caches, parity check status |
|
||||
| `disks` / `disk(id)` | Physical disks with SMART status, temp, serial |
|
||||
| `docker` | Containers (id, names, state, status, image, ports, autoStart) + networks |
|
||||
| `vms` | VMs (id, name, state) |
|
||||
| `shares` | Shares (name, free, used, size, include, exclude, cache, color) |
|
||||
| `notifications` | Notifications (title, subject, description, importance, type, timestamp) |
|
||||
| `vars` | Server variables (version, name, timezone, network, SMB/NFS settings) |
|
||||
| `services` | Running services (name, online, uptime, version) |
|
||||
| `flash` | Flash drive (guid, vendor, product) |
|
||||
| `registration` | License (type, state, keyFile, expiration) |
|
||||
| `network` | Network info (accessUrls) |
|
||||
| `server` | Server details (owner, guid, wanip, lanip, localurl, remoteurl) |
|
||||
| `connect` | Connect status (dynamicRemoteAccess, settings) |
|
||||
| `plugins` | Installed plugins (name, version) |
|
||||
| `logFiles` / `logFile(path)` | Log file listing and content |
|
||||
| `upsDevices` / `upsConfiguration` | UPS monitoring |
|
||||
| `apiKeys` | API key management |
|
||||
| `customization` | Theme + activation code |
|
||||
| `me` / `owner` | Current user / server owner |
|
||||
|
||||
### GraphQL Mutations
|
||||
| Mutation | Description |
|
||||
|----------|-------------|
|
||||
| `array.setState` | Start/stop array |
|
||||
| `array.addDiskToArray` / `removeDiskFromArray` | Disk management |
|
||||
| `array.mountArrayDisk` / `unmountArrayDisk` | Mount/unmount |
|
||||
| `docker.start(id)` / `docker.stop(id)` | Container start/stop |
|
||||
| `vm.start/stop/pause/resume/forceStop/reboot/reset(id)` | VM power management |
|
||||
| `parityCheck.start/pause/resume/cancel` | Parity check control |
|
||||
| `notification.create/delete/archive/unread` | Notification CRUD |
|
||||
| `apiKey.create/update/delete` | API key management |
|
||||
| `customization.setTheme` | Theme switching |
|
||||
| `connectSignIn/SignOut` | Unraid Connect |
|
||||
| `setupRemoteAccess` | Remote access config |
|
||||
|
||||
### GraphQL Subscriptions (Real-time)
|
||||
- `systemMetricsCpu` / `systemMetricsCpuTelemetry` / `systemMetricsMemory`
|
||||
- `arraySubscription` / `parityHistorySubscription`
|
||||
- `notificationAdded` / `notificationsOverview`
|
||||
- `logFile` (live log streaming)
|
||||
- `upsUpdates`
|
||||
- `ownerSubscription` / `serversSubscription`
|
||||
|
||||
### Enums
|
||||
- ArrayState: STARTED, STOPPED, NEW_ARRAY, RECON_DISK, DISABLE_DISK, etc.
|
||||
- ArrayDiskStatus: DISK_NP, DISK_OK, DISK_INVALID, DISK_WRONG, DISK_DSBL, etc.
|
||||
- ArrayDiskType: DATA, PARITY, FLASH, CACHE
|
||||
- ContainerState: RUNNING, EXITED
|
||||
- VmState: NOSTATE, RUNNING, IDLE, PAUSED, SHUTDOWN, SHUTOFF, CRASHED, PMSUSPENDED
|
||||
- DiskFsType: XFS, BTRFS, VFAT, ZFS, EXT4, NTFS
|
||||
- DiskInterfaceType: SAS, SATA, USB, PCIE, UNKNOWN
|
||||
- ThemeName: azure, black, gray, white
|
||||
|
||||
### Legacy PHP/Nchan Endpoints
|
||||
- Nchan WebSocket channels: `/sub/var`, `/sub/docker`, `/sub/update1-3`, `/sub/diskload`, etc.
|
||||
- PHP includes: DashboardApps.php, Control.php, SmartInfo.php, Syslog.php, etc.
|
||||
- State INI files at `/var/local/emhttp/`: var.ini, disks.ini, shares.ini, etc.
|
||||
- Legacy control: POST to `/update.htm` for commands
|
||||
|
||||
### NOT Available via GraphQL
|
||||
- Docker create/delete/restart/logs
|
||||
- VM create/delete
|
||||
- Share CRUD, User CRUD
|
||||
- Detailed SMART attributes
|
||||
- Disk format/clear, spin up/down
|
||||
- System reboot/shutdown
|
||||
- Mover operations
|
||||
10
drizzle/0001_brave_mimic.sql
Normal file
10
drizzle/0001_brave_mimic.sql
Normal file
@@ -0,0 +1,10 @@
|
||||
CREATE TABLE `migrate_token` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`token` text NOT NULL,
|
||||
`boards` integer NOT NULL,
|
||||
`users` integer NOT NULL,
|
||||
`integrations` integer NOT NULL,
|
||||
`expires` integer NOT NULL
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `migrate_token_token_unique` ON `migrate_token` (`token`);
|
||||
527
drizzle/meta/0001_snapshot.json
Normal file
527
drizzle/meta/0001_snapshot.json
Normal file
@@ -0,0 +1,527 @@
|
||||
{
|
||||
"version": "5",
|
||||
"dialect": "sqlite",
|
||||
"id": "9c8971c9-6d33-4d14-b318-b19ff9fbb88f",
|
||||
"prevId": "32c1bc91-e69f-4e1d-b53c-9c43f2e6c9d3",
|
||||
"tables": {
|
||||
"account": {
|
||||
"name": "account",
|
||||
"columns": {
|
||||
"userId": {
|
||||
"name": "userId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"type": {
|
||||
"name": "type",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"provider": {
|
||||
"name": "provider",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"providerAccountId": {
|
||||
"name": "providerAccountId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"refresh_token": {
|
||||
"name": "refresh_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"access_token": {
|
||||
"name": "access_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires_at": {
|
||||
"name": "expires_at",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token_type": {
|
||||
"name": "token_type",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"scope": {
|
||||
"name": "scope",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"id_token": {
|
||||
"name": "id_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"session_state": {
|
||||
"name": "session_state",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"userId_idx": {
|
||||
"name": "userId_idx",
|
||||
"columns": [
|
||||
"userId"
|
||||
],
|
||||
"isUnique": false
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"account_userId_user_id_fk": {
|
||||
"name": "account_userId_user_id_fk",
|
||||
"tableFrom": "account",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"userId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {
|
||||
"account_provider_providerAccountId_pk": {
|
||||
"columns": [
|
||||
"provider",
|
||||
"providerAccountId"
|
||||
]
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"invite": {
|
||||
"name": "invite",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token": {
|
||||
"name": "token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"created_by_id": {
|
||||
"name": "created_by_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"invite_token_unique": {
|
||||
"name": "invite_token_unique",
|
||||
"columns": [
|
||||
"token"
|
||||
],
|
||||
"isUnique": true
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"invite_created_by_id_user_id_fk": {
|
||||
"name": "invite_created_by_id_user_id_fk",
|
||||
"tableFrom": "invite",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"created_by_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"migrate_token": {
|
||||
"name": "migrate_token",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token": {
|
||||
"name": "token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"boards": {
|
||||
"name": "boards",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"users": {
|
||||
"name": "users",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"integrations": {
|
||||
"name": "integrations",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"migrate_token_token_unique": {
|
||||
"name": "migrate_token_token_unique",
|
||||
"columns": [
|
||||
"token"
|
||||
],
|
||||
"isUnique": true
|
||||
}
|
||||
},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"session": {
|
||||
"name": "session",
|
||||
"columns": {
|
||||
"sessionToken": {
|
||||
"name": "sessionToken",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"userId": {
|
||||
"name": "userId",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
"user_id_idx": {
|
||||
"name": "user_id_idx",
|
||||
"columns": [
|
||||
"userId"
|
||||
],
|
||||
"isUnique": false
|
||||
}
|
||||
},
|
||||
"foreignKeys": {
|
||||
"session_userId_user_id_fk": {
|
||||
"name": "session_userId_user_id_fk",
|
||||
"tableFrom": "session",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"userId"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"user_setting": {
|
||||
"name": "user_setting",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"user_id": {
|
||||
"name": "user_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"color_scheme": {
|
||||
"name": "color_scheme",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'environment'"
|
||||
},
|
||||
"language": {
|
||||
"name": "language",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'en'"
|
||||
},
|
||||
"default_board": {
|
||||
"name": "default_board",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'default'"
|
||||
},
|
||||
"first_day_of_week": {
|
||||
"name": "first_day_of_week",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'monday'"
|
||||
},
|
||||
"search_template": {
|
||||
"name": "search_template",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": "'https://google.com/search?q=%s'"
|
||||
},
|
||||
"open_search_in_new_tab": {
|
||||
"name": "open_search_in_new_tab",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": true
|
||||
},
|
||||
"disable_ping_pulse": {
|
||||
"name": "disable_ping_pulse",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"replace_ping_with_icons": {
|
||||
"name": "replace_ping_with_icons",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"use_debug_language": {
|
||||
"name": "use_debug_language",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"auto_focus_search": {
|
||||
"name": "auto_focus_search",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"user_setting_user_id_user_id_fk": {
|
||||
"name": "user_setting_user_id_user_id_fk",
|
||||
"tableFrom": "user_setting",
|
||||
"tableTo": "user",
|
||||
"columnsFrom": [
|
||||
"user_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"user": {
|
||||
"name": "user",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "text",
|
||||
"primaryKey": true,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"email": {
|
||||
"name": "email",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"emailVerified": {
|
||||
"name": "emailVerified",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"image": {
|
||||
"name": "image",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"password": {
|
||||
"name": "password",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"salt": {
|
||||
"name": "salt",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"autoincrement": false
|
||||
},
|
||||
"is_admin": {
|
||||
"name": "is_admin",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
},
|
||||
"is_owner": {
|
||||
"name": "is_owner",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false,
|
||||
"default": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"verificationToken": {
|
||||
"name": "verificationToken",
|
||||
"columns": {
|
||||
"identifier": {
|
||||
"name": "identifier",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"token": {
|
||||
"name": "token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
},
|
||||
"expires": {
|
||||
"name": "expires",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true,
|
||||
"autoincrement": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {
|
||||
"verificationToken_identifier_token_pk": {
|
||||
"columns": [
|
||||
"identifier",
|
||||
"token"
|
||||
]
|
||||
}
|
||||
},
|
||||
"uniqueConstraints": {}
|
||||
}
|
||||
},
|
||||
"enums": {},
|
||||
"_meta": {
|
||||
"schemas": {},
|
||||
"tables": {},
|
||||
"columns": {}
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,13 @@
|
||||
"when": 1695874816934,
|
||||
"tag": "0000_supreme_the_captain",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 1,
|
||||
"version": "5",
|
||||
"when": 1730643218521,
|
||||
"tag": "0001_brave_mimic",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,14 +1,14 @@
|
||||
// This file is used to migrate the database to the current version
|
||||
// It is run when the docker container starts
|
||||
import Database from 'better-sqlite3';
|
||||
import dotenv from 'dotenv';
|
||||
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
||||
import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
|
||||
const Database = require('better-sqlite3');
|
||||
const path = require('path');
|
||||
const dotenv = require('dotenv');
|
||||
const { drizzle } = require('drizzle-orm/better-sqlite3');
|
||||
const { migrate } = require('drizzle-orm/better-sqlite3/migrator');
|
||||
|
||||
const migrationsFolder = process.argv[2] ?? '../drizzle';
|
||||
|
||||
dotenv.config({ path: __dirname + '/../.env' });
|
||||
|
||||
dotenv.config({ path: path.join(__dirname, '/../.env') });
|
||||
const sqlite = new Database(process.env.DATABASE_URL!.replace('file:', ''));
|
||||
|
||||
const db = drizzle(sqlite);
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
"license": "MIT",
|
||||
"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"
|
||||
"db:migrate": "tsx ./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",
|
||||
"tsx": "4.19.1",
|
||||
"typescript": "^5.2.2"
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,9 @@ const withBundleAnalyzer = require('@next/bundle-analyzer')({
|
||||
});
|
||||
|
||||
module.exports = withBundleAnalyzer({
|
||||
eslint: {
|
||||
ignoreDuringBuilds: true,
|
||||
},
|
||||
webpack: (config) => {
|
||||
// for dynamic loading of auth providers
|
||||
config.experiments = { ...config.experiments, topLevelAwait: true };
|
||||
@@ -21,7 +24,7 @@ module.exports = withBundleAnalyzer({
|
||||
redirects: async () => [
|
||||
{
|
||||
source: '/',
|
||||
destination: '/board',
|
||||
destination: '/unraid',
|
||||
permanent: false,
|
||||
},
|
||||
],
|
||||
|
||||
12
package.json
12
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "homarr",
|
||||
"version": "0.15.4",
|
||||
"version": "0.16.0",
|
||||
"description": "Homarr - A homepage for your server.",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
@@ -11,7 +11,7 @@
|
||||
"dev": "next dev",
|
||||
"build": "NEXTAUTH_SECRET=WILL_BE_OVERWRITTEN next build",
|
||||
"analyze": "ANALYZE=true next build",
|
||||
"turbo": "DATABASE_URL=file:WILL_BE_OVERWRITTEN.sqlite NEXTAUTH_URL=http://WILL_BE_OVERWRITTEN turbo build",
|
||||
"turbo": "DATABASE_URL=file:WILL_BE_OVERWRITTEN.sqlite turbo build",
|
||||
"start": "next start",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"export": "next build && next export",
|
||||
@@ -25,7 +25,8 @@
|
||||
"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": "dotenv ts-node drizzle/migrate/migrate.ts ./drizzle"
|
||||
"db:migrate": "dotenv tsx drizzle/migrate/migrate.ts ./drizzle",
|
||||
"db:add": "drizzle-kit generate:sqlite --config ./drizzle.config.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ctrl/deluge": "^4.1.0",
|
||||
@@ -126,7 +127,7 @@
|
||||
"@types/cookies": "^0.7.7",
|
||||
"@types/dockerode": "^3.3.9",
|
||||
"@types/ldapjs": "^3.0.2",
|
||||
"@types/node": "18.17.8",
|
||||
"@types/node": "^20.6.0",
|
||||
"@types/prismjs": "^1.26.0",
|
||||
"@types/react": "^18.2.11",
|
||||
"@types/swagger-ui-react": "^4.18.3",
|
||||
@@ -151,7 +152,7 @@
|
||||
"node-mocks-http": "^1.12.2",
|
||||
"prettier": "^3.0.0",
|
||||
"sass": "^1.56.1",
|
||||
"ts-node": "latest",
|
||||
"tsx": "4.19.1",
|
||||
"turbo": "^1.10.12",
|
||||
"typescript": "5.1.6",
|
||||
"video.js": "^8.0.3",
|
||||
@@ -186,7 +187,6 @@
|
||||
"importOrderSortSpecifiers": true
|
||||
},
|
||||
"eslintConfig": {
|
||||
"ignoreDuringBuilds": true,
|
||||
"extends": [
|
||||
"next",
|
||||
"eslint:recommended",
|
||||
|
||||
BIN
public/PoetsenOne-Regular.ttf
Normal file
BIN
public/PoetsenOne-Regular.ttf
Normal file
Binary file not shown.
BIN
public/imgs/2340450-2.png
Normal file
BIN
public/imgs/2340450-2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 188 KiB |
@@ -26,7 +26,8 @@
|
||||
"title": "工具",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": "迁移到 1.0"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/cn/manage/migrate.json
Normal file
33
public/locales/cn/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "迁移到 1.0",
|
||||
"pageTitle": "迁移面板、组件和用户",
|
||||
"description": "将您的面板和用户导出到 ZIP 压缩包,以便在 1.0.0 版本之后将其迁移到 Homarr",
|
||||
"securityNote": {
|
||||
"title": "安全说明",
|
||||
"text": "导出用户和组件时,它还会打开一个带有加密密钥的窗口。此密钥是将数据导入 Homarr 所必需的。请妥善保管,不要与任何人分享。"
|
||||
},
|
||||
"form": {
|
||||
"label": "选择要导出的所有内容",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "导出面板"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "导出组件",
|
||||
"description": "这将包括用于组件的加密凭据。仅在导出面板时可用"
|
||||
},
|
||||
"users": {
|
||||
"label": "导出用户",
|
||||
"description": "这只会导出凭据用户,密码 hash 和 salt 已加密"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "导出数据"
|
||||
},
|
||||
"modal": {
|
||||
"title": "加密密钥",
|
||||
"description": "您的数据已导出。请妥善保管此密钥,不要与任何人共享。您需要此密钥才能将数据导入 Homarr。",
|
||||
"copyDismiss": "复制并关闭"
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "您的错误",
|
||||
"reportButton": "报告该错误"
|
||||
"text": "组件意外崩溃,请阅读文档并修改错误的输入。",
|
||||
"label": "发生错误",
|
||||
"reportButton": "在 GitHub 上报告此错误"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "crwdns3525:0crwdne3525:0",
|
||||
"items": {
|
||||
"docker": "crwdns3527:0crwdne3527:0",
|
||||
"api": "crwdns4172:0crwdne4172:0"
|
||||
"api": "crwdns4172:0crwdne4172:0",
|
||||
"migrate": "crwdns4536:0crwdne4536:0"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/cr/manage/migrate.json
Normal file
33
public/locales/cr/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "crwdns4506:0crwdne4506:0",
|
||||
"pageTitle": "crwdns4508:0crwdne4508:0",
|
||||
"description": "crwdns4510:0crwdne4510:0",
|
||||
"securityNote": {
|
||||
"title": "crwdns4512:0crwdne4512:0",
|
||||
"text": "crwdns4514:0crwdne4514:0"
|
||||
},
|
||||
"form": {
|
||||
"label": "crwdns4516:0crwdne4516:0",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "crwdns4518:0crwdne4518:0"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "crwdns4520:0crwdne4520:0",
|
||||
"description": "crwdns4522:0crwdne4522:0"
|
||||
},
|
||||
"users": {
|
||||
"label": "crwdns4524:0crwdne4524:0",
|
||||
"description": "crwdns4526:0crwdne4526:0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "crwdns4528:0crwdne4528:0"
|
||||
},
|
||||
"modal": {
|
||||
"title": "crwdns4530:0crwdne4530:0",
|
||||
"description": "crwdns4532:0crwdne4532:0",
|
||||
"copyDismiss": "crwdns4534:0crwdne4534:0"
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "crwdns2949:0crwdne2949:0",
|
||||
"label": "crwdns2741:0crwdne2741:0",
|
||||
"reportButton": "crwdns2743:0crwdne2743:0"
|
||||
"text": "crwdns4500:0crwdne4500:0",
|
||||
"label": "crwdns4502:0crwdne4502:0",
|
||||
"reportButton": "crwdns4504:0crwdne4504:0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Nástroje",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": "Přechod na verzi 1.0"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/cs/manage/migrate.json
Normal file
33
public/locales/cs/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "Přechod na verzi 1.0",
|
||||
"pageTitle": "Migrace ploch, integrací a uživatelů",
|
||||
"description": "Exportujete své plochy a uživatele do ZIP-Archivu, aby jste je mohli migrovat do Homarru po verzi 1.0.0",
|
||||
"securityNote": {
|
||||
"title": "Bezpečnostní poznámka",
|
||||
"text": "Při exportování uživatelů a integrací se otevře okno s šifrovacím klíčem. Tento klíč je vyžadován pro následovný import dat do Homarru. Uchovejte jej na bezpečném místě a s nikým jej nesdílejte."
|
||||
},
|
||||
"form": {
|
||||
"label": "Vyberte vše, co chcete exportovat",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "Exportovat plochy"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "Exportovat integrace",
|
||||
"description": "Toto bude obsahovat pouze zašifrované údaje pro integrace. Tato možnost je dostupná pouze při exportování ploch"
|
||||
},
|
||||
"users": {
|
||||
"label": "Exportovat uživatele",
|
||||
"description": "Toto exportuje pouze údaje uživatelů, hesla, hash a salt jsou zašifrovány"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "Exportovat data"
|
||||
},
|
||||
"modal": {
|
||||
"title": "Šifrovací klíč",
|
||||
"description": "Vaše data byla exportována. Uchovejte tento klíč v bezpečí a s nikým jej nesdílejte. Tento klíč budete potřebovat pro import dat do Homarru.",
|
||||
"copyDismiss": "Zkopírovat a zavřít"
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Vaše chyba",
|
||||
"reportButton": "Nahlásit tuto chybu"
|
||||
"text": "Widget se nečekaně zhroutil. Přečtěte si prosím dokumentaci a opravte případné překlepy.",
|
||||
"label": "Vyskytlá chyba",
|
||||
"reportButton": "Nahlásit tuto chybu na GitHubu"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Værktøjer",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": "Migrer til 1.0"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/da/manage/migrate.json
Normal file
33
public/locales/da/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "Migrer til 1.0",
|
||||
"pageTitle": "Migrér tavler, integrationer og brugere",
|
||||
"description": "Eksporterer dine tavler og brugere til et ZIP-arkiv for at migrere dem til Homarr efter version 1.0.0",
|
||||
"securityNote": {
|
||||
"title": "Sikkerhedsnote",
|
||||
"text": "Når du eksporterer brugere og integrationer, åbnes der også en modal med en krypteringsnøgle. Denne nøgle er nødvendig for at importere data til Homarr. Opbevar den sikkert, og del den ikke med nogen."
|
||||
},
|
||||
"form": {
|
||||
"label": "Vælg alt, hvad du vil eksportere",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "Eksporter tavler"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "Eksporter integrationer",
|
||||
"description": "Dette inkluderer krypterede legitimationsoplysninger til integrationer. Kun tilgængelig ved eksport af tavler"
|
||||
},
|
||||
"users": {
|
||||
"label": "Eksporter brugere",
|
||||
"description": "Dette vil kun eksportere brugere med legitimiation, adgangskoders hash og salt er krypteret"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "Eksport af data"
|
||||
},
|
||||
"modal": {
|
||||
"title": "Krypteringsnøgle",
|
||||
"description": "Dine data er blevet eksporteret. Opbevar denne nøgle sikkert, og del den ikke med nogen. Du skal bruge denne nøgle for at importere dataene til Homarr.",
|
||||
"copyDismiss": "Kopiér og afvis"
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Din fejl",
|
||||
"reportButton": "Rapportér denne fejl"
|
||||
"text": "Widgetten crashede uventet. Læs venligst dokumentationen og ret stavefejl.",
|
||||
"label": "Opstod en fejl",
|
||||
"reportButton": "Rapporter denne fejl på GitHub"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Werkzeuge",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": "Auf 1.0 migrieren"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"translators": "Übersetzer ({{count}})",
|
||||
"translatorsDescription": "Dank dieser Leute ist Homarr in {{languages}} Sprachen verfügbar! Möchten Sie helfen, Homarr in Ihre Sprache zu übersetzen? Lesen Sie <a>hier</a>, wie das geht.",
|
||||
"contributors": "Mitwirkende ({{count}})",
|
||||
"contributorsDescription": "Diese Leute haben den Code erstellt, der Homarr zum Laufen bringt! Möchten Sie beim Aufbau von Homarr helfen? Lesen Sie <a>hier</a>wie das geht",
|
||||
"contributorsDescription": "Diese Leute haben den Code entwickelt, der Homarr zum Laufen bringt! Möchten Sie beim Aufbau von Homarr helfen? Lesen Sie <a>hier</a>, wie Sie das tun können",
|
||||
"actions": {
|
||||
"toggleTheme": "Umschalten zwischen Hell- und Dunkelmodus",
|
||||
"focusSearchBar": "Suchleiste fokussieren",
|
||||
|
||||
33
public/locales/de/manage/migrate.json
Normal file
33
public/locales/de/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "Auf 1.0 migrieren",
|
||||
"pageTitle": "Boards, Integrationen und Benutzer migrieren",
|
||||
"description": "Exportiert deine Boards und Benutzer in ein ZIP-Archiv, um sie nach Version 1.0.0 nach Homarr zu migrieren",
|
||||
"securityNote": {
|
||||
"title": "Sicherheitshinweis",
|
||||
"text": "Beim Exportieren von Benutzern und Integrationen wird ein Modalfenster mit einem Verschlüsselungsschlüssel geöffnet. Dieser Schlüssel ist erforderlich, um Daten in Homarr zu importieren. Bewahren Sie ihn sicher auf und geben Sie ihn nicht an Dritte weiter."
|
||||
},
|
||||
"form": {
|
||||
"label": "Wählen Sie alles aus, was Sie exportieren möchten",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "Boards exportieren"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "Integrationen exportieren",
|
||||
"description": "Dies beinhaltet verschlüsselte Anmeldeinformationen für Integrationen. Nur verfügbar beim Exportieren von Boards"
|
||||
},
|
||||
"users": {
|
||||
"label": "Benutzer exportieren",
|
||||
"description": "Damit werden nur die Anmeldeinformationen der Benutzer exportiert, Hash und Salt der Passwörter werden verschlüsselt"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "Exportieren von Daten"
|
||||
},
|
||||
"modal": {
|
||||
"title": "Verschlüsselungsschlüssel",
|
||||
"description": "Ihre Daten wurden exportiert. Bewahren Sie diesen Schlüssel sicher auf und geben Sie ihn nicht an Dritte weiter. Sie benötigen diesen Schlüssel, um die Daten in Homarr zu importieren.",
|
||||
"copyDismiss": "Kopieren & Verwerfen"
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Dein Fehler",
|
||||
"reportButton": "Fehler melden"
|
||||
"text": "Das Widet ist unerwartet abgestürzt. Bitte lesen Sie die Dokumentation und beheben Sie etwaige Tippfehler.",
|
||||
"label": "Fehler aufgetreten",
|
||||
"reportButton": "Diesen Fehler auf GitHub melden"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Εργαλεία",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": ""
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/el/manage/migrate.json
Normal file
33
public/locales/el/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "",
|
||||
"pageTitle": "",
|
||||
"description": "",
|
||||
"securityNote": {
|
||||
"title": "",
|
||||
"text": ""
|
||||
},
|
||||
"form": {
|
||||
"label": "",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": ""
|
||||
},
|
||||
"integrations": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"users": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": ""
|
||||
},
|
||||
"modal": {
|
||||
"title": "",
|
||||
"description": "",
|
||||
"copyDismiss": ""
|
||||
}
|
||||
}
|
||||
@@ -86,7 +86,7 @@
|
||||
},
|
||||
"info": {
|
||||
"uptime": "Χρόνος Λειτουργίας",
|
||||
"uptimeFormat": "",
|
||||
"uptimeFormat": "{{days}} ημέρες, {{hours}} ώρες, {{minutes}} λεπτά",
|
||||
"updates": "Διαθέσιμες ενημερώσεις",
|
||||
"reboot": "Επανεκκίνηση"
|
||||
},
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Το σφάλμα σας",
|
||||
"reportButton": "Αναφέρετε αυτό το σφάλμα"
|
||||
"label": "",
|
||||
"reportButton": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Tools",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": "Migrate to 1.0"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/en/manage/migrate.json
Normal file
33
public/locales/en/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "Migrate to 1.0",
|
||||
"pageTitle": "Migrate boards, integrations and users",
|
||||
"description": "Exports your boards and users to a ZIP-Archive to migrate them to Homarr after version 1.0.0",
|
||||
"securityNote": {
|
||||
"title": "Security Note",
|
||||
"text": "When exporting users and integrations it will also open a modal with an encryption key. This key is required to import the data into Homarr. Keep it safe and do not share it with anyone."
|
||||
},
|
||||
"form": {
|
||||
"label": "Select everything you want to export",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "Export boards"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "Export integrations",
|
||||
"description": "This will include encrypted credentials for integrations. Only available when exporting boards"
|
||||
},
|
||||
"users": {
|
||||
"label": "Export users",
|
||||
"description": "This will only export credential users, passwords hash and salt are encrypted"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "Export data"
|
||||
},
|
||||
"modal": {
|
||||
"title": "Encryption key",
|
||||
"description": "Your data has been exported. Keep this key safe and do not share it with anyone. You will need this key to import the data into Homarr.",
|
||||
"copyDismiss": "Copy & dismiss"
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Your error",
|
||||
"reportButton": "Report this error"
|
||||
"text": "The widet crashed unexpectitly. Please read the documentation and fix any typos.",
|
||||
"label": "Occurred error",
|
||||
"reportButton": "Report this error on GitHub"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"afterLoginRedirection": "Después de iniciar sesión, serás redirigido a {{url}}",
|
||||
"providersEmpty": {
|
||||
"title": "Error del proveedor de autenticación",
|
||||
"message": "Los proveedor(es) no están configurados; consulte sus registros para obtener más información."
|
||||
"message": "El/Los Proveedor(es) no están configurados, por favor, revisa tus registros para obtener más información."
|
||||
}
|
||||
},
|
||||
"alert": "Tus credenciales son incorrectas o esta cuenta no existe. Por favor, inténtalo de nuevo."
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"disabled": "Desactivado",
|
||||
"enableAll": "Activar todo",
|
||||
"disableAll": "Desactivar todo",
|
||||
"setTimer": "",
|
||||
"setTimer": "Configurar temporizador",
|
||||
"version": "Versión",
|
||||
"changePosition": "Cambiar posición",
|
||||
"remove": "Eliminar",
|
||||
|
||||
@@ -22,5 +22,5 @@
|
||||
"message": "La categoría \"{{name}}\" ha sido creada"
|
||||
}
|
||||
},
|
||||
"importFromDocker": "Importar desde docker"
|
||||
"importFromDocker": "Importar desde Docker"
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Herramientas",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": "Migrar a 1.0"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
"externalAddress": {
|
||||
"label": "Dirección externa",
|
||||
"description": "URL que se abrirá al hacer clic en la aplicación.",
|
||||
"tooltip": ""
|
||||
"tooltip": "Puedes usar algunas variables para crear direcciones dinámicas:<br><br><b>[homarr_base]</b> : dirección completa excluyendo puerto y ruta. <i>(Ejemplo: 'https://subdominio.homarr.dev')</i><br><b>[homarr_hostname]</b> : url base completa incluyendo su subdominio actual. <i>(Ejemplo: 'subdominio.homarr.dev')</i><br><b>[homarr_domain]</b> : dominio con el subdominio filtrado. <i>(Ejemplo: 'homarr.dev')</i><br><b>[homarr_protocol]</b> : <i>http/https</i><br><br>Todas estas variables dependen de la url actual."
|
||||
}
|
||||
},
|
||||
"behaviour": {
|
||||
|
||||
33
public/locales/es/manage/migrate.json
Normal file
33
public/locales/es/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "Migrar a 1.0",
|
||||
"pageTitle": "Migrar tableros, integraciones y usuarios",
|
||||
"description": "Exporta tus tableros y usuarios a un archivo ZIP para migrarlos a Homarr después de la versión 1.0.0",
|
||||
"securityNote": {
|
||||
"title": "Nota de seguridad",
|
||||
"text": "Al exportar usuarios e integraciones, también se abrirá una modal con una clave de cifrado. Esta clave es necesaria para importar los datos a Homarr. Manténgala segura y no la comparta con nadie."
|
||||
},
|
||||
"form": {
|
||||
"label": "Seleccione todo lo que desea exportar",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "Exportar tableros"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "Exportar integraciones",
|
||||
"description": "Esto incluirá credenciales cifradas para integraciones. Sólo disponible cuando se exporten tableros"
|
||||
},
|
||||
"users": {
|
||||
"label": "Exportar usuarios",
|
||||
"description": "Esto sólo exportará credenciales de usuario, las contraseñas hash y salt son cifradas"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "Exportar datos"
|
||||
},
|
||||
"modal": {
|
||||
"title": "Clave de cifrado",
|
||||
"description": "Sus datos han sido exportados. Mantenga esta clave segura y no la comparta con nadie. Necesitará esta clave para importar los datos a Homarr.",
|
||||
"copyDismiss": "Copiar y descartar"
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"titleState": {
|
||||
"label": "Título del reloj",
|
||||
"info": "El título personalizado y el código de zona horaria se pueden mostrar en tu widget.<br/>También puedes mostrar solo la ciudad, no mostrar ninguna<br/>o incluso mostrar solo la zona horaria cuando ambas están seleccionadas y no se proporcione ningún título.",
|
||||
"info": "El título personalizado y el código de zona horaria se pueden mostrar en tu widget.<br/>También puedes mostrar solo la ciudad, no mostrar nada,<br/>o incluso mostrar solo la zona horaria cuando ambos están seleccionados pero no se proporciona un título.",
|
||||
"data": {
|
||||
"both": "Título y zona horaria",
|
||||
"city": "Solo título",
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
}
|
||||
},
|
||||
"durationModal": {
|
||||
"title": "",
|
||||
"hours": "",
|
||||
"minutes": "",
|
||||
"unlimited": "",
|
||||
"set": ""
|
||||
"title": "Establecer tiempo de desactivación",
|
||||
"hours": "Horas",
|
||||
"minutes": "Minutos",
|
||||
"unlimited": "Dejar vacío para ilimitado",
|
||||
"set": "Establecer"
|
||||
}
|
||||
}
|
||||
@@ -9,8 +9,8 @@
|
||||
},
|
||||
"cpu": {
|
||||
"label": "Mostrar información de la CPU",
|
||||
"load": "",
|
||||
"minute": "",
|
||||
"load": "Promedio de Carga",
|
||||
"minute": "{{minute}} minutos",
|
||||
"minutes": "{{minutes}} Minutos"
|
||||
},
|
||||
"memory": {
|
||||
@@ -57,43 +57,43 @@
|
||||
"label": "Mostrar sección de almacenamiento"
|
||||
},
|
||||
"sectionIndicatorColor": {
|
||||
"label": "",
|
||||
"info": "",
|
||||
"label": "Requisito para que el indicador de estado de la sección sea 'OK'",
|
||||
"info": "'Todos' requiere que todos los elementos estén en línea para que el indicador sea verde. 'Cualquiera' requiere que al menos un elemento esté en línea.",
|
||||
"data": {
|
||||
"any": "",
|
||||
"all": ""
|
||||
"any": "Cualquiera Activo",
|
||||
"all": "Todos Activos"
|
||||
}
|
||||
},
|
||||
"ignoreCert": {
|
||||
"label": "",
|
||||
"info": ""
|
||||
"label": "Ignorar Errores de Certificado",
|
||||
"info": "Si está habilitado, el widget ignorará los errores de certificado al acceder a la API de Proxmox. Esto puede ser útil al acceder a Proxmox a través de HTTPS."
|
||||
}
|
||||
}
|
||||
},
|
||||
"cpu": {
|
||||
"label": "CPU",
|
||||
"load": "",
|
||||
"minute": ""
|
||||
"load": "Promedio de Carga",
|
||||
"minute": "{{minute}} minutos"
|
||||
},
|
||||
"memory": {
|
||||
"label": "",
|
||||
"totalMem": "",
|
||||
"available": ""
|
||||
"label": "Memoria",
|
||||
"totalMem": "Espacio total: {{total}}GB",
|
||||
"available": "Disponible: {{available}}GB - {{percentage}}%"
|
||||
},
|
||||
"fileSystem": {
|
||||
"label": "",
|
||||
"available": ""
|
||||
"label": "Archivo de Sistema",
|
||||
"available": "Disponible: {{available}} - {{percentage}}%"
|
||||
},
|
||||
"info": {
|
||||
"uptime": "",
|
||||
"uptimeFormat": "",
|
||||
"updates": "",
|
||||
"reboot": ""
|
||||
"uptime": "Tiempo de Actividad",
|
||||
"uptimeFormat": "{{days}} días, {{hours}} horas, {{minutes}} minutos",
|
||||
"updates": "Actualización disponible",
|
||||
"reboot": "Reiniciar"
|
||||
},
|
||||
"errors": {
|
||||
"general": {
|
||||
"title": "",
|
||||
"text": ""
|
||||
"title": "No se puede encontrar tu(s) sistema(s).",
|
||||
"text": "Hubo un problema al conectarse a tu sistema. Por favor verifica tu configuración/integración(es)."
|
||||
}
|
||||
},
|
||||
"headings": {
|
||||
@@ -118,24 +118,24 @@
|
||||
"name": "Nombre",
|
||||
"cpu": "CPU",
|
||||
"ram": "RAM",
|
||||
"node": ""
|
||||
"node": "Nodo"
|
||||
}
|
||||
},
|
||||
"popover": {
|
||||
"node": "",
|
||||
"vmid": "",
|
||||
"node": "Nodo",
|
||||
"vmid": "VMID",
|
||||
"details": "Detalles",
|
||||
"cores": "",
|
||||
"memSize": "",
|
||||
"memRatio": "",
|
||||
"diskSize": "",
|
||||
"diskRatio": "",
|
||||
"uptime": "",
|
||||
"plugin": "",
|
||||
"ha": "",
|
||||
"sharedStorage": "",
|
||||
"localStorage": "",
|
||||
"na": ""
|
||||
"cores": "Núcleos - {{maxCpu}}",
|
||||
"memSize": "Memoria - {{maxMem}}",
|
||||
"memRatio": "Memoria - {{usedMem}} / {{maxMem}}",
|
||||
"diskSize": "Disco - {{maxDisk}}",
|
||||
"diskRatio": "Disco - {{usedDisk}} / {{maxDisk}}",
|
||||
"uptime": "Tiempo de actividad - {{uptime}}",
|
||||
"plugin": "Complemento",
|
||||
"ha": "Estado de HA - {{haState}}",
|
||||
"sharedStorage": "Almacenamiento Compartido",
|
||||
"localStorage": "Almacenamiento Local",
|
||||
"na": "N/D"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "",
|
||||
"description": "",
|
||||
"name": "Estado del Administrador de Índices",
|
||||
"description": "Estado sobre tus índices",
|
||||
"settings": {
|
||||
"title": "",
|
||||
"title": "Estado del Administrador de Índices",
|
||||
"openIndexerSiteInNewTab": {
|
||||
"label": ""
|
||||
"label": "Abrir el Sitio del Indexador en una Nueva Pestaña"
|
||||
}
|
||||
}
|
||||
},
|
||||
"indexersStatus": {
|
||||
"title": "",
|
||||
"testAllButton": ""
|
||||
"title": "Administrador de Índices",
|
||||
"testAllButton": "Probar todo"
|
||||
},
|
||||
"errors": {
|
||||
"general": {
|
||||
"title": "",
|
||||
"text": ""
|
||||
"title": "No se puede encontrar un administrador de índices",
|
||||
"text": "Hubo un problema al conectarse a tu administrador de índices. Por favor verifica tu configuración/integración(es)."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,96 +1,96 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "",
|
||||
"description": "",
|
||||
"name": "Transcodificación de Medios",
|
||||
"description": "Muestra información sobre la transcodificación de medios",
|
||||
"settings": {
|
||||
"title": "",
|
||||
"title": "Configuraciones de Transcodificación de Medios",
|
||||
"appId": {
|
||||
"label": ""
|
||||
"label": "Seleccionar una aplicación"
|
||||
},
|
||||
"defaultView": {
|
||||
"label": "",
|
||||
"label": "Vista predeterminada",
|
||||
"data": {
|
||||
"workers": "",
|
||||
"workers": "Trabajadores",
|
||||
"queue": "Cola",
|
||||
"statistics": ""
|
||||
"statistics": "Estadísticas"
|
||||
}
|
||||
},
|
||||
"showHealthCheck": {
|
||||
"label": ""
|
||||
"label": "Mostrar indicador de Verificación de Salud"
|
||||
},
|
||||
"showHealthChecksInQueue": {
|
||||
"label": ""
|
||||
"label": "Mostrar Verificaciones de Salud en cola"
|
||||
},
|
||||
"queuePageSize": {
|
||||
"label": ""
|
||||
"label": "Cola: Elementos por página"
|
||||
},
|
||||
"showAppIcon": {
|
||||
"label": ""
|
||||
"label": "Mostrar icono de aplicación en la esquina inferior derecha"
|
||||
}
|
||||
}
|
||||
},
|
||||
"noAppSelected": "",
|
||||
"noAppSelected": "Por favor selecciona una aplicación en la configuración del widget",
|
||||
"views": {
|
||||
"workers": {
|
||||
"table": {
|
||||
"header": {
|
||||
"name": "",
|
||||
"name": "Archivo",
|
||||
"eta": "Tiempo restante",
|
||||
"progress": "Completado %"
|
||||
},
|
||||
"empty": "Vacío",
|
||||
"tooltip": {
|
||||
"transcode": "",
|
||||
"healthCheck": ""
|
||||
"transcode": "Transcodificar",
|
||||
"healthCheck": "Verificación de Salud"
|
||||
}
|
||||
}
|
||||
},
|
||||
"queue": {
|
||||
"table": {
|
||||
"header": {
|
||||
"name": "",
|
||||
"name": "Archivo",
|
||||
"size": "Tamaño"
|
||||
},
|
||||
"footer": {
|
||||
"currentIndex": ""
|
||||
"currentIndex": "{{start}}-{{end}} de {{total}}"
|
||||
},
|
||||
"empty": "Vacío",
|
||||
"tooltip": {
|
||||
"transcode": "",
|
||||
"healthCheck": ""
|
||||
"transcode": "Transcodificar",
|
||||
"healthCheck": "Verificación de Salud"
|
||||
}
|
||||
}
|
||||
},
|
||||
"statistics": {
|
||||
"empty": "Vacío",
|
||||
"box": {
|
||||
"transcodes": "",
|
||||
"healthChecks": "",
|
||||
"files": "",
|
||||
"spaceSaved": ""
|
||||
"transcodes": "Transcodificaciones: {{value}}",
|
||||
"healthChecks": "Verificaciones de Salud: {{value}}",
|
||||
"files": "Archivos: {{value}}",
|
||||
"spaceSaved": "Guardado: {{value}}"
|
||||
},
|
||||
"pies": {
|
||||
"transcodes": "",
|
||||
"healthChecks": "",
|
||||
"videoCodecs": "",
|
||||
"videoContainers": "",
|
||||
"videoResolutions": ""
|
||||
"transcodes": "Transcodificaciones",
|
||||
"healthChecks": "Verificaciones de Salud",
|
||||
"videoCodecs": "Códecs",
|
||||
"videoContainers": "Contenedores",
|
||||
"videoResolutions": "Resoluciones"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Error",
|
||||
"message": ""
|
||||
"message": "Ocurrió un error al obtener datos de Tdarr."
|
||||
},
|
||||
"tabs": {
|
||||
"workers": "",
|
||||
"workers": "Trabajadores",
|
||||
"queue": "Cola",
|
||||
"statistics": ""
|
||||
"statistics": "Estadísticas"
|
||||
},
|
||||
"healthCheckStatus": {
|
||||
"title": "",
|
||||
"queued": "",
|
||||
"healthy": "",
|
||||
"unhealthy": ""
|
||||
"title": "Verificación de Salud",
|
||||
"queued": "En cola",
|
||||
"healthy": "Saludable",
|
||||
"unhealthy": "No saludable"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
"label": "Límite de líneas de texto"
|
||||
},
|
||||
"sortByPublishDateAscending": {
|
||||
"label": ""
|
||||
"label": "Ordenar por fecha de publicación (ascendente)"
|
||||
},
|
||||
"sortPostsWithoutPublishDateToTheTop": {
|
||||
"label": ""
|
||||
"label": "Colocar publicaciones sin fecha de publicación en la parte superior"
|
||||
},
|
||||
"maximumAmountOfPosts": {
|
||||
"label": ""
|
||||
"label": "Cantidad máxima de publicaciones"
|
||||
}
|
||||
},
|
||||
"card": {
|
||||
|
||||
@@ -11,22 +11,22 @@
|
||||
},
|
||||
"appendUnit": {
|
||||
"label": "Añadir unidad de medida",
|
||||
"info": "Añadir el atributo unidad de medida al estado de la entidad."
|
||||
"info": "Añadir el atributo de unidad de medida al estado de la entidad."
|
||||
},
|
||||
"automationId": {
|
||||
"label": "ID de automatización opcional",
|
||||
"info": "Su ID de automatización única. Siempre empieza por automation.XXXXX. Si no está establecida, no se podrá hacer clic en el widget, y solo se mostrará el estado. Al hacer clic, la entidad se refrescará."
|
||||
"info": "Tu ID de automatización único. Siempre empieza con automation.XXXXX. Si no está configurado, el widget no será clicable y solo mostrará el estado. Después de hacer clic, el estado de la entidad se actualizará."
|
||||
},
|
||||
"displayName": {
|
||||
"label": "Nombre a mostrar"
|
||||
},
|
||||
"displayFriendlyName": {
|
||||
"label": "Mostrar nombre descriptivo",
|
||||
"info": "Mostrar el nombre descriptivo de Home Assistant en lugar del nombre para mostrar."
|
||||
"label": "Mostrar nombre amigable",
|
||||
"info": "Mostrar el nombre amigable de Home Assistant en lugar del nombre de visualización."
|
||||
},
|
||||
"genericToggle": {
|
||||
"label": "Cambio de entidad",
|
||||
"info": "Realizar una acción genérica de Home Assistant en la entidad cuando se hace clic."
|
||||
"label": "Interruptor de entidad",
|
||||
"info": "Realizar una acción genérica de alternar de Home Assistant en la entidad al hacer clic."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"title": "Ejecutar una automatización",
|
||||
"automationId": {
|
||||
"label": "ID de automatización",
|
||||
"info": "Su ID de automatización única. Siempre empieza por automation.XXXXX."
|
||||
"info": "Tu ID de automatización único. Siempre empieza con automatización.XXXXX."
|
||||
},
|
||||
"displayName": {
|
||||
"label": "Nombre a mostrar"
|
||||
|
||||
@@ -31,15 +31,15 @@
|
||||
"info": "Si está deshabilitado, solo se mostrará la relación global. La relación global seguirá usando las etiquetas si están configuradas"
|
||||
},
|
||||
"columnOrdering": {
|
||||
"label": ""
|
||||
"label": "Habilitar el reordenamiento de las columnas"
|
||||
},
|
||||
"rowSorting": {
|
||||
"label": ""
|
||||
"label": "Habilitar la clasificación de las filas"
|
||||
},
|
||||
"columns": {
|
||||
"label": "",
|
||||
"label": "Seleccionar columnas para mostrar",
|
||||
"data": {
|
||||
"date": "",
|
||||
"date": "Fecha Agregada",
|
||||
"down": "Descarga",
|
||||
"up": "Subida",
|
||||
"eta": "Tiempo restante",
|
||||
@@ -47,7 +47,7 @@
|
||||
}
|
||||
},
|
||||
"nameColumnSize": {
|
||||
"label": ""
|
||||
"label": "Cambiar el tamaño de la columna del nombre"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
"label": "Mostrar el nombre de la ciudad"
|
||||
},
|
||||
"displayWeekly": {
|
||||
"label": ""
|
||||
"label": "Mostrar Pronóstico Semanal"
|
||||
},
|
||||
"forecastDays": {
|
||||
"label": ""
|
||||
"label": "Días a Mostrar"
|
||||
},
|
||||
"location": {
|
||||
"label": "Ubicación"
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Tu error",
|
||||
"reportButton": "Informar de este error"
|
||||
"text": "El widget ha fallado inesperadamente. Lea la documentación y corrija los errores tipográficos.",
|
||||
"label": "Ha ocurrido un error",
|
||||
"reportButton": "Informar de este error en GitHub"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "",
|
||||
"items": {
|
||||
"docker": "",
|
||||
"api": ""
|
||||
"api": "",
|
||||
"migrate": ""
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/et/manage/migrate.json
Normal file
33
public/locales/et/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "",
|
||||
"pageTitle": "",
|
||||
"description": "",
|
||||
"securityNote": {
|
||||
"title": "",
|
||||
"text": ""
|
||||
},
|
||||
"form": {
|
||||
"label": "",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": ""
|
||||
},
|
||||
"integrations": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"users": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": ""
|
||||
},
|
||||
"modal": {
|
||||
"title": "",
|
||||
"description": "",
|
||||
"copyDismiss": ""
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
},
|
||||
"afterLoginRedirection": "Après la connexion, vous serez redirigé vers {{url}}",
|
||||
"providersEmpty": {
|
||||
"title": "Erreur de fournisseur d'authentification",
|
||||
"title": "Erreur du fournisseur d'authentification",
|
||||
"message": "Le(s) fournisseur(s) n'est (ne sont) pas défini(s), veuillez vérifier les journaux pour plus d'informations."
|
||||
}
|
||||
},
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"backToBoard": "Retour au tableau de bord",
|
||||
"settings": {
|
||||
"appearance": {
|
||||
"primaryColor": "Couleur primaire",
|
||||
"primaryColor": "Couleur principale",
|
||||
"secondaryColor": "Couleur secondaire"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Outils",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": ""
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/fr/manage/migrate.json
Normal file
33
public/locales/fr/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "",
|
||||
"pageTitle": "",
|
||||
"description": "",
|
||||
"securityNote": {
|
||||
"title": "",
|
||||
"text": ""
|
||||
},
|
||||
"form": {
|
||||
"label": "",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": ""
|
||||
},
|
||||
"integrations": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"users": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": ""
|
||||
},
|
||||
"modal": {
|
||||
"title": "",
|
||||
"description": "",
|
||||
"copyDismiss": ""
|
||||
}
|
||||
}
|
||||
@@ -47,7 +47,7 @@
|
||||
},
|
||||
"confirm": {
|
||||
"label": "Supprimer définitivement",
|
||||
"description": "J'ai conscience que cette action est permanente et que toutes les données du compte seront perdues."
|
||||
"description": "Je suis conscient que cette action est permanente et que toutes les données du compte seront perdues."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"metaTitle": "Invitations des utilisateurs",
|
||||
"pageTitle": "Gérer les invitations des utilisateurs",
|
||||
"description": "Avec les invitations, vous pouvez convier des utilisateurs sur votre instance Homarr. Une invitation ne sera valide que pendant un certain temps et ne peut être utilisée qu'une fois. L'expiration doit être définie entre 5 minutes et 12 mois.",
|
||||
"description": "Avec les invitations, vous pouvez convier des utilisateurs sur votre instance Homarr. Une invitation ne sera valide que pendant un certain temps et ne peut être utilisée qu'une seule fois. L'expiration doit être définie entre 5 minutes et 12 mois.",
|
||||
"button": {
|
||||
"createInvite": "Créer une invitation",
|
||||
"deleteInvite": "Supprimer une invitation"
|
||||
@@ -9,7 +9,7 @@
|
||||
"table": {
|
||||
"header": {
|
||||
"id": "ID",
|
||||
"creator": "Créé par",
|
||||
"creator": "Créateur",
|
||||
"expires": "Date d'expiration",
|
||||
"action": "Actions"
|
||||
},
|
||||
@@ -36,7 +36,7 @@
|
||||
"token": "Jeton"
|
||||
},
|
||||
"button": {
|
||||
"close": "Copier et fermer"
|
||||
"close": "Copier et rejeter"
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
|
||||
@@ -40,4 +40,4 @@
|
||||
}
|
||||
},
|
||||
"error": "Une erreur s'est produite"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
},
|
||||
"credits": {
|
||||
"madeWithLove": "Fait avec ❤️ par @",
|
||||
"thirdPartyContent": "Voir le contenu de tierce partie",
|
||||
"thirdPartyContent": "Voir le contenu tiers",
|
||||
"thirdPartyContentTable": {
|
||||
"dependencyName": "Dépendance",
|
||||
"dependencyVersion": "Version"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"modals": {
|
||||
"selectBoard": {
|
||||
"title": "Choisir un tableau de bord",
|
||||
"text": "Choisissez le tableau sur lequel vous souhaiyez ajouter les applications pour les conteneurs Docker sélectionnés.",
|
||||
"text": "Choisissez le tableau sur lequel vous souhaitez ajouter les applications pour les conteneurs Docker sélectionnés.",
|
||||
"form": {
|
||||
"board": {
|
||||
"label": "Tableau de bord"
|
||||
@@ -24,7 +24,7 @@
|
||||
"message": "Les applications pour les conteneurs Docker sélectionnés ont bien été ajoutées au tableau de bord."
|
||||
},
|
||||
"error": {
|
||||
"title": "Impossible d'ajouter des applications au tableau de bord",
|
||||
"title": "Échec de l'ajout d'applications au tableau de bord",
|
||||
"message": "Les applications pour les conteneurs Docker sélectionnés n'ont pas pu être ajoutées au tableau de bord."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Votre erreur",
|
||||
"reportButton": "Signaler cette erreur"
|
||||
"label": "",
|
||||
"reportButton": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "כלים",
|
||||
"items": {
|
||||
"docker": "דוקר",
|
||||
"api": "ממשק API"
|
||||
"api": "ממשק API",
|
||||
"migrate": "הגירה ל- 1.0"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/he/manage/migrate.json
Normal file
33
public/locales/he/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "הגירה ל- 1.0",
|
||||
"pageTitle": "הגירת לוחות, אינטגרציות ומשתמשים",
|
||||
"description": "מייצא את הלוחות והמשתמשים שלך לארכיון ZIP כדי להעביר אותם ל-Homarr לאחר גרסה 1.0.0",
|
||||
"securityNote": {
|
||||
"title": "הערת אבטחה",
|
||||
"text": "בעת ייצוא משתמשים ואינטגרציות יפתח מסך עם מפתח הצפנה. מפתח זה נדרש כדי לייבא את הנתונים לתוך Homarr. שמור על מפתח ההצפנה בטוח ואל תשתף אותו עם אף אחד."
|
||||
},
|
||||
"form": {
|
||||
"label": "בחירת הפריטים לייצוא",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "ייצוא לוחות"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "ייצוא אינטגרציות",
|
||||
"description": "זה יכלול אישורים מוצפנים לאינטגרציות. זמין רק בעת ייצוא לוחות"
|
||||
},
|
||||
"users": {
|
||||
"label": "ייצוא משתמשים",
|
||||
"description": "זה ייצא רק אישורי משתמש, סיסמאות hash ואותנטיקציה חד כיוונית מוצפנות"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "ייצוא נתונים"
|
||||
},
|
||||
"modal": {
|
||||
"title": "מפתח הצפנה",
|
||||
"description": "הנתונים שלך יוצאו. שמור את המפתח הזה בטוח ואל תשתף אותו עם אף אחד. תזדקק למפתח הזה כדי לייבא את הנתונים לתוך Homarr.",
|
||||
"copyDismiss": "העתק וסגור"
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "השגיאה שלך",
|
||||
"reportButton": "דווח על שגיאה זו"
|
||||
"text": "הווידט התרסק במפתיע. אנא קרא את התיעוד ותקן שגיאות הקלדה.",
|
||||
"label": "אירעה שגיאה",
|
||||
"reportButton": "דווח על שגיאה זו ב-GitHub"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Alati",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": ""
|
||||
"api": "",
|
||||
"migrate": ""
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/hr/manage/migrate.json
Normal file
33
public/locales/hr/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "",
|
||||
"pageTitle": "",
|
||||
"description": "",
|
||||
"securityNote": {
|
||||
"title": "",
|
||||
"text": ""
|
||||
},
|
||||
"form": {
|
||||
"label": "",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": ""
|
||||
},
|
||||
"integrations": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"users": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": ""
|
||||
},
|
||||
"modal": {
|
||||
"title": "",
|
||||
"description": "",
|
||||
"copyDismiss": ""
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Vaša greška",
|
||||
"reportButton": "Prijavi ovu grešku"
|
||||
"label": "",
|
||||
"reportButton": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Eszközök",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": "Migráció 1.0-ra"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/hu/manage/migrate.json
Normal file
33
public/locales/hu/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "Migráció 1.0-ra",
|
||||
"pageTitle": "Áttelepítheti a táblákat, az integrációkat és a felhasználókat",
|
||||
"description": "Exportálja a táblákat és a felhasználókat egy ZIP-archívumba, hogy az 1.0.0 verzió után átvihesse őket a Homarr-ra",
|
||||
"securityNote": {
|
||||
"title": "Biztonsági megjegyzés",
|
||||
"text": "A felhasználók és integrációk exportálásakor egy modal is megnyílik a titkosítási kulccsal. Ez a kulcs szükséges az adatok Homarrba történő importálásához. Tartsa biztonságban, és ne ossza meg senkivel."
|
||||
},
|
||||
"form": {
|
||||
"label": "Válassza ki mindazt, amit exportálni szeretne",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "Táblák exportálása"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "Integrációk exportálása",
|
||||
"description": "Ez magában foglalja az integrációhoz szükséges titkosított hitelesítő adatokat. Csak táblák exportálásakor érhető el"
|
||||
},
|
||||
"users": {
|
||||
"label": "Felhasználók exportálása",
|
||||
"description": "Ez csak a hitelesítő adatokat exportálja, a hash és a salt jelszavak titkosítva vannak"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "Adatok exportálása"
|
||||
},
|
||||
"modal": {
|
||||
"title": "Titkosítókulcs",
|
||||
"description": "Adatai exportálva. Tartsa biztonságban ezt a kulcsot, és ne ossza meg senkivel. Erre a kulcsra lesz szüksége az adatok Homarrba történő importálásához.",
|
||||
"copyDismiss": "Másolás és elvetés"
|
||||
}
|
||||
}
|
||||
@@ -40,4 +40,4 @@
|
||||
}
|
||||
},
|
||||
"error": "Hiba történt"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Az Ön hibája",
|
||||
"reportButton": "Hiba jelentése"
|
||||
"text": "A widget váratlanul összeomlott. Kérjük, olvassa el a dokumentációt, és javítsa ki a gépelési hibákat.",
|
||||
"label": "Hiba történt",
|
||||
"reportButton": "Hiba jelentése a GitHubon"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Strumenti",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": "Migrare alla 1.0"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/it/manage/migrate.json
Normal file
33
public/locales/it/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "Migrare alla 1.0",
|
||||
"pageTitle": "Migra schede, integrazioni e utenti",
|
||||
"description": "Esporta le tue bacheche e gli utenti in un archivio ZIP per migrarli su Homarr dopo la versione 1.0.0",
|
||||
"securityNote": {
|
||||
"title": "Note di sicurezza",
|
||||
"text": "Quando si esportano utenti e integrazioni, si aprirà anche una finestra modale con una chiave di crittografia. Questa chiave è necessaria per importare i dati in Homarr. Mantienila al sicuro e non condividerla con nessuno."
|
||||
},
|
||||
"form": {
|
||||
"label": "Seleziona tutto quello che vuoi esportare",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "Esporta schede"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "Esporta integrazioni",
|
||||
"description": "Questo includerà le credenziali crittografate per le integrazioni. Disponibile solo quando si esportano schede"
|
||||
},
|
||||
"users": {
|
||||
"label": "Esporta utenti",
|
||||
"description": "Questo esporterà solo le credenziali degli utenti, l'hash e il salt delle password sono criptati"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "Esporta dati"
|
||||
},
|
||||
"modal": {
|
||||
"title": "Chiave crittografica",
|
||||
"description": "I tuoi dati sono stati esportati. Tieni questa chiave al sicuro e non condividerla con nessuno. Questa chiave ti servirà per importare i dati su Homarr.",
|
||||
"copyDismiss": "Copia e chiudi"
|
||||
}
|
||||
}
|
||||
@@ -40,4 +40,4 @@
|
||||
}
|
||||
},
|
||||
"error": "Si è verificato un errore"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Il tuo errore",
|
||||
"reportButton": "Segnala questo errore"
|
||||
"text": "Il widget è crashato inaspettatamente. Leggere la documentazione e correggere eventuali errori di battitura.",
|
||||
"label": "Si è verificato un errore",
|
||||
"reportButton": "Segnala questo errore su GitHub"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"save": "保存",
|
||||
"apply": "適用する",
|
||||
"apply": "適用",
|
||||
"insert": "挿入",
|
||||
"about": "About",
|
||||
"cancel": "キャンセル",
|
||||
"close": "閉じる",
|
||||
"back": "バック",
|
||||
"back": "戻る",
|
||||
"delete": "削除",
|
||||
"ok": "よっしゃー",
|
||||
"ok": "OK",
|
||||
"edit": "編集",
|
||||
"next": "次のページ",
|
||||
"next": "次へ",
|
||||
"previous": "前へ",
|
||||
"confirm": "確認",
|
||||
"enabled": "有効",
|
||||
@@ -21,7 +21,7 @@
|
||||
"version": "バージョン",
|
||||
"changePosition": "ポジションを変更する",
|
||||
"remove": "削除",
|
||||
"removeConfirm": "{{item}} を削除してもよろしいですか?",
|
||||
"removeConfirm": "{{item}} を本当に削除してもよろしいですか?",
|
||||
"createItem": "{{item}}を作成",
|
||||
"sections": {
|
||||
"settings": "設定",
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "ツール",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": "1.0に移行"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/ja/manage/migrate.json
Normal file
33
public/locales/ja/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "1.0に移行",
|
||||
"pageTitle": "ボード、統合、ユーザーを移行する",
|
||||
"description": "ボードとユーザーをZIPアーカイブにエクスポートしてバージョン1.0.0以降のHomarrに移行します。",
|
||||
"securityNote": {
|
||||
"title": "セキュリティノート",
|
||||
"text": "ユーザーと統合をエクスポートすると暗号化キーを含むモーダルも開きます。このキーはデータをHomarrにインポートするために必要です。安全に保管し誰とも共有しないでください。"
|
||||
},
|
||||
"form": {
|
||||
"label": "エクスポートしたいものをすべて選択してください",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": "ボードをエクスポート"
|
||||
},
|
||||
"integrations": {
|
||||
"label": "エクスポート統合",
|
||||
"description": "これには統合用の暗号化された認証情報が含まれます。ボードをエクスポートする場合のみ利用可能です。"
|
||||
},
|
||||
"users": {
|
||||
"label": "ユーザーをエクスポート",
|
||||
"description": "これにより資格情報ユーザーのみがエクスポートされ、パスワードハッシュとソルトは暗号化されます。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": "データをエクスポート"
|
||||
},
|
||||
"modal": {
|
||||
"title": "暗号化キー",
|
||||
"description": "データがエクスポートされました。このキーは安全に保管し誰とも共有しないでください。このキーはデータをHomarrにインポートするために必要になります。",
|
||||
"copyDismiss": "コピーして閉じる"
|
||||
}
|
||||
}
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "あなたのエラー",
|
||||
"reportButton": "このエラーを報告する"
|
||||
"text": "widet が予期せずクラッシュしました。ドキュメントを読み、誤字を修正してください。",
|
||||
"label": "エラーが発生しました",
|
||||
"reportButton": "GitHubでこのエラーを報告する"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "도구",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": ""
|
||||
"api": "",
|
||||
"migrate": ""
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
33
public/locales/ko/manage/migrate.json
Normal file
33
public/locales/ko/manage/migrate.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"metaTitle": "",
|
||||
"pageTitle": "",
|
||||
"description": "",
|
||||
"securityNote": {
|
||||
"title": "",
|
||||
"text": ""
|
||||
},
|
||||
"form": {
|
||||
"label": "",
|
||||
"option": {
|
||||
"boards": {
|
||||
"label": ""
|
||||
},
|
||||
"integrations": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
},
|
||||
"users": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"export": ""
|
||||
},
|
||||
"modal": {
|
||||
"title": "",
|
||||
"description": "",
|
||||
"copyDismiss": ""
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "오류",
|
||||
"reportButton": "이 오류 신고하기"
|
||||
"label": "",
|
||||
"reportButton": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
"title": "Įrankiai",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": "API"
|
||||
"api": "API",
|
||||
"migrate": ""
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user