electrum icon indicating copy to clipboard operation
electrum copied to clipboard

ValueError: Single '}' encountered in format string

Open TARS-bot opened this issue 2 years ago • 4 comments

Crash Report

This crash report was reported through the automatic crash reporting system 🤖

Traceback

Traceback (most recent call last):
  File "/home/user/wspace/electrum/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/Electrum/kivy/base.py", line 347, in mainloop
  File "/home/user/wspace/electrum/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/Electrum/kivy/base.py", line 391, in idle
  File "/home/user/wspace/electrum/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/Electrum/kivy/base.py", line 342, in dispatch_input
  File "/home/user/wspace/electrum/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/Electrum/kivy/base.py", line 308, in post_dispatch_input
  File "kivy/_event.pyx", line 724, in kivy._event.EventDispatcher.dispatch
  File "/home/user/wspace/electrum/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/Electrum/kivy/uix/behaviors/button.py", line 179, in on_touch_up
  File "kivy/_event.pyx", line 720, in kivy._event.EventDispatcher.dispatch
  File "kivy/_event.pyx", line 1263, in kivy._event.EventObservers.dispatch
  File "kivy/_event.pyx", line 1147, in kivy._event.EventObservers._dispatch
  File "/home/user/wspace/electrum/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/Electrum/kivy/lang/builder.py", line 57, in custom_callback
  File "<string>", line 85, in <module>
  File "/home/user/wspace/electrum/.buildozer/android/app/electrum/gui/kivy/uix/dialogs/password_dialog.py", line 288, in on_password
ValueError: Single '}' encountered in format string

ValueError: Single '}' encountered in format string

Reporter

This issue was reported by 2 user(s):

Electrum Version Python Version Operating System Wallet Type Locale Stack
4.3.3 3.8.15 (default, Jan 2 2023, 15:35:37) [Clang 11.0.5 (https://android.googlesource.com/toolchain/llvm-project 87f1315d Android 9 on ZTE P932F50 (GEN_UA_1_A3_2020_V1.2) standard en_US
4.3.4 3.8.15 (default, Jan 26 2023, 15:17:59) [Clang 11.0.5 (https://android.googlesource.com/toolchain/llvm-project 87f1315d Android 9 on HUAWEI HWINE (INE-LX1 9.1.0.317(C432E1R1P1)) imported en_US

Additional Information

The reporting user(s) did not provide additional information.

TARS-bot avatar Jan 04 '23 02:01 TARS-bot

it is really difficult for me to imagine that a user would have compiled his own APK after corrupting that line of the code. there must be a deeper issue with python-for-android..

ecdsa avatar Jan 24 '23 10:01 ecdsa

It could be due to bad translations, similar to https://github.com/spesmilo/electrum/issues/3237

https://github.com/spesmilo/electrum/blob/9ea705dadce0d324f86616c3101752dde26a24b5/electrum/gui/kivy/uix/dialogs/password_dialog.py#L288

>>> "asdasd } asdasd".format(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Single '}' encountered in format string

but all the translation strings look ok to me:

electrum-locale$ git log -n 1
commit 4941c1a92925f198cb0e8d4334692a09917ffc20 (HEAD -> master, origin/master, origin/HEAD)
Author: SomberNight <[email protected]>
Date:   Mon Jan 2 15:29:44 2023 +0000

    update translations
electrum-locale$ grep -rnw . -e "Password is too short (min " -A1
./locale/sl_SI/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/sl_SI/electrum.po-4261-msgstr ""
--
./locale/sr_CS/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/sr_CS/electrum.po-4261-msgstr ""
--
./locale/fa_IR/electrum.po:4265:msgid "Password is too short (min {} characters)"
./locale/fa_IR/electrum.po-4266-msgstr ""
--
./locale/be_BY/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/be_BY/electrum.po-4261-msgstr ""
--
./locale/es_ES/electrum.po:4280:msgid "Password is too short (min {} characters)"
./locale/es_ES/electrum.po-4281-msgstr "Contraseña muy corta (mínimo {} caracteres)"
--
./locale/cs_CZ/electrum.po:4271:msgid "Password is too short (min {} characters)"
./locale/cs_CZ/electrum.po-4272-msgstr "Heslo je příliš krátké (minimum je {} znaků)"
--
./locale/el_GR/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/el_GR/electrum.po-4261-msgstr ""
--
./locale/pl_PL/electrum.po:4263:msgid "Password is too short (min {} characters)"
./locale/pl_PL/electrum.po-4264-msgstr ""
--
./locale/ru_RU/electrum.po:4270:msgid "Password is too short (min {} characters)"
./locale/ru_RU/electrum.po-4271-msgstr "Пароль слишком короткий (минимум {} символов)"
--
./locale/ar_SA/electrum.po:4262:msgid "Password is too short (min {} characters)"
./locale/ar_SA/electrum.po-4263-msgstr ""
--
./locale/uk_UA/electrum.po:4269:msgid "Password is too short (min {} characters)"
./locale/uk_UA/electrum.po-4270-msgstr "Пароль закороткий (не більше {} знаків}"
--
./locale/hu_HU/electrum.po:4268:msgid "Password is too short (min {} characters)"
./locale/hu_HU/electrum.po-4269-msgstr ""
--
./locale/th_TH/electrum.po:4264:msgid "Password is too short (min {} characters)"
./locale/th_TH/electrum.po-4265-msgstr ""
--
./locale/fr_FR/electrum.po:4267:msgid "Password is too short (min {} characters)"
./locale/fr_FR/electrum.po-4268-msgstr ""
--
./locale/ja_JP/electrum.po:4271:msgid "Password is too short (min {} characters)"
./locale/ja_JP/electrum.po-4272-msgstr "パスワードが短すぎます ({}文字以上が必要です)"
--
./locale/nb_NO/electrum.po:4261:msgid "Password is too short (min {} characters)"
./locale/nb_NO/electrum.po-4262-msgstr ""
--
./locale/hy_AM/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/hy_AM/electrum.po-4261-msgstr ""
--
./locale/bn_BD/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/bn_BD/electrum.po-4261-msgstr ""
--
./locale/ko_KR/electrum.po:4261:msgid "Password is too short (min {} characters)"
./locale/ko_KR/electrum.po-4262-msgstr ""
--
./locale/bg_BG/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/bg_BG/electrum.po-4261-msgstr ""
--
./locale/de_DE/electrum.po:4270:msgid "Password is too short (min {} characters)"
./locale/de_DE/electrum.po-4271-msgstr "Passwort ist zu kurz (mindestens {} Zeichen)"
--
./locale/pt_PT/electrum.po:4261:msgid "Password is too short (min {} characters)"
./locale/pt_PT/electrum.po-4262-msgstr ""
--
./locale/sv_SE/electrum.po:4261:msgid "Password is too short (min {} characters)"
./locale/sv_SE/electrum.po-4262-msgstr ""
--
./locale/sk_SK/electrum.po:4269:msgid "Password is too short (min {} characters)"
./locale/sk_SK/electrum.po-4270-msgstr "Heslo je príliš krátké (minimum je {} znakov)"
--
./locale/id_ID/electrum.po:4263:msgid "Password is too short (min {} characters)"
./locale/id_ID/electrum.po-4264-msgstr ""
--
./locale/da_DK/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/da_DK/electrum.po-4261-msgstr ""
--
./locale/pt_BR/electrum.po:4271:msgid "Password is too short (min {} characters)"
./locale/pt_BR/electrum.po-4272-msgstr "A senha é muito curta (o mínimo é de {} caracteres)"
--
./locale/ro_RO/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/ro_RO/electrum.po-4261-msgstr ""
--
./locale/si_LK/electrum.po:4271:msgid "Password is too short (min {} characters)"
./locale/si_LK/electrum.po-4272-msgstr "මුරපදය කෙටි වැඩියි (අවම අක්ෂර {}ක්)"
--
./locale/zh_CN/electrum.po:4271:msgid "Password is too short (min {} characters)"
./locale/zh_CN/electrum.po-4272-msgstr "密码太短(至少{}个字符)"
--
./locale/zh_TW/electrum.po:4262:msgid "Password is too short (min {} characters)"
./locale/zh_TW/electrum.po-4263-msgstr ""
--
./locale/eo_UY/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/eo_UY/electrum.po-4261-msgstr ""
--
./locale/it_IT/electrum.po:4271:msgid "Password is too short (min {} characters)"
./locale/it_IT/electrum.po-4272-msgstr "La password è troppo corta (minimo {} caratteri)"
--
./locale/ky_KG/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/ky_KG/electrum.po-4261-msgstr ""
--
./locale/lv_LV/electrum.po:4261:msgid "Password is too short (min {} characters)"
./locale/lv_LV/electrum.po-4262-msgstr "Parole ir par īsu (vismaz {} rakstzīmes)"
--
./locale/he_IL/electrum.po:4270:msgid "Password is too short (min {} characters)"
./locale/he_IL/electrum.po-4271-msgstr "סיסמה קצרה מדי (לפחות {} אותיות)"
--
./locale/nl_NL/electrum.po:4269:msgid "Password is too short (min {} characters)"
./locale/nl_NL/electrum.po-4270-msgstr "Wachtwoord is te kort (min. {} tekens)"
--
./locale/ta_IN/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/ta_IN/electrum.po-4261-msgstr ""
--
./locale/tr_TR/electrum.po:4261:msgid "Password is too short (min {} characters)"
./locale/tr_TR/electrum.po-4262-msgstr ""
--
./locale/vi_VN/electrum.po:4260:msgid "Password is too short (min {} characters)"
./locale/vi_VN/electrum.po-4261-msgstr ""

SomberNight avatar Jan 24 '23 10:01 SomberNight

ah indeed. good point

ecdsa avatar Jan 24 '23 10:01 ecdsa

Still, since we don't test all the translations on release, it might be a good idea to handle exceptions in the _() call. One notable scenario is when we reduce the number of placeholders in the original string, any unmaintained translation still having too many placeholders will throw an exception..

s = "{} is a {}"
s.format(6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: Replacement index 1 out of range for positional args tuple

--

We could also expand def _(message) to do the string formatting with parameters. E.g. auto string.format() the *args Also, we could use the **kwargs to control the translation (e.g. plural forms)

So _('Password is too short (min {} characters)').format(6)

would become

_('Password is too short (min {} characters)', 6)

Or a plural variant _('Password is too short (min {} character)', 6, plural='Password is too short (min {} characters)')

..which could be plugged into the gettext.ngettext function

accumulator avatar Jan 26 '23 13:01 accumulator