# Polkadot.js multilang mnemonic?

**URL:** https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132
**Category:** Applications
**Tags:** mnemonic
**Created:** [3 December 2022 23:05 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132 "2022-12-03T23:05:35Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [3 December 2022 23:05 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/1 "2022-12-03T23:05:35Z")

</div>

Does polkadot.js lib actually support multilang menmonic ?

I don’t find any information about it on internet…

@kimamila do you know ?

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [3 December 2022 23:08 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/2 "2022-12-03T23:08:40Z")

</div>

Fwiw Python substrateinterface supports a few languages for the mnemonic, so at least the principle exists in the ecosystem.

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [3 December 2022 23:08 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/3 "2022-12-03T23:08:56Z")

</div>

but i need it in polkadot.js

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [6 December 2022 07:15 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/4 "2022-12-06T07:15:47Z")

</div>

Bon j’ai fait une MR: [add French mnemonic file by poka-IT · Pull Request #1689 · polkadot-js/common · GitHub](https://github.com/polkadot-js/common/pull/1689)

J’ai ajouté le fichier bip39 french au format exact qu’ils attendent, et ajouté l’import:

> <https://github.com/polkadot-js/common/pull/1689/files#diff-5f87508754ce84172a42503fd3d083cc309f7902ba8fd10fdb4388c450937a3c>

J’ai pas trouvé de branche dev donc j’ai MR sur master, ils me diront…

Si quelqu’un veut continuer à rendre cette lib multilang c’est avec plaisir, j’suis pas js à la base et j’ai pas mal de truc sur le feux ^^

En cado mon script python pour convertir la list bip39 aux format attendu par polkadotjs:

```python
#!/usr/bin/env python3

import json
from urllib.request import urlopen

# utility

def load_json(data):
    get_data = open(data)
    return json.load(get_data)

# convert

mnemo_final = ''
mnemo_brut = load_json('french.json')

i=0
lenght=len(mnemo_brut)
for word in mnemo_brut:
    if (i == lenght-1):
        mnemo_final = mnemo_final + word
    else:
        mnemo_final = mnemo_final + word + '|'
    i=i+1

FINAL_DOC = '''// Adapted from the bitcoinjs/bip39 source
// https://github.com/bitcoinjs/bip39/blob/1d063b6a6aee4145b34d701037cd3e67f5446ff9/ts_src/

export default '%s'.split('|');
''' % (mnemo_final)

print(FINAL_DOC)

# dump file
doc_file = open('bip39-fr.ts', "w")
doc_file.write(FINAL_DOC)

```

* * *

Bon je sais très bien que ça va pas être aussi simple de rendre la lib multlang mais faut bien commencer quoi

> <https://github.com/polkadot-js/common/pull/1689#issuecomment-1338894437>
>
> This will actually not get used as coded in this PR. The reasons being -
> 
> 1. T…he \[WASM bip39 execution path\](https://github.com/polkadot-js/wasm/blob/4ceb620462478db9682e7b4512c37ae8f8e885b9/packages/wasm-crypto/src/rs/bip39.rs#L16-L22) is the one that gets executed in 99.9% of the cases (JS is only used as a fallback when WASM is not available in the environment)
> 2. The actual JS code here only used the \`DEFAULT\_WORDLIST\` import (I believe CI will actually complain about the unused import here)
> 
> So basically with this is won't do anything. There is a way to do multiple languages, but it won't be simple.
> 
> 1. The WASM environment needs to take a wordlist as input (the bonus is that this reduces bundle size, i.e. currently both the WASM and JS environment has a copy)
> 2. Execution needs to use this list
> 3. The same logic for specification should happen in the JS environment (it \_could\_ be as simple as \`setWordlist(...)\` before execution happens)
> 
> Overall, since each list adds to the bundle sizes (which is a huge ongoing problem), it will therefore need to be up to the developer using it to specify, instead of "having all available always".

> This will actually not get used as coded in this PR. The reasons being -
> 
> 1. The [WASM bip39 execution path](https://github.com/polkadot-js/wasm/blob/4ceb620462478db9682e7b4512c37ae8f8e885b9/packages/wasm-crypto/src/rs/bip39.rs#L16-L22) is the one that gets executed in 99.9% of the cases (JS is only used as a fallback when WASM is not available in the environment)
> 2. The actual JS code here only used the `DEFAULT_WORDLIST` import (I believe CI will actually complain about the unused import here)
> 
> So basically with this is won’t do anything. There is a way to do multiple languages, but it won’t be simple.
> 
> 1. The WASM environment needs to take a wordlist as input (the bonus is that this reduces bundle size, i.e. currently both the WASM and JS environment has a copy)
> 2. Execution needs to use this list
> 3. The same logic for specification should happen in the JS environment (it _could_ be as simple as `setWordlist(...)` before execution happens)
> 
> Overall, since each list adds to the bundle sizes (which is a huge ongoing problem), it will therefore need to be up to the developer using it to specify, instead of “having all available always”.

Faut les scouer un peu là  
J’ai envie de créer un fork de polkadotjs-common et de le rendre juste French uniquement lol  
Le temps qu’ils rendent la lib multilang.

Comme ça Ğecko mobile beta proposera des mnemonic Français uniquement.  
Bon ça doit pas être si simple faut toucher à certains trucs dont j’ai aucune idée…

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [6 December 2022 13:16 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/5 "2022-12-06T13:16:44Z")

</div>

Est-ce qu’il y a le même nombre de mots dans le dictionnaire de chaque langue, ou au moins, plus de mots en français qu’en anglais ? Si oui, tu peux utiliser les mnemonics anglais de polkadotjs et mapper les mots avec le dictionnaire français. Mais ça risque de ne pas être compatible avec d’autres clients.

---

<div class="post-metadata">

### Author: ![vit](https://forum.duniter.org/user_avatar/forum.duniter.org/vit/32/2775_2.png) [@vit](https://forum.duniter.org/u/vit)
#### Post date: [6 December 2022 16:36 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/6 "2022-12-06T16:36:23Z")

</div>

Je sais pas si c’est lié, mais j’ai trouvé ça, une doc de crate Rust de Bip39, y a que l’anglais… Ca sent pas bon en effet… 😅

> **[bip39::language::Language - Rust](https://docs.rs/bip39/0.1.0/bip39/language/enum.Language.html)**
>
> API documentation for the Rust \`Language\` enum in crate \`bip39\`.

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [6 December 2022 17:52 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/7 "2022-12-06T17:52:18Z")

</div>

> The team is basically me for anything and everything in polkadot-js. It is certainly something I _want_ to do since “injecting the wordlist” results in a nice footprint drop (I did get the Rust bip39 dev to make the required changes to his lib), but it has only been hovering with no action taken. The reality is that most probably unless there is a PR that comes in with all the moving parts, it will take “forever” to get to.
> 
> (It is also not even logged, i.e. it only exists in my mind, see [Issues · polkadot-js/wasm · GitHub](https://github.com/polkadot-js/wasm/issues))

Ok le gars est tout seul à dev polkadotjs ??  
C’est pas du bus factor ça ?

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [6 December 2022 17:56 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/8 "2022-12-06T17:56:35Z")

</div>

Les utilisateurs de cryptomonnaie sont tous des ingénieurs hipster barbus anglophones, et à quoi servent les autres langues finalement ? 😬

Possibilités que je vois&nbsp;:

1. tu fais une correspondance mot-à-mot anglais\<-\>français
2. une bibliothèque multilingue sauvage apparaît
3. tu la codes en Dart
4. un dev TS forke polkadotjs
5. un dev Rust forke bip32 qui supporte le multilingue (donc il suffit d’ajouter les fichiers de dictionnaires, et pour la compatibilité avec tikka on peut utiliser les mêmes dictionnaires que substrateinterface), mais alors il faut faire un binding. (si c’est l’option choisie je veux bien essayer de le faire)

Note&nbsp;: subxt, la crate client Rust qu’on utilise pour Gcli, utilise sp\_core, une crate cœur de substrate, qui utilise bip32 mais n’a pas prévu le support multilingue.

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [6 December 2022 18:01 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/9 "2022-12-06T18:01:06Z")

</div>

> [@tuxmain](#):
>
> - tu fais une correspondance mot-à-mot anglais\<-\>français
> - une bibliothèque multilingue sauvage apparaît
> - tu la codes en Dart

Ah mais c’est une super idée temporaire !!  
Mais du coup j’ai besoin de faire que ces 3 points, je vois pas pk on devrait faire la suite.

Je laisse la lib gérer les mnemonic anglais comme elle sait faire, mais j’affiche à l’utilisateur les mot français correspondants à la volé.

Mais bon je sais pas si les mnemonic français que ça donnera au gens seront fonctionnels avec la lib french quand elle fonctionnera…

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [6 December 2022 18:05 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/10 "2022-12-06T18:05:39Z")

</div>

Je voulais dire qu’il suffisait de faire un des points.

Mais faire le (1) signifie qu’il faut dire aux utilisateurs de mnémoniques français qu’ils ne sont compatibles qu’avec Gecko, et seulement jusqu’à ce qu’un dictionnaire plus standard soit utilisé.

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [6 December 2022 18:07 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/11 "2022-12-06T18:07:50Z")

</div>

Ok ça me parrait pas mal comme solution temporaire ça permet de:

- Proposer dès maintenant des mnemonic Anglais/Français/Espagnol/Italiens/Portugais dans Ğecko
- Expliquer aux gens que ce ne sont que des mnemonic de tests
- Au moins les gens ne seront pas perdu, c’est dans leur langue, et en prod ce sera juste d’autres mots

Vous êtes OK avec ça ?

edit: je ne sais pas si je vais le faire hein, c’est quand même un peu de taf côté gecko (ptetre 4h) pour gérer tout ça en multilang mnemonic (déjà actuellement multilang tout court), alors qu’il ne me reste que 3 jours pour sortir une version stable (10 Décembre).

---

<div class="post-metadata">

### Author: ![1000i100](https://forum.duniter.org/user_avatar/forum.duniter.org/1000i100/32/825_2.png) [@1000i100](https://forum.duniter.org/u/1000i100)
#### Post date: [8 December 2022 00:44 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/12 "2022-12-08T00:44:09Z")

</div>

Extrait des [spec SLIP-0039](https://github.com/satoshilabs/slips/blob/master/slip-0039.md#localization) :

> ## Localization
> 
> No localization is supported. This standard deals with a set of English words only. Previous attempts with arbitrary wordlists caused lots of confusion among users and decreased interoperability across various implementations.
> 
> ## Wordlist
> 
> The wordlist mandated by this SLIP is [available here](https://github.com/satoshilabs/slips/blob/master/slip-0039/wordlist.txt). Several criteria were applied in creation of the list:
> 
> - The wordlist is alphabetically sorted.
> - No word is shorter than 4 letters.
> - No word is longer than 8 letters.
> - All words begin with a unique 4-letter prefix.
> - The wordlist contains only common English words (+ the word “satoshi”).
> - The minimum Damerau-Levenshtein distance between any two words is at least 2.
> - The similarity between the pronunciation of any two words has been minimized.
> 
> (see the [test](https://github.com/satoshilabs/slips/blob/master/slip-0039/test_wordlist.sh) which checks whether these criteria are fulfilled).

Moi qui suis fan de parler français ou autre langue native des personnes à qui on s’adresse plutôt que d’avoir de l’anglais partout, sur le mnémonic, je suis plus sceptique :

- c’est une suite de mot que l’on note quelque part et qu’on peut avoir à recopier occasionnellement, pas un élément d’interface qu’on manipule régulièrement.
- c’est un outil de sécurité, donc la fiabilité, l’interopérabilité et la pérennité (compatibilité dans le temps) me semble essentielle (et primer sur le fait d’avoir ces termes dans sa propre langue)
- traduire une liste de mot anglais risque de ne plus respecter les règles listées dans l’extrait ci-dessus
- les traductions risque de varier d’un logiciel à l’autre et donc de ne pas assurer le rôle premier du mnémonic : reconstruire la clef privée à l’identique quel que soit le contexte ou ce mnémonic est fourni.

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [8 December 2022 01:09 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/13 "2022-12-08T01:09:08Z")

</div>

> [@1000i100](#):
>
> l’interopérabilité

La liste de mots français bip39 officiel existe déjà (depuis 2018):

> <https://github.com/bitcoin/bips/blob/master/bip-0039/french.txt>

Et est utilisé dans pas mal d’outils déjà.

* * *

Pour le reste, je suis d’accords qu’il s’agit d’un élément de sécurité et non d’UX.  
Je ne suis pas contre l’idée de n’utiliser que des mnemonic anglais si cela concerne une question de sécurité (et ça me fera moins de boulo lol).

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [8 December 2022 07:50 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/14 "2022-12-08T07:50:02Z")

</div>

Malheureusement BIP39 ne permet pas de passer une même phrase d’une langue à une autre (alors qu’ils auraient pu associer un numéro à chaque mot, et hasher la suite de numéros)&nbsp;:

> To create a binary seed from the mnemonic, we use the PBKDF2 function with a mnemonic sentence (in UTF-8 NFKD) used as the password and the string “mnemonic” + passphrase (again in UTF-8 NFKD) used as the salt. The iteration count is set to 2048 and HMAC-SHA512 is used as the pseudo-random function. The length of the derived key is 512 bits (= 64 bytes).  
> [bips/bip-0039.mediawiki at master · bitcoin/bips · GitHub](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#Wordlist)

Du coup un inconvénient de la phrase dans une langue à caractère spéciaux est que si on se retrouve face à un clavier auquel il manque des accents, on est embêté. Pour la plupart des langues à alphabet latin ça ne devrait pas gêner (si on peut deviner les mots en ignorant les accents), mais pour le chinois c’est un problème.

---

<div class="post-metadata">

### Author: ![vit](https://forum.duniter.org/user_avatar/forum.duniter.org/vit/32/2775_2.png) [@vit](https://forum.duniter.org/u/vit)
#### Post date: [8 December 2022 13:55 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/15 "2022-12-08T13:55:50Z")

</div>

Le SLIP 39 est une évolution du BIP 39 on dirait, mais même le BIP 39 décourage l’usage de mots non anglais :

> <https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#Wordlists>

Je fini par penser également que ce sera plus sécurisé et moins de boulot aussi !  
Si on est tous d’accord pour suivre les recommandations des specs, j’enlèverai le support des langues de mnemonic dans Tikka.

---

<div class="post-metadata">

### Author: ![poka](https://forum.duniter.org/user_avatar/forum.duniter.org/poka/32/6827_2.png) [@poka](https://forum.duniter.org/u/poka)
#### Post date: [25 January 2023 08:49 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/16 "2023-01-25T08:49:58Z")

</div>

> The way to introduce this has been logged [polkadot-js/wasm#452](https://github.com/polkadot-js/wasm/issues/452) - once available we can have this functionality.

> <https://github.com/polkadot-js/common/pull/1689#issuecomment-1403269394>
>
> The way to introduce this has been logged https://github.com/polkadot-js/wasm/is…sues/452 - once available we can have this functionality.

---

<div class="post-metadata">

### Author: ![matograine](https://forum.duniter.org/letter_avatar/matograine/32/5_5575768a8748004e209b776fc1b2916d.png) [@matograine](https://forum.duniter.org/u/matograine)
#### Post date: [12 October 2024 05:44 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/17 "2024-10-12T05:44:19Z")

</div>

Je me permets de relancer cette discussion.

Dans la mesure où de nombreux utilisateurs de Ğ1 (au choix ou cumulé) :

- sont francophones
- sont mal à l’aise en informatique
- portent des idées politiques qui se satisfont mal de l’hégémonie anglo-saxonne (ou de l’impérialisme américain pour être plus explicite)

le fait que les phrases de passe ne soient disponibles qu’en anglais sera plus qu’un frein, un blocage pour nombre de ces personnes. Avoir un système de traduction me semble nécessaire pour faciliter au plus grand nombre la migration en V2.

Le système le plus simple serait, il me semble, de s’appuyer sur [bips/bip-0039 at master · bitcoin/bips · GitHub](https://github.com/bitcoin/bips/tree/master/bip-0039) .

---

<div class="post-metadata">

### Author: ![Maaltir](https://forum.duniter.org/user_avatar/forum.duniter.org/maaltir/32/5039_2.png) [@Maaltir](https://forum.duniter.org/u/Maaltir)
#### Post date: [12 October 2024 07:31 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/18 "2024-10-12T07:31:15Z")

</div>

Tu peux ajouter :

- sont adeptes de la “pensée” “new-age” (encore une religion)

Pour eux, certains mots sont ressentis comme étant à “énergie négative”. La question qui m’a été posé est :  
“Serait-il possible de faire le retirage d’un seul mot et pas des 12 d’un coup ?”

---

<div class="post-metadata">

### Author: ![tuxmain](https://forum.duniter.org/user_avatar/forum.duniter.org/tuxmain/32/6423_2.png) [@tuxmain](https://forum.duniter.org/u/tuxmain)
#### Post date: [12 October 2024 08:13 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/19 "2024-10-12T08:13:34Z")

</div>

> [@Maaltir](#):
>
> Serait-il possible de faire le retirage d’un seul mot et pas des 12 d’un coup ?

En faisant ça on réduit l’entropie de la phrase, on la rend plus prédictible donc moins forte. Même faire plusieurs essais peut réduire la qualité de l’aléatoire (si on refuse toutes les phrases contenant certains mots, on réduit le vocabulaire donc le nombre de phrases possibles).

---

<div class="post-metadata">

### Author: ![vit](https://forum.duniter.org/user_avatar/forum.duniter.org/vit/32/2775_2.png) [@vit](https://forum.duniter.org/u/vit)
#### Post date: [12 October 2024 10:54 UTC](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132/20 "2024-10-12T10:54:42Z")

</div>

J’ai moi-même anticiper cela en implémentant le mnémonique multilingue (choix d’une langue disponible) dans Tikka.

Cela ne fonctionnait pas car l’api Python ne le supportait pas.  
Mais le développeur de l’API Python ne pouvait le faire sans le bind Python en Rust qui ne le supportait pas non plus.

Maintenant, le binding Python en Rust supporte le multilingue ainsi que l’API Python et donc Tikka.

Mais cela a entraîné d’autres problèmes ailleurs plus tard car l’éco système technique est malheureusement anglo-saxon.

Implémenter le BIP39 n’est pas le problème, c’est comme l’IP V6, c’est mieux mais ce n’est pas adopté par la majorité des outils.

Et je le répète :

> [@vit](#):
>
> mais même le BIP 39 décourage l’usage de mots non anglais :

_Since the vast majority of BIP39 wallets supports only the English wordlist, it is **strongly discouraged** to use non-English wordlists for generating the mnemonic sentences._

Donc faire créer à 8000 personnes des mnémoniques en français ou espagnols ou italiens semble être une bombe à retardement pour la compatibilité avec les autres logiciels gestionnaires de portefeuilles. Amha.

Plus la V2 sera adoptée par le grand public, moins on aura de personnes qui voudront un mnémonique “au chocolat”, “à la vanille”, “avec des mots doux”, et bien plus de gens qui le copieront/colleront sans se soucier du contenu de ce machin de douze mots dont ils se contreficheront du moment qu’il restaure bien leur compte.

[Next page](https://forum.duniter.org/t/polkadot-js-multilang-mnemonic/10132.md?page=2)
