@agametis/create-app-for-fm
Version:
Tool for selecting a starter project for FileMaker applications
421 lines (403 loc) • 14 kB
JavaScript
// Language translations for the CLI tool
import os from "os";
// Detect the user's system language
// Returns 'de' for German, 'en' for all other languages
export function detectLanguage() {
try {
// Get the system locale from environment variables
const locale =
process.env.LANG ||
process.env.LC_ALL ||
process.env.LC_MESSAGES ||
process.env.LANGUAGE ||
os.locale ||
"en";
// Check if the locale starts with 'de' (German)
return locale.toLowerCase().startsWith("de") ? "de" : "en";
} catch (error) {
// Default to English if there's any error
return "en";
}
}
// Get the current language
const currentLanguage = detectLanguage();
// Translation strings
const translations = {
common: {
availableScripts: {
de: "Verfügbare Skripte:",
en: "Available scripts:",
},
checkReadme: {
de: "\n📖 Überprüfe die README.md-Datei für weitere Informationen.",
en: "\n📖 Check the README.md file for more information.",
},
directoryNotEmpty: {
de: "🚨 Aktuelles Verzeichnis ist nicht leer. Dateien könnten überschrieben werden. Fortfahren?",
en: "🚨 Current directory is not empty. Files might be overwritten. Continue?",
},
error: {
de: "\n❌ Error: ",
en: "\n❌ Error: ",
},
initializationError: {
de: "\n❌ Fehler bei der Initialisierung: {error}",
en: "\n❌ Error during initialization: {error}",
},
installDependencies: {
de: ". Installiere Abhängigkeiten: ",
en: ". Install dependencies: ",
},
nextSteps: {
de: "🔸 Nächste Schritte:",
en: "🔸 Next steps:",
},
operationCancelled: {
de: "\n🛑 Vorgang abgebrochen.",
en: "\n🛑 Operation cancelled.",
},
preparingTemplate: {
de: "\n💾 Vorlage wird vorbereitet...",
en: "\n💾 Preparing template...",
},
selectTemplate: {
de: "📋 Wähle eine Vorlage aus GitHub Repositories:",
en: "📋 Choose a template from GitHub repositories:",
},
selectedPackageManager: {
de: "\n📦 Ausgewählter Paketmanager: ",
en: "\n📦 Selected package manager: ",
},
startDevServer: {
de: "Starte den Entwicklungsserver",
en: "Start the development server",
},
templateCopied: {
de: "\n💾 Vorlagendateien wurden erfolgreich kopiert.",
en: "\n💾 Template files were successfully copied.",
},
userCancelled: {
de: "\n🛑 Vorgang vom Benutzer abgebrochen.",
en: "\n🛑 Operation cancelled by user.",
},
},
// Create command translations
create: {
changeToDirectory: {
de: " 1. Wechsle in das Projektverzeichnis: cd ",
en: " 1. Change to the project directory: cd ",
},
checkReadmeInDirectory: {
de: "\n📚 Prüfe die README-Datei im Projektverzeichnis für weitere Anweisungen.",
en: "\n📚 Check the README file in the project directory for further instructions.",
},
chooseAnotherName: {
de: "Bitte wähle einen anderen Projektnamen oder lösche das vorhandene Verzeichnis.",
en: "Please choose another project name or delete the existing directory.",
},
currentDirectory: {
de: "Im aktuellen Verzeichnis",
en: "In the current directory",
},
directoryExists: {
de: "\n❌ Fehler: Verzeichnis existiert bereits und ist nicht leer.",
en: "\n❌ Error: Directory already exists and is not empty.",
},
downloadError: {
de: "\n❌ Fehler beim Herunterladen der Vorlage: ",
en: "\n❌ Error downloading template: ",
},
initialProjectName: {
de: "meine-fm-vorlage",
en: "my-fm-template",
},
locationChoice: {
de: "📂 Wo möchtest du dein Projekt erstellen?",
en: "📂 Where would you like to create your project?",
},
newDirectory: {
de: "In einem neuen Verzeichnis",
en: "In a new directory",
},
packageJsonFound: {
de: "\n📚 Vorlage enthält package.json - Initialisierung übersprungen.",
en: "\n📚 Template contains package.json - Initialization skipped.",
},
packageManager: {
de: "📦 Wähle einen Paketmanager:",
en: "📦 Choose a package manager:",
},
projectName: {
de: "📝 Projektname:",
en: "📝 Project name:",
},
selectedTemplate: {
de: "\n📋 Ausgewählte Vorlage: ",
en: "\n📋 Selected template: ",
},
setupComplete: {
de: "\n✅ Projekt-Setup abgeschlossen!\n",
en: "\n✅ Project setup completed!\n",
},
setupInCurrentDir: {
de: "\n✨ Projekt wird im aktuellen Verzeichnis eingerichtet: ",
en: "\n✨ Setting up project in current directory: ",
},
setupInNewDir: {
de: "\n✨ Projekt wird in neuem Verzeichnis eingerichtet: ",
en: "\n✨ Setting up project in new directory: ",
},
successMessage: {
de: "👍 Viel Erfolg mit deinem neuen Projekt!\n",
en: "👍 Good luck with your new project!\n",
},
title: {
de: "\n📦 Erstelle dein Startprojekt für FileMaker\n",
en: "\n📦 Create your starter project for FileMaker\n",
},
},
// List command translations
list: {
availableTemplates: {
de: "\n📋 Verfügbare Vorlagen:\n",
en: "\n📋 Available templates:\n",
},
infoCommand: {
de: "Verwende 'create-app-for-fm info <template>' für mehr Informationen zu einer Vorlage.",
en: "Use 'create-app-for-fm info <template>' for more information about a template.",
},
useInfoCommand: {
de: "Verwende 'create-app-for-fm info <template>' für mehr Informationen zu einer Vorlage.",
en: "Use 'create-app-for-fm info <template>' for more information about a template.",
},
},
// Info command translations
info: {
dependencies: {
de: "\n🔸 Abhängigkeiten:",
en: "\n🔸 Dependencies:",
},
description: {
de: "🔸 Beschreibung\n",
en: "🔸 Description\n",
},
errorFetchingInfo: {
de: "\n❌ Konnte keine zusätzlichen Informationen abrufen: ",
en: "\n❌ Could not retrieve additional information: ",
},
githubUrl: {
de: "\n🔸 GitHub URL\n",
en: "\n🔸 GitHub URL\n",
},
loadingMoreInfo: {
de: "\nLade weitere Informationen...",
en: "\nLoading more info...",
},
noTemplateName: {
de: "\n❌ Fehler: Kein Vorlagenname angegeben.",
en: "\n❌ Error: No template name provided.",
},
packageJsonInfo: {
de: "\n🔸 package.json Informationen:",
en: "\n🔸 package.json information:",
},
readmeFound: {
de: "\n🔸 README gefunden:\n",
en: "\n🔸 README found:\n",
},
readmeTruncated: {
de: "...",
en: "...",
},
scripts: {
de: "\n🔸 Skripte:",
en: "\n🔸 Scripts:",
},
templateInfo: {
de: "\n📋 Informationen zur Vorlage: ",
en: "\n📋 Information about template: ",
},
templateNotFound: {
de: "\n❌ Fehler: Vorlage nicht gefunden.",
en: "\n❌ Error: Template not found.",
},
visitGithub: {
de: "\n🔸 Besuche GitHub für mehr Details",
en: "\n🔸 Visit GitHub for more details",
},
},
// Init command translations
init: {
downloadingTemplateFiles: {
de: "\n💾 Lade Vorlagendateien herunter...",
en: "\n💾 Downloading template files...",
},
goodLuck: {
de: "\n🚀 Viel Erfolg mit deinem Projekt!",
en: "\n🚀 Good luck with your project!",
},
initializationCancelled: {
de: "\n🛑 Initialisierung abgebrochen.",
en: "\n🛑 Initialization cancelled.",
},
initializingCurrentDirectory: {
de: "\n🚀 Initialisiere das aktuelle Verzeichnis als Projekt\n",
en: "\n🚀 Initializing the current directory as a project\n",
},
installDependenciesStep: {
de: " 1. Installiere Abhängigkeiten: {packageManager} install",
en: " 1. Install dependencies: {packageManager} install",
},
noPackageJsonFound: {
de: "\n💾 Keine package.json gefunden. Initialisiere neue package.json...",
en: "\n💾 No package.json found. Initializing new package.json...",
},
projectInitialized: {
de: "\n✅ Projekt erfolgreich initialisiert!",
en: "\n✅ Project successfully initialized!",
},
selectPackageManager: {
de: "📦 Wähle einen Paketmanager:",
en: "📦 Choose a package manager:",
},
templateFilesCopied: {
de: "\n✅ Vorlagendateien kopiert!",
en: "\n✅ Template files copied!",
},
},
// Utils translations
utils: {
cloneError: {
de: "\n❌ Fehler beim Klonen des Repositories: {error}",
en: "\n❌ Error cloning repository: {error}",
},
gitNotInstalledError: {
de: "\nDieser Fehler kann auftreten, weil Git nicht auf Ihrem System installiert ist. Bitte installieren Sie Git von https://git-scm.com/downloads und versuchen Sie es erneut.",
en: "\nThis error may occur because Git is not installed on your system. Please install Git from https://git-scm.com/downloads and try again.",
},
dependenciesInstalled: {
de: "\n✅ Abhängigkeiten erfolgreich installiert!",
en: "\n✅ Dependencies successfully installed!",
},
dependencyInstallError: {
de: "\n❌ Fehler bei der Installation der Abhängigkeiten: {error}",
en: "\n❌ Error installing dependencies: {error}",
},
initializationError: {
de: "\n❌ Fehler bei der Initialisierung mit {packageManager}: {error}",
en: "\n❌ Error initializing with {packageManager}: {error}",
},
initializingPackageManager: {
de: "\n📦 Initialisiere Paketmanager...",
en: "\n📦 Initializing package manager...",
},
installingDependencies: {
de: "\n📦 Installiere Abhängigkeiten...",
en: "\n📦 Installing dependencies...",
},
manualInstallInstructions: {
de: "Bitte installiere die Abhängigkeiten manuell mit dem Befehl 'npm install', 'yarn install' oder 'pnpm install'.",
en: "Please install the dependencies manually using the command 'npm install', 'yarn install', or 'pnpm install'.",
},
packageManagerCheckError: {
de: "\n❌ Fehler bei der Prüfung von {packageManager}: {error}",
en: "\n❌ Error checking {packageManager}: {error}",
},
packageManagerInitialized: {
de: "\n✅ Paketmanager initialisiert.",
en: "\n✅ Package manager initialized.",
},
packageManagerNotAvailable: {
de: "\n❌ {packageManager} ist nicht verfügbar: {error}",
en: "\n❌ {packageManager} is not available: {error}",
},
skippingPackageManagerInit: {
de: "\n📝 Dieses Projekt benötigt keine package.json - Initialisierung übersprungen.",
en: "\n📝 This project doesn't require package.json - Initialization skipped.",
},
},
// Config translations
config: {
fmStarterViteDesc: {
de: "Eine allgemeine Vorlage für FileMaker-Projekte",
en: "A general template for FileMaker projects",
},
fmStarterReactDesc: {
de: "Eine React-Vorlage für FileMaker-Projekte",
en: "A React template for FileMaker projects",
},
fmStarterGoogleMapsDesc: {
de: "Vorlage mit einer Google Maps Integration für FileMaker-Projekte",
en: "A template with Google Maps integration for FileMaker projects",
},
fmReactDemoDesc: {
de: "Eine Demo-React-Anwendung für eine FileMaker-Integration",
en: "A demo React application for FileMaker integration",
},
fmk2022DemosDesc: {
de: "Präsentationen und Demo-Dateien von der FMK 2022",
en: "Presentations and demo files from the FMK 2022",
},
fmk2023DemosDesc: {
de: "Präsentationen und Demo-Dateien von der FMK 2023",
en: "Presentations and demo files from the FMK 2023",
},
fmk2024DemosDesc: {
de: "Präsentationen und Demo-Dateien von der FMK 2024",
en: "Presentations and demo files from the FMK 2024",
},
},
// CLI translations
cli: {
createDescription: {
de: "Erstelle ein neues Projekt",
en: "Create a new project",
},
infoDescription: {
de: "Zeigt Informationen zu einer Vorlage",
en: "Show information about a template",
},
initDescription: {
de: "Initialisiert das aktuelle Verzeichnis als Projekt",
en: "Initialize the current directory as a project",
},
listDescription: {
de: "Zeigt verfügbare Vorlagen an",
en: "Show available templates",
},
mainDescription: {
de: "Erstelle ein neues Projekt für FileMaker",
en: "Create a new project for FileMaker",
},
},
};
// Helper function to get translation string
export function t(key, params = {}) {
// Split the key by dots to navigate the translations object
const keys = key.split(".");
// Navigate through the translations object
let result = translations;
for (const k of keys) {
if (result[k] === undefined) {
console.error(`Translation key not found: ${key}`);
return key; // Return the key itself as fallback
}
result = result[k];
}
// Get the translation for the current language, fallback to English
const translation = result[currentLanguage] || result["en"];
if (!translation) {
console.error(
`Translation not found for key: ${key} in language: ${currentLanguage}`,
);
return key; // Return the key itself as fallback
}
// Replace parameters in the translation string if any
let translatedText = translation;
for (const [param, value] of Object.entries(params)) {
translatedText = translatedText.replace(`{${param}}`, value);
}
return translatedText;
}
// Export the current language for reference
export const language = currentLanguage;