lingui-po-translate 1.0.4 → 1.0.6

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.md CHANGED
@@ -77,13 +77,10 @@ t({
77
77
  comment: "@manual:zh-Hans,zh-Hant"
78
78
  })
79
79
 
80
- // Combine with context
80
+ // Combine with context (use ; as separator)
81
81
  t({
82
82
  message: "Technical term",
83
- comment: `
84
- @manual:zh-Hans
85
- @context:Industry-specific terminology
86
- `
83
+ comment: "@manual:zh-Hans; @context:Industry-specific terminology"
87
84
  })
88
85
  ```
89
86
 
@@ -176,6 +173,8 @@ Options:
176
173
  --baseUrl <url> Custom API base URL for OpenAI-compatible APIs
177
174
  --prompt <prompt> Additional instructions for AI translation
178
175
  --matcher <matcher> Interpolation matcher: "none", "icu", "i18next", "sprintf"
176
+ --model <model> Model for AI translation (default: "gpt-4o-mini")
177
+ --debug Print debug info including API requests/responses
179
178
  -v, --version Output the version number
180
179
  -h, --help Display help
181
180
  ```
@@ -234,6 +233,48 @@ lingui-po-translate \
234
233
  --prompt="This is a medical application. Keep technical terms like 'MRI', 'CT scan' in English. Use polite Japanese (敬語)."
