Skip to content

Commit 23594cd

Browse files
Automated localization updates for selected languages (#599)
1 parent bf41e3a commit 23594cd

File tree

5 files changed

+134
-4
lines changed

5 files changed

+134
-4
lines changed

app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,18 @@ have to prompt.
5656
[
5757
new ButtonData
5858
{
59+
#if DEBUG
60+
Text = T("Write Lua code to language plugin file"),
61+
#else
5962
Text = T("Copy Lua code to clipboard"),
63+
#endif
6064
Icon = Icons.Material.Filled.Extension,
6165
Color = Color.Default,
66+
#if DEBUG
67+
AsyncAction = async () => await this.WriteToPluginFile(),
68+
#else
6269
AsyncAction = async () => await this.RustService.CopyText2Clipboard(this.Snackbar, this.finalLuaCode.ToString()),
70+
#endif
6371
DisabledActionParam = () => this.finalLuaCode.Length == 0,
6472
},
6573
];
@@ -368,10 +376,71 @@ private void Phase2CreateLuaCode(IReadOnlyDictionary<string, string> commentCont
368376
{
369377
this.finalLuaCode.Clear();
370378
LuaTable.Create(ref this.finalLuaCode, "UI_TEXT_CONTENT", this.localizedContent, commentContent, this.cancellationTokenSource!.Token);
371-
379+
372380
// Next, we must remove the `root::` prefix from the keys:
373381
this.finalLuaCode.Replace("""UI_TEXT_CONTENT["root::""", """
374382
UI_TEXT_CONTENT["
375383
""");
376384
}
385+
386+
#if DEBUG
387+
private async Task WriteToPluginFile()
388+
{
389+
if (this.selectedLanguagePlugin is null)
390+
{
391+
this.Snackbar.Add(T("No language plugin selected."), Severity.Error);
392+
return;
393+
}
394+
395+
if (this.finalLuaCode.Length == 0)
396+
{
397+
this.Snackbar.Add(T("No Lua code generated yet."), Severity.Error);
398+
return;
399+
}
400+
401+
try
402+
{
403+
// Determine the plugin file path based on the selected language plugin:
404+
var pluginDirectory = Path.Join(Environment.CurrentDirectory, "Plugins", "languages");
405+
var pluginId = this.selectedLanguagePluginId.ToString();
406+
var ietfTag = this.selectedLanguagePlugin.IETFTag.ToLowerInvariant();
407+
var pluginFolderName = $"{ietfTag}-{pluginId}";
408+
var pluginFilePath = Path.Join(pluginDirectory, pluginFolderName, "plugin.lua");
409+
410+
if (!File.Exists(pluginFilePath))
411+
{
412+
this.Logger.LogError("Plugin file not found: {PluginFilePath}.", pluginFilePath);
413+
this.Snackbar.Add(T("Plugin file not found."), Severity.Error);
414+
return;
415+
}
416+
417+
// Read the existing plugin file:
418+
var existingContent = await File.ReadAllTextAsync(pluginFilePath);
419+
420+
// Find the position of "UI_TEXT_CONTENT = {}":
421+
const string MARKER = "UI_TEXT_CONTENT = {}";
422+
var markerIndex = existingContent.IndexOf(MARKER, StringComparison.Ordinal);
423+
424+
if (markerIndex == -1)
425+
{
426+
this.Logger.LogError("Could not find 'UI_TEXT_CONTENT = {{}}' marker in plugin file: {PluginFilePath}", pluginFilePath);
427+
this.Snackbar.Add(T("Could not find 'UI_TEXT_CONTENT = {}' marker in plugin file."), Severity.Error);
428+
return;
429+
}
430+
431+
// Keep everything before the marker and replace everything from the marker onwards:
432+
var metadataSection = existingContent[..markerIndex];
433+
var newContent = metadataSection + this.finalLuaCode;
434+
435+
// Write the updated content back to the file:
436+
await File.WriteAllTextAsync(pluginFilePath, newContent);
437+
this.Snackbar.Add(T("Successfully updated plugin file."), Severity.Success);
438+
}
439+
catch (Exception ex)
440+
{
441+
this.Logger.LogError(ex, "Error writing to plugin file.");
442+
this.Snackbar.Add(T("Error writing to plugin file."), Severity.Error);
443+
}
444+
}
445+
#endif
377446
}

app/MindWork AI Studio/Assistants/I18N/allTexts.lua

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,21 +1042,36 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1214535771"] = "Rem
10421042
-- Added Content ({0} entries)
10431043
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1258080997"] = "Added Content ({0} entries)"
10441044

1045+
-- No Lua code generated yet.
1046+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1365137848"] = "No Lua code generated yet."
1047+
10451048
-- Localized Content ({0} entries of {1})
10461049
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1492071634"] = "Localized Content ({0} entries of {1})"
10471050

10481051
-- Select the language plugin used for comparision.
10491052
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1523568309"] = "Select the language plugin used for comparision."
10501053

1054+
-- Successfully updated plugin file.
1055+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1524590750"] = "Successfully updated plugin file."
1056+
10511057
-- Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin.
10521058
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1893011391"] = "Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin."
10531059

1060+
-- No language plugin selected.
1061+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T237325294"] = "No language plugin selected."
1062+
10541063
-- Target language
10551064
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T237828418"] = "Target language"
10561065

1066+
-- Write Lua code to language plugin file
1067+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T253827221"] = "Write Lua code to language plugin file"
1068+
10571069
-- Language plugin used for comparision
10581070
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T263317578"] = "Language plugin used for comparision"
10591071

1072+
-- Plugin file not found.
1073+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T2938065913"] = "Plugin file not found."
1074+
10601075
-- Localize AI Studio & generate the Lua code
10611076
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3055634395"] = "Localize AI Studio & generate the Lua code"
10621077

@@ -1087,6 +1102,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T453060723"] = "The
10871102
-- The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language.
10881103
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T458999393"] = "The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language."
10891104

1105+
-- Could not find 'UI_TEXT_CONTENT = {}' marker in plugin file.
1106+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T628596031"] = "Could not find 'UI_TEXT_CONTENT = {}' marker in plugin file."
1107+
10901108
-- Please provide a custom language.
10911109
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T656744944"] = "Please provide a custom language."
10921110

@@ -1096,6 +1114,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T851515643"] = "Plea
10961114
-- Localization
10971115
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T897888480"] = "Localization"
10981116

1117+
-- Error writing to plugin file.
1118+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T948564909"] = "Error writing to plugin file."
1119+
10991120
-- Your icon source
11001121
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T1302165948"] = "Your icon source"
11011122

app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,21 +1044,36 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1214535771"] = "Ent
10441044
-- Added Content ({0} entries)
10451045
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1258080997"] = "Hinzugefügte Inhalte ({0} Einträge)"
10461046

1047+
-- No Lua code generated yet.
1048+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1365137848"] = "Es wurde kein Lua-Code generiert."
1049+
10471050
-- Localized Content ({0} entries of {1})
10481051
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1492071634"] = "Lokalisierte Inhalte ({0} von {1} Einträgen)"
10491052

10501053
-- Select the language plugin used for comparision.
10511054
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1523568309"] = "Wählen Sie das Sprach-Plugin für den Vergleich aus."
10521055

1056+
-- Successfully updated plugin file.
1057+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1524590750"] = "Plugin-Datei erfolgreich aktualisiert."
1058+
10531059
-- Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin.
10541060
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1893011391"] = "Das Sprach-Plugin für den Vergleich konnte nicht geladen werden ({0}). Bitte wählen Sie ein gültiges, geladenes und laufendes Sprach-Plugin."
10551061

1062+
-- No language plugin selected.
1063+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T237325294"] = "Kein Sprach-Plugin ausgewählt."
1064+
10561065
-- Target language
10571066
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T237828418"] = "Zielsprache"
10581067

1068+
-- Write Lua code to language plugin file
1069+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T253827221"] = "Lua-Code für Sprach-Plugin-Datei schreiben"
1070+
10591071
-- Language plugin used for comparision
10601072
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T263317578"] = "Sprach-Plugin für den Vergleich"
10611073

1074+
-- Plugin file not found.
1075+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T2938065913"] = "Plugin-Datei nicht gefunden."
1076+
10621077
-- Localize AI Studio & generate the Lua code
10631078
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3055634395"] = "Lokalisiere AI Studio & generiere den Lua-Code"
10641079

@@ -1089,6 +1104,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T453060723"] = "Die
10891104
-- The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language.
10901105
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T458999393"] = "Das ausgewählte Sprach-Plugin für den Vergleich verwendet das IETF-Tag „{0}“, das nicht mit der ausgewählten Zielsprache „{1}“ übereinstimmt. Bitte wähle ein gültiges, geladenes und laufendes Sprach-Plugin aus, das mit der Zielsprache übereinstimmt."
10911106

1107+
-- Could not find 'UI_TEXT_CONTENT = {}' marker in plugin file.
1108+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T628596031"] = "Konnte den 'UI_TEXT_CONTENT = {}'-Marker in der Plugin-Datei nicht finden."
1109+
10921110
-- Please provide a custom language.
10931111
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T656744944"] = "Bitte geben Sie eine benutzerdefinierte Sprache an."
10941112

@@ -1098,6 +1116,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T851515643"] = "Bitt
10981116
-- Localization
10991117
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T897888480"] = "Lokalisierung"
11001118

1119+
-- Error writing to plugin file.
1120+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T948564909"] = "Fehler beim Schreiben in die Plugin-Datei."
1121+
11011122
-- Your icon source
11021123
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T1302165948"] = "Ihre Icons-Quelle"
11031124

@@ -6044,5 +6065,3 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T1307384014"] = "Unbenannt
60446065

60456066
-- Delete Chat
60466067
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Chat löschen"
6047-
6048-

app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1044,21 +1044,36 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1214535771"] = "Rem
10441044
-- Added Content ({0} entries)
10451045
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1258080997"] = "Added Content ({0} entries)"
10461046

1047+
-- No Lua code generated yet.
1048+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1365137848"] = "No Lua code generated yet."
1049+
10471050
-- Localized Content ({0} entries of {1})
10481051
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1492071634"] = "Localized Content ({0} entries of {1})"
10491052

10501053
-- Select the language plugin used for comparision.
10511054
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1523568309"] = "Select the language plugin used for comparision."
10521055

1056+
-- Successfully updated plugin file.
1057+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1524590750"] = "Successfully updated plugin file."
1058+
10531059
-- Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin.
10541060
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1893011391"] = "Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin."
10551061

1062+
-- No language plugin selected.
1063+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T237325294"] = "No language plugin selected."
1064+
10561065
-- Target language
10571066
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T237828418"] = "Target language"
10581067

1068+
-- Write Lua code to language plugin file
1069+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T253827221"] = "Write Lua code to language plugin file"
1070+
10591071
-- Language plugin used for comparision
10601072
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T263317578"] = "Language plugin used for comparision"
10611073

1074+
-- Plugin file not found.
1075+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T2938065913"] = "Plugin file not found."
1076+
10621077
-- Localize AI Studio & generate the Lua code
10631078
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3055634395"] = "Localize AI Studio & generate the Lua code"
10641079

@@ -1089,6 +1104,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T453060723"] = "The
10891104
-- The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language.
10901105
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T458999393"] = "The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language."
10911106

1107+
-- Could not find 'UI_TEXT_CONTENT = {}' marker in plugin file.
1108+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T628596031"] = "Could not find 'UI_TEXT_CONTENT = {}' marker in plugin file."
1109+
10921110
-- Please provide a custom language.
10931111
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T656744944"] = "Please provide a custom language."
10941112

@@ -1098,6 +1116,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T851515643"] = "Plea
10981116
-- Localization
10991117
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T897888480"] = "Localization"
11001118

1119+
-- Error writing to plugin file.
1120+
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T948564909"] = "Error writing to plugin file."
1121+
11011122
-- Your icon source
11021123
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T1302165948"] = "Your icon source"
11031124

@@ -6044,4 +6065,3 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T1307384014"] = "Unnamed w
60446065

60456066
-- Delete Chat
60466067
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Delete Chat"
6047-

app/MindWork AI Studio/wwwroot/changelog/v0.9.55.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- Improved error handling for Microsoft Word export.
1313
- Improved file reading, e.g. for the translation, summarization, and legal assistants, by performing the Pandoc validation in the first step. This prevents unnecessary selection of files that cannot be processed.
1414
- Improved the file selection for file attachments in chat and assistant file loading by filtering out audio files. Audio attachments are not yet supported.
15+
- Improved the developer experience by automating localization updates in the filesystem for the selected language in the localization assistant.
1516
- Fixed a bug in the local data sources info dialog (preview feature) for data directories that could cause the app to crash. The error was caused by a background thread producing data while the frontend attempted to display it.
1617
- Fixed a visual bug where a function's preview status was misaligned. You might have seen it in document analysis or the ERI server assistant.
1718
- Fixed a rare bug in the Microsoft Word export for huge documents.

0 commit comments

Comments
 (0)