From 9b41edb43d9d7c6b9c29584a89f6f43b8537db37 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 4 Jul 2026 19:09:57 +0200 Subject: [PATCH 1/2] Sync Translations from Crowdin (#3213) Co-authored-by: Crowdin Bot --- apps/web/locales/am-ET.po | 2 +- apps/web/locales/ar-SA.po | 2 +- apps/web/locales/az-AZ.po | 2 +- apps/web/locales/bg-BG.po | 2 +- apps/web/locales/bn-BD.po | 2 +- apps/web/locales/ca-ES.po | 2 +- apps/web/locales/cs-CZ.po | 2 +- apps/web/locales/da-DK.po | 2 +- apps/web/locales/de-DE.po | 2 +- apps/web/locales/el-GR.po | 2 +- apps/web/locales/es-ES.po | 2 +- apps/web/locales/fa-IR.po | 2 +- apps/web/locales/fi-FI.po | 2 +- apps/web/locales/he-IL.po | 2 +- apps/web/locales/hi-IN.po | 2 +- apps/web/locales/hu-HU.po | 2 +- apps/web/locales/id-ID.po | 2 +- apps/web/locales/it-IT.po | 2 +- apps/web/locales/km-KH.po | 2 +- apps/web/locales/kn-IN.po | 2 +- apps/web/locales/ko-KR.po | 2 +- apps/web/locales/lt-LT.po | 2 +- apps/web/locales/lv-LV.po | 2 +- apps/web/locales/ml-IN.po | 2 +- apps/web/locales/mr-IN.po | 2 +- apps/web/locales/ms-MY.po | 2 +- apps/web/locales/ne-NP.po | 2 +- apps/web/locales/nl-NL.po | 2 +- apps/web/locales/no-NO.po | 2 +- apps/web/locales/or-IN.po | 2 +- apps/web/locales/pl-PL.po | 2 +- apps/web/locales/pt-BR.po | 2 +- apps/web/locales/pt-PT.po | 2 +- apps/web/locales/ro-RO.po | 2 +- apps/web/locales/ru-RU.po | 2 +- apps/web/locales/sk-SK.po | 2 +- apps/web/locales/sq-AL.po | 2 +- apps/web/locales/sr-SP.po | 2 +- apps/web/locales/sv-SE.po | 2 +- apps/web/locales/ta-IN.po | 2 +- apps/web/locales/te-IN.po | 2 +- apps/web/locales/th-TH.po | 2 +- apps/web/locales/tr-TR.po | 2 +- apps/web/locales/uz-UZ.po | 2 +- apps/web/locales/vi-VN.po | 2 +- apps/web/locales/zh-CN.po | 2 +- apps/web/locales/zh-TW.po | 2 +- 47 files changed, 47 insertions(+), 47 deletions(-) diff --git a/apps/web/locales/am-ET.po b/apps/web/locales/am-ET.po index 07bbddc71..38b31ecc2 100644 --- a/apps/web/locales/am-ET.po +++ b/apps/web/locales/am-ET.po @@ -8,7 +8,7 @@ msgstr "" "Language: am\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Amharic\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" diff --git a/apps/web/locales/ar-SA.po b/apps/web/locales/ar-SA.po index 0953a5b17..d5ef9e507 100644 --- a/apps/web/locales/ar-SA.po +++ b/apps/web/locales/ar-SA.po @@ -8,7 +8,7 @@ msgstr "" "Language: ar\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Arabic\n" "Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" diff --git a/apps/web/locales/az-AZ.po b/apps/web/locales/az-AZ.po index 4299c4537..52e6a44c2 100644 --- a/apps/web/locales/az-AZ.po +++ b/apps/web/locales/az-AZ.po @@ -8,7 +8,7 @@ msgstr "" "Language: az\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Azerbaijani\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/bg-BG.po b/apps/web/locales/bg-BG.po index 93b85ab09..445e906c0 100644 --- a/apps/web/locales/bg-BG.po +++ b/apps/web/locales/bg-BG.po @@ -8,7 +8,7 @@ msgstr "" "Language: bg\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Bulgarian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/bn-BD.po b/apps/web/locales/bn-BD.po index ffa941c0f..afd908a22 100644 --- a/apps/web/locales/bn-BD.po +++ b/apps/web/locales/bn-BD.po @@ -8,7 +8,7 @@ msgstr "" "Language: bn\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Bengali\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/ca-ES.po b/apps/web/locales/ca-ES.po index 9e1219ebf..ef6dcf21a 100644 --- a/apps/web/locales/ca-ES.po +++ b/apps/web/locales/ca-ES.po @@ -8,7 +8,7 @@ msgstr "" "Language: ca\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Catalan\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/cs-CZ.po b/apps/web/locales/cs-CZ.po index f9c0ac827..d9feb782c 100644 --- a/apps/web/locales/cs-CZ.po +++ b/apps/web/locales/cs-CZ.po @@ -8,7 +8,7 @@ msgstr "" "Language: cs\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Czech\n" "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n" diff --git a/apps/web/locales/da-DK.po b/apps/web/locales/da-DK.po index d9b3661a3..97c243ceb 100644 --- a/apps/web/locales/da-DK.po +++ b/apps/web/locales/da-DK.po @@ -8,7 +8,7 @@ msgstr "" "Language: da\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Danish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/de-DE.po b/apps/web/locales/de-DE.po index 0df34da05..ab906f9a9 100644 --- a/apps/web/locales/de-DE.po +++ b/apps/web/locales/de-DE.po @@ -8,7 +8,7 @@ msgstr "" "Language: de\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: German\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/el-GR.po b/apps/web/locales/el-GR.po index 6c1d35268..07e68fdd3 100644 --- a/apps/web/locales/el-GR.po +++ b/apps/web/locales/el-GR.po @@ -8,7 +8,7 @@ msgstr "" "Language: el\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Greek\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/es-ES.po b/apps/web/locales/es-ES.po index f0ca14322..3e51d6bc8 100644 --- a/apps/web/locales/es-ES.po +++ b/apps/web/locales/es-ES.po @@ -8,7 +8,7 @@ msgstr "" "Language: es\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Spanish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/fa-IR.po b/apps/web/locales/fa-IR.po index 0fbf03908..ab5bc9384 100644 --- a/apps/web/locales/fa-IR.po +++ b/apps/web/locales/fa-IR.po @@ -8,7 +8,7 @@ msgstr "" "Language: fa\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Persian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/fi-FI.po b/apps/web/locales/fi-FI.po index 5e47f14b5..174d62afb 100644 --- a/apps/web/locales/fi-FI.po +++ b/apps/web/locales/fi-FI.po @@ -8,7 +8,7 @@ msgstr "" "Language: fi\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Finnish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/he-IL.po b/apps/web/locales/he-IL.po index 17b4dd141..1cd3330cf 100644 --- a/apps/web/locales/he-IL.po +++ b/apps/web/locales/he-IL.po @@ -8,7 +8,7 @@ msgstr "" "Language: he\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Hebrew\n" "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n" diff --git a/apps/web/locales/hi-IN.po b/apps/web/locales/hi-IN.po index 5ecdec21d..ca3b324e2 100644 --- a/apps/web/locales/hi-IN.po +++ b/apps/web/locales/hi-IN.po @@ -8,7 +8,7 @@ msgstr "" "Language: hi\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Hindi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/hu-HU.po b/apps/web/locales/hu-HU.po index 3c3b29da3..634ff3e17 100644 --- a/apps/web/locales/hu-HU.po +++ b/apps/web/locales/hu-HU.po @@ -8,7 +8,7 @@ msgstr "" "Language: hu\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Hungarian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/id-ID.po b/apps/web/locales/id-ID.po index a6258c57d..716b18d16 100644 --- a/apps/web/locales/id-ID.po +++ b/apps/web/locales/id-ID.po @@ -8,7 +8,7 @@ msgstr "" "Language: id\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Indonesian\n" "Plural-Forms: nplurals=1; plural=0;\n" diff --git a/apps/web/locales/it-IT.po b/apps/web/locales/it-IT.po index b9e525b3a..a66fe0fc2 100644 --- a/apps/web/locales/it-IT.po +++ b/apps/web/locales/it-IT.po @@ -8,7 +8,7 @@ msgstr "" "Language: it\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Italian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/km-KH.po b/apps/web/locales/km-KH.po index a4f1f1626..c7a2b2811 100644 --- a/apps/web/locales/km-KH.po +++ b/apps/web/locales/km-KH.po @@ -8,7 +8,7 @@ msgstr "" "Language: km\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Khmer\n" "Plural-Forms: nplurals=1; plural=0;\n" diff --git a/apps/web/locales/kn-IN.po b/apps/web/locales/kn-IN.po index 587ed81d9..1343eb014 100644 --- a/apps/web/locales/kn-IN.po +++ b/apps/web/locales/kn-IN.po @@ -8,7 +8,7 @@ msgstr "" "Language: kn\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Kannada\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/ko-KR.po b/apps/web/locales/ko-KR.po index c0c42e6ca..a3851c346 100644 --- a/apps/web/locales/ko-KR.po +++ b/apps/web/locales/ko-KR.po @@ -8,7 +8,7 @@ msgstr "" "Language: ko\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Korean\n" "Plural-Forms: nplurals=1; plural=0;\n" diff --git a/apps/web/locales/lt-LT.po b/apps/web/locales/lt-LT.po index ae2c98c7a..1e71e9444 100644 --- a/apps/web/locales/lt-LT.po +++ b/apps/web/locales/lt-LT.po @@ -8,7 +8,7 @@ msgstr "" "Language: lt\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Lithuanian\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && (n%100>19 || n%100<11) ? 0 : (n%10>=2 && n%10<=9) && (n%100>19 || n%100<11) ? 1 : n%1!=0 ? 2: 3);\n" diff --git a/apps/web/locales/lv-LV.po b/apps/web/locales/lv-LV.po index 9b8b8f9e6..506f38c98 100644 --- a/apps/web/locales/lv-LV.po +++ b/apps/web/locales/lv-LV.po @@ -8,7 +8,7 @@ msgstr "" "Language: lv\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Latvian\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n" diff --git a/apps/web/locales/ml-IN.po b/apps/web/locales/ml-IN.po index 0648e5140..05fcb3084 100644 --- a/apps/web/locales/ml-IN.po +++ b/apps/web/locales/ml-IN.po @@ -8,7 +8,7 @@ msgstr "" "Language: ml\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Malayalam\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/mr-IN.po b/apps/web/locales/mr-IN.po index 7d375cf42..a0bba9307 100644 --- a/apps/web/locales/mr-IN.po +++ b/apps/web/locales/mr-IN.po @@ -8,7 +8,7 @@ msgstr "" "Language: mr\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Marathi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/ms-MY.po b/apps/web/locales/ms-MY.po index 0573ef4d2..0cbbd6e0e 100644 --- a/apps/web/locales/ms-MY.po +++ b/apps/web/locales/ms-MY.po @@ -8,7 +8,7 @@ msgstr "" "Language: ms\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Malay\n" "Plural-Forms: nplurals=1; plural=0;\n" diff --git a/apps/web/locales/ne-NP.po b/apps/web/locales/ne-NP.po index 0b0ff6db4..d55f33169 100644 --- a/apps/web/locales/ne-NP.po +++ b/apps/web/locales/ne-NP.po @@ -8,7 +8,7 @@ msgstr "" "Language: ne\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Nepali\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/nl-NL.po b/apps/web/locales/nl-NL.po index 3c58ddb79..3d204d9df 100644 --- a/apps/web/locales/nl-NL.po +++ b/apps/web/locales/nl-NL.po @@ -8,7 +8,7 @@ msgstr "" "Language: nl\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Dutch\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/no-NO.po b/apps/web/locales/no-NO.po index 829d29580..fac9312ae 100644 --- a/apps/web/locales/no-NO.po +++ b/apps/web/locales/no-NO.po @@ -8,7 +8,7 @@ msgstr "" "Language: no\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Norwegian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/or-IN.po b/apps/web/locales/or-IN.po index 562b19f7b..a776001f0 100644 --- a/apps/web/locales/or-IN.po +++ b/apps/web/locales/or-IN.po @@ -8,7 +8,7 @@ msgstr "" "Language: or\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Odia\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/pl-PL.po b/apps/web/locales/pl-PL.po index b09dcb172..88472e03a 100644 --- a/apps/web/locales/pl-PL.po +++ b/apps/web/locales/pl-PL.po @@ -8,7 +8,7 @@ msgstr "" "Language: pl\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Polish\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" diff --git a/apps/web/locales/pt-BR.po b/apps/web/locales/pt-BR.po index aebf83b3d..8a4cb244f 100644 --- a/apps/web/locales/pt-BR.po +++ b/apps/web/locales/pt-BR.po @@ -8,7 +8,7 @@ msgstr "" "Language: pt\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Portuguese, Brazilian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/pt-PT.po b/apps/web/locales/pt-PT.po index 14b69b225..3037c97e5 100644 --- a/apps/web/locales/pt-PT.po +++ b/apps/web/locales/pt-PT.po @@ -8,7 +8,7 @@ msgstr "" "Language: pt\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Portuguese\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/ro-RO.po b/apps/web/locales/ro-RO.po index b4e4dc60b..a88449f51 100644 --- a/apps/web/locales/ro-RO.po +++ b/apps/web/locales/ro-RO.po @@ -8,7 +8,7 @@ msgstr "" "Language: ro\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Romanian\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" diff --git a/apps/web/locales/ru-RU.po b/apps/web/locales/ru-RU.po index dac232d22..974a40f93 100644 --- a/apps/web/locales/ru-RU.po +++ b/apps/web/locales/ru-RU.po @@ -8,7 +8,7 @@ msgstr "" "Language: ru\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Russian\n" "Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" diff --git a/apps/web/locales/sk-SK.po b/apps/web/locales/sk-SK.po index ccb51892d..52bb6902b 100644 --- a/apps/web/locales/sk-SK.po +++ b/apps/web/locales/sk-SK.po @@ -8,7 +8,7 @@ msgstr "" "Language: sk\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Slovak\n" "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n" diff --git a/apps/web/locales/sq-AL.po b/apps/web/locales/sq-AL.po index ebfae7de0..dedf369b2 100644 --- a/apps/web/locales/sq-AL.po +++ b/apps/web/locales/sq-AL.po @@ -8,7 +8,7 @@ msgstr "" "Language: sq\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Albanian\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/sr-SP.po b/apps/web/locales/sr-SP.po index 434edb403..8cdd78e6c 100644 --- a/apps/web/locales/sr-SP.po +++ b/apps/web/locales/sr-SP.po @@ -8,7 +8,7 @@ msgstr "" "Language: sr\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Serbian (Cyrillic)\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" diff --git a/apps/web/locales/sv-SE.po b/apps/web/locales/sv-SE.po index 9f6c59a5d..279927f1a 100644 --- a/apps/web/locales/sv-SE.po +++ b/apps/web/locales/sv-SE.po @@ -8,7 +8,7 @@ msgstr "" "Language: sv\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Swedish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/ta-IN.po b/apps/web/locales/ta-IN.po index 1bf611a07..d16c78c30 100644 --- a/apps/web/locales/ta-IN.po +++ b/apps/web/locales/ta-IN.po @@ -8,7 +8,7 @@ msgstr "" "Language: ta\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Tamil\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/te-IN.po b/apps/web/locales/te-IN.po index fc287f3bc..5079b52a4 100644 --- a/apps/web/locales/te-IN.po +++ b/apps/web/locales/te-IN.po @@ -8,7 +8,7 @@ msgstr "" "Language: te\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Telugu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/th-TH.po b/apps/web/locales/th-TH.po index f8837b9f3..8a9faf033 100644 --- a/apps/web/locales/th-TH.po +++ b/apps/web/locales/th-TH.po @@ -8,7 +8,7 @@ msgstr "" "Language: th\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Thai\n" "Plural-Forms: nplurals=1; plural=0;\n" diff --git a/apps/web/locales/tr-TR.po b/apps/web/locales/tr-TR.po index 75d4fff1e..63869980a 100644 --- a/apps/web/locales/tr-TR.po +++ b/apps/web/locales/tr-TR.po @@ -8,7 +8,7 @@ msgstr "" "Language: tr\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Turkish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" diff --git a/apps/web/locales/uz-UZ.po b/apps/web/locales/uz-UZ.po index 8f2c16de3..c69db8459 100644 --- a/apps/web/locales/uz-UZ.po +++ b/apps/web/locales/uz-UZ.po @@ -8,7 +8,7 @@ msgstr "" "Language: uz\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Uzbek\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" diff --git a/apps/web/locales/vi-VN.po b/apps/web/locales/vi-VN.po index c0bd3d982..8d467e356 100644 --- a/apps/web/locales/vi-VN.po +++ b/apps/web/locales/vi-VN.po @@ -8,7 +8,7 @@ msgstr "" "Language: vi\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Vietnamese\n" "Plural-Forms: nplurals=1; plural=0;\n" diff --git a/apps/web/locales/zh-CN.po b/apps/web/locales/zh-CN.po index d35d136bc..b80347a5f 100644 --- a/apps/web/locales/zh-CN.po +++ b/apps/web/locales/zh-CN.po @@ -8,7 +8,7 @@ msgstr "" "Language: zh\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Plural-Forms: nplurals=1; plural=0;\n" diff --git a/apps/web/locales/zh-TW.po b/apps/web/locales/zh-TW.po index d647e60be..5e7ed1b04 100644 --- a/apps/web/locales/zh-TW.po +++ b/apps/web/locales/zh-TW.po @@ -8,7 +8,7 @@ msgstr "" "Language: zh\n" "Project-Id-Version: reactive-resume\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-07-04 16:06\n" +"PO-Revision-Date: 2026-07-04 17:07\n" "Last-Translator: \n" "Language-Team: Chinese Traditional\n" "Plural-Forms: nplurals=1; plural=0;\n" From 3e96605d4c9a3120f522d57ce4d6abb5d40c9753 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Sat, 4 Jul 2026 19:42:41 +0200 Subject: [PATCH 2/2] fix(web): avoid retesting new AI providers --- .../components/ai-section.test.tsx | 169 ++++++++++++++++++ .../integrations/components/ai-section.tsx | 25 ++- 2 files changed, 189 insertions(+), 5 deletions(-) create mode 100644 apps/web/src/features/settings/integrations/components/ai-section.test.tsx diff --git a/apps/web/src/features/settings/integrations/components/ai-section.test.tsx b/apps/web/src/features/settings/integrations/components/ai-section.test.tsx new file mode 100644 index 000000000..f668cb376 --- /dev/null +++ b/apps/web/src/features/settings/integrations/components/ai-section.test.tsx @@ -0,0 +1,169 @@ +// @vitest-environment happy-dom + +import { fireEvent, render, screen, waitFor } from "@testing-library/react"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { i18n } from "@lingui/core"; +import { I18nProvider } from "@lingui/react"; + +type MutationName = "create" | "test" | "update" | "delete"; + +type MockProvider = { + id: string; + label: string; + provider: "openai"; + model: string; + baseURL: string; + enabled: boolean; + testStatus: string; + testError: string | null; + apiKeyPreview: string; + apiKeyFingerprint: string; + lastTestedAt: Date | null; + lastUsedAt: Date | null; + createdAt: Date; + updatedAt: Date; +}; + +type MutationOptions = { + name: MutationName; + meta?: { noInvalidate?: boolean }; +}; + +type ComboboxProps = { + id: string; + value: string; + options: { value: string; label: string }[]; + onValueChange: (value: string) => void; +}; + +const queryClient = vi.hoisted(() => ({ + invalidateQueries: vi.fn(), + setQueryData: vi.fn(), +})); + +const mutations = vi.hoisted(() => ({ + create: vi.fn(), + test: vi.fn(), + update: vi.fn(), + delete: vi.fn(), +})); + +const mutationOptions = vi.hoisted(() => ({ + create: vi.fn((options?: MutationOptions) => ({ ...options, name: "create" })), + test: vi.fn((options?: MutationOptions) => ({ ...options, name: "test" })), + update: vi.fn((options?: MutationOptions) => ({ ...options, name: "update" })), + delete: vi.fn((options?: MutationOptions) => ({ ...options, name: "delete" })), +})); + +vi.mock("@tanstack/react-query", () => ({ + useQuery: () => ({ data: [], isLoading: false, error: null }), + useQueryClient: () => queryClient, + useMutation: (options: MutationOptions) => ({ + isPending: false, + mutate: ( + input: unknown, + handlers?: { onSuccess?: (data: unknown) => void; onError?: (error: unknown) => void }, + ) => { + mutations[options.name](input).then(handlers?.onSuccess).catch(handlers?.onError); + }, + mutateAsync: mutations[options.name], + }), +})); + +vi.mock("@/libs/orpc/client", () => ({ + orpc: { + aiProviders: { + list: { + queryOptions: () => ({ queryKey: ["aiProviders", "list"] }), + queryKey: () => ["aiProviders", "list"], + }, + create: { mutationOptions: mutationOptions.create }, + test: { mutationOptions: mutationOptions.test }, + update: { mutationOptions: mutationOptions.update }, + delete: { mutationOptions: mutationOptions.delete }, + }, + }, +})); + +vi.mock("@/components/ui/combobox", () => ({ + Combobox: ({ id, value, options, onValueChange }: ComboboxProps) => ( + + ), +})); + +vi.mock("sonner", () => ({ toast: { error: vi.fn(), success: vi.fn() } })); + +i18n.loadAndActivate({ locale: "en", messages: {} }); + +const { AISettingsSection } = await import("./ai-section"); + +const provider = (overrides: Partial): MockProvider => ({ + id: "provider-1", + label: "OpenAI", + provider: "openai", + model: "gpt-4.1", + baseURL: "https://api.openai.com/v1", + enabled: false, + testStatus: "untested", + testError: null, + apiKeyPreview: "sk-p...test", + apiKeyFingerprint: "fingerprint", + lastTestedAt: null, + lastUsedAt: null, + createdAt: new Date("2026-07-04T00:00:00Z"), + updatedAt: new Date("2026-07-04T00:00:00Z"), + ...overrides, +}); + +const renderSection = () => + render( + + + , + ); + +describe("AISettingsSection", () => { + beforeEach(() => { + queryClient.invalidateQueries.mockReset(); + queryClient.setQueryData.mockReset(); + mutationOptions.create.mockClear(); + mutationOptions.test.mockClear(); + mutationOptions.update.mockClear(); + mutationOptions.delete.mockClear(); + mutations.create.mockReset(); + mutations.test.mockReset(); + mutations.update.mockReset(); + mutations.delete.mockReset(); + }); + + it("uses the save-and-test result as the connected provider row", async () => { + const created = provider({}); + const tested = provider({ enabled: true, testStatus: "success", lastTestedAt: new Date("2026-07-04T01:00:00Z") }); + + mutations.create.mockResolvedValue(created); + mutations.test.mockResolvedValue(tested); + + renderSection(); + + fireEvent.change(screen.getByLabelText("API Key"), { target: { value: "sk-test" } }); + fireEvent.click(screen.getByRole("button", { name: /save & test provider/i })); + + await waitFor(() => expect(queryClient.setQueryData).toHaveBeenCalled()); + + expect(mutationOptions.create).toHaveBeenCalledWith({ meta: { noInvalidate: true } }); + expect(mutationOptions.test).toHaveBeenCalledWith({ meta: { noInvalidate: true } }); + expect(mutations.update).not.toHaveBeenCalled(); + + const [, updater] = queryClient.setQueryData.mock.calls.at(-1) as [ + unknown, + (providers: MockProvider[]) => MockProvider[], + ]; + expect(updater([created])).toEqual([tested]); + }); +}); diff --git a/apps/web/src/features/settings/integrations/components/ai-section.tsx b/apps/web/src/features/settings/integrations/components/ai-section.tsx index 12627ebc1..9326a9939 100644 --- a/apps/web/src/features/settings/integrations/components/ai-section.tsx +++ b/apps/web/src/features/settings/integrations/components/ai-section.tsx @@ -122,6 +122,13 @@ function providerLabel(provider: AIProvider) { return providerOptions.find((option) => option.value === provider)?.label ?? provider; } +function upsertProvider(providers: SavedProvider[] | undefined, provider: SavedProvider) { + if (!providers) return [provider]; + if (!providers.some((entry) => entry.id === provider.id)) return [...providers, provider]; + + return providers.map((entry) => (entry.id === provider.id ? provider : entry)); +} + function isAiProviderConfigError(error: unknown) { if (error instanceof ORPCError && error.code === "PRECONDITION_FAILED") return true; @@ -247,11 +254,18 @@ function CreateProviderForm() { [form.provider], ); const invalidate = () => queryClient.invalidateQueries({ queryKey: orpc.aiProviders.list.queryKey() }); + const setProviderInCache = (provider: SavedProvider) => + queryClient.setQueryData(orpc.aiProviders.list.queryKey(), (providers: SavedProvider[] | undefined) => + upsertProvider(providers, provider), + ); - const { mutateAsync: createProvider, isPending: isCreating } = useMutation(orpc.aiProviders.create.mutationOptions()); - const { mutateAsync: testProvider, isPending: isTesting } = useMutation(orpc.aiProviders.test.mutationOptions()); - const { mutateAsync: enableProvider, isPending: isEnabling } = useMutation(orpc.aiProviders.update.mutationOptions()); - const isSaving = isCreating || isTesting || isEnabling; + const { mutateAsync: createProvider, isPending: isCreating } = useMutation( + orpc.aiProviders.create.mutationOptions({ meta: { noInvalidate: true } }), + ); + const { mutateAsync: testProvider, isPending: isTesting } = useMutation( + orpc.aiProviders.test.mutationOptions({ meta: { noInvalidate: true } }), + ); + const isSaving = isCreating || isTesting; // Model/label are prefilled from provider defaults, so step 1 (Provider + API Key) is enough to save. const model = form.model.trim(); @@ -271,8 +285,9 @@ function CreateProviderForm() { // Test on save: verify the connection immediately instead of leaving it to a manual step. const tested = await testProvider({ id: created.id }); + setProviderInCache(tested); + if (tested.testStatus === "success") { - await enableProvider({ id: created.id, enabled: true }); setForm(emptyForm); setResult({ ok: true, message: t`Connection verified — provider is ready to use.` }); } else {