dsh-think-translate 1.2.21 → 1.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.de.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.de.png?v=1.2.21" alt="dsh-think-translate — KI-Gedanken in deiner Sprache" width="100%" />
2
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.de.png?v=1.2.23" alt="dsh-think-translate — KI-Gedanken in deiner Sprache" width="100%" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -8,9 +8,9 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.de.svg?v=1.2.21" alt="MIT-Lizenz" />
12
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.de.svg?v=1.2.21" alt="Lokales Ollama" />
13
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.de.svg?v=1.2.21" alt="Originale erhalten" />
11
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.de.svg?v=1.2.23" alt="MIT-Lizenz" />
12
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.de.svg?v=1.2.23" alt="Lokales Ollama" />
13
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.de.svg?v=1.2.23" alt="Originale erhalten" />
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -18,7 +18,7 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.de.svg?v=1.2.21" alt="Installation" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.de.svg?v=1.2.21" alt="Live-Demos" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.de.svg?v=1.2.21" alt="Funktionen" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.de.svg?v=1.2.21" alt="Vergleich" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.de.svg?v=1.2.21" alt="Fragen" height="24" /></a>
21
+ <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.de.svg?v=1.2.23" alt="Installation" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.de.svg?v=1.2.23" alt="Live-Demos" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.de.svg?v=1.2.23" alt="Funktionen" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.de.svg?v=1.2.23" alt="Vergleich" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.de.svg?v=1.2.23" alt="Fragen" height="24" /></a>
22
22
  </p>
23
23
 
24
24
  ---
@@ -29,10 +29,10 @@
29
29
  <table>
30
30
  <tr>
31
31
  <td width="50%" align="center" valign="bottom">
32
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.21" alt="Demo 1 · Gedanken und Antworten" width="100%" />
32
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.23" alt="Demo 1 · Gedanken und Antworten" width="100%" />
33
33
  </td>
34
34
  <td width="50%" align="center" valign="bottom">
35
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.21" alt="Demo 2 · Weitere Bedienung" width="100%" />
35
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.23" alt="Demo 2 · Weitere Bedienung" width="100%" />
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
@@ -45,7 +45,7 @@
45
45
  ## Vergleich mit dem offiziellen Übersetzungsplugin
46
46
 
47
47
  <p align="center">
48
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.de.png?v=1.2.21" alt="Vergleich mit dem offiziellen Übersetzungsplugin" width="100%" />
48
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.de.png?v=1.2.23" alt="Vergleich mit dem offiziellen Übersetzungsplugin" width="100%" />
49
49
  </p>
50
50
 
51
51
  Aktiviere dieses Plugin oder den offiziellen Gedankenübersetzer. Beide übernehmen die Gedankenoberfläche.
package/README.es.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.es.png?v=1.2.21" alt="dsh-think-translate — El pensamiento de la IA, en tu idioma" width="100%" />
2
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.es.png?v=1.2.23" alt="dsh-think-translate — El pensamiento de la IA, en tu idioma" width="100%" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -8,9 +8,9 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.es.svg?v=1.2.21" alt="Licencia MIT" />
12
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.es.svg?v=1.2.21" alt="Ollama local" />
13
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.es.svg?v=1.2.21" alt="Originales intactos" />
11
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.es.svg?v=1.2.23" alt="Licencia MIT" />
12
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.es.svg?v=1.2.23" alt="Ollama local" />
13
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.es.svg?v=1.2.23" alt="Originales intactos" />
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -18,7 +18,7 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.es.svg?v=1.2.21" alt="Instalar" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.es.svg?v=1.2.21" alt="Demostraciones" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.es.svg?v=1.2.21" alt="Funciones" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.es.svg?v=1.2.21" alt="Comparación" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.es.svg?v=1.2.21" alt="Preguntas" height="24" /></a>
21
+ <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.es.svg?v=1.2.23" alt="Instalar" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.es.svg?v=1.2.23" alt="Demostraciones" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.es.svg?v=1.2.23" alt="Funciones" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.es.svg?v=1.2.23" alt="Comparación" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.es.svg?v=1.2.23" alt="Preguntas" height="24" /></a>
22
22
  </p>
23
23
 
24
24
  ---
@@ -29,10 +29,10 @@
29
29
  <table>
30
30
  <tr>
31
31
  <td width="50%" align="center" valign="bottom">
32
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.21" alt="Demo 1 · Razonamiento y respuestas" width="100%" />
32
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.23" alt="Demo 1 · Razonamiento y respuestas" width="100%" />
33
33
  </td>
34
34
  <td width="50%" align="center" valign="bottom">
35
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.21" alt="Demo 2 · Más operaciones" width="100%" />
35
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.23" alt="Demo 2 · Más operaciones" width="100%" />
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
@@ -45,7 +45,7 @@
45
45
  ## Comparación con el plugin oficial de traducción
46
46
 
47
47
  <p align="center">
48
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.es.png?v=1.2.21" alt="Comparación con el plugin oficial de traducción" width="100%" />
48
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.es.png?v=1.2.23" alt="Comparación con el plugin oficial de traducción" width="100%" />
49
49
  </p>
50
50
 
51
51
  Activa este plugin o el traductor oficial de razonamiento. Ambos controlan la interfaz del razonamiento.
package/README.fr.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.fr.png?v=1.2.21" alt="dsh-think-translate — La pensée de l’IA, dans votre langue" width="100%" />
2
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.fr.png?v=1.2.23" alt="dsh-think-translate — La pensée de l’IA, dans votre langue" width="100%" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -8,9 +8,9 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.fr.svg?v=1.2.21" alt="Licence MIT" />
12
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.fr.svg?v=1.2.21" alt="Ollama local" />
13
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.fr.svg?v=1.2.21" alt="Originaux conservés" />
11
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.fr.svg?v=1.2.23" alt="Licence MIT" />
12
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.fr.svg?v=1.2.23" alt="Ollama local" />
13
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.fr.svg?v=1.2.23" alt="Originaux conservés" />
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -18,7 +18,7 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.fr.svg?v=1.2.21" alt="Installation" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.fr.svg?v=1.2.21" alt="Démonstrations" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.fr.svg?v=1.2.21" alt="Fonctions" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.fr.svg?v=1.2.21" alt="Comparaison" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.fr.svg?v=1.2.21" alt="Questions" height="24" /></a>
21
+ <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.fr.svg?v=1.2.23" alt="Installation" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.fr.svg?v=1.2.23" alt="Démonstrations" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.fr.svg?v=1.2.23" alt="Fonctions" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.fr.svg?v=1.2.23" alt="Comparaison" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.fr.svg?v=1.2.23" alt="Questions" height="24" /></a>
22
22
  </p>
