Switch repository docs to English README workflow
All checks were successful
Build Windows App / build-windows (push) Successful in 16m21s

This commit is contained in:
MrSphay
2026-05-02 00:10:52 +02:00
parent 98781f8e85
commit a5b9fc0cf7
5 changed files with 384 additions and 78 deletions

179
README.md
View File

@@ -1,7 +1,7 @@
<p align="center"> <p align="center">
<h1 align="center">EnvHelper</h1> <h1 align="center">EnvHelper</h1>
<p align="center"> <p align="center">
Lokale Windows-App zum sauberen Ausfuellen von <code>.env</code>-Vorlagen. A local Windows desktop app for turning <code>.env</code> templates into deployable configuration files.
</p> </p>
</p> </p>
@@ -14,67 +14,68 @@
--- ---
## Inhalt ## Table of Contents
- [Kurzbeschreibung](#kurzbeschreibung) - [Overview](#overview)
- [Features](#features) - [Features](#features)
- [Workflow](#workflow) - [Workflow](#workflow)
- [Beispiel](#beispiel) - [Example](#example)
- [Erkennung](#erkennung) - [Placeholder Detection](#placeholder-detection)
- [Standardwerte](#standardwerte) - [Default Values](#default-values)
- [Download und Artefakte](#download-und-artefakte) - [Downloads and Artifacts](#downloads-and-artifacts)
- [Entwicklung](#entwicklung) - [Development](#development)
- [Windows Build](#windows-build) - [Windows Build](#windows-build)
- [Sicherheit](#sicherheit) - [README Generation](#readme-generation)
- [Projektinfos](#projektinfos) - [Security](#security)
- [Project Info](#project-info)
--- ---
## Kurzbeschreibung ## Overview
EnvHelper liest `.env`-Dateien oder reinen Text ein, erkennt `CHANGE_ME`-Platzhalter und erzeugt passende Werte im erwarteten Format. Gleiche Platzhalter erhalten denselben Wert, damit zusammenhaengende Variablen wie `DATABASE_URL` und `POSTGRES_PASSWORD` synchron bleiben. EnvHelper reads `.env` files or plain text, detects `CHANGE_ME` placeholders, infers the required value format, and produces a ready-to-use output file. Identical placeholders are replaced with the same generated value, so related variables such as `DATABASE_URL` and `POSTGRES_PASSWORD` stay in sync.
Die App arbeitet lokal als Desktop-Tool. Es werden keine Secrets an externe Dienste gesendet. The app is local-first. It does not send generated secrets or input files to external services.
--- ---
## Features ## Features
| Bereich | Beschreibung | | Area | Description |
| --- | --- | | --- | --- |
| Datei und Text | `.env` laden, Text direkt einfuegen, Ergebnis kopieren oder speichern | | File and text input | Load `.env` files, paste text directly, copy output, or save a new `.env` |
| Placeholder | Erkennt `CHANGE_ME...` Werte und ersetzt sie formatbewusst | | Placeholder replacement | Detects `CHANGE_ME...` values and replaces them with format-aware values |
| Konsistenz | Gleiche Placeholder werden im gesamten Output identisch ersetzt | | Consistency | Reuses the same generated value for repeated placeholders |
| Formate | Passwoerter, Secrets, Base64, Hex, UUID, Ports, URLs, E-Mail, API-Key-Praefixe | | Supported formats | Passwords, secrets, Base64, hex, UUIDs, ports, URLs, email addresses, and API key prefixes |
| Standardwerte | Erkennt naheliegende Defaults automatisch und erlaubt manuelle Overrides | | Default values | Detects likely defaults automatically and allows manual overrides |
| Desktop UI | Kompakte Windows-App mit nativer Fensterleiste, Darkmode und Settings | | Desktop UI | Compact Windows app with a native title bar, dark mode, and settings |
| Sprachen | Deutsch, Englisch, Spanisch, Franzoesisch, Niederlaendisch | | Languages | German, English, Spanish, French, and Dutch |
| Build | Windows Setup und Portable EXE ueber Gitea Runner | | Build output | Windows setup and portable executables via Gitea Runner |
--- ---
## Workflow ## Workflow
```text ```text
1. .env Datei laden oder Text einfuegen 1. Load a .env file or paste text.
2. Automatische Standardwerte pruefen oder eigene Defaults ergaenzen 2. Review automatically detected defaults or add your own.
3. CHANGE_ME Platzhalter generieren lassen 3. Generate values for CHANGE_ME placeholders.
4. Output kopieren oder als neue .env speichern 4. Copy the output or save it as a new .env file.
``` ```
```text ```text
Input Verarbeitung Output Input Processing Output
----- ------------ ------ ----- ---------- ------
DATABASE_URL=... Placeholder erkennen DATABASE_URL=... DATABASE_URL=... Detect placeholders DATABASE_URL=...
POSTGRES_PASSWORD=... -> Format ableiten -> POSTGRES_PASSWORD=... POSTGRES_PASSWORD=... -> Infer formats -> POSTGRES_PASSWORD=...
SESSION_SECRET=... Werte lokal erzeugen SESSION_SECRET=... SESSION_SECRET=... Generate local values SESSION_SECRET=...
``` ```
--- ---
## Beispiel ## Example
Eingabe: Input:
```env ```env
APP_PORT=3000 APP_PORT=3000
@@ -90,7 +91,7 @@ BOOTSTRAP_ADMIN_EMAIL=CHANGE_ME_EMAIL
BOOTSTRAP_ADMIN_PASSWORD=CHANGE_ME_LONG_INITIAL_ADMIN_PASSWORD BOOTSTRAP_ADMIN_PASSWORD=CHANGE_ME_LONG_INITIAL_ADMIN_PASSWORD
``` ```
Moeglicher Output: Possible output:
```env ```env
APP_PORT=3000 APP_PORT=3000
@@ -106,35 +107,35 @@ BOOTSTRAP_ADMIN_EMAIL=admin@example.local
BOOTSTRAP_ADMIN_PASSWORD=Wz4...strongPassword BOOTSTRAP_ADMIN_PASSWORD=Wz4...strongPassword
``` ```
Die echten Werte werden zufaellig lokal erzeugt. The actual values are generated randomly on the local machine.
--- ---
## Erkennung ## Placeholder Detection
EnvHelper priorisiert den Inhalt des Platzhalters vor dem umgebenden Variablennamen. Dadurch wird zum Beispiel `CHANGE_ME_POSTGRES_PASSWORD` innerhalb einer `DATABASE_URL` als Passwort erkannt und nicht faelschlich als URL. EnvHelper prioritizes the placeholder text over the surrounding variable name. This prevents cases such as `CHANGE_ME_POSTGRES_PASSWORD` inside `DATABASE_URL` from being misclassified as a URL.
Unterstuetzte Muster sind unter anderem: Supported examples:
| Muster | Ergebnis | | Pattern | Result |
| --- | --- | | --- | --- |
| `CHANGE_ME_POSTGRES_PASSWORD` | starkes URL-sicheres Passwort | | `CHANGE_ME_POSTGRES_PASSWORD` | Strong URL-safe password |
| `CHANGE_ME_32_RANDOM_BYTES_AS_BASE64` | 32 zufaellige Bytes als Base64 | | `CHANGE_ME_32_RANDOM_BYTES_AS_BASE64` | 32 random bytes encoded as Base64 |
| `CHANGE_ME_HEX_TOKEN` | zufaellige Bytes als Hex | | `CHANGE_ME_HEX_TOKEN` | Random bytes encoded as hex |
| `CHANGE_ME_UUID` | UUID v4 | | `CHANGE_ME_UUID` | UUID v4 |
| `CHANGE_ME_PUBLIC_URL` | HTTPS URL | | `CHANGE_ME_PUBLIC_URL` | HTTPS URL |
| `CHANGE_ME_EMAIL` | E-Mail-Adresse | | `CHANGE_ME_EMAIL` | Email address |
| `STRIPE_SECRET_KEY=CHANGE_ME` | Stripe-artiger `sk_test_...` Wert | | `STRIPE_SECRET_KEY=CHANGE_ME` | Stripe-like `sk_test_...` value |
| `STRIPE_WEBHOOK_SECRET=CHANGE_ME` | Stripe-artiger `whsec_...` Wert | | `STRIPE_WEBHOOK_SECRET=CHANGE_ME` | Stripe-like `whsec_...` value |
| `AWS_ACCESS_KEY_ID=CHANGE_ME` | AWS/S3-artiges Access-Key-ID Format | | `AWS_ACCESS_KEY_ID=CHANGE_ME` | AWS/S3-like access key ID format |
Weitere Heuristiken decken typische `.env.example`-Variablen fuer SMTP, S3/MinIO, Redis, RabbitMQ, CORS, Log-Level, Environment-Flags und API Keys ab. Additional heuristics cover common `.env.example` variables for SMTP, S3/MinIO, Redis, RabbitMQ, CORS, log levels, environment flags, and API keys.
--- ---
## Standardwerte ## Default Values
Standardwerte werden in einer eigenen Sektion angezeigt. Die App erkennt naheliegende Defaults automatisch, zum Beispiel: Default values are shown in their own section. EnvHelper detects likely defaults automatically, for example:
| Key | Default | | Key | Default |
| --- | --- | | --- | --- |
@@ -145,37 +146,44 @@ Standardwerte werden in einer eigenen Sektion angezeigt. Die App erkennt nahelie
| `S3_REGION` | `eu-central-1` | | `S3_REGION` | `eu-central-1` |
| `REDIS_URL` | `redis://redis:6379/0` | | `REDIS_URL` | `redis://redis:6379/0` |
Manuelle Defaults koennen jederzeit hinzugefuegt werden. Sie ueberschreiben automatisch erkannte Defaults und wirken nur auf den Output, nicht auf die Eingabevorlage. Manual defaults can always be added. They override automatically detected defaults and only affect the output, never the input template.
--- ---
## Download und Artefakte ## Downloads and Artifacts
Der Windows-Build erzeugt zwei nutzbare Dateien: The Windows build produces two executable artifacts:
```text ```text
EnvHelper-0.1.0-setup-x64.exe EnvHelper-0.1.0-setup-x64.exe
EnvHelper-0.1.0-portable-x64.exe EnvHelper-0.1.0-portable-x64.exe
``` ```
Die Dateien werden vom Gitea Runner als Actions-Artefakt und als Generic Package veroeffentlicht. The files are published by the Gitea Runner as an Actions artifact and as a Generic Package.
--- ---
## Entwicklung ## Development
Install dependencies:
```bash ```bash
npm install npm install
```
Start the Vite development server:
```bash
npm run dev npm run dev
``` ```
Build pruefen: Check the production build:
```bash ```bash
npm run build npm run build
``` ```
Windows-Paket lokal bauen: Build Windows packages:
```bash ```bash
npm run dist:win npm run dist:win
@@ -185,48 +193,69 @@ npm run dist:win
## Windows Build ## Windows Build
Der produktive Windows-Build laeuft ueber Gitea Actions: The production Windows build runs through Gitea Actions:
```text ```text
.gitea/workflows/build-windows.yml .gitea/workflows/build-windows.yml
``` ```
Der Runner: The runner:
1. checkt das Repository aus, 1. checks out the repository,
2. installiert Node.js, 2. installs Node.js,
3. installiert Wine fuer Windows-Packaging auf Linux, 3. installs Wine for Windows packaging on Linux,
4. baut Vite, TypeScript und Electron, 4. builds Vite, TypeScript, and Electron,
5. erzeugt Setup und Portable EXE, 5. creates setup and portable executables,
6. laedt Artefakte und Packages nach Gitea hoch. 6. uploads artifacts and packages to Gitea.
--- ---
## Sicherheit ## README Generation
EnvHelper erzeugt Werte lokal im Renderer mit Web-Crypto. Die App ist ein Helfer fuer `.env`-Vorlagen und ersetzt keine zentrale Secret-Verwaltung fuer produktive Infrastruktur. The README structure follows the blueprint-based workflow from [`andreasbm/readme`](https://github.com/andreasbm/readme).
### Windows Defender und SmartScreen Source files:
Windows kann Apps mit unbekanntem Herausgeber blockieren oder verzoegert starten. Das liegt normalerweise an fehlender Reputation oder fehlendem vertrauenswuerdigem Code-Signing-Zertifikat. ```text
blueprint.md
blueprint.json
```
Der Workflow ist fuer Code Signing vorbereitet: Regenerate the README with:
```bash
npm run readme
```
The generated output is committed as `README.md` so Gitea can render it directly without any additional tooling.
---
## Security
EnvHelper generates values locally in the renderer using Web Crypto. It is a helper for `.env` templates and is not a replacement for a central secret manager in production infrastructure.
### Windows Defender and SmartScreen
Windows may block or delay apps from unknown publishers. This is usually caused by missing reputation or by the absence of a trusted code-signing certificate.
The workflow is prepared for code signing:
```text ```text
WINDOWS_CSC_LINK WINDOWS_CSC_LINK
WINDOWS_CSC_KEY_PASSWORD WINDOWS_CSC_KEY_PASSWORD
``` ```
`WINDOWS_CSC_LINK` ist das Zertifikat, zum Beispiel als Base64-kodierte `.pfx` Datei oder als erreichbare Zertifikats-URL. `WINDOWS_CSC_KEY_PASSWORD` ist das Passwort des Zertifikats. `WINDOWS_CSC_LINK` is the certificate, for example a Base64-encoded `.pfx` file or a reachable certificate URL. `WINDOWS_CSC_KEY_PASSWORD` is the certificate password.
--- ---
## Projektinfos ## Project Info
| Feld | Wert | | Field | Value |
| --- | --- | | --- | --- |
| Autor | `MrSphay` | | Author | `MrSphay` |
| Repository | `MrSphay/envHelper` | | Repository | `MrSphay/envHelper` |
| App-ID | `de.wilkensxl.envhelper` | | App ID | `de.wilkensxl.envhelper` |
| Stack | Electron, React, Vite, TypeScript | | Stack | Electron, React, Vite, TypeScript |
| README-Stil | Inspiriert von `andreasbm/readme` | | README workflow | Blueprint-inspired workflow based on `andreasbm/readme` |

33
blueprint.json Normal file
View File

@@ -0,0 +1,33 @@
{
"ids": {
"github": "MrSphay/envHelper"
},
"badges": [
{
"alt": "Platform",
"img": "https://img.shields.io/badge/platform-Windows-2563eb",
"url": "https://git.wilkensxl.de/MrSphay/envHelper"
},
{
"alt": "Stack",
"img": "https://img.shields.io/badge/stack-Electron%20%2B%20React%20%2B%20TypeScript-0f766e",
"url": "https://www.electronjs.org/"
},
{
"alt": "Build",
"img": "https://img.shields.io/badge/build-Gitea%20Runner-a855f7",
"url": "https://docs.gitea.com/usage/actions/overview"
},
{
"alt": "Version",
"img": "https://img.shields.io/badge/version-0.1.0-111827",
"url": "https://git.wilkensxl.de/MrSphay/envHelper"
}
],
"headingPrefix": {
"1": "",
"2": ""
},
"line": "https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png",
"text": "A local Windows desktop app for turning .env templates into deployable configuration files."
}

238
blueprint.md Normal file
View File

@@ -0,0 +1,238 @@
{{ template:title }}
{{ template:badges }}
---
{{ template:table-of-contents }}
---
## Overview
EnvHelper reads `.env` files or plain text, detects `CHANGE_ME` placeholders, infers the required value format, and produces a ready-to-use output file. Identical placeholders are replaced with the same generated value, so related variables such as `DATABASE_URL` and `POSTGRES_PASSWORD` stay in sync.
The app is local-first. It does not send generated secrets or input files to external services.
---
## Features
| Area | Description |
| --- | --- |
| File and text input | Load `.env` files, paste text directly, copy output, or save a new `.env` |
| Placeholder replacement | Detects `CHANGE_ME...` values and replaces them with format-aware values |
| Consistency | Reuses the same generated value for repeated placeholders |
| Supported formats | Passwords, secrets, Base64, hex, UUIDs, ports, URLs, email addresses, and API key prefixes |
| Default values | Detects likely defaults automatically and allows manual overrides |
| Desktop UI | Compact Windows app with a native title bar, dark mode, and settings |
| Languages | German, English, Spanish, French, and Dutch |
| Build output | Windows setup and portable executables via Gitea Runner |
---
## Workflow
```text
1. Load a .env file or paste text.
2. Review automatically detected defaults or add your own.
3. Generate values for CHANGE_ME placeholders.
4. Copy the output or save it as a new .env file.
```
```text
Input Processing Output
----- ---------- ------
DATABASE_URL=... Detect placeholders DATABASE_URL=...
POSTGRES_PASSWORD=... -> Infer formats -> POSTGRES_PASSWORD=...
SESSION_SECRET=... Generate local values SESSION_SECRET=...
```
---
## Example
Input:
```env
APP_PORT=3000
NODE_ENV=production
PUBLIC_BASE_URL=CHANGE_ME_PUBLIC_URL
DATABASE_URL=postgresql://app_user:CHANGE_ME_POSTGRES_PASSWORD@postgres:5432/app_db
POSTGRES_PASSWORD=CHANGE_ME_POSTGRES_PASSWORD
SESSION_SECRET=CHANGE_ME_AT_LEAST_32_RANDOM_CHARACTERS
ENCRYPTION_KEY_BASE64=CHANGE_ME_32_RANDOM_BYTES_AS_BASE64
BOOTSTRAP_ADMIN_EMAIL=CHANGE_ME_EMAIL
BOOTSTRAP_ADMIN_PASSWORD=CHANGE_ME_LONG_INITIAL_ADMIN_PASSWORD
```
Possible output:
```env
APP_PORT=3000
NODE_ENV=production
PUBLIC_BASE_URL=https://example.local
DATABASE_URL=postgresql://app_user:K2d8rF7s...@postgres:5432/app_db
POSTGRES_PASSWORD=K2d8rF7s...
SESSION_SECRET=n9pS...urlSafeSecret
ENCRYPTION_KEY_BASE64=4G8t...base64Value
BOOTSTRAP_ADMIN_EMAIL=admin@example.local
BOOTSTRAP_ADMIN_PASSWORD=Wz4...strongPassword
```
The actual values are generated randomly on the local machine.
---
## Placeholder Detection
EnvHelper prioritizes the placeholder text over the surrounding variable name. This prevents cases such as `CHANGE_ME_POSTGRES_PASSWORD` inside `DATABASE_URL` from being misclassified as a URL.
Supported examples:
| Pattern | Result |
| --- | --- |
| `CHANGE_ME_POSTGRES_PASSWORD` | Strong URL-safe password |
| `CHANGE_ME_32_RANDOM_BYTES_AS_BASE64` | 32 random bytes encoded as Base64 |
| `CHANGE_ME_HEX_TOKEN` | Random bytes encoded as hex |
| `CHANGE_ME_UUID` | UUID v4 |
| `CHANGE_ME_PUBLIC_URL` | HTTPS URL |
| `CHANGE_ME_EMAIL` | Email address |
| `STRIPE_SECRET_KEY=CHANGE_ME` | Stripe-like `sk_test_...` value |
| `STRIPE_WEBHOOK_SECRET=CHANGE_ME` | Stripe-like `whsec_...` value |
| `AWS_ACCESS_KEY_ID=CHANGE_ME` | AWS/S3-like access key ID format |
Additional heuristics cover common `.env.example` variables for SMTP, S3/MinIO, Redis, RabbitMQ, CORS, log levels, environment flags, and API keys.
---
## Default Values
Default values are shown in their own section. EnvHelper detects likely defaults automatically, for example:
| Key | Default |
| --- | --- |
| `BOOTSTRAP_ADMIN_EMAIL` | `admin@example.local` |
| `NODE_ENV` | `production` |
| `LOG_LEVEL` | `info` |
| `SMTP_PORT` | `587` |
| `S3_REGION` | `eu-central-1` |
| `REDIS_URL` | `redis://redis:6379/0` |
Manual defaults can always be added. They override automatically detected defaults and only affect the output, never the input template.
---
## Downloads and Artifacts
The Windows build produces two executable artifacts:
```text
EnvHelper-0.1.0-setup-x64.exe
EnvHelper-0.1.0-portable-x64.exe
```
The files are published by the Gitea Runner as an Actions artifact and as a Generic Package.
---
## Development
Install dependencies:
```bash
npm install
```
Start the Vite development server:
```bash
npm run dev
```
Check the production build:
```bash
npm run build
```
Build Windows packages:
```bash
npm run dist:win
```
---
## Windows Build
The production Windows build runs through Gitea Actions:
```text
.gitea/workflows/build-windows.yml
```
The runner:
1. checks out the repository,
2. installs Node.js,
3. installs Wine for Windows packaging on Linux,
4. builds Vite, TypeScript, and Electron,
5. creates setup and portable executables,
6. uploads artifacts and packages to Gitea.
---
## README Generation
The README structure follows the blueprint-based workflow from [`andreasbm/readme`](https://github.com/andreasbm/readme).
Source files:
```text
blueprint.md
blueprint.json
```
Regenerate the README with:
```bash
npm run readme
```
The generated output is committed as `README.md` so Gitea can render it directly without any additional tooling.
---
## Security
EnvHelper generates values locally in the renderer using Web Crypto. It is a helper for `.env` templates and is not a replacement for a central secret manager in production infrastructure.
### Windows Defender and SmartScreen
Windows may block or delay apps from unknown publishers. This is usually caused by missing reputation or by the absence of a trusted code-signing certificate.
The workflow is prepared for code signing:
```text
WINDOWS_CSC_LINK
WINDOWS_CSC_KEY_PASSWORD
```
`WINDOWS_CSC_LINK` is the certificate, for example a Base64-encoded `.pfx` file or a reachable certificate URL. `WINDOWS_CSC_KEY_PASSWORD` is the certificate password.
---
## Project Info
| Field | Value |
| --- | --- |
| Author | `MrSphay` |
| Repository | `MrSphay/envHelper` |
| App ID | `de.wilkensxl.envhelper` |
| Stack | Electron, React, Vite, TypeScript |
| README workflow | Blueprint-inspired workflow based on `andreasbm/readme` |

View File

@@ -14,7 +14,8 @@
"dev": "vite --host 127.0.0.1", "dev": "vite --host 127.0.0.1",
"build": "tsc --noEmit && vite build && tsc -p tsconfig.electron.json", "build": "tsc --noEmit && vite build && tsc -p tsconfig.electron.json",
"dist:win": "npm run build && electron-builder --win nsis portable --x64 --publish never", "dist:win": "npm run build && electron-builder --win nsis portable --x64 --publish never",
"lint": "tsc --noEmit" "lint": "tsc --noEmit",
"readme": "npx --yes @appnest/readme generate -i blueprint.md -c blueprint.json"
}, },
"dependencies": { "dependencies": {
"lucide-react": "^0.468.0", "lucide-react": "^0.468.0",

View File

@@ -54,6 +54,7 @@ const translations = {
values: "Werte", values: "Werte",
defaultsApplied: "Defaults", defaultsApplied: "Defaults",
source: "Quelle", source: "Quelle",
file: "Datei",
text: "Text", text: "Text",
defaults: "Standardwerte", defaults: "Standardwerte",
defaultsHint: "Mögliche Standardwerte werden erkannt; eigene Werte überschreiben passende Keys im Output.", defaultsHint: "Mögliche Standardwerte werden erkannt; eigene Werte überschreiben passende Keys im Output.",
@@ -93,6 +94,7 @@ const translations = {
values: "Values", values: "Values",
defaultsApplied: "Defaults", defaultsApplied: "Defaults",
source: "Source", source: "Source",
file: "File",
text: "Text", text: "Text",
defaults: "Defaults", defaults: "Defaults",
defaultsHint: "Possible defaults are detected; custom values override matching keys in the output.", defaultsHint: "Possible defaults are detected; custom values override matching keys in the output.",
@@ -132,6 +134,7 @@ const translations = {
values: "Valores", values: "Valores",
defaultsApplied: "Defaults", defaultsApplied: "Defaults",
source: "Origen", source: "Origen",
file: "Archivo",
text: "Texto", text: "Texto",
defaults: "Valores predeterminados", defaults: "Valores predeterminados",
defaultsHint: "Se detectan valores posibles; los personalizados sobrescriben claves iguales.", defaultsHint: "Se detectan valores posibles; los personalizados sobrescriben claves iguales.",
@@ -171,6 +174,7 @@ const translations = {
values: "Valeurs", values: "Valeurs",
defaultsApplied: "Défauts", defaultsApplied: "Défauts",
source: "Source", source: "Source",
file: "Fichier",
text: "Texte", text: "Texte",
defaults: "Valeurs par défaut", defaults: "Valeurs par défaut",
defaultsHint: "Les valeurs possibles sont détectées; les valeurs personnalisées remplacent les clés.", defaultsHint: "Les valeurs possibles sont détectées; les valeurs personnalisées remplacent les clés.",
@@ -210,6 +214,7 @@ const translations = {
values: "Waarden", values: "Waarden",
defaultsApplied: "Defaults", defaultsApplied: "Defaults",
source: "Bron", source: "Bron",
file: "Bestand",
text: "Tekst", text: "Tekst",
defaults: "Standaardwaarden", defaults: "Standaardwaarden",
defaultsHint: "Mogelijke standaardwaarden worden herkend; eigen waarden overschrijven keys.", defaultsHint: "Mogelijke standaardwaarden worden herkend; eigen waarden overschrijven keys.",
@@ -244,7 +249,7 @@ function detectLanguage(): Language {
} }
const browserLanguage = navigator.language.slice(0, 2) as Language; const browserLanguage = navigator.language.slice(0, 2) as Language;
return browserLanguage in languageNames ? browserLanguage : "de"; return browserLanguage in languageNames ? browserLanguage : "en";
} }
function readDefaults(): EnvDefault[] { function readDefaults(): EnvDefault[] {
@@ -610,7 +615,7 @@ export default function App() {
<Stat label={t.hits} value={String(result.changedCount)} /> <Stat label={t.hits} value={String(result.changedCount)} />
<Stat label={t.values} value={String(result.replacements.length)} /> <Stat label={t.values} value={String(result.replacements.length)} />
<Stat label={t.defaultsApplied} value={String(result.defaultedKeys.length)} /> <Stat label={t.defaultsApplied} value={String(result.defaultedKeys.length)} />
<Stat label={t.source} value={loadedPath ? "Datei" : t.text} /> <Stat label={t.source} value={loadedPath ? t.file : t.text} />
</section> </section>
<section className="workbench"> <section className="workbench">