235
234
  ```
236
235
 
236
+ ## Model Selection
237
+
238
+ Specify a different model for translation:
239
+
240
+ ```bash
241
+ # Use GPT-4o for higher quality translations
242
+ lingui-po-translate \
243
+ --srcFile=locales/en.po \
244
+ --targetFile=locales/zh.po \
245
+ --targetLng=zh \
246
+ --service=openai \
247
+ --serviceConfig="YOUR_API_KEY" \
248
+ --model=gpt-4o
249
+
250
+ # Use with DeepSeek
251
+ lingui-po-translate \
252
+ --baseUrl="https://api.deepseek.com/v1" \
253
+ --serviceConfig="YOUR_DEEPSEEK_KEY" \
254
+ --model=deepseek-chat \
255
+ ...
256
+ ```
257
+
258
+ Default model: `gpt-4o-mini`
259
+
260
+ ## Debugging
261
+
262
+ Use `--debug` to print API requests and responses:
263
+
264
+ ```bash
265
+ lingui-po-translate \
266
+ --srcFile=locales/en.po \
267
+ --targetFile=locales/zh.po \
268
+ --targetLng=zh \
269
+ --service=openai \
270
+ --serviceConfig="YOUR_API_KEY" \
271
+ --debug
272
+ ```
273
+
274
+ This will print:
275
+ - System prompt and user prompt sent to the API
276
+ - Full API response including token usage
277
+
237
278
  ## Weblate Integration
238
279
 
239
280
  For entries marked with `@manual`, the tool copies the original text to `msgstr`. This prevents Weblate from flagging them as "untranslated".
@@ -67,6 +67,7 @@ async function runTranslationService(rawInputs, args) {
67
67
  prompt: args.prompt,
68
68
  baseUrl: args.baseUrl,
69
69
  debug: args.debug,
70
+ model: args.model,
70
71
  };
71
72
  console.info(`Invoke '${args.service}' from '${args.srcLng}' to '${args.targetLng}' with ${serviceArgs.strings.length} inputs...`);
72
73
  const translationService = await (0, service_definitions_1.instantiateTService)(args.service);
@@ -32,7 +32,7 @@ function formatCliOptions(options) {
32
32
  }
33
33
  exports.formatCliOptions = formatCliOptions;
34
34
  async function translateCli(cliArgs) {
35
- var _a, _b, _c, _d;
35
+ var _a, _b, _c, _d, _e;
36
36
  checkForEmptyStringOptions(cliArgs);
37
37
  const fileFormats = (0, file_format_definitions_1.getTFileFormatList)();
38
38
  const services = (0, service_definitions_1.getTServiceList)();
@@ -74,6 +74,7 @@ async function translateCli(cliArgs) {
74
74
  sourceOverride: (0, core_definitions_1.parseSourceOverride)(cliArgs.sourceOverride),
75
75
  baseUrl: (_c = cliArgs.baseUrl) !== null && _c !== void 0 ? _c : null,
76
76
  debug: (_d = cliArgs.debug) !== null && _d !== void 0 ? _d : false,
77
+ model: (_e = cliArgs.model) !== null && _e !== void 0 ? _e : null,
77
78
  };
78
79
  const result = await (0, translate_core_1.translateCore)(coreArgs);
79
80
  const flushTarget = !oldTarget || !(0, tset_ops_1.areEqual)(oldTarget, result.newTarget);
package/dist/index.js CHANGED
@@ -33,6 +33,7 @@ function run(process, cliBinDir) {
33
33
  .option("--sourceOverride <mapping>", "override source language for specific targets (e.g., 'zh-Hant:zh-Hans,pt-BR:pt-PT')")
34
34
  .option("--baseUrl <url>", "custom API base URL for OpenAI-compatible services (e.g., 'https://api.openai.com/v1')")
35
35
  .option("--debug", "print debug information including API requests")
36
+ .option("--model <model>", "model to use for AI translation services (e.g., gpt-4o-mini, gpt-4o)")
36
37
  .version((0, extract_version_1.extractVersion)({ cliBinDir }), "-v, --version")
37
38
  .parse(process.argv);
38
39
  if ((_a = commander_1.default.args) === null || _a === void 0 ? void 0 : _a.length) {
@@ -53,6 +54,7 @@ function run(process, cliBinDir) {
53
54
  sourceOverride: commander_1.default.opts().sourceOverride,
54
55
  baseUrl: commander_1.default.opts().baseUrl,
55
56
  debug: commander_1.default.opts().debug,
57
+ model: commander_1.default.opts().model,
56
58
  };
57
59
  (0, translate_cli_1.translateCli)(args)
58
60
  .then(() => {
@@ -5,7 +5,7 @@ const openai_1 = require("openai");
5
5
  const util_1 = require("../util/util");
6
6
  const lodash_1 = require("lodash");
7
7
  async function translateSingleString(tString, args) {
8
- var _a, _b, _c, _d;
8
+ var _a, _b, _c, _d, _e;
9
9
  const OPENAI_API_KEY = args.serviceConfig;
10
10
  if (!OPENAI_API_KEY || !OPENAI_API_KEY.trim().length) {
11
11
  (0, util_1.logFatal)('Missing OpenAI API Key: Please get an API key from https://platform.openai.com/account/api-keys and then call lingui-po-translate with --serviceConfig="YOUR API KEY"');
@@ -26,9 +26,10 @@ async function translateSingleString(tString, args) {
26
26
  content: userPrompt,
27
27
  },
28
28
  ];
29
+ const model = (_c = args.model) !== null && _c !== void 0 ? _c : "gpt-4o-mini";
29
30
  if (args.debug) {
30
31
  console.log("\n[DEBUG] OpenAI Request:");
31
- console.log(" Model: gpt-4o-mini-2024-07-18");
32
+ console.log(" Model:", model);
32
33
  console.log(" System:", systemPrompt);
33
34
  console.log(" User:", userPrompt);
34
35
  }
@@ -39,7 +40,7 @@ async function translateSingleString(tString, args) {
39
40
  */
40
41
  try {
41
42
  const completion = await openai.createChatCompletion({
42
- model: "gpt-4o-mini-2024-07-18",
43
+ model,
43
44
  messages: messages,
44
45
  temperature: 0,
45
46
  max_tokens: 2048,
@@ -47,7 +48,7 @@ async function translateSingleString(tString, args) {
47
48
  if (args.debug) {
48
49
  console.log("\n[DEBUG] OpenAI Full Response:", JSON.stringify(completion.data, null, 2));
49
50
  }
50
- const text = (_c = completion.data.choices[0].message) === null || _c === void 0 ? void 0 : _c.content;
51
+ const text = (_d = completion.data.choices[0].message) === null || _d === void 0 ? void 0 : _d.content;
51
52
  if (text == undefined) {
52
53
  (0, util_1.logFatal)("OpenAI returned undefined for prompt " + prompt);
53
54
  }
@@ -58,7 +59,7 @@ async function translateSingleString(tString, args) {
58
59
  (0, util_1.logFatal)("OpenAI: " +
59
60
  e.message +
60
61
  ", Status text: " +
61
- JSON.stringify((_d = e === null || e === void 0 ? void 0 : e.response) === null || _d === void 0 ? void 0 : _d.statusText));
62
+ JSON.stringify((_e = e === null || e === void 0 ? void 0 : e.response) === null || _e === void 0 ? void 0 : _e.statusText));
62
63
  }
63
64
  else {
64
65
  throw e;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lingui-po-translate",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "AI-powered translation tool for Lingui PO files with context-aware translations",
5
5
  "repository": {
6
6
  "type": "git",