Créez un jeu multilingue
Ce tutoriel explique comment utiliser l'API de langage de la Gamebuino META.
Intermédiaire
1h
Idée générale
l'API de langage fournit un type de variable qui remplace une simple chaîne de caractères que vous pouvez passer en paramètre à la plupart des fonctions d'affichage de la bibliothèque. C'est const MultiLang[]
. Voici un exemple simple qui affichera "Bonjour" en fonction du langage de la console :
const MultiLang hello[] = {
{ LANG_EN, "Hello" },
{ LANG_FR, "Bonjour" },
{ LANG_DE, "Hallo" },
};
gb.display.print(helloWorld);
Comme vous pouvez le voir, d'abord on définit la variable hello
de type const Multilang[]
. Ce tableau est rempli de toutes les traductions que l'on souhaite pour notre jeu. Ici on a l'anglais (EN), le français (FR), et l'allemand (DE).
Mais quelle langue sera affichée ? La langue de la console (définie par le joueur) est toujours sélectionnée si possible. Donc si le joueur a mis sa Gamebuino en allemand, tous les jeux seront en allemand. Si un jeu n'offre pas le langage du joueur, la traduction anglaise est choisie par défaut.
Autres utilisations
Ce type de variable (Multilang
) peut être utilisé avec à peu près toutes les fonctions possibles. Notamment quand on affiche du texte sur l'écran et quand on utilise l'interface graphique. Dans le cas où vous avez besoin d'une chaîne de caractères traduite, vous pouvez toujours utiliser la fonction gb.language.get comme ceci :
const MultiLang lang_fox[] = {
{ LANG_EN, "Fox" },
{ LANG_FR, "Renard" },
{ LANG_DE, "Fuchs" },
};
const char* fox = gb.language.get(lang_fox);
Et voilà, fox
peut être utilisé en tant que chaine de caractères partout où vous voulez la bonne traduction de "renard".
Utilisation avancée
Il existe des caractères spéciaux comme ö
, à
, â
etc. La plupart de ces caractères sont disponibles. Nous utilisons le charset ISO 8859-1. Cependant cela veut aussi dire que le fichier responsable de la mémorisation des définitions MultiLang, avec les caractères à accents, doit être sauvegardé dans le charset ISO-8859-1 (ou équivalent comme le Windows-1252). Sinon vous devez obligatoirement entrer le code hexadécimal du caractère. Par exemple, ö
devient \xF6
.
Nous vous recommandons d'avoir toutes vos définitions de variables de langage dans un fichier source (.cpp) à part avec un #include
qui inclut un fichier d'entête qui liste toutes les variables de langue. Cette méthode est utilisée pour le loader avec les fichiers language.cpp et language.h.
En mettant les définitions de langage dans un fichier externe, vous aurez surement des erreurs de compilation, étant donné que le compilateur n'est pas capable de savoir combien de langues vous utilisez par variable MultiLang[]
. Pour cela, vous pouvez simplement déclarer le nombre de langues dans le paramètre LANGUAGE_DEFAULT_SIZE
dans config-gamebuino.h
(en savoir plus ici).
#define LANGUAGE_DEFAULT_SIZE 3
Une autre option est de manuellement passer le nombre de langues dans gb.language.get
:
const char* string = gb.language.get(lang_string, 3);
Utilisation très avancée
Pour aller plus loin vous aurez peut-être besoin de savoir quelle langue est actuellement utilisée par la console. Pour, par exemple, charger la bonne version d'un sprite qui a du texte ou avoir un bout de texte compressé etc. Pour vous aider, utilisez gb.language.getCurrentLang:
Gamebuino_Meta::LangCode langCode = gb.language.getCurrentLang();
if (langCode == LANG_EN) {
// notre code si la console est en anglais
} else if (langCode == LANG_DE) {
// notre code si la console est en français
}
Remarque : cette méthode devrait être utilisée le moins souvent possible, vu que gb.language.get
a une option de repli automatique. Si vous utilisez gb.language.getCurrentLang
, il est fortement conseillé d'avoir une option de repli.
Mais quelles langues sont présentes? Et bien quasiment toutes ! Cependant, les seules que l'on peut choisir dans le loader sont :
- Anglais
LANG_EN
- Français
LANG_FR
- Allemand
LANG_DE
- Espagnol
LANG_ES
- Néerlandais
LANG_NL
Une questions / un commentaires / une suggestions ? Laissez-nous un commentaire plus bas :-)