This commit is contained in:
thororen1234 2025-11-26 15:01:09 -05:00
parent 082b86e879
commit 116348eab1
No known key found for this signature in database
7 changed files with 168 additions and 91 deletions

View file

@ -1,8 +1,8 @@
{
"description": "Assists with translating Vencord",
"description": "Assists with translating Equicord",
"settings": {
"forceLocale": {
"description": "Force a different locale for Vencord to use",
"description": "Force a different locale for Equicord to use",
"followDiscord": "Default (follow Discord)"
},
"showMissingKeys": "If the current locale is missing translations, show the keys instead of falling back to English"

View file

@ -1,4 +1,22 @@
{
"donate": "Donate",
"invite": "Invite",
"loading": "Loading...",
"logs": {
"cancel": "Cancel",
"clearLog": "Clear Log",
"clearLogConfirmation": "Are you sure you would like to clear this log? This can't be undone.",
"logCleared": "Log has been cleared",
"clearLogs": "Clear Logs",
"clearLogsConfirmation": "Are you sure you would like to clear these logs? This can't be undone.",
"logsCleared": "Selected logs have been cleared",
"hideLogs": "Hide Logs",
"showLogs": "Show Logs",
"clearAllLogs": "Clear All Logs",
"clearAll": "Clear All",
"clearAllLogsConfirmation": "Are you sure you would like to clear all logs? This can't be undone.",
"allLogsCleared": "All logs have been cleared"
},
"addonCard": {
"new": "NEW"
},
@ -18,8 +36,6 @@
"subtitle": "Thank you for contributing!",
"title": "Contributions"
},
"donate": "Donate",
"invite": "Invite",
"donorCard": {
"donated": {
"vencordDescription": "All Vencord users can see your badge! You can manage your perks by messaging @{v}.",
@ -68,13 +84,74 @@
"plugins_one": "This person has <0>contributed</0> to {count} plugin!",
"plugins_other": "This person has <0>contributed</0> to {count} plugins!"
}
}
},
"requiredToFunction": "This plugin is required for Equicord to function",
"pluginRequiredBy": "This plugin is required by: {pluginNames}",
"noDescription": "No description available",
},
"changelog": {
"manager": {
"minutes_one": "{count} minute ago",
"minutes_other": "{count} minutes ago",
"hours_one": "{count} hour ago",
"hours_other": "{count} hours ago",
"days_one": "{count} day ago",
"days_other": "{count} days ago"
},
"updateCard": {
"upToDate": "Repository check: {fromHash} (up to date)",
"outOfDate": "Repository check: {fromHash} → {toHash}",
"update": "Update: {fromHash} → {toHash}",
"commits_zero": " • No new commits",
"commits_one": " • {count} commit available",
"commits_other": " • {count} commits available",
"newPluginsCount": " • {plugins} new plugins",
"updatedPluginsCount": " • {plugins} updated plugins",
"newSettingsCount": " • {settings} new settings",
"updatedPlugins": "Updated Plugins",
"newSettings": "New Settings",
"newSettingInPlugin": "New setting in {pluginName}"
},
"newPluginsSection": {
"newPluginsCount": "New Plugins ({count})",
"recentlyAddedPlugins": "The following plugins have been added in recent updates:",
"numMorePlugins_one": "+{count} more plugin",
"numMorePlugins_other": "+{count} more plugins"
},
"missingRepoInfo": "Failed to retrieve repository information",
"alreadyUpToDate": "Already up todate with repository",
"foundCommits_zero": "No new commits",
"foundCommits_one": "Found {count} commit from repository",
"foundCommits_other": "Found {count} commits from repository",
"loggedCommits": "Logged commits from your latest update",
"upToDateLocalCopy": "Repository is up to date with your local copy",
"failedToFetchRepo": "Failed to fetch from repository",
"checkYourConnection": "Failed to connect to repository. Check your internet connection",
"failedtoFetchCommits": "Could not fetch commits from repository",
"repository": "Repository",
"viewRecentChanges": "View the most recent changes to Equicord. This fetches commits directly from the repository to show you what's new",
"failedToRetrieve": "Failed to retrieve - check console",
"upToDate": "Repository Up To Date",
"fetchRepo": "Fetch from Repository",
"checkYourInternet": "Make sure you have an internet connection and try again",
"recentChanges": "Recent Changes",
"updatedPluginsCount": "Updated Plugins ({plugins})",
"codeChanges_zero": "No Code Changes",
"codeChanges_one": "Code Changes ({count} commit)",
"codeChanges_other": "Code Changes ({count} commits)",
"emptyChangelog": "No commits available ahead of your current version. Click \"Fetch from Repository\" to check for new changes",
"updateLogs_zero": "No Update Logs",
"updateLogs_one": "Update Logs ({count} log)",
"updateLogs_other": "Update Logs ({count} logs)",
"previousSessions": "Previous update sessions with their commit history and plugin changes",
"title": "Changelog"
},
"restartRequired": {
"body": "A restart is required to apply this change",
"cancel": "Later!",
"confirm": "Restart now",
"title": "Restart Required"
"title": "Restart Required",
"plugins": "The following plugins require a restart:"
},
"title": "Settings",
"transparent": {

View file

@ -13,6 +13,7 @@ import { PluginCard } from "@components/settings/tabs/plugins/PluginCard";
import { ChangeList } from "@utils/ChangeList";
import { Margins } from "@utils/margins";
import { useForceUpdater } from "@utils/react";
import { t } from "@utils/translation";
import { Button, React, Tooltip } from "@webpack/common";
import Plugins from "~plugins";
@ -78,11 +79,11 @@ export function NewPluginsSection({
return (
<div className={cl("new-plugins-section")}>
<Heading className={Margins.bottom8}>
New Plugins ({sortedPlugins.length})
{t("vencord.settings.changelog.newPluginsSection.newPluginsCount", { count: sortedPlugins.length })}
</Heading>
<Paragraph className={Margins.bottom16}>
The following plugins have been added in recent updates:
{t("vencord.settings.changelog.newPluginsSection.recentlyAddedPlugins")}
</Paragraph>
<div className={cl("new-plugins-grid")}>
@ -94,7 +95,7 @@ export function NewPluginsSection({
) ||
plugin.name.endsWith("API");
const tooltipText = plugin.required
? "This plugin is required for Equicord to function."
? t("vencord.settings.plugins.requiredToFunction")
: makeDependencyList(
depMap[plugin.name]?.filter(
d => settings.plugins[d].enabled,
@ -152,7 +153,7 @@ export function NewPluginsSection({
<Tooltip
text={
<>
The following plugins require a restart:
{t("vencord.settings.restartRequired.plugins")}
<div className={Margins.bottom8} />
<ul>
{changes.map(p => (
@ -170,7 +171,7 @@ export function NewPluginsSection({
onClick={() => location.reload()}
className={Margins.top16}
>
Restart Required
{t("vencord.settings.restartRequired.title")}
</Button>
)}
</Tooltip>
@ -202,11 +203,9 @@ function CompactPluginCard({
depMap[plugin.name]?.some(d => settings.plugins[d].enabled);
const tooltipText = plugin.required
? "This plugin is required for Equicord to function."
? t("vencord.settings.plugins.requiredToFunction")
: depMap[plugin.name]?.length > 0
? `This plugin is required by: ${depMap[plugin.name]
?.filter(d => settings.plugins[d].enabled)
.join(", ")}`
? t("vencord.settings.plugins.pluginRequiredBy", { pluginNames: depMap[plugin.name]?.filter(d => settings.plugins[d].enabled).join(", ") })
: null;
return (
@ -221,7 +220,7 @@ function CompactPluginCard({
</span>
</div>
<div className="vc-changelog-entry-message">
{plugin.description || "No description available"}
{plugin.description || t("vencord.settings.plugins.noDescription")}
</div>
{tooltipText && (
<div className="vc-changelog-dep-text">{tooltipText}</div>
@ -272,7 +271,7 @@ export function NewPluginsCompact({
{hasMore && (
<div className="vc-changelog-entry">
<div className="vc-changelog-entry-message">
+{newPlugins.length - maxDisplay} more plugins
{t("vencord.settings.changelog.newPluginsSection.numMorePlugins", { count: newPlugins.length - maxDisplay })}
</div>
</div>
)}

View file

@ -5,6 +5,7 @@
*/
import { DataStore } from "@api/index";
import { t } from "@utils/translation";
import gitHash from "~git-hash";
import plugins from "~plugins";
@ -479,11 +480,11 @@ export function formatTimestamp(timestamp: number): string {
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
if (diffMinutes < 60) {
return `${diffMinutes} minute${diffMinutes !== 1 ? "s" : ""} ago`;
return t("vencord.settings.changelog.manager.minutes", { count: diffMinutes });
} else if (diffHours < 24) {
return `${diffHours} hour${diffHours !== 1 ? "s" : ""} ago`;
return t("vencord.settings.changelog.manager.hours", { count: diffHours });
} else if (diffDays < 7) {
return `${diffDays} day${diffDays !== 1 ? "s" : ""} ago`;
return t("vencord.settings.changelog.manager.days", { count: diffDays });
} else {
return date.toLocaleDateString();
}

View file

@ -15,14 +15,13 @@ import { Link } from "@components/Link";
import { Paragraph } from "@components/Paragraph";
import { SettingsTab, wrapTab } from "@components/settings/tabs/BaseTab";
import { HashLink } from "@components/settings/tabs/updater/Components";
import { gitHashShort } from "@shared/vencordUserAgent";
import { gitHash, gitHashShort } from "@shared/vencordUserAgent";
import { Margins } from "@utils/margins";
import { useAwaiter } from "@utils/react";
import { t } from "@utils/translation";
import { getRepo, UpdateLogger } from "@utils/updater";
import { Alerts, Button, React, Toasts } from "@webpack/common";
import gitHash from "~git-hash";
import {
ChangelogEntry,
ChangelogHistory,
@ -111,9 +110,10 @@ function UpdateLogCard({
<span>
{isRepositoryFetch
? isUpToDate
? `Repository check: ${log.fromHash.slice(0, 7)} (up to date)`
: `Repository check: ${log.fromHash.slice(0, 7)} → ${log.toHash.slice(0, 7)}`
: `Update: ${log.fromHash.slice(0, 7)} → ${log.toHash.slice(0, 7)}`}
? t("vencord.settings.changelog.updateCard.upToDate", { fromHash: log.fromHash.slice(0, 7) })
: t("vencord.settings.changelog.updateCard.outOfDate", { fromHash: log.fromHash.slice(0, 7), toHash: log.toHash.slice(0, 7) })
: t("vencord.settings.changelog.updateCard.update", { fromHash: log.fromHash.slice(0, 7), toHash: log.toHash.slice(0, 7) })
}
</span>
<Button
size={Button.Sizes.NONE}
@ -139,16 +139,14 @@ function UpdateLogCard({
</div>
<div className="vc-changelog-log-meta">
{formatTimestamp(log.timestamp)}
{log.commits.length > 0 &&
` • ${log.commits.length} commits available`}
{log.commits.length === 0 && " • No new commits"}
{log.newPlugins.length > 0 &&
` • ${log.newPlugins.length} new plugins`}
{log.updatedPlugins.length > 0 &&
` • ${log.updatedPlugins.length} updated plugins`}
{t("vencord.settings.changelog.updateCard.commits", { count: log.commits.length })}
{log.newPlugins.length > 0 && t("vencord.settings.changelog.updateCard.newPluginsCount", { plugins: log.newPlugins.length })}
{log.updatedPlugins.length > 0 && t("vencord.settings.changelog.updateCard.updatedPluginsCount", { plugins: log.updatedPlugins.length })}
{log.newSettings &&
getNewSettingsSize(log.newSettings) > 0 &&
` • ${getNewSettingsEntries(log.newSettings).reduce((sum, [, arr]) => sum + arr.length, 0)} new settings`}
t("vencord.settings.changelog.updateCard.newSettingsCount", {
settings: getNewSettingsEntries(log.newSettings).reduce((sum, [, arr]) => sum + arr.length, 0)
})}
</div>
</div>
<div
@ -172,7 +170,7 @@ function UpdateLogCard({
{log.updatedPlugins.length > 0 && (
<div className="vc-changelog-log-plugins">
<Heading className={Margins.bottom8}>
Updated Plugins
{t("vencord.settings.changelog.updateCard.updatedPlugins")}
</Heading>
<NewPluginsCompact
newPlugins={log.updatedPlugins}
@ -185,7 +183,7 @@ function UpdateLogCard({
getNewSettingsSize(log.newSettings) > 0 && (
<div className="vc-changelog-log-plugins">
<Heading className={Margins.bottom8}>
New Settings
{t("vencord.settings.changelog.updateCard.newSettings")}
</Heading>
<div className="vc-changelog-new-plugins-list">
{getNewSettingsEntries(log.newSettings).map(
@ -194,7 +192,7 @@ function UpdateLogCard({
<span
key={`${pluginName}-${setting}`}
className="vc-changelog-new-plugin-tag"
title={`New setting in ${pluginName}`}
title={t("vencord.settings.changelog.updateCard.newSettingInPlugin", { pluginName: pluginName })}
>
{pluginName}.{setting}
</span>
@ -226,7 +224,7 @@ function UpdateLogCard({
function ChangelogContent() {
const [repo, repoErr, repoPending] = useAwaiter(getRepo, {
fallbackValue: "Loading...",
fallbackValue: t("vencord.loading"),
});
const [changelog, setChangelog] = React.useState<ChangelogEntry[]>([]);
const [changelogHistory, setChangelogHistory] =
@ -256,7 +254,7 @@ function ChangelogContent() {
React.useEffect(() => {
if (repoErr) {
UpdateLogger.error("Failed to retrieve repo", repoErr);
setError("Failed to retrieve repository information");
setError(t("vencord.settings.changelog.missingRepoInfo"));
}
}, [repoErr]);
@ -354,7 +352,7 @@ function ChangelogContent() {
if (!logged) {
setChangelog([]);
Toasts.show({
message: "Already up to date with repository",
message: t("vencord.settings.changelog.alreadyUpToDate"),
id: Toasts.genId(),
type: Toasts.Type.MESSAGE,
options: {
@ -386,7 +384,7 @@ function ChangelogContent() {
setRecentlyChecked(true);
Toasts.show({
message: `Found ${updates.value.length} commit${updates.value.length === 1 ? "" : "s"} from repository`,
message: t("vencord.settings.changelog.foundCommits", { count: updates.value.length }),
id: Toasts.genId(),
type: Toasts.Type.SUCCESS,
options: {
@ -398,8 +396,8 @@ function ChangelogContent() {
setRecentlyChecked(true);
Toasts.show({
message: logged
? "Logged commits from your latest update"
: "Repository is up to date with your local copy",
? t("vencord.settings.changelog.loggedCommits")
: t("vencord.settings.changelog.upToDateLocalCopy"),
id: Toasts.genId(),
type: logged ? Toasts.Type.SUCCESS : Toasts.Type.MESSAGE,
options: {
@ -412,19 +410,19 @@ function ChangelogContent() {
}
} else if (!updates.ok) {
throw new Error(
updates.error?.message || "Failed to fetch from repository",
updates.error?.message || t("vencord.settings.changelog.missingRepoInfo"),
);
}
} catch (err: any) {
UpdateLogger.error("Failed to fetch commits from repository", err);
const errorMessage =
err?.message ||
"Failed to connect to repository. Check your internet connection.";
t("vencord.settings.changelog.checkYourConnection");
setError(errorMessage);
// funny little error toast hopefully doesn't happen!
Toasts.show({
message: "Could not fetch commits from repository",
message: t("vencord.settings.changelog.failedtoFetchCommits"),
id: Toasts.genId(),
type: Toasts.Type.FAILURE,
options: {
@ -479,16 +477,15 @@ function ChangelogContent() {
return (
<>
<Paragraph className={Margins.bottom16}>
View the most recent changes to Equicord. This fetches commits
directly from the repository to show you what's new.
{t("vencord.settings.changelog.viewRecentChanges")}
</Paragraph>
<Heading>Repository</Heading>
<Heading>{t("vencord.settings.changelog.repository")}</Heading>
<Paragraph className={Margins.bottom16}>
{repoPending ? (
repo
) : repoErr ? (
"Failed to retrieve - check console"
t("vencord.settings.changelog.failedToRetrieve")
) : (
<Link href={repo}>
{repo.split("/").slice(-2).join("/")}
@ -513,10 +510,11 @@ function ChangelogContent() {
}
>
{isLoading
? "Loading..."
? t("vencord.loading")
: recentlyChecked
? "Repository Up to Date"
: "Fetch from Repository"}
? t("vencord.settings.changelog.upToDate")
: t("vencord.settings.changelog.fetchRepo")
}
</Button>
{changelogHistory.length > 0 && (
@ -531,25 +529,24 @@ function ChangelogContent() {
onClick={() => setShowHistory(!showHistory)}
style={{ marginLeft: "8px" }}
>
{showHistory ? "Hide Logs" : "Show Logs"}
{showHistory ? t("vencord.logs.hideLogs") : t("vencord.logs.showLogs")}
</Button>
<Button
size={Button.Sizes.SMALL}
color={Button.Colors.RED}
onClick={() => {
Alerts.show({
title: "Clear All Logs",
body: "Are you sure you would like to clear all logs? This can't be undone.",
confirmText: "Clear All",
title: t("vencord.logs.clearAllLogs"),
body: t("vencord.logs.clearAllLogsConfirmation"),
confirmText: t("vencord.logs.clearAll"),
confirmColor: "danger",
cancelText: "Cancel",
cancelText: t("vencord.cancel"),
onConfirm: async () => {
await clearChangelogHistory();
await loadChangelogHistory();
setShowHistory(false);
Toasts.show({
message:
"All logs have been cleared",
message: t("vencord.logs.allLogsCleared"),
id: Toasts.genId(),
type: Toasts.Type.SUCCESS,
options: {
@ -562,7 +559,7 @@ function ChangelogContent() {
}}
style={{ marginLeft: "8px" }}
>
Clear All Logs
{t("vencord.logs.clearAll")}
</Button>
</>
)}
@ -577,7 +574,7 @@ function ChangelogContent() {
color: "var(--text-muted)",
}}
>
Make sure you have an internet connection and try again.
{t("vencord.settings.changelog.checkYourInternet")}
</Paragraph>
</ErrorCard>
)}
@ -588,7 +585,7 @@ function ChangelogContent() {
{hasCurrentChanges ? (
<div className="vc-changelog-current">
<Heading className={Margins.bottom8}>
Recent Changes
{t("vencord.settings.changelog.recentChanges")}
</Heading>
{/* New Plugins Section */}
@ -607,7 +604,7 @@ function ChangelogContent() {
{updatedPlugins.length > 0 && (
<div className={Margins.bottom16}>
<Heading className={Margins.bottom8}>
Updated Plugins ({updatedPlugins.length})
{t("vencord.settings.changelog.updatedPluginsCount", { plugins: updatedPlugins.length })}
</Heading>
<NewPluginsCompact newPlugins={updatedPlugins} />
</div>
@ -617,8 +614,7 @@ function ChangelogContent() {
{changelog.length > 0 && (
<div>
<Heading className={Margins.bottom8}>
Code Changes ({changelog.length}{" "}
{changelog.length === 1 ? "commit" : "commits"})
{t("vencord.settings.changelog.codeChanges", { count: changelog.length })}
</Heading>
<div className="vc-changelog-commits-list">
{changelog.map(entry => (
@ -638,9 +634,7 @@ function ChangelogContent() {
!error && (
<Card className="vc-changelog-empty">
<Paragraph>
No commits available ahead of your current version.
Click "Fetch from Repository" to check for new
changes.
{t("vencord.settings.changelog.emptyChangelog")}
</Paragraph>
</Card>
)
@ -654,12 +648,10 @@ function ChangelogContent() {
style={{ marginBottom: "1em" }}
/>
<Heading className={Margins.bottom8}>
Update Logs ({changelogHistory.length}{" "}
{changelogHistory.length === 1 ? "log" : "logs"})
{t("vencord.settings.changelog.updateLogs", { count: changelogHistory.length })}
</Heading>
<Paragraph className={Margins.bottom16}>
Previous update sessions with their commit history and
plugin changes.
{t("vencord.settings.changelog.previousSessions")}
</Paragraph>
<div className="vc-changelog-history-list">
@ -673,11 +665,11 @@ function ChangelogContent() {
onToggleExpand={() => toggleLogExpanded(log.id)}
onClearLog={logId => {
Alerts.show({
title: "Clear Log",
body: "Are you sure you would like to clear this log? This can't be undone.",
confirmText: "Clear Log",
title: t("vencord.logs.clearLog"),
body: t("vencord.logs.clearLogConfirmation"),
confirmText: t("vencord.logs.clearLog"),
confirmColor: "danger",
cancelText: "Cancel",
cancelText: t("vencord.logs.cancel"),
onConfirm: async () => {
await clearIndividualLog(logId);
await loadChangelogHistory();
@ -691,7 +683,7 @@ function ChangelogContent() {
),
);
Toasts.show({
message: "Log has been cleared",
message: t("vencord.logs.logCleared"),
id: Toasts.genId(),
type: Toasts.Type.SUCCESS,
options: {
@ -713,10 +705,10 @@ function ChangelogContent() {
function ChangelogTab() {
return (
<SettingsTab title="Changelog">
<SettingsTab title={t("vencord.settings.changelog.title")}>
<ChangelogContent />
</SettingsTab>
);
}
export default wrapTab(ChangelogTab, "Changelog");
export default wrapTab(ChangelogTab, t("vencord.settings.changelog.title"));

View file

@ -11,6 +11,7 @@ import { classNameFactory } from "@api/Styles";
import ErrorBoundary from "@components/ErrorBoundary";
import { HeadingPrimary } from "@components/Heading";
import { Link } from "@components/Link";
import { Paragraph } from "@components/Paragraph";
import { EquicordDevsById, VencordDevsById } from "@utils/constants";
import { fetchUserProfile } from "@utils/discord";
import { classes } from "@utils/misc";
@ -94,16 +95,20 @@ function ContributorModal({ user }: { user: User; }) {
</div>
{plugins.length ? (
<Translate
i18nKey="vencord.settings.plugins.contributorModal.contributorInfo.plugins"
variables={{ count: plugins.length }}>
This person has {ContributedHyperLink} to some plugins!
</Translate>
<Paragraph>
<Translate
i18nKey="vencord.settings.plugins.contributorModal.contributorInfo.plugins"
variables={{ count: plugins.length }}>
This person has {ContributedHyperLink} to some plugins!
</Translate>
</Paragraph>
) : (
<Translate i18nKey="vencord.settings.plugins.contributorModal.contributorInfo.noPlugins">
This person has not made any plugins. They likely {ContributedHyperLink}
to Vencord in other ways!
</Translate>
<Paragraph >
<Translate i18nKey="vencord.settings.plugins.contributorModal.contributorInfo.noPlugins">
This person has not made any plugins. They likely {ContributedHyperLink}
to Equicord in other ways!
</Translate>
</Paragraph >
)}
{!!plugins.length && (

View file

@ -334,11 +334,14 @@ function DonateButtonComponent() {
<DonateButton
look={Button.Looks.FILLED}
color={Button.Colors.TRANSPARENT}
style={{ marginTop: "1em" }} />
style={{ marginTop: "1em" }}
link="https://github.com/sponsors/thororen1234"
/>
<InviteButton
look={Button.Looks.FILLED}
color={Button.Colors.TRANSPARENT}
style={{ marginTop: "1em" }} />
style={{ marginTop: "1em" }}
/>
</Flex>
);
}