23
23
 
24
24
  ---
@@ -29,10 +29,10 @@
29
29
  <table>
30
30
  <tr>
31
31
  <td width="50%" align="center" valign="bottom">
32
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.21" alt="Démo 1 · Raisonnement et réponses" width="100%" />
32
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.23" alt="Démo 1 · Raisonnement et réponses" width="100%" />
33
33
  </td>
34
34
  <td width="50%" align="center" valign="bottom">
35
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.21" alt="Démo 2 · Autres opérations" width="100%" />
35
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.23" alt="Démo 2 · Autres opérations" width="100%" />
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
@@ -45,7 +45,7 @@
45
45
  ## Comparaison avec le plugin officiel de traduction
46
46
 
47
47
  <p align="center">
48
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.fr.png?v=1.2.21" alt="Comparaison avec le plugin officiel de traduction" width="100%" />
48
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.fr.png?v=1.2.23" alt="Comparaison avec le plugin officiel de traduction" width="100%" />
49
49
  </p>
50
50
 
51
51
  Activez ce plugin ou le traducteur officiel du raisonnement. Tous deux prennent en charge l’affichage du raisonnement.
package/README.ja.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.ja.png?v=1.2.21" alt="dsh-think-translate — AI の思考を、あなたの言語で" width="100%" />
2
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.ja.png?v=1.2.23" alt="dsh-think-translate — AI の思考を、あなたの言語で" width="100%" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -8,9 +8,9 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.ja.svg?v=1.2.21" alt="MIT License" />
12
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.ja.svg?v=1.2.21" alt="ローカル Ollama" />
13
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.ja.svg?v=1.2.21" alt="原文を保持" />
11
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.ja.svg?v=1.2.23" alt="MIT License" />
12
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.ja.svg?v=1.2.23" alt="ローカル Ollama" />
13
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.ja.svg?v=1.2.23" alt="原文を保持" />
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -18,7 +18,7 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.ja.svg?v=1.2.21" alt="簡単インストール" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.ja.svg?v=1.2.21" alt="動作デモ" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.ja.svg?v=1.2.21" alt="主な機能" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.ja.svg?v=1.2.21" alt="公式との比較" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.ja.svg?v=1.2.21" alt="よくある質問" height="24" /></a>
21
+ <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.ja.svg?v=1.2.23" alt="簡単インストール" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.ja.svg?v=1.2.23" alt="動作デモ" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.ja.svg?v=1.2.23" alt="主な機能" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.ja.svg?v=1.2.23" alt="公式との比較" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.ja.svg?v=1.2.23" alt="よくある質問" height="24" /></a>
22
22
  </p>
23
23
 
24
24
  ---
@@ -29,10 +29,10 @@
29
29
  <table>
30
30
  <tr>
31
31
  <td width="50%" align="center" valign="bottom">
32
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.21" alt="デモ1 · 思考と回答の翻訳" width="100%" />
32
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.23" alt="デモ1 · 思考と回答の翻訳" width="100%" />
33
33
  </td>
34
34
  <td width="50%" align="center" valign="bottom">
35
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.21" alt="デモ2 · その他の操作" width="100%" />
35
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.23" alt="デモ2 · その他の操作" width="100%" />
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
@@ -45,7 +45,7 @@
45
45
  ## 公式翻訳プラグインとの比較
46
46
 
47
47
  <p align="center">
48
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.ja.png?v=1.2.21" alt="公式翻訳プラグインとの比較" width="100%" />
48
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.ja.png?v=1.2.23" alt="公式翻訳プラグインとの比較" width="100%" />
49
49
  </p>
50
50
 
51
51
  本プラグインか公式思考翻訳のどちらか一方を有効にしてください。両者とも思考表示を担当します。
package/README.ko.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.ko.png?v=1.2.21" alt="dsh-think-translate — AI의 생각을 당신의 언어로" width="100%" />
2
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.ko.png?v=1.2.23" alt="dsh-think-translate — AI의 생각을 당신의 언어로" width="100%" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -8,9 +8,9 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.ko.svg?v=1.2.21" alt="MIT License" />
12
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.ko.svg?v=1.2.21" alt="로컬 Ollama" />
13
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.ko.svg?v=1.2.21" alt="원문 보존" />
11
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.ko.svg?v=1.2.23" alt="MIT License" />
12
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.ko.svg?v=1.2.23" alt="로컬 Ollama" />
13
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.ko.svg?v=1.2.23" alt="원문 보존" />
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -18,7 +18,7 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.ko.svg?v=1.2.21" alt="빠른 설치" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.ko.svg?v=1.2.21" alt="실제 데모" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.ko.svg?v=1.2.21" alt="핵심 기능" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.ko.svg?v=1.2.21" alt="공식 비교" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.ko.svg?v=1.2.21" alt="자주 묻는 질문" height="24" /></a>
21
+ <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.ko.svg?v=1.2.23" alt="빠른 설치" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.ko.svg?v=1.2.23" alt="실제 데모" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.ko.svg?v=1.2.23" alt="핵심 기능" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.ko.svg?v=1.2.23" alt="공식 비교" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.ko.svg?v=1.2.23" alt="자주 묻는 질문" height="24" /></a>
22
22
  </p>
23
23
 
24
24
  ---
@@ -29,10 +29,10 @@
29
29
  <table>
30
30
  <tr>
31
31
  <td width="50%" align="center" valign="bottom">
32
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.21" alt="데모 1 · 사고 과정과 답변 번역" width="100%" />
32
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.23" alt="데모 1 · 사고 과정과 답변 번역" width="100%" />
33
33
  </td>
34
34
  <td width="50%" align="center" valign="bottom">
35
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.21" alt="데모 2 · 더 많은 실제 조작" width="100%" />
35
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.23" alt="데모 2 · 더 많은 실제 조작" width="100%" />
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
@@ -45,7 +45,7 @@
45
45
  ## 공식 번역 플러그인과 비교
46
46
 
47
47
  <p align="center">
48
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.ko.png?v=1.2.21" alt="공식 번역 플러그인과 비교" width="100%" />
48
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.ko.png?v=1.2.23" alt="공식 번역 플러그인과 비교" width="100%" />
49
49
  </p>
50
50
 
51
51
  이 플러그인과 공식 사고 번역 중 하나만 활성화하세요. 둘 다 사고 화면을 담당합니다.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.en.png?v=1.2.21" alt="dsh-think-translate — AI thinking, in your language" width="100%" />
2
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.en.png?v=1.2.23" alt="dsh-think-translate — AI thinking, in your language" width="100%" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -8,9 +8,9 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.en.svg?v=1.2.21" alt="MIT License" />
12
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.en.svg?v=1.2.21" alt="Local Ollama" />
13
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.en.svg?v=1.2.21" alt="Originals preserved" />
11
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.en.svg?v=1.2.23" alt="MIT License" />
12
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.en.svg?v=1.2.23" alt="Local Ollama" />
13
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.en.svg?v=1.2.23" alt="Originals preserved" />
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -18,7 +18,7 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.en.svg?v=1.2.21" alt="Quick install" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.en.svg?v=1.2.21" alt="Live demos" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.en.svg?v=1.2.21" alt="Features" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.en.svg?v=1.2.21" alt="Official comparison" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.en.svg?v=1.2.21" alt="FAQ" height="24" /></a>
21
+ <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.en.svg?v=1.2.23" alt="Quick install" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.en.svg?v=1.2.23" alt="Live demos" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.en.svg?v=1.2.23" alt="Features" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.en.svg?v=1.2.23" alt="Official comparison" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.en.svg?v=1.2.23" alt="FAQ" height="24" /></a>
22
22
  </p>
23
23
 
24
24
  ---
@@ -29,10 +29,10 @@
29
29
  <table>
30
30
  <tr>
31
31
  <td width="50%" align="center" valign="bottom">
32
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.21" alt="Demo 1 · Reasoning and answers" width="100%" />
32
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.23" alt="Demo 1 · Reasoning and answers" width="100%" />
33
33
  </td>
34
34
  <td width="50%" align="center" valign="bottom">
35
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.21" alt="Demo 2 · More live operations" width="100%" />
35
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.23" alt="Demo 2 · More live operations" width="100%" />
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
@@ -45,7 +45,7 @@
45
45
  ## Comparison with the official translation plugin
46
46
 
47
47
  <p align="center">
48
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.en.png?v=1.2.21" alt="Comparison with the official translation plugin" width="100%" />
48
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.en.png?v=1.2.23" alt="Comparison with the official translation plugin" width="100%" />
49
49
  </p>
50
50
 
51
51
  Enable either this plugin or the official reasoning translator. Both take over the reasoning interface. While the official plugin is enabled, this plugin yields its translation views and displays a conflict notice. It resumes when the official plugin is disabled, without changing the official plugin's configuration.
@@ -70,6 +70,8 @@ dsh plugin --profile web add github:UncleK/dsh-think-translate
70
70
 
71
71
  Update from npm:
72
72
 
73
+ **On the first update from 1.2.21 or earlier**, stop DSH and, inside the active profile directory, copy `node_modules/dsh-think-translate/lib/config.json` to `dsh-think-translate/config.json` (create the directory if needed). Keep the destination if it already exists. The plugin market may uninstall the old package first, so copy the file before updating. The new version keeps providers, glossaries and DSH credential references under the profile.
74
+
73
75
  ```bash
74
76
  dsh plugin --profile web add dsh-think-translate@latest
75
77
  ```
@@ -205,6 +207,10 @@ When all enabled providers fail, the original remains. Test individual providers
205
207
  <details>
206
208
  <summary><b>Recent changes and compatibility</b></summary>
207
209
 
210
+ **1.2.23** Restores translation for later reasoning blocks that start empty (#23), fixes todo dock icons (#24), and recognizes prose around common CJK slash expressions and file paths (#22).
211
+
212
+ **1.2.22** Stores translation settings under the DSH profile (#21) and fixes glossary fallback to shorter terms (#20). Follow the configuration copy step above when upgrading from an older version.
213
+
208
214
  **1.2.21** Fixes repeated translation requests during rapid task updates (#17). Task text is translated after 500 ms without changes.
209
215
 
210
216
  **1.2.20** adds an opt-in, one-click technical glossary with 60 terms and product names for all nine target languages. Custom entries override built-ins and retain their own allowance; preview and disable the preset without removing custom entries.
@@ -232,7 +238,7 @@ Earlier versions and details: [GitHub Releases](https://github.com/UncleK/dsh-th
232
238
  - No extra build step: source files are the deliverable. Restart DSH after changing host code.
233
239
  - Run checks with `npm test`. Discovery and credential handling are documented in the [maintenance notes](https://github.com/UncleK/dsh-think-translate/blob/main/docs/maintenance-notes.md).
234
240
  - Push/PR CI runs `npm ci --ignore-scripts` and `npm test` on Windows/Linux with Node 20/22/24/26. Node 20 checks the declared compatibility floor; required merge checks need separate repository settings.
235
- - Protection covers Markdown code, recognizable paths, URLs, filenames and common command fragments. Quote paths containing spaces; use backticks or fenced blocks for complex commands and ambiguous technical text.
241
+ - Protection covers Markdown code, recognizable paths, URLs, filenames and common command fragments. Quote paths containing spaces; use backticks or fenced blocks for complex commands and ambiguous technical text. Separate a bare URL from adjacent CJK prose with backticks, whitespace or full-width punctuation.
236
242
 
237
243
  </details>
238
244
 
package/README.pt.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.pt.png?v=1.2.21" alt="dsh-think-translate — O pensamento da IA, no seu idioma" width="100%" />
2
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.pt.png?v=1.2.23" alt="dsh-think-translate — O pensamento da IA, no seu idioma" width="100%" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -8,9 +8,9 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.pt.svg?v=1.2.21" alt="Licença MIT" />
12
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.pt.svg?v=1.2.21" alt="Ollama local" />
13
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.pt.svg?v=1.2.21" alt="Originais preservados" />
11
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.pt.svg?v=1.2.23" alt="Licença MIT" />
12
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.pt.svg?v=1.2.23" alt="Ollama local" />
13
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.pt.svg?v=1.2.23" alt="Originais preservados" />
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -18,7 +18,7 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.pt.svg?v=1.2.21" alt="Instalação" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.pt.svg?v=1.2.21" alt="Demonstrações" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.pt.svg?v=1.2.21" alt="Recursos" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.pt.svg?v=1.2.21" alt="Comparação" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.pt.svg?v=1.2.21" alt="Perguntas" height="24" /></a>
21
+ <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.pt.svg?v=1.2.23" alt="Instalação" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.pt.svg?v=1.2.23" alt="Demonstrações" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.pt.svg?v=1.2.23" alt="Recursos" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.pt.svg?v=1.2.23" alt="Comparação" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.pt.svg?v=1.2.23" alt="Perguntas" height="24" /></a>
22
22
  </p>
23
23
 
24
24
  ---
@@ -29,10 +29,10 @@
29
29
  <table>
30
30
  <tr>
31
31
  <td width="50%" align="center" valign="bottom">
32
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.21" alt="Demo 1 · Raciocínio e respostas" width="100%" />
32
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.23" alt="Demo 1 · Raciocínio e respostas" width="100%" />
33
33
  </td>
34
34
  <td width="50%" align="center" valign="bottom">
35
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.21" alt="Demo 2 · Mais operações" width="100%" />
35
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.23" alt="Demo 2 · Mais operações" width="100%" />
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
@@ -45,7 +45,7 @@
45
45
  ## Comparação com o plugin oficial de tradução
46
46
 
47
47
  <p align="center">
48
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.pt.png?v=1.2.21" alt="Comparação com o plugin oficial de tradução" width="100%" />
48
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.pt.png?v=1.2.23" alt="Comparação com o plugin oficial de tradução" width="100%" />
49
49
  </p>
50
50
 
51
51
  Ative este plugin ou o tradutor oficial de raciocínio. Ambos controlam a interface de raciocínio.
package/README.ru.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.ru.png?v=1.2.21" alt="dsh-think-translate — Мысли ИИ — на вашем языке" width="100%" />
2
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.ru.png?v=1.2.23" alt="dsh-think-translate — Мысли ИИ — на вашем языке" width="100%" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -8,9 +8,9 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.ru.svg?v=1.2.21" alt="Лицензия MIT" />
12
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.ru.svg?v=1.2.21" alt="Локальный Ollama" />
13
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.ru.svg?v=1.2.21" alt="Оригиналы сохранены" />
11
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.ru.svg?v=1.2.23" alt="Лицензия MIT" />
12
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.ru.svg?v=1.2.23" alt="Локальный Ollama" />
13
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.ru.svg?v=1.2.23" alt="Оригиналы сохранены" />
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -18,7 +18,7 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.ru.svg?v=1.2.21" alt="Установка" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.ru.svg?v=1.2.21" alt="Демонстрации" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.ru.svg?v=1.2.21" alt="Возможности" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.ru.svg?v=1.2.21" alt="Сравнение" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.ru.svg?v=1.2.21" alt="Вопросы" height="24" /></a>
21
+ <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.ru.svg?v=1.2.23" alt="Установка" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.ru.svg?v=1.2.23" alt="Демонстрации" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.ru.svg?v=1.2.23" alt="Возможности" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.ru.svg?v=1.2.23" alt="Сравнение" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.ru.svg?v=1.2.23" alt="Вопросы" height="24" /></a>
22
22
  </p>
23
23
 
24
24
  ---
@@ -29,10 +29,10 @@
29
29
  <table>
30
30
  <tr>
31
31
  <td width="50%" align="center" valign="bottom">
32
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.21" alt="Демо 1 · Рассуждения и ответы" width="100%" />
32
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.23" alt="Демо 1 · Рассуждения и ответы" width="100%" />
33
33
  </td>
34
34
  <td width="50%" align="center" valign="bottom">
35
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.21" alt="Демо 2 · Другие операции" width="100%" />
35
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.23" alt="Демо 2 · Другие операции" width="100%" />
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
@@ -45,7 +45,7 @@
45
45
  ## Сравнение с официальным плагином перевода
46
46
 
47
47
  <p align="center">
48
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.ru.png?v=1.2.21" alt="Сравнение с официальным плагином перевода" width="100%" />
48
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.ru.png?v=1.2.23" alt="Сравнение с официальным плагином перевода" width="100%" />
49
49
  </p>
50
50
 
51
51
  Включайте этот плагин или официальный переводчик рассуждений. Оба управляют интерфейсом рассуждений.
package/README.zh-CN.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.zh-CN.png?v=1.2.21" width="100%" alt="dsh-think-translate:让 AI 的思考,用你的语言呈现" />
2
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/hero.zh-CN.png?v=1.2.23" width="100%" alt="dsh-think-translate:让 AI 的思考,用你的语言呈现" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -8,9 +8,9 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.zh-CN.svg?v=1.2.21" alt="MIT License" />
12
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.zh-CN.svg?v=1.2.21" alt="支持本地 Ollama" />
13
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.zh-CN.svg?v=1.2.21" alt="保留原文与模型上下文" />
11
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-mit.zh-CN.svg?v=1.2.23" alt="MIT License" />
12
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-local.zh-CN.svg?v=1.2.23" alt="支持本地 Ollama" />
13
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/badge-original.zh-CN.svg?v=1.2.23" alt="保留原文与模型上下文" />
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -18,7 +18,7 @@
18
18
  </p>
19
19
 
20
20
  <p align="center">
21
- <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.zh-CN.svg?v=1.2.21" alt="快速安装" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.zh-CN.svg?v=1.2.21" alt="实际演示" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.zh-CN.svg?v=1.2.21" alt="核心能力" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.zh-CN.svg?v=1.2.21" alt="官方对比" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.zh-CN.svg?v=1.2.21" alt="常见问题" height="24" /></a>
21
+ <a href="#quick-start"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-quick-start.zh-CN.svg?v=1.2.23" alt="快速安装" height="24" /></a> &nbsp;·&nbsp; <a href="#demo"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-demo.zh-CN.svg?v=1.2.23" alt="实际演示" height="24" /></a> &nbsp;·&nbsp; <a href="#features"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-features.zh-CN.svg?v=1.2.23" alt="核心能力" height="24" /></a> &nbsp;·&nbsp; <a href="#comparison"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-comparison.zh-CN.svg?v=1.2.23" alt="官方对比" height="24" /></a> &nbsp;·&nbsp; <a href="#faq"><img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/nav-faq.zh-CN.svg?v=1.2.23" alt="常见问题" height="24" /></a>
22
22
  </p>
23
23
 
24
24
  ---
@@ -29,10 +29,10 @@
29
29
  <table>
30
30
  <tr>
31
31
  <td width="50%" align="center" valign="bottom">
32
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.21" width="100%" alt="思考链与回答翻译的实际操作演示" />
32
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo.gif?v=1.2.23" width="100%" alt="思考链与回答翻译的实际操作演示" />
33
33
  </td>
34
34
  <td width="50%" align="center" valign="bottom">
35
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.21" width="100%" alt="dsh-think-translate 第二段实际操作演示" />
35
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/demo/demo2.gif?v=1.2.23" width="100%" alt="dsh-think-translate 第二段实际操作演示" />
36
36
  </td>
37
37
  </tr>
38
38
  <tr>
@@ -49,7 +49,7 @@
49
49
  ## 与官方翻译插件对比
50
50
 
51
51
  <p align="center">
52
- <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.zh-CN.png?v=1.2.21" width="100%" alt="与官方翻译插件的功能和首次上线日期对比" />
52
+ <img src="https://raw.githubusercontent.com/UncleK/dsh-think-translate/main/docs/assets/translation-comparison.zh-CN.png?v=1.2.23" width="100%" alt="与官方翻译插件的功能和首次上线日期对比" />
53
53
  </p>
54
54
 
55
55
  本插件与官方思考翻译都接管思考界面,请二选一启用。检测到官方插件启用时,本插件暂停翻译并显示冲突提示;关闭官方插件后自动恢复,不会修改官方插件的启用状态。
@@ -74,6 +74,8 @@ dsh plugin --profile web add github:UncleK/dsh-think-translate
74
74
 
75
75
  升级 npm 版本:
76
76
 
77
+ **首次从 1.2.21 或更早版本升级时**,先退出 DSH,在对应的 profile 目录内把 `node_modules/dsh-think-translate/lib/config.json` 复制到 `dsh-think-translate/config.json`(需要时先建目录)。目标已存在时保留目标文件。插件市场可能先卸载旧包,请在更新前复制;新版会在 profile 下保存提供方、术语表和 DSH 凭证引用。
78
+
77
79
  ```bash
78
80
  dsh plugin --profile web add dsh-think-translate@latest
79
81
  ```
@@ -213,6 +215,10 @@ reasoning => 思考过程
213
215
  <details>
214
216
  <summary><b>最近更新与兼容性</b></summary>
215
217
 
218
+ **1.2.23** 修复后续思考块从空白开始时漏译的问题(#23),恢复待办栏图标(#24),并改善常见中日文斜杠表达和文件路径后的正文识别(#22)。
219
+
220
+ **1.2.22** 把翻译配置移到 DSH profile 目录(#21),并修复术语表短词条漏匹配(#20)。首次从旧版升级前请按上面的步骤复制配置。
221
+
216
222
  **1.2.21** 修复 #17 中待办文本频繁更新时重复触发翻译的问题。参数生成期间显示原文,文本稳定 500 毫秒后翻译。
217
223
 
218
224
  **1.2.20** 增加 60 条常用技术术语的九语言内置词表,内置和自定义独立勾选;自定义词条优先、额度独立。新增未保存提醒,并改进宽屏布局。
@@ -248,7 +254,7 @@ reasoning => 思考过程
248
254
  - 无需额外构建,源码即产物;修改 Host 后重启 DSH。
249
255
  - 检查命令:`npm test`。
250
256
  - CI 在 push / PR 时执行 `npm ci --ignore-scripts` 和 `npm test`,覆盖 Windows、Linux 与 Node 20/22/24/26;Node 20 用于验证当前声明的最低兼容版本。成为合并必需检查需要仓库另行配置。
251
- - 代码保护覆盖 Markdown 代码、明确可识别的路径、URL、文件名和常见命令片段;有空格的路径请加引号,复杂命令和有歧义的技术内容请使用反引号或代码块。
257
+ - 代码保护覆盖 Markdown 代码、明确可识别的路径、URL、文件名和常见命令片段;有空格的路径请加引号,复杂命令和有歧义的技术内容请使用反引号或代码块。裸 URL 紧贴中文或日文时,请用反引号、空格或全角标点标明边界。
252
258
 
253
259
  配置发现、凭据处理和维护说明见 [维护笔记](https://github.com/UncleK/dsh-think-translate/blob/main/docs/maintenance-notes.md)。
254
260
 
package/lib/client.js CHANGED
@@ -23,7 +23,7 @@ window.__ModuleLoader__.load({
23
23
  // there yet (an older process still serving the port), and the contract test
24
24
  // pins PLUGIN_VERSION to package.json so the two can never drift.
25
25
  var PLUGIN_NAME = "dsh-think-translate";
26
- var PLUGIN_VERSION = "1.2.21";
26
+ var PLUGIN_VERSION = "1.2.23";
27
27
  var PLUGIN_REPO = "https://github.com/UncleK/dsh-think-translate";
28
28
  // The official MarkdownText contract changed in 0.1.2-alpha: it now takes a
29
29
  // nested `labels` object and dereferences it without defaults inside its code
@@ -47,9 +47,9 @@ window.__ModuleLoader__.load({
47
47
  if (mdLabelsCache) mdLabelsCache.set(tt, labels);
48
48
  return labels;
49
49
  }
50
- var IconChecklist = primitives && primitives.IconChecklistOutline14 ? primitives.IconChecklistOutline14 : null;
51
- var IconChevronUp = primitives && primitives.IconChevronUpOutline14 ? primitives.IconChevronUpOutline14 : null;
52
- var IconChevronDown = primitives && primitives.IconChevronDownOutline14 ? primitives.IconChevronDownOutline14 : null;
50
+ var IconChecklist = primitives ? (primitives.IconChecklistOutlineRegular || primitives.IconChecklistOutline14 || null) : null;
51
+ var IconChevronUp = primitives ? (primitives.IconChevronUpOutlineRegular || primitives.IconChevronUpOutline14 || null) : null;
52
+ var IconChevronDown = primitives ? (primitives.IconChevronDownOutlineRegular || primitives.IconChevronDownOutline14 || null) : null;
53
53
  var createElement = function (type, props) {
54
54
  var children = [];
55
55
  for (var i = 2; i < arguments.length; i++) children.push(arguments[i]);
@@ -1136,6 +1136,19 @@ window.__ModuleLoader__.load({
1136
1136
  for (const [open, close] of [['(', ')'], ['[', ']'], ['{', '}']]) {
1137
1137
  while (value.endsWith(close) && value.split(close).length > value.split(open).length) value = value.slice(0, -1)
1138
1138
  }
1139
+ // Common CJK pairs use a slash as punctuation. Keep path-shaped tokens
1140
+ // and standalone Unicode directory names protected.
1141
+ const left = text.slice(Math.max(0, start - 2), start)
1142
+ if (value.startsWith('/') && !/[.\\/]/.test(value.slice(1).replace(/和\/或|输入\/输出|入力\/出力/g, ''))
1143
+ && ((left.endsWith('输入') && value.startsWith('/输出'))
1144
+ || (left.endsWith('入力') && value.startsWith('/出力'))
1145
+ || (left.endsWith('和') && value.startsWith('/或')))) return 0
1146
+ // Split at a known file extension followed by a prose continuation.
1147
+ // A URL can legally contain the same text as a slug, so keep it whole.
1148
+ if (!/^(?:https?|file):/i.test(value)) {
1149
+ const extension = /\.(?:[cm]?js|jsx|tsx?|jsonl?|ya?ml|toml|ini|env|md|py|sh|ps1|cmd|bat|exe|lock|go|rs|cpp|sql|html|css|txt|zstd|png|jpe?g|svg)(?=(?:然后|接着|并且|之后|後に|してから)[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]{2,}$)/iu.exec(value)
1150
+ if (extension) value = value.slice(0, extension.index + extension[0].length)
1151
+ }
1139
1152
  return value.length
1140
1153
  }
1141
1154
  const command = rest.match(/^(?:(?:npm|pnpm|yarn)\s+(?:run\s+[\w:.-]+|test|ci|install|build|start)|git\s+(?:status|diff|log|fetch|pull|push|show|branch)|(?:python3?|node)\s+[\w./\\:-]+\.(?:py|[cm]?js))(?=$|[\s.,;:!?,。!?;:、)]|--)(?:[ \t]+(?:--?[\w-]+(?:=[\w./\\:@=-]+)?|--|"[^"\r\n]*"|'[^'\r\n]*'))*/)
@@ -1989,6 +2002,8 @@ window.__ModuleLoader__.load({
1989
2002
  rendered.push(createElement(TextBlockSafe, { key: "t" + i, text: block.text, streaming: streaming,
1990
2003
  fileMentions: mentions, textInteractionSource: data.status === "settled" && !!(data.finalNode && data.finalNode.messageId) }));
1991
2004
  } else if (block.kind === "reasoning") {
2005
+ // DSH can emit an empty block-start before the first reasoning delta.
2006
+ if (typeof block.text !== "string" || !block.text.trim()) continue;
1992
2007
  rendered.push(createElement(ProcessReasoning, { key: "r" + i, hidden: reasoningHidden,
1993
2008
  useGroupAction: props.useGroupAction, reveal: revealProcess },
1994
2009
  createElement(ThinkRow, { text: block.text, running: streaming && i === last, eager: eager })));
package/lib/glossary.js CHANGED
@@ -84,18 +84,24 @@ export function glossaryEntriesForTarget(glossary, target) {
84
84
 
85
85
  function escapePattern(text) { return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') }
86
86
 
87
+ // Boundaries live in the pattern so a longer term that fails one still lets the
88
+ // shorter terms match. Only word characters get one; CJK ends never do. /iu folds
89
+ // long s and the Kelvin sign to s and k, so term ends are tested the same way.
90
+ function termPattern(source) {
91
+ return (/\w/iu.test(source[0]) ? '(?<!\\w)' : '')
92
+ + '(' + escapePattern(source) + ')'
93
+ + (/\w/iu.test(source.at(-1)) ? '(?!\\w)' : '')
94
+ }
95
+
87
96
  function glossaryMatches(text, entries) {
88
97
  if (!entries.length) return []
89
98
  const sorted = entries.slice().sort((a, b) => b.source.length - a.source.length)
90
- const pattern = new RegExp(sorted.map(entry => '(' + escapePattern(entry.source) + ')').join('|'), 'giu')
99
+ const pattern = new RegExp(sorted.map(entry => termPattern(entry.source)).join('|'), 'giu')
91
100
  const matches = []
92
101
  let match
93
102
  while ((match = pattern.exec(text)) !== null) {
94
103
  const entry = sorted[match.slice(1).findIndex(value => value !== undefined)]
95
- const end = match.index + match[0].length
96
- if ((/[A-Za-z0-9_]/.test(entry.source[0]) && /[A-Za-z0-9_]/.test(text[match.index - 1] || ''))
97
- || (/[A-Za-z0-9_]/.test(entry.source.at(-1)) && /[A-Za-z0-9_]/.test(text[end] || ''))) continue
98
- matches.push({ start: match.index, end, target: entry.target })
104
+ matches.push({ start: match.index, end: match.index + match[0].length, target: entry.target })
99
105
  }
100
106
  return matches
101
107
  }
package/lib/index.js CHANGED
@@ -6,7 +6,7 @@
6
6
  // Providers: google (gtx), bing (ttranslatev3), openai-compatible (any
7
7
  // /chat/completions endpoint — usually the local Ollama).
8
8
  import { readFile, writeFile, mkdir, copyFile, access, unlink, stat, rename } from 'node:fs/promises'
9
- import { dirname, join } from 'node:path'
9
+ import { dirname, isAbsolute, join } from 'node:path'
10
10
  import { tmpdir } from 'node:os'
11
11
  import { randomUUID } from 'node:crypto'
12
12
  import { createLocalPreparation, ollamaOrigin, validOllamaSignature } from './ollama.js'
@@ -27,7 +27,7 @@ export const name = 'dsh-think-translate'
27
27
  // plugin silently registered nothing (no error, no routes).
28
28
  export const inject = ['webServer', 'subprocess', 'timer']
29
29
 
30
- const CONFIG_PATH = fileURLToPath(new URL('./config.json', import.meta.url))
30
+ const LEGACY_CONFIG_PATH = fileURLToPath(new URL('./config.json', import.meta.url))
31
31
  const PACKAGE_PATH = fileURLToPath(new URL('../package.json', import.meta.url))
32
32
 
33
33
  // Fallback locations for launchers without profileContext. Modern launchers
@@ -57,11 +57,8 @@ function pickHarnessHome(candidates, exists) {
57
57
  // Diagnostic for the settings panel: which home was used and what was read there.
58
58
  let dshScanDiag = { home: null, settingsFound: false, credsFound: false, providers: [] }
59
59
 
60
- // Defaults: local model (Ollama) enabled from the start — the chain is
61
- // fail-open, so if Ollama is down it falls back to google/bing. `chain` is the
62
- // ordered provider list for translation; disabled providers are silently
63
- // skipped. `fallback` is an independent backup chain tried when the main chain
64
- // fails entirely.
60
+ // Fresh installs try Google, Bing, then the local model. Disabled providers
61
+ // are skipped. An enabled fallback is a separate chain tried after the main one.
65
62
  const DEFAULT_CONFIG = {
66
63
  glossary: { enabled: true, builtin: false, entries: {} },
67
64
  localModel: { idleMinutes: 5 },
@@ -674,6 +671,21 @@ let configCache = null
674
671
  let configLoading = null
675
672
  let credentialMigrationNeeded = false
676
673
 
674
+ function configPath() {
675
+ const dir = profileContextRef?.dir
676
+ return typeof dir === 'string' && isAbsolute(dir)
677
+ ? join(dir, name, 'config.json')
678
+ : LEGACY_CONFIG_PATH
679
+ }
680
+
681
+ async function readConfigFile(path) {
682
+ try { return await readFile(path, 'utf8') }
683
+ catch (error) {
684
+ if (error.code !== 'ENOENT') throw error
685
+ return null
686
+ }
687
+ }
688
+
677
689
  async function loadConfig() {
678
690
  if (configLoading) return configLoading
679
691
  if (configCache !== null && !(credentialMigrationNeeded && credentialService())) return configCache
@@ -686,36 +698,37 @@ async function loadConfig() {
686
698
 
687
699
  async function readConfig() {
688
700
  credentialMigrationNeeded = false
689
- try {
690
- const raw = await readFile(CONFIG_PATH, 'utf8')
691
- const parsed = JSON.parse(raw)
692
- credentialMigrationNeeded = Object.entries(parsed.providers || {}).some(([id, p]) => p?.apiKey && !(id === 'openai' && p.apiKey === 'ollama-local'))
693
- const hadPriority = parsed && typeof parsed.priority === 'string'
694
- configCache = deepMerge(structuredCloneSafe(DEFAULT_CONFIG), parsed)
695
- if (hadPriority && !Array.isArray(parsed.chain)) {
696
- // Genuine old format (priority but no explicit chain): rebuild chain
697
- // from the priority field, overriding the deepMerge-inherited default.
698
- // An explicit `chain` always wins — pullModel still persists
699
- // `priority` (2026-08: 'openai' after an Ollama pull), which must not
700
- // scramble a user-configured chain on the next startup.
701
- configCache.chain = buildChainFromPriority(parsed)
701
+ const destination = configPath()
702
+ let source = destination
703
+ let raw = await readConfigFile(source)
704
+ if (raw === null && destination !== LEGACY_CONFIG_PATH) {
705
+ source = LEGACY_CONFIG_PATH
706
+ raw = await readConfigFile(source)
707
+ }
708
+ let parsed
709
+ if (raw !== null) {
710
+ try {
711
+ parsed = JSON.parse(raw)
712
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new SyntaxError('Expected a config object')
713
+ } catch (_error) {
714
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-')
715
+ await copyFile(source, source + '.corrupt-' + stamp).catch(() => {})
716
+ parsed = undefined
702
717
  }
703
- } catch (e) {
704
- // An unparsable config.json used to be replaced by the defaults on the spot,
705
- // which silently destroyed every provider (and every key typed into one) after
706
- // a single hand-editing mistake. Keep the file — under a name nobody mistakes
707
- // for the live one — and keep serving defaults until the user fixes it.
708
- const stamp = new Date().toISOString().replace(/[:.]/g, '-')
709
- await copyFile(CONFIG_PATH, CONFIG_PATH + '.corrupt-' + stamp).catch(function () {})
710
- configCache = structuredCloneSafe(DEFAULT_CONFIG)
718
+ }
719
+ configCache = deepMerge(structuredCloneSafe(DEFAULT_CONFIG), parsed || {})
720
+ if (parsed) {
721
+ credentialMigrationNeeded = Object.entries(parsed.providers || {}).some(([id, p]) => p?.apiKey && !(id === 'openai' && p.apiKey === 'ollama-local'))
722
+ // A stored chain wins over the obsolete priority field.
723
+ if (typeof parsed.priority === 'string' && !Array.isArray(parsed.chain)) configCache.chain = buildChainFromPriority(parsed)
711
724
  }
712
725
  migrateConfig(configCache)
713
726
  // DSH must be loaded from config cache since it reads from the filesystem
714
727
  // using the ABSOLUTE DSH_HOME path, not from the runtime config JSON.
715
728
  await mergeDshProviders(configCache)
716
- // Upgrade old manually entered keys only after the owning credential service
717
- // is present. Never erase the legacy file on a failed migration.
718
- if (credentialService() && credentialMigrationNeeded) {
729
+ // Keep the legacy file intact. Defer migration of plaintext keys until DSH
730
+ // can store them, so moving a config never writes a new plaintext copy.
731
+ if (credentialMigrationNeeded ? credentialService() : parsed && source !== destination) {
719
732
  await saveConfig(configCache)
720
733
  }
721
734
  return configCache
@@ -778,11 +791,12 @@ function clearNullFields(cfg) {
778
791
  async function saveConfig(cfg) {
779
792
  const credentials = credentialService()
780
793
  const prepared = await prepareCredentials(cfg, credentials)
781
- const temporary = CONFIG_PATH + '.' + randomUUID() + '.tmp'
794
+ const path = configPath()
795
+ const temporary = path + '.' + randomUUID() + '.tmp'
782
796
  try {
783
- await mkdir(dirname(CONFIG_PATH), { recursive: true })
797
+ await mkdir(dirname(path), { recursive: true })
784
798
  await writeFile(temporary, JSON.stringify(prepared.config, null, 2), { encoding: 'utf8', mode: 0o600, flag: 'wx' })
785
- await rename(temporary, CONFIG_PATH)
799
+ await rename(temporary, path)
786
800
  } catch (_error) {
787
801
  await discardCredentials(prepared.created, credentials)
788
802
  await unlink(temporary).catch(() => {}) // A failed write may not have created it.
@@ -9,7 +9,7 @@ export function translationNamespace(config, credentialRevision = 0) {
9
9
  const p = config.providers[id]
10
10
  return [id, p.type, p.enabled, p.source, p.baseURL, p.model, p.apiKeyEnv, p.apiKeyRef]
11
11
  })
12
- return createHash('sha256').update(JSON.stringify(['protected-v4-independent-glossary', config.chain, config.fallback, providers, config.glossary,
12
+ return createHash('sha256').update(JSON.stringify(['protected-v5-cjk-boundaries', config.chain, config.fallback, providers, config.glossary,
13
13
  config.glossary?.builtin === true ? builtinRevision : null, credentialRevision])).digest('hex')
14
14
  }
15
15
 
package/lib/text.js CHANGED
@@ -33,6 +33,19 @@ export function protectedTextParts(text) {
33
33
  for (const [open, close] of [['(', ')'], ['[', ']'], ['{', '}']]) {
34
34
  while (value.endsWith(close) && value.split(close).length > value.split(open).length) value = value.slice(0, -1)
35
35
  }
36
+ // Common CJK pairs use a slash as punctuation. Keep path-shaped tokens
37
+ // and standalone Unicode directory names protected.
38
+ const left = text.slice(Math.max(0, start - 2), start)
39
+ if (value.startsWith('/') && !/[.\\/]/.test(value.slice(1).replace(/和\/或|输入\/输出|入力\/出力/g, ''))
40
+ && ((left.endsWith('输入') && value.startsWith('/输出'))
41
+ || (left.endsWith('入力') && value.startsWith('/出力'))
42
+ || (left.endsWith('和') && value.startsWith('/或')))) return 0
43
+ // Split at a known file extension followed by a prose continuation.
44
+ // A URL can legally contain the same text as a slug, so keep it whole.
45
+ if (!/^(?:https?|file):/i.test(value)) {
46
+ const extension = /\.(?:[cm]?js|jsx|tsx?|jsonl?|ya?ml|toml|ini|env|md|py|sh|ps1|cmd|bat|exe|lock|go|rs|cpp|sql|html|css|txt|zstd|png|jpe?g|svg)(?=(?:然后|接着|并且|之后|後に|してから)[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]{2,}$)/iu.exec(value)
47
+ if (extension) value = value.slice(0, extension.index + extension[0].length)
48
+ }
36
49
  return value.length
37
50
  }
38
51
  const command = rest.match(/^(?:(?:npm|pnpm|yarn)\s+(?:run\s+[\w:.-]+|test|ci|install|build|start)|git\s+(?:status|diff|log|fetch|pull|push|show|branch)|(?:python3?|node)\s+[\w./\\:-]+\.(?:py|[cm]?js))(?=$|[\s.,;:!?,。!?;:、)]|--)(?:[ \t]+(?:--?[\w-]+(?:=[\w./\\:@=-]+)?|--|"[^"\r\n]*"|'[^'\r\n]*'))*/)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-think-translate",
3
3
  "description": "Display-layer translation for the DSH web app: thinking chain, task cards, and optional answer text, in 9 target languages (local Ollama / any OpenAI-compatible or Anthropic endpoint / Google / Bing, fail-open)",
4
- "version": "1.2.21",
4
+ "version": "1.2.23",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "exports": {