1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-04-03 20:32:07 -04:00

Wrapped all missing i18n strings (#2013)

* Feat(i18n): wrapped missing strings

* Feat(i18n): wrapped missing strings

* feat(i18n): added pluralization to some strings

* feat: updated en.json and template.json

* Update en.json

* Update template.json
This commit is contained in:
Youseffo13
2026-03-17 17:43:23 +01:00
committed by GitHub
parent 0cf2c40377
commit 5c4ce86da4
21 changed files with 4824 additions and 6174 deletions

View File

@@ -26,7 +26,9 @@ Rectangle {
spacing: 2
StyledText {
text: keyboardHints.enterToPaste ? I18n.tr("↑/↓: Navigate • Enter: Paste • Del: Delete • F10: Help", "Keyboard hints when enter-to-paste is enabled") : "↑/↓: Navigate • Enter/Ctrl+C: Copy • Del: Delete • F10: Help"
text: keyboardHints.enterToPaste
? I18n.tr("↑/↓: Navigate • Enter: Paste • Del: Delete • F10: Help", "Keyboard hints when enter-to-paste is enabled")
: I18n.tr("↑/↓: Navigate • Enter/Ctrl+C: Copy • Del: Delete • F10: Help")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
anchors.horizontalCenter: parent.horizontalCenter

View File

@@ -304,7 +304,17 @@ DankModal {
anchors.right: parent.right
anchors.rightMargin: Theme.spacingS
anchors.verticalCenter: parent.verticalCenter
text: I18n.tr("%1 active, %2 filtered").arg(MuxService.sessions.length).arg(muxModal.filteredSessions.length)
text: {
const total = MuxService.sessions.length;
const filtered = muxModal.filteredSessions.length;
const activePart = total === 1
? I18n.tr("%1 active session").arg(total)
: I18n.tr("%1 active sessions").arg(total);
const filteredPart = filtered === 1
? I18n.tr("%1 filtered").arg(filtered)
: I18n.tr("%1 filtered").arg(filtered);
return activePart + ", " + filteredPart;
}
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceVariantText
}
@@ -468,7 +478,9 @@ DankModal {
text: {
var parts = []
if (modelData.windows !== "N/A")
parts.push(I18n.tr("%1 windows").arg(modelData.windows))
parts.push(modelData.windows === 1
? I18n.tr("%1 window").arg(modelData.windows)
: I18n.tr("%1 windows").arg(modelData.windows))
parts.push(modelData.attached ? I18n.tr("attached") : I18n.tr("detached"))
return parts.join(" \u2022 ")
}

View File

@@ -66,7 +66,7 @@ DankModal {
}
StyledText {
text: `Details for "${networkSSID}"`
text: I18n.tr("Details for \"%1\"").arg(networkSSID)
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceTextMedium
width: parent.width
@@ -102,7 +102,7 @@ DankModal {
id: detailsText
width: parent.width
text: NetworkService.networkInfoDetails && NetworkService.networkInfoDetails.replace(/\\n/g, '\n') || "No information available"
text: NetworkService.networkInfoDetails && NetworkService.networkInfoDetails.replace(/\\n/g, '\n') || I18n.tr("No information available")
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceText
wrapMode: Text.WordWrap

View File

@@ -66,7 +66,7 @@ DankModal {
}
StyledText {
text: `Details for "${networkID}"`
text: I18n.tr("Details for \"%1\"").arg(networkSSID)
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceTextMedium
width: parent.width
@@ -102,7 +102,7 @@ DankModal {
id: detailsText
width: parent.width
text: NetworkService.networkWiredInfoDetails && NetworkService.networkWiredInfoDetails.replace(/\\n/g, '\n') || "No information available"
text: NetworkService.networkWiredInfoDetails && NetworkService.networkWiredInfoDetails.replace(/\\n/g, '\n') || I18n.tr("No information available")
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceText
wrapMode: Text.WordWrap

View File

@@ -22,12 +22,12 @@ DankPopout {
function setProfile(profile) {
if (typeof PowerProfiles === "undefined") {
ToastService.showError("power-profiles-daemon not available");
ToastService.showError(I18n.tr("power-profiles-daemon not available"));
return;
}
PowerProfiles.profile = profile;
if (PowerProfiles.profile !== profile) {
ToastService.showError("Failed to set power profile");
ToastService.showError(I18n.tr("Failed to set power profile"));
}
}
@@ -173,10 +173,10 @@ DankPopout {
width: parent.width - Theme.iconSizeLarge - 32 - Theme.spacingM * 2
readonly property string timeInfoText: {
if (!BatteryService.batteryAvailable)
return "Power profile management available";
return I18n.tr("Power profile management available");
const time = BatteryService.formatTimeRemaining();
if (time !== "Unknown") {
return BatteryService.isCharging ? `Time until full: ${time}` : `Time remaining: ${time}`;
return BatteryService.isCharging ? I18n.tr("Time until full: %1").arg(time) : I18n.tr("Time remaining: %1").arg(time);
}
return "";
}
@@ -188,7 +188,7 @@ DankPopout {
spacing: Theme.spacingS
StyledText {
text: BatteryService.batteryAvailable ? `${BatteryService.batteryLevel}%` : "Power"
text: BatteryService.batteryAvailable ? `${BatteryService.batteryLevel}%` : I18n.tr("Power")
font.pixelSize: Theme.fontSizeXLarge
color: {
if (BatteryService.isLowBattery && !BatteryService.isCharging) {
@@ -338,7 +338,7 @@ DankPopout {
}
StyledText {
text: BatteryService.batteryCapacity > 0 ? `${BatteryService.batteryCapacity.toFixed(1)} Wh` : "Unknown"
text: BatteryService.batteryCapacity > 0 ? `${BatteryService.batteryCapacity.toFixed(1)} Wh` : I18n.tr("Unknown")
font.pixelSize: Theme.fontSizeLarge
color: Theme.surfaceText
font.weight: Font.Bold
@@ -393,7 +393,7 @@ DankPopout {
width: parent.width - percentText.width - chargingIcon.width - Theme.spacingM * 2
StyledText {
text: modelData.model || `Battery ${index + 1}`
text: modelData.model || I18n.tr("Battery %1").arg(index + 1)
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
font.weight: Font.Medium

View File

@@ -320,7 +320,7 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter
StyledText {
text: activePlayer?.trackTitle || "Unknown Track"
text: activePlayer?.trackTitle || I18n.tr("Unknown Track")
font.pixelSize: Theme.fontSizeLarge
font.weight: Font.Bold
color: Theme.surfaceText
@@ -332,7 +332,7 @@ Item {
}
StyledText {
text: activePlayer?.trackArtist || "Unknown Artist"
text: activePlayer?.trackTitle || I18n.tr("Unknown Artist")
font.pixelSize: Theme.fontSizeMedium
color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.8)
width: parent.width
@@ -669,7 +669,7 @@ Item {
const screenY = popoutY + contentOffsetY + btnY;
showPlayersDropdown(Qt.point(screenX, screenY), targetScreen, buttonsOnRight, activePlayer, allPlayers);
}
onEntered: sharedTooltip.show("Media Players", playerSelectorButton, 0, 0, isRightEdge ? "right" : "left")
onEntered: sharedTooltip.show(I18n.tr("Media Players"), playerSelectorButton, 0, 0, isRightEdge ? "right" : "left")
onExited: sharedTooltip.hide()
}
}
@@ -788,7 +788,7 @@ Item {
const screenY = popoutY + contentOffsetY + btnY;
showAudioDevicesDropdown(Qt.point(screenX, screenY), targetScreen, buttonsOnRight);
}
onEntered: sharedTooltip.show("Output Device", audioDevicesButton, 0, 0, isRightEdge ? "right" : "left")
onEntered: sharedTooltip.show(I18n.tr("Output Device"), audioDevicesButton, 0, 0, isRightEdge ? "right" : "left")
onExited: sharedTooltip.hide()
}
}

View File

@@ -88,7 +88,7 @@ Card {
topPadding: Theme.spacingL
StyledText {
text: activePlayer?.trackTitle || "Unknown"
text: activePlayer?.trackTitle || I18n.tr("Unknown")
font.pixelSize: Theme.fontSizeSmall
font.weight: Font.Medium
color: Theme.surfaceText
@@ -99,7 +99,7 @@ Card {
}
StyledText {
text: activePlayer?.trackArtist || "Unknown Artist"
text: activePlayer?.trackArtist || I18n.tr("Unknown Artist")
font.pixelSize: Theme.fontSizeSmall
color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7)
width: parent.width

View File

@@ -28,7 +28,7 @@ Card {
}
StyledText {
text: WeatherService.weather.loading ? "Loading..." : "No Weather"
text: WeatherService.weather.loading ? I18n.tr("Loading...") : I18n.tr("No Weather")
font.pixelSize: Theme.fontSizeSmall
color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7)
anchors.horizontalCenter: parent.horizontalCenter

View File

@@ -538,7 +538,11 @@ Item {
StyledText {
anchors.verticalCenter: parent.verticalCenter
text: wallpaperFolderModel.count > 0 ? `${wallpaperFolderModel.count} wallpapers ${currentPage + 1} / ${totalPages}` : "No wallpapers"
text: wallpaperFolderModel.count > 0
? (wallpaperFolderModel.count === 1
? I18n.tr("%1 wallpaper • %2 / %3").arg(wallpaperFolderModel.count).arg(currentPage + 1).arg(totalPages)
: I18n.tr("%1 wallpapers • %2 / %3").arg(wallpaperFolderModel.count).arg(currentPage + 1).arg(totalPages))
: I18n.tr("No wallpapers")
font.pixelSize: 14
color: Theme.surfaceText
opacity: 0.7

View File

@@ -230,19 +230,19 @@ Item {
function currentAuthMessage() {
if (GreeterState.pamState === "error")
return "Authentication error - try again";
return I18n.tr("Authentication error - try again");
if (GreeterState.pamState === "max")
return "Too many failed attempts - account may be locked";
return I18n.tr("Too many failed attempts - account may be locked");
if (GreeterState.pamState === "fail") {
if (passwordAttemptLimitHint > 0) {
const attempt = Math.max(1, Math.min(passwordFailureCount, passwordAttemptLimitHint));
const remaining = Math.max(passwordAttemptLimitHint - attempt, 0);
if (remaining > 0) {
return "Incorrect password - attempt " + attempt + " of " + passwordAttemptLimitHint + " (lockout may follow)";
return I18n.tr("Incorrect password - attempt %1 of %2 (lockout may follow)").arg(attempt).arg(passwordAttemptLimitHint);
}
return "Incorrect password - next failures may trigger account lockout";
return I18n.tr("Incorrect password - next failures may trigger account lockout");
}
return "Incorrect password";
return I18n.tr("Incorrect password");
}
return "";
}
@@ -1012,15 +1012,15 @@ Item {
anchors.verticalCenter: parent.verticalCenter
text: {
if (GreeterState.unlocking) {
return "Logging in...";
return I18n.tr("Logging in...");
}
if (Greetd.state !== GreetdState.Inactive && !awaitingExternalAuth && !pendingPasswordResponse) {
return "Authenticating...";
return I18n.tr("Authenticating...");
}
if (GreeterState.showPasswordInput) {
return "Password...";
return I18n.tr("Password...");
}
return "Username...";
return I18n.tr("Username...");
}
color: (GreeterState.unlocking || (Greetd.state !== GreetdState.Inactive && !awaitingExternalAuth && !pendingPasswordResponse)) ? Theme.primary : Theme.outline
font.pixelSize: Theme.fontSizeMedium

View File

@@ -832,13 +832,21 @@ Column {
spacing: Theme.spacingL
StyledText {
text: textArea.text.length > 0 ? I18n.tr("%1 characters").arg(textArea.text.length) : I18n.tr("Empty")
text: {
const len = textArea.text.length;
if (len === 0) return I18n.tr("Empty");
return len === 1
? I18n.tr("%1 character").arg(len)
: I18n.tr("%1 characters").arg(len);
}
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceTextMedium
}
StyledText {
text: I18n.tr("Lines: %1").arg(textArea.lineCount)
text: textArea.lineCount === 1
? I18n.tr("Line: %1").arg(textArea.lineCount)
: I18n.tr("Lines: %1").arg(textArea.lineCount)
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceTextMedium
visible: textArea.text.length > 0

View File

@@ -713,7 +713,7 @@ Rectangle {
StyledText {
id: expandedActionText
text: {
const baseText = modelData.text || "Open";
const baseText = modelData.text || I18n.tr("Open");
if (keyboardNavigationActive && (isGroupSelected || selectedNotificationIndex >= 0))
return `${baseText} (${index + 1})`;
return baseText;
@@ -849,7 +849,7 @@ Rectangle {
StyledText {
id: collapsedActionText
text: {
const baseText = modelData.text || "Open";
const baseText = modelData.text || I18n.tr("Open");
if (keyboardNavigationActive && isGroupSelected) {
return `${baseText} (${index + 1})`;
}

View File

@@ -85,7 +85,7 @@ Rectangle {
function getTimeoutText(value) {
if (value === undefined || value === null || isNaN(value)) {
return "5 seconds";
return I18n.tr("5 seconds");
}
for (let i = 0; i < timeoutOptions.length; i++) {
@@ -94,15 +94,15 @@ Rectangle {
}
}
if (value === 0) {
return "Never";
return I18n.tr("Never");
}
if (value < 1000) {
return value + "ms";
}
if (value < 60000) {
return Math.round(value / 1000) + " seconds";
return Math.round(value / 1000) + " " + I18n.tr("seconds");
}
return Math.round(value / 60000) + " minutes";
return Math.round(value / 60000) + " " + I18n.tr("minutes");
}
Column {
@@ -169,7 +169,7 @@ Rectangle {
DankDropdown {
text: I18n.tr("Low Priority")
description: "Timeout for low priority notifications"
description: I18n.tr("Timeout for low priority notifications")
currentValue: getTimeoutText(SettingsData.notificationTimeoutLow)
options: timeoutOptions.map(opt => opt.text)
onValueChanged: value => {
@@ -184,7 +184,7 @@ Rectangle {
DankDropdown {
text: I18n.tr("Normal Priority")
description: "Timeout for normal priority notifications"
description: I18n.tr("Timeout for normal priority notifications")
currentValue: getTimeoutText(SettingsData.notificationTimeoutNormal)
options: timeoutOptions.map(opt => opt.text)
onValueChanged: value => {
@@ -199,7 +199,7 @@ Rectangle {
DankDropdown {
text: I18n.tr("Critical Priority")
description: "Timeout for critical priority notifications"
description: I18n.tr("Timeout for critical priority notifications")
currentValue: getTimeoutText(SettingsData.notificationTimeoutCritical)
options: timeoutOptions.map(opt => opt.text)
onValueChanged: value => {
@@ -225,6 +225,8 @@ Rectangle {
Row {
id: overlayRow
anchors.left: parent.left
anchors.right: overlayToggle.left
anchors.rightMargin: Theme.spacingM
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingM
@@ -238,17 +240,22 @@ Rectangle {
Column {
spacing: 2
anchors.verticalCenter: parent.verticalCenter
width: overlayRow.width - Theme.iconSizeSmall - Theme.spacingM
StyledText {
width: parent.width
text: I18n.tr("Notification Overlay")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
wrapMode: Text.Wrap
}
StyledText {
width: parent.width
text: I18n.tr("Display all priorities over fullscreen apps")
font.pixelSize: Theme.fontSizeSmall - 1
color: Theme.surfaceVariantText
wrapMode: Text.Wrap
}
}
}
@@ -269,6 +276,8 @@ Rectangle {
Row {
id: privacyRow
anchors.left: parent.left
anchors.right: privacyToggle.left
anchors.rightMargin: Theme.spacingM
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.spacingM
@@ -282,17 +291,22 @@ Rectangle {
Column {
spacing: 2
anchors.verticalCenter: parent.verticalCenter
width: privacyRow.width - Theme.iconSizeSmall - Theme.spacingM
StyledText {
width: parent.width
text: I18n.tr("Privacy Mode")
font.pixelSize: Theme.fontSizeSmall
color: Theme.surfaceText
wrapMode: Text.Wrap
}
StyledText {
width: parent.width
text: I18n.tr("Hide notification content until expanded")
font.pixelSize: Theme.fontSizeSmall - 1
color: Theme.surfaceVariantText
wrapMode: Text.Wrap
}
}
}

View File

@@ -68,22 +68,22 @@ Item {
property string compositorTooltip: {
if (isHyprland)
return "Hyprland Website";
return I18n.tr("Hyprland Website");
if (isSway)
return "Sway Website";
return I18n.tr("Sway Website");
if (isScroll)
return "Scroll Github";
return I18n.tr("Scroll GitHub");
if (isMiracle)
return "Miracle WM GitHub";
return I18n.tr("Scroll GitHub");
if (isDwl)
return "mangowc GitHub";
return I18n.tr("mangowc GitHub");
if (isLabwc)
return "LabWC Website";
return "niri GitHub";
return I18n.tr("LabWC Website");
return I18n.tr("niri GitHub");
}
property string dmsDiscordUrl: "https://discord.gg/ppWTpKmPgT"
property string dmsDiscordTooltip: "niri/dms Discord"
property string dmsDiscordTooltip: I18n.tr("niri/dms Discord")
property string compositorDiscordUrl: {
if (isHyprland)
@@ -95,17 +95,17 @@ Item {
property string compositorDiscordTooltip: {
if (isHyprland)
return "Hyprland Discord Server";
return I18n.tr("Hyprland Discord Server");
if (isDwl)
return "mangowc Discord Server";
return I18n.tr("mangowc Discord Server");
return "";
}
property string redditUrl: "https://reddit.com/r/niri"
property string redditTooltip: "r/niri Subreddit"
property string redditTooltip: I18n.tr("r/niri Subreddit")
property string ircUrl: "https://web.libera.chat/gamja/?channels=#labwc"
property string ircTooltip: "LabWC IRC Channel"
property string ircTooltip: I18n.tr("LabWC IRC Channel")
property bool showMatrix: isNiri && !isHyprland && !isSway && !isScroll && !isMiracle && !isDwl && !isLabwc
property bool showCompositorDiscord: isHyprland || isDwl
@@ -396,7 +396,7 @@ Item {
visible: showMatrix
property bool hovered: false
property string tooltipText: "niri Matrix Chat"
property string tooltipText: I18n.tr("niri Matrix Chat")
Image {
anchors.fill: parent
@@ -582,9 +582,7 @@ Item {
}
StyledText {
text: I18n.tr(`dms is a highly customizable, modern desktop shell with a <a href="https://m3.material.io/" style="text-decoration:none; color:${Theme.primary};">material 3 inspired</a> design.
<br /><br/>It is built with <a href="https://quickshell.org" style="text-decoration:none; color:${Theme.primary};">Quickshell</a>, a QT6 framework for building desktop shells, and <a href="https://go.dev" style="text-decoration:none; color:${Theme.primary};">Go</a>, a statically typed, compiled programming language.
`)
text: I18n.tr('dms is a highly customizable, modern desktop shell with a <a href="https://m3.material.io/" style="text-decoration:none; color:%1;">material 3 inspired</a> design.<br /><br/>It is built with <a href="https://quickshell.org" style="text-decoration:none; color:%1;">Quickshell</a>, a QT6 framework for building desktop shells, and <a href="https://go.dev" style="text-decoration:none; color:%1;">Go</a>, a statically typed, compiled programming language.').arg(Theme.primary)
textFormat: Text.RichText
font.pixelSize: Theme.fontSizeMedium
linkColor: Theme.primary
@@ -825,7 +823,7 @@ Item {
StyledText {
anchors.horizontalCenter: parent.horizontalCenter
text: `<a href="https://github.com/AvengeMedia/DankMaterialShell/blob/master/LICENSE" style="text-decoration:none; color:${Theme.surfaceVariantText};">MIT License</a>`
text: I18n.tr('<a href="https://github.com/AvengeMedia/DankMaterialShell/blob/master/LICENSE" style="text-decoration:none; color:%1;">MIT License</a>').arg(Theme.surfaceVariantText)
font.pixelSize: Theme.fontSizeMedium
color: Theme.surfaceVariantText
textFormat: Text.RichText

View File

@@ -181,11 +181,11 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter
model: [
{
"text": "Time",
"text": I18n.tr("Time"),
"icon": "access_time"
},
{
"text": "Location",
"text": I18n.tr("Location"),
"icon": "place"
}
]

View File

@@ -542,7 +542,14 @@ Item {
}
StyledText {
text: KeybindsService.loading ? I18n.tr("Shortcuts") : I18n.tr("Shortcuts (%1)").arg(keybindsTab._filteredBinds.length)
text: {
if (KeybindsService.loading)
return I18n.tr("Shortcuts");
const count = keybindsTab._filteredBinds.length;
return count === 1
? I18n.tr("Shortcut (%1)").arg(count)
: I18n.tr("Shortcuts (%1)").arg(count);
}
font.pixelSize: Theme.fontSizeMedium
font.weight: Font.Medium
color: Theme.surfaceText

View File

@@ -2854,7 +2854,7 @@ Item {
}
StyledText {
text: I18n.tr(`Generate baseline GTK3/4 or QT5/QT6 (requires qt6ct-kde) configurations to follow DMS colors. Only needed once.<br /><br />It is recommended to configure <a href="https://github.com/AvengeMedia/DankMaterialShell/blob/master/README.md#Theming" style="text-decoration:none; color:${Theme.primary};">adw-gtk3</a> prior to applying GTK themes.`)
text: I18n.tr('Generate baseline GTK3/4 or QT5/QT6 (requires qt6ct-kde) configurations to follow DMS colors. Only needed once.<br /><br />It is recommended to configure <a href="https://github.com/AvengeMedia/DankMaterialShell/blob/master/README.md#Theming" style="text-decoration:none; color:%1;">adw-gtk3</a> prior to applying GTK themes.').arg(Theme.primary)
textFormat: Text.RichText
linkColor: Theme.primary
onLinkActivated: url => Qt.openUrlExternally(url)

View File

@@ -138,7 +138,7 @@ Item {
{
"id": "gpuTemp",
"text": I18n.tr("GPU Temperature"),
"description": "",
"description": I18n.tr("GPU temperature display"),
"icon": "auto_awesome_mosaic",
"warning": !DgopService.dgopAvailable ? I18n.tr("Requires 'dgop' tool") : I18n.tr("This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics."),
"enabled": DgopService.dgopAvailable

View File

@@ -67,12 +67,14 @@ DankPopout {
anchors.verticalCenter: parent.verticalCenter
text: {
if (SystemUpdateService.isChecking)
return "Checking...";
return I18n.tr("Checking...");
if (SystemUpdateService.hasError)
return "Error";
return I18n.tr("Error");
if (SystemUpdateService.updateCount === 0)
return "Up to date";
return SystemUpdateService.updateCount + " updates";
return I18n.tr("Up to date");
return SystemUpdateService.updateCount === 1
? I18n.tr("%1 update").arg(SystemUpdateService.updateCount)
: I18n.tr("%1 updates").arg(SystemUpdateService.updateCount);
}
font.pixelSize: Theme.fontSizeMedium
color: {
@@ -136,18 +138,20 @@ DankPopout {
width: parent.width
text: {
if (SystemUpdateService.hasError) {
return "Failed to check for updates:\n" + SystemUpdateService.errorMessage;
return I18n.tr("Failed to check for updates:\n%1").arg(SystemUpdateService.errorMessage);
}
if (!SystemUpdateService.helperAvailable) {
return "No package manager found. Please install 'paru' or 'yay' on Arch-based systems to check for updates.";
return I18n.tr("No package manager found. Please install 'paru' or 'yay' on Arch-based systems to check for updates.");
}
if (SystemUpdateService.isChecking) {
return "Checking for updates...";
return I18n.tr("Checking for updates...");
}
if (SystemUpdateService.updateCount === 0) {
return "Your system is up to date!";
return I18n.tr("Your system is up to date!");
}
return `Found ${SystemUpdateService.updateCount} packages to update:`;
return SystemUpdateService.updateCount === 1
? I18n.tr("Found %1 package to update:").arg(SystemUpdateService.updateCount)
: I18n.tr("Found %1 packages to update:").arg(SystemUpdateService.updateCount);
}
font.pixelSize: Theme.fontSizeMedium
color: {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff