fix: complete localization resource audit - #6021
Conversation
|
@eliotcougar Thanks for following up on this issue and submitting the PR. |
|
感谢 PR 请按照功能分成多个 pr 提交。
|
Alright. I'll do it later tonight. PR 1: Alignment and unification of all strings.xml files, fixing typos. |
Thank you for your follow-up and contribution toward further improving the translations and this project. |
|
I'm out of tokens (on a Pro5x account)... Part 3 will have to wait. |
|
@2dust @eliotcougar I updated the app to version 2.3.3, but the issue persists. |
|
A suggestion: Could the cause of this issue in the new version be the region code assigned to Luri Bakhtiari? For instance, we could try changing the folder name from |
Can you describe exactly what the issue is? I tested the Middle-Eastern locales in the emulator, and they all look fine. |
|
The app's language is Luri Bakhtiari, though a Persian translation is used in some sections. You can check this yourself as well. I tested it on another phone as well, and the problem is with the app. |
|
The screen recording clearly shows the issue I am experiencing. Initially, the app is set to Persian so you can see and note the Persian translations; I have tapped on the specific translations a few times. Then, I changed the language to Luri Bakhtiari and restarted the app to apply the change. The language setting is applied, but the sections I tapped on are not displaying the translations in Luri. vidma_recorder_07082026_170334.mp4 |
Thank you for demonstrating it more clearly... Is it only some sections or everything?.. It is hard for me to tell the difference between Persian and Bakhtiari. Obviously. Is it correct in the xml file? |
Only in some sections. I checked the Luri translation against the Persian file, and the keys for the problematic sections were exactly the same. Is any further explanation needed? |
|
The issue that currently exists—and which I have reported—is not present in version 2.2.6. |
Thank you very much. I just looked at the two xml files side by side, and at your video. I can finally see the issue. I will look into it tomorrow when I have my AI colleague available again. I want to make it perfect. Meanwhile, if you have spare time, you can help by pointing out any mistakes in https://github.com/2dust/v2rayNG/blob/master/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml as a native speaker. |
Thank you for resolving this issue and I apologize for the troublesome reports. As a translator and native speaker, there are no issues other than the one I reported and you are currently addressing; once that problem is resolved, I simply need to thoroughly review the translations and convert them into Lori. |
|
I have a question that has been bothering me, if anyone knows the answer, and it may be related to this current problem. This problem is for all versions of the program. Why are some strings not in the translation file and, even more strangely, for example, when the language is Persian, their translation is shown, but not for the Lori language. Is this data read from somewhere else? Some of this data: Cancel and OK options in menus such as language selection and Subscription group settings. |
|
@eliotcougar @2dust Well, I discovered something new and I know it can help a lot. 😃 Finally, a few years of experience in program localization should come in handy here. Some of the strings that I mentioned are present in the translation file but are not displayed because these strings follow the device language. For example: My device language was Persian, but the program language was Luri and some strings were displayed in Persian; I changed the device language to English and to my surprise, it became English. Since Luri uses 3-letter codes, I thought this might be the reason. I changed the program language to Arabic and to my surprise, the same thing happened and some strings were displayed in English. Maybe this feature can solve this problem. Simultaneous use of the in-app and out-of-app language selector feature, which I think was introduced in Android 13. If you have any questions about this feature, ask and I will answer to the best of my ability. |
|
@hosseinabaspanah I figured as much... It did work before the migration to Compose. I'll make AI dig through Android source code (like I did with Shizuku tethering to find OS quirks), and I'm sure it'll figure out why localization behaves this way. Android has a "resource fallback" mechanism. Persian is a fallback to Luri in this case. What is strange is that it only falls back for some resources and not others. A quick search yielded one potential solution. Apparently, modern Android no longer uses And even more surprising is why Android Studio doesn't raise any warning when compiling resources... |
Lol, A really strange situation has arisen. As I said, this problem exists for other languages as well, and is not limited to Lori. I think it would be useful to be able to use both the internal and external language selectors at the same time. I think you can find the problem more easily with the information I sent you. |

Disclaimer
GPT5.6-Sol xHigh did a complete resource audit, but I intentionally asked it not to translate anything that was missing.
If you want, I can ask it to complete the missing and outdated localization in all available locales. I can only check English and Russian, but I know that it is extremely good at translating, especially if you ask it to pay attention to nuances of where a specific string appears in the app and what exactly it does.
Alternatively, we let native speakers work on the freshly-audited files.
Summary
Fixes #6005. Partially, potentially completely.
This PR performs a complete localization audit across the Android code and all nine maintained
strings.xmlfiles. It makes the resource files structurally identical, supplies deliberate English fallbacks where translations are absent, localizes user-facing text that was still embedded in Kotlin, applies the selected app locale outside activities, and gives accessibility strings explicit, action-accurate identifiers.Resource-file synchronization
app_name, browser-dialer label/tip/mode, insecure-warning toast, unknown-app label, subscription worker and auto-test labels, mode/root-mode/root-sharing labels and summaries, request headers, process selection, outbound-tag hint, and preset rulesets.app_name, browser-dialer label/tip/mode, insecure-warning toast, unknown-app label, subscription worker and auto-test labels, request headers, routing process/process selection, and outbound-tag hint.app_nameand the outbound-tag hint.app_name, unknown-app label, outbound-tag hint, and browser-dialer mode.app_name, browser-dialer label/tip/mode, unknown-app label, and outbound-tag hint.translatable="false"attributes from 22 resources whose base definitions are localizable.vpn_interface_addressarray non-translatable so address values are not presented to translators.string-arrayinto an unwrapped, one-item-per-line form while retaining row alignment.summary_pref_speed_enabledon one source row instead of introducing formatting whitespace into the value.Resource identifiers and meaning
title_pref_mux_concurencytotitle_pref_mux_concurrency.title_pref_mux_xudp_concurencytotitle_pref_mux_xudp_concurrency.connection_runing_task_lefttoconnection_running_task_left.toast_malformed_josnwith the formattedtoast_malformed_json_detailresource.pull_down_to_refresh->acc_refreshmenu_item_add_config->acc_add_subscriptionacc_edit,acc_delete, andacc_savemenu_item_add_asset->acc_add_assetmenu_item_download_file->acc_download_filetitle_qr_code->acc_qr_codelogcat_copy->acc_copy_loglogcat_clear->acc_clear_logrouting_settings_add_rule->acc_add_ruleNewly localized user-facing text
value_unknownfallback in About and Update screens instead of hardcodingUnknown.@StringResvalues for Camera, Notifications, and Local Network.toast_permission_denied_for, allowing translators to reorder the permission name.toast_malformed_json_detail, allowing translators to position the parser detail.Correct locale outside activities
BaseViewModelstrings and resource-backed toasts through a context wrapped with the selected app locale.MainRepositorystrings, including the synthetic “All” subscription group, through the selected locale.applicationContextand the IO dispatcher.LauncherManagerentry contexts so tile, widget, Tasker, receiver, and other non-activity launches show localized validation and status messages.CoreTestServiceandSubscriptionUpdateService, matching the existing daemon-service behavior for localized notifications and errors.Resources.configurationbefore applying a locale inMyContextWrapper, preventing locale wrapping from mutating the source context configuration.Accessibility localization
acc_prefix for all accessibility-only strings.acc_identifiers remain.Translator notes for meaning divergences
The existing translations are preserved, but inline notes now document each place where the current localized wording no longer matches the code behavior:
:authorityfield, not an organization or governing authority.-1, not1.-1, not1.reject,allow, andskip, not “no proxy”, “multiplex”, and “native” modes.leastLoadmeans current connection load, not “most stable”.reject,allow, andskip.leastLoadmeans current connection load, not “least stuttering”.Validation
R.string,R.array,@string, or@arrayreferences.git diff --checkagainst the complete branch.:app:processPlaystoreReleaseResourcespasses.:app:compilePlaystoreReleaseKotlinand lint reach Kotlin compilation.