Fix up concat strings in favor of args, remove some translations that are not meant to be translated and add chinese.

Signed-off-by: Adam Treat <treat.adam@gmail.com>
This commit is contained in:
Adam Treat 2024-07-11 11:19:06 -04:00
parent 8723508d6c
commit 9283e09981
9 changed files with 3468 additions and 759 deletions

View File

@ -239,8 +239,8 @@ void Chat::newPromptResponsePair(const QString &prompt)
{ {
resetResponseState(); resetResponseState();
m_chatModel->updateCurrentResponse(m_chatModel->count() - 1, false); m_chatModel->updateCurrentResponse(m_chatModel->count() - 1, false);
m_chatModel->appendPrompt(tr("Prompt: "), prompt); m_chatModel->appendPrompt("Prompt: ", prompt);
m_chatModel->appendResponse(tr("Response: "), prompt); m_chatModel->appendResponse("Response: ", prompt);
emit resetResponseRequested(); emit resetResponseRequested();
} }
@ -248,8 +248,8 @@ void Chat::serverNewPromptResponsePair(const QString &prompt)
{ {
resetResponseState(); resetResponseState();
m_chatModel->updateCurrentResponse(m_chatModel->count() - 1, false); m_chatModel->updateCurrentResponse(m_chatModel->count() - 1, false);
m_chatModel->appendPrompt(tr("Prompt: "), prompt); m_chatModel->appendPrompt("Prompt: ", prompt);
m_chatModel->appendResponse(tr("Response: "), prompt); m_chatModel->appendResponse("Response: ", prompt);
} }
bool Chat::isRecalc() const bool Chat::isRecalc() const

View File

@ -20,7 +20,7 @@ Window {
minimumWidth: 1280 minimumWidth: 1280
minimumHeight: 720 minimumHeight: 720
visible: true visible: true
title: qsTr("GPT4All v") + Qt.application.version title: qsTr("GPT4All v%1").arg(Qt.application.version)
Settings { Settings {
property alias x: window.x property alias x: window.x
@ -108,14 +108,14 @@ Window {
shouldShowBusy: false shouldShowBusy: false
closePolicy: Popup.NoAutoClose closePolicy: Popup.NoAutoClose
modal: true modal: true
text: qsTr("<h3>Encountered an error starting up:</h3><br>") text: qsTr("<h3>Encountered an error starting up:</h3><br>"
+ qsTr("<i>\"Incompatible hardware detected.\"</i>") + "<i>\"Incompatible hardware detected.\"</i>"
+ qsTr("<br><br>Unfortunately, your CPU does not meet the minimal requirements to run ") + "<br><br>Unfortunately, your CPU does not meet the minimal requirements to run "
+ qsTr("this program. In particular, it does not support AVX intrinsics which this ") + "this program. In particular, it does not support AVX intrinsics which this "
+ qsTr("program requires to successfully run a modern large language model. ") + "program requires to successfully run a modern large language model. "
+ qsTr("The only solution at this time is to upgrade your hardware to a more modern CPU.") + "The only solution at this time is to upgrade your hardware to a more modern CPU."
+ qsTr("<br><br>See here for more information: <a href=\"https://en.wikipedia.org/wiki/Advanced_Vector_Extensions\">") + "<br><br>See here for more information: <a href=\"https://en.wikipedia.org/wiki/Advanced_Vector_Extensions\">"
+ qsTr("https://en.wikipedia.org/wiki/Advanced_Vector_Extensions</a>") + "https://en.wikipedia.org/wiki/Advanced_Vector_Extensions</a>");
} }
PopupDialog { PopupDialog {
@ -124,12 +124,12 @@ Window {
shouldTimeOut: false shouldTimeOut: false
shouldShowBusy: false shouldShowBusy: false
modal: true modal: true
text: qsTr("<h3>Encountered an error starting up:</h3><br>") text: qsTr("<h3>Encountered an error starting up:</h3><br>"
+ qsTr("<i>\"Inability to access settings file.\"</i>") + "<i>\"Inability to access settings file.\"</i>"
+ qsTr("<br><br>Unfortunately, something is preventing the program from accessing ") + "<br><br>Unfortunately, something is preventing the program from accessing "
+ qsTr("the settings file. This could be caused by incorrect permissions in the local ") + "the settings file. This could be caused by incorrect permissions in the local "
+ qsTr("app config directory where the settings file is located. ") + "app config directory where the settings file is located. "
+ qsTr("Check out our <a href=\"https://discord.gg/4M2QFmTt2k\">discord channel</a> for help.") + "Check out our <a href=\"https://discord.gg/4M2QFmTt2k\">discord channel</a> for help.")
} }
StartupDialog { StartupDialog {

View File

@ -1553,7 +1553,7 @@ void ModelList::parseModelsJsonFile(const QByteArray &jsonData, bool save)
{ ModelList::FilesizeRole, "minimal" }, { ModelList::FilesizeRole, "minimal" },
{ ModelList::OnlineRole, true }, { ModelList::OnlineRole, true },
{ ModelList::DescriptionRole, { ModelList::DescriptionRole,
tr("<strong>OpenAI's ChatGPT model GPT-3.5 Turbo</strong><br>") + chatGPTDesc }, tr("<strong>OpenAI's ChatGPT model GPT-3.5 Turbo</strong><br> %1").arg(chatGPTDesc) },
{ ModelList::RequiresVersionRole, "2.7.4" }, { ModelList::RequiresVersionRole, "2.7.4" },
{ ModelList::OrderRole, "ca" }, { ModelList::OrderRole, "ca" },
{ ModelList::RamrequiredRole, 0 }, { ModelList::RamrequiredRole, 0 },
@ -1581,7 +1581,7 @@ void ModelList::parseModelsJsonFile(const QByteArray &jsonData, bool save)
{ ModelList::FilesizeRole, "minimal" }, { ModelList::FilesizeRole, "minimal" },
{ ModelList::OnlineRole, true }, { ModelList::OnlineRole, true },
{ ModelList::DescriptionRole, { ModelList::DescriptionRole,
tr("<strong>OpenAI's ChatGPT model GPT-4</strong><br>") + chatGPTDesc + chatGPT4Warn }, tr("<strong>OpenAI's ChatGPT model GPT-4</strong><br> %1 %2").arg(chatGPTDesc).arg(chatGPT4Warn) },
{ ModelList::RequiresVersionRole, "2.7.4" }, { ModelList::RequiresVersionRole, "2.7.4" },
{ ModelList::OrderRole, "cb" }, { ModelList::OrderRole, "cb" },
{ ModelList::RamrequiredRole, 0 }, { ModelList::RamrequiredRole, 0 },
@ -1612,7 +1612,7 @@ void ModelList::parseModelsJsonFile(const QByteArray &jsonData, bool save)
{ ModelList::FilesizeRole, "minimal" }, { ModelList::FilesizeRole, "minimal" },
{ ModelList::OnlineRole, true }, { ModelList::OnlineRole, true },
{ ModelList::DescriptionRole, { ModelList::DescriptionRole,
tr("<strong>Mistral Tiny model</strong><br>") + mistralDesc }, tr("<strong>Mistral Tiny model</strong><br> %1").arg(mistralDesc) },
{ ModelList::RequiresVersionRole, "2.7.4" }, { ModelList::RequiresVersionRole, "2.7.4" },
{ ModelList::OrderRole, "cc" }, { ModelList::OrderRole, "cc" },
{ ModelList::RamrequiredRole, 0 }, { ModelList::RamrequiredRole, 0 },
@ -1637,7 +1637,7 @@ void ModelList::parseModelsJsonFile(const QByteArray &jsonData, bool save)
{ ModelList::FilesizeRole, "minimal" }, { ModelList::FilesizeRole, "minimal" },
{ ModelList::OnlineRole, true }, { ModelList::OnlineRole, true },
{ ModelList::DescriptionRole, { ModelList::DescriptionRole,
tr("<strong>Mistral Small model</strong><br>") + mistralDesc }, tr("<strong>Mistral Small model</strong><br> %1").arg(mistralDesc) },
{ ModelList::RequiresVersionRole, "2.7.4" }, { ModelList::RequiresVersionRole, "2.7.4" },
{ ModelList::OrderRole, "cd" }, { ModelList::OrderRole, "cd" },
{ ModelList::RamrequiredRole, 0 }, { ModelList::RamrequiredRole, 0 },
@ -1663,7 +1663,7 @@ void ModelList::parseModelsJsonFile(const QByteArray &jsonData, bool save)
{ ModelList::FilesizeRole, "minimal" }, { ModelList::FilesizeRole, "minimal" },
{ ModelList::OnlineRole, true }, { ModelList::OnlineRole, true },
{ ModelList::DescriptionRole, { ModelList::DescriptionRole,
tr("<strong>Mistral Medium model</strong><br>") + mistralDesc }, tr("<strong>Mistral Medium model</strong><br> %1").arg(mistralDesc) },
{ ModelList::RequiresVersionRole, "2.7.4" }, { ModelList::RequiresVersionRole, "2.7.4" },
{ ModelList::OrderRole, "ce" }, { ModelList::OrderRole, "ce" },
{ ModelList::RamrequiredRole, 0 }, { ModelList::RamrequiredRole, 0 },

View File

@ -94,7 +94,7 @@ Rectangle {
function onDiscoverInProgressChanged() { function onDiscoverInProgressChanged() {
if (ModelList.discoverInProgress) { if (ModelList.discoverInProgress) {
discoverField.textBeingSearched = discoverField.text; discoverField.textBeingSearched = discoverField.text;
discoverField.text = qsTr("Searching \u00B7 ") + discoverField.textBeingSearched; discoverField.text = qsTr("Searching \u00B7 %1").arg(discoverField.textBeingSearched);
} else { } else {
discoverField.text = discoverField.textBeingSearched; discoverField.text = discoverField.textBeingSearched;
discoverField.textBeingSearched = ""; discoverField.textBeingSearched = "";
@ -190,7 +190,7 @@ Rectangle {
rightPadding: 30 rightPadding: 30
color: theme.textColor color: theme.textColor
text: { text: {
return qsTr("Sort by: ") + comboSort.displayText return qsTr("Sort by: %1").arg(comboSort.displayText)
} }
font.pixelSize: theme.fontSizeLarger font.pixelSize: theme.fontSizeLarger
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
@ -215,7 +215,7 @@ Rectangle {
rightPadding: 30 rightPadding: 30
color: theme.textColor color: theme.textColor
text: { text: {
return qsTr("Sort dir: ") + comboSortDirection.displayText return qsTr("Sort dir: %1").arg(comboSortDirection.displayText)
} }
font.pixelSize: theme.fontSizeLarger font.pixelSize: theme.fontSizeLarger
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
@ -251,7 +251,7 @@ Rectangle {
rightPadding: 30 rightPadding: 30
color: theme.textColor color: theme.textColor
text: { text: {
return qsTr("Limit: ") + comboLimit.displayText return qsTr("Limit: %1").arg(comboLimit.displayText)
} }
font.pixelSize: theme.fontSizeLarger font.pixelSize: theme.fontSizeLarger
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
@ -284,7 +284,7 @@ Rectangle {
Layout.fillHeight: true Layout.fillHeight: true
horizontalAlignment: Qt.AlignHCenter horizontalAlignment: Qt.AlignHCenter
verticalAlignment: Qt.AlignVCenter verticalAlignment: Qt.AlignVCenter
text: qsTr("Network error: could not retrieve http://gpt4all.io/models/models3.json") text: qsTr("Network error: could not retrieve %1").arg("http://gpt4all.io/models/models3.json")
font.pixelSize: theme.fontSizeLarge font.pixelSize: theme.fontSizeLarge
color: theme.mutedTextColor color: theme.mutedTextColor
} }
@ -454,9 +454,7 @@ Rectangle {
Layout.leftMargin: 20 Layout.leftMargin: 20
visible: downloadError !== "" visible: downloadError !== ""
textFormat: Text.StyledText textFormat: Text.StyledText
text: "<strong><font size=\"1\">" text: qsTr("<strong><font size=\"1\"><a href=\"#error\">Error</a></strong></font>")
+ qsTr("<a href=\"#error\">Error</a>")
+ "</strong></font>"
color: theme.textColor color: theme.textColor
font.pixelSize: theme.fontSizeLarge font.pixelSize: theme.fontSizeLarge
linkColor: theme.textErrorColor linkColor: theme.textErrorColor
@ -475,10 +473,7 @@ Rectangle {
Layout.leftMargin: 20 Layout.leftMargin: 20
Layout.maximumWidth: 300 Layout.maximumWidth: 300
textFormat: Text.StyledText textFormat: Text.StyledText
text: qsTr("<strong><font size=\"2\">WARNING: Not recommended for your hardware.") text: qsTr("<strong><font size=\"2\">WARNING: Not recommended for your hardware. Model requires more memory (%1 GB) than your system has available (%2).</strong></font>").arg(ramrequired).arg(LLM.systemTotalRAMInGBString())
+ qsTr(" Model requires more memory (") + ramrequired
+ qsTr(" GB) than your system has available (")
+ LLM.systemTotalRAMInGBString() + ").</strong></font>"
color: theme.textErrorColor color: theme.textErrorColor
font.pixelSize: theme.fontSizeLarge font.pixelSize: theme.fontSizeLarge
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
@ -630,7 +625,7 @@ Rectangle {
color: theme.mutedDarkTextColor color: theme.mutedDarkTextColor
} }
Text { Text {
text: ramrequired >= 0 ? ramrequired + qsTr(" GB") : "?" text: ramrequired >= 0 ? qsTr("%1 GB").arg(ramrequired) : qsTr("?")
color: theme.textColor color: theme.textColor
font.pixelSize: theme.fontSizeSmall font.pixelSize: theme.fontSizeSmall
font.bold: true font.bold: true
@ -652,7 +647,7 @@ Rectangle {
color: theme.mutedDarkTextColor color: theme.mutedDarkTextColor
} }
Text { Text {
text: parameters !== "" ? parameters : "?" text: parameters !== "" ? parameters : qsTr("?")
color: theme.textColor color: theme.textColor
font.pixelSize: theme.fontSizeSmall font.pixelSize: theme.fontSizeSmall
font.bold: true font.bold: true

View File

@ -55,18 +55,18 @@ Rectangle {
id: modelLoadingErrorPopup id: modelLoadingErrorPopup
anchors.centerIn: parent anchors.centerIn: parent
shouldTimeOut: false shouldTimeOut: false
text: qsTr("<h3>Encountered an error loading model:</h3><br>") text: qsTr("<h3>Encountered an error loading model:</h3><br>"
+ "<i>\"" + currentChat.modelLoadingError + "\"</i>" + "<i>\"%1\"</i>"
+ qsTr("<br><br>Model loading failures can happen for a variety of reasons, but the most common " + "<br><br>Model loading failures can happen for a variety of reasons, but the most common "
+ "causes include a bad file format, an incomplete or corrupted download, the wrong file " + "causes include a bad file format, an incomplete or corrupted download, the wrong file "
+ "type, not enough system RAM or an incompatible model type. Here are some suggestions for resolving the problem:" + "type, not enough system RAM or an incompatible model type. Here are some suggestions for resolving the problem:"
+ "<br><ul>" + "<br><ul>"
+ "<li>Ensure the model file has a compatible format and type" + "<li>Ensure the model file has a compatible format and type"
+ "<li>Check the model file is complete in the download folder" + "<li>Check the model file is complete in the download folder"
+ "<li>You can find the download folder in the settings dialog" + "<li>You can find the download folder in the settings dialog"
+ "<li>If you've sideloaded the model ensure the file is not corrupt by checking md5sum" + "<li>If you've sideloaded the model ensure the file is not corrupt by checking md5sum"
+ "<li>Read more about what models are supported in our <a href=\"https://docs.gpt4all.io/\">documentation</a> for the gui" + "<li>Read more about what models are supported in our <a href=\"https://docs.gpt4all.io/\">documentation</a> for the gui"
+ "<li>Check out our <a href=\"https://discord.gg/4M2QFmTt2k\">discord channel</a> for help") + "<li>Check out our <a href=\"https://discord.gg/4M2QFmTt2k\">discord channel</a> for help").arg(currentChat.modelLoadingError);
} }
PopupDialog { PopupDialog {
@ -107,7 +107,7 @@ Rectangle {
for (var i = 0; i < chatModel.count; i++) { for (var i = 0; i < chatModel.count; i++) {
var item = chatModel.get(i) var item = chatModel.get(i)
var string = item.name; var string = item.name;
var isResponse = item.name === qsTr("Response: ") var isResponse = item.name === "Response: "
string += chatModel.get(i).value string += chatModel.get(i).value
if (isResponse && item.stopped) if (isResponse && item.stopped)
string += " <stopped>" string += " <stopped>"
@ -121,7 +121,7 @@ Rectangle {
var str = "{\"conversation\": ["; var str = "{\"conversation\": [";
for (var i = 0; i < chatModel.count; i++) { for (var i = 0; i < chatModel.count; i++) {
var item = chatModel.get(i) var item = chatModel.get(i)
var isResponse = item.name === qsTr("Response: ") var isResponse = item.name === "Response: "
str += "{\"content\": "; str += "{\"content\": ";
str += JSON.stringify(item.value) str += JSON.stringify(item.value)
str += ", \"role\": \"" + (isResponse ? "assistant" : "user") + "\""; str += ", \"role\": \"" + (isResponse ? "assistant" : "user") + "\"";
@ -374,9 +374,9 @@ Rectangle {
if (!currentModelInstalled()) if (!currentModelInstalled())
return qsTr("Not found: %1").arg(currentModelName()) return qsTr("Not found: %1").arg(currentModelName())
if (currentChat.modelLoadingPercentage === 0.0) if (currentChat.modelLoadingPercentage === 0.0)
return qsTr("Reload \u00B7 ") + currentModelName() return qsTr("Reload \u00B7 %1").arg(currentModelName())
if (currentChat.isCurrentlyLoading) if (currentChat.isCurrentlyLoading)
return qsTr("Loading \u00B7 ") + currentModelName() return qsTr("Loading \u00B7 %1").arg(currentModelName())
return currentModelName() return currentModelName()
} }
font.pixelSize: theme.fontSizeLarger font.pixelSize: theme.fontSizeLarger
@ -705,7 +705,7 @@ Rectangle {
} }
} }
text: qsTr("Load \u00B7 ") + defaultModel + qsTr(" (default) \u2192"); text: qsTr("Load \u00B7 %1 (default) \u2192").arg(defaultModel);
onClicked: { onClicked: {
var i = comboBox.find(MySettings.userDefaultModel) var i = comboBox.find(MySettings.userDefaultModel)
if (i !== -1) { if (i !== -1) {
@ -812,7 +812,7 @@ Rectangle {
fillMode: Image.PreserveAspectFit fillMode: Image.PreserveAspectFit
mipmap: true mipmap: true
visible: false visible: false
source: name !== qsTr("Response: ") ? "qrc:/gpt4all/icons/you.svg" : "qrc:/gpt4all/icons/gpt4all_transparent.svg" source: name !== "Response: " ? "qrc:/gpt4all/icons/you.svg" : "qrc:/gpt4all/icons/gpt4all_transparent.svg"
} }
ColorOverlay { ColorOverlay {
@ -845,7 +845,7 @@ Rectangle {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
TextArea { TextArea {
text: name === qsTr("Response: ") ? qsTr("GPT4All") : qsTr("You") text: name === "Response: " ? qsTr("GPT4All") : qsTr("You")
padding: 0 padding: 0
font.pixelSize: theme.fontSizeLarger font.pixelSize: theme.fontSizeLarger
font.bold: true font.bold: true
@ -855,7 +855,7 @@ Rectangle {
readOnly: true readOnly: true
} }
Text { Text {
visible: name === qsTr("Response: ") visible: name === "Response: "
font.pixelSize: theme.fontSizeLarger font.pixelSize: theme.fontSizeLarger
text: currentModelName() text: currentModelName()
color: theme.mutedTextColor color: theme.mutedTextColor
@ -870,8 +870,8 @@ Rectangle {
return qsTr("recalculating context ..."); return qsTr("recalculating context ...");
switch (currentChat.responseState) { switch (currentChat.responseState) {
case Chat.ResponseStopped: return qsTr("response stopped ..."); case Chat.ResponseStopped: return qsTr("response stopped ...");
case Chat.LocalDocsRetrieval: return qsTr("retrieving localdocs: ") + currentChat.collectionList.join(", ") + " ..."; case Chat.LocalDocsRetrieval: return qsTr("retrieving localdocs: %1 ...").arg(currentChat.collectionList.join(", "));
case Chat.LocalDocsProcessing: return qsTr("searching localdocs: ") + currentChat.collectionList.join(", ") + " ..."; case Chat.LocalDocsProcessing: return qsTr("searching localdocs: %1 ...").arg(currentChat.collectionList.join(", "));
case Chat.PromptProcessing: return qsTr("processing ...") case Chat.PromptProcessing: return qsTr("processing ...")
case Chat.ResponseGeneration: return qsTr("generating response ..."); case Chat.ResponseGeneration: return qsTr("generating response ...");
case Chat.GeneratingQuestions: return qsTr("generating questions ..."); case Chat.GeneratingQuestions: return qsTr("generating questions ...");
@ -1005,7 +1005,7 @@ Rectangle {
Accessible.role: Accessible.Paragraph Accessible.role: Accessible.Paragraph
Accessible.name: text Accessible.name: text
Accessible.description: name === qsTr("Response: ") ? "The response by the model" : "The prompt by the user" Accessible.description: name === "Response: " ? "The response by the model" : "The prompt by the user"
} }
ThumbsDownDialog { ThumbsDownDialog {
@ -1031,7 +1031,7 @@ Rectangle {
Column { Column {
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
Layout.rightMargin: 15 Layout.rightMargin: 15
visible: name === qsTr("Response: ") && visible: name === "Response: " &&
(!currentResponse || !currentChat.responseInProgress) && MySettings.networkIsActive (!currentResponse || !currentChat.responseInProgress) && MySettings.networkIsActive
spacing: 10 spacing: 10
@ -1692,7 +1692,7 @@ Rectangle {
var listElement = chatModel.get(index); var listElement = chatModel.get(index);
currentChat.regenerateResponse() currentChat.regenerateResponse()
if (chatModel.count) { if (chatModel.count) {
if (listElement.name === qsTr("Response: ")) { if (listElement.name === "Response: ") {
chatModel.updateCurrentResponse(index, true); chatModel.updateCurrentResponse(index, true);
chatModel.updateStopped(index, false); chatModel.updateStopped(index, false);
chatModel.updateThumbsUpState(index, false); chatModel.updateThumbsUpState(index, false);
@ -1766,7 +1766,7 @@ Rectangle {
padding: 15 padding: 15
topPadding: 8 topPadding: 8
bottomPadding: 8 bottomPadding: 8
text: qsTr("Reload \u00B7 ") + currentChat.modelInfo.name text: qsTr("Reload \u00B7 %1").arg(currentChat.modelInfo.name)
fontPixelSize: theme.fontSizeSmall fontPixelSize: theme.fontSizeSmall
Accessible.description: qsTr("Reloads the model") Accessible.description: qsTr("Reloads the model")
} }

View File

@ -250,9 +250,7 @@ Rectangle {
Layout.leftMargin: 20 Layout.leftMargin: 20
visible: downloadError !== "" visible: downloadError !== ""
textFormat: Text.StyledText textFormat: Text.StyledText
text: "<strong><font size=\"1\">" text: qsTr("<strong><font size=\"1\"><a href=\"#error\">Error</a></strong></font>")
+ qsTr("<a href=\"#error\">Error</a>")
+ "</strong></font>"
color: theme.textColor color: theme.textColor
font.pixelSize: theme.fontSizeLarge font.pixelSize: theme.fontSizeLarge
linkColor: theme.textErrorColor linkColor: theme.textErrorColor
@ -271,10 +269,7 @@ Rectangle {
Layout.leftMargin: 20 Layout.leftMargin: 20
Layout.maximumWidth: 300 Layout.maximumWidth: 300
textFormat: Text.StyledText textFormat: Text.StyledText
text: qsTr("<strong><font size=\"2\">WARNING: Not recommended for your hardware.") text: qsTr("<strong><font size=\"2\">WARNING: Not recommended for your hardware. Model requires more memory (%1 GB) than your system has available (%2).</strong></font>").arg(ramrequired).arg(LLM.systemTotalRAMInGBString())
+ qsTr(" Model requires more memory (") + ramrequired
+ qsTr(" GB) than your system has available (")
+ LLM.systemTotalRAMInGBString() + ").</strong></font>"
color: theme.textErrorColor color: theme.textErrorColor
font.pixelSize: theme.fontSizeLarge font.pixelSize: theme.fontSizeLarge
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
@ -426,7 +421,7 @@ Rectangle {
color: theme.mutedDarkTextColor color: theme.mutedDarkTextColor
} }
Text { Text {
text: ramrequired >= 0 ? ramrequired + qsTr(" GB") : "?" text: ramrequired >= 0 ? qsTr("%1 GB").arg(ramrequired) : qsTr("?")
color: theme.textColor color: theme.textColor
font.pixelSize: theme.fontSizeSmall font.pixelSize: theme.fontSizeSmall
font.bold: true font.bold: true

View File

@ -64,10 +64,7 @@ MyDialog {
id: welcome id: welcome
width: 1024 - 40 width: 1024 - 40
textFormat: TextEdit.MarkdownText textFormat: TextEdit.MarkdownText
text: qsTr("### Release notes\n") text: qsTr("### Release notes\n%1### Contributors\n%2").arg(Download.releaseInfo.notes).arg(Download.releaseInfo.contributors)
+ Download.releaseInfo.notes
+ qsTr("### Contributors\n")
+ Download.releaseInfo.contributors
focus: false focus: false
readOnly: true readOnly: true
Accessible.role: Accessible.Paragraph Accessible.role: Accessible.Paragraph

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff