diff --git a/app/AGENTS.md b/app/AGENTS.md
index 5f0aa0f6d..655417bc9 100644
--- a/app/AGENTS.md
+++ b/app/AGENTS.md
@@ -78,6 +78,17 @@ every literal as the compiler does, with its escape sequences and without the in
and the translations keep the line breaks. A text which is not one literal, such as an interpolated string
or a concatenation, gets no translation; the collector warns about it.
+**A text which addresses the reader**, with "you" or by asking them to do something in a sentence, uses `TA()`
+instead of `T()` or `TB()`; labels, buttons, titles, and examples stay with those. A static class gets a `TA()` of
+its own next to its `TB()`: `private static string TA(string fallbackEN) => I18N.I.TA(fallbackEN, typeof(X).Namespace, nameof(X));`.
+The collector files such a text under two keys: the usual one, translated with the formal address, such as "Sie"
+in German, and the same key ending in `::INFORMAL`, translated with the informal address, such as "du". The
+localization assistant writes the informal variant from the formal translation and changes only the form of
+address; whoever corrects a formal translation in the review corrects its informal variant alike. Which one
+the app shows follows `I18N.I.AddressForm`; when the language in use lacks the informal variant, it shows the
+formal one. So far, only the BeyondFacts Lab uses `TA()`, and its option "Form of address" decides, see
+`Program.cs`. The rest of the app addresses the reader formally until it gets a setting of its own for this.
+
## Plugin System
**Location:** `app/MindWork AI Studio/Plugins/`
diff --git a/app/Build/AGENTS.md b/app/Build/AGENTS.md
index eadcc1a4a..2cacd9f44 100644
--- a/app/Build/AGENTS.md
+++ b/app/Build/AGENTS.md
@@ -43,6 +43,14 @@ order of the list is chronological only. Bug reports
alone and commissioned work outside this repository get no entry on the supporters page; the changelog may
still thank them.
+**Ideas, expertise, and concepts.** A person whose idea, expertise, or concept shapes a part of AI Studio,
+such as the researcher who designed an assistant and wrote its content, gets an entry in the list "Ideas,
+Expertise, and Concepts" on the supporters page, also without any contribution to this repository. The maintainer decides who counts, and the person agrees
+to be named. Their entry gives their full name, since they may have no GitHub account, and links to a page
+of their own if they have one:
+``,
+or without `URL`. The list is sorted by when the idea, expertise, or concept came to AI Studio.
+
The credit choice in the pull request template is binding:
- **"Credit me with my GitHub username only":** use the GitHub username alone. No real name, neither in
diff --git a/app/Build/Commands/CollectI18NKeysCommand.cs b/app/Build/Commands/CollectI18NKeysCommand.cs
index 0e2bca951..cd2db9623 100644
--- a/app/Build/Commands/CollectI18NKeysCommand.cs
+++ b/app/Build/Commands/CollectI18NKeysCommand.cs
@@ -67,7 +67,12 @@ public sealed partial class CollectI18NKeysCommand
{
// The key in the format A.B.C.D.T{hash}, with the hash the app computes at runtime:
var key = $"UI_TEXT_CONTENT.{langNamespace}.T{I18NKeyHash.Of(match.Text)}";
- allI18NContent.TryAdd(key, I18NKeyHash.NormalizeLineEndings(match.Text));
+ var text = I18NKeyHash.NormalizeLineEndings(match.Text);
+ allI18NContent.TryAdd(key, text);
+
+ // A text of TA() addresses the reader, so it gets a second key for the informal address:
+ if (match.HasAddressVariants)
+ allI18NContent.TryAdd(I18NAddressVariant.InformalKeyOf(key), text);
}
}
diff --git a/app/MindWork AI Studio.slnx.DotSettings b/app/MindWork AI Studio.slnx.DotSettings
index fe4aedad1..cad432066 100644
--- a/app/MindWork AI Studio.slnx.DotSettings
+++ b/app/MindWork AI Studio.slnx.DotSettings
@@ -21,6 +21,7 @@
RAG
RID
SWOT
+ TA
TB
UI
URL
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor
index 3a9a910b7..637a9efd7 100644
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor
+++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor
@@ -14,13 +14,13 @@
- @T("Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.")
+ @TA("Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.")
- @T("Your preparations")
+ @TA("Your preparations")
@if (this.projects.Count == 0)
{
- @T("You have no preparations yet. Create one for the event you want to prepare for.")
+ @TA("You have no preparations yet. Create one for the event you want to prepare for.")
}
else
{
@@ -100,7 +100,7 @@
@step.Title
@step.Description
- @T("Your details")
+ @TA("Your details")
@if (this.forms.TryGetValue(step, out var form))
{
@@ -108,7 +108,7 @@
else
{
- @T("AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged.")
+ @TA("AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged.")
}
@@ -119,7 +119,7 @@
else
{
- @T("Create a preparation to begin.")
+ @TA("Create a preparation to begin.")
}
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Projects.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Projects.cs
index dea20fe03..803d02ec3 100644
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Projects.cs
+++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Projects.cs
@@ -77,7 +77,7 @@ public partial class BeyondFactsLabAssistant
///
private async Task CreateProjectAsync()
{
- var name = await this.AskForNameAsync(T("New preparation"), T("Name the event you want to prepare for, e.g., the title of a panel discussion."), string.Empty, T("Create"));
+ var name = await this.AskForNameAsync(T("New preparation"), TA("Name the event you want to prepare for, e.g., the title of a panel discussion."), string.Empty, T("Create"));
if (name is null)
return;
@@ -97,7 +97,7 @@ public partial class BeyondFactsLabAssistant
if (this.selectedProject?.Project is not { } project)
return;
- var name = await this.AskForNameAsync(T("Rename preparation"), T("Enter a new name for this preparation."), project.Name, T("Rename"));
+ var name = await this.AskForNameAsync(T("Rename preparation"), TA("Enter a new name for this preparation."), project.Name, T("Rename"));
if (name is null)
return;
@@ -121,8 +121,8 @@ public partial class BeyondFactsLabAssistant
{
dialog => dialog.Message,
project.IsAvailable
- ? string.Format(T("Permanently delete the preparation '{0}' with all of its steps, chats, and work states?"), project.Name)
- : T("This preparation cannot be opened. Permanently delete it with all of its files?")
+ ? string.Format(TA("Permanently delete the preparation '{0}' with all of its steps, chats, and work states?"), project.Name)
+ : TA("This preparation cannot be opened. Permanently delete it with all of its files?")
},
};
@@ -173,7 +173,7 @@ public partial class BeyondFactsLabAssistant
{ dialog => dialog.ConfirmText, confirmText },
{ dialog => dialog.ConfirmColor, Color.Primary },
{ dialog => dialog.AllowEmptyInput, false },
- { dialog => dialog.EmptyInputErrorMessage, T("Please enter a name.") },
+ { dialog => dialog.EmptyInputErrorMessage, TA("Please enter a name.") },
};
var reference = await this.DialogService.ShowAsync(title, parameters, DialogOptions.FULLSCREEN);
@@ -198,7 +198,7 @@ public partial class BeyondFactsLabAssistant
catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException or ArgumentException)
{
this.Logger.LogError(exception, "A change of the preparations of the BeyondFacts Lab failed.");
- await this.MessageBus.SendError(new(Icons.Material.Filled.RecordVoiceOver, T("AI Studio could not save the change of your preparations. Please try again.")));
+ await this.MessageBus.SendError(new(Icons.Material.Filled.RecordVoiceOver, TA("AI Studio could not save the change of your preparations. Please try again.")));
await this.ReloadAfterFailureAsync();
}
finally
@@ -265,7 +265,7 @@ public partial class BeyondFactsLabAssistant
/// The status of the preparation.
private string ProjectRecoveryMessage(BflProjectLoadStatus status) => status switch
{
- BflProjectLoadStatus.NEWER_VERSION => T("A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio."),
+ BflProjectLoadStatus.NEWER_VERSION => TA("A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio."),
_ => T("AI Studio cannot read this preparation. Its files may be damaged."),
};
}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Steps.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Steps.cs
index 37e4e4548..2e922eab7 100644
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Steps.cs
+++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.Steps.cs
@@ -85,7 +85,7 @@ public partial class BeyondFactsLabAssistant
catch (Exception exception) when (exception is IOException or UnauthorizedAccessException or InvalidDataException)
{
this.Logger.LogError(exception, "Could not save the details of a step in the BeyondFacts Lab.");
- await this.MessageBus.SendError(new(Icons.Material.Filled.RecordVoiceOver, T("AI Studio could not save your details. Please try again.")));
+ await this.MessageBus.SendError(new(Icons.Material.Filled.RecordVoiceOver, TA("AI Studio could not save your details. Please try again.")));
}
}
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.cs
index 90e1a749e..1251f1d35 100644
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.cs
+++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BeyondFactsLabAssistant.razor.cs
@@ -80,11 +80,17 @@ public partial class BeyondFactsLabAssistant : MSGComponentBase
///
protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default
{
- // An organization may hide the lab, or the person may switch its preview feature off, while the page is open:
- if (triggeredEvent is Event.CONFIGURATION_CHANGED && !BflAccess.CanOpen(this.SettingsManager))
+ if (triggeredEvent is Event.CONFIGURATION_CHANGED)
{
- this.NavigationManager.NavigateTo(Routes.ASSISTANTS);
- return;
+ // An organization may hide the lab, or the person may switch its preview feature off, while the page is open:
+ if (!BflAccess.CanOpen(this.SettingsManager))
+ {
+ this.NavigationManager.NavigateTo(Routes.ASSISTANTS);
+ return;
+ }
+
+ // A changed option, such as the form of address in the options of the lab, shows right away:
+ this.StateHasChanged();
}
await base.ProcessIncomingMessage(sendingComponent, triggeredEvent, data);
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflAddressForm.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflAddressForm.cs
deleted file mode 100644
index f7dcf93b6..000000000
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflAddressForm.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-namespace AIStudio.Assistants.BeyondFactsLab;
-
-///
-/// How the BeyondFacts Lab addresses the person in languages which tell a formal address from an informal one, such as German.
-///
-public enum BflAddressForm
-{
- ///
- /// The formal address, such as "Sie" in German. The texts of AI Studio use it as well.
- ///
- FORMAL,
-
- ///
- /// The informal address, such as "du" in German.
- ///
- INFORMAL,
-}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflAddressFormExtensions.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflAddressFormExtensions.cs
deleted file mode 100644
index ee7bd9ee5..000000000
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflAddressFormExtensions.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-namespace AIStudio.Assistants.BeyondFactsLab;
-
-public static class BflAddressFormExtensions
-{
- private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(BflAddressFormExtensions).Namespace, nameof(BflAddressFormExtensions));
-
- /// The form of address.
- extension(BflAddressForm addressForm)
- {
- ///
- /// Gets the name of the form of address, as the settings show it.
- ///
- public string Name => addressForm switch
- {
- BflAddressForm.FORMAL => TB("Formal address (Sie in German)"),
- BflAddressForm.INFORMAL => TB("Informal address (du in German)"),
-
- _ => TB("Formal address (Sie in German)"),
- };
- }
-}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflFieldTexts.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflFieldTexts.cs
index 669b44add..a6c771848 100644
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflFieldTexts.cs
+++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflFieldTexts.cs
@@ -7,6 +7,8 @@ public static class BflFieldTexts
{
private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(BflFieldTexts).Namespace, nameof(BflFieldTexts));
+ private static string TA(string fallbackEN) => Tools.PluginSystem.I18N.I.TA(fallbackEN, typeof(BflFieldTexts).Namespace, nameof(BflFieldTexts));
+
/// The field.
extension(BflFieldDefinition definition)
{
@@ -18,25 +20,25 @@ public static class BflFieldTexts
BflFieldCatalog.FORMAT => TB("Format of the event"),
BflFieldCatalog.EVENT_TOPIC => TB("Topic of the event"),
BflFieldCatalog.AUDIENCE => TB("Audience"),
- BflFieldCatalog.CONTRIBUTION_TOPIC => TB("Topic of your contribution or your specific assignment"),
+ BflFieldCatalog.CONTRIBUTION_TOPIC => TA("Topic of your contribution or your specific assignment"),
BflFieldCatalog.EVENT_DATE => TB("Date and time"),
BflFieldCatalog.EVENT_LOCATION => TB("Place"),
BflFieldCatalog.EVENT_DURATION => TB("Total duration of the event"),
- BflFieldCatalog.CONTRIBUTION_DURATION => TB("Duration of your contribution"),
+ BflFieldCatalog.CONTRIBUTION_DURATION => TA("Duration of your contribution"),
BflFieldCatalog.OTHER_PARTICIPANTS => TB("Other participants"),
BflFieldCatalog.EVENT_LINK => TB("Link to the event"),
- BflFieldCatalog.CONTRIBUTION_SUMMARY => TB("Short description of your contribution"),
+ BflFieldCatalog.CONTRIBUTION_SUMMARY => TA("Short description of your contribution"),
BflFieldCatalog.CORE_THESES => TB("Core theses and arguments (if any)"),
BflFieldCatalog.UNCERTAINTIES => TB("Uncertainties and controversies in content and science (if known)"),
- BflFieldCatalog.MATERIAL_NOTES => TB("Notes on how to use your materials"),
+ BflFieldCatalog.MATERIAL_NOTES => TA("Notes on how to use your materials"),
- BflFieldCatalog.GOALS => TB("What do you want to achieve with your contribution?"),
+ BflFieldCatalog.GOALS => TA("What do you want to achieve with your contribution?"),
BflFieldCatalog.GOAL_DIRECTIONS => TB("Suggestions"),
- BflFieldCatalog.VALUES_AND_CONCERNS => TB("Values and concerns: What matters most to you about this topic?"),
- BflFieldCatalog.PERSONAL_CONCERN => TB("Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?"),
- BflFieldCatalog.OTHER_PERSPECTIVES => TB("Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?"),
+ BflFieldCatalog.VALUES_AND_CONCERNS => TA("Values and concerns: What matters most to you about this topic?"),
+ BflFieldCatalog.PERSONAL_CONCERN => TA("Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?"),
+ BflFieldCatalog.OTHER_PERSPECTIVES => TA("Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?"),
BflFieldCatalog.COMMUNICATION_WORRIES => TB("Uncertainties and worries about communicating"),
@@ -44,7 +46,7 @@ public static class BflFieldTexts
BflFieldCatalog.DIFFICULTY => TB("Difficulty at the start"),
BflFieldCatalog.TEST_NOTES => TB("Special notes for the test"),
- BflFieldCatalog.POSITION_CHANGES => TB("What have you changed, kept, or left open compared to your initial position, and why?"),
+ BflFieldCatalog.POSITION_CHANGES => TA("What have you changed, kept, or left open compared to your initial position, and why?"),
_ => string.Empty,
};
@@ -57,24 +59,24 @@ public static class BflFieldTexts
BflFieldCatalog.FORMAT => TB("E.g., panel, keynote, or interview; online, on site, or hybrid"),
BflFieldCatalog.EVENT_TOPIC => TB("The central question or the title"),
BflFieldCatalog.AUDIENCE => TB("E.g., students, experts, or the general public"),
- BflFieldCatalog.CONTRIBUTION_TOPIC => TB("Stays in your preparation and never goes into the research on the web"),
+ BflFieldCatalog.CONTRIBUTION_TOPIC => TA("Stays in your preparation and never goes into the research on the web"),
BflFieldCatalog.EVENT_DATE => TB("E.g., December 10, 2 pm"),
BflFieldCatalog.EVENT_LOCATION => TB("E.g., the venue and the city, or online"),
BflFieldCatalog.EVENT_DURATION => TB("E.g., 90 minutes"),
BflFieldCatalog.CONTRIBUTION_DURATION => TB("E.g., 8 minutes"),
- BflFieldCatalog.OTHER_PARTICIPANTS => TB("Names and roles, as far as you know them"),
+ BflFieldCatalog.OTHER_PARTICIPANTS => TA("Names and roles, as far as you know them"),
BflFieldCatalog.EVENT_LINK => TB("The address of the event page, beginning with https://"),
BflFieldCatalog.CONTRIBUTION_SUMMARY => TB("A few sentences are enough"),
BflFieldCatalog.MATERIAL_NOTES => TB("E.g., use only paper X as the basis for the content"),
- BflFieldCatalog.GOALS => TB("In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you."),
+ BflFieldCatalog.GOALS => TA("In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you."),
- BflFieldCatalog.PERSONAL_CONCERN => TB("Personal detail: it goes into exports and shared sessions only when you explicitly choose so."),
+ BflFieldCatalog.PERSONAL_CONCERN => TA("Personal detail: it goes into exports and shared sessions only when you explicitly choose so."),
BflFieldCatalog.COMMUNICATION_WORRIES => TB("E.g., aggressive moderation, time pressure, or a particular counterpart"),
- BflFieldCatalog.DIFFICULTY => TB("You can raise the difficulty after each question."),
+ BflFieldCatalog.DIFFICULTY => TA("You can raise the difficulty after each question."),
BflFieldCatalog.TEST_NOTES => TB("E.g., take up a confirmed conflict of values or a perspective from the step about values and perspectives"),
_ => string.Empty,
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflNotice.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflNotice.cs
index 39d0deb5b..0775d1ced 100644
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflNotice.cs
+++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflNotice.cs
@@ -9,16 +9,17 @@ namespace AIStudio.Assistants.BeyondFactsLab;
///
/// The notes are a text of the localization, so they come in every language of the app. The settings keep a hash of
/// the notes as the app showed them when the person confirmed them. A new wording, in English or in a translation,
-/// therefore shows them again, and so does a switch to another language, whose notes the person has not read yet.
+/// therefore shows them again, and so does a switch to another language or to another form of address, whose notes
+/// the person has not read yet.
///
public static class BflNotice
{
- private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(BflNotice).Namespace, nameof(BflNotice));
+ private static string TA(string fallbackEN) => Tools.PluginSystem.I18N.I.TA(fallbackEN, typeof(BflNotice).Namespace, nameof(BflNotice));
///
- /// Gets the notes in the language of the app, as Markdown.
+ /// Gets the notes in the language of the app and in the form of address the person chose, as Markdown.
///
- public static string Text => TB("""
+ public static string Text => TA("""
## Welcome!
The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate.
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepExtensions.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepExtensions.cs
index c1956deb9..77dd412eb 100644
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepExtensions.cs
+++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepExtensions.cs
@@ -4,6 +4,8 @@ public static class BflStepExtensions
{
private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(BflStepExtensions).Namespace, nameof(BflStepExtensions));
+ private static string TA(string fallbackEN) => Tools.PluginSystem.I18N.I.TA(fallbackEN, typeof(BflStepExtensions).Namespace, nameof(BflStepExtensions));
+
/// The step.
extension(BflStep step)
{
@@ -28,13 +30,13 @@ public static class BflStepExtensions
///
public string Description => step switch
{
- BflStep.FRAMEWORK => TB("What the event is about, for whom, and what you were asked to contribute."),
- BflStep.KNOWLEDGE => TB("What you know for sure, what is uncertain, and where your expertise ends."),
- BflStep.GOALS_AND_ROLE => TB("What you want to achieve, and in which role you speak."),
- BflStep.VALUES_AND_PERSPECTIVES => TB("What matters to you, what touches you, and what moves others."),
- BflStep.STRATEGY => TB("How you convey evidence, trade-offs between values, and open questions."),
- BflStep.TEST_SITUATION => TB("Play through critical questions and opposing positions."),
- BflStep.RESULTS => TB("What you take away from your preparation."),
+ BflStep.FRAMEWORK => TA("What the event is about, for whom, and what you were asked to contribute."),
+ BflStep.KNOWLEDGE => TA("What you know for sure, what is uncertain, and where your expertise ends."),
+ BflStep.GOALS_AND_ROLE => TA("What you want to achieve, and in which role you speak."),
+ BflStep.VALUES_AND_PERSPECTIVES => TA("What matters to you, what touches you, and what moves others."),
+ BflStep.STRATEGY => TA("How you convey evidence, trade-offs between values, and open questions."),
+ BflStep.TEST_SITUATION => TA("Play through critical questions and opposing positions."),
+ BflStep.RESULTS => TA("What you take away from your preparation."),
_ => string.Empty,
};
@@ -44,7 +46,7 @@ public static class BflStepExtensions
///
public string FormHint => step switch
{
- BflStep.VALUES_AND_PERSPECTIVES => TB("You can fill in single fields or start right away in the chat."),
+ BflStep.VALUES_AND_PERSPECTIVES => TA("You can fill in single fields or start right away in the chat."),
_ => string.Empty,
};
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor
index 544717e78..54b384319 100644
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor
+++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor
@@ -3,7 +3,7 @@
@if (this.MissingFields.Count > 0)
{
- @T("Some details are still missing. The chat will ask for them, and you can continue anyway.")
+ @TA("Some details are still missing. The chat will ask for them, and you can continue anyway.")
@string.Join(", ", this.MissingFields.Select(field => field.Label))
@@ -93,5 +93,5 @@
@if (this.HasKeyDetails)
{
- @T("* The chat works best when you fill in these details.")
+ @TA("* The chat works best when you fill in these details.")
}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor.cs b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor.cs
index 43d93d8d1..ab62d316c 100644
--- a/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor.cs
+++ b/app/MindWork AI Studio/Assistants/BeyondFactsLab/BflStepForm.razor.cs
@@ -70,6 +70,6 @@ public partial class BflStepForm : MSGComponentBase
return Uri.TryCreate(value.Trim(), UriKind.Absolute, out var uri) && (uri.Scheme == Uri.UriSchemeHttps || uri.Scheme == Uri.UriSchemeHttp)
? null
- : T("Please enter an address that begins with https:// or http://.");
+ : TA("Please enter an address that begins with https:// or http://.");
}
}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs b/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs
index 9e32698a4..84c997996 100644
--- a/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs
+++ b/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs
@@ -40,6 +40,8 @@ public partial class AssistantI18N : AssistantBaseCore
Some texts are longer notes in Markdown, with headings, paragraphs, or lists. Keep their
Markdown and their line breaks exactly as they are, and translate only the words.
+ {I18NAddressPrompt.Section(this.SystemPromptLanguage(), this.translatesInformalVariant, this.formalTranslationOfText)}
+
# Target Audience
The app is intended for everyone, not just IT specialists or scientists. When translating,
make sure the texts are easy for everyone to understand.
@@ -124,6 +126,16 @@ public partial class AssistantI18N : AssistantBaseCore
private Dictionary localizedContent = [];
private StringBuilder finalLuaCode = new();
private string? activeSystemPromptLanguage;
+
+ ///
+ /// Whether the text translated now is the informal variant of a text; see I18NAddressPrompt.
+ ///
+ private bool translatesInformalVariant;
+
+ ///
+ /// The formal translation of the text translated now, when it is an informal variant and has one.
+ ///
+ private string? formalTranslationOfText;
private static readonly AssistantSessionStateKey SELECTED_TARGET_LANGUAGE_STATE_KEY = new(nameof(selectedTargetLanguage));
private static readonly AssistantSessionStateKey CUSTOM_TARGET_LANGUAGE_STATE_KEY = new(nameof(customTargetLanguage));
private static readonly AssistantSessionStateKey IS_LOADING_STATE_KEY = new(nameof(isLoading));
@@ -362,7 +374,8 @@ public partial class AssistantI18N : AssistantBaseCore
if (this.selectedTargetLanguage is not CommonLanguages.EN_US)
{
// Phase 1: Translate added content
- await this.Phase1TranslateAddedContent(addedContentSnapshot);
+ var translatedBefore = selectedLanguageContentSnapshot.ToDictionary(keyValuePair => keyValuePair.Key, keyValuePair => keyValuePair.Value, StringComparer.Ordinal);
+ await this.Phase1TranslateAddedContent(addedContentSnapshot, translatedBefore);
}
else
{
@@ -407,6 +420,8 @@ public partial class AssistantI18N : AssistantBaseCore
finally
{
this.activeSystemPromptLanguage = null;
+ this.translatesInformalVariant = false;
+ this.formalTranslationOfText = null;
}
}
@@ -414,12 +429,15 @@ public partial class AssistantI18N : AssistantBaseCore
/// Translates the added text content from a stable snapshot.
///
/// The added text entries captured when the job started.
+ /// The texts of the language plugin, whose formal translations the informal variants start from.
/// A task that completes when all added text entries were translated or cancellation was requested.
- private async Task Phase1TranslateAddedContent(KeyValuePair[] addedContentSnapshot)
+ private async Task Phase1TranslateAddedContent(KeyValuePair[] addedContentSnapshot, IReadOnlyDictionary translatedBefore)
{
var stopwatch = new Stopwatch();
var minimumTime = TimeSpan.FromMilliseconds(500);
- foreach (var keyValuePair in addedContentSnapshot)
+
+ // The informal variants start from the formal translations, so those come first:
+ foreach (var keyValuePair in I18NAddressPrompt.FormalFirst(addedContentSnapshot))
{
if(this.CancellationTokenSource!.IsCancellationRequested)
break;
@@ -433,8 +451,11 @@ public partial class AssistantI18N : AssistantBaseCore
stopwatch.Start();
//
- // Translate one text at a time:
+ // Translate one text at a time. Its own chat thread gets the system prompt
+ // with the form of address of this text:
//
+ this.translatesInformalVariant = I18NAddressVariant.TryGetFormalKey(keyValuePair.Key, out _);
+ this.formalTranslationOfText = this.translatesInformalVariant ? I18NAddressPrompt.FindFormalTranslation(keyValuePair.Key, this.localizedContent, translatedBefore) : null;
this.CreateChatThread();
var time = this.AddUserRequest(keyValuePair.Value);
this.localizedContent.Add(keyValuePair.Key, await this.AddAIResponseAsync(time));
diff --git a/app/MindWork AI Studio/Assistants/I18N/I18NAddressPrompt.cs b/app/MindWork AI Studio/Assistants/I18N/I18NAddressPrompt.cs
new file mode 100644
index 000000000..90cf93a88
--- /dev/null
+++ b/app/MindWork AI Studio/Assistants/I18N/I18NAddressPrompt.cs
@@ -0,0 +1,81 @@
+using SharedTools;
+
+namespace AIStudio.Assistants.I18N;
+
+///
+/// Tells the localization assistant how a text addresses the reader; see I18NAddressVariant.
+///
+///
+/// The usual key of a text gets the formal address, like every text of the app. Its informal variant starts from
+/// the formal translation and changes only the form of address, so that both variants read alike, and a formal
+/// translation which a person reviewed carries its wording over. The formal translations therefore come first.
+///
+public static class I18NAddressPrompt
+{
+ ///
+ /// Puts the informal variants after all other texts and keeps the order otherwise.
+ ///
+ /// The texts to translate, by their keys.
+ /// The texts in the order to translate them.
+ public static IReadOnlyList> FormalFirst(IEnumerable> content) => [.. content.OrderBy(entry => I18NAddressVariant.TryGetFormalKey(entry.Key, out _))];
+
+ ///
+ /// Finds the formal translation of a text whose informal variant comes next.
+ ///
+ /// The key of the informal variant.
+ /// The texts translated in this run.
+ /// The texts of the language plugin so far.
+ /// The formal translation, or null when there is none.
+ public static string? FindFormalTranslation(string informalKey, IReadOnlyDictionary translatedNow, IReadOnlyDictionary translatedBefore)
+ {
+ if (!I18NAddressVariant.TryGetFormalKey(informalKey, out var formalKey))
+ return null;
+
+ if (translatedNow.TryGetValue(formalKey, out var translation) && !string.IsNullOrWhiteSpace(translation))
+ return translation;
+
+ if (translatedBefore.TryGetValue(formalKey, out translation) && !string.IsNullOrWhiteSpace(translation))
+ return translation;
+
+ return null;
+ }
+
+ ///
+ /// Gets the section of the system prompt about the form of address.
+ ///
+ /// The target language.
+ /// Whether the text is the informal variant of a text.
+ /// The formal translation of the text, when it is an informal variant and has one.
+ /// The section, as Markdown.
+ public static string Section(string language, bool isInformalVariant, string? formalTranslation)
+ {
+ if (!isInformalVariant)
+ return $"""
+ # Form of Address
+ When a text addresses the reader, use the formal address of {language}, such as "Sie" in
+ German, "vous" in French, or "usted" in Spanish.
+ """;
+
+ if (string.IsNullOrWhiteSpace(formalTranslation))
+ return $"""
+ # Form of Address
+ Address the reader informally, with the informal address of {language}, such as "du" in
+ German, "tu" in French, or "tú" in Spanish. When {language} has only one form of address,
+ translate as usual.
+ """;
+
+ return $"""
+ # Form of Address
+ Address the reader informally, with the informal address of {language}, such as "du" in
+ German, "tu" in French, or "tú" in Spanish. The formal translation of this text exists already:
+
+
+ {formalTranslation}
+
+
+ Keep its wording, its Markdown, and its line breaks, and change only what the informal address
+ requires, such as pronouns, possessives, and verb forms. When {language} has only one form of
+ address, answer with the formal translation unchanged.
+ """;
+ }
+}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua
index c666df764..ee79f131e 100644
--- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua
+++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua
@@ -736,6 +736,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BATCHPROCESSING::BATCHPROCESSINGPROMPTSOU
-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190"] = "Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states."
+-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190::INFORMAL"] = "Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states."
+
-- Changed on {0}
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1279137966"] = "Changed on {0}"
@@ -748,12 +751,21 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1564342983"] = "AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged."
+-- AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1564342983::INFORMAL"] = "AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged."
+
-- You have no preparations yet. Create one for the event you want to prepare for.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1599306665"] = "You have no preparations yet. Create one for the event you want to prepare for."
+-- You have no preparations yet. Create one for the event you want to prepare for.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1599306665::INFORMAL"] = "You have no preparations yet. Create one for the event you want to prepare for."
+
-- Enter a new name for this preparation.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T193031277"] = "Enter a new name for this preparation."
+-- Enter a new name for this preparation.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T193031277::INFORMAL"] = "Enter a new name for this preparation."
+
-- Cannot be opened
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1981873292"] = "Cannot be opened"
@@ -763,6 +775,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- Your details
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T25208484"] = "Your details"
+-- Your details
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T25208484::INFORMAL"] = "Your details"
+
-- Create
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2567824509"] = "Create"
@@ -772,6 +787,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- Create a preparation to begin.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2751865753"] = "Create a preparation to begin."
+-- Create a preparation to begin.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2751865753::INFORMAL"] = "Create a preparation to begin."
+
-- AI Studio has left the files of this preparation unchanged. A future update may make it accessible again.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2824385338"] = "AI Studio has left the files of this preparation unchanged. A future update may make it accessible again."
@@ -796,27 +814,45 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- This preparation cannot be opened. Permanently delete it with all of its files?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3647862078"] = "This preparation cannot be opened. Permanently delete it with all of its files?"
+-- This preparation cannot be opened. Permanently delete it with all of its files?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3647862078::INFORMAL"] = "This preparation cannot be opened. Permanently delete it with all of its files?"
+
-- Name the event you want to prepare for, e.g., the title of a panel discussion.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3679923414"] = "Name the event you want to prepare for, e.g., the title of a panel discussion."
+-- Name the event you want to prepare for, e.g., the title of a panel discussion.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3679923414::INFORMAL"] = "Name the event you want to prepare for, e.g., the title of a panel discussion."
+
-- Name of the preparation
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3746973353"] = "Name of the preparation"
-- Please enter a name.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3818326829"] = "Please enter a name."
+-- Please enter a name.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3818326829::INFORMAL"] = "Please enter a name."
+
-- AI Studio could not save your details. Please try again.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3921500806"] = "AI Studio could not save your details. Please try again."
+-- AI Studio could not save your details. Please try again.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3921500806::INFORMAL"] = "AI Studio could not save your details. Please try again."
+
-- BeyondFacts Lab
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3956097526"] = "BeyondFacts Lab"
-- A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T395932079"] = "A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio."
+-- A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T395932079::INFORMAL"] = "A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio."
+
-- AI Studio could not save the change of your preparations. Please try again.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T4073131406"] = "AI Studio could not save the change of your preparations. Please try again."
+-- AI Studio could not save the change of your preparations. Please try again.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T4073131406::INFORMAL"] = "AI Studio could not save the change of your preparations. Please try again."
+
-- Requires a newer AI Studio version
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T4087140083"] = "Requires a newer AI Studio version"
@@ -826,17 +862,17 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- Permanently delete the preparation '{0}' with all of its steps, chats, and work states?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T772787118"] = "Permanently delete the preparation '{0}' with all of its steps, chats, and work states?"
+-- Permanently delete the preparation '{0}' with all of its steps, chats, and work states?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T772787118::INFORMAL"] = "Permanently delete the preparation '{0}' with all of its steps, chats, and work states?"
+
-- New preparation
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T851005164"] = "New preparation"
-- Your preparations
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T972511272"] = "Your preparations"
--- Informal address (du in German)
-UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLADDRESSFORMEXTENSIONS::T554958468"] = "Informal address (du in German)"
-
--- Formal address (Sie in German)
-UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLADDRESSFORMEXTENSIONS::T859201973"] = "Formal address (Sie in German)"
+-- Your preparations
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T972511272::INFORMAL"] = "Your preparations"
-- Moderate the discussion
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1131866893"] = "Moderate the discussion"
@@ -847,6 +883,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T113401444
-- What have you changed, kept, or left open compared to your initial position, and why?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1455147822"] = "What have you changed, kept, or left open compared to your initial position, and why?"
+-- What have you changed, kept, or left open compared to your initial position, and why?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1455147822::INFORMAL"] = "What have you changed, kept, or left open compared to your initial position, and why?"
+
-- Show options for action
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1601690165"] = "Show options for action"
@@ -862,9 +901,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T177463328
-- Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1885081930"] = "Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?"
+-- Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1885081930::INFORMAL"] = "Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?"
+
-- Stays in your preparation and never goes into the research on the web
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1949096445"] = "Stays in your preparation and never goes into the research on the web"
+-- Stays in your preparation and never goes into the research on the web
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1949096445::INFORMAL"] = "Stays in your preparation and never goes into the research on the web"
+
-- Very demanding
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1967151608"] = "Very demanding"
@@ -874,9 +919,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T205473120
-- Notes on how to use your materials
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2123646094"] = "Notes on how to use your materials"
+-- Notes on how to use your materials
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2123646094::INFORMAL"] = "Notes on how to use your materials"
+
-- Duration of your contribution
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T223853289"] = "Duration of your contribution"
+-- Duration of your contribution
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T223853289::INFORMAL"] = "Duration of your contribution"
+
-- Special notes for the test
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2242825987"] = "Special notes for the test"
@@ -904,6 +955,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T277557865
-- What do you want to achieve with your contribution?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2818219287"] = "What do you want to achieve with your contribution?"
+-- What do you want to achieve with your contribution?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2818219287::INFORMAL"] = "What do you want to achieve with your contribution?"
+
-- Scientific criticism
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2865565843"] = "Scientific criticism"
@@ -913,9 +967,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T290088321
-- Names and roles, as far as you know them
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3020176946"] = "Names and roles, as far as you know them"
+-- Names and roles, as far as you know them
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3020176946::INFORMAL"] = "Names and roles, as far as you know them"
+
-- Personal detail: it goes into exports and shared sessions only when you explicitly choose so.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3063635296"] = "Personal detail: it goes into exports and shared sessions only when you explicitly choose so."
+-- Personal detail: it goes into exports and shared sessions only when you explicitly choose so.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3063635296::INFORMAL"] = "Personal detail: it goes into exports and shared sessions only when you explicitly choose so."
+
-- Political instrumentalization
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3078371152"] = "Political instrumentalization"
@@ -925,6 +985,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T311485634
-- Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3199962614"] = "Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?"
+-- Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3199962614::INFORMAL"] = "Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?"
+
-- Format of the event
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3217479436"] = "Format of the event"
@@ -934,6 +997,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T329702382
-- Values and concerns: What matters most to you about this topic?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3444467007"] = "Values and concerns: What matters most to you about this topic?"
+-- Values and concerns: What matters most to you about this topic?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3444467007::INFORMAL"] = "Values and concerns: What matters most to you about this topic?"
+
-- Audience
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3506118019"] = "Audience"
@@ -964,12 +1030,18 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T405255323
-- You can raise the difficulty after each question.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T519332031"] = "You can raise the difficulty after each question."
+-- You can raise the difficulty after each question.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T519332031::INFORMAL"] = "You can raise the difficulty after each question."
+
-- E.g., students, experts, or the general public
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T533097975"] = "E.g., students, experts, or the general public"
-- Short description of your contribution
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T667686615"] = "Short description of your contribution"
+-- Short description of your contribution
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T667686615::INFORMAL"] = "Short description of your contribution"
+
-- Type of questions
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T805059831"] = "Type of questions"
@@ -991,9 +1063,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T916990010
-- In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T917276711"] = "In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you."
+-- In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T917276711::INFORMAL"] = "In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you."
+
-- Topic of your contribution or your specific assignment
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T932670647"] = "Topic of your contribution or your specific assignment"
+-- Topic of your contribution or your specific assignment
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T932670647::INFORMAL"] = "Topic of your contribution or your specific assignment"
+
-- E.g., aggressive moderation, time pressure, or a particular counterpart
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T965551209"] = "E.g., aggressive moderation, time pressure, or a particular counterpart"
@@ -1006,6 +1084,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T985014450
-- ## Welcome! The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate. Data protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this. Please check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out. This is a prototype, so we look forward to your feedback.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480"] = "## Welcome!\n\nThe BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate.\n\nData protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this.\n\nPlease check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out.\n\nThis is a prototype, so we look forward to your feedback."
+-- ## Welcome! The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate. Data protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this. Please check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out. This is a prototype, so we look forward to your feedback.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480::INFORMAL"] = "## Welcome!\n\nThe BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate.\n\nData protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this.\n\nPlease check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out.\n\nThis is a prototype, so we look forward to your feedback."
+
-- I have read the notes
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICEDIALOG::T4071737336"] = "I have read the notes"
@@ -1018,24 +1099,39 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T11478
-- How you convey evidence, trade-offs between values, and open questions.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T1290723890"] = "How you convey evidence, trade-offs between values, and open questions."
+-- How you convey evidence, trade-offs between values, and open questions.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T1290723890::INFORMAL"] = "How you convey evidence, trade-offs between values, and open questions."
+
-- Event details
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T135387869"] = "Event details"
-- What the event is about, for whom, and what you were asked to contribute.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T158292580"] = "What the event is about, for whom, and what you were asked to contribute."
+-- What the event is about, for whom, and what you were asked to contribute.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T158292580::INFORMAL"] = "What the event is about, for whom, and what you were asked to contribute."
+
-- You can fill in single fields or start right away in the chat.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T2524378548"] = "You can fill in single fields or start right away in the chat."
+-- You can fill in single fields or start right away in the chat.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T2524378548::INFORMAL"] = "You can fill in single fields or start right away in the chat."
+
-- Goals and role
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T2988481290"] = "Goals and role"
-- What matters to you, what touches you, and what moves others.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3022557767"] = "What matters to you, what touches you, and what moves others."
+-- What matters to you, what touches you, and what moves others.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3022557767::INFORMAL"] = "What matters to you, what touches you, and what moves others."
+
-- What you want to achieve, and in which role you speak.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3052319680"] = "What you want to achieve, and in which role you speak."
+-- What you want to achieve, and in which role you speak.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3052319680::INFORMAL"] = "What you want to achieve, and in which role you speak."
+
-- Strategy
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3205650756"] = "Strategy"
@@ -1048,21 +1144,39 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T49457
-- What you take away from your preparation.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T517692701"] = "What you take away from your preparation."
+-- What you take away from your preparation.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T517692701::INFORMAL"] = "What you take away from your preparation."
+
-- Play through critical questions and opposing positions.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T573043138"] = "Play through critical questions and opposing positions."
+-- Play through critical questions and opposing positions.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T573043138::INFORMAL"] = "Play through critical questions and opposing positions."
+
-- What you know for sure, what is uncertain, and where your expertise ends.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T762525208"] = "What you know for sure, what is uncertain, and where your expertise ends."
+-- What you know for sure, what is uncertain, and where your expertise ends.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T762525208::INFORMAL"] = "What you know for sure, what is uncertain, and where your expertise ends."
+
-- Some details are still missing. The chat will ask for them, and you can continue anyway.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T1474406854"] = "Some details are still missing. The chat will ask for them, and you can continue anyway."
+-- Some details are still missing. The chat will ask for them, and you can continue anyway.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T1474406854::INFORMAL"] = "Some details are still missing. The chat will ask for them, and you can continue anyway."
+
-- Please enter an address that begins with https:// or http://.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T2837809367"] = "Please enter an address that begins with https:// or http://."
+-- Please enter an address that begins with https:// or http://.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T2837809367::INFORMAL"] = "Please enter an address that begins with https:// or http://."
+
-- * The chat works best when you fill in these details.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T3011046288"] = "* The chat works best when you fill in these details."
+-- * The chat works best when you fill in these details.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T3011046288::INFORMAL"] = "* The chat works best when you fill in these details."
+
-- Extended bias poster
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T1241605514"] = "Extended bias poster"
@@ -9922,9 +10036,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBATCHPROCESSING::T82
-- Restore default
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBATCHPROCESSING::T913168756"] = "Restore default"
--- How the lab addresses you in languages with a formal and an informal address, such as German.
-UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T1832497993"] = "How the lab addresses you in languages with a formal and an informal address, such as German."
-
-- Assistant: BeyondFacts Lab Options
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T19824556"] = "Assistant: BeyondFacts Lab Options"
@@ -9934,12 +10045,24 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T218
-- Select a minimum confidence level
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T2579793544"] = "Select a minimum confidence level"
+-- Select a minimum confidence level
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T2579793544::INFORMAL"] = "Select a minimum confidence level"
+
-- Close
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T3448155331"] = "Close"
+-- Whether the lab addresses you formally or informally.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T3883838251"] = "Whether the lab addresses you formally or informally."
+
+-- Whether the lab addresses you formally or informally.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T3883838251::INFORMAL"] = "Whether the lab addresses you formally or informally."
+
-- Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models.
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T4002746484"] = "Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models."
+-- Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T4002746484::INFORMAL"] = "Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models."
+
-- Files are sent as they were first read
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1320692831"] = "Files are sent as they were first read"
@@ -12643,6 +12766,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::SETTINGS::T1258653480"] = "Settings"
-- Data Backup & Restore
UI_TEXT_CONTENT["AISTUDIO::PAGES::SETTINGS::T3317700277"] = "Data Backup & Restore"
+-- Ideas, Expertise, and Concepts
+UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1242911840"] = "Ideas, Expertise, and Concepts"
+
-- Thank you very much, Kerstin, for creating the Wiki, for advising us on ERI with real use cases, and for your work on version 2 of the ERI protocol.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1367356224"] = "Thank you very much, Kerstin, for creating the Wiki, for advising us on ERI with real use cases, and for your work on version 2 of the ERI protocol."
@@ -12703,6 +12829,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3608282312"] = "Thanks, Simon, fo
-- Thank you, Richard, for being the first.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3660718138"] = "Thank you, Richard, for being the first."
+-- Thank you, Drew, for the idea of learning about one cognitive bias every day, so that we become more aware of our own biases step by step. The Bias of the Day assistant is built on it.
+UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T378717265"] = "Thank you, Drew, for the idea of learning about one cognitive bias every day, so that we become more aware of our own biases step by step. The Bias of the Day assistant is built on it."
+
-- Our Titans
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3805270964"] = "Our Titans"
@@ -12712,6 +12841,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3821668394"] = "Moderation, Desig
-- Thanks, Thibault, for bringing Requesty to AI Studio as a new provider.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3856759487"] = "Thanks, Thibault, for bringing Requesty to AI Studio as a new provider."
+-- Thank you, Lara, for the concept and the content of the BeyondFacts Lab and for the expertise you put into it, so that researchers can prepare for challenging appearances.
+UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3992506100"] = "Thank you, Lara, for the concept and the content of the BeyondFacts Lab and for the expertise you put into it, so that researchers can prepare for challenging appearances."
+
-- Thanks, Nils, for taking the time to learn Rust, for building the foundation for local retrieval, and for assistant plugins and the Assistant Builder.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4042792376"] = "Thanks, Nils, for taking the time to learn Rust, for building the foundation for local retrieval, and for assistant plugins and the Assistant Builder."
@@ -13165,6 +13297,12 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T870850829"
-- Delete disappearing chats older than 30 days
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T937754037"] = "Delete disappearing chats older than 30 days"
+-- Informal address
+UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::ADDRESSFORMEXTENSIONS::T2888141085"] = "Informal address"
+
+-- Formal address
+UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::ADDRESSFORMEXTENSIONS::T3439873254"] = "Formal address"
+
-- This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider.
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T1531417967"] = "This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider."
diff --git a/app/MindWork AI Studio/Components/MSGComponentBase.cs b/app/MindWork AI Studio/Components/MSGComponentBase.cs
index c5209582a..8be0e748f 100644
--- a/app/MindWork AI Studio/Components/MSGComponentBase.cs
+++ b/app/MindWork AI Studio/Components/MSGComponentBase.cs
@@ -45,6 +45,13 @@ public abstract class MSGComponentBase : ComponentBase, IDisposable, IAsyncDispo
#endregion
+ ///
+ /// Gets a text which addresses the reader, in the form of address the person chose; see I18N.AddressForm.
+ ///
+ /// The text in English (US).
+ /// The text from the language plugin or the English text.
+ public string TA(string fallbackEN) => this.GetText(this.Lang, fallbackEN, addressForm: I18N.I.AddressForm);
+
#region Implementation of IMessageBusReceiver
public async Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data)
diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor
index 11bafb0f6..b2a6a3bbd 100644
--- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor
+++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor
@@ -10,8 +10,11 @@
-
-
+ @if (this.offersFormOfAddress)
+ {
+
+ }
+
diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor.cs
index 0b7ccdfa9..f5391feab 100644
--- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor.cs
+++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBeyondFactsLab.razor.cs
@@ -1,4 +1,5 @@
using AIStudio.Provider;
+using AIStudio.Tools.PluginSystem;
namespace AIStudio.Dialogs.Settings;
@@ -7,6 +8,19 @@ namespace AIStudio.Dialogs.Settings;
///
public partial class SettingsDialogBeyondFactsLab : SettingsDialogBase
{
+ ///
+ /// Whether the language of the app tells a formal address from an informal one, so that the form of address
+ /// is a choice at all.
+ ///
+ private bool offersFormOfAddress;
+
+ ///
+ protected override async Task OnInitializedAsync()
+ {
+ await base.OnInitializedAsync();
+ this.offersFormOfAddress = (await this.SettingsManager.GetActiveLanguagePlugin()).HasInformalAddress();
+ }
+
///
/// Shows the minimum confidence which applies, never one below the floor of the lab.
///
diff --git a/app/MindWork AI Studio/Pages/Supporters.razor b/app/MindWork AI Studio/Pages/Supporters.razor
index 6c67c036f..b19b91686 100644
--- a/app/MindWork AI Studio/Pages/Supporters.razor
+++ b/app/MindWork AI Studio/Pages/Supporters.razor
@@ -30,8 +30,9 @@
+ @* Two columns from the breakpoint md on; in a narrower window, the boxes follow each other. *@
-
+
@@ -60,7 +61,7 @@
-
+
@@ -77,8 +78,9 @@
+ @* Two columns from the breakpoint md on; in a narrower window, the boxes follow each other. *@
-
+
@@ -103,7 +105,7 @@
-
+
@@ -114,6 +116,18 @@
+
+
+
+
+ @T("Ideas, Expertise, and Concepts")
+
+
+
+
+
+
+
diff --git a/app/MindWork AI Studio/Plugins/configuration/plugin.lua b/app/MindWork AI Studio/Plugins/configuration/plugin.lua
index f3d9ab926..c6a88aea4 100644
--- a/app/MindWork AI Studio/Plugins/configuration/plugin.lua
+++ b/app/MindWork AI Studio/Plugins/configuration/plugin.lua
@@ -998,6 +998,8 @@ CONFIG["SETTINGS"] = {}
-- CONFIG["SETTINGS"]["DataBeyondFactsLab.MinimumProviderConfidence"] = "MEDIUM"
--
-- Configure how the lab addresses users in languages with a formal and an informal address, such as German.
+-- In a language with one form of address only, such as English, the setting has no effect, and the options
+-- of the lab do not show it.
-- Allowed values are: FORMAL, INFORMAL
-- CONFIG["SETTINGS"]["DataBeyondFactsLab.AddressForm"] = "FORMAL"
diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua
index c14b00b81..3dc9ed913 100644
--- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua
+++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua
@@ -738,6 +738,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BATCHPROCESSING::BATCHPROCESSINGPROMPTSOU
-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190"] = "Bereiten Sie einen herausfordernden Auftritt mit Ihrer Forschung Schritt für Schritt vor, etwa eine Podiumsdiskussion, ein Interview oder eine Anhörung. Jede Vorbereitung gehört zu einer Veranstaltung und hat eigene Schritte, Chats und Arbeitsstände."
+-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190::INFORMAL"] = "Bereite einen herausfordernden Auftritt mit deiner Forschung Schritt für Schritt vor, etwa eine Podiumsdiskussion, ein Interview oder eine Anhörung. Jede Vorbereitung gehört zu einer Veranstaltung und hat eigene Schritte, Chats und Arbeitsstände."
+
-- Changed on {0}
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1279137966"] = "Geändert am {0}"
@@ -750,12 +753,21 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1564342983"] = "AI Studio kann Ihre Angaben zu diesem Schritt nicht öffnen. Die Datei ist möglicherweise beschädigt oder wurde mit einer neueren Version von AI Studio gespeichert. AI Studio lässt die Datei unverändert."
+-- AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1564342983::INFORMAL"] = "AI Studio kann deine Angaben zu diesem Schritt nicht öffnen. Die Datei ist möglicherweise beschädigt oder wurde mit einer neueren Version von AI Studio gespeichert. AI Studio lässt die Datei unverändert."
+
-- You have no preparations yet. Create one for the event you want to prepare for.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1599306665"] = "Sie haben noch keine Vorbereitung. Erstellen Sie eine für die Veranstaltung, auf die Sie sich vorbereiten möchten."
+-- You have no preparations yet. Create one for the event you want to prepare for.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1599306665::INFORMAL"] = "Du hast noch keine Vorbereitung. Erstelle eine für die Veranstaltung, auf die du dich vorbereiten möchtest."
+
-- Enter a new name for this preparation.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T193031277"] = "Geben Sie einen neuen Namen für diese Vorbereitung ein."
+-- Enter a new name for this preparation.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T193031277::INFORMAL"] = "Gib einen neuen Namen für diese Vorbereitung ein."
+
-- Cannot be opened
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1981873292"] = "Kann nicht geöffnet werden"
@@ -765,6 +777,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- Your details
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T25208484"] = "Ihre Angaben"
+-- Your details
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T25208484::INFORMAL"] = "Deine Angaben"
+
-- Create
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2567824509"] = "Erstellen"
@@ -774,6 +789,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- Create a preparation to begin.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2751865753"] = "Erstellen Sie eine Vorbereitung, um zu beginnen."
+-- Create a preparation to begin.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2751865753::INFORMAL"] = "Erstelle eine Vorbereitung, um zu beginnen."
+
-- AI Studio has left the files of this preparation unchanged. A future update may make it accessible again.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2824385338"] = "AI Studio hat die Dateien dieser Vorbereitung unverändert gelassen. Ein zukünftiges Update könnte sie wieder zugänglich machen."
@@ -798,27 +816,45 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- This preparation cannot be opened. Permanently delete it with all of its files?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3647862078"] = "Diese Vorbereitung kann nicht geöffnet werden. Möchten Sie sie mit allen Dateien endgültig löschen?"
+-- This preparation cannot be opened. Permanently delete it with all of its files?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3647862078::INFORMAL"] = "Diese Vorbereitung kann nicht geöffnet werden. Möchtest du sie mit allen Dateien endgültig löschen?"
+
-- Name the event you want to prepare for, e.g., the title of a panel discussion.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3679923414"] = "Geben Sie die Veranstaltung an, auf die Sie sich vorbereiten möchten, z. B. den Titel einer Podiumsdiskussion."
+-- Name the event you want to prepare for, e.g., the title of a panel discussion.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3679923414::INFORMAL"] = "Gib die Veranstaltung an, auf die du dich vorbereiten möchtest, z. B. den Titel einer Podiumsdiskussion."
+
-- Name of the preparation
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3746973353"] = "Name der Vorbereitung"
-- Please enter a name.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3818326829"] = "Bitte geben Sie einen Namen ein."
+-- Please enter a name.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3818326829::INFORMAL"] = "Bitte gib einen Namen ein."
+
-- AI Studio could not save your details. Please try again.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3921500806"] = "AI Studio konnte Ihre Angaben nicht speichern. Bitte versuchen Sie es erneut."
+-- AI Studio could not save your details. Please try again.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3921500806::INFORMAL"] = "AI Studio konnte deine Angaben nicht speichern. Bitte versuche es erneut."
+
-- BeyondFacts Lab
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3956097526"] = "BeyondFacts Lab"
-- A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T395932079"] = "Eine neuere Version von AI Studio hat diese Vorbereitung gespeichert. Diese Version kann sie nicht öffnen. Bitte aktualisieren Sie AI Studio."
+-- A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T395932079::INFORMAL"] = "Eine neuere Version von AI Studio hat diese Vorbereitung gespeichert. Diese Version kann sie nicht öffnen. Bitte aktualisiere AI Studio."
+
-- AI Studio could not save the change of your preparations. Please try again.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T4073131406"] = "AI Studio konnte die Änderung an Ihren Vorbereitungen nicht speichern. Bitte versuchen Sie es erneut."
+-- AI Studio could not save the change of your preparations. Please try again.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T4073131406::INFORMAL"] = "AI Studio konnte die Änderung an deinen Vorbereitungen nicht speichern. Bitte versuche es erneut."
+
-- Requires a newer AI Studio version
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T4087140083"] = "Erfordert eine neuere Version von AI Studio"
@@ -828,17 +864,17 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- Permanently delete the preparation '{0}' with all of its steps, chats, and work states?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T772787118"] = "Die Vorbereitung „{0}“ mit allen Schritten, Chats und Arbeitsständen endgültig löschen?"
+-- Permanently delete the preparation '{0}' with all of its steps, chats, and work states?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T772787118::INFORMAL"] = "Die Vorbereitung „{0}“ mit allen Schritten, Chats und Arbeitsständen endgültig löschen?"
+
-- New preparation
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T851005164"] = "Neue Vorbereitung"
-- Your preparations
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T972511272"] = "Ihre Vorbereitungen"
--- Informal address (du in German)
-UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLADDRESSFORMEXTENSIONS::T554958468"] = "Informelle Anrede (du)"
-
--- Formal address (Sie in German)
-UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLADDRESSFORMEXTENSIONS::T859201973"] = "Formelle Anrede (Sie)"
+-- Your preparations
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T972511272::INFORMAL"] = "Deine Vorbereitungen"
-- Moderate the discussion
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1131866893"] = "Diskussion moderieren"
@@ -849,6 +885,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T113401444
-- What have you changed, kept, or left open compared to your initial position, and why?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1455147822"] = "Was haben Sie gegenüber Ihrer Ausgangsposition verändert, beibehalten oder offengelassen, und weshalb?"
+-- What have you changed, kept, or left open compared to your initial position, and why?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1455147822::INFORMAL"] = "Was hast du gegenüber deiner Ausgangsposition verändert, beibehalten oder offengelassen, und weshalb?"
+
-- Show options for action
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1601690165"] = "Handlungsoptionen aufzeigen"
@@ -864,9 +903,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T177463328
-- Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1885081930"] = "Andere Perspektiven: Wessen Sichtweise möchten Sie besser verstehen oder haben Sie bisher wenig berücksichtigt?"
+-- Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1885081930::INFORMAL"] = "Andere Perspektiven: Wessen Sichtweise möchtest du besser verstehen oder hast du bisher wenig berücksichtigt?"
+
-- Stays in your preparation and never goes into the research on the web
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1949096445"] = "Bleibt in Ihrer Vorbereitung und geht nie in die Recherche im Web ein"
+-- Stays in your preparation and never goes into the research on the web
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1949096445::INFORMAL"] = "Bleibt in deiner Vorbereitung und geht nie in die Recherche im Web ein"
+
-- Very demanding
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1967151608"] = "Sehr anspruchsvoll"
@@ -876,9 +921,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T205473120
-- Notes on how to use your materials
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2123646094"] = "Hinweise zur Nutzung Ihrer Materialien"
+-- Notes on how to use your materials
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2123646094::INFORMAL"] = "Hinweise zur Nutzung deiner Materialien"
+
-- Duration of your contribution
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T223853289"] = "Dauer Ihres Beitrags"
+-- Duration of your contribution
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T223853289::INFORMAL"] = "Dauer deines Beitrags"
+
-- Special notes for the test
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2242825987"] = "Besondere Hinweise für den Test"
@@ -906,6 +957,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T277557865
-- What do you want to achieve with your contribution?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2818219287"] = "Was möchten Sie mit Ihrem Beitrag erreichen?"
+-- What do you want to achieve with your contribution?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2818219287::INFORMAL"] = "Was möchtest du mit deinem Beitrag erreichen?"
+
-- Scientific criticism
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2865565843"] = "Wissenschaftliche Kritik"
@@ -915,9 +969,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T290088321
-- Names and roles, as far as you know them
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3020176946"] = "Namen und Rollen, soweit bekannt"
+-- Names and roles, as far as you know them
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3020176946::INFORMAL"] = "Namen und Rollen, soweit bekannt"
+
-- Personal detail: it goes into exports and shared sessions only when you explicitly choose so.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3063635296"] = "Persönliche Angabe: Exporte und geteilte Sitzungen enthalten sie nur, wenn Sie das ausdrücklich wählen."
+-- Personal detail: it goes into exports and shared sessions only when you explicitly choose so.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3063635296::INFORMAL"] = "Persönliche Angabe: Exporte und geteilte Sitzungen enthalten sie nur, wenn du das ausdrücklich wählst."
+
-- Political instrumentalization
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3078371152"] = "Politische Instrumentalisierung"
@@ -927,6 +987,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T311485634
-- Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3199962614"] = "Persönliche Betroffenheit: Wo berührt Sie das Thema persönlich? Welche Frage oder Kritik könnte bei Ihnen eine starke Reaktion auslösen?"
+-- Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3199962614::INFORMAL"] = "Persönliche Betroffenheit: Wo berührt dich das Thema persönlich? Welche Frage oder Kritik könnte bei dir eine starke Reaktion auslösen?"
+
-- Format of the event
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3217479436"] = "Format der Veranstaltung"
@@ -936,6 +999,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T329702382
-- Values and concerns: What matters most to you about this topic?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3444467007"] = "Werte und Anliegen: Was ist Ihnen bei diesem Thema besonders wichtig?"
+-- Values and concerns: What matters most to you about this topic?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3444467007::INFORMAL"] = "Werte und Anliegen: Was ist dir bei diesem Thema besonders wichtig?"
+
-- Audience
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3506118019"] = "Zielgruppe"
@@ -966,12 +1032,18 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T405255323
-- You can raise the difficulty after each question.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T519332031"] = "Nach jeder Frage können Sie die Schwierigkeit erhöhen."
+-- You can raise the difficulty after each question.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T519332031::INFORMAL"] = "Nach jeder Frage kannst du die Schwierigkeit erhöhen."
+
-- E.g., students, experts, or the general public
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T533097975"] = "Z. B. Studierende, Fachpublikum oder die breite Öffentlichkeit"
-- Short description of your contribution
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T667686615"] = "Kurzbeschreibung Ihres Beitrags"
+-- Short description of your contribution
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T667686615::INFORMAL"] = "Kurzbeschreibung deines Beitrags"
+
-- Type of questions
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T805059831"] = "Art der Fragen"
@@ -993,9 +1065,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T916990010
-- In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T917276711"] = "Ob in eigenen Worten, mit den Vorschlägen unten oder noch ganz offen: Im Chat schärfen Sie gemeinsam mit der KI Ihr Ziel und Ihre Rolle."
+-- In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T917276711::INFORMAL"] = "Ob in eigenen Worten, mit den Vorschlägen unten oder noch ganz offen: Im Chat schärfst du gemeinsam mit der KI dein Ziel und deine Rolle."
+
-- Topic of your contribution or your specific assignment
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T932670647"] = "Thema Ihres Beitrags oder Ihr konkreter Auftrag"
+-- Topic of your contribution or your specific assignment
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T932670647::INFORMAL"] = "Thema deines Beitrags oder dein konkreter Auftrag"
+
-- E.g., aggressive moderation, time pressure, or a particular counterpart
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T965551209"] = "Z. B. aggressive Moderation, Zeitdruck oder ein bestimmtes Gegenüber"
@@ -1008,6 +1086,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T985014450
-- ## Welcome! The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate. Data protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this. Please check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out. This is a prototype, so we look forward to your feedback.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480"] = "## Herzlich willkommen!\n\nIm BeyondFacts Lab werden Sie durch einen geführten, KI-unterstützten Reflexionsprozess geleitet, der Ihnen dabei hilft, sich in herausfordernden Kommunikationssituationen zu positionieren und kommunikationsfähig zu bleiben.\n\nDer Datenschutz hängt vom gewählten KI-Anbieter, dessen Verarbeitungs- und Speicherregeln sowie Ihrer Konfiguration ab. Geben Sie nur Daten ein, die dafür geeignet und freigegeben sind.\n\nBitte prüfen Sie alle Ergebnisse kritisch. Die Antworten können, je nach KI-Modell, unterschiedlich ausfallen. Halluzinationen sind nicht ausgeschlossen.\n\nEs handelt sich um einen Prototyp, daher freuen wir uns über Ihr Feedback."
+-- ## Welcome! The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate. Data protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this. Please check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out. This is a prototype, so we look forward to your feedback.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480::INFORMAL"] = "## Herzlich willkommen!\n\nIm BeyondFacts Lab wirst du durch einen geführten, KI-unterstützten Reflexionsprozess geleitet, der dir dabei hilft, dich in herausfordernden Kommunikationssituationen zu positionieren und kommunikationsfähig zu bleiben.\n\nDer Datenschutz hängt vom gewählten KI-Anbieter, dessen Verarbeitungs- und Speicherregeln sowie deiner Konfiguration ab. Gib nur Daten ein, die dafür geeignet und freigegeben sind.\n\nBitte prüfe alle Ergebnisse kritisch. Die Antworten können, je nach KI-Modell, unterschiedlich ausfallen. Halluzinationen sind nicht ausgeschlossen.\n\nEs handelt sich um einen Prototyp, daher freuen wir uns über dein Feedback."
+
-- I have read the notes
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICEDIALOG::T4071737336"] = "Ich habe die Hinweise gelesen"
@@ -1020,24 +1101,39 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T11478
-- How you convey evidence, trade-offs between values, and open questions.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T1290723890"] = "Wie Sie Evidenz, Wertabwägungen und offene Fragen vermitteln."
+-- How you convey evidence, trade-offs between values, and open questions.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T1290723890::INFORMAL"] = "Wie du Evidenz, Wertabwägungen und offene Fragen vermittelst."
+
-- Event details
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T135387869"] = "Rahmendaten"
-- What the event is about, for whom, and what you were asked to contribute.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T158292580"] = "Worum es bei der Veranstaltung geht, für wen sie gedacht ist und was Sie beitragen sollen."
+-- What the event is about, for whom, and what you were asked to contribute.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T158292580::INFORMAL"] = "Worum es bei der Veranstaltung geht, für wen sie gedacht ist und was du beitragen sollst."
+
-- You can fill in single fields or start right away in the chat.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T2524378548"] = "Sie können einzelne Felder ausfüllen oder direkt im Chat beginnen."
+-- You can fill in single fields or start right away in the chat.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T2524378548::INFORMAL"] = "Du kannst einzelne Felder ausfüllen oder direkt im Chat beginnen."
+
-- Goals and role
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T2988481290"] = "Ziele und Rolle"
-- What matters to you, what touches you, and what moves others.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3022557767"] = "Was Ihnen wichtig ist, was Sie berührt und was andere bewegt."
+-- What matters to you, what touches you, and what moves others.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3022557767::INFORMAL"] = "Was dir wichtig ist, was dich berührt und was andere bewegt."
+
-- What you want to achieve, and in which role you speak.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3052319680"] = "Was Sie erreichen möchten und in welcher Rolle Sie sprechen."
+-- What you want to achieve, and in which role you speak.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3052319680::INFORMAL"] = "Was du erreichen möchtest und in welcher Rolle du sprichst."
+
-- Strategy
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3205650756"] = "Strategie"
@@ -1050,21 +1146,39 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T49457
-- What you take away from your preparation.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T517692701"] = "Was Sie aus Ihrer Vorbereitung mitnehmen."
+-- What you take away from your preparation.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T517692701::INFORMAL"] = "Was du aus deiner Vorbereitung mitnimmst."
+
-- Play through critical questions and opposing positions.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T573043138"] = "Kritische Nachfragen und Gegenpositionen durchspielen."
+-- Play through critical questions and opposing positions.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T573043138::INFORMAL"] = "Kritische Nachfragen und Gegenpositionen durchspielen."
+
-- What you know for sure, what is uncertain, and where your expertise ends.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T762525208"] = "Was Sie sicher wissen, was unsicher ist und wo Ihre Expertise endet."
+-- What you know for sure, what is uncertain, and where your expertise ends.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T762525208::INFORMAL"] = "Was du sicher weißt, was unsicher ist und wo deine Expertise endet."
+
-- Some details are still missing. The chat will ask for them, and you can continue anyway.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T1474406854"] = "Einige Angaben fehlen noch. Der Chat fragt danach, und Sie können trotzdem weitermachen."
+-- Some details are still missing. The chat will ask for them, and you can continue anyway.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T1474406854::INFORMAL"] = "Einige Angaben fehlen noch. Der Chat fragt danach, und du kannst trotzdem weitermachen."
+
-- Please enter an address that begins with https:// or http://.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T2837809367"] = "Bitte geben Sie eine Adresse ein, die mit https:// oder http:// beginnt."
+-- Please enter an address that begins with https:// or http://.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T2837809367::INFORMAL"] = "Bitte gib eine Adresse ein, die mit https:// oder http:// beginnt."
+
-- * The chat works best when you fill in these details.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T3011046288"] = "* Der Chat funktioniert am besten, wenn Sie diese Angaben ausfüllen."
+-- * The chat works best when you fill in these details.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T3011046288::INFORMAL"] = "* Der Chat funktioniert am besten, wenn du diese Angaben ausfüllst."
+
-- Extended bias poster
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T1241605514"] = "Erweitertes Poster der Verzerrungen"
@@ -9924,9 +10038,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBATCHPROCESSING::T82
-- Restore default
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBATCHPROCESSING::T913168756"] = "Standard wiederherstellen"
--- How the lab addresses you in languages with a formal and an informal address, such as German.
-UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T1832497993"] = "Wie das Lab Sie in Sprachen anspricht, die eine formelle und eine informelle Anrede kennen, etwa im Deutschen."
-
-- Assistant: BeyondFacts Lab Options
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T19824556"] = "Assistent: Optionen für das BeyondFacts Lab"
@@ -9936,12 +10047,24 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T218
-- Select a minimum confidence level
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T2579793544"] = "Wählen Sie ein minimales Vertrauensniveau aus"
+-- Select a minimum confidence level
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T2579793544::INFORMAL"] = "Wähle ein minimales Vertrauensniveau aus"
+
-- Close
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T3448155331"] = "Schließen"
+-- Whether the lab addresses you formally or informally.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T3883838251"] = "Ob das Lab Sie siezt oder duzt."
+
+-- Whether the lab addresses you formally or informally.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T3883838251::INFORMAL"] = "Ob das Lab dich siezt oder duzt."
+
-- Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models.
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T4002746484"] = "Ihre Vorbereitungen enthalten meist unveröffentlichte Forschung. Daher akzeptiert das Lab nur Anbieter mit mindestens dem Vertrauensniveau „Mittel“. Sie können diese Untergrenze anheben, etwa um nur selbst gehostete Modelle zu verwenden."
+-- Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T4002746484::INFORMAL"] = "Deine Vorbereitungen enthalten meist unveröffentlichte Forschung. Daher akzeptiert das Lab nur Anbieter mit mindestens dem Vertrauensniveau „Mittel“. Du kannst diese Untergrenze anheben, etwa um nur selbst gehostete Modelle zu verwenden."
+
-- Files are sent as they were first read
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1320692831"] = "Dateien werden so gesendet, wie sie zuerst eingelesen wurden"
@@ -12645,6 +12768,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::SETTINGS::T1258653480"] = "Einstellungen"
-- Data Backup & Restore
UI_TEXT_CONTENT["AISTUDIO::PAGES::SETTINGS::T3317700277"] = "Datensicherung & Wiederherstellung"
+-- Ideas, Expertise, and Concepts
+UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1242911840"] = "Ideen, Fachwissen und Konzepte"
+
-- Thank you very much, Kerstin, for creating the Wiki, for advising us on ERI with real use cases, and for your work on version 2 of the ERI protocol.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1367356224"] = "Vielen herzlichen Dank, Kerstin, für die Erstellung des Wikis, deine Beratung zu ERI anhand realer Anwendungsfälle und deine Arbeit an Version 2 des ERI-Protokolls."
@@ -12705,6 +12831,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3608282312"] = "Danke, Simon, fü
-- Thank you, Richard, for being the first.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3660718138"] = "Vielen Dank, Richard, dass du der Erste warst."
+-- Thank you, Drew, for the idea of learning about one cognitive bias every day, so that we become more aware of our own biases step by step. The Bias of the Day assistant is built on it.
+UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T378717265"] = "Vielen Dank, Drew, für die Idee, jeden Tag eine kognitive Verzerrung kennenzulernen, damit wir uns Schritt für Schritt unserer eigenen Verzerrungen bewusster werden. Darauf baut der Assistent „Vorurteil des Tages“ auf."
+
-- Our Titans
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3805270964"] = "Unsere Titanen"
@@ -12714,6 +12843,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3821668394"] = "Moderation, Desig
-- Thanks, Thibault, for bringing Requesty to AI Studio as a new provider.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3856759487"] = "Danke, Thibault, dass du Requesty als neuen Anbieter in AI Studio integriert hast."
+-- Thank you, Lara, for the concept and the content of the BeyondFacts Lab and for the expertise you put into it, so that researchers can prepare for challenging appearances.
+UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3992506100"] = "Vielen Dank, Lara, für das Konzept und die Inhalte des BeyondFacts Lab und für das Fachwissen, das du eingebracht hast, damit sich Forschende auf herausfordernde Auftritte vorbereiten können."
+
-- Thanks, Nils, for taking the time to learn Rust, for building the foundation for local retrieval, and for assistant plugins and the Assistant Builder.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4042792376"] = "Danke, Nils, dass du dir die Zeit genommen hast, Rust zu lernen, die Grundlage für die lokale Suche zu schaffen und Assistenten-Plugins sowie den Assistenten-Builder zu entwickeln."
@@ -13167,6 +13299,12 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T870850829"
-- Delete disappearing chats older than 30 days
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T937754037"] = "Selbstlöschende Chats: Chats löschen, die älter als 30 Tage sind"
+-- Informal address
+UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::ADDRESSFORMEXTENSIONS::T2888141085"] = "Informelle Anrede (du)"
+
+-- Formal address
+UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::ADDRESSFORMEXTENSIONS::T3439873254"] = "Formelle Anrede (Sie)"
+
-- This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider.
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T1531417967"] = "Diese Datenquelle kann mit jedem LLM-Anbieter verwendet werden. Ihre Daten können an einen cloudbasierten Anbieter gesendet werden."
diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua
index 506decfd1..0d2c56d43 100644
--- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua
+++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua
@@ -738,6 +738,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BATCHPROCESSING::BATCHPROCESSINGPROMPTSOU
-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190"] = "Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states."
+-- Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1218290190::INFORMAL"] = "Prepare a challenging appearance as a researcher step by step, e.g., a panel discussion, an interview, or a hearing. Each preparation belongs to one event and has its own steps, chats, and work states."
+
-- Changed on {0}
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1279137966"] = "Changed on {0}"
@@ -750,12 +753,21 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1564342983"] = "AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged."
+-- AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1564342983::INFORMAL"] = "AI Studio cannot open your details for this step. Their file may be damaged, or a newer version of AI Studio stored it. AI Studio leaves the file unchanged."
+
-- You have no preparations yet. Create one for the event you want to prepare for.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1599306665"] = "You have no preparations yet. Create one for the event you want to prepare for."
+-- You have no preparations yet. Create one for the event you want to prepare for.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1599306665::INFORMAL"] = "You have no preparations yet. Create one for the event you want to prepare for."
+
-- Enter a new name for this preparation.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T193031277"] = "Enter a new name for this preparation."
+-- Enter a new name for this preparation.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T193031277::INFORMAL"] = "Enter a new name for this preparation."
+
-- Cannot be opened
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T1981873292"] = "Cannot be opened"
@@ -765,6 +777,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- Your details
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T25208484"] = "Your details"
+-- Your details
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T25208484::INFORMAL"] = "Your details"
+
-- Create
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2567824509"] = "Create"
@@ -774,6 +789,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- Create a preparation to begin.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2751865753"] = "Create a preparation to begin."
+-- Create a preparation to begin.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2751865753::INFORMAL"] = "Create a preparation to begin."
+
-- AI Studio has left the files of this preparation unchanged. A future update may make it accessible again.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T2824385338"] = "AI Studio has left the files of this preparation unchanged. A future update may make it accessible again."
@@ -798,27 +816,45 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- This preparation cannot be opened. Permanently delete it with all of its files?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3647862078"] = "This preparation cannot be opened. Permanently delete it with all of its files?"
+-- This preparation cannot be opened. Permanently delete it with all of its files?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3647862078::INFORMAL"] = "This preparation cannot be opened. Permanently delete it with all of its files?"
+
-- Name the event you want to prepare for, e.g., the title of a panel discussion.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3679923414"] = "Name the event you want to prepare for, e.g., the title of a panel discussion."
+-- Name the event you want to prepare for, e.g., the title of a panel discussion.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3679923414::INFORMAL"] = "Name the event you want to prepare for, e.g., the title of a panel discussion."
+
-- Name of the preparation
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3746973353"] = "Name of the preparation"
-- Please enter a name.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3818326829"] = "Please enter a name."
+-- Please enter a name.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3818326829::INFORMAL"] = "Please enter a name."
+
-- AI Studio could not save your details. Please try again.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3921500806"] = "AI Studio could not save your details. Please try again."
+-- AI Studio could not save your details. Please try again.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3921500806::INFORMAL"] = "AI Studio could not save your details. Please try again."
+
-- BeyondFacts Lab
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T3956097526"] = "BeyondFacts Lab"
-- A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T395932079"] = "A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio."
+-- A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T395932079::INFORMAL"] = "A newer version of AI Studio stored this preparation. This version cannot open it. Please update AI Studio."
+
-- AI Studio could not save the change of your preparations. Please try again.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T4073131406"] = "AI Studio could not save the change of your preparations. Please try again."
+-- AI Studio could not save the change of your preparations. Please try again.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T4073131406::INFORMAL"] = "AI Studio could not save the change of your preparations. Please try again."
+
-- Requires a newer AI Studio version
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T4087140083"] = "Requires a newer AI Studio version"
@@ -828,17 +864,17 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::
-- Permanently delete the preparation '{0}' with all of its steps, chats, and work states?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T772787118"] = "Permanently delete the preparation '{0}' with all of its steps, chats, and work states?"
+-- Permanently delete the preparation '{0}' with all of its steps, chats, and work states?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T772787118::INFORMAL"] = "Permanently delete the preparation '{0}' with all of its steps, chats, and work states?"
+
-- New preparation
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T851005164"] = "New preparation"
-- Your preparations
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T972511272"] = "Your preparations"
--- Informal address (du in German)
-UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLADDRESSFORMEXTENSIONS::T554958468"] = "Informal address (du in German)"
-
--- Formal address (Sie in German)
-UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLADDRESSFORMEXTENSIONS::T859201973"] = "Formal address (Sie in German)"
+-- Your preparations
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BEYONDFACTSLABASSISTANT::T972511272::INFORMAL"] = "Your preparations"
-- Moderate the discussion
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1131866893"] = "Moderate the discussion"
@@ -849,6 +885,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T113401444
-- What have you changed, kept, or left open compared to your initial position, and why?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1455147822"] = "What have you changed, kept, or left open compared to your initial position, and why?"
+-- What have you changed, kept, or left open compared to your initial position, and why?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1455147822::INFORMAL"] = "What have you changed, kept, or left open compared to your initial position, and why?"
+
-- Show options for action
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1601690165"] = "Show options for action"
@@ -864,9 +903,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T177463328
-- Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1885081930"] = "Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?"
+-- Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1885081930::INFORMAL"] = "Other perspectives: Whose point of view would you like to understand better, or have you hardly considered so far?"
+
-- Stays in your preparation and never goes into the research on the web
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1949096445"] = "Stays in your preparation and never goes into the research on the web"
+-- Stays in your preparation and never goes into the research on the web
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1949096445::INFORMAL"] = "Stays in your preparation and never goes into the research on the web"
+
-- Very demanding
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T1967151608"] = "Very demanding"
@@ -876,9 +921,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T205473120
-- Notes on how to use your materials
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2123646094"] = "Notes on how to use your materials"
+-- Notes on how to use your materials
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2123646094::INFORMAL"] = "Notes on how to use your materials"
+
-- Duration of your contribution
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T223853289"] = "Duration of your contribution"
+-- Duration of your contribution
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T223853289::INFORMAL"] = "Duration of your contribution"
+
-- Special notes for the test
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2242825987"] = "Special notes for the test"
@@ -906,6 +957,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T277557865
-- What do you want to achieve with your contribution?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2818219287"] = "What do you want to achieve with your contribution?"
+-- What do you want to achieve with your contribution?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2818219287::INFORMAL"] = "What do you want to achieve with your contribution?"
+
-- Scientific criticism
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T2865565843"] = "Scientific criticism"
@@ -915,9 +969,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T290088321
-- Names and roles, as far as you know them
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3020176946"] = "Names and roles, as far as you know them"
+-- Names and roles, as far as you know them
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3020176946::INFORMAL"] = "Names and roles, as far as you know them"
+
-- Personal detail: it goes into exports and shared sessions only when you explicitly choose so.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3063635296"] = "Personal detail: it goes into exports and shared sessions only when you explicitly choose so."
+-- Personal detail: it goes into exports and shared sessions only when you explicitly choose so.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3063635296::INFORMAL"] = "Personal detail: it goes into exports and shared sessions only when you explicitly choose so."
+
-- Political instrumentalization
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3078371152"] = "Political instrumentalization"
@@ -927,6 +987,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T311485634
-- Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3199962614"] = "Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?"
+-- Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3199962614::INFORMAL"] = "Personal involvement: Where does the topic touch you personally? Which question or criticism could trigger a strong reaction?"
+
-- Format of the event
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3217479436"] = "Format of the event"
@@ -936,6 +999,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T329702382
-- Values and concerns: What matters most to you about this topic?
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3444467007"] = "Values and concerns: What matters most to you about this topic?"
+-- Values and concerns: What matters most to you about this topic?
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3444467007::INFORMAL"] = "Values and concerns: What matters most to you about this topic?"
+
-- Audience
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T3506118019"] = "Audience"
@@ -966,12 +1032,18 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T405255323
-- You can raise the difficulty after each question.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T519332031"] = "You can raise the difficulty after each question."
+-- You can raise the difficulty after each question.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T519332031::INFORMAL"] = "You can raise the difficulty after each question."
+
-- E.g., students, experts, or the general public
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T533097975"] = "E.g., students, experts, or the general public"
-- Short description of your contribution
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T667686615"] = "Short description of your contribution"
+-- Short description of your contribution
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T667686615::INFORMAL"] = "Short description of your contribution"
+
-- Type of questions
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T805059831"] = "Type of questions"
@@ -993,9 +1065,15 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T916990010
-- In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T917276711"] = "In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you."
+-- In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T917276711::INFORMAL"] = "In your own words, with the suggestions below, or still open: the chat sharpens your goal and role with you."
+
-- Topic of your contribution or your specific assignment
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T932670647"] = "Topic of your contribution or your specific assignment"
+-- Topic of your contribution or your specific assignment
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T932670647::INFORMAL"] = "Topic of your contribution or your specific assignment"
+
-- E.g., aggressive moderation, time pressure, or a particular counterpart
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T965551209"] = "E.g., aggressive moderation, time pressure, or a particular counterpart"
@@ -1008,6 +1086,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLFIELDTEXTS::T985014450
-- ## Welcome! The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate. Data protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this. Please check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out. This is a prototype, so we look forward to your feedback.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480"] = "## Welcome!\n\nThe BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate.\n\nData protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this.\n\nPlease check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out.\n\nThis is a prototype, so we look forward to your feedback."
+-- ## Welcome! The BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate. Data protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this. Please check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out. This is a prototype, so we look forward to your feedback.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICE::T940905480::INFORMAL"] = "## Welcome!\n\nThe BeyondFacts Lab guides you through an AI-supported process of reflection, which helps you take a position in challenging communication situations and stay able to communicate.\n\nData protection depends on the AI provider you choose, its rules for processing and storing data, and your configuration. Enter only data that are suitable and approved for this.\n\nPlease check all results critically. Depending on the AI model, the answers may differ. Hallucinations cannot be ruled out.\n\nThis is a prototype, so we look forward to your feedback."
+
-- I have read the notes
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLNOTICEDIALOG::T4071737336"] = "I have read the notes"
@@ -1020,24 +1101,39 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T11478
-- How you convey evidence, trade-offs between values, and open questions.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T1290723890"] = "How you convey evidence, trade-offs between values, and open questions."
+-- How you convey evidence, trade-offs between values, and open questions.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T1290723890::INFORMAL"] = "How you convey evidence, trade-offs between values, and open questions."
+
-- Event details
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T135387869"] = "Event details"
-- What the event is about, for whom, and what you were asked to contribute.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T158292580"] = "What the event is about, for whom, and what you were asked to contribute."
+-- What the event is about, for whom, and what you were asked to contribute.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T158292580::INFORMAL"] = "What the event is about, for whom, and what you were asked to contribute."
+
-- You can fill in single fields or start right away in the chat.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T2524378548"] = "You can fill in single fields or start right away in the chat."
+-- You can fill in single fields or start right away in the chat.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T2524378548::INFORMAL"] = "You can fill in single fields or start right away in the chat."
+
-- Goals and role
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T2988481290"] = "Goals and role"
-- What matters to you, what touches you, and what moves others.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3022557767"] = "What matters to you, what touches you, and what moves others."
+-- What matters to you, what touches you, and what moves others.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3022557767::INFORMAL"] = "What matters to you, what touches you, and what moves others."
+
-- What you want to achieve, and in which role you speak.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3052319680"] = "What you want to achieve, and in which role you speak."
+-- What you want to achieve, and in which role you speak.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3052319680::INFORMAL"] = "What you want to achieve, and in which role you speak."
+
-- Strategy
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T3205650756"] = "Strategy"
@@ -1050,21 +1146,39 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T49457
-- What you take away from your preparation.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T517692701"] = "What you take away from your preparation."
+-- What you take away from your preparation.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T517692701::INFORMAL"] = "What you take away from your preparation."
+
-- Play through critical questions and opposing positions.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T573043138"] = "Play through critical questions and opposing positions."
+-- Play through critical questions and opposing positions.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T573043138::INFORMAL"] = "Play through critical questions and opposing positions."
+
-- What you know for sure, what is uncertain, and where your expertise ends.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T762525208"] = "What you know for sure, what is uncertain, and where your expertise ends."
+-- What you know for sure, what is uncertain, and where your expertise ends.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPEXTENSIONS::T762525208::INFORMAL"] = "What you know for sure, what is uncertain, and where your expertise ends."
+
-- Some details are still missing. The chat will ask for them, and you can continue anyway.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T1474406854"] = "Some details are still missing. The chat will ask for them, and you can continue anyway."
+-- Some details are still missing. The chat will ask for them, and you can continue anyway.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T1474406854::INFORMAL"] = "Some details are still missing. The chat will ask for them, and you can continue anyway."
+
-- Please enter an address that begins with https:// or http://.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T2837809367"] = "Please enter an address that begins with https:// or http://."
+-- Please enter an address that begins with https:// or http://.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T2837809367::INFORMAL"] = "Please enter an address that begins with https:// or http://."
+
-- * The chat works best when you fill in these details.
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T3011046288"] = "* The chat works best when you fill in these details."
+-- * The chat works best when you fill in these details.
+UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BEYONDFACTSLAB::BFLSTEPFORM::T3011046288::INFORMAL"] = "* The chat works best when you fill in these details."
+
-- Extended bias poster
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T1241605514"] = "Extended bias poster"
@@ -9924,9 +10038,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBATCHPROCESSING::T82
-- Restore default
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBATCHPROCESSING::T913168756"] = "Restore default"
--- How the lab addresses you in languages with a formal and an informal address, such as German.
-UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T1832497993"] = "How the lab addresses you in languages with a formal and an informal address, such as German."
-
-- Assistant: BeyondFacts Lab Options
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T19824556"] = "Assistant: BeyondFacts Lab Options"
@@ -9936,12 +10047,24 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T218
-- Select a minimum confidence level
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T2579793544"] = "Select a minimum confidence level"
+-- Select a minimum confidence level
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T2579793544::INFORMAL"] = "Select a minimum confidence level"
+
-- Close
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T3448155331"] = "Close"
+-- Whether the lab addresses you formally or informally.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T3883838251"] = "Whether the lab addresses you formally or informally."
+
+-- Whether the lab addresses you formally or informally.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T3883838251::INFORMAL"] = "Whether the lab addresses you formally or informally."
+
-- Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models.
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T4002746484"] = "Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models."
+-- Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGBEYONDFACTSLAB::T4002746484::INFORMAL"] = "Your preparations usually contain unpublished research. Therefore, the lab accepts only providers with at least medium confidence. You can raise this minimum, e.g., to use only self-hosted models."
+
-- Files are sent as they were first read
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1320692831"] = "Files are sent as they were first read"
@@ -12645,6 +12768,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::SETTINGS::T1258653480"] = "Settings"
-- Data Backup & Restore
UI_TEXT_CONTENT["AISTUDIO::PAGES::SETTINGS::T3317700277"] = "Data Backup & Restore"
+-- Ideas, Expertise, and Concepts
+UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1242911840"] = "Ideas, Expertise, and Concepts"
+
-- Thank you very much, Kerstin, for creating the Wiki, for advising us on ERI with real use cases, and for your work on version 2 of the ERI protocol.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1367356224"] = "Thank you very much, Kerstin, for creating the Wiki, for advising us on ERI with real use cases, and for your work on version 2 of the ERI protocol."
@@ -12705,6 +12831,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3608282312"] = "Thanks, Simon, fo
-- Thank you, Richard, for being the first.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3660718138"] = "Thank you, Richard, for being the first."
+-- Thank you, Drew, for the idea of learning about one cognitive bias every day, so that we become more aware of our own biases step by step. The Bias of the Day assistant is built on it.
+UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T378717265"] = "Thank you, Drew, for the idea of learning about one cognitive bias every day, so that we become more aware of our own biases step by step. The Bias of the Day assistant is built on it."
+
-- Our Titans
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3805270964"] = "Our Titans"
@@ -12714,6 +12843,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3821668394"] = "Moderation, Desig
-- Thanks, Thibault, for bringing Requesty to AI Studio as a new provider.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3856759487"] = "Thanks, Thibault, for bringing Requesty to AI Studio as a new provider."
+-- Thank you, Lara, for the concept and the content of the BeyondFacts Lab and for the expertise you put into it, so that researchers can prepare for challenging appearances.
+UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3992506100"] = "Thank you, Lara, for the concept and the content of the BeyondFacts Lab and for the expertise you put into it, so that researchers can prepare for challenging appearances."
+
-- Thanks, Nils, for taking the time to learn Rust, for building the foundation for local retrieval, and for assistant plugins and the Assistant Builder.
UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4042792376"] = "Thanks, Nils, for taking the time to learn Rust, for building the foundation for local retrieval, and for assistant plugins and the Assistant Builder."
@@ -13167,6 +13299,12 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T870850829"
-- Delete disappearing chats older than 30 days
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T937754037"] = "Disappearing chats: delete chats older than 30 days"
+-- Informal address
+UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::ADDRESSFORMEXTENSIONS::T2888141085"] = "Informal address"
+
+-- Formal address
+UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::ADDRESSFORMEXTENSIONS::T3439873254"] = "Formal address"
+
-- This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider.
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T1531417967"] = "This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider."
diff --git a/app/MindWork AI Studio/Program.cs b/app/MindWork AI Studio/Program.cs
index c95852ea7..3a8f3482e 100644
--- a/app/MindWork AI Studio/Program.cs
+++ b/app/MindWork AI Studio/Program.cs
@@ -350,7 +350,12 @@ internal sealed class Program
// Store the service provider (DI). We need it later for some classes,
// which are not part of the request pipeline:
SERVICE_PROVIDER = app.Services;
-
+
+ // The texts of TA() address the person as the BeyondFacts Lab is set to, since only the lab has such texts
+ // so far. Once the app gets a setting of its own for the form of address, that setting takes over here:
+ var settingsForTexts = app.Services.GetRequiredService();
+ I18N.UseAddressFormOf(() => settingsForTexts.ConfigurationData.BeyondFactsLab.AddressForm);
+
// Initialize the encryption service:
programLogger.LogInformation("Initializing the encryption service.");
var encryptionLogger = app.Services.GetRequiredService>();
diff --git a/app/MindWork AI Studio/Settings/ConfigurationSelectDataFactory.cs b/app/MindWork AI Studio/Settings/ConfigurationSelectDataFactory.cs
index 142ad69c6..0d4364dd4 100644
--- a/app/MindWork AI Studio/Settings/ConfigurationSelectDataFactory.cs
+++ b/app/MindWork AI Studio/Settings/ConfigurationSelectDataFactory.cs
@@ -1,5 +1,4 @@
using AIStudio.Assistants.Agenda;
-using AIStudio.Assistants.BeyondFactsLab;
using AIStudio.Assistants.Coding;
using AIStudio.Assistants.IconFinder;
using AIStudio.Assistants.RewriteImprove;
@@ -331,9 +330,9 @@ public static class ConfigurationSelectDataFactory
yield return new(level.Name, level);
}
- public static IEnumerable> GetBeyondFactsLabAddressFormData()
+ public static IEnumerable> GetBeyondFactsLabAddressFormData()
{
- foreach (var addressForm in Enum.GetValues())
+ foreach (var addressForm in Enum.GetValues())
yield return new(addressForm.Name, addressForm);
}
diff --git a/app/MindWork AI Studio/Settings/DataModel/AddressForm.cs b/app/MindWork AI Studio/Settings/DataModel/AddressForm.cs
new file mode 100644
index 000000000..10f439743
--- /dev/null
+++ b/app/MindWork AI Studio/Settings/DataModel/AddressForm.cs
@@ -0,0 +1,22 @@
+namespace AIStudio.Settings.DataModel;
+
+///
+/// How a text addresses the person in languages which tell a formal address from an informal one, such as German,
+/// French, or Spanish.
+///
+///
+/// Only texts of TA() have both forms; see I18N.AddressForm.
+///
+public enum AddressForm
+{
+ ///
+ /// The formal address, such as "Sie" in German, "vous" in French, or "usted" in Spanish. All texts of AI Studio
+ /// use it, unless the person chose otherwise.
+ ///
+ FORMAL,
+
+ ///
+ /// The informal address, such as "du" in German, "tu" in French, or "tú" in Spanish.
+ ///
+ INFORMAL,
+}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Settings/DataModel/AddressFormExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/AddressFormExtensions.cs
new file mode 100644
index 000000000..7fec92dbc
--- /dev/null
+++ b/app/MindWork AI Studio/Settings/DataModel/AddressFormExtensions.cs
@@ -0,0 +1,27 @@
+using AIStudio.Tools.PluginSystem;
+
+namespace AIStudio.Settings.DataModel;
+
+public static class AddressFormExtensions
+{
+ private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(AddressFormExtensions).Namespace, nameof(AddressFormExtensions));
+
+ /// The form of address.
+ extension(AddressForm addressForm)
+ {
+ ///
+ /// Gets the name of the form of address, as the settings show it.
+ ///
+ ///
+ /// The settings offer the choice only in languages which have both forms, so the translations name the
+ /// pronoun of their language, such as "Sie" and "du" in German.
+ ///
+ public string Name => addressForm switch
+ {
+ AddressForm.FORMAL => TB("Formal address"),
+ AddressForm.INFORMAL => TB("Informal address"),
+
+ _ => TB("Formal address"),
+ };
+ }
+}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Settings/DataModel/DataBeyondFactsLab.cs b/app/MindWork AI Studio/Settings/DataModel/DataBeyondFactsLab.cs
index 3adb9491c..be03dadaf 100644
--- a/app/MindWork AI Studio/Settings/DataModel/DataBeyondFactsLab.cs
+++ b/app/MindWork AI Studio/Settings/DataModel/DataBeyondFactsLab.cs
@@ -1,6 +1,5 @@
using System.Linq.Expressions;
-using AIStudio.Assistants.BeyondFactsLab;
using AIStudio.Provider;
namespace AIStudio.Settings.DataModel;
@@ -44,7 +43,7 @@ public sealed class DataBeyondFactsLab(Expression
///
/// Gets or sets how the lab addresses the person in languages with a formal and an informal address.
///
- public BflAddressForm AddressForm { get; set; } = ManagedConfiguration.Register(configSelection, value => value.AddressForm, BflAddressForm.FORMAL);
+ public AddressForm AddressForm { get; set; } = ManagedConfiguration.Register(configSelection, value => value.AddressForm, AddressForm.FORMAL);
///
/// Gets or sets the hash of the notes the person confirmed, see BflNotice; empty while they confirmed none.
diff --git a/app/MindWork AI Studio/Tools/PluginSystem/I18N.cs b/app/MindWork AI Studio/Tools/PluginSystem/I18N.cs
index cb1131490..497748455 100644
--- a/app/MindWork AI Studio/Tools/PluginSystem/I18N.cs
+++ b/app/MindWork AI Studio/Tools/PluginSystem/I18N.cs
@@ -1,5 +1,7 @@
using System.Globalization;
+using AIStudio.Settings.DataModel;
+
namespace AIStudio.Tools.PluginSystem;
public class I18N : ILang
@@ -28,12 +30,51 @@ public class I18N : ILang
///
public CultureInfo Culture { get; private set; } = CultureInfo.InvariantCulture;
+ ///
+ /// Asks where the form of address comes from, see AddressForm.
+ ///
+ private Func addressFormSource = () => AddressForm.FORMAL;
+
+ ///
+ /// How the texts of TA() address the person, in languages which tell a formal address from an informal one.
+ ///
+ ///
+ /// Like the language, it holds for every text, so that a static class, such as one with the labels of an enum,
+ /// addresses the person the same way as a component does. Only texts of TA() have an informal variant; all
+ /// other texts stay formal. Program.cs decides where the choice comes from, see UseAddressFormOf.
+ ///
+ public AddressForm AddressForm => this.addressFormSource();
+
public static void Init(ILanguagePlugin language)
{
I.language = language;
I.Culture = CommonTools.DeriveActiveCultureOrInvariant(language.IETFTag);
}
+ ///
+ /// Sets where the form of address comes from.
+ ///
+ ///
+ /// The source is asked for every text, so a changed setting shows as soon as a component renders again.
+ ///
+ /// Gets the form of address the person chose.
+ public static void UseAddressFormOf(Func source) => I.addressFormSource = source;
+
+ ///
+ /// Gets a text which addresses the reader, in the form of address the person chose; see AddressForm.
+ ///
+ /// The text in English (US).
+ /// The namespace of the type requesting the text, used as part of the key.
+ /// The name of the type requesting the text, used as part of the key.
+ /// The text from the language plugin or the English text.
+ public string TA(string fallbackEN, string? typeNamespace, string? typeName)
+ {
+ if(this.language is not null)
+ return this.GetText(this.language, fallbackEN, typeNamespace, typeName, this.AddressForm);
+
+ return fallbackEN;
+ }
+
#region Implementation of ILang
public string T(string fallbackEN)
diff --git a/app/MindWork AI Studio/Tools/PluginSystem/ILangExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/ILangExtensions.cs
index c8537dfec..c1e1ae7fc 100644
--- a/app/MindWork AI Studio/Tools/PluginSystem/ILangExtensions.cs
+++ b/app/MindWork AI Studio/Tools/PluginSystem/ILangExtensions.cs
@@ -1,3 +1,5 @@
+using AIStudio.Settings.DataModel;
+
using SharedTools;
namespace AIStudio.Tools.PluginSystem;
@@ -5,30 +7,47 @@ namespace AIStudio.Tools.PluginSystem;
public static class ILangExtensions
{
private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger();
-
+
extension(ILang lang)
{
- public string GetText(ILanguagePlugin plugin, string fallbackEN, string? typeNamespace = null, string? typeName = null)
+ ///
+ /// Gets a text from a language plugin.
+ ///
+ ///
+ /// A text of TA() asks for the form of address the person chose. Its informal variant counts only when the
+ /// language in use has it: the base language would answer with English, while the formal variant of the
+ /// language in use is the better fallback. Missing both, the text stays English.
+ ///
+ /// The language plugin in use.
+ /// The text in English (US), which also makes its key.
+ /// The namespace of the type requesting the text, or null for the type of the receiver.
+ /// The name of the type requesting the text, or null for the type of the receiver.
+ /// How the text addresses the reader; only texts of TA() have an informal variant.
+ /// The text in the language of the plugin, or the English text.
+ public string GetText(ILanguagePlugin plugin, string fallbackEN, string? typeNamespace = null, string? typeName = null, AddressForm addressForm = AddressForm.FORMAL)
{
var type = lang.GetType();
typeName ??= type.Name;
typeNamespace ??= type.Namespace!;
-
+
// When the type's name ends with `1 or `2, etc. (i.e., generic classes), remove it:
if(typeName.Contains('`'))
typeName = typeName[..typeName.IndexOf('`')];
-
+
var ns = $"{typeNamespace}::{typeName}".ToUpperInvariant().Replace(".", "::");
var key = $"root::{ns}::T{I18NKeyHash.Of(fallbackEN)}";
-
+
if(plugin is NoPluginLanguage)
return fallbackEN;
-
+
+ if(addressForm is AddressForm.INFORMAL && plugin.Content.TryGetValue(I18NAddressVariant.InformalKeyOf(key), out var informalText) && !string.IsNullOrWhiteSpace(informalText))
+ return informalText;
+
if(plugin.TryGetText(key, out var text, logWarning: false))
{
if(string.IsNullOrWhiteSpace(text))
return fallbackEN;
-
+
return text;
}
diff --git a/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePluginExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePluginExtensions.cs
new file mode 100644
index 000000000..4e4003621
--- /dev/null
+++ b/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePluginExtensions.cs
@@ -0,0 +1,33 @@
+using SharedTools;
+
+namespace AIStudio.Tools.PluginSystem;
+
+public static class ILanguagePluginExtensions
+{
+ /// The language plugin.
+ extension(ILanguagePlugin plugin)
+ {
+ ///
+ /// Checks whether the language tells a formal address from an informal one, so that a choice between both
+ /// makes sense.
+ ///
+ ///
+ /// The plugin decides by its texts, not by a list of languages: it needs an informal variant of a text of
+ /// TA() which reads differently than the formal one. English addresses everybody alike, so its plugin holds
+ /// the informal variants in the same words. A language translated before it got informal variants offers
+ /// no choice either, since it would change nothing.
+ ///
+ /// True, when at least one informal variant differs from its formal one.
+ public bool HasInformalAddress()
+ {
+ var content = plugin.Content;
+ foreach (var (key, text) in content)
+ {
+ if (I18NAddressVariant.TryGetFormalKey(key, out var formalKey) && content.TryGetValue(formalKey, out var formalText) && !string.Equals(text, formalText, StringComparison.Ordinal))
+ return true;
+ }
+
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/SharedTools/I18NAddressVariant.cs b/app/SharedTools/I18NAddressVariant.cs
new file mode 100644
index 000000000..e184d9f3c
--- /dev/null
+++ b/app/SharedTools/I18NAddressVariant.cs
@@ -0,0 +1,43 @@
+namespace SharedTools;
+
+///
+/// Names the keys of the two variants of a text with TA(), which addresses the reader.
+///
+///
+/// Many languages tell a formal address from an informal one, such as "Sie" and "du" in German. A text with TA()
+/// therefore has two keys: its usual key, whose translation addresses the reader formally like all texts of the
+/// app, and the same key with INFORMAL_SUFFIX, whose translation addresses the reader informally. The I18N
+/// collector writes both keys, and the app looks up the informal one when the person wants to be addressed so.
+///
+public static class I18NAddressVariant
+{
+ ///
+ /// The end of the key of the variant with the informal address.
+ ///
+ public const string INFORMAL_SUFFIX = "::INFORMAL";
+
+ ///
+ /// Gets the key of the variant with the informal address.
+ ///
+ /// The usual key of the text, which stands for the formal address.
+ /// The key of the informal variant.
+ public static string InformalKeyOf(string key) => $"{key}{INFORMAL_SUFFIX}";
+
+ ///
+ /// Tries to get the usual key of a text from the key of its informal variant.
+ ///
+ /// Any key.
+ /// The usual key of the text, or the given key when it belongs to no informal variant.
+ /// True, when the given key belongs to an informal variant.
+ public static bool TryGetFormalKey(string key, out string formalKey)
+ {
+ if (key.EndsWith(INFORMAL_SUFFIX, StringComparison.Ordinal))
+ {
+ formalKey = key[..^INFORMAL_SUFFIX.Length];
+ return true;
+ }
+
+ formalKey = key;
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/app/SharedTools/I18NSourceScanner.cs b/app/SharedTools/I18NSourceScanner.cs
index 547b9866a..5bd2422c1 100644
--- a/app/SharedTools/I18NSourceScanner.cs
+++ b/app/SharedTools/I18NSourceScanner.cs
@@ -1,15 +1,18 @@
namespace SharedTools;
///
-/// Finds the texts of T() and TB() in a C# or Razor source file.
+/// Finds the texts of T(), TB(), and TA() in a C# or Razor source file.
///
///
/// A text counts when its literal follows the opening parenthesis right away and is the whole first argument.
-/// Every kind of literal works, also a raw literal over several lines; see CSharpStringLiteral.
+/// Every kind of literal works, also a raw literal over several lines; see CSharpStringLiteral. A text of TA()
+/// addresses the reader, so it gets a variant with the informal address; see I18NAddressVariant.
///
public static class I18NSourceScanner
{
- private static readonly string[] START_TAGS = ["TB(", "T("];
+ private const string ADDRESSED_TEXT_TAG = "TA(";
+
+ private static readonly string[] START_TAGS = ["TB(", ADDRESSED_TEXT_TAG, "T("];
///
/// Finds the texts in the content of a source file.
@@ -22,7 +25,7 @@ public static class I18NSourceScanner
{
var texts = new List();
var position = 0;
- while (TryFindNextCall(content, position, out var literalStart))
+ while (TryFindNextCall(content, position, out var literalStart, out var tag))
{
position = literalStart;
var rest = content.AsSpan(literalStart);
@@ -49,29 +52,30 @@ public static class I18NSourceScanner
continue;
}
- texts.Add(new I18NSourceText(literalStart, length, text));
+ texts.Add(new I18NSourceText(literalStart, length, text, tag == ADDRESSED_TEXT_TAG));
}
return texts;
}
///
- /// Finds the next call of T() or TB() at or after the position, i.e., a start tag which no identifier precedes.
+ /// Finds the next call of T(), TB(), or TA() at or after the position, i.e., a start tag which no identifier precedes.
///
- private static bool TryFindNextCall(string content, int position, out int argumentStart)
+ private static bool TryFindNextCall(string content, int position, out int argumentStart, out string foundTag)
{
argumentStart = -1;
+ foundTag = string.Empty;
while (position < content.Length)
{
var bestIndex = -1;
- var bestLength = 0;
+ var bestTag = string.Empty;
foreach (var tag in START_TAGS)
{
var index = content.IndexOf(tag, position, StringComparison.Ordinal);
if (index >= 0 && (bestIndex < 0 || index < bestIndex))
{
bestIndex = index;
- bestLength = tag.Length;
+ bestTag = tag;
}
}
@@ -84,7 +88,8 @@ public static class I18NSourceScanner
continue;
}
- argumentStart = bestIndex + bestLength;
+ argumentStart = bestIndex + bestTag.Length;
+ foundTag = bestTag;
return true;
}
diff --git a/app/SharedTools/I18NSourceText.cs b/app/SharedTools/I18NSourceText.cs
index 53fac0d19..142fe70f0 100644
--- a/app/SharedTools/I18NSourceText.cs
+++ b/app/SharedTools/I18NSourceText.cs
@@ -1,9 +1,10 @@
namespace SharedTools;
///
-/// A text of T() or TB() which the I18N collector found in a source file.
+/// A text of T(), TB(), or TA() which the I18N collector found in a source file.
///
/// Where its literal starts in the file.
/// How many characters its literal takes in the file.
/// The string the compiler makes of the literal.
-public sealed record I18NSourceText(int Offset, int Length, string Text);
\ No newline at end of file
+/// Whether the text comes from TA(), i.e., addresses the reader and gets a variant with the informal address, see I18NAddressVariant.
+public sealed record I18NSourceText(int Offset, int Length, string Text, bool HasAddressVariants);
\ No newline at end of file
diff --git a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/DirectI18NGetTextAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/DirectI18NGetTextAnalyzer.cs
index b722803ba..85fa5215b 100644
--- a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/DirectI18NGetTextAnalyzer.cs
+++ b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/DirectI18NGetTextAnalyzer.cs
@@ -18,9 +18,9 @@ public sealed class DirectI18NGetTextAnalyzer : DiagnosticAnalyzer
private const string TITLE = "Direct translation lookup is not allowed";
- private const string MESSAGE_FORMAT = "Call GetText only from a T or TB wrapper whose first string parameter is forwarded as the fallback text";
+ private const string MESSAGE_FORMAT = "Call GetText only from a T, TB, or TA wrapper whose first string parameter is forwarded as the fallback text";
- private const string DESCRIPTION = "Translation calls must use collector-compatible T or TB wrappers so that every fallback text is included in the generated I18N resources.";
+ private const string DESCRIPTION = "Translation calls must use collector-compatible T, TB, or TA wrappers so that every fallback text is included in the generated I18N resources.";
private const string CATEGORY = "Usage";
@@ -67,7 +67,7 @@ public sealed class DirectI18NGetTextAnalyzer : DiagnosticAnalyzer
private static bool IsCollectorCompatibleWrapper(IMethodSymbol? containingMethod, IInvocationOperation invocation)
{
- if (containingMethod?.Name is not ("T" or "TB")
+ if (containingMethod?.Name is not ("T" or "TB" or "TA")
|| containingMethod.ReturnType.SpecialType != SpecialType.System_String
|| containingMethod.Parameters.Length == 0
|| containingMethod.Parameters[0].Type.SpecialType != SpecialType.System_String)
diff --git a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs
index 09f627439..ff3885a38 100644
--- a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs
+++ b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs
@@ -89,8 +89,8 @@ public sealed class ThisUsageAnalyzer : DiagnosticAnalyzer
private static bool IsTranslationMethod(SyntaxNode node)
{
- // Check if this is a method called 'T' (translation method)
- if (node is IdentifierNameSyntax { Identifier.Text: "T" })
+ // Check if this is a method called 'T' or 'TA' (translation methods)
+ if (node is IdentifierNameSyntax { Identifier.Text: "T" or "TA" })
return true;
return false;
diff --git a/app/Tests/Analyzers/DirectI18NGetTextAnalyzerTests.cs b/app/Tests/Analyzers/DirectI18NGetTextAnalyzerTests.cs
index a2735c47c..7d50a1e28 100644
--- a/app/Tests/Analyzers/DirectI18NGetTextAnalyzerTests.cs
+++ b/app/Tests/Analyzers/DirectI18NGetTextAnalyzerTests.cs
@@ -7,11 +7,11 @@ using SourceCodeRules.UsageAnalyzers;
namespace AIStudio.Tests.Analyzers;
///
-/// Checks that the texts of the app are looked up only through a T or TB wrapper, whose fallback text the I18N
+/// Checks that the texts of the app are looked up only through a T, TB, or TA wrapper, whose fallback text the I18N
/// collector finds.
///
///
-/// The collector reads the texts from calls of T and TB. A text handed to GetText anywhere else never reaches
+/// The collector reads the texts from calls of T, TB, and TA. A text handed to GetText anywhere else never reaches
/// the language plugins, so it is never translated, and nothing at runtime shows it. MWAIS0012 refuses such a
/// call while compiling. GetText is an extension method, so these tests ask in both of the forms C# knows for
/// one: the classic method with a this parameter and the member of an extension block.
@@ -42,6 +42,7 @@ public sealed class DirectI18NGetTextAnalyzerTests
[TestCase(CLASSIC_FORM, "TB", TestName = "A TB wrapper around a classic extension method")]
[TestCase(EXTENSION_BLOCK_FORM, "T", TestName = "A T wrapper around the member of an extension block")]
[TestCase(EXTENSION_BLOCK_FORM, "TB", TestName = "A TB wrapper around the member of an extension block")]
+ [TestCase(EXTENSION_BLOCK_FORM, "TA", TestName = "A TA wrapper around the member of an extension block")]
public async Task AWrapperWhichForwardsItsTextIsAllowed(string form, string wrapper)
{
var reported = await AnalyzeAsync(form, $"public string {wrapper}(string fallbackEN) => this.GetText(fallbackEN);");
@@ -54,6 +55,7 @@ public sealed class DirectI18NGetTextAnalyzerTests
[TestCase(CLASSIC_FORM, """public string Describe() => ILangExtensions.GetText(this, "Hello");""", TestName = "A classic extension method called as a static method")]
[TestCase(EXTENSION_BLOCK_FORM, """public string Describe() => this.GetText("Hello");""", TestName = "The member of an extension block called from another method")]
[TestCase(EXTENSION_BLOCK_FORM, """public string T(string fallbackEN) => this.GetText("Hello");""", TestName = "The member of an extension block called by a wrapper with a text of its own")]
+ [TestCase(EXTENSION_BLOCK_FORM, """public string TA(string fallbackEN) => this.GetText("Hello");""", TestName = "The member of an extension block called by a TA wrapper with a text of its own")]
[TestCase(EXTENSION_BLOCK_FORM, """public string Describe() => ILangExtensions.GetText(this, "Hello");""", TestName = "The member of an extension block called as a static method")]
public async Task ADirectLookupIsRefused(string form, string member)
{
diff --git a/app/Tests/Analyzers/ThisUsageAnalyzerTests.cs b/app/Tests/Analyzers/ThisUsageAnalyzerTests.cs
index b383d25fc..e82a4e883 100644
--- a/app/Tests/Analyzers/ThisUsageAnalyzerTests.cs
+++ b/app/Tests/Analyzers/ThisUsageAnalyzerTests.cs
@@ -28,6 +28,8 @@ public sealed class ThisUsageAnalyzerTests
[TestCase("CITY", TestName = "A static field")]
[TestCase("ROOM", TestName = "A constant")]
[TestCase("Shorten(this.location)", TestName = "A static method")]
+ [TestCase("""T("Kickoff")""", TestName = "A text of T")]
+ [TestCase("""TA("Your meeting")""", TestName = "A text of TA")]
public async Task AMemberWhichNeedsNoThisIsLeftAlone(string expression)
{
var reported = await AnalyzeClassAsync(expression);
@@ -160,6 +162,10 @@ public sealed class ThisUsageAnalyzerTests
private string Describe() => this.Name;
private static string Shorten(string text) => text[..1];
+
+ private string T(string fallbackEN) => fallbackEN;
+
+ private string TA(string fallbackEN) => fallbackEN;
}
""";
diff --git a/app/Tests/Assistants/I18N/I18NAddressPromptTests.cs b/app/Tests/Assistants/I18N/I18NAddressPromptTests.cs
new file mode 100644
index 000000000..c877b9676
--- /dev/null
+++ b/app/Tests/Assistants/I18N/I18NAddressPromptTests.cs
@@ -0,0 +1,103 @@
+using AIStudio.Assistants.I18N;
+
+using SharedTools;
+
+namespace AIStudio.Tests.Assistants.I18N;
+
+///
+/// Checks how the localization assistant translates the two variants of a text of TA(), which addresses the reader.
+///
+///
+/// The informal variant starts from the formal translation, so that both read alike and a reviewed formal translation
+/// keeps its wording. The formal translations of a run therefore come first.
+///
+[TestFixture]
+public sealed class I18NAddressPromptTests
+{
+ private const string KEY = "root::AISTUDIO::TESTS::TEXTS::T123";
+ private static readonly string INFORMAL_KEY = I18NAddressVariant.InformalKeyOf(KEY);
+
+ [Test]
+ public void TheInformalVariantsComeAfterAllOtherTexts()
+ {
+ var content = new Dictionary
+ {
+ [INFORMAL_KEY] = "Enter your name.",
+ ["root::A::T1"] = "Save",
+ [KEY] = "Enter your name.",
+ ["root::A::T2::INFORMAL"] = "Check your input.",
+ ["root::A::T2"] = "Check your input.",
+ };
+
+ var order = I18NAddressPrompt.FormalFirst(content).Select(entry => entry.Key);
+
+ Assert.That(order, Is.EqualTo(new[] { "root::A::T1", KEY, "root::A::T2", INFORMAL_KEY, "root::A::T2::INFORMAL" }));
+ }
+
+ [Test]
+ public void TheFormalTranslationOfThisRunComesFirst()
+ {
+ var translatedNow = new Dictionary { [KEY] = "Geben Sie Ihren Namen ein." };
+ var translatedBefore = new Dictionary { [KEY] = "Ihr Name, bitte." };
+
+ Assert.That(I18NAddressPrompt.FindFormalTranslation(INFORMAL_KEY, translatedNow, translatedBefore), Is.EqualTo("Geben Sie Ihren Namen ein."));
+ }
+
+ [Test]
+ public void TheFormalTranslationOfTheLanguagePluginCountsAsWell()
+ {
+ var translatedBefore = new Dictionary { [KEY] = "Geben Sie Ihren Namen ein." };
+
+ Assert.That(I18NAddressPrompt.FindFormalTranslation(INFORMAL_KEY, new Dictionary(), translatedBefore), Is.EqualTo("Geben Sie Ihren Namen ein."));
+ }
+
+ [Test]
+ public void WithoutAFormalTranslationThereIsNone()
+ {
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(I18NAddressPrompt.FindFormalTranslation(INFORMAL_KEY, new Dictionary(), new Dictionary { [KEY] = " " }), Is.Null);
+ Assert.That(I18NAddressPrompt.FindFormalTranslation(KEY, new Dictionary { [KEY] = "Geben Sie Ihren Namen ein." }, new Dictionary()), Is.Null, "A usual key is no informal variant.");
+ }
+ }
+
+ [Test]
+ public void AUsualTextAddressesTheReaderFormally()
+ {
+ var section = I18NAddressPrompt.Section("German (Germany)", false, null);
+
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(section, Does.Contain("formal address of German (Germany)"));
+ Assert.That(section, Does.Not.Contain("informal"));
+ }
+ }
+
+ [Test]
+ public void AnInformalVariantChangesOnlyTheAddressOfTheFormalTranslation()
+ {
+ const string FORMAL = "## Willkommen!\n\nGeben Sie Ihren Namen ein.";
+
+ // The line endings of the prompt are those of the checkout:
+ var section = I18NAddressPrompt.Section("German (Germany)", true, FORMAL).ReplaceLineEndings("\n");
+
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(section, Does.Contain("informal address of German (Germany)"));
+ Assert.That(section, Does.Contain($"\n{FORMAL}\n"));
+ Assert.That(section, Does.Contain("change only what the informal address"));
+ }
+ }
+
+ [Test]
+ public void AnInformalVariantWithoutAFormalTranslationIsTranslatedInformally()
+ {
+ var section = I18NAddressPrompt.Section("French (France)", true, null);
+
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(section, Does.Contain("informal address of French (France)"));
+ Assert.That(section, Does.Not.Contain("formal_translation"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/Tests/BeyondFactsLab/BflAccessTests.cs b/app/Tests/BeyondFactsLab/BflAccessTests.cs
index c3202e1f6..2855e1747 100644
--- a/app/Tests/BeyondFactsLab/BflAccessTests.cs
+++ b/app/Tests/BeyondFactsLab/BflAccessTests.cs
@@ -66,7 +66,7 @@ public sealed class BflAccessTests
{
var forms = ConfigurationSelectDataFactory.GetBeyondFactsLabAddressFormData().Select(data => data.Value);
- Assert.That(forms, Is.EquivalentTo(Enum.GetValues()));
+ Assert.That(forms, Is.EquivalentTo(Enum.GetValues()));
}
private static SettingsManager CreateSettingsManager() => new(NullLogger.Instance, null!);
diff --git a/app/Tests/BeyondFactsLab/BflAddressTests.cs b/app/Tests/BeyondFactsLab/BflAddressTests.cs
new file mode 100644
index 000000000..1613e00a8
--- /dev/null
+++ b/app/Tests/BeyondFactsLab/BflAddressTests.cs
@@ -0,0 +1,49 @@
+using System.Runtime.CompilerServices;
+using System.Text.RegularExpressions;
+
+using SharedTools;
+
+namespace AIStudio.Tests.BeyondFactsLab;
+
+///
+/// Checks that the texts of the BeyondFacts Lab follow the form of address the person chose.
+///
+///
+/// A text which says "you" in English addresses the reader in other languages as well, so it needs TA(). With T() or
+/// TB(), it would stay formal in German, although the person chose the informal address.
+///
+[TestFixture]
+public sealed partial class BflAddressTests
+{
+ [Test]
+ public void EveryTextOfTheLabWhichSaysYouFollowsTheFormOfAddress()
+ {
+ var texts = 0;
+ var formalOnly = new List();
+ foreach (var file in LabSourceFiles())
+ {
+ foreach (var text in I18NSourceScanner.FindTexts(File.ReadAllText(file), file, []))
+ {
+ texts++;
+ if (!text.HasAddressVariants && YouRegex().IsMatch(text.Text))
+ formalOnly.Add($"{Path.GetFileName(file)}: {text.Text}");
+ }
+ }
+
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(texts, Is.GreaterThan(80), "The test found too few texts to be looking at the lab.");
+ Assert.That(formalOnly, Is.Empty);
+ }
+ }
+
+ [GeneratedRegex(@"\byou(r|rs|rself)?\b", RegexOptions.IgnoreCase)]
+ private static partial Regex YouRegex();
+
+ private static IEnumerable LabSourceFiles([CallerFilePath] string sourceFilePath = "")
+ {
+ var appDirectory = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(sourceFilePath)!, "..", "..", "MindWork AI Studio"));
+ return Directory.EnumerateFiles(Path.Combine(appDirectory, "Assistants", "BeyondFactsLab"))
+ .Append(Path.Combine(appDirectory, "Dialogs", "Settings", "SettingsDialogBeyondFactsLab.razor"));
+ }
+}
\ No newline at end of file
diff --git a/app/Tests/BeyondFactsLab/BflComponentTests.cs b/app/Tests/BeyondFactsLab/BflComponentTests.cs
index 67ca4756b..d26e1e043 100644
--- a/app/Tests/BeyondFactsLab/BflComponentTests.cs
+++ b/app/Tests/BeyondFactsLab/BflComponentTests.cs
@@ -1,4 +1,3 @@
-using AIStudio.Assistants.BeyondFactsLab;
using AIStudio.Provider;
using AIStudio.Settings;
using AIStudio.Settings.DataModel;
@@ -142,7 +141,7 @@ public sealed class BflComponentTests
[Test]
public void NewSettingsAddressFormally()
{
- Assert.That(new DataBeyondFactsLab().AddressForm, Is.EqualTo(BflAddressForm.FORMAL), "The texts of AI Studio address the person formally as well.");
+ Assert.That(new DataBeyondFactsLab().AddressForm, Is.EqualTo(AddressForm.FORMAL), "The texts of AI Studio address the person formally as well.");
}
private static SettingsManager CreateSettingsManager() => new(NullLogger.Instance, null!);
diff --git a/app/Tests/Tools/LuaTableTests.cs b/app/Tests/Tools/LuaTableTests.cs
index 090b46e7f..703696197 100644
--- a/app/Tests/Tools/LuaTableTests.cs
+++ b/app/Tests/Tools/LuaTableTests.cs
@@ -50,6 +50,18 @@ public sealed class LuaTableTests
}
}
+ [Test]
+ public async Task TheKeyOfAnInformalVariantKeepsItsEnding()
+ {
+ var code = Create(new Dictionary
+ {
+ [KEY] = "Enter your name.",
+ [SharedTools.I18NAddressVariant.InformalKeyOf(KEY)] = "Enter your name.",
+ });
+
+ Assert.That(await ReadAsync(code, $"{LUA_KEY}::INFORMAL"), Is.EqualTo("Enter your name."), code);
+ }
+
[Test]
public void TextsOnOneLineAreWrittenAsBefore()
{
diff --git a/app/Tests/Tools/PluginSystem/FakeLanguagePlugin.cs b/app/Tests/Tools/PluginSystem/FakeLanguagePlugin.cs
new file mode 100644
index 000000000..df68fd758
--- /dev/null
+++ b/app/Tests/Tools/PluginSystem/FakeLanguagePlugin.cs
@@ -0,0 +1,33 @@
+using AIStudio.Tools.PluginSystem;
+
+namespace AIStudio.Tests.Tools.PluginSystem;
+
+///
+/// A language plugin with texts of its own and a base language behind it, as PluginLanguage has.
+///
+/// The texts of the language itself.
+/// The texts of the base language, which answer for the keys the language lacks.
+public sealed class FakeLanguagePlugin(IReadOnlyDictionary content, IReadOnlyDictionary? baseContent = null) : ILanguagePlugin
+{
+ ///
+ public bool TryGetText(string key, out string value, bool logWarning = false)
+ {
+ if (content.TryGetValue(key, out var text) || baseContent is not null && baseContent.TryGetValue(key, out text))
+ {
+ value = text;
+ return true;
+ }
+
+ value = string.Empty;
+ return false;
+ }
+
+ ///
+ public string IETFTag => "de-DE";
+
+ ///
+ public string LangName => "Deutsch (Deutschland)";
+
+ ///
+ public IReadOnlyDictionary Content => content;
+}
\ No newline at end of file
diff --git a/app/Tests/Tools/PluginSystem/I18NAddressVariantTests.cs b/app/Tests/Tools/PluginSystem/I18NAddressVariantTests.cs
new file mode 100644
index 000000000..840f2fbc9
--- /dev/null
+++ b/app/Tests/Tools/PluginSystem/I18NAddressVariantTests.cs
@@ -0,0 +1,132 @@
+using AIStudio.Settings.DataModel;
+using AIStudio.Tools.PluginSystem;
+
+using SharedTools;
+
+namespace AIStudio.Tests.Tools.PluginSystem;
+
+///
+/// Checks the two variants of a text of TA(), which addresses the reader: their keys, and which of them the app shows.
+///
+///
+/// The informal variant has a key of its own. When the language in use lacks it, the person reads the formal variant
+/// of that language, never the English text which the base language holds under the informal key.
+///
+[TestFixture]
+public sealed class I18NAddressVariantTests
+{
+ private const string NAMESPACE = "AIStudio.Tests";
+ private const string TYPE = "Texts";
+ private const string TEXT = "Enter your name.";
+ private const string FORMAL = "Geben Sie Ihren Namen ein.";
+ private const string INFORMAL = "Gib deinen Namen ein.";
+
+ private static readonly string KEY = $"root::AISTUDIO::TESTS::TEXTS::T{I18NKeyHash.Of(TEXT)}";
+ private static readonly string INFORMAL_KEY = I18NAddressVariant.InformalKeyOf(KEY);
+
+ [Test]
+ public void TheKeyOfTheInformalVariantLeadsBackToTheUsualKey()
+ {
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(INFORMAL_KEY, Is.EqualTo($"{KEY}::INFORMAL"));
+ Assert.That(I18NAddressVariant.TryGetFormalKey(INFORMAL_KEY, out var formalKey), Is.True);
+ Assert.That(formalKey, Is.EqualTo(KEY));
+ }
+ }
+
+ [Test]
+ public void AUsualKeyBelongsToNoInformalVariant()
+ {
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(I18NAddressVariant.TryGetFormalKey(KEY, out var formalKey), Is.False);
+ Assert.That(formalKey, Is.EqualTo(KEY));
+ }
+ }
+
+ [Test]
+ public void TheInformalVariantShowsWhenThePersonWantsIt()
+ {
+ var plugin = new FakeLanguagePlugin(new Dictionary { [KEY] = FORMAL, [INFORMAL_KEY] = INFORMAL });
+
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(Lookup(plugin, AddressForm.INFORMAL), Is.EqualTo(INFORMAL));
+ Assert.That(Lookup(plugin, AddressForm.FORMAL), Is.EqualTo(FORMAL));
+ Assert.That(I18N.I.GetText(plugin, TEXT, NAMESPACE, TYPE), Is.EqualTo(FORMAL), "Texts of T() address the reader formally.");
+ }
+ }
+
+ [Test]
+ public void WithoutAnInformalVariantTheFormalTextOfTheLanguageShows()
+ {
+ // The English language plugin, the base of every other one, holds the informal variant in English:
+ var plugin = new FakeLanguagePlugin(
+ new Dictionary { [KEY] = FORMAL },
+ new Dictionary { [KEY] = TEXT, [INFORMAL_KEY] = TEXT });
+
+ Assert.That(Lookup(plugin, AddressForm.INFORMAL), Is.EqualTo(FORMAL));
+ }
+
+ [Test]
+ public void AnEmptyInformalVariantDoesNotCount()
+ {
+ var plugin = new FakeLanguagePlugin(new Dictionary { [KEY] = FORMAL, [INFORMAL_KEY] = " " });
+
+ Assert.That(Lookup(plugin, AddressForm.INFORMAL), Is.EqualTo(FORMAL));
+ }
+
+ [Test]
+ public void WithoutAnyTranslationTheEnglishTextShows()
+ {
+ var plugin = new FakeLanguagePlugin(new Dictionary());
+
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(Lookup(plugin, AddressForm.INFORMAL), Is.EqualTo(TEXT));
+ Assert.That(Lookup(plugin, AddressForm.FORMAL), Is.EqualTo(TEXT));
+ Assert.That(I18N.I.GetText(NoPluginLanguage.INSTANCE, TEXT, NAMESPACE, TYPE, AddressForm.INFORMAL), Is.EqualTo(TEXT));
+ }
+ }
+
+ [Test]
+ public void ALanguageWithAnInformalVariantOfItsOwnOffersTheChoice()
+ {
+ var german = new FakeLanguagePlugin(new Dictionary { ["root::A::T1"] = "Speichern", [KEY] = FORMAL, [INFORMAL_KEY] = INFORMAL });
+
+ Assert.That(german.HasInformalAddress(), Is.True);
+ }
+
+ [Test]
+ public void ALanguageWithOneFormOfAddressOffersNoChoice()
+ {
+ // The localization assistant writes the informal variants of English in the same words:
+ var english = new FakeLanguagePlugin(new Dictionary { [KEY] = TEXT, [INFORMAL_KEY] = TEXT });
+
+ Assert.That(english.HasInformalAddress(), Is.False);
+ }
+
+ [Test]
+ public void ALanguageWithoutInformalVariantsOffersNoChoice()
+ {
+ // The informal variant of the base language does not count for the language in use:
+ var german = new FakeLanguagePlugin(
+ new Dictionary { [KEY] = FORMAL },
+ new Dictionary { [KEY] = TEXT, [INFORMAL_KEY] = "Enter your name, please." });
+
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(german.HasInformalAddress(), Is.False);
+ Assert.That(NoPluginLanguage.INSTANCE.HasInformalAddress(), Is.False);
+ }
+ }
+
+ [Test]
+ public void TheTextsAddressThePersonFormallyUntilTheAppSaysOtherwise()
+ {
+ Assert.That(I18N.I.AddressForm, Is.EqualTo(AddressForm.FORMAL), "Nothing in the tests sets where the form of address comes from.");
+ }
+
+ private static string Lookup(ILanguagePlugin plugin, AddressForm addressForm) => I18N.I.GetText(plugin, TEXT, NAMESPACE, TYPE, addressForm);
+}
\ No newline at end of file
diff --git a/app/Tests/Tools/PluginSystem/I18NSourceScannerTests.cs b/app/Tests/Tools/PluginSystem/I18NSourceScannerTests.cs
index 64f236d35..f6e337ad7 100644
--- a/app/Tests/Tools/PluginSystem/I18NSourceScannerTests.cs
+++ b/app/Tests/Tools/PluginSystem/I18NSourceScannerTests.cs
@@ -8,7 +8,7 @@ using SharedTools;
namespace AIStudio.Tests.Tools.PluginSystem;
///
-/// Checks how the I18N collector finds the texts of T() and TB(), and which key it files them under.
+/// Checks how the I18N collector finds the texts of T(), TB(), and TA(), and which key it files them under.
///
///
/// The app looks up a translation by the hash of the string the compiler made of a text. The collector has to file
@@ -58,7 +58,7 @@ public sealed class I18NSourceScannerTests
var root = CSharpSyntaxTree.ParseText(content).GetRoot();
foreach (var invocation in root.DescendantNodes().OfType())
{
- if (CalledName(invocation) is not ("T" or "TB") || invocation.ArgumentList.Arguments.FirstOrDefault()?.Expression is not LiteralExpressionSyntax literal)
+ if (CalledName(invocation) is not ("T" or "TB" or "TA") ||invocation.ArgumentList.Arguments.FirstOrDefault()?.Expression is not LiteralExpressionSyntax literal)
continue;
// The collector takes only a text which follows the parenthesis right away:
@@ -108,18 +108,28 @@ public sealed class I18NSourceScannerTests
public void AllKindsOfCallsAreFound()
{
const string SOURCE = """
- T("First"); TB("Second"); this.T("Third", typeof(X).Namespace, nameof(X)); @T(@"Fourth"); T( "Not found");
+ T("First"); TB("Second"); this.T("Third", typeof(X).Namespace, nameof(X)); @T(@"Fourth"); TA("Fifth"); @TA("Sixth"); T( "Not found");
""";
var texts = I18NSourceScanner.FindTexts(SOURCE, "Calls.cs", []);
- Assert.That(texts.Select(text => text.Text), Is.EqualTo(new[] { "First", "Second", "Third", "Fourth" }));
+ Assert.That(texts.Select(text => text.Text), Is.EqualTo(new[] { "First", "Second", "Third", "Fourth", "Fifth", "Sixth" }));
+ }
+
+ [Test]
+ public void OnlyATextOfTAGetsAVariantWithTheInformalAddress()
+ {
+ const string SOURCE = """T("Save"); TB("Your details"); TA("Enter your name."); TA(@"Please check ""this"".");""";
+
+ var texts = I18NSourceScanner.FindTexts(SOURCE, "Address.cs", []);
+
+ Assert.That(texts.Where(text => text.HasAddressVariants).Select(text => text.Text), Is.EqualTo(new[] { "Enter your name.", "Please check \"this\"." }));
}
[Test]
public void ACallOfAnotherMethodIsIgnored()
{
- const string SOURCE = """GetT("No text"); MyTB("No text either"); T("Text");""";
+ const string SOURCE = """GetT("No text"); MyTB("No text either"); DATA("No text at all"); T("Text");""";
var texts = I18NSourceScanner.FindTexts(SOURCE, "Other.cs", []);