L'internationalisation et ses pièges : créer un logiciel international

a marqué ce sujet comme résolu.

Tout le monde se secoue ! :D

J’ai commencé (il y a 5 heures) la rédaction d’un tutoriel au doux nom de « L’internationalisation et ses pièges : créer un logiciel international » et j’ai pour objectif de proposer en validation un texte aux petits oignons. Je fais donc appel à votre bonté sans limites pour dénicher le moindre pépin, que ce soit à propos du fond ou de la forme. Vous pourrez consulter la bêta à votre guise à l’adresse suivante :

Merci !

Tu peux aussi citer un élément que 99,99% des sites (sites, logiciels, même combat) font mal: le formulaire nom/prénom qu’on trouve de partout alors que le principe de nom et prénom change totalement suivant les pays. Pour bien faire, on ne devrait avoir qu’un champ libre nom.

Des exemple au hasard:

  • Les Espagnols avec leurs noms de famille à rallonge
  • Les Sri-Lankais qui intervertissent leur prénom avec le nom de leur père (ou l’inverse, je ne sais plus exactement). Un ancien collègue, son prénom était son nom de famille au regard de l’état civil en France.
  • Les middlenames et autres Jr/Sr aux USA
  • Les Islandais qui se nomment prénom + prénom-du-père + son/dottir. Au point que l’annuaire est classé par prénom et non par nom)… D’où l’utilité toute relative du nom de famille.
+1 -0

C’est rigolo comme tuto ^^

Un jour j’ai eu à me pencher sur « La représentation de pays sur une carte ».
Des barres. Pas moyen de faire un truc géopolitiquement correcte, les pays sont généralement pas d’accord entre eux. Puisqu’il est question de Russie et du Japon, on peut prendre par exemple les îles Kouriles qui fait que les deux îles sont officiellement toujours en « guerre ». 🤦

Il existe un tas de cas comme celui-ci. Vraiment un tas.

J’aurais également rajouter un point sur la gestion du calendrier, la complexité de celui-ci.

De manière générale, je suis content qu’il y aie des liens comme « Wikipedia propose un échantillon de différents systèmes d’adresse à l’international. ». J’aurais également apprécié un exemple.

    〒600-8216
    京都府京都市下京区東塩小路721-1
    600-8216, Kyōto-fu, Kyōto-shi, Shimogyō-ku, Higashi-Shiokōji 721-1

vs

Пьянков Андрей Сергеевич
ул. Лесная, д. 5, кв. 176
Москва
Россия
125075

J’ai aimé ce tuto ^^

+1 -0

Je note déjà qu’il faut je trouve un titre moins redondant…

@Fumble : j’en parle ici. Tu penses que plus de précision serait bienvenue ?

SpaceFox

Ah je suis passé un peu vite sur le texte en voyant adresse postale. Ton explication à ce sujet est très bien. Désolé.

+0 -0

J’ai lu le texte, dans l’ensemble c’est sympa. :)

Après cela manque sans doute de détails, tu listes des éléments sans que cela soient forcément illustrés ou plus explicites que cela. Je pense qu’il y a moyen d’enrichir les sections concernées.

Sinon quelques points que tu as oublié j’ai l’impression.

Concernant le calendrier, tu as d’autres détails plus subtiles qui peuvent être très perturbants. Exemple en date, au boulot on a un logiciel de gestion configuré en mode américain, et le premier jour de la semaine est donc un dimanche et non le lundi comme en France / Belgique. Du coup si tu ne fais pas gaffe tu te retrouves rapidement à décaler tes sélections…

Pour la représentation des adresses, on peut citer des différences subtiles aussi à ne pas négliger. En Belgique, le numéro du bâtiment est mentionné après le nom de la rue. Contrairement à la France. Mais sinon je pense que si le champ libre pour paramétrer l’adresse doit être proposée pour éviter de bloquer inutilement un utilisateur, mettre des champs classique comme code postal, rue, numéro, etc. permet de plus facilement faire des traitements sur la BDD pour générer des statistiques par exemple ou faire des opérations locales.

Il y a aussi les unités. Certains pays utilisent encore un système d’unités impériales, et au sein du système métrique de nombreux secteurs dans chaque pays utilisent des unités différentes. Et ce ne sont pas les mêmes secteurs partout… Par exemple au Royaume-Uni le volume du lait et de la bière n’utilisent pas le système métrique, ni les indications de vitesse et de distance sur les routes. En France les unités informatiques dans l’usage courant sont souvent en unités impériales, etc. Sans compter les préférences personnelles, par exemple une pression exprimée en bar ou hectopascal…

D’un point de vue technique, je pense qu’il est bon d’inciter le développeur d’exploiter au maximum des bibliothèques ou boîtes à outil pour prendre en charge la gestion de l’internationalisation. Cela évite de réinventer la roue au maximum sur un sujet qui est complexe et essentiel. Comme utiliser un widget ou une fonction standard (HTML5 typiquement) pour la sélection de la date plutôt que de le coder à la main. Ce genre de détails sont souvent déjà pris en compte correctement avec le choix basé sur la session de l’utilisateur.

+1 -0

Hello et merci, un tutoriel plein de bon sens et qui rappelle parfois de mauvais souvenirs (ahhhh, le pluriel du Russe, qui fait refactorer toute les clefs de traduction !).

Je m’attendais à trouver un truc sur les timezones et je l’ai pas vu quand tu parles du calendrier.

Un conseil qui m’a été donné tôt dans ma carrière et que je rabâche : si vous êtes perdus avec les timezones, vous pouvez partir du principe que : dans le back-end, elles n’existent pas, tout est en UTC. Cette notion ne doit apparaître que du côté de l’utilisateur, lorsqu’une date lui est affichée. C’est le meilleur moyen de s’abstraire de "l’heure du serveur", "la timzeone de la JVM, etc.".

Sauf cas extraordinaires (vous avez réellement besoin de stocker une date avec sa timezone d’affichage, parce qu’elle devra TOUJOURS être affichée comme ça), ça vous évitera bien des ennuis. Donc Rule of thumb: En UTC partout, sauf à l’écran.

Malheureusement c’est souvent aussi ça "internationaliser" un logiciel (vu que t’as tapé un peu plus large que l’i18n), le rendre disponible au plus grand nombre, sans pénaliser certains utilisateurs (CDN, read-replicas, …), du coup des machines partout, dans des timezones différentes, qui souvent stockent de la donnée dans une même référence (donc un bazar terrible si on ne s’accord pas sur "tout en UTC").

Edit : Et +1 pour l’histoire du nom / prénom. J’avais vu une prez sur Youtube, d’une personne qui expliquait qu’après avoir tordu le problème dans tous les sens, dans tous les pays, ils avaient convenu d’intituler le champ "name", et à l’écran, ils demandaient simplement à la personne "Comment souhaitez-vous qu’on s’adresse à vous"

+3 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.


Changements par rapport à la version précédente : dans « Les différences culturelles », extraction de la gestion des noms dans une section à part, et ajout d’exemples. Ajout d’une section sur l’accès international aux sites web.

Salut,

Très bonne initiative que ce tutoriel.

Étant suisse d’une part, et d’autre part développeur d’une plate-forme de jeux traduite en 6 langues, je ne peux que reconnaître, en tant que développeur les nombreuses difficultés citées que j’ai moi aussi rencontrées pour certaines, et en tant qu’utilisateur les problèmes récurrents constatés (et les frustrations associées) sur les sites et applications que j’utilise. Alors bravo, je crois que tu fais un joli tour d’horizon; difficile cependant de dire s’il est vraiment complet, car moi-même je ne me suis pas encore frotté à tout (notamment aux aspects commerciaux).

Ca commence bien sur la deuxième page:

L’utilisateur peut toujours choisir la langue qu’il veut parmi toutes celles disponibles.

Rrrrh, je ne compte plus les sites qui font l’association hâtive et définitive suisse = allemand. Même si statistiquement c’est correct 2 fois sur 3, c’est toujours frustrant.

Tiens d’ailleurs, ça me fait penser aux sites où, pour changer de langue, il faut d’abord cliquer sur la langue actuelle avant de pouvoir en sélectionner une autre. Cliquer sur "Deutsch", voir le menu de sélection apparaître, puis cliquer sur "Français", c’est facile. Mais comment je suis censé trouvé le mot "Chinois" écrit dans cette langue ? Pas toujours évident.

Du coup j’étendrais cette recommandation: … et l’ensemble des langues disponibles est affiché en permanence. Ou alors on affiche le code ISO "fr", "de", "it", "en", … que la plupart des gens comprennent aussi bien que le nom de leur langue.

Le nom d’une langue est toujours dans la langue elle-même, jamais dans celle affichée.

Ahahah, pour une fois je suis content d’avoir fait juste ! Mais bizarrement le jour où je me suis posé cette question, il me semblais que je faisais autrement que les autres.

On utilise jamais de drapeau pour représenter une langue.

Ah celui-là par contre, il faudra que je m’en souvienne. Cela dit, l’avantage des drapeaux, c’est qu’on a aucun doute de l’endroit où cliquer pour sélectionner la langue (cf. le premier point ci-dessus). Je ne pense pas qu’un suisse, belge ou québécois se soit déjà senti offensé en voyant le drapeau français pour représenter la langue de Molière, mais effectivement, ne sait-on jamais…

On ne supprime jamais les didactiques. Il n’y a plus de raison de faire ça

Ah bon ? Et pour les pseudos je fais comment ?

  • Je veux bannir un utilisateur chinois malveillant… je ne peux pas taper son pseudo sur mon clavier, et le temps que je le copie-colle il est déjà à des années-lumières.
  • Comment je peux être sûr que cet utilisateur chinois n’a pas pris un pseudo insultant, raciste, etc. ?

Ah, et question, tu appelles ça les didactiques… il me semblais que ça s’appelait plutôt des diacritiques. Est-ce que c’est la même chose ou pas ?

Deuxième page.

Pas mal de s’attarder sur les noms, je n’y avais pas pensé.

En parlant des dates:

La norme officielle peut n’être utilisée par personne dans la vie courante (comme au Canada)

Comment ça ? Ça mérite un peu plus d’explications je trouve. Ca vaudrait la peine, que tu donnes justement cette forme officielle que personne n’utilise, et celle effectivement utilisée dans la vie courante.

De retour sur les noms, une petite faute s’est glissée ici:

La seule solution simple et fiable est d’utiliser un seul champ pour tout ça, avec une invite qui dit quelque chose comme _« Comment souhaitez-vous que l’on vous appele ? ».

Troisième page

Clés signifiantes, clés techniques et mutualisation, j’ajouterais un avantage pour les clés techniques par rapport aux clés signifiantes. Dans le cas où on utilise des clés signifiantes, si on doit modifier un libellé dans la langue de base, on doit mettre à jour tous les fichiers de traduction. C’est pas toujours si évident qu’un simple rechercher/remplacer (p.ex. si les traductions sont en base de donnée, ou compilés dans un format binaire particulier). Avis perso: c’est pour ça que j’aime pas gettext et tous les tutoriels qui le présentent…

En plus avec les clés techniques, quand les utilisateurs rapportent des bugs de traduction manquante, même les moins malins identifient rapidement et de manière très ciblée que quelque chose n’est pas normal. Par contre c’est plus difficile à débugger quand on vous dit "je comprends pas, ça s’affiche à moitié en anglais".

Je termine avec une difficulté que tu n’as pas citée, les messages paramétrés, la conjugaison et les accords. Je vais prendre un exemple que j’ai expérimenté avec mon jeu et que je n’ai pas totalement résolu (faute de temps et surtout d’envie en fait…)

Admettons, dans mon jeu on ramasse des objets. Je démarre avec deux phrases associées à deux clés:
"Vous prenez {objet}"
et
"{joueur} prend {objet}"
La substitution de "{objet}" et de "{joueur}" se faisant au moment où les phrases doivent être affichées.

Sur le même principe, j’ajoute aussi la phrase:
"{objet} tombe au sol"

Il y a deux objets que je peux prendre dans mon jeu, "un livre" et "une boîte". Et j’ai deux joueurs actuellement, "Alice" et "Bob".

En français, tout va bien, n’importe quelle substitution de "{joueur}" par "Alice" ou "Bob", et de "{objet}" par "une boîte" ou "un livre", avec n’importe quelle clé, donne toujours des phrases correctes.

En allemand… on a des cas. IL faut deux traductions différentes de "un livre" et de "une boîte", car on l’utilise au nominatif et à l’accusatif.

Le traducteur italien est venu me dire un jour que le verbe, ici "prendre", se conjugue différemment selon que l’objet désigné soit masculin ou féminin. ON a deux formes, 3ème personne singulier + COD masculin, et 3ème personne singulier + COD féminin.

Un autre traducteur d’une autre langue (je ne me souviens plus laquelle) est aussi venu me dire que le verbe (toujours "prendre") a deux formes mais dans l’autre sens: 3ème personne singulier + sujet masculin, et 3ème personne singulier + sujet féminin.

Et là j’ai pris un exemple parmi les plus simples, il y en a des centaines comme ça.

Qu’est-ce qu’on fait ? ON factorise, quitte à avoir 600 phrases juste pour dire "X prend Y" parce qu’on a 100 objets différents dans le jeu et 3 genres possibles, ou alors on généralise et donc on accepte que dans certaines langues les traductions soient plus ou moins inexactes voire plutôt pourries ? Dans un cas c’est fastidieux pour tout le monde, et dans l’autre ça fait naître des frustrations car on est obligé d’écrire des phrases incorrectes à cause de contraintes techniques.

Est-ce qu’on essaie d’adopter tant que possible un "langage neutre" pour se simplifier le travail, c’est-à-dire éviter à la fois le vouvoiement et le tutoiement (p.ex. "vous avez commis une erreur" => "une erreur s’est produite"), de même qu’ignorer les répétitions intempestives au lieu d’utiliser des pronoms (p.ex. "Bob prend la clé, mais il n’arrive pas à ouvrir la porte" => "Bob prend la clé. Bob n’arrive pas à ouvrir la porte"). Mais alors on perd un certain charme qui peut être important dans certains contextes… pour un site e-commerce je pense qu’on s’en fout royalement (encore que… les fautes n’inspirent pas confiance), mais dans un jeu sûrement beaucoup moins, si on veut que le joueur se sente touché/investi/impreigné par l’ambiance et le scénario.

Bref, développeur expert en i18n/l10n, c’est un job à part entière dans les grosses boîtes.

Avis perso: ça m’est moi-même déjà arrivé de mettre un jeu en VO parce que je trouvais la VF mal traduite; ET ça m’arrive souvent aussi dans des logiciels.

Voilà. Merci de m’avoir lu jusqu’au bout ! Et désolé d’avoir écrit un roman.

+1 -0

Merci pour tes retours, je vais juste rebondir sur quelques points :

  • Tes deux exemples sur les pseudos sont à mon avis mauvais : l’ergonomie de l’application doit permettre une modération efficace sans avoir à saisir le pseudo à la main ; et le fait que le pseudo soit « Baichi » et non « 白痴 » ne t’aidera pas à mieux savoir que c’est une insulte. Le vrai problème des pseudos sont les homoglyphes et Unicode fournit les outils pour les détecter.
  • C’est bien diacritiques… que j’avais écris avec une faute et j’ai dû ripper dans les corrections proposées :D
  • Pour moi la partie sur les messages paramétrés est très intéressante, mais on est en plein dans la régionalisation et plus tellement dans l’internationalisation : c’est une problématique qui peut avoir un impact technique mais qui est principalement linguistique.

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.


Modifications par rapport à la précédent bêta :

  • Remerciements
  • Usage des drapeaux
  • Généralisation des problèmes de nombres aux accords et déclinaisons
  • Un mot sur les homoglyphes
  • Exemples illustrés ou mieux détachés du corps de texte
  • Précision sur l’impossibilité d’avoir une carte juste pour tous les pays
  • Ajout d’une partie sur les méta-informations des calendriers et sur les heures
  • Ajout d’une section sur les systèmes d’unité
  • Ajout d’une section sur les outils tiers pour gérer l’i18n
  • Correction de typos

Wahou, quelle promptitude ! Merci pour les ajouts et corrections. Ca me parait convenable.

Tu dis que Unicode donne les moyens de gérer les homographes… concrètement je fais comment, par exemple en Java ? La règle proposée: ne pas mélanger plusieurs alphabets dans un même pseudo me parait pas mal pour commencer sur le sujet, mais je n’ai aucune idée de comment faire en pratique, ni même quoi vraiment chercher, quand bien même je sais que Java gère UTF-16.

Autre question, en C++ cette fois, y-a-til une alternative moins imposante que le mastodonte ICU ? J’ai pas envie de l’utiliser, c’est trop compliqué.

Une petite liste de bibliothèques, API, etc. dans les divers domaines abordés, en fin de tuto, n’est peut-être pas une mauvaise idée. On peut y mentionner LocalDate & Cie en Java, les API de dates en C++20 ou boost::datetime, les collateurs et MessageFormatter en Java, ICU pour gérer l’unicode en C++, etc.

+0 -0

@QuentinC : le plus simple pour la gestion des pseudos, c’est sans doute de stocker une version normalisée et d’ajouter une contrainte d’unicité sur cette version normalisée. En Java, j’avais commencé un portage de cette lib Python, il faut juste que j’aie le courage de la mettre au propre :D

Pour le reste, je ne sais pas. Il y a tellement de bibliothèques et tellement de langages que je ne ferai volontairement pas de liste.

Ce sujet est verrouillé.