Guide de la traduction

Chaque langue possÚde son propre code de langue (souvent appelé langcode) pour une identification facile. Si vous ne connaissez pas le code de langue correct pour votre version, veuillez demander à l'équipe LSSM.

Dans les textes suivants, nous utiliserons {lang} comme espace pour les codes de langue. Lors de la traduction, assurez-vous de le remplacer par votre code de langue spécifique. Exemple: fr_FR est le code de traduction pour le français de France.

Codes de langue, spécification

Chaque code suit le format xx_YY, oĂč xx est le code de langue spĂ©cifiĂ© en [ISO 639-1] (https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) et YY est le pays selon [ISO 3166-1 alpha-2] (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements) .

Paths

Il y a quelques points oĂč les fichiers de traduction sont stockĂ©s :

  • Docs alias le Wiki
    • /docs/{lang}/ Les pages principales du wiki
      • telles que Accueil, FAQ, App Store etc. En gros, tous les fichiers que vous pouvez trouver dans la barre latĂ©rale Ă  gauche, sauf les modules.
      • Par exemple, on trouve suggestions.md. Ici
    • /docs/.vuepress/i18n/{lang}.json certaines phrases statiques
      • Exemple home: "Retour Ă  l'accueil"
  • Fichiers principaux (ils sont nĂ©cessaires pour que LSSM soit disponible dans votre langue)
    • /src/i18n/{lang}.ts
    • il peut aussi y avoir un dossier /src/i18n/{lang}/ qui contient des traductions supplĂ©mentaires (actuellement seulement pour les tableaux) mais elles ne sont pas pertinentes pour que LSSM fonctionne correctement.
  • Modules (oĂč {module} reprĂ©sente un des modules disponibles)
    • /src/modules/{module}/i18n/ Les traductions des modules
    • /src/modules/{module}/docs/ Les pages du wiki
      • Certains dossiers wiki contiennent un sous-dossier appelĂ© assets, rĂ©servĂ© aux images de la page wiki : /src/modules/{module}/docs/assets/{lang}/.
        • Les images peuvent ĂȘtre incorporĂ©es avec : ![Description](./imageName.png)

Pour commencer une nouvelle traduction, créez un nouveau fichier en cliquant sur "Add file" et sélectionnez "Create new file".

Tip

Si vous devez crĂ©er un nouveau dossier, procĂ©dez de la mĂȘme maniĂšre mais placez un / derriĂšre le nom du dossier et continuez avec le nom de votre fichier.

va créer le dossier de_DE contenant un fichier dummy.file.

"Meilleure pratique"

Chaque dossier contient au moins une traduction allemande et une traduction anglaise. Le plus simple est de copier le contenu de ce fichier dans votre nouveau fichier. Cela vous permet d'éviter d'oublier une parenthÚse ou une virgule.

Faire des traductions

Tous les fichiers .json suivent le mĂȘme schĂ©ma qui est "key" : value. Lors de la traduction, tout ce que vous avez Ă  faire est de mettre Ă  jour les valeurs dans votre langue.

Exemple:

{
	"name": "Appstore",
	"description": "The Appstore is a User-Interface to enable and disable modules.",
	"changes": "There are no changes|There is 1 change|There are {n} changes",
	"buttons": {
		"save": "Save",
		"close": "Close"
	}
	"incompatible": "Unfortunately, {newModule} is incompatible with {currentModule}. They cannot be enabled at the same time currently."
}



 




 

pourrait ĂȘtre traduit en allemand de la maniĂšre suivante :

{
	"name": "Appstore",
	"description": "Der Appstore bietet eine BenutzeroberflÀche zum (de-)aktivieren von Modulen.",
	"changes": "Es gibt keine Änderungen|Es gibt eine Änderung|Es gibt {n} Änderungen",
	"buttons": {
		"save": "Speichern",
		"close": "Schließen"
	},
	"incompatible": "Leider ist {newModule} mit dem Modul {currentModule} inkompatibel, sodass diese nicht gleichzeitig aktiviert sein können."
}

Notez, comment seulement les valeurs ont été changées.

Certaines traductions peuvent avoir des formes diffĂ©rentes pour le singulier et le pluriel, ou mĂȘme des formes plus complexes. La ligne 4 montre un tel exemple de cas et comment les formes sont sĂ©parĂ©es avec les tubes |. De plus, la variable {n} sera remplacĂ©e par le nombre correspondant.

De plus, des variables peuvent parfois apparaĂźtre dans les fichiers de traduction (voir ligne 9). Elles sont toujours entourĂ©es d'accolades {} et vous n'ĂȘtes pas autorisĂ© Ă  changer le nom Ă  l'intĂ©rieur, car il s'agit d'un espace rĂ©servĂ© pour une valeur dynamique.

Nombres dans les fichiers de traduction

Parfois, des nombres Ă  l'aspect Ă©trange peuvent apparaĂźtre dans les traductions. Ils indiquent gĂ©nĂ©ralement l'utilisation d'identifiants, qui sont spĂ©cifiques au jeu. Si vous n'ĂȘtes pas sĂ»r des ID corrects, veuillez contacter l'Ă©quipe LSSM et demander de l'aide.

Exemple pour bĂątiments :

/src/modules/buildingListFilter/i18n/en_GB.root.json, lines 2-44open in new window. Ici, les chiffres reprĂ©sentent les types de bĂątiments et peuvent devoir ĂȘtre ajustĂ©s, car la version britannique a des bĂątiments diffĂ©rents de ceux de la version amĂ©ricaine, comme vous pouvez le voir dans le tableau ci-dessous. /src/modules/buildingListFilter/i18n/en_US.root.json, lines 2-58open in new window

Contribution et création d'un PR

Veuillez consulter le guide de contribution pour savoir comment procéder.

Guides

Mise en Ɠuvre du contenu

En général, ces mises à jour sont nécessaires :

  • /src/i18n/{lang}.ts
    • Mise Ă  jour des vĂ©hicules
    • Mise Ă  jour des catĂ©gories de vĂ©hicules
    • Mise Ă  jour des catĂ©gories de bĂątiments
    • Mise Ă  jour des Ă©coles
    • Mise Ă  jour des listes de bĂątiments
      • vehicleBuildings, cellBuildings, cellExtensions, bedBuildings, schoolBuildings, dispatchCenterBuildings
  • /src/i18n/{lang}/fr_FR.ts
  • /src/modules/buildingListFilter/i18n/{lang}.root.json
    • mise Ă  jour par dĂ©faut
  • /src/modules/extendedCallWindow/i18n/{lang}.js
    • mise Ă  jour de vehicleGroups et staffGroups
  • /src/modules/extendedCallWindow/i18n/{lang}.root.json
    • Mise Ă  jour des onglets personnalisĂ©s par dĂ©faut
  • /src/modules/missionHelper/i18n/{lang}.json
    • mettre Ă  jour les traductions
      • prerequisites
      • requirements
      • vehicles

Trouver des identifiants

Si vous ne connaissez pas un identifiant ou si l'identifiant requis n'est pas (encore) disponible dans notre APIopen in new window, veuillez utiliser ces guides pour le trouver.

Les URLs présentées ici utilisent operateur112.fr pour la démonstration. Veuillez la remplacer par l'URL de votre jeu.

Exécuter du code dans la console du navigateur

Cette opĂ©ration est simple mais peut ĂȘtre dangereuse. Si vous n'avez pas confiance en nous et au code que nous voulons que vous exĂ©cutiez, cela est bien ! Contactez simplement l'Ă©quipe LSSM, et nous vous fournirons les identifiants.

Pour ouvrir la console, appuyez sur F12, Ctrl+Shift+K ou Ctrl+Shift+I (certains navigateurs autorisent toutes ces touches, d'autres une seule). Si la console n'est pas encore visible, veuillez cliquer sur l'onglet Console dans le popup.

Vous pouvez maintenant copier le code de nos extraits de code fournis ci-dessous et le coller dans la console. Certains navigateurs (comme Firefox) vous demandent de taper une courte phrase. Tapez-la simplement, Firefox la remplacera par le code, une fois que vous aurez terminé la phrase.

Lorsque le code est collé dans la console, il suffit d'appuyer sur la touche Enter de votre clavier pour exécuter l'extrait. Le résultat apparaßtra automatiquement dans la console, mais certains d'entre eux peuvent prendre quelques secondes.

Avis de non-responsabilité de l'API

L'API est générée à partir des fichiers de traduction et peut donc contenir des valeurs erronées. En cas d'insécurité, veuillez toujours utiliser les informations disponibles dans le jeu !

Véhicules

API: https://api.lss-manager.de/{lang}/vehicles

Allez sur https://www.operateur112.fr/vehicle_graphics/new et créez un nouvel ensemble graphique. Si vous en possédez déjà un, vous pouvez également vous rendre sur sa page d'édition.

Exécutez le code suivant dans la console de votre navigateur. Il retournera une liste de véhicules et leur ID :

Object.fromEntries(Array.from(document.querySelectorAll('table tbody tr')).map(row => [new URL(row.querySelector('a[href^="/vehicle_graphics/"][href*="/vehicle_graphic_images/"][href$="/edit"]')?.href ?? '/', window.location.origin).pathname.split('/')[4], row.querySelector('td:first-child')?.textContent.trim()]).filter(([id, name]) => id && name)) 

BĂątiments

API : https://api.lss-manager.de/{lang}/buildings

Allez sur https://www.operateur112.fr/buildings/new, le formulaire pour crĂ©er un nouveau bĂątiment devrait ĂȘtre affichĂ©.

Exécutez le code suivant dans la console de votre navigateur. Il retournera une liste de bùtiments et leur ID :

Object.fromEntries(Array.from(document.querySelectorAll('#building_building_type option')).map(option => [option.value, option.textContent.trim()]).filter(([id, name]) => id && name))

Missions

Il y a une liste officielle des missions : https://www.operateur112.fr/einsaetze.json.

Pour obtenir toutes les missions, groupées par leur date de début et de fin, exécutez le code suivant dans le jeu : (remplacez www.operateur112.fr par votre jeu bien sûr)

fetch('https://www.operateur112.fr/einsaetze.json').then(res => res.json()).then(m => {const g = {}; m.forEach(e => {const d = `${e.additional.date_start} - ${e.additional.date_end}`; if(!g[d]) {g[d] = []} g[d].push(e)}); console.log(g)})

Chaque groupe est un objet d'IDs avec le nom de mission correspondant.

POIs

Pour obtenir une liste à jour des POIs pour /src/i18n/{lang}.ts, allez sur https://www.operateur112.fr/mission_positions/new et exécutez le code suivant dans la console de votre navigateur :

Array.from(document.querySelectorAll('#mission_position_poi_type option')).map(option => [option.value, option.textContent.trim()]).sort(([idA], [idB]) => idA - idB).map(([, caption]) => caption)

Aide sur des thĂšmes de traduction particuliers

BĂątiments et extensions

Les traductions se trouvent dans le fichier /src/i18n/{lang}/buildings.ts. Il suit la structure suivante[buildingType: number]: BuildingInformation. Vous pouvez récupérer l'ID de type de chaque bùtiment comme décrit dans la section Trouvé les IDs: Bùtiments.

Le BuildingInformation est composé de plusieurs informations obligatoires :

  • caption (texte, obligatoire): Le nom du bĂątiment. Doit ĂȘtre le mĂȘme que dans le jeu.
  • color (texte, obligatoire): Choisissez une couleur (code hexadĂ©cimal avec le prĂ©fixe #) qui convient au bĂątiment. Par exemple, pour les casernes de pompiers, un ton rouge est un bon choix.
  • credits (nombre, obligatoire): Combien coĂ»te ce bĂątiment en crĂ©dits.
    • Si le prix change avec l'augmentation du nombre de bĂątiments, veuillez le noter dans special.
  • coins (nombre, obligatoire): Combien coĂ»te le bĂątiment en PiĂšces.
  • extensions (liste des extensions, obligatoire): Les extensions qui sont disponibles pour ĂȘtre construites dans ce bĂątiment.
    • Chaque extension requiert au moins les attributs suivants
      • caption (texte, obligatoire): Le nom de l'extension. Doit ĂȘtre le mĂȘme que dans le jeu.
      • credits (nombre, obligatoire): Combien coĂ»te l'extension en crĂ©dits.
      • coins (nombre, obligatoire): Combien coĂ»te l'extension en PiĂšces.
      • duration (texte, obligatoire): Combien de temps il faut pour construire l'extension
        • cela pourrait ĂȘtre par exemple "7 jours".
    • certaines extensions ne peuvent ĂȘtre achetĂ©es sans avoir d'autres extensions Ă  cette station. Elles nĂ©cessitent les attributs suivants :
      • requiredExtensions (liste de nombre) : Les ID d'extension dont dĂ©pend cette extension.
        • Les ID d'extension commencent Ă  compter Ă  0 pour chaque type de bĂątiment.
    • certaines extensions peuvent ĂȘtre limitĂ©es par le nombre de bĂątiments (par exemple, une extension qui peut ĂȘtre achetĂ©e une fois toutes les 10 casernes de pompiers). Ils doivent contenir les attributs suivants :
      • maxExtensionsFunction (fonction) : renvoie un nombre indiquant combien de ces extensions peuvent actuellement ĂȘtre construites. Elle prend les paramĂštres suivants :
        • buildingsByType : Record<number, Building[]> oĂč Building est un bĂątiment tel que retournĂ© par l'API des bĂątiments du jeu.
      • canBuyByAmount (fonction) : renvoie un boolĂ©en indiquant si des extensions supplĂ©mentaires de ce type peuvent ĂȘtre achetĂ©es. Elle prend les paramĂštres suivants :
        • boughtExtensionsAmountByType : Record<number, Record<number, number>> liste le nombre d'extensions dĂ©jĂ  achetĂ©es pour chaque type de bĂątiment.
        • maxExtensions : number sera le rĂ©sultat de la fonction maxExtensionsFunction. *Si une extension ajoute une ou plusieurs nouvelles salles de classe au bĂątiment, les attributs suivants sont requis : Notez que le bĂątiment DOIT avoir l'attribut startClassrooms alors
      • newClassrooms (nombre) : indique le nombre de salles de classe ajoutĂ©es en terminant cette extension.
    • si une extension ajoute une ou plusieurs nouvelles cellules de prison au bĂątiment, les attributs suivants sont requis : Notez que le bĂątiment DOIT avoir l'attribut startCells alors
      • newCells (nombre) : indique le nombre de cellules de prison ajoutĂ©es en terminant cette extension.
    • si le fait de terminer cette extension dĂ©bloque de nouveaux vĂ©hicules pour cette station, donne de nouveaux parkings ou des vĂ©hicules cadeaux, les attributs suivants sont possibles :
      • isVehicleExtension doit toujours ĂȘtre true.
      • givesParkingLots (nombre, obligatoire) : Combien de nouveaux parkings sont ajoutĂ©s Ă  la fin de cette extension ?
        • mĂȘme si le lot est prĂ©-rempli avec un vĂ©hicule (le vĂ©hicule est douĂ©), il faut le mentionner ici
        • Si l'extension n'ajoute pas de nouveaux parkings, mettez la valeur "0".
      • givesParkingLotsPerLevel (nombre, optionnel) : Si l'extension donne un ou plusieurs parkings pour chaque niveau de station.
      • unlocksVehicleTypes (liste de nombre, optionnel) : Une liste de types de vĂ©hicules qui sont dĂ©bloquĂ©s pour cette station en terminant l'extension.
      • parkingLotReservations (liste de nombre, optionnel) : SpĂ©cifie si les parkings nouvellement ajoutĂ©s sont rĂ©servĂ©s pour certains types de vĂ©hicules.
        • Il s'agit d'une liste Ă  plusieurs Ă©lĂ©ments, car chaque Ă©lĂ©ment reprĂ©sente un parc de stationnement et les types de vĂ©hicules qui peuvent y ĂȘtre placĂ©s.
      • giftsVehicles (liste de nombre, optionnel) : Peut lister les Ids des types de vĂ©hicules qui sont automatiquement ajoutĂ©s Ă  la station en terminant l'extension
    • si l'extension ne peut pas ĂȘtre dĂ©sactivĂ©e (par exemple, les cellules de prison), ajoutez :
      • cannotDisable qui doit toujours ĂȘtre true
  • levelcost (liste de texte, obligatoire) : Vous pouvez donner ici des informations sur ce que coĂ»te l'augmentation du niveau.
  • maxBuildings (texte ou nombre, obligatoire) : Ceci indique combien de bĂątiments on peut acheter de ce type.
    • L'information sera affichĂ©e dans le module [Aperçu gĂ©nĂ©ral] module-overview.
    • S'il n'y a pas de limite, vous pouvez utiliser par exemple no limit'.
  • maxLevel (nombre, obligatoire) : DĂ©finit ici le nombre de fois que ce bĂątiment peut ĂȘtre agrandi / mis Ă  niveau.
    • Si ce bĂątiment ne peut pas ĂȘtre augmentĂ©, choisissez "0" comme valeur.
  • special (texte, obligatoire) : Cet attribut vous permet de donner des informations supplĂ©mentaires sur ce bĂątiment.

Si le nombre de bùtiments d'un type donné est limité par le nombre total de bùtiments que possÚde le joueur, définissez les attributs suivants :

  • maxBuildingsFunction (fonction) : renvoie un nombre indiquant combien de bĂątiments peuvent ĂȘtre construits actuellement. Prend les paramĂštres suivants :
    • buildingsAmountTotal (nombre) le nombre de bĂątiments que le joueur possĂšde actuellement.

Certains bĂątiments peuvent avoir des salles de classe ou des extensions qui ajoutent des salles de classe. Les attributs suivants doivent ĂȘtre dĂ©finis pour ces bĂątiments :

  • startClassrooms (nombre)

Certains bĂątiments peuvent avoir des cellules de prison ou des extensions qui ajoutent des cellules de prison. Les attributs suivants doivent ĂȘtre dĂ©finis pour ces bĂątiments :

  • startCells (nombre)

Certains bĂątiments peuvent comporter des lits d'hĂŽpital. Les attributs suivants doivent ĂȘtre dĂ©finis pour eux :

  • startBeds (nombre)
    • ceci permet automatiquement que level augmente aussi le nombre de lits disponibles

Si un bùtiment est un centre de régulation, il doit avoir les attributs suivants :

  • isDispatchCenter doit toujours ĂȘtre true.

Si un bĂątiment est une zone de transit, il doit avoir les attributs suivants :

  • isStagingArea doit toujours ĂȘtre true.

Si un bùtiment peut avoir des véhicules, les attributs suivants sont possibles en plus :

  • startPersonnel (nombre, obligatoire) : combien de personnes le bĂątiment a au dĂ©part
  • startVehicles (liste de texte, obligatoire) : quels vĂ©hicules peuvent ĂȘtre sĂ©lectionnĂ©s comme premier vĂ©hicule (ou si c'est toujours le mĂȘme vĂ©hicule)
  • liste vide, si aucun vĂ©hicule ne peut ĂȘtre sĂ©lectionnĂ©
    • liste de chaĂźnes de caractĂšres, car elle n'est affichĂ©e que dans Aperçu gĂ©nĂ©ral et n'est pas traitĂ©e par la suite.
  • startParkingLots (nombre, obligatoire) : combien de parkings il y a au dĂ©part.
  • schoolingTypes (liste de texte, obligatoire) : dans quelles Ă©coles ce type de bĂątiment est affichĂ©. important : aprĂšs avoir commencĂ© une nouvelle Ă©cole / un nouveau cours, le nom de l'Ă©cole aura la forme {schoolType} - {schoolingName}. Les valeurs de cet attribut doivent ĂȘtre la partie {schoolType}, pas le nom de l'Ă©cole elle-mĂȘme !
  • startParkingLotReservations (liste de nombre, optionnel) : si les parkings initiaux sont rĂ©servĂ©s Ă  certains types de vĂ©hicules.
    • Il s'agit d'une liste multi-niveaux car chaque Ă©lĂ©ment reprĂ©sente un parking et les types de vĂ©hicules qui peuvent y ĂȘtre mis.
  • parkingLotsPerLevel (nombre, optionnel) : si chaque niveau ne donne pas un nouveau parking, le nombre doit ĂȘtre changĂ© ici.