[BUG] Uyghur translation: broken placeholders (% 1 $ s) make String.format throw (file list footer, drawer quota)
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 2/5
- 预计耗时
- 1-3 小时
- 新手友好度
- 65/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 领域
- localization, mobile
调研方向
损坏的字符串位于 owncloudApp/src/main/res/values-ug/strings.xml(issue 中列出的 55 个键)以及 values-sv/strings.xml 中的 media_notif_ticker。先查看 FileListAdapter.kt(file_list__footer__files)和 DrawerActivity.kt(drawer_quota),了解字符串的格式化方式。完成标准是:每个翻译后的字符串都完全保留英文占位符(%1$s、%1$d、%s),并且维吾尔语和瑞典语文件的格式化不会抛出异常。issue 指出修复应在 Transifex 中进行,因此在直接编辑代码仓库之前,请先与维护者确认。
由索引模型根据 Issue 内容生成。
描述
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.ktcallscontext.getString(R.string.file_list__footer__files, filesCount). The Uyghur text is% 1 $ d ھۆججەتلەر. Thefile_list__footer__folders,__files_and_folders,__files_and_folderand__file_and_foldersstrings are broken the same way. - Drawer quota:
DrawerActivity.ktrunsString.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:
- Set the device language to Uyghur (ئۇيغۇرچە).
- Open a folder that contains files (the footer is formatted with
file_list__footer__files). - 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.
- 主要语言
- Kotlin
- 星标
- 4.2k
- 派生
- 3.1k
- 平均合并
- 4 天 5 小时
- 30 天内合并 PR
- 18
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
owncloud/android 的其他 Issue
-
Camera Uploads Contributions are welcome Technical
难度 2/5 1-3 小时 新手友好度 62/100
owncloud/android#5040 · 1 条评论 ·
维护者通常 1 天内回复
-
KW-related Type:bug UI / UX
难度 2/5 1-3 小时 新手友好度 70/100
维护者通常 1 天内回复
-
Type:bug
难度 2/5 1-3 小时 新手友好度 74/100
owncloud/android#4485 · 6 条评论 ·
维护者通常 1 天内回复
-
Contributions are welcome p3-medium Type:bug
难度 2/5 1-3 小时 新手友好度 68/100
owncloud/android#4300 · 5 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 68/100
owncloud/android#3720 · 8 条评论 ·
维护者通常 1 天内回复
相似的 Issue
-
bug javascript
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
Source: c7 Type: bug
难度 2/5 1-3 小时 新手友好度 72/100
-
submit-adaption submit-adaption-pre
难度 1/5 1 小时以内 新手友好度 88/100
BetterAndroid/android-notification-icon-project#828 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 75/100
ProdigyV21/ARVIO#874 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 63/100
user-grinch/RivoPhoneApp#358 ·
维护者通常 1 天内回复