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"
- Exemple
- 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 :

- Les images peuvent ĂȘtre incorporĂ©es avec :
- Certains dossiers wiki contiennent un sous-dossier appelé
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-44. 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-58
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
- Mise Ă jour des bĂątiments/extensions
/src/modules/buildingListFilter/i18n/{lang}.root.json
- mise à jour par défaut
/src/modules/extendedCallWindow/i18n/{lang}.js
- mise Ă jour de
vehicleGroups
etstaffGroups
- mise Ă jour de
/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
- mettre Ă jour les traductions
Trouver des identifiants
Si vous ne connaissez pas un identifiant ou si l'identifiant requis n'est pas (encore) disponible dans notre API, 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.- Les couleurs seront utilisées dans le module Tableau de bord.
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
.
- Si le prix change avec l'augmentation du nombre de bĂątiments, veuillez le noter dans
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.
- Les ID d'extension commencent Ă compter Ă
- 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 fonctionmaxExtensionsFunction
. *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'attributstartClassrooms
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
alorsnewCells
(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 ĂȘtretrue
.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 ĂȘtretrue
- Chaque extension requiert au moins les attributs suivants
levelcost
(liste de texte, obligatoire) : Vous pouvez donner ici des informations sur ce que coûte l'augmentation du niveau.- Ces informations seront affichées dans le module Aperçu général.
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.- Ces informations seront affichées dans le module Aperçu général.
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
- ceci permet automatiquement que
Si un bùtiment est un centre de régulation, il doit avoir les attributs suivants :
isDispatchCenter
doit toujours ĂȘtretrue
.
Si un bĂątiment est une zone de transit, il doit avoir les attributs suivants :
isStagingArea
doit toujours ĂȘtretrue
.
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épartstartVehicles
(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.