From 26a189917bb7a93b704dda09be2298d7c6e593e3 Mon Sep 17 00:00:00 2001
From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com>
Date: Tue, 19 Dec 2023 05:37:10 +0800
Subject: [PATCH] sctipt: check string formatting (#3570)
* sctipt: check string formatting
* all
---
apps/multiplatform/common/build.gradle.kts | 64 +++++++++++++++++--
.../commonMain/resources/MR/ar/strings.xml | 1 -
.../commonMain/resources/MR/el/strings.xml | 2 +-
.../commonMain/resources/MR/es/strings.xml | 2 +-
.../commonMain/resources/MR/fi/strings.xml | 1 -
.../commonMain/resources/MR/ja/strings.xml | 2 -
.../commonMain/resources/MR/tr/strings.xml | 6 +-
.../resources/MR/zh-rCN/strings.xml | 3 +-
.../resources/MR/zh-rTW/strings.xml | 2 +-
9 files changed, 67 insertions(+), 16 deletions(-)
diff --git a/apps/multiplatform/common/build.gradle.kts b/apps/multiplatform/common/build.gradle.kts
index 4b0e38d8a0..32bfadd37e 100644
--- a/apps/multiplatform/common/build.gradle.kts
+++ b/apps/multiplatform/common/build.gradle.kts
@@ -155,6 +155,34 @@ afterEvaluate {
val endTagRegex = Regex("")
val anyHtmlRegex = Regex("[^>]*>.*(<|>).*|[^>]*>.*(<|>).*")
val correctHtmlRegex = Regex("[^>]*>.*.*.*|[^>]*>.*.*.*|[^>]*>.*.*.*|[^>]*>.*]*>.*.*")
+ val possibleFormat = listOf("s", "d", "1\$s", "1\$d", "2s", "f")
+
+ fun String.id(): String = replace(" {
+ if (!contains("%")) return emptyList()
+ val value = substringAfter("\">").substringBeforeLast("")
+
+ val formats = ArrayList()
+ 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("
+ 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>()
+ treeList.forEachIndexed { index, file ->
+ val isBase = index == 0
val initialLines = ArrayList()
val finalLines = ArrayList()
+ val errors = ArrayList()
+
file.useLines { lines ->
val multiline = ArrayList()
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 ->
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml
index 098c748355..fd5a827ba2 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml
@@ -150,7 +150,6 @@
إضافة جهة اتصال جديدة : لإنشاء رمز الاستجابة السريعة الخاص بك لمرة واحدة لجهة اتصالك.]]>
امسح رمز الاستجابة السريعة : للاتصال بجهة الاتصال التي تعرض لك رمز الاستجابة السريعة.]]>
مكالمتك تحت الإجراء
- انتهت المكالمة
تغيير عبارة مرور قاعدة البيانات؟
لا يمكن الوصول إلى Keystore لحفظ كلمة مرور قاعدة البيانات
إلغاء معاينة الملف
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/el/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/el/strings.xml
index 714f31732c..7063eb9007 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/el/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/el/strings.xml
@@ -41,7 +41,7 @@
Αποδοχή
Αποδοχή αιτήματος σύνδεσης;
αποδεκτή κλήση
- Πρόσβαση στους διακομιστές μέσω SOCKS proxy στην πόρτα 9050; Ο διακομιστής μεσολάβησης (proxy server) πρέπει να είναι ενεργός πριν ενεργοποιηθεί αυτή η ρύθμιση.
+ Πρόσβαση στους διακομιστές μέσω SOCKS proxy στην πόρτα %d; Ο διακομιστής μεσολάβησης (proxy server) πρέπει να είναι ενεργός πριν ενεργοποιηθεί αυτή η ρύθμιση.
Προσθήκη διακομιστή…
Προχωρημένες ρυθμίσεις δικτύου
Προσθήκη διακομιστών μέσω σάρωσης QR κωδικών.
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml
index 08cc7f9820..381d28afa6 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml
@@ -298,7 +298,7 @@
Cancelar mensaje en directo
Confirmar
Vaciar
- Build de la aplicación
+ Build de la aplicación: %s
¡La llamada ha terminado!
el servidor de envío ha cambiado para tí
cancelar vista previa del enlace
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml
index ce8692130f..5410778c44 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/fi/strings.xml
@@ -171,7 +171,6 @@
Arkisto
Poista keskusteluarkisto\?
Luotu %1$s
- %s:n rooli muutettu %s:ksi
poistettu ryhmä
yhdistää
yhdistäminen (hyväksytty)
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml
index 94a35dbd8b..fb03dd1f28 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml
@@ -687,7 +687,6 @@
ファイル送信が中止されました。
送信元が繋がりリクエストを削除したかもしれません。
このサーバで待ち行列を作るには認証が必要です。パスワードをご確認ください。
- アプリが定期的に新しいメッセージを受信します。一日の電池使用量が約3%で、プッシュ通知に頼らずに、あなたの端末のデータをサーバに送ることはありません。
SimpleXロック
通知を受けるには、データベースの暗証フレーズを入力してください。
SimpleX Chat サービス
@@ -904,7 +903,6 @@
SIMPLEX CHATを支援
テストサーバ
受信アドレスは別のサーバーに変更されます。アドレス変更は送信者がオンラインになった後に完了します。
- SimpleX バックグラウンド・サービス を使ってます。一日の電池使用量は約3%です。]]>
あなたのプライバシーを守るために、他のアプリと違って、ユーザーIDの変わりに SimpleX メッセージ束毎にIDを配布し、各連絡先が別々と扱います。
あなたのチャットプロフィールが他のグループメンバーに送られます。
エンドツーエンド暗号化を確認するには、ご自分の端末と連絡先の端末のコードを比べます (スキャンします)。
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml
index 9824b0d8f0..d7df9655d3 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml
@@ -337,7 +337,7 @@
Mesaj gönderilirken hata oluştu
Adres oluştururken hata oluştu
Adres değiştirirken hata oluştu
- 1$s sizinle şu yolla bağlantı kurmak istiyor
+ %1$s sizinle şu yolla bağlantı kurmak istiyor
Ayarları değiştirirken hata oluştu
Toplu konuşma bağlantısı oluştururken hata oluştu
Yetki değiştirirken hata oluştu
@@ -747,9 +747,9 @@
Aklınızda bulunsun: kaybederseniz, parolayı kurtaramaz veya değiştiremezsiniz.]]>
Sohbet arşivi
SOHBET ARŞİVİ
- 1$s grubuna davet
+ %1$s grubuna davet
Gruba katıl\?
- 1$s davet edildi
+ %1$s davet edildi
grup bağlantınız üzerinden davet edildi
davet edildi
Gruba davet edin
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml
index ed2b9986c0..31be2f187c 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml
@@ -1344,7 +1344,7 @@
我们错过的第二个\"√\"!✅
设定数据库密码
为群组禁用回执吗?
- %s、%s 和 %d 已连接
+ %s、%s 和 %s 已连接
修复群组成员不支持的问题
已为 %d 组启用送达回执功能
重新协商
@@ -1427,7 +1427,6 @@
通过链接进行连接吗?
已经加入了该群组!
%s、 %s 和 %d 名成员
- %s 审核了 %d 条消息
解封成员
连接到你自己?
轻按连接
diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml
index b1d988e465..9caf45dcc1 100644
--- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml
+++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rTW/strings.xml
@@ -11,7 +11,7 @@
關於 SimpleX Chat
接受連接請求?
已接受通話
- 要在端口啟用 SOCKS 代理伺服器嗎?在啟用這個選項之前,必須先啟用代理伺服器。
+ 要在端口啟用 SOCKS 代理伺服器嗎 %d?在啟用這個選項之前,必須先啟用代理伺服器。
管理員
然後,選按:
新增預設伺服器