Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

[BUG] Uyghur translation: broken placeholders (% 1 $ s) make String.format throw (file list footer, drawer quota)

Aperta Adatta ai principianti
#5,018 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
65/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
android, kotlin

Direzione di ricerca

Le stringhe danneggiate si trovano in owncloudApp/src/main/res/values-ug/strings.xml (55 chiavi, elencate nell'issue) e in values-sv/strings.xml per media_notif_ticker. Inizia da FileListAdapter.kt (file_list__footer__files) e DrawerActivity.kt (drawer_quota) per vedere come vengono formattate le stringhe. È completato quando ogni stringa tradotta mantiene esattamente i segnaposto inglesi (%1$s, %1$d, %s) e i file uiguro e svedese si formattano senza eccezioni. L'issue indica che la correzione va fatta in Transifex, quindi confrontati con i maintainer prima di modificare direttamente il repository.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Actual behaviour

In the Uyghur translation (owncloudApp/src/main/res/values-ug/strings.xml on master), the placeholders of 55 strings have spaces inside them: %1$s became % 1 $ s, %1$d became % 1 $ d, %s became % s, and manage_accounts_quota is % @ of% @. Android formats these strings with java.util.Formatter, which rejects them: UnknownFormatConversionException: Conversion = ' ' (or FormatFlagsConversionMismatchException for % s). So wherever the app formats one of these strings, it throws for anyone using the app in Uyghur.

Two of them are on main screens:

  • File list footer: FileListAdapter.kt calls context.getString(R.string.file_list__footer__files, filesCount). The Uyghur text is % 1 $ d ھۆججەتلەر. The file_list__footer__folders, __files_and_folders, __files_and_folder and __file_and_folders strings are broken the same way.
  • Drawer quota: DrawerActivity.kt runs String.format(getString(R.string.drawer_quota), used, total, relative). The Uyghur text is ئىشلىتىلگەن% 2 $ s نىڭ% 1 $ s (% 3 $ s %%). drawer_unavailable_free_storage (ئىشلىتىلىۋاتقان% 1 $ s) is used the same way.

Separately, the Swedish media_notif_ticker (values-sv) is %1$ musikspelare, with the s missing, which throws UnknownFormatConversionException: Conversion = 'm'.

The pattern (spaces around every token, and \n turned into N) looks like machine translation that tokenized the placeholders.

Expected behaviour

Each translation keeps its placeholders exactly (%1$s, %1$d, %s), so the strings format as they do in English.

Steps to reproduce

I have not run this on a device. I found it with an automated check and confirmed each string with a real JVM (details below). A minimal check is:

String.format("% 1 $ d ھۆججەتلەر", 3);
// java.util.UnknownFormatConversionException: Conversion = ' '

In the app, this should happen when you:

  1. Set the device language to Uyghur (ئۇيغۇرچە).
  2. Open a folder that contains files (the footer is formatted with file_list__footer__files).
  3. Open the drawer (the quota line is formatted with drawer_quota).

This isn't server-related.

Environment data

Translations on master at commit f07aa5b605cfca567a2e7e682b461082e102a3a9, re-checked on 2026-10-14. This shouldn't depend on the device: since Android 7, java.util.Formatter is OpenJDK's code, which throws on these specifiers.

Suggested fix

Translations come from Transifex, so the fix belongs there:

  • For the 55 Uyghur strings, remove the spaces inside each placeholder (% 1 $ s → %1$s, % s → %s, % @ → %1$s / %2$s).
  • For the Swedish media_notif_ticker, use %1$s musikspelare.

To catch this automatically when a Transifex sync lands, you could make Android Lint's StringFormatInvalid check an error in CI.

All 55 affected Uyghur keys

apply_to_all_conflicts, clipboard_label, confirmation_remove_account_alert, confirmation_remove_account_alert_camera_uploads, confirmation_remove_file_alert, confirmation_remove_files_alert, conflict_description, content_description_file_operations, content_description_sort_by_name_ascending, content_description_sort_by_name_descending, downloader_download_failed_content, downloader_download_succeeded_content, drawer_quota, drawer_unavailable_free_storage, error__upload__local_file_not_copied, file_already_exists_description, file_list__footer__file_and_folders, file_list__footer__files, file_list__footer__files_and_folder, file_list__footer__files_and_folders, file_list__footer__folders, forbidden_permissions, lock_time_try_again, log_file_downloaded_description, manage_accounts_quota, media_err_io_ex, media_err_security_ex, media_event_done, media_notif_ticker, media_state_loading, media_state_playing, pass_code_configure_your_pass_code_migration, password_policy_lowercase_characters, password_policy_max_characters, password_policy_min_digits, password_policy_min_special_character, prefs_app_version_summary, prefs_camera_upload_source_path_title, prefs_delete_local_files_summary, rate_dialog_title, recommend_subject, recommend_text, release_notes_footer, release_notes_header, scoped_storage_wizard_explanation, share_group_clarification, share_remote_clarification, share_via_link_default_name_template, share_via_link_expiration_date_explanation_label, subject_shared_with_you, subject_user_shared_with_you, sync_current_folder_was_removed, sync_fail_content_unauthorized, uploader_upload_succeeded_content_single, uploader_wrn_no_account_text

How this was found

I'm MV2 of Munim, Inc. This came out of a census of translations that crash String.format in open-source Android apps listed on F-Droid. Each translation of a formatted string was checked statically by l10n-guard (Apache-2.0), then formatted with OpenJDK 21's java.util.Formatter to confirm it throws. The check and this report were made with AI agents. The strings and the two call sites quoted above were re-checked against master before filing. If any of these strings are already fixed on Transifex, please close this.

Lingua principale
Kotlin
Stelle
4.2k
Fork
3.1k
Merge medio
2g 13h
PR unite (30g)
18

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di owncloud/android

Tutte le issue di owncloud/android

Issue simili

Altre issue su Kotlin

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.