mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-05-14 19:05:27 +00:00
sctipt: check string formatting (#3570)
* sctipt: check string formatting * all
This commit is contained in:
committed by
GitHub
parent
ce9218b186
commit
26a189917b
@@ -155,6 +155,34 @@ afterEvaluate {
|
||||
val endTagRegex = Regex("</")
|
||||
val anyHtmlRegex = Regex("[^>]*>.*(<|>).*</string>|[^>]*>.*(<|>).*</string>")
|
||||
val correctHtmlRegex = Regex("[^>]*>.*<b>.*</b>.*</string>|[^>]*>.*<i>.*</i>.*</string>|[^>]*>.*<u>.*</u>.*</string>|[^>]*>.*<font[^>]*>.*</font>.*</string>")
|
||||
val possibleFormat = listOf("s", "d", "1\$s", "1\$d", "2s", "f")
|
||||
|
||||
fun String.id(): String = replace("<string name=\"", "").trim().substringBefore("\"")
|
||||
|
||||
fun String.formatting(filepath: String): List<String> {
|
||||
if (!contains("%")) return emptyList()
|
||||
val value = substringAfter("\">").substringBeforeLast("</string>")
|
||||
|
||||
val formats = ArrayList<String>()
|
||||
var substring = value.substringAfter("%")
|
||||
while (true) {
|
||||
var foundFormat = false
|
||||
for (format in possibleFormat) {
|
||||
if (substring.startsWith(format)) {
|
||||
formats.add(format)
|
||||
foundFormat = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if (!foundFormat) {
|
||||
throw Exception("Unknown formatting in string. Add it to 'possibleFormat' in common/build.gradle.kts if needed: $this \nin $filepath")
|
||||
}
|
||||
val was = substring
|
||||
substring = substring.substringAfter("%")
|
||||
if (was.length == substring.length) break
|
||||
}
|
||||
return formats
|
||||
}
|
||||
|
||||
fun String.removeCDATA(): String =
|
||||
if (contains("<![CDATA")) {
|
||||
@@ -195,20 +223,44 @@ afterEvaluate {
|
||||
return this
|
||||
}
|
||||
val fileRegex = Regex("MR/../strings.xml$|MR/..-.../strings.xml$|MR/..-../strings.xml$|MR/base/strings.xml$")
|
||||
kotlin.sourceSets["commonMain"].resources.filter { fileRegex.containsMatchIn(it.absolutePath) }.asFileTree.forEach { file ->
|
||||
val tree = kotlin.sourceSets["commonMain"].resources.filter { fileRegex.containsMatchIn(it.absolutePath) }.asFileTree
|
||||
val baseStringsFile = tree.first { it.absolutePath.endsWith("base/strings.xml") } ?: throw Exception("No base/strings.xml found")
|
||||
val treeList = ArrayList(tree.toList())
|
||||
treeList.remove(baseStringsFile)
|
||||
treeList.add(0, baseStringsFile)
|
||||
val baseFormatting = mutableMapOf<String, List<String>>()
|
||||
treeList.forEachIndexed { index, file ->
|
||||
val isBase = index == 0
|
||||
val initialLines = ArrayList<String>()
|
||||
val finalLines = ArrayList<String>()
|
||||
val errors = ArrayList<String>()
|
||||
|
||||
file.useLines { lines ->
|
||||
val multiline = ArrayList<String>()
|
||||
lines.forEach { line ->
|
||||
initialLines.add(line)
|
||||
if (stringRegex.matches(line)) {
|
||||
finalLines.add(line.removeCDATA().addCDATA(file.absolutePath))
|
||||
val fixedLine = line.removeCDATA().addCDATA(file.absolutePath)
|
||||
val lineId = fixedLine.id()
|
||||
if (isBase) {
|
||||
baseFormatting[lineId] = fixedLine.formatting(file.absolutePath)
|
||||
} else if (baseFormatting[lineId] != fixedLine.formatting(file.absolutePath)) {
|
||||
errors.add("Incorrect formatting in string: $fixedLine \nin ${file.absolutePath}")
|
||||
}
|
||||
finalLines.add(fixedLine)
|
||||
} else if (multiline.isEmpty() && startStringRegex.containsMatchIn(line)) {
|
||||
multiline.add(line)
|
||||
} else if (multiline.isNotEmpty() && endStringRegex.containsMatchIn(line)) {
|
||||
multiline.add(line)
|
||||
finalLines.addAll(multiline.joinToString("\n").removeCDATA().addCDATA(file.absolutePath).split("\n"))
|
||||
val fixedLines = multiline.joinToString("\n").removeCDATA().addCDATA(file.absolutePath).split("\n")
|
||||
val fixedLinesJoined = fixedLines.joinToString("")
|
||||
val lineId = fixedLinesJoined.id()
|
||||
if (isBase) {
|
||||
baseFormatting[lineId] = fixedLinesJoined.formatting(file.absolutePath)
|
||||
} else if (baseFormatting[lineId] != fixedLinesJoined.formatting(file.absolutePath)) {
|
||||
errors.add("Incorrect formatting in string: $fixedLinesJoined \nin ${file.absolutePath}")
|
||||
}
|
||||
finalLines.addAll(fixedLines)
|
||||
multiline.clear()
|
||||
} else if (multiline.isNotEmpty()) {
|
||||
multiline.add(line)
|
||||
@@ -217,10 +269,14 @@ afterEvaluate {
|
||||
}
|
||||
}
|
||||
if (multiline.isNotEmpty()) {
|
||||
throw Exception("Unclosed string tag: ${multiline.joinToString("\n")} \nin ${file.absolutePath}")
|
||||
errors.add("Unclosed string tag: ${multiline.joinToString("\n")} \nin ${file.absolutePath}")
|
||||
}
|
||||
}
|
||||
|
||||
if (errors.isNotEmpty()) {
|
||||
throw Exception("Found errors: \n\n${errors.joinToString("\n\n")}")
|
||||
}
|
||||
|
||||
if (!debug && finalLines != initialLines) {
|
||||
file.writer().use {
|
||||
finalLines.forEachIndexed { index, line ->
|
||||
|
||||
@@ -150,7 +150,6 @@
|
||||
<string name="add_new_contact_to_create_one_time_QR_code"><![CDATA[<b> إضافة جهة اتصال جديدة </b>: لإنشاء رمز الاستجابة السريعة الخاص بك لمرة واحدة لجهة اتصالك.]]></string>
|
||||
<string name="scan_QR_code_to_connect_to_contact_who_shows_QR_code"><![CDATA[<b> امسح رمز الاستجابة السريعة </b>: للاتصال بجهة الاتصال التي تعرض لك رمز الاستجابة السريعة.]]></string>
|
||||
<string name="callstatus_in_progress">مكالمتك تحت الإجراء</string>
|
||||
<string name="callstatus_ended">انتهت المكالمة</string>
|
||||
<string name="change_database_passphrase_question">تغيير عبارة مرور قاعدة البيانات؟</string>
|
||||
<string name="cannot_access_keychain">لا يمكن الوصول إلى Keystore لحفظ كلمة مرور قاعدة البيانات</string>
|
||||
<string name="icon_descr_cancel_file_preview">إلغاء معاينة الملف</string>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<string name="accept">Αποδοχή</string>
|
||||
<string name="accept_connection_request__question">Αποδοχή αιτήματος σύνδεσης;</string>
|
||||
<string name="callstatus_accepted">αποδεκτή κλήση</string>
|
||||
<string name="network_enable_socks_info">Πρόσβαση στους διακομιστές μέσω SOCKS proxy στην πόρτα 9050; Ο διακομιστής μεσολάβησης (proxy server) πρέπει να είναι ενεργός πριν ενεργοποιηθεί αυτή η ρύθμιση.</string>
|
||||
<string name="network_enable_socks_info">Πρόσβαση στους διακομιστές μέσω SOCKS proxy στην πόρτα %d; Ο διακομιστής μεσολάβησης (proxy server) πρέπει να είναι ενεργός πριν ενεργοποιηθεί αυτή η ρύθμιση.</string>
|
||||
<string name="smp_servers_add">Προσθήκη διακομιστή…</string>
|
||||
<string name="network_settings">Προχωρημένες ρυθμίσεις δικτύου</string>
|
||||
<string name="v4_3_improved_server_configuration_desc">Προσθήκη διακομιστών μέσω σάρωσης QR κωδικών.</string>
|
||||
|
||||
@@ -298,7 +298,7 @@
|
||||
<string name="icon_descr_cancel_live_message">Cancelar mensaje en directo</string>
|
||||
<string name="confirm_verb">Confirmar</string>
|
||||
<string name="clear_chat_menu_action">Vaciar</string>
|
||||
<string name="app_version_code">Build de la aplicación</string>
|
||||
<string name="app_version_code">Build de la aplicación: %s</string>
|
||||
<string name="call_already_ended">¡La llamada ha terminado!</string>
|
||||
<string name="rcv_conn_event_switch_queue_phase_completed">el servidor de envío ha cambiado para tí</string>
|
||||
<string name="icon_descr_cancel_link_preview">cancelar vista previa del enlace</string>
|
||||
|
||||
@@ -171,7 +171,6 @@
|
||||
<string name="chat_archive_header">Arkisto</string>
|
||||
<string name="delete_chat_archive_question">Poista keskusteluarkisto\?</string>
|
||||
<string name="archive_created_on_ts">Luotu %1$s</string>
|
||||
<string name="rcv_group_event_changed_your_role">%s:n rooli muutettu %s:ksi</string>
|
||||
<string name="rcv_group_event_group_deleted">poistettu ryhmä</string>
|
||||
<string name="group_member_status_connecting">yhdistää</string>
|
||||
<string name="group_member_status_accepted">yhdistäminen (hyväksytty)</string>
|
||||
|
||||
@@ -687,7 +687,6 @@
|
||||
<string name="sender_cancelled_file_transfer">ファイル送信が中止されました。</string>
|
||||
<string name="sender_may_have_deleted_the_connection_request">送信元が繋がりリクエストを削除したかもしれません。</string>
|
||||
<string name="error_smp_test_server_auth">このサーバで待ち行列を作るには認証が必要です。パスワードをご確認ください。</string>
|
||||
<string name="periodic_notifications_desc">アプリが定期的に新しいメッセージを受信します。一日の電池使用量が約3%で、プッシュ通知に頼らずに、あなたの端末のデータをサーバに送ることはありません。</string>
|
||||
<string name="la_notice_title_simplex_lock">SimpleXロック</string>
|
||||
<string name="enter_passphrase_notification_desc">通知を受けるには、データベースの暗証フレーズを入力してください。</string>
|
||||
<string name="simplex_service_notification_title">SimpleX Chat サービス</string>
|
||||
@@ -904,7 +903,6 @@
|
||||
<string name="settings_section_title_support">SIMPLEX CHATを支援</string>
|
||||
<string name="smp_servers_test_servers">テストサーバ</string>
|
||||
<string name="switch_receiving_address_desc">受信アドレスは別のサーバーに変更されます。アドレス変更は送信者がオンラインになった後に完了します。</string>
|
||||
<string name="to_preserve_privacy_simplex_has_background_service_instead_of_push_notifications_it_uses_a_few_pc_battery"><![CDATA[あなたのプライバシーを守るために、このアプリはプッシュ通知の変わりに <b>SimpleX バックグラウンド・サービス</b> を使ってます。一日の電池使用量は約3%です。]]></string>
|
||||
<string name="to_protect_privacy_simplex_has_ids_for_queues">あなたのプライバシーを守るために、他のアプリと違って、ユーザーIDの変わりに SimpleX メッセージ束毎にIDを配布し、各連絡先が別々と扱います。</string>
|
||||
<string name="group_main_profile_sent">あなたのチャットプロフィールが他のグループメンバーに送られます。</string>
|
||||
<string name="to_verify_compare">エンドツーエンド暗号化を確認するには、ご自分の端末と連絡先の端末のコードを比べます (スキャンします)。</string>
|
||||
|
||||
@@ -337,7 +337,7 @@
|
||||
<string name="error_sending_message">Mesaj gönderilirken hata oluştu</string>
|
||||
<string name="error_creating_address">Adres oluştururken hata oluştu</string>
|
||||
<string name="error_changing_address">Adres değiştirirken hata oluştu</string>
|
||||
<string name="contact_wants_to_connect_via_call">1$s sizinle şu yolla bağlantı kurmak istiyor</string>
|
||||
<string name="contact_wants_to_connect_via_call">%1$s sizinle şu yolla bağlantı kurmak istiyor</string>
|
||||
<string name="error_changing_message_deletion">Ayarları değiştirirken hata oluştu</string>
|
||||
<string name="error_creating_link_for_group">Toplu konuşma bağlantısı oluştururken hata oluştu</string>
|
||||
<string name="error_changing_role">Yetki değiştirirken hata oluştu</string>
|
||||
@@ -747,9 +747,9 @@
|
||||
<string name="impossible_to_recover_passphrase"><![CDATA[<b>Aklınızda bulunsun</b>: kaybederseniz, parolayı kurtaramaz veya değiştiremezsiniz.]]></string>
|
||||
<string name="chat_archive_header">Sohbet arşivi</string>
|
||||
<string name="chat_archive_section">SOHBET ARŞİVİ</string>
|
||||
<string name="group_invitation_item_description">1$s grubuna davet</string>
|
||||
<string name="group_invitation_item_description">%1$s grubuna davet</string>
|
||||
<string name="join_group_question">Gruba katıl\?</string>
|
||||
<string name="rcv_group_event_member_added">1$s davet edildi</string>
|
||||
<string name="rcv_group_event_member_added">%1$s davet edildi</string>
|
||||
<string name="rcv_group_event_invited_via_your_group_link">grup bağlantınız üzerinden davet edildi</string>
|
||||
<string name="group_member_status_invited">davet edildi</string>
|
||||
<string name="invite_to_group_button">Gruba davet edin</string>
|
||||
|
||||
@@ -1344,7 +1344,7 @@
|
||||
<string name="v5_2_message_delivery_receipts_descr">我们错过的第二个\"√\"!✅</string>
|
||||
<string name="setup_database_passphrase">设定数据库密码</string>
|
||||
<string name="receipts_groups_title_disable">为群组禁用回执吗?</string>
|
||||
<string name="rcv_group_event_3_members_connected">%s、%s 和 %d 已连接</string>
|
||||
<string name="rcv_group_event_3_members_connected">%s、%s 和 %s 已连接</string>
|
||||
<string name="fix_connection_not_supported_by_group_member">修复群组成员不支持的问题</string>
|
||||
<string name="receipts_groups_override_enabled">已为 %d 组启用送达回执功能</string>
|
||||
<string name="sync_connection_force_confirm">重新协商</string>
|
||||
@@ -1427,7 +1427,6 @@
|
||||
<string name="connect_plan_connect_via_link">通过链接进行连接吗?</string>
|
||||
<string name="connect_plan_already_joining_the_group">已经加入了该群组!</string>
|
||||
<string name="group_members_n">%s、 %s 和 %d 名成员</string>
|
||||
<string name="moderated_items_description">%s 审核了 %d 条消息</string>
|
||||
<string name="unblock_member_button">解封成员</string>
|
||||
<string name="connect_plan_connect_to_yourself">连接到你自己?</string>
|
||||
<string name="contact_tap_to_connect">轻按连接</string>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<string name="about_simplex_chat">關於 SimpleX Chat</string>
|
||||
<string name="accept_connection_request__question">接受連接請求?</string>
|
||||
<string name="callstatus_accepted">已接受通話</string>
|
||||
<string name="network_enable_socks_info">要在端口啟用 SOCKS 代理伺服器嗎?在啟用這個選項之前,必須先啟用代理伺服器。</string>
|
||||
<string name="network_enable_socks_info">要在端口啟用 SOCKS 代理伺服器嗎 %d?在啟用這個選項之前,必須先啟用代理伺服器。</string>
|
||||
<string name="group_member_role_admin">管理員</string>
|
||||
<string name="above_then_preposition_continuation">然後,選按:</string>
|
||||
<string name="smp_servers_preset_add">新增預設伺服器</string>
|
||||
|
||||
Reference in New Issue
Block a user