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"
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 {