This commit is contained in:
Joe Chen
2026-05-28 15:54:47 -04:00
parent a5d2c0ee36
commit 98cb5a3db4
54 changed files with 1901 additions and 1114 deletions
+43 -21
View File
@@ -53,6 +53,11 @@ pull_requests = Pull requests
issues = Issues
cancel = Cancel
close = Close
show_more = Show more
show_less = Show less
resize_sidebar = Resize sidebar
more_actions = More actions
[status]
page_not_found = Page not found
@@ -501,7 +506,32 @@ unwatch = Unwatch
watch = Watch
unstar = Unstar
star = Star
starred = Starred
fork = Fork
mirror_of = mirror of
sign_in_to_watch = Sign in to watch this repository
sign_in_to_star = Sign in to star this repository
sign_in_to_fork = Sign in to fork this repository
watch_this_repository = Watch this repository
unwatch_this_repository = Unwatch this repository
star_this_repository = Star this repository
unstar_this_repository = Unstar this repository
fork_this_repository = Fork this repository
visibility_private = This repository is private
visibility_public = This repository is public
view_watchers = View watchers
view_stargazers = View stargazers
view_forks = View forks
browse_files = Browse files
view_history = View history
view_raw = View raw
copy_file_path = Copy file path
copy_full_sha = Copy full SHA
renamed_from = Renamed from
authored = authored
parents = parents
diff_label = diff
patch_label = patch
no_desc = No Description
quick_guide = Quick Guide
@@ -930,7 +960,7 @@ diff.show_split_view = Split View
diff.show_unified_view = Unified View
diff.stats_desc = <strong> %d changed files</strong> with <strong>%d additions</strong> and <strong>%d deletions</strong>
diff.bin = BIN
diff.view_file = View File
diff.view_file = View file
diff.file_suppressed = File diff suppressed because it is too large
diff.too_many_files = Some files were not shown because too many files changed in this diff
diff.showing_changed_files = Showing <count>{count} changed files</count>
@@ -947,30 +977,22 @@ diff.display = Display
diff.wrap_long_lines = Wrap long line
diff.expand_all_files = Expand all files
diff.collapse_all_files = Collapse all files
diff.show_file_tree = Show file tree
diff.hide_file_tree = Hide file tree
diff.expand_all_directories = Expand all directories
diff.collapse_all_directories = Collapse all directories
diff.search_files = Search files
diff.hide_search = Hide search
diff.search_in_diff = Search in diff
diff.previous_match = Previous match
diff.next_match = Next match
show_file_tree = Show file tree
hide_file_tree = Hide file tree
expand_all_directories = Expand all directories
collapse_all_directories = Collapse all directories
search_files = Search files
search_hide = Hide search
search_diff = Search in diff
search_previous_match = Previous match
search_next_match = Next match
commit_parent = parent
commit_label = commit
view_file = View file
diff.expand_file = Expand file
diff.collapse_file = Collapse file
diff.copy_file_path = Copy file path
diff.expand_all_lines = Expand all lines
diff.all_lines_expanded = All lines expanded
diff.more_actions = More actions
diff.view_history = View history
diff.view_raw = View raw
diff.renamed_from = Renamed from
diff.authored = authored
diff.copy_full_sha = Copy full SHA
diff.diff = diff
diff.patch = patch
diff.browse_files = Browse files
diff.parents = parents
release.releases = Releases
release.new_release = New Release
+174 -115
View File
@@ -12,7 +12,7 @@ const outDir = join(here, "..", "src/locales");
// Keys pulled from Gogs's INI files. Add new entries here when the SPA needs
// another translation. Locales missing a key fall back to en-US via react-i18next.
const REUSED_KEYS = [
const KEYS = [
"app_desc",
"home",
"dashboard",
@@ -34,8 +34,7 @@ const REUSED_KEYS = [
"admin_panel",
"settings",
"language",
"page_not_found",
"internal_server_error",
"repository",
"theme",
"theme_light",
"theme_dark",
@@ -52,125 +51,179 @@ const REUSED_KEYS = [
"captcha_image_alt",
"refresh_captcha",
"click_to_refresh_captcha",
"auth_source",
"local",
"forget_password",
"send_reset_email",
"reset_password_email_submitting",
"reset_password_email_failed",
"reset_password_email_sent",
"disable_register_mail",
"disable_register_prompt",
"reset_password_resend_limited",
"non_local_account",
"create_new_account",
"register_hepler_msg",
"sign_up",
"sign_up_now",
"sign_up_submitting",
"sign_up_failed",
"sign_in_submitting",
"sign_in_failed",
"show_password",
"hide_password",
"back_to_sign_in",
"reset_password",
"invalid_code",
"reset_password_submit",
"reset_password_submitting",
"reset_password_failed",
"new_password",
"new_password_placeholder",
"confirm_password",
"confirm_password_placeholder",
"confirm_new_password",
"confirm_new_password_placeholder",
"password_mismatch",
"mfa_title",
"mfa_passcode",
"mfa_passcode_placeholder",
"mfa_recovery_code",
"mfa_recovery_code_placeholder",
"mfa_use_recovery_code",
"mfa_use_passcode",
"mfa_verify",
"mfa_verifying",
"mfa_session_expired",
"mfa_verify_failed",
"activate_your_account",
"resend_rate_limited",
"send_activation_email",
"check_activation_email",
"activation_email_pending",
"activation_email_sent",
"sending_activation_email",
"send_activation_email_failed",
"activating_account",
// Commit diff page chrome (web/src/pages/repo/Commit.tsx and friends).
"diff.showing_changed_files",
"diff.additions",
"diff.deletions",
"diff.unified",
"diff.split",
"diff.diff_settings",
"diff.whitespace",
"diff.show_whitespace",
"diff.ignore_whitespace_changes",
"diff.ignore_all_whitespace",
"diff.display",
"diff.wrap_long_lines",
"diff.expand_all_files",
"diff.collapse_all_files",
"diff.show_file_tree",
"diff.hide_file_tree",
"diff.expand_all_directories",
"diff.collapse_all_directories",
"diff.search_files",
"diff.hide_search",
"diff.search_in_diff",
"diff.previous_match",
"diff.next_match",
"diff.expand_file",
"diff.collapse_file",
"diff.copy_file_path",
"diff.expand_all_lines",
"diff.all_lines_expanded",
"diff.more_actions",
"diff.view_history",
"diff.view_raw",
"diff.renamed_from",
"diff.authored",
"diff.copy_full_sha",
"diff.diff",
"diff.patch",
"diff.browse_files",
"diff.parents",
"diff.parent",
"diff.commit",
// Reused from existing locale entries.
"diff.view_file",
"editor.edit_file",
"editor.delete_this_file",
"close",
"show_more",
"show_less",
"resize_sidebar",
"more",
"more_tabs",
"more_actions",
"status.page_not_found",
"status.internal_server_error",
"auth.auth_source",
"auth.local",
"auth.forget_password",
"auth.send_reset_email",
"auth.reset_password_email_submitting",
"auth.reset_password_email_failed",
"auth.reset_password_email_sent",
"auth.disable_register_mail",
"auth.disable_register_prompt",
"auth.reset_password_resend_limited",
"auth.non_local_account",
"auth.create_new_account",
"auth.register_hepler_msg",
"auth.sign_up_now",
"auth.sign_up_submitting",
"auth.sign_up_failed",
"auth.sign_in_submitting",
"auth.sign_in_failed",
"auth.show_password",
"auth.hide_password",
"auth.back_to_sign_in",
"auth.reset_password",
"auth.invalid_code",
"auth.reset_password_submit",
"auth.reset_password_submitting",
"auth.reset_password_failed",
"auth.new_password",
"auth.new_password_placeholder",
"auth.confirm_password",
"auth.confirm_password_placeholder",
"auth.confirm_new_password",
"auth.confirm_new_password_placeholder",
"auth.password_mismatch",
"auth.mfa_title",
"auth.mfa_passcode",
"auth.mfa_passcode_placeholder",
"auth.mfa_recovery_code",
"auth.mfa_recovery_code_placeholder",
"auth.mfa_use_recovery_code",
"auth.mfa_use_passcode",
"auth.mfa_verify",
"auth.mfa_verifying",
"auth.mfa_session_expired",
"auth.mfa_verify_failed",
"auth.activate_your_account",
"auth.resend_rate_limited",
"auth.send_activation_email",
"auth.check_activation_email",
"auth.activation_email_pending",
"auth.activation_email_sent",
"auth.sending_activation_email",
"auth.send_activation_email_failed",
"auth.activating_account",
"tool.now",
"tool.ago",
"tool.from_now",
"tool.1s",
"tool.1m",
"tool.1h",
"tool.1d",
"tool.1w",
"tool.1mon",
"tool.1y",
"tool.seconds",
"tool.minutes",
"tool.hours",
"tool.days",
"tool.weeks",
"tool.months",
"tool.years",
"repo.diff.showing_changed_files",
"repo.diff.additions",
"repo.diff.deletions",
"repo.diff.unified",
"repo.diff.split",
"repo.diff.diff_settings",
"repo.diff.whitespace",
"repo.diff.show_whitespace",
"repo.diff.ignore_whitespace_changes",
"repo.diff.ignore_all_whitespace",
"repo.diff.display",
"repo.diff.wrap_long_lines",
"repo.diff.expand_all_files",
"repo.diff.collapse_all_files",
"repo.show_file_tree",
"repo.hide_file_tree",
"repo.expand_all_directories",
"repo.collapse_all_directories",
"repo.search_files",
"repo.search_hide",
"repo.search_diff",
"repo.search_previous_match",
"repo.search_next_match",
"repo.diff.expand_file",
"repo.diff.collapse_file",
"repo.diff.expand_all_lines",
"repo.diff.all_lines_expanded",
"repo.commit_parent",
"repo.commit_label",
"repo.view_file",
"repo.editor.edit_file",
"repo.editor.delete_this_file",
"repo.files",
"repo.settings",
"repo.wiki",
"repo.watch",
"repo.unwatch",
"repo.star",
"repo.starred",
"repo.fork",
"repo.mirror_of",
"repo.sign_in_to_watch",
"repo.sign_in_to_star",
"repo.sign_in_to_fork",
"repo.watch_this_repository",
"repo.unwatch_this_repository",
"repo.star_this_repository",
"repo.unstar_this_repository",
"repo.fork_this_repository",
"repo.visibility_private",
"repo.visibility_public",
"repo.view_watchers",
"repo.view_stargazers",
"repo.view_forks",
"repo.browse_files",
"repo.view_history",
"repo.view_raw",
"repo.copy_file_path",
"repo.copy_full_sha",
"repo.renamed_from",
"repo.authored",
"repo.parents",
"repo.diff_label",
"repo.patch_label",
];
// Lightweight INI parser: handles `key = value` and `key=value`, ignores
// comments, and flattens sections into a single namespace. Gogs's locale
// files group keys under sections like [status] (e.g. status.page_not_found
// resolves to a key named "page_not_found" inside [status]), but downstream
// callers reference keys by their bare name, so the section header is
// dropped here. First occurrence wins on collisions.
// Lightweight INI parser. Returns two views of the same file:
// - `flat`: bare key name to value, first occurrence wins (matches the
// historical SPA behavior where keys are referenced without their section).
// - `sectioned`: `section.key` to value, so callers can disambiguate when the
// same bare name appears in two sections (e.g. `[user] starred` vs
// `[repo] starred`). Top-level keys (no section header above them) are
// also stored bare in `sectioned`.
function parseIni(text) {
const out = {};
const flat = {};
const sectioned = {};
let section = "";
for (const rawLine of text.split(/\r?\n/)) {
const line = rawLine.trim();
if (!line || line.startsWith(";") || line.startsWith("#") || line.startsWith("[")) continue;
if (!line || line.startsWith(";") || line.startsWith("#")) continue;
if (line.startsWith("[") && line.endsWith("]")) {
section = line.slice(1, -1).trim();
continue;
}
const eq = line.indexOf("=");
if (eq < 0) continue;
const key = line.slice(0, eq).trim();
const value = line.slice(eq + 1).trim();
if (key && !(key in out)) out[key] = value;
if (!key) continue;
if (!(key in flat)) flat[key] = value;
const qualified = section ? `${section}.${key}` : key;
if (!(qualified in sectioned)) sectioned[qualified] = value;
}
return out;
return { flat, sectioned };
}
mkdirSync(outDir, { recursive: true });
@@ -178,10 +231,16 @@ mkdirSync(outDir, { recursive: true });
const files = readdirSync(inDir).filter((f) => f.startsWith("locale_") && f.endsWith(".ini"));
for (const file of files) {
const lang = file.slice("locale_".length, -".ini".length);
const parsed = parseIni(readFileSync(join(inDir, file), "utf8"));
const { flat, sectioned } = parseIni(readFileSync(join(inDir, file), "utf8"));
const out = {};
for (const key of REUSED_KEYS) {
if (parsed[key]) out[key] = parsed[key];
for (const key of KEYS) {
// Prefer the literal flat name if it exists in the INI (handles entries
// like `editor.edit_file` or `diff.parent`, whose literal flat name is
// the dotted string with no enclosing section). Fall back to a
// section-qualified lookup so `repo.starred` finds `starred` under
// `[repo]` and bypasses the colliding `[user] starred`.
const value = flat[key] ?? sectioned[key];
if (value) out[key] = value;
}
writeFileSync(join(outDir, `${lang}.json`), JSON.stringify(out, null, 2) + "\n", "utf8");
console.log(`wrote ${lang}.json (${Object.keys(out).length} keys)`);
+2 -2
View File
@@ -195,7 +195,7 @@ export const DiffFileTree = forwardRef<DiffFileTreeHandle, Props>(function DiffF
// Pierre closes search on row click. Reopen with the last typed value so
// the user does not have to retype after navigating to a matched file.
// Blur (clicking outside the tree) is intentionally NOT restored — only
// Blur (clicking outside the tree) is intentionally NOT restored. Only
// row-click closures are, gated by `selectionJustFiredRef`.
const search = useFileTreeSearch(model);
const searchValueRef = useRef(search.value);
@@ -256,7 +256,7 @@ export const DiffFileTree = forwardRef<DiffFileTreeHandle, Props>(function DiffF
return;
}
// Fall back to descending into shadow roots if the input wasn't in
// light DOM (it isn't Pierre keeps it in the shadow root).
// light DOM (it isn't, Pierre keeps it in the shadow root).
const walker = wrapperRef.current?.querySelectorAll("*") ?? [];
for (const el of Array.from(walker)) {
const sr = (el as Element & { shadowRoot?: ShadowRoot }).shadowRoot;
+4 -4
View File
@@ -159,8 +159,8 @@ export function DiffSearch<L>({ items, viewRef }: Props<L>) {
inputRef.current?.blur();
}
}}
placeholder={t("diff.search_in_diff")}
aria-label={t("diff.search_in_diff")}
placeholder={t("repo.search_diff")}
aria-label={t("repo.search_diff")}
className="w-40 min-w-0 flex-1 bg-transparent px-1 py-0.5 text-sm outline-none placeholder:text-(--color-muted-foreground)"
/>
<span className="px-1 text-xs tabular-nums text-(--color-muted-foreground)">
@@ -170,7 +170,7 @@ export function DiffSearch<L>({ items, viewRef }: Props<L>) {
type="button"
onClick={() => navigate(-1)}
disabled={matches.length === 0}
aria-label={t("diff.previous_match")}
aria-label={t("repo.search_previous_match")}
className="cursor-pointer rounded p-1 hover:bg-(--color-surface) disabled:cursor-not-allowed disabled:opacity-40"
>
<ChevronUp className="size-3.5" aria-hidden />
@@ -179,7 +179,7 @@ export function DiffSearch<L>({ items, viewRef }: Props<L>) {
type="button"
onClick={() => navigate(1)}
disabled={matches.length === 0}
aria-label={t("diff.next_match")}
aria-label={t("repo.search_next_match")}
className="cursor-pointer rounded p-1 hover:bg-(--color-surface) disabled:cursor-not-allowed disabled:opacity-40"
>
<ChevronDown className="size-3.5" aria-hidden />
+18 -18
View File
@@ -80,13 +80,13 @@ export function DiffToolbar({
<button
type="button"
onClick={onShowTreeMobile}
aria-label={t("diff.show_file_tree")}
aria-label={t("repo.show_file_tree")}
className="grid size-6 cursor-pointer place-items-center rounded text-(--color-muted-foreground) hover:bg-(--color-surface) hover:text-(--color-foreground) lg:hidden"
>
<PanelLeftOpen className="size-4" aria-hidden />
</button>
</TooltipTrigger>
<TooltipContent>{t("diff.show_file_tree")}</TooltipContent>
<TooltipContent>{t("repo.show_file_tree")}</TooltipContent>
</Tooltip>
) : null}
{onToggleTreeDesktop ? (
@@ -95,7 +95,7 @@ export function DiffToolbar({
<button
type="button"
onClick={onToggleTreeDesktop}
aria-label={desktopTreeOpen ? t("diff.hide_file_tree") : t("diff.show_file_tree")}
aria-label={desktopTreeOpen ? t("repo.hide_file_tree") : t("repo.show_file_tree")}
aria-pressed={desktopTreeOpen}
// `pl-1` nudges the icon right so it visually aligns with
// the sidebar's collapsed-rail edge on desktop.
@@ -108,12 +108,12 @@ export function DiffToolbar({
)}
</button>
</TooltipTrigger>
<TooltipContent>{desktopTreeOpen ? t("diff.hide_file_tree") : t("diff.show_file_tree")}</TooltipContent>
<TooltipContent>{desktopTreeOpen ? t("repo.hide_file_tree") : t("repo.show_file_tree")}</TooltipContent>
</Tooltip>
) : null}
<span>
<Trans
i18nKey="diff.showing_changed_files"
i18nKey="repo.diff.showing_changed_files"
values={{ count: stats.fileCount }}
components={{ count: <strong className="font-semibold" /> }}
/>
@@ -124,10 +124,10 @@ export function DiffToolbar({
`sm+` they fit inline on one line. */}
<span className="flex basis-full items-center gap-3 sm:basis-auto">
<span className="tabular-nums text-(--color-diff-added)">
+{stats.additions.toLocaleString()} {t("diff.additions")}
+{stats.additions.toLocaleString()} {t("repo.diff.additions")}
</span>
<span className="tabular-nums text-(--color-diff-removed)">
-{stats.deletions.toLocaleString()} {t("diff.deletions")}
-{stats.deletions.toLocaleString()} {t("repo.diff.deletions")}
</span>
</span>
</div>
@@ -144,36 +144,36 @@ export function DiffToolbar({
<div className="flex flex-wrap items-center gap-2">
<div className="inline-flex h-7 items-stretch overflow-hidden rounded-md border border-(--color-border) text-xs">
<SegmentButton active={settings.diffStyle === "unified"} onClick={() => setStyle("unified")}>
{t("diff.unified")}
{t("repo.diff.unified")}
</SegmentButton>
<SegmentButton active={settings.diffStyle === "split"} onClick={() => setStyle("split")}>
{t("diff.split")}
{t("repo.diff.split")}
</SegmentButton>
</div>
<Popover>
<PopoverTrigger asChild>
<ToolbarButton icon={SlidersHorizontal} label={t("diff.diff_settings")} />
<ToolbarButton icon={SlidersHorizontal} label={t("repo.diff.diff_settings")} />
</PopoverTrigger>
<PopoverContent align="end" className="w-64 p-2">
<div className="px-2 pb-1 text-xs font-semibold tracking-wide text-(--color-muted-foreground) uppercase">
{t("diff.whitespace")}
{t("repo.diff.whitespace")}
</div>
<MenuRadio checked={whitespace === "show"} onSelect={() => onWhitespaceChange("show")}>
{t("diff.show_whitespace")}
{t("repo.diff.show_whitespace")}
</MenuRadio>
<MenuRadio checked={whitespace === "ignore-change"} onSelect={() => onWhitespaceChange("ignore-change")}>
{t("diff.ignore_whitespace_changes")}
{t("repo.diff.ignore_whitespace_changes")}
</MenuRadio>
<MenuRadio checked={whitespace === "ignore-all"} onSelect={() => onWhitespaceChange("ignore-all")}>
{t("diff.ignore_all_whitespace")}
{t("repo.diff.ignore_all_whitespace")}
</MenuRadio>
<div className="my-1 h-px bg-(--color-border)" />
<div className="px-2 pb-1 text-xs font-semibold tracking-wide text-(--color-muted-foreground) uppercase">
{t("diff.display")}
{t("repo.diff.display")}
</div>
<MenuCheckbox checked={settings.wrapLines} onSelect={() => setWrap(!settings.wrapLines)}>
{t("diff.wrap_long_lines")}
{t("repo.diff.wrap_long_lines")}
</MenuCheckbox>
</PopoverContent>
</Popover>
@@ -181,12 +181,12 @@ export function DiffToolbar({
<div className="inline-flex h-7 items-stretch overflow-hidden rounded-md border border-(--color-border) text-xs">
<IconActionButton
onClick={onExpandAll}
label={t("diff.expand_all_files")}
label={t("repo.diff.expand_all_files")}
icon={<Maximize2 className="size-3.5" aria-hidden />}
/>
<IconActionButton
onClick={onCollapseAll}
label={t("diff.collapse_all_files")}
label={t("repo.diff.collapse_all_files")}
icon={<Minimize2 className="size-3.5" aria-hidden />}
/>
</div>
+11 -11
View File
@@ -12,8 +12,8 @@ export interface FileHeaderMenuProps {
rawFileHref: string;
historyHref: string;
// Edit/Delete only make sense when the diff is anchored to a branch (e.g.
// PR diffs). Omit on commit pages gogs' editor needs a branch ref, and
// routing through a SHA returns 404.
// PR diffs). Omit on commit pages, since gogs' editor needs a branch ref
// and routing through a SHA returns 404.
editFileHref?: string;
deleteFileHref?: string;
// Mobile-only "Expand all lines" surfaced inside the menu (only visible
@@ -46,10 +46,10 @@ export function FileHeaderMenu({
<Tooltip>
<TooltipTrigger asChild>
<PopoverTrigger asChild>
<MenuTrigger aria-label={t("diff.more_actions")} />
<MenuTrigger aria-label={t("more_actions")} />
</PopoverTrigger>
</TooltipTrigger>
{!open ? <TooltipContent>{t("diff.more_actions")}</TooltipContent> : null}
{!open ? <TooltipContent>{t("more_actions")}</TooltipContent> : null}
</Tooltip>
<PopoverContent align="end" sideOffset={4} className="w-48 p-1 text-sm">
<ul role="menu" className="flex flex-col">
@@ -70,7 +70,7 @@ export function FileHeaderMenu({
) : (
<UnfoldVertical className="size-3.5 shrink-0" aria-hidden />
)}
<span>{expandDone ? t("diff.all_lines_expanded") : t("diff.expand_all_lines")}</span>
<span>{expandDone ? t("repo.diff.all_lines_expanded") : t("repo.diff.expand_all_lines")}</span>
</button>
</li>
) : null}
@@ -82,7 +82,7 @@ export function FileHeaderMenu({
className="flex items-center gap-2 rounded px-2 py-1.5 hover:bg-(--color-surface)"
>
<FileCode2 className="size-3.5 shrink-0" aria-hidden />
<span>{t("diff.view_file")}</span>
<span>{t("repo.view_file")}</span>
</a>
</li>
<li>
@@ -92,7 +92,7 @@ export function FileHeaderMenu({
className="flex items-center gap-2 rounded px-2 py-1.5 hover:bg-(--color-surface)"
>
<Binary className="size-3.5 shrink-0" aria-hidden />
<span>{t("diff.view_raw")}</span>
<span>{t("repo.view_raw")}</span>
</a>
</li>
<li>
@@ -102,7 +102,7 @@ export function FileHeaderMenu({
className="flex items-center gap-2 rounded px-2 py-1.5 hover:bg-(--color-surface)"
>
<History className="size-3.5 shrink-0" aria-hidden />
<span>{t("diff.view_history")}</span>
<span>{t("repo.view_history")}</span>
</a>
</li>
{editFileHref || deleteFileHref ? <li role="separator" className="my-1 h-px bg-(--color-border)" /> : null}
@@ -114,7 +114,7 @@ export function FileHeaderMenu({
className="flex items-center gap-2 rounded px-2 py-1.5 hover:bg-(--color-surface)"
>
<Pencil className="size-3.5 shrink-0" aria-hidden />
<span>{t("editor.edit_file")}</span>
<span>{t("repo.editor.edit_file")}</span>
</a>
</li>
) : null}
@@ -126,7 +126,7 @@ export function FileHeaderMenu({
className="flex items-center gap-2 rounded px-2 py-1.5 text-(--color-destructive) hover:bg-(--color-surface)"
>
<Trash2 className="size-3.5 shrink-0" aria-hidden />
<span>{t("editor.delete_this_file")}</span>
<span>{t("repo.editor.delete_this_file")}</span>
</a>
</li>
) : null}
@@ -134,7 +134,7 @@ export function FileHeaderMenu({
<>
<li role="separator" className="my-1 h-px bg-(--color-border)" />
<li role="menuitem" aria-disabled className="px-2 py-1.5 text-xs text-(--color-muted-foreground)">
{t("diff.renamed_from")} <span className="font-mono">{prevFilePath}</span>
{t("repo.renamed_from")} <span className="font-mono">{prevFilePath}</span>
</li>
</>
) : null}
+1 -1
View File
@@ -54,7 +54,7 @@ export function PasswordInput({
tabIndex={tabIndex + 1}
disabled={disabled}
onClick={onToggleShow}
aria-label={show ? t("hide_password") : t("show_password")}
aria-label={show ? t("auth.hide_password") : t("auth.show_password")}
aria-pressed={show}
className="absolute inset-y-0 right-0 flex w-10 cursor-pointer items-center justify-center rounded-r-md text-(--color-muted-foreground) outline-none hover:text-(--color-foreground) focus-visible:text-(--color-foreground) focus-visible:ring-1 focus-visible:ring-(--color-ring) disabled:cursor-not-allowed disabled:opacity-50"
>
+49 -27
View File
@@ -1,4 +1,5 @@
import { useMutation, useQueryClient } from "@tanstack/react-query";
import type { TFunction } from "i18next";
import {
Bell,
CircleDot,
@@ -15,6 +16,7 @@ import {
} from "lucide-react";
import type { ComponentType, ReactNode } from "react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
@@ -52,6 +54,7 @@ function formatCount(n: number): string {
}
export function RepoHeader({ repo, activeTab }: RepoHeaderProps) {
const { t } = useTranslation();
const repoLink = subUrl(`/${repo.owner}/${repo.name}`);
const user = useUserInfo();
const queryClient = useQueryClient();
@@ -122,7 +125,7 @@ export function RepoHeader({ repo, activeTab }: RepoHeaderProps) {
{repo.mirrorOf ? (
<span className="inline-flex min-w-0 items-center gap-1 text-xs text-(--color-muted-foreground)">
<LinkIcon className="size-3 shrink-0" aria-hidden />
<span className="shrink-0">mirror of</span>
<span className="shrink-0">{t("repo.mirror_of")}</span>
<a href={repo.mirrorOf} className="truncate hover:underline" rel="noopener noreferrer" target="_blank">
{repo.mirrorOf}
</a>
@@ -137,11 +140,12 @@ export function RepoHeader({ repo, activeTab }: RepoHeaderProps) {
signInHref={subUrl(`/user/sign-in?redirect_to=${encodeURIComponent(window.location.pathname)}`)}
disabled={watchMutation.isPending}
signedIn={signedIn}
signInTooltip="Sign in to watch this repository"
signInTooltip={t("repo.sign_in_to_watch")}
icon={Bell}
label={repo.viewerIsWatching ? "Unwatch" : "Watch"}
label={repo.viewerIsWatching ? t("repo.unwatch") : t("repo.watch")}
count={repo.watchCount}
ariaLabel={repo.viewerIsWatching ? "Unwatch this repository" : "Watch this repository"}
ariaLabel={repo.viewerIsWatching ? t("repo.unwatch_this_repository") : t("repo.watch_this_repository")}
countAriaLabel={t("repo.view_watchers")}
active={repo.viewerIsWatching}
/>
<SplitActionButton
@@ -150,11 +154,12 @@ export function RepoHeader({ repo, activeTab }: RepoHeaderProps) {
signInHref={subUrl(`/user/sign-in?redirect_to=${encodeURIComponent(window.location.pathname)}`)}
disabled={starMutation.isPending}
signedIn={signedIn}
signInTooltip="Sign in to star this repository"
signInTooltip={t("repo.sign_in_to_star")}
icon={Star}
label={repo.viewerIsStarring ? "Starred" : "Star"}
label={repo.viewerIsStarring ? t("repo.starred") : t("repo.star")}
count={repo.starCount}
ariaLabel={repo.viewerIsStarring ? "Unstar this repository" : "Star this repository"}
ariaLabel={repo.viewerIsStarring ? t("repo.unstar_this_repository") : t("repo.star_this_repository")}
countAriaLabel={t("repo.view_stargazers")}
active={repo.viewerIsStarring}
/>
<SplitActionButton
@@ -165,16 +170,17 @@ export function RepoHeader({ repo, activeTab }: RepoHeaderProps) {
actionHref={signedIn ? subUrl(`/repo/fork/${repo.id}`) : undefined}
signInHref={subUrl(`/user/sign-in?redirect_to=${encodeURIComponent(window.location.pathname)}`)}
signedIn={signedIn}
signInTooltip="Sign in to fork this repository"
signInTooltip={t("repo.sign_in_to_fork")}
icon={GitFork}
label="Fork"
label={t("repo.fork")}
count={repo.forkCount}
ariaLabel="Fork this repository"
ariaLabel={t("repo.fork_this_repository")}
countAriaLabel={t("repo.view_forks")}
/>
</div>
</div>
<RepoTabs repo={repo} activeTab={activeTab} repoLink={repoLink} />
<RepoTabs repo={repo} activeTab={activeTab} repoLink={repoLink} t={t} />
</div>
</div>
);
@@ -188,14 +194,14 @@ interface TabDescriptor {
badge?: number;
}
function buildTabs(repo: RepoHeaderData, repoLink: string): TabDescriptor[] {
const tabs: TabDescriptor[] = [{ key: "code", href: repoLink, icon: Code, label: "Code" }];
function buildTabs(repo: RepoHeaderData, repoLink: string, t: TFunction): TabDescriptor[] {
const tabs: TabDescriptor[] = [{ key: "code", href: repoLink, icon: Code, label: t("repo.files") }];
if (repo.issuesEnabled !== false) {
tabs.push({
key: "issues",
href: `${repoLink}/issues`,
icon: CircleDot,
label: "Issues",
label: t("issues"),
badge: repo.openIssueCount,
});
}
@@ -204,21 +210,31 @@ function buildTabs(repo: RepoHeaderData, repoLink: string): TabDescriptor[] {
key: "pulls",
href: `${repoLink}/pulls`,
icon: GitPullRequest,
label: "Pull requests",
label: t("pull_requests"),
badge: repo.openPullRequestCount,
});
}
if (repo.wikiEnabled !== false) {
tabs.push({ key: "wiki", href: `${repoLink}/wiki`, icon: FileText, label: "Wiki" });
tabs.push({ key: "wiki", href: `${repoLink}/wiki`, icon: FileText, label: t("repo.wiki") });
}
if (repo.viewerCanAdminister) {
tabs.push({ key: "settings", href: `${repoLink}/settings`, icon: Settings, label: "Settings" });
tabs.push({ key: "settings", href: `${repoLink}/settings`, icon: Settings, label: t("repo.settings") });
}
return tabs;
}
function RepoTabs({ repo, activeTab, repoLink }: { repo: RepoHeaderData; activeTab: RepoTab; repoLink: string }) {
const tabs = buildTabs(repo, repoLink);
function RepoTabs({
repo,
activeTab,
repoLink,
t,
}: {
repo: RepoHeaderData;
activeTab: RepoTab;
repoLink: string;
t: TFunction;
}) {
const tabs = buildTabs(repo, repoLink, t);
// On mobile, only `MOBILE_INLINE_LIMIT` tabs are shown inline; the rest
// fold into a hamburger overflow. If the active tab is past the cutoff,
@@ -236,17 +252,17 @@ function RepoTabs({ repo, activeTab, repoLink }: { repo: RepoHeaderData; activeT
return (
<>
{/* Mobile: first 3 inline + hamburger overflow for the rest. */}
<nav className="-mb-px flex items-end gap-1 sm:hidden" aria-label="Repository">
<nav className="-mb-px flex items-end gap-1 sm:hidden" aria-label={t("repository")}>
{mobileInline.map((tab) => (
<TabLink key={tab.key} href={tab.href} icon={tab.icon} active={activeTab === tab.key} badge={tab.badge}>
{tab.label}
</TabLink>
))}
{mobileOverflow.length > 0 ? <OverflowMenu tabs={mobileOverflow} activeTab={activeTab} /> : null}
{mobileOverflow.length > 0 ? <OverflowMenu tabs={mobileOverflow} activeTab={activeTab} t={t} /> : null}
</nav>
{/* sm and up: full strip, scrolls horizontally if it ever overflows. */}
<nav className="-mb-px hidden gap-1 overflow-x-auto sm:flex" aria-label="Repository">
<nav className="-mb-px hidden gap-1 overflow-x-auto sm:flex" aria-label={t("repository")}>
{tabs.map((tab) => (
<TabLink key={tab.key} href={tab.href} icon={tab.icon} active={activeTab === tab.key} badge={tab.badge}>
{tab.label}
@@ -257,18 +273,18 @@ function RepoTabs({ repo, activeTab, repoLink }: { repo: RepoHeaderData; activeT
);
}
function OverflowMenu({ tabs, activeTab }: { tabs: TabDescriptor[]; activeTab: RepoTab }) {
function OverflowMenu({ tabs, activeTab, t }: { tabs: TabDescriptor[]; activeTab: RepoTab; t: TFunction }) {
const [open, setOpen] = useState(false);
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<button
type="button"
aria-label="More tabs"
aria-label={t("more_tabs")}
className="flex items-center gap-2 border-b-2 border-transparent px-3 py-2 text-sm whitespace-nowrap text-(--color-muted-foreground) hover:border-(--color-border) hover:text-(--color-foreground)"
>
<Menu className="size-4" aria-hidden />
<span>More</span>
<span>{t("more")}</span>
</button>
</PopoverTrigger>
<PopoverContent align="end" className="w-56 p-1">
@@ -304,9 +320,10 @@ function OverflowMenu({ tabs, activeTab }: { tabs: TabDescriptor[]; activeTab: R
}
function VisibilityBadge({ visibility }: { visibility: RepoHeaderData["visibility"] }) {
const { t } = useTranslation();
const isPrivate = visibility === "private";
const Icon = isPrivate ? Lock : Globe;
const tooltip = isPrivate ? "This repository is private" : "This repository is public";
const tooltip = isPrivate ? t("repo.visibility_private") : t("repo.visibility_public");
return (
<Tooltip>
<TooltipTrigger asChild>
@@ -346,6 +363,10 @@ interface SplitActionButtonProps {
label: string;
count: number;
ariaLabel: string;
// Accessible name for the count half (e.g. "View watchers"). The visible
// text is just the number, so this label tells assistive tech what the
// link goes to.
countAriaLabel: string;
active?: boolean;
disabled?: boolean;
}
@@ -361,6 +382,7 @@ function SplitActionButton({
label,
count,
ariaLabel,
countAriaLabel,
active,
disabled,
}: SplitActionButtonProps) {
@@ -415,7 +437,7 @@ function SplitActionButton({
{action}
<a
href={countHref}
aria-label={`${label} count`}
aria-label={countAriaLabel}
className="flex items-center border-l border-(--color-border) bg-(--color-surface)/60 px-2 tabular-nums hover:bg-(--color-surface)"
>
{formatCount(count)}
+3 -1
View File
@@ -1,4 +1,5 @@
import { type ReactNode, useCallback, useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { cn } from "@/lib/utils";
@@ -36,6 +37,7 @@ export function ResizableSidebar({
className,
style,
}: Props) {
const { t } = useTranslation();
const [width, setWidth] = useState(() => readStoredWidth(storageKey, defaultWidth));
const draggingRef = useRef(false);
const startXRef = useRef(0);
@@ -107,7 +109,7 @@ export function ResizableSidebar({
<div
role="separator"
aria-orientation="vertical"
aria-label="Resize sidebar"
aria-label={t("resize_sidebar")}
aria-valuemin={minWidth}
aria-valuemax={maxWidth}
aria-valuenow={width}
+31 -1
View File
@@ -1,4 +1,4 @@
import { Check, Monitor, Moon, Settings, Sun } from "lucide-react";
import { Bug, Check, Monitor, Moon, Settings, Sun } from "lucide-react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
@@ -43,6 +43,19 @@ const LANGUAGES: { code: string; name: string }[] = [
{ code: "ro-RO", name: "Română" },
];
// Dev-only feature flag: toggles a `?i18n_debug=1` query param that makes
// every translated string render with its key wrapped around it. `i18n.ts`
// reads the param at module load, so toggling forces a full reload.
const i18nDebugEnabled = typeof window !== "undefined" && new URLSearchParams(window.location.search).has("i18n_debug");
function toggleI18nDebug() {
const params = new URLSearchParams(window.location.search);
if (i18nDebugEnabled) params.delete("i18n_debug");
else params.set("i18n_debug", "1");
const qs = params.toString();
window.location.search = qs ? "?" + qs : "";
}
export function SettingsMenu() {
const { t } = useTranslation();
const [open, setOpen] = useState(false);
@@ -112,6 +125,23 @@ export function SettingsMenu() {
);
})}
</ul>
{import.meta.env.DEV ? (
<>
<div className="my-1 h-px bg-(--color-border)" />
<div className="p-1">
<button
type="button"
onClick={toggleI18nDebug}
className="flex w-full cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm hover:bg-(--color-surface) hover:text-(--color-foreground)"
>
<Bug className="size-4" aria-hidden />
<span className="flex-1">i18n debug</span>
<Check className={cn("size-4", i18nDebugEnabled ? "opacity-100" : "opacity-0")} />
</button>
</div>
</>
) : null}
</PopoverContent>
</Popover>
);
@@ -1,6 +1,23 @@
import { type ReactNode, useEffect, useMemo, useState } from "react";
import { ThemeContext, type ThemeContextValue } from "./theme-context";
import { ThemeContext, type ThemeContextValue } from "@/lib/theme-context";
const STORAGE_KEY = "gogs-theme";
function systemPrefersDark(): boolean {
return typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches;
}
function readStoredTheme(): ThemeContextValue["theme"] {
if (typeof localStorage === "undefined") return "system";
const v = localStorage.getItem(STORAGE_KEY);
return v === "light" || v === "dark" || v === "system" ? v : "system";
}
function applyTheme(theme: ThemeContextValue["theme"]) {
const dark = theme === "dark" || (theme === "system" && systemPrefersDark());
document.documentElement.classList.toggle("dark", dark);
}
export function ThemeProvider({ children }: { children: ReactNode }) {
const [theme, setThemeState] = useState<ThemeContextValue["theme"]>(readStoredTheme);
@@ -28,20 +45,3 @@ export function ThemeProvider({ children }: { children: ReactNode }) {
return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;
}
const STORAGE_KEY = "gogs-theme";
function systemPrefersDark(): boolean {
return typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches;
}
function readStoredTheme(): ThemeContextValue["theme"] {
if (typeof localStorage === "undefined") return "system";
const v = localStorage.getItem(STORAGE_KEY);
return v === "light" || v === "dark" || v === "system" ? v : "system";
}
function applyTheme(theme: ThemeContextValue["theme"]) {
const dark = theme === "dark" || (theme === "system" && systemPrefersDark());
document.documentElement.classList.toggle("dark", dark);
}
+15
View File
@@ -35,6 +35,20 @@ import zhCN from "@/locales/zh-CN.json";
import zhHK from "@/locales/zh-HK.json";
import zhTW from "@/locales/zh-TW.json";
// Toggle via `?i18n_debug=1` to wrap every translated string with its key
// for visual inspection. Read once at module load so it survives navigation
// within the SPA.
const showKeys = typeof window !== "undefined" && new URLSearchParams(window.location.search).has("i18n_debug");
if (showKeys) {
// eslint-disable-next-line import/no-named-as-default-member
i18n.use({
type: "postProcessor",
name: "i18n-debug",
process: (value: string, keys: string[]) => `${keys.join(",")}${value}`,
});
}
// eslint-disable-next-line import/no-named-as-default-member
void i18n.use(initReactI18next).init({
resources: {
@@ -75,6 +89,7 @@ void i18n.use(initReactI18next).init({
fallbackLng: "en-US",
interpolation: { escapeValue: false, prefix: "{", suffix: "}" },
returnNull: false,
postProcess: showKeys ? ["i18n-debug"] : undefined,
});
export default i18n;
+53 -47
View File
@@ -1,14 +1,16 @@
// Date formatting helpers that mirror Gogs's server-side conventions:
// Date formatting helpers used by commit metadata and similar timestamps.
// - Relative time matches `internal/tool/tool.go`'s `timeSince` thresholds
// (now / seconds / minutes / hours / days / weeks / months / years ago).
// - Absolute format matches `time.RFC1123`, which is Gogs's default
// `[time].FORMAT` and what server templates put in the `title` attribute
// of `<span class="time-since">` elements.
//
// English-only for now: the Go side runs these strings through i18n, but the
// SPA's other date renderings (none yet) don't, and the source INI uses printf
// placeholders that don't round-trip through i18next. Wiring i18n through this
// helper is a follow-up once there's a second caller to motivate the shape.
// Strings come from Gogs's `[tool]` section so the SPA reuses the existing
// community translations. Quantity templates carry `%d` (count) and `%s`
// (suffix) printf placeholders, substituted manually since i18next uses
// `{count}` style interpolation.
// - Absolute time uses `Intl.DateTimeFormat` keyed on `webContext.lang`, so
// each locale gets its own calendar conventions out of the box without
// shipping per-locale day/month strings.
import type { TFunction } from "i18next";
import { webContext } from "@/lib/context";
const MINUTE = 60;
const HOUR = 60 * MINUTE;
@@ -17,52 +19,56 @@ const WEEK = 7 * DAY;
const MONTH = 30 * DAY;
const YEAR = 12 * MONTH;
export function formatRelativeTime(iso: string, nowMs: number = Date.now()): string {
// Substitute Go-style printf placeholders. Quantity templates may use either
// the simple `%d` / `%s` form (English, most locales) or the positional
// `%[1]d` / `%[2]s` form used by community translations that need to reorder
// the count and suffix (e.g. German: `%[2]s %[1]d Jahren`).
function fillQuantity(template: string, count: number, suffix: string): string {
return template.replace(/%(?:\[1\])?d/g, String(count)).replace(/%(?:\[2\])?s/g, suffix);
}
function fillSuffix(template: string, suffix: string): string {
return template.replace(/%(?:\[1\])?s/g, suffix);
}
export function formatRelativeTime(t: TFunction, iso: string, nowMs: number = Date.now()): string {
const then = Date.parse(iso);
if (Number.isNaN(then)) return iso;
let diff = Math.floor((nowMs - then) / 1000);
let suffix = "ago";
if (diff < 0) {
diff = -diff;
suffix = "from now";
}
const suffix = diff < 0 ? t("tool.from_now") : t("tool.ago");
if (diff < 0) diff = -diff;
if (diff <= 0) return "now";
if (diff <= 2) return `1 second ${suffix}`;
if (diff < MINUTE) return `${diff} seconds ${suffix}`;
if (diff < 2 * MINUTE) return `1 minute ${suffix}`;
if (diff < HOUR) return `${Math.floor(diff / MINUTE)} minutes ${suffix}`;
if (diff < 2 * HOUR) return `1 hour ${suffix}`;
if (diff < DAY) return `${Math.floor(diff / HOUR)} hours ${suffix}`;
if (diff < 2 * DAY) return `1 day ${suffix}`;
if (diff < WEEK) return `${Math.floor(diff / DAY)} days ${suffix}`;
if (diff < 2 * WEEK) return `1 week ${suffix}`;
if (diff < MONTH) return `${Math.floor(diff / WEEK)} weeks ${suffix}`;
if (diff < 2 * MONTH) return `1 month ${suffix}`;
if (diff < YEAR) return `${Math.floor(diff / MONTH)} months ${suffix}`;
if (diff < 2 * YEAR) return `1 year ${suffix}`;
return `${Math.floor(diff / YEAR)} years ${suffix}`;
if (diff <= 0) return t("tool.now");
if (diff <= 2) return fillSuffix(t("tool.1s"), suffix);
if (diff < MINUTE) return fillQuantity(t("tool.seconds"), diff, suffix);
if (diff < 2 * MINUTE) return fillSuffix(t("tool.1m"), suffix);
if (diff < HOUR) return fillQuantity(t("tool.minutes"), Math.floor(diff / MINUTE), suffix);
if (diff < 2 * HOUR) return fillSuffix(t("tool.1h"), suffix);
if (diff < DAY) return fillQuantity(t("tool.hours"), Math.floor(diff / HOUR), suffix);
if (diff < 2 * DAY) return fillSuffix(t("tool.1d"), suffix);
if (diff < WEEK) return fillQuantity(t("tool.days"), Math.floor(diff / DAY), suffix);
if (diff < 2 * WEEK) return fillSuffix(t("tool.1w"), suffix);
if (diff < MONTH) return fillQuantity(t("tool.weeks"), Math.floor(diff / WEEK), suffix);
if (diff < 2 * MONTH) return fillSuffix(t("tool.1mon"), suffix);
if (diff < YEAR) return fillQuantity(t("tool.months"), Math.floor(diff / MONTH), suffix);
if (diff < 2 * YEAR) return fillSuffix(t("tool.1y"), suffix);
return fillQuantity(t("tool.years"), Math.floor(diff / YEAR), suffix);
}
const DAY_NAMES = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
const MONTH_NAMES = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
const ABSOLUTE_TIME_FMT = new Intl.DateTimeFormat(webContext.lang, {
weekday: "short",
day: "2-digit",
month: "short",
year: "numeric",
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
hour12: false,
timeZoneName: "short",
});
function pad2(n: number): string {
return n < 10 ? `0${n}` : String(n);
}
// Mirrors Go's `time.RFC1123` layout (`Mon, 02 Jan 2006 15:04:05 MST`) in the
// viewer's local timezone, so the tooltip reads the same as what server
// templates emit via `t.Format(conf.Time.FormatLayout)`.
export function formatAbsoluteTime(iso: string, now: Date = new Date(Date.parse(iso))): string {
if (Number.isNaN(now.getTime())) return iso;
const tz =
new Intl.DateTimeFormat("en-US", { timeZoneName: "short" })
.formatToParts(now)
.find((p) => p.type === "timeZoneName")?.value ?? "";
return (
`${DAY_NAMES[now.getDay()]}, ${pad2(now.getDate())} ${MONTH_NAMES[now.getMonth()]} ${now.getFullYear()} ` +
`${pad2(now.getHours())}:${pad2(now.getMinutes())}:${pad2(now.getSeconds())} ${tz}`
);
return ABSOLUTE_TIME_FMT.format(now);
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Административен панел",
"settings": "Настройки",
"language": "Език",
"page_not_found": "Страницата не е намерена",
"internal_server_error": "Вътрешна грешка в сървър",
"repository": "Хранилище",
"username": "Потребител",
"email": "Ел. поща",
"password": "Парола",
"captcha": "Captcha",
"auth_source": "Източник за удостоверяване",
"local": "Локален",
"forget_password": "Забравена парола?",
"disable_register_mail": "За съжаление потвърждението на регистрации е изключено.",
"disable_register_prompt": "За съжаление създаването на нови регистрации е изключено. Обърнете се към администратора на сайта.",
"non_local_account": "Нелокални потребители не могат да сменят паролата си през Gogs.",
"create_new_account": "Създай нов профил",
"register_hepler_msg": "Вече имате профил? Впишете се сега!",
"sign_up": "Регистрирайте се",
"sign_up_now": "Нуждаете се от профил? Регистрирайте се сега.",
"reset_password": "Нулиране на паролата",
"invalid_code": "За съжаление Вашия код за потвърждение е изтекъл или е невалиден.",
"new_password": "Нова парола",
"confirm_password": "Потвърждение на паролата",
"diff.parent": "родител",
"diff.commit": "ревизия",
"diff.view_file": "Целия файл",
"editor.edit_file": "Редактирай файл",
"editor.delete_this_file": "Изтрий този файл"
"status.page_not_found": "Страницата не е намерена",
"status.internal_server_error": "Вътрешна грешка в сървър",
"auth.auth_source": "Източник за удостоверяване",
"auth.local": "Локален",
"auth.forget_password": "Забравена парола?",
"auth.disable_register_mail": "За съжаление потвърждението на регистрации е изключено.",
"auth.disable_register_prompt": "За съжаление създаването на нови регистрации е изключено. Обърнете се към администратора на сайта.",
"auth.non_local_account": "Нелокални потребители не могат да сменят паролата си през Gogs.",
"auth.create_new_account": "Създай нов профил",
"auth.register_hepler_msg": "Вече имате профил? Впишете се сега!",
"auth.sign_up_now": "Нуждаете се от профил? Регистрирайте се сега.",
"auth.reset_password": "Нулиране на паролата",
"auth.invalid_code": "За съжаление Вашия код за потвърждение е изтекъл или е невалиден.",
"tool.now": "сега",
"tool.ago": "преди",
"tool.from_now": "след",
"tool.1s": "%s 1 секунда",
"tool.1m": "%s 1 минута",
"tool.1h": "%s 1 час",
"tool.1d": "%s 1 ден",
"tool.1w": "%s 1 седмица",
"tool.1mon": "%s 1 месец",
"tool.1y": "%s 1 година",
"tool.seconds": "%[2]s %[1]d секунди",
"tool.minutes": "%[2]s %[1]d минути",
"tool.hours": "%[2]s %[1]d часа",
"tool.days": "%[2]s %[1]d дни",
"tool.weeks": "%[2]s %[1]d седмици",
"tool.months": "%[2]s %[1]d месеца",
"tool.years": "%[2]s %[1]d години",
"repo.editor.edit_file": "Редактирай файл",
"repo.editor.delete_this_file": "Изтрий този файл",
"repo.files": "Файлове",
"repo.settings": "Настройки",
"repo.wiki": "Уики",
"repo.watch": "Наблюдаван",
"repo.unwatch": "Не наблюдавам",
"repo.star": "Харесван",
"repo.fork": "Разклонения"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Panel správce",
"settings": "Nastavení",
"language": "Jazyk",
"page_not_found": "Page Not Found",
"internal_server_error": "Internal Server Error",
"repository": "Repozitář",
"username": "Uživatelské jméno",
"email": "E-mail",
"password": "Heslo",
"captcha": "CAPTCHA",
"auth_source": "Zdroj ověření",
"local": "Lokální",
"forget_password": "Zapomněli jste heslo?",
"disable_register_mail": "Omlouváme se, ale e-mailové služby jsou vypnuté. Kontaktujte správce systému.",
"disable_register_prompt": "Omlouváme se, ale registrace jsou vypnuty. Kontaktujte správce systému.",
"non_local_account": "Externí účty nemohou měnit hesla přes Gogs.",
"create_new_account": "Vytvořit nový účet",
"register_hepler_msg": "Již máte účet? Přihlašte se!",
"sign_up": "Registrovat se",
"sign_up_now": "Potřebujete účet? Zaregistrujte se.",
"reset_password": "Obnova vašeho hesla",
"invalid_code": "Omlouváme se, ale kód z vašeho potvrzovacího e-mailu už vypršel nebo není správný.",
"new_password": "Nové heslo",
"confirm_password": "Potvrdit heslo",
"diff.parent": "rodič",
"diff.commit": "revize",
"diff.view_file": "Zobrazit soubor",
"editor.edit_file": "Upravit soubor",
"editor.delete_this_file": "Smazat tento soubor"
"status.page_not_found": "Page Not Found",
"status.internal_server_error": "Internal Server Error",
"auth.auth_source": "Zdroj ověření",
"auth.local": "Lokální",
"auth.forget_password": "Zapomněli jste heslo?",
"auth.disable_register_mail": "Omlouváme se, ale e-mailové služby jsou vypnuté. Kontaktujte správce systému.",
"auth.disable_register_prompt": "Omlouváme se, ale registrace jsou vypnuty. Kontaktujte správce systému.",
"auth.non_local_account": "Externí účty nemohou měnit hesla přes Gogs.",
"auth.create_new_account": "Vytvořit nový účet",
"auth.register_hepler_msg": "Již máte účet? Přihlašte se!",
"auth.sign_up_now": "Potřebujete účet? Zaregistrujte se.",
"auth.reset_password": "Obnova vašeho hesla",
"auth.invalid_code": "Omlouváme se, ale kód z vašeho potvrzovacího e-mailu už vypršel nebo není správný.",
"tool.now": "nyní",
"tool.ago": "před",
"tool.from_now": "od teď",
"tool.1s": "%s 1 sekundou",
"tool.1m": "%s 1 minutou",
"tool.1h": "%s 1 hodinou",
"tool.1d": "%s 1 dnem",
"tool.1w": "%s 1 týdnem",
"tool.1mon": "%s 1 měsícem",
"tool.1y": "%s 1 rokem",
"tool.seconds": "%[2]s %[1]d sekundami",
"tool.minutes": "%[2]s %[1]d minutami",
"tool.hours": "%[2]s %[1]d hodinami",
"tool.days": "%[2]s %[1]d dny",
"tool.weeks": "%[2]s %[1]d týdny",
"tool.months": "%[2]s %[1]d měsíci",
"tool.years": "%[2]s %[1]d roky",
"repo.editor.edit_file": "Upravit soubor",
"repo.editor.delete_this_file": "Smazat tento soubor",
"repo.files": "Soubory",
"repo.settings": "Nastavení",
"repo.wiki": "Wiki",
"repo.watch": "Sledovat",
"repo.unwatch": "Přestat sledovat",
"repo.star": "Oblíbit",
"repo.fork": "Rozštěpit"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Administration",
"settings": "Einstellungen",
"language": "Sprache",
"page_not_found": "Seite nicht gefunden",
"internal_server_error": "Interner Serverfehler",
"repository": "Repository",
"username": "Benutzername",
"email": "E-Mail",
"password": "Passwort",
"captcha": "Captcha",
"auth_source": "Authentifizierungsquelle",
"local": "Lokal",
"forget_password": "Passwort vergessen?",
"disable_register_mail": "Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.",
"disable_register_prompt": "Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wenden Sie sich an den Administrator.",
"non_local_account": "Nicht-lokale Konten können Passwörter nicht via Gogs ändern.",
"create_new_account": "Neues Konto erstellen",
"register_hepler_msg": "Haben Sie bereits ein Konto? Jetzt anmelden!",
"sign_up": "Registrieren",
"sign_up_now": "Benötigen Sie ein Konto? Registrieren Sie sich jetzt.",
"reset_password": "Passwort zurücksetzen",
"invalid_code": "Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig.",
"new_password": "Neues Passwort",
"confirm_password": "Passwort bestätigen",
"diff.parent": "Ursprung",
"diff.commit": "Commit",
"diff.view_file": "Datei anzeigen",
"editor.edit_file": "Datei bearbeiten",
"editor.delete_this_file": "Datei löschen"
"status.page_not_found": "Seite nicht gefunden",
"status.internal_server_error": "Interner Serverfehler",
"auth.auth_source": "Authentifizierungsquelle",
"auth.local": "Lokal",
"auth.forget_password": "Passwort vergessen?",
"auth.disable_register_mail": "Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert.",
"auth.disable_register_prompt": "Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wenden Sie sich an den Administrator.",
"auth.non_local_account": "Nicht-lokale Konten können Passwörter nicht via Gogs ändern.",
"auth.create_new_account": "Neues Konto erstellen",
"auth.register_hepler_msg": "Haben Sie bereits ein Konto? Jetzt anmelden!",
"auth.sign_up_now": "Benötigen Sie ein Konto? Registrieren Sie sich jetzt.",
"auth.reset_password": "Passwort zurücksetzen",
"auth.invalid_code": "Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig.",
"tool.now": "jetzt",
"tool.ago": "vor",
"tool.from_now": "in",
"tool.1s": "%s 1 Sekunde",
"tool.1m": "%s 1 Minute",
"tool.1h": "%s 1 Stunde",
"tool.1d": "%s 1 Tag",
"tool.1w": "%s 1 Woche",
"tool.1mon": "%s 1 Monat",
"tool.1y": "%s 1 Jahr",
"tool.seconds": "%[2]s %[1]d Sekunden",
"tool.minutes": "%[2]s %[1]d Minuten",
"tool.hours": "%[2]s %[1]d Stunden",
"tool.days": "%[2]s %[1]d Tagen",
"tool.weeks": "%[2]s %[1]d Wochen",
"tool.months": "%[2]s %[1]d Monaten",
"tool.years": "%[2]s %[1]d Jahren",
"repo.editor.edit_file": "Datei bearbeiten",
"repo.editor.delete_this_file": "Datei löschen",
"repo.files": "Dateien",
"repo.settings": "Einstellungen",
"repo.wiki": "Wiki",
"repo.watch": "Beobachten",
"repo.unwatch": "Beobachten beenden",
"repo.star": "Favorit hinzufügen",
"repo.fork": "Fork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Admin Panel",
"settings": "Settings",
"language": "Language",
"page_not_found": "Page Not Found",
"internal_server_error": "Internal Server Error",
"repository": "Repository",
"username": "Username",
"email": "Email",
"password": "Password",
"captcha": "Captcha",
"auth_source": "Authentication Source",
"local": "Local",
"forget_password": "Forgot password?",
"disable_register_mail": "Sorry, Register Mail Confirmation has been disabled.",
"disable_register_prompt": "Sorry, registration has been disabled. Please contact the site administrator.",
"non_local_account": "Non-local accounts cannot change passwords through Gogs.",
"create_new_account": "Create New Account",
"register_hepler_msg": "Already have an account? Sign in now!",
"sign_up": "Sign Up",
"sign_up_now": "Need an account? Sign up now.",
"reset_password": "Reset Your Password",
"invalid_code": "Sorry, your confirmation code has expired or not valid.",
"new_password": "New Password",
"confirm_password": "Confirm Password",
"diff.parent": "parent",
"diff.commit": "commit",
"diff.view_file": "View File",
"editor.edit_file": "Edit file",
"editor.delete_this_file": "Delete this file"
"status.page_not_found": "Page Not Found",
"status.internal_server_error": "Internal Server Error",
"auth.auth_source": "Authentication Source",
"auth.local": "Local",
"auth.forget_password": "Forgot password?",
"auth.disable_register_mail": "Sorry, Register Mail Confirmation has been disabled.",
"auth.disable_register_prompt": "Sorry, registration has been disabled. Please contact the site administrator.",
"auth.non_local_account": "Non-local accounts cannot change passwords through Gogs.",
"auth.create_new_account": "Create New Account",
"auth.register_hepler_msg": "Already have an account? Sign in now!",
"auth.sign_up_now": "Need an account? Sign up now.",
"auth.reset_password": "Reset Your Password",
"auth.invalid_code": "Sorry, your confirmation code has expired or not valid.",
"tool.now": "now",
"tool.ago": "ago",
"tool.from_now": "from now",
"tool.1s": "1 second %s",
"tool.1m": "1 minute %s",
"tool.1h": "1 hour %s",
"tool.1d": "1 day %s",
"tool.1w": "1 week %s",
"tool.1mon": "1 month %s",
"tool.1y": "1 year %s",
"tool.seconds": "%d seconds %s",
"tool.minutes": "%d minutes %s",
"tool.hours": "%d hours %s",
"tool.days": "%d days %s",
"tool.weeks": "%d weeks %s",
"tool.months": "%d months %s",
"tool.years": "%d years %s",
"repo.editor.edit_file": "Edit file",
"repo.editor.delete_this_file": "Delete this file",
"repo.files": "Files",
"repo.settings": "Settings",
"repo.wiki": "Wiki",
"repo.watch": "Watch",
"repo.unwatch": "Unwatch",
"repo.star": "Star",
"repo.fork": "Fork"
}
+141 -99
View File
@@ -20,8 +20,7 @@
"admin_panel": "Admin panel",
"settings": "Settings",
"language": "Language",
"page_not_found": "Page not found",
"internal_server_error": "Internal server error",
"repository": "Repository",
"theme": "Theme",
"theme_light": "Light",
"theme_dark": "Dark",
@@ -38,101 +37,144 @@
"captcha_image_alt": "Captcha image",
"refresh_captcha": "Refresh captcha",
"click_to_refresh_captcha": "Click to refresh",
"auth_source": "Authentication source",
"local": "Local",
"forget_password": "Forgot password?",
"send_reset_email": "Send password reset email",
"reset_password_email_submitting": "Sending password reset email...",
"reset_password_email_failed": "Could not send password reset email, please try again.",
"reset_password_email_sent": "A password reset email has been sent to <email>{email}</email>, please check your inbox within <hours>{hours} hours</hours>.",
"disable_register_mail": "Sorry, email services are disabled. Please contact the site administrator.",
"disable_register_prompt": "Sorry, registration has been disabled. Please contact the site administrator.",
"reset_password_resend_limited": "You already requested a password reset email recently. Please wait 3 minutes then try again.",
"non_local_account": "Non-local accounts cannot change passwords through Gogs.",
"create_new_account": "Create new account",
"register_hepler_msg": "Already have an account? Sign in now!",
"sign_up": "Sign up",
"sign_up_now": "Create a new account",
"sign_up_submitting": "Creating account...",
"sign_up_failed": "Could not create account, please try again.",
"sign_in_submitting": "Signing in...",
"sign_in_failed": "Could not sign in, please try again.",
"show_password": "Show password",
"hide_password": "Hide password",
"back_to_sign_in": "Back to sign in",
"reset_password": "Reset your password",
"invalid_code": "The confirmation code has expired or not valid.",
"reset_password_submit": "Reset password",
"reset_password_submitting": "Resetting password...",
"reset_password_failed": "Could not reset password, please try again.",
"new_password": "New password",
"new_password_placeholder": "Enter your new password",
"confirm_password": "Confirm password",
"confirm_password_placeholder": "Re-enter your password",
"confirm_new_password": "Confirm new password",
"confirm_new_password_placeholder": "Re-enter your new password",
"password_mismatch": "The two passwords do not match.",
"mfa_title": "Multi-factor authentication",
"mfa_passcode": "Passcode",
"mfa_passcode_placeholder": "Enter the 6-digit code from your authenticator",
"mfa_recovery_code": "Recovery code",
"mfa_recovery_code_placeholder": "Enter a recovery code",
"mfa_use_recovery_code": "Use a recovery code instead",
"mfa_use_passcode": "Use a passcode instead",
"mfa_verify": "Verify",
"mfa_verifying": "Verifying...",
"mfa_session_expired": "Your sign-in session has expired. Please sign in again.",
"mfa_verify_failed": "Verification failed. Please try again.",
"activate_your_account": "Activate your account",
"resend_rate_limited": "Sorry, you already requested an activation email recently. Please wait 3 minutes then try again.",
"send_activation_email": "Send activation email",
"check_activation_email": "Please check your email and click the activation link to finish creating your account.",
"activation_email_pending": "Your email address <email>{email}</email> is not yet confirmed. Click below to send a new activation email valid for <hours>{hours} hours</hours>.",
"activation_email_sent": "A new activation email has been sent to <email>{email}</email>. Please check your inbox within <hours>{hours} hours</hours>.",
"sending_activation_email": "Sending activation email...",
"send_activation_email_failed": "Could not send activation email, please try again.",
"activating_account": "Activating your account...",
"diff.showing_changed_files": "Showing <count>{count} changed files</count>",
"diff.additions": "additions",
"diff.deletions": "deletions",
"diff.unified": "Unified",
"diff.split": "Split",
"diff.diff_settings": "Diff settings",
"diff.whitespace": "Whitespace",
"diff.show_whitespace": "Show whitespace",
"diff.ignore_whitespace_changes": "Ignore whitespace changes",
"diff.ignore_all_whitespace": "Ignore all whitespace",
"diff.display": "Display",
"diff.wrap_long_lines": "Wrap long line",
"diff.expand_all_files": "Expand all files",
"diff.collapse_all_files": "Collapse all files",
"diff.show_file_tree": "Show file tree",
"diff.hide_file_tree": "Hide file tree",
"diff.expand_all_directories": "Expand all directories",
"diff.collapse_all_directories": "Collapse all directories",
"diff.search_files": "Search files",
"diff.hide_search": "Hide search",
"diff.search_in_diff": "Search in diff",
"diff.previous_match": "Previous match",
"diff.next_match": "Next match",
"diff.expand_file": "Expand file",
"diff.collapse_file": "Collapse file",
"diff.copy_file_path": "Copy file path",
"diff.expand_all_lines": "Expand all lines",
"diff.all_lines_expanded": "All lines expanded",
"diff.more_actions": "More actions",
"diff.view_history": "View history",
"diff.view_raw": "View raw",
"diff.renamed_from": "Renamed from",
"diff.authored": "authored",
"diff.copy_full_sha": "Copy full SHA",
"diff.diff": "diff",
"diff.patch": "patch",
"diff.browse_files": "Browse files",
"diff.parents": "parents",
"diff.parent": "parent",
"diff.commit": "commit",
"diff.view_file": "View File",
"editor.edit_file": "Edit file",
"editor.delete_this_file": "Delete this file"
"close": "Close",
"show_more": "Show more",
"show_less": "Show less",
"resize_sidebar": "Resize sidebar",
"more_actions": "More actions",
"status.page_not_found": "Page not found",
"status.internal_server_error": "Internal server error",
"auth.auth_source": "Authentication source",
"auth.local": "Local",
"auth.forget_password": "Forgot password?",
"auth.send_reset_email": "Send password reset email",
"auth.reset_password_email_submitting": "Sending password reset email...",
"auth.reset_password_email_failed": "Could not send password reset email, please try again.",
"auth.reset_password_email_sent": "A password reset email has been sent to <email>{email}</email>, please check your inbox within <hours>{hours} hours</hours>.",
"auth.disable_register_mail": "Sorry, email services are disabled. Please contact the site administrator.",
"auth.disable_register_prompt": "Sorry, registration has been disabled. Please contact the site administrator.",
"auth.reset_password_resend_limited": "You already requested a password reset email recently. Please wait 3 minutes then try again.",
"auth.non_local_account": "Non-local accounts cannot change passwords through Gogs.",
"auth.create_new_account": "Create new account",
"auth.register_hepler_msg": "Already have an account? Sign in now!",
"auth.sign_up_now": "Create a new account",
"auth.sign_up_submitting": "Creating account...",
"auth.sign_up_failed": "Could not create account, please try again.",
"auth.sign_in_submitting": "Signing in...",
"auth.sign_in_failed": "Could not sign in, please try again.",
"auth.show_password": "Show password",
"auth.hide_password": "Hide password",
"auth.back_to_sign_in": "Back to sign in",
"auth.reset_password": "Reset your password",
"auth.invalid_code": "The confirmation code has expired or not valid.",
"auth.reset_password_submit": "Reset password",
"auth.reset_password_submitting": "Resetting password...",
"auth.reset_password_failed": "Could not reset password, please try again.",
"auth.new_password": "New password",
"auth.new_password_placeholder": "Enter your new password",
"auth.confirm_password_placeholder": "Re-enter your password",
"auth.confirm_new_password": "Confirm new password",
"auth.confirm_new_password_placeholder": "Re-enter your new password",
"auth.password_mismatch": "The two passwords do not match.",
"auth.mfa_title": "Multi-factor authentication",
"auth.mfa_passcode": "Passcode",
"auth.mfa_passcode_placeholder": "Enter the 6-digit code from your authenticator",
"auth.mfa_recovery_code": "Recovery code",
"auth.mfa_recovery_code_placeholder": "Enter a recovery code",
"auth.mfa_use_recovery_code": "Use a recovery code instead",
"auth.mfa_use_passcode": "Use a passcode instead",
"auth.mfa_verify": "Verify",
"auth.mfa_verifying": "Verifying...",
"auth.mfa_session_expired": "Your sign-in session has expired. Please sign in again.",
"auth.mfa_verify_failed": "Verification failed. Please try again.",
"auth.activate_your_account": "Activate your account",
"auth.resend_rate_limited": "Sorry, you already requested an activation email recently. Please wait 3 minutes then try again.",
"auth.send_activation_email": "Send activation email",
"auth.check_activation_email": "Please check your email and click the activation link to finish creating your account.",
"auth.activation_email_pending": "Your email address <email>{email}</email> is not yet confirmed. Click below to send a new activation email valid for <hours>{hours} hours</hours>.",
"auth.activation_email_sent": "A new activation email has been sent to <email>{email}</email>. Please check your inbox within <hours>{hours} hours</hours>.",
"auth.sending_activation_email": "Sending activation email...",
"auth.send_activation_email_failed": "Could not send activation email, please try again.",
"auth.activating_account": "Activating your account...",
"tool.now": "now",
"tool.ago": "ago",
"tool.from_now": "from now",
"tool.1s": "1 second %s",
"tool.1m": "1 minute %s",
"tool.1h": "1 hour %s",
"tool.1d": "1 day %s",
"tool.1w": "1 week %s",
"tool.1mon": "1 month %s",
"tool.1y": "1 year %s",
"tool.seconds": "%d seconds %s",
"tool.minutes": "%d minutes %s",
"tool.hours": "%d hours %s",
"tool.days": "%d days %s",
"tool.weeks": "%d weeks %s",
"tool.months": "%d months %s",
"tool.years": "%d years %s",
"repo.diff.showing_changed_files": "Showing <count>{count} changed files</count>",
"repo.diff.additions": "additions",
"repo.diff.deletions": "deletions",
"repo.diff.unified": "Unified",
"repo.diff.split": "Split",
"repo.diff.diff_settings": "Diff settings",
"repo.diff.whitespace": "Whitespace",
"repo.diff.show_whitespace": "Show whitespace",
"repo.diff.ignore_whitespace_changes": "Ignore whitespace changes",
"repo.diff.ignore_all_whitespace": "Ignore all whitespace",
"repo.diff.display": "Display",
"repo.diff.wrap_long_lines": "Wrap long line",
"repo.diff.expand_all_files": "Expand all files",
"repo.diff.collapse_all_files": "Collapse all files",
"repo.show_file_tree": "Show file tree",
"repo.hide_file_tree": "Hide file tree",
"repo.expand_all_directories": "Expand all directories",
"repo.collapse_all_directories": "Collapse all directories",
"repo.search_files": "Search files",
"repo.search_hide": "Hide search",
"repo.search_diff": "Search in diff",
"repo.search_previous_match": "Previous match",
"repo.search_next_match": "Next match",
"repo.diff.expand_file": "Expand file",
"repo.diff.collapse_file": "Collapse file",
"repo.diff.expand_all_lines": "Expand all lines",
"repo.diff.all_lines_expanded": "All lines expanded",
"repo.commit_parent": "parent",
"repo.commit_label": "commit",
"repo.view_file": "View file",
"repo.editor.edit_file": "Edit file",
"repo.editor.delete_this_file": "Delete this file",
"repo.files": "Files",
"repo.settings": "Settings",
"repo.wiki": "Wiki",
"repo.watch": "Watch",
"repo.unwatch": "Unwatch",
"repo.star": "Star",
"repo.starred": "Starred",
"repo.fork": "Fork",
"repo.mirror_of": "mirror of",
"repo.sign_in_to_watch": "Sign in to watch this repository",
"repo.sign_in_to_star": "Sign in to star this repository",
"repo.sign_in_to_fork": "Sign in to fork this repository",
"repo.watch_this_repository": "Watch this repository",
"repo.unwatch_this_repository": "Unwatch this repository",
"repo.star_this_repository": "Star this repository",
"repo.unstar_this_repository": "Unstar this repository",
"repo.fork_this_repository": "Fork this repository",
"repo.visibility_private": "This repository is private",
"repo.visibility_public": "This repository is public",
"repo.view_watchers": "View watchers",
"repo.view_stargazers": "View stargazers",
"repo.view_forks": "View forks",
"repo.browse_files": "Browse files",
"repo.view_history": "View history",
"repo.view_raw": "View raw",
"repo.copy_file_path": "Copy file path",
"repo.copy_full_sha": "Copy full SHA",
"repo.renamed_from": "Renamed from",
"repo.authored": "authored",
"repo.parents": "parents",
"repo.diff_label": "diff",
"repo.patch_label": "patch"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Panel de administración",
"settings": "Configuraciones",
"language": "Idioma",
"page_not_found": "Página no encontrada",
"internal_server_error": "Error Interno del Servidor",
"repository": "Repositorio",
"username": "Nombre de usuario",
"email": "Correo electrónico",
"password": "Contraseña",
"captcha": "Captcha",
"auth_source": "Authentication Source",
"local": "Local",
"forget_password": "¿Has olvidado tu contraseña?",
"disable_register_mail": "Lo sentimos. Los correos de Confirmación de Registro están deshabilitados.",
"disable_register_prompt": "Lo sentimos, el registro está deshabilitado. Por favor, contacta con el administrador del sitio.",
"non_local_account": "Cuentas que no son locales no pueden cambiar las contraseñas a través de Gogs.",
"create_new_account": "Crear una nueva cuenta",
"register_hepler_msg": "¿Ya tienes una cuenta? ¡Inicia sesión!",
"sign_up": "Registro",
"sign_up_now": "¿Necesitas una cuenta? Regístrate ahora.",
"reset_password": "Restablecer su contraseña",
"invalid_code": "Lo sentimos, su código de confirmación ha expirado o no es valido.",
"new_password": "Nueva contraseña",
"confirm_password": "Confirmar Contraseña",
"diff.parent": "padre",
"diff.commit": "commit",
"diff.view_file": "Ver fichero",
"editor.edit_file": "Editar archivo",
"editor.delete_this_file": "Eliminar este archivo"
"status.page_not_found": "Página no encontrada",
"status.internal_server_error": "Error Interno del Servidor",
"auth.auth_source": "Authentication Source",
"auth.local": "Local",
"auth.forget_password": "¿Has olvidado tu contraseña?",
"auth.disable_register_mail": "Lo sentimos. Los correos de Confirmación de Registro están deshabilitados.",
"auth.disable_register_prompt": "Lo sentimos, el registro está deshabilitado. Por favor, contacta con el administrador del sitio.",
"auth.non_local_account": "Cuentas que no son locales no pueden cambiar las contraseñas a través de Gogs.",
"auth.create_new_account": "Crear una nueva cuenta",
"auth.register_hepler_msg": "¿Ya tienes una cuenta? ¡Inicia sesión!",
"auth.sign_up_now": "¿Necesitas una cuenta? Regístrate ahora.",
"auth.reset_password": "Restablecer su contraseña",
"auth.invalid_code": "Lo sentimos, su código de confirmación ha expirado o no es valido.",
"tool.now": "ahora",
"tool.ago": "hace",
"tool.from_now": "desde ahora",
"tool.1s": "%s 1 segundo",
"tool.1m": "%s 1 minuto",
"tool.1h": "%s 1 hora",
"tool.1d": "%s 1 día",
"tool.1w": "%s 1 semana",
"tool.1mon": "%s 1 mes",
"tool.1y": "%s 1 año",
"tool.seconds": "%[2]s %[1]d segundos",
"tool.minutes": "%[2]s %[1]d minutos",
"tool.hours": "%[2]s %[1]d horas",
"tool.days": "%[2]s %[1]d días",
"tool.weeks": "%[2]s %[1]d semanas",
"tool.months": "%[2]s %[1]d meses",
"tool.years": "%[2]s %[1]d años",
"repo.editor.edit_file": "Editar archivo",
"repo.editor.delete_this_file": "Eliminar este archivo",
"repo.files": "Archivos",
"repo.settings": "Configuración",
"repo.wiki": "Wiki",
"repo.watch": "Seguir",
"repo.unwatch": "Dejar de vigilar",
"repo.star": "Destacar",
"repo.fork": "Fork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "پنل مدیریت",
"settings": "تنظيمات",
"language": "زبان",
"page_not_found": "صفحه مورد نظر یافت نشد.",
"internal_server_error": "خطای داخلی سرور",
"repository": "مخزن",
"username": "نام کاربری",
"email": "ایمیل",
"password": "رمز عبور",
"captcha": "تصویر امنیتی",
"auth_source": "محل احراز هویت",
"local": "محلی",
"forget_password": "رمز عبور خود را فراموش کرده‌اید؟",
"disable_register_mail": "با عرض پوزش، تایید ایمیل ثبت نام غیر فعال شده است.",
"disable_register_prompt": "با عرض پوزش، ثبت نام غیرفعال شده است. لطفا با مدیر سایت تماس بگیرید.",
"non_local_account": "حساب های کاربری غیر محلی قادر به تغییر رمز عبور از طریق Gogs نمی باشند.",
"create_new_account": "ایجاد حساب جدید",
"register_hepler_msg": "قبلا ثبت نام کردید؟ از اینجا وارد شوید!",
"sign_up": "ثبت‌نام کنید",
"sign_up_now": "نیاز به یک حساب دارید؟ هم‌اکنون ثبت نام کنید.",
"reset_password": "تنظیم مجدد رمز عبور",
"invalid_code": "با عرض پوزش، کد تایید شما منقضی شده است و یا معتبر نیست.",
"new_password": "رمز عبور جدید",
"confirm_password": "تأیید رمز عبور",
"diff.parent": "والد",
"diff.commit": "کامیت",
"diff.view_file": "مشاهده فایل",
"editor.edit_file": "ویرایش فایل",
"editor.delete_this_file": "حذف این پرونده"
"status.page_not_found": "صفحه مورد نظر یافت نشد.",
"status.internal_server_error": "خطای داخلی سرور",
"auth.auth_source": "محل احراز هویت",
"auth.local": "محلی",
"auth.forget_password": "رمز عبور خود را فراموش کرده‌اید؟",
"auth.disable_register_mail": "با عرض پوزش، تایید ایمیل ثبت نام غیر فعال شده است.",
"auth.disable_register_prompt": "با عرض پوزش، ثبت نام غیرفعال شده است. لطفا با مدیر سایت تماس بگیرید.",
"auth.non_local_account": "حساب های کاربری غیر محلی قادر به تغییر رمز عبور از طریق Gogs نمی باشند.",
"auth.create_new_account": "ایجاد حساب جدید",
"auth.register_hepler_msg": "قبلا ثبت نام کردید؟ از اینجا وارد شوید!",
"auth.sign_up_now": "نیاز به یک حساب دارید؟ هم‌اکنون ثبت نام کنید.",
"auth.reset_password": "تنظیم مجدد رمز عبور",
"auth.invalid_code": "با عرض پوزش، کد تایید شما منقضی شده است و یا معتبر نیست.",
"tool.now": "حالا",
"tool.ago": "پیش",
"tool.from_now": "از هم اکنون",
"tool.1s": "1 ثانیه %s",
"tool.1m": "1 دقیقه %s",
"tool.1h": "1 ساعت %s",
"tool.1d": "1 روز %s",
"tool.1w": "1 هفته %s",
"tool.1mon": "1 ماه %s",
"tool.1y": "1 سال %s",
"tool.seconds": "%d ثانیه %s",
"tool.minutes": "%d دقیقه %s",
"tool.hours": "%d ساعت %s",
"tool.days": "%d روز %s",
"tool.weeks": "%d هفته %s",
"tool.months": "%d ماه %s",
"tool.years": "%d سال %s",
"repo.editor.edit_file": "ویرایش فایل",
"repo.editor.delete_this_file": "حذف این پرونده",
"repo.files": "پرونده‌ها",
"repo.settings": "تنظيمات",
"repo.wiki": "ویکی",
"repo.watch": "دنبال کردن",
"repo.unwatch": "زیر نظر نگرفتن",
"repo.star": "ستاره دار",
"repo.fork": "انشعاب"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Ylläpito paneeli",
"settings": "Asetukset",
"language": "Kieli",
"page_not_found": "Sivua ei löydy",
"internal_server_error": "Sisäinen palvelinvirhe",
"repository": "Tietosäilö",
"username": "Käyttäjätunnus",
"email": "Sähköposti",
"password": "Salasana",
"captcha": "Captcha",
"auth_source": "Todennuslähde",
"local": "Paikallinen",
"forget_password": "Unohtuiko salasana?",
"disable_register_mail": "Valitettavasti sähköpostipalvelut ovat poissa käytöstä. Otathan yhteyttä sivuston ylläpitoon.",
"disable_register_prompt": "Valitettavasti rekisteröinti on poistettu käytöstä. Ole hyvä ja ota yhteyttä sivuston ylläpitoon.",
"non_local_account": "Vain paikallisten käyttäjätilien salasanan vaihto onnistuu Gogsin kautta.",
"create_new_account": "Luo uusi tili",
"register_hepler_msg": "Onko sinulla jo tili? Kirjaudu sisään nyt!",
"sign_up": "Rekisteröidy",
"sign_up_now": "Tarvitsetko tilin? Rekisteröidy nyt.",
"reset_password": "Nollaa salasanasi",
"invalid_code": "Sori, varmistuskoodisi on vanhentunut tai väärä.",
"new_password": "Uusi salasana",
"confirm_password": "Varmista salasana",
"diff.parent": "vanhempi",
"diff.commit": "sitoutus",
"diff.view_file": "Näytä tiedosto",
"editor.edit_file": "Muokkaa tiedostoa",
"editor.delete_this_file": "Poista tämä tiedosto"
"status.page_not_found": "Sivua ei löydy",
"status.internal_server_error": "Sisäinen palvelinvirhe",
"auth.auth_source": "Todennuslähde",
"auth.local": "Paikallinen",
"auth.forget_password": "Unohtuiko salasana?",
"auth.disable_register_mail": "Valitettavasti sähköpostipalvelut ovat poissa käytöstä. Otathan yhteyttä sivuston ylläpitoon.",
"auth.disable_register_prompt": "Valitettavasti rekisteröinti on poistettu käytöstä. Ole hyvä ja ota yhteyttä sivuston ylläpitoon.",
"auth.non_local_account": "Vain paikallisten käyttäjätilien salasanan vaihto onnistuu Gogsin kautta.",
"auth.create_new_account": "Luo uusi tili",
"auth.register_hepler_msg": "Onko sinulla jo tili? Kirjaudu sisään nyt!",
"auth.sign_up_now": "Tarvitsetko tilin? Rekisteröidy nyt.",
"auth.reset_password": "Nollaa salasanasi",
"auth.invalid_code": "Sori, varmistuskoodisi on vanhentunut tai väärä.",
"tool.now": "nyt",
"tool.ago": "sitten",
"tool.from_now": "alkaen nyt",
"tool.1s": "1 sekunti %s",
"tool.1m": "1 minuutti %s",
"tool.1h": "1 tunti %s",
"tool.1d": "1 päivä %s",
"tool.1w": "1 viikko %s",
"tool.1mon": "1 kuukausi %s",
"tool.1y": "1 vuosi %s",
"tool.seconds": "%d sekuntia %s",
"tool.minutes": "%d minuuttia %s",
"tool.hours": "%d tuntia %s",
"tool.days": "%d päivää %s",
"tool.weeks": "%d viikkoa %s",
"tool.months": "%d kuukautta %s",
"tool.years": "%d vuotta %s",
"repo.editor.edit_file": "Muokkaa tiedostoa",
"repo.editor.delete_this_file": "Poista tämä tiedosto",
"repo.files": "Tiedostot",
"repo.settings": "Asetukset",
"repo.wiki": "Wiki",
"repo.watch": "Tarkkaile",
"repo.unwatch": "Lopeta tarkkailu",
"repo.star": "Äänestä",
"repo.fork": "Haarauta"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Administration",
"settings": "Paramètres",
"language": "Langue",
"page_not_found": "Page non trouvée",
"internal_server_error": "Erreur interne du serveur",
"repository": "Dépôt",
"username": "Nom d'utilisateur",
"email": "E-mail",
"password": "Mot de passe",
"captcha": "Captcha",
"auth_source": "Sources d'authentification",
"local": "Locale",
"forget_password": "Mot de passe oublié ?",
"disable_register_mail": "Désolé, la confirmation par courriel des enregistrements a été désactivée.",
"disable_register_prompt": "Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site.",
"non_local_account": "Les comptes non locaux ne peuvent pas changer leur mot de passe via Gogs.",
"create_new_account": "Créer un nouveau compte",
"register_hepler_msg": "Déjà enregistré ? Connectez-vous !",
"sign_up": "Inscription",
"sign_up_now": "Pas de compte ? Inscrivez-vous maintenant.",
"reset_password": "Réinitialiser le mot de passe",
"invalid_code": "Désolé, votre code de confirmation est invalide ou a expiré.",
"new_password": "Nouveau mot de passe",
"confirm_password": "Confirmez le mot de passe",
"diff.parent": "Parent",
"diff.commit": "commit",
"diff.view_file": "Voir le fichier",
"editor.edit_file": "Modifier fichier",
"editor.delete_this_file": "Supprimer ce fichier"
"status.page_not_found": "Page non trouvée",
"status.internal_server_error": "Erreur interne du serveur",
"auth.auth_source": "Sources d'authentification",
"auth.local": "Locale",
"auth.forget_password": "Mot de passe oublié ?",
"auth.disable_register_mail": "Désolé, la confirmation par courriel des enregistrements a été désactivée.",
"auth.disable_register_prompt": "Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site.",
"auth.non_local_account": "Les comptes non locaux ne peuvent pas changer leur mot de passe via Gogs.",
"auth.create_new_account": "Créer un nouveau compte",
"auth.register_hepler_msg": "Déjà enregistré ? Connectez-vous !",
"auth.sign_up_now": "Pas de compte ? Inscrivez-vous maintenant.",
"auth.reset_password": "Réinitialiser le mot de passe",
"auth.invalid_code": "Désolé, votre code de confirmation est invalide ou a expiré.",
"tool.now": "maintenant",
"tool.ago": "il y a",
"tool.from_now": "dans",
"tool.1s": "%s 1 seconde",
"tool.1m": "%s 1 minute",
"tool.1h": "%s 1 heure",
"tool.1d": "%s 1 jour",
"tool.1w": "%s 1 semaine",
"tool.1mon": "%s 1 mois",
"tool.1y": "%s 1 an",
"tool.seconds": "%[2]s %[1]d secondes",
"tool.minutes": "%[2]s %[1]d minutes",
"tool.hours": "%[2]s %[1]d heures",
"tool.days": "%[2]s %[1]d jours",
"tool.weeks": "%[2]s %[1]d semaines",
"tool.months": "%[2]s %[1]d mois",
"tool.years": "%[2]s %[1]d ans",
"repo.editor.edit_file": "Modifier fichier",
"repo.editor.delete_this_file": "Supprimer ce fichier",
"repo.files": "Fichiers",
"repo.settings": "Paramètres",
"repo.wiki": "Wiki",
"repo.watch": "Suivre",
"repo.unwatch": "Ne plus suivre",
"repo.star": "Voter",
"repo.fork": "Fork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Panel de administración",
"settings": "Configuracións",
"language": "Idioma",
"page_not_found": "Page Not Found",
"internal_server_error": "Internal Server Error",
"repository": "Repositorio",
"username": "Nome da persoa usuaria",
"email": "Correo electrónico",
"password": "Contrasinal",
"captcha": "Captcha=Captcha",
"auth_source": "Fonte de Autenticación",
"local": "Configuración rexional",
"forget_password": "Esqueciches o teu contrasinal?",
"disable_register_mail": "Sentímolo. Os correos de confirmación de rexistro están deshabilitados.",
"disable_register_prompt": "Sentímolo, o rexistro está deshabilitado. Por favor, contacta co administrador do sitio.",
"non_local_account": "Contas que non son locais non poden cambiar os contrasinais a través de Gogs.",
"create_new_account": "Crear unha nova conta",
"register_hepler_msg": "Xa tes unha conta? Inicia sesión!",
"sign_up": "Rexistro",
"sign_up_now": "Necesitas unha conta? Rexístrate agora.",
"reset_password": "Restablecer o teu contrasinal",
"invalid_code": "Sentímolo, o teu código de confirmación expirou ou non é válido.",
"new_password": "Novo contrasinal",
"confirm_password": "Confirmar contrasinal",
"diff.parent": "pai",
"diff.commit": "achega",
"diff.view_file": "Ver ficheiro",
"editor.edit_file": "Editar arquivo",
"editor.delete_this_file": "Borrar este arquivo"
"status.page_not_found": "Page Not Found",
"status.internal_server_error": "Internal Server Error",
"auth.auth_source": "Fonte de Autenticación",
"auth.local": "Configuración rexional",
"auth.forget_password": "Esqueciches o teu contrasinal?",
"auth.disable_register_mail": "Sentímolo. Os correos de confirmación de rexistro están deshabilitados.",
"auth.disable_register_prompt": "Sentímolo, o rexistro está deshabilitado. Por favor, contacta co administrador do sitio.",
"auth.non_local_account": "Contas que non son locais non poden cambiar os contrasinais a través de Gogs.",
"auth.create_new_account": "Crear unha nova conta",
"auth.register_hepler_msg": "Xa tes unha conta? Inicia sesión!",
"auth.sign_up_now": "Necesitas unha conta? Rexístrate agora.",
"auth.reset_password": "Restablecer o teu contrasinal",
"auth.invalid_code": "Sentímolo, o teu código de confirmación expirou ou non é válido.",
"tool.now": "agora",
"tool.ago": "hai",
"tool.from_now": "dende agora",
"tool.1s": "%s 1 segundo",
"tool.1m": "%s 1 minuto",
"tool.1h": "%s 1 hora",
"tool.1d": "%s 1 día",
"tool.1w": "%s 1 semana",
"tool.1mon": "%s 1 mes",
"tool.1y": "%s 1 ano",
"tool.seconds": "%[2]s %[1]d segundos",
"tool.minutes": "%[2]s %[1]d minutos",
"tool.hours": "%[2]s %[1]d horas",
"tool.days": "%[2]s %[1]d días",
"tool.weeks": "%[2]s %[1]d semanas",
"tool.months": "%[2]s %[1]d meses",
"tool.years": "%s %d anos",
"repo.editor.edit_file": "Editar arquivo",
"repo.editor.delete_this_file": "Borrar este arquivo",
"repo.files": "Ficheiros",
"repo.settings": "Configuración",
"repo.wiki": "Wiki",
"repo.watch": "Seguir",
"repo.unwatch": "Deixar de vixiar",
"repo.star": "Destacar",
"repo.fork": "Fork"
}
+39 -21
View File
@@ -20,29 +20,47 @@
"admin_panel": "Rendszergazdai felület",
"settings": "Beállítások",
"language": "Nyelv",
"page_not_found": "Az oldal nem található",
"internal_server_error": "Belső kiszolgálóhiba",
"repository": "Tároló",
"username": "Felhasználónév",
"email": "E-mail",
"password": "Jelszó",
"captcha": "Ellenőrző kód",
"auth_source": "Hitelesítési forrás",
"local": "Helyi",
"forget_password": "Elfelejtette a jelszavát?",
"disable_register_mail": "Elnézést, az email regisztráció megerősítését kikapcsolták.",
"disable_register_prompt": "Elnézést, a regisztrációt kikapcsolták. Kérlek szólj az oldal adminisztrátorának.",
"non_local_account": "Nem helyi felhasználó nem cserélhet jelszót a Gogsban.",
"create_new_account": "Új fiók létrehozása",
"register_hepler_msg": "Van már felhasználói fiókja? Jelentkezz be!",
"sign_up": "Regisztráció",
"sign_up_now": "Szeretne bejelentkezni? Regisztráljon most.",
"reset_password": "Jelszó visszaállítása",
"invalid_code": "Elnézést, a megerősítő kód lejárt vagy hibás.",
"new_password": "Új jelszó",
"confirm_password": "Jelszó megerősítése",
"diff.parent": "szülő",
"diff.commit": "commit",
"diff.view_file": "Fájl Megtekintése",
"editor.edit_file": "Fájl szerkesztése",
"editor.delete_this_file": "A fájl törlése"
"status.page_not_found": "Az oldal nem található",
"status.internal_server_error": "Belső kiszolgálóhiba",
"auth.auth_source": "Hitelesítési forrás",
"auth.local": "Helyi",
"auth.forget_password": "Elfelejtette a jelszavát?",
"auth.disable_register_mail": "Elnézést, az email regisztráció megerősítését kikapcsolták.",
"auth.disable_register_prompt": "Elnézést, a regisztrációt kikapcsolták. Kérlek szólj az oldal adminisztrátorának.",
"auth.non_local_account": "Nem helyi felhasználó nem cserélhet jelszót a Gogsban.",
"auth.create_new_account": "Új fiók létrehozása",
"auth.register_hepler_msg": "Van már felhasználói fiókja? Jelentkezz be!",
"auth.sign_up_now": "Szeretne bejelentkezni? Regisztráljon most.",
"auth.reset_password": "Jelszó visszaállítása",
"auth.invalid_code": "Elnézést, a megerősítő kód lejárt vagy hibás.",
"tool.now": "most",
"tool.from_now": "mostantól",
"tool.1s": "1 másodperce %s",
"tool.1m": "1 perce %s",
"tool.1h": "1 órája %s",
"tool.1d": "1 napja %s",
"tool.1w": "1 hete %s",
"tool.1mon": "1 hónapja %s",
"tool.1y": "1 éve %s",
"tool.seconds": "%d másodperce %s",
"tool.minutes": "%d perce %s",
"tool.hours": "%d órája %s",
"tool.days": "%d napja %s",
"tool.weeks": "%d hete %s",
"tool.months": "%d hónapja %s",
"tool.years": "%d éve %s",
"repo.editor.edit_file": "Fájl szerkesztése",
"repo.editor.delete_this_file": "A fájl törlése",
"repo.files": "Fájlok",
"repo.settings": "Beállítások",
"repo.wiki": "Wiki",
"repo.watch": "Figyelés",
"repo.unwatch": "Figyelés törlése",
"repo.star": "Kedvenc",
"repo.fork": "Másolás"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Panel Admin",
"settings": "Pengaturan",
"language": "Bahasa",
"page_not_found": "Halaman tidak ditemukan",
"internal_server_error": "Kesalahan Server Internal",
"repository": "Repositori",
"username": "Nama pengguna",
"email": "Email",
"password": "Sandi",
"captcha": "Captcha",
"auth_source": "Sumber Autentikasi",
"local": "Lokal",
"forget_password": "Lupa sandi?",
"disable_register_mail": "Maaf, konfirmasi pendaftaran melalui email telah dinonaktifkan.",
"disable_register_prompt": "Maaf, pendaftaran telah dinonaktifkan. Hubungi administrator situs.",
"non_local_account": "Akun non-lokal tidak dapat mengganti password lewat Gogs.",
"create_new_account": "Buat akun baru",
"register_hepler_msg": "Sudah memiliki account? Sign in sekarang!",
"sign_up": "Daftar",
"sign_up_now": "Membutuhkan akun? Daftar sekarang.",
"reset_password": "Atur Ulang Sandi",
"invalid_code": "Maaf, kode konfirmasi Anda telah kadaluarsa atau tidak valid.",
"new_password": "Sandi baru",
"confirm_password": "Konfirmasi sandi",
"diff.parent": "induk",
"diff.commit": "melakukan",
"diff.view_file": "Tampilan Berkas",
"editor.edit_file": "Edit berkas",
"editor.delete_this_file": "Hapus berkas ini"
"status.page_not_found": "Halaman tidak ditemukan",
"status.internal_server_error": "Kesalahan Server Internal",
"auth.auth_source": "Sumber Autentikasi",
"auth.local": "Lokal",
"auth.forget_password": "Lupa sandi?",
"auth.disable_register_mail": "Maaf, konfirmasi pendaftaran melalui email telah dinonaktifkan.",
"auth.disable_register_prompt": "Maaf, pendaftaran telah dinonaktifkan. Hubungi administrator situs.",
"auth.non_local_account": "Akun non-lokal tidak dapat mengganti password lewat Gogs.",
"auth.create_new_account": "Buat akun baru",
"auth.register_hepler_msg": "Sudah memiliki account? Sign in sekarang!",
"auth.sign_up_now": "Membutuhkan akun? Daftar sekarang.",
"auth.reset_password": "Atur Ulang Sandi",
"auth.invalid_code": "Maaf, kode konfirmasi Anda telah kadaluarsa atau tidak valid.",
"tool.now": "sekarang",
"tool.ago": "lalu",
"tool.from_now": "dari sekarang",
"tool.1s": "1 detik %s",
"tool.1m": "1 menit %s",
"tool.1h": "1 jam %s",
"tool.1d": "1 hari %s",
"tool.1w": "1 Minggu %s",
"tool.1mon": "1 bulan %s",
"tool.1y": "1 tahun %s",
"tool.seconds": "%d detik %s",
"tool.minutes": "%d menit %s",
"tool.hours": "%d jam %s",
"tool.days": "%d hari %s",
"tool.weeks": "%d minggu %s",
"tool.months": "%d bulan %s",
"tool.years": "%d tahun %s",
"repo.editor.edit_file": "Edit berkas",
"repo.editor.delete_this_file": "Hapus berkas ini",
"repo.files": "Berkas",
"repo.settings": "Pengaturan",
"repo.wiki": "Wiki",
"repo.watch": "Liatin",
"repo.unwatch": "Batal liatin",
"repo.star": "Bintangi",
"repo.fork": "Fork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Pannello di amministrazione",
"settings": "Impostazioni",
"language": "Lingua",
"page_not_found": "Pagina Non Trovata",
"internal_server_error": "Errore Interno del Server",
"repository": "Repository",
"username": "Nome utente",
"email": "E-mail",
"password": "Password",
"captcha": "Captcha",
"auth_source": "Fonte di autenticazione",
"local": "Locale",
"forget_password": "Password dimenticata?",
"disable_register_mail": "Siamo spiacenti, la conferma di registrazione via Mail è stata disattivata.",
"disable_register_prompt": "Siamo spiacenti, registrazione è stata disabilitata. Si prega di contattare l'amministratore del sito.",
"non_local_account": "Gli account non locali non possono modificare le password tramite Gogs.",
"create_new_account": "Crea un nuovo Account",
"register_hepler_msg": "Hai già un account? Accedi ora!",
"sign_up": "Registrati",
"sign_up_now": "Bisogno di un account? Iscriviti ora.",
"reset_password": "Reimposta la tua Password",
"invalid_code": "Siamo spiacenti, il codice di conferma è scaduto o non valido.",
"new_password": "Nuova Password",
"confirm_password": "Conferma Password",
"diff.parent": "parent",
"diff.commit": "commit",
"diff.view_file": "Vedi File",
"editor.edit_file": "Modifica file",
"editor.delete_this_file": "Elimina questo file"
"status.page_not_found": "Pagina Non Trovata",
"status.internal_server_error": "Errore Interno del Server",
"auth.auth_source": "Fonte di autenticazione",
"auth.local": "Locale",
"auth.forget_password": "Password dimenticata?",
"auth.disable_register_mail": "Siamo spiacenti, la conferma di registrazione via Mail è stata disattivata.",
"auth.disable_register_prompt": "Siamo spiacenti, registrazione è stata disabilitata. Si prega di contattare l'amministratore del sito.",
"auth.non_local_account": "Gli account non locali non possono modificare le password tramite Gogs.",
"auth.create_new_account": "Crea un nuovo Account",
"auth.register_hepler_msg": "Hai già un account? Accedi ora!",
"auth.sign_up_now": "Bisogno di un account? Iscriviti ora.",
"auth.reset_password": "Reimposta la tua Password",
"auth.invalid_code": "Siamo spiacenti, il codice di conferma è scaduto o non valido.",
"tool.now": "ora",
"tool.ago": "fa",
"tool.from_now": "da adesso",
"tool.1s": "1 secondo %s",
"tool.1m": "1 minuto %s",
"tool.1h": "1 ora %s",
"tool.1d": "1 giorno %s",
"tool.1w": "1 settimana %s",
"tool.1mon": "1 mese %s",
"tool.1y": "1 anno %s",
"tool.seconds": "%d secondi %s",
"tool.minutes": "%d minuti %s",
"tool.hours": "%d ore %s",
"tool.days": "%d giorni %s",
"tool.weeks": "%d settimane %s",
"tool.months": "%d mesi %s",
"tool.years": "%d anni %s",
"repo.editor.edit_file": "Modifica file",
"repo.editor.delete_this_file": "Elimina questo file",
"repo.files": "File",
"repo.settings": "Impostazioni",
"repo.wiki": "Wiki",
"repo.watch": "Segui",
"repo.unwatch": "Non seguire più",
"repo.star": "Vota",
"repo.fork": "Forka"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "管理者パネル",
"settings": "設定",
"language": "言語",
"page_not_found": "ページが見つかりません",
"internal_server_error": "サーバ内部エラー",
"repository": "リポジトリ",
"username": "ユーザー名",
"email": "メールアドレス",
"password": "パスワード",
"captcha": "CAPTCHA",
"auth_source": "認証ソース",
"local": "ローカル",
"forget_password": "パスワードを忘れましたか?",
"disable_register_mail": "申し訳ありませんが、登録メールの確認機能が無効になっています。",
"disable_register_prompt": "申し訳ありませんが、現在登録は受け付けておりません。サイトの管理者にお問い合わせください。",
"non_local_account": "非ローカルアカウントではGogs経由でのパスワード変更はできません。",
"create_new_account": "新規アカウントを作成",
"register_hepler_msg": "既にアカウントをお持ちですか?今すぐログインしましょう!",
"sign_up": "サインアップ",
"sign_up_now": "アカウントが必要ですか?今すぐ登録しましょう!",
"reset_password": "パスワードリセット",
"invalid_code": "申し訳ありませんが、確認用コードが期限切れまたは無効です。",
"new_password": "新しいパスワード",
"confirm_password": "パスワード確認",
"diff.parent": "",
"diff.commit": "コミット",
"diff.view_file": "ファイルの表示",
"editor.edit_file": "ファイルを編集",
"editor.delete_this_file": "このファイルを削除"
"status.page_not_found": "ページが見つかりません",
"status.internal_server_error": "サーバ内部エラー",
"auth.auth_source": "認証ソース",
"auth.local": "ローカル",
"auth.forget_password": "パスワードを忘れましたか?",
"auth.disable_register_mail": "申し訳ありませんが、登録メールの確認機能が無効になっています。",
"auth.disable_register_prompt": "申し訳ありませんが、現在登録は受け付けておりません。サイトの管理者にお問い合わせください。",
"auth.non_local_account": "非ローカルアカウントではGogs経由でのパスワード変更はできません。",
"auth.create_new_account": "新規アカウントを作成",
"auth.register_hepler_msg": "既にアカウントをお持ちですか?今すぐログインしましょう!",
"auth.sign_up_now": "アカウントが必要ですか?今すぐ登録しましょう!",
"auth.reset_password": "パスワードリセット",
"auth.invalid_code": "申し訳ありませんが、確認用コードが期限切れまたは無効です。",
"tool.now": "",
"tool.ago": "",
"tool.from_now": "今から",
"tool.1s": "1 秒 %s",
"tool.1m": "1 分 %s",
"tool.1h": "1 時間 %s",
"tool.1d": "1 日 %s",
"tool.1w": "1 週間 %s",
"tool.1mon": "1 ヶ月 %s",
"tool.1y": "1 年間 %s",
"tool.seconds": "%d 秒 %s",
"tool.minutes": "%d分%s",
"tool.hours": "%d 時間 %s",
"tool.days": "%d 日 %s",
"tool.weeks": "%d 週間 %s",
"tool.months": "%d ヶ月 %s",
"tool.years": "%d 年 %s",
"repo.editor.edit_file": "ファイルを編集",
"repo.editor.delete_this_file": "このファイルを削除",
"repo.files": "ファイル",
"repo.settings": "設定",
"repo.wiki": "Wiki",
"repo.watch": "ウォッチ",
"repo.unwatch": "ウォッチ解除",
"repo.star": "スター",
"repo.fork": "フォーク"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "관리자 패널",
"settings": "설정",
"language": "언어",
"page_not_found": "페이지를 찾을 수 없음",
"internal_server_error": "내부 서버 오류",
"repository": "저장소",
"username": "사용자명",
"email": "이메일",
"password": "비밀번호",
"captcha": "보안 문자",
"auth_source": "인증 소스 편집",
"local": "로컬",
"forget_password": "비밀번호를 잊으셨습니까?",
"disable_register_mail": "죄송합니다. 메일 등록이 비활성화 되었습니다.",
"disable_register_prompt": "죄송합니다, 가입이 비활성화 되어있습니다. 사이트 관리자에게 문의 해주세요.",
"non_local_account": "Gogs 계정이 아니면 암호를 변경할 수 없습니다.",
"create_new_account": "새 계정 생성",
"register_hepler_msg": "이미 계정을 가지고 계신가요? 로그인하세요!",
"sign_up": "가입하기",
"sign_up_now": "계정이 필요하신가요? 지금 가입하세요.",
"reset_password": "비밀번호 초기화",
"invalid_code": "죄송합니다. 확인 코드가 만료되었거나 유효하지 않습니다.",
"new_password": "새 비밀번호",
"confirm_password": "비밀번호 확인",
"diff.parent": "부모",
"diff.commit": "커밋",
"diff.view_file": "파일 보기",
"editor.edit_file": "파일 수정",
"editor.delete_this_file": "이 파일을 삭제"
"status.page_not_found": "페이지를 찾을 수 없음",
"status.internal_server_error": "내부 서버 오류",
"auth.auth_source": "인증 소스 편집",
"auth.local": "로컬",
"auth.forget_password": "비밀번호를 잊으셨습니까?",
"auth.disable_register_mail": "죄송합니다. 메일 등록이 비활성화 되었습니다.",
"auth.disable_register_prompt": "죄송합니다, 가입이 비활성화 되어있습니다. 사이트 관리자에게 문의 해주세요.",
"auth.non_local_account": "Gogs 계정이 아니면 암호를 변경할 수 없습니다.",
"auth.create_new_account": "새 계정 생성",
"auth.register_hepler_msg": "이미 계정을 가지고 계신가요? 로그인하세요!",
"auth.sign_up_now": "계정이 필요하신가요? 지금 가입하세요.",
"auth.reset_password": "비밀번호 초기화",
"auth.invalid_code": "죄송합니다. 확인 코드가 만료되었거나 유효하지 않습니다.",
"tool.now": "현재",
"tool.ago": "",
"tool.from_now": "지금부터",
"tool.1s": "1 초 %s",
"tool.1m": "1 분 %s",
"tool.1h": "1 시간 %s",
"tool.1d": "1 일 %s",
"tool.1w": "1 주 %s",
"tool.1mon": "1 개월 %s",
"tool.1y": "1 년 %s",
"tool.seconds": "%d 초 %s",
"tool.minutes": "%d 분 %s",
"tool.hours": "%d 시간 %s",
"tool.days": "%d 일 %s",
"tool.weeks": "%d 주 %s",
"tool.months": "%d 달 %s",
"tool.years": "%d 년 %s",
"repo.editor.edit_file": "파일 수정",
"repo.editor.delete_this_file": "이 파일을 삭제",
"repo.files": "파일",
"repo.settings": "설정",
"repo.wiki": "위키",
"repo.watch": "Watch",
"repo.unwatch": "Unwatch",
"repo.star": "Star",
"repo.fork": "포크"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Admin panelis",
"settings": "Iestatījumi",
"language": "Valoda",
"page_not_found": "Page Not Found",
"internal_server_error": "Internal Server Error",
"repository": "Repozitorijs",
"username": "Lietotājvārds",
"email": "E-pasts",
"password": "Parole",
"captcha": "Pārbaudes kods",
"auth_source": "Autentificēšanas avots",
"local": "Local",
"forget_password": "Aizmirsi paroli?",
"disable_register_mail": "Atvainojiet, reģistrācijas e-pasta apstiprināšana ir atspējota.",
"disable_register_prompt": "Atvainojiet, reģistrācija ir atspējota. Lūdzu, sazinieties ar vietnes administratoru.",
"non_local_account": "Tikai lokālie konti var nomainīt savu paroli Gogs.",
"create_new_account": "Izveidot jaunu kontu",
"register_hepler_msg": "Jau ir konts? Pieraksties tagad!",
"sign_up": "Reģistrēties",
"sign_up_now": "Nepieciešams konts? Reģistrējies tagad.",
"reset_password": "Atjaunot savu paroli",
"invalid_code": "Atvainojiet, Jūsu apstiprināšanas kodam ir beidzies derīguma termiņš vai arī tas ir nepareizs.",
"new_password": "Jauna parole",
"confirm_password": "Apstipriniet paroli",
"diff.parent": "vecāks",
"diff.commit": "revīzija",
"diff.view_file": "Parādīt failu",
"editor.edit_file": "Labot failu",
"editor.delete_this_file": "Dzēst šo failu"
"status.page_not_found": "Page Not Found",
"status.internal_server_error": "Internal Server Error",
"auth.auth_source": "Autentificēšanas avots",
"auth.local": "Local",
"auth.forget_password": "Aizmirsi paroli?",
"auth.disable_register_mail": "Atvainojiet, reģistrācijas e-pasta apstiprināšana ir atspējota.",
"auth.disable_register_prompt": "Atvainojiet, reģistrācija ir atspējota. Lūdzu, sazinieties ar vietnes administratoru.",
"auth.non_local_account": "Tikai lokālie konti var nomainīt savu paroli Gogs.",
"auth.create_new_account": "Izveidot jaunu kontu",
"auth.register_hepler_msg": "Jau ir konts? Pieraksties tagad!",
"auth.sign_up_now": "Nepieciešams konts? Reģistrējies tagad.",
"auth.reset_password": "Atjaunot savu paroli",
"auth.invalid_code": "Atvainojiet, Jūsu apstiprināšanas kodam ir beidzies derīguma termiņš vai arī tas ir nepareizs.",
"tool.now": "tagad",
"tool.ago": "atpakaļ",
"tool.from_now": "no šī brīža",
"tool.1s": "1 sekundi %s",
"tool.1m": "1 minūti %s",
"tool.1h": "1 stundu %s",
"tool.1d": "1 dienu %s",
"tool.1w": "1 nedēļu %s",
"tool.1mon": "1 mēnesi %s",
"tool.1y": "1 gadu %s",
"tool.seconds": "%d sekundes %s",
"tool.minutes": "%d minūtes %s",
"tool.hours": "%d stundas %s",
"tool.days": "%d dienas %s",
"tool.weeks": "%d nedēļas %s",
"tool.months": "%d mēneši %s",
"tool.years": "%d gadi %s",
"repo.editor.edit_file": "Labot failu",
"repo.editor.delete_this_file": "Dzēst šo failu",
"repo.files": "Faili",
"repo.settings": "Iestatījumi",
"repo.wiki": "Vikivietne",
"repo.watch": "Vērot",
"repo.unwatch": "Nevērot",
"repo.star": "Pievienot zvaigznīti",
"repo.fork": "Atdalīts"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Админ удирдлага",
"settings": "Тохиргоо",
"language": "Хэл",
"page_not_found": "Хуудас олдсонгүй",
"internal_server_error": "Сервертэй холбогдоход алдаа гарлаа.",
"repository": "Репо",
"username": "Нэвтрэх нэр",
"email": "Имэйл",
"password": "Нууц үг",
"captcha": "Батлах тэмдэгт",
"auth_source": "Баталгаажуулалтын эх сурвалж",
"local": "Локал",
"forget_password": "Нууц үг сэргээх?",
"disable_register_mail": "Уучлаарай, имэйлийн үйлчилгээ идэвхгүй байна. Сайтын админтай холбоо барина уу.",
"disable_register_prompt": "Уучлаарай, бүртгэл идэвхгүй байна. Сайтын админтай холбоо барина уу.",
"non_local_account": "Гадаад хэрэглэгчид нууц үгээ солих боломжгүй.",
"create_new_account": "Шинэ данс үүсгэх",
"register_hepler_msg": "Та хэрэглэгчийн эрхээ үүсгэсэн бол Нэвтрэх хуудас руу шилжих!",
"sign_up": "Бүртгүүлэх",
"sign_up_now": "Данс үүсгэх бол? Одоо бүртгүүлнэ үү.",
"reset_password": "Нууц үгээ сэргээх",
"invalid_code": "Уучлаарай, таны баталгаажуулах кодын хугацаа дууссан эсвэл хүчин төгөлдөр бус байна.",
"new_password": "Шинэ нууц үг",
"confirm_password": "Confirm Password",
"diff.parent": "parent",
"diff.commit": "commit",
"diff.view_file": "Файл харах",
"editor.edit_file": "Файл засах",
"editor.delete_this_file": "Энэ файлыг устгах"
"status.page_not_found": "Хуудас олдсонгүй",
"status.internal_server_error": "Сервертэй холбогдоход алдаа гарлаа.",
"auth.auth_source": "Баталгаажуулалтын эх сурвалж",
"auth.local": "Локал",
"auth.forget_password": "Нууц үг сэргээх?",
"auth.disable_register_mail": "Уучлаарай, имэйлийн үйлчилгээ идэвхгүй байна. Сайтын админтай холбоо барина уу.",
"auth.disable_register_prompt": "Уучлаарай, бүртгэл идэвхгүй байна. Сайтын админтай холбоо барина уу.",
"auth.non_local_account": "Гадаад хэрэглэгчид нууц үгээ солих боломжгүй.",
"auth.create_new_account": "Шинэ данс үүсгэх",
"auth.register_hepler_msg": "Та хэрэглэгчийн эрхээ үүсгэсэн бол Нэвтрэх хуудас руу шилжих!",
"auth.sign_up_now": "Данс үүсгэх бол? Одоо бүртгүүлнэ үү.",
"auth.reset_password": "Нууц үгээ сэргээх",
"auth.invalid_code": "Уучлаарай, таны баталгаажуулах кодын хугацаа дууссан эсвэл хүчин төгөлдөр бус байна.",
"tool.now": "одоо",
"tool.ago": "өмнө",
"tool.from_now": "одооноос",
"tool.1s": "1 секунд %s",
"tool.1m": "1 минут %s",
"tool.1h": "1 цаг %s",
"tool.1d": "1 өдөр %s",
"tool.1w": "1 долоо хоног %s",
"tool.1mon": "1 сар %s",
"tool.1y": "1 жил %s",
"tool.seconds": "%d секунд %s",
"tool.minutes": "%d минут %s",
"tool.hours": "%d цаг %s",
"tool.days": "%d өдөр %s",
"tool.weeks": "%d долоо хоног %s",
"tool.months": "%d сар %s",
"tool.years": "%d жил %s",
"repo.editor.edit_file": "Файл засах",
"repo.editor.delete_this_file": "Энэ файлыг устгах",
"repo.files": "Файлууд",
"repo.settings": "Тохиргоо",
"repo.wiki": "Мэдлэгийн сан",
"repo.watch": "Үзэх жагсаалтад нэмэх",
"repo.unwatch": "Үзэх жагсаалтаас хасах",
"repo.star": "Онцлох жагсаалтад нэмэх",
"repo.fork": "Салаа"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Adminpaneel",
"settings": "Instellingen",
"language": "Taal",
"page_not_found": "Pagina niet gevonden",
"internal_server_error": "Interne Server Fout",
"repository": "Repository",
"username": "Gebruikersnaam",
"email": "E-mail",
"password": "Wachtwoord",
"captcha": "CAPTCHA",
"auth_source": "Authenticatiebron",
"local": "Lokaal",
"forget_password": "Wachtwoord vergeten?",
"disable_register_mail": "Sorry, bevestiging van registratie per e-mail is uitgeschakeld.",
"disable_register_prompt": "Sorry, registratie is uitgeschakeld. Neem contact op met de beheerder van deze site.",
"non_local_account": "Niet lokale accounts mogen hun wachtwoord niet veranderen via Gogs.",
"create_new_account": "Maak nieuw account aan",
"register_hepler_msg": "Heeft u al een account? Meld u nu aan!",
"sign_up": "Aanmelden",
"sign_up_now": "Een account nodig? Meld u nu aan.",
"reset_password": "Reset uw wachtwoord",
"invalid_code": "Sorry, uw bevestigingscode is verlopen of niet meer geldig.",
"new_password": "Nieuw wachtwoord",
"confirm_password": "Verifieer wachtwoord",
"diff.parent": "bovenliggende",
"diff.commit": "commit",
"diff.view_file": "Bestand weergeven",
"editor.edit_file": "Bewerk bestand",
"editor.delete_this_file": "Verwijder dit bestand"
"status.page_not_found": "Pagina niet gevonden",
"status.internal_server_error": "Interne Server Fout",
"auth.auth_source": "Authenticatiebron",
"auth.local": "Lokaal",
"auth.forget_password": "Wachtwoord vergeten?",
"auth.disable_register_mail": "Sorry, bevestiging van registratie per e-mail is uitgeschakeld.",
"auth.disable_register_prompt": "Sorry, registratie is uitgeschakeld. Neem contact op met de beheerder van deze site.",
"auth.non_local_account": "Niet lokale accounts mogen hun wachtwoord niet veranderen via Gogs.",
"auth.create_new_account": "Maak nieuw account aan",
"auth.register_hepler_msg": "Heeft u al een account? Meld u nu aan!",
"auth.sign_up_now": "Een account nodig? Meld u nu aan.",
"auth.reset_password": "Reset uw wachtwoord",
"auth.invalid_code": "Sorry, uw bevestigingscode is verlopen of niet meer geldig.",
"tool.now": "nu",
"tool.ago": "geleden",
"tool.from_now": "vanaf nu",
"tool.1s": "1 seconde %s",
"tool.1m": "1 minuut %s",
"tool.1h": "1 uur %s",
"tool.1d": "1 dag %s",
"tool.1w": "1 week %s",
"tool.1mon": "1 maand %s",
"tool.1y": "1 jaar %s",
"tool.seconds": "%d seconden %s",
"tool.minutes": "%d minuten %s",
"tool.hours": "%d uur %s",
"tool.days": "%d dagen %s",
"tool.weeks": "%d weken %s",
"tool.months": "%d maanden %s",
"tool.years": "%d jaren %s",
"repo.editor.edit_file": "Bewerk bestand",
"repo.editor.delete_this_file": "Verwijder dit bestand",
"repo.files": "Bestanden",
"repo.settings": "Instellingen",
"repo.wiki": "Wiki",
"repo.watch": "Volgen",
"repo.unwatch": "Negeren",
"repo.star": "Ster",
"repo.fork": "Vork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Panel admina",
"settings": "Ustawienia",
"language": "Język",
"page_not_found": "Strona nie została znaleziona",
"internal_server_error": "Wewnętrzny błąd serwera",
"repository": "Repozytorium",
"username": "Nazwa użytkownika",
"email": "E-mail",
"password": "Hasło",
"captcha": "Captcha",
"auth_source": "Źródło uwierzytelniania",
"local": "Lokalne",
"forget_password": "Zapomniałeś hasła?",
"disable_register_mail": "Przepraszamy, potwierdzenia rejestracji zostały wyłączone przez administratora.",
"disable_register_prompt": "Przepraszamy rejestracja została wyłączona. Prosimy o kontakt z administratorem serwisu.",
"non_local_account": "Nie lokalne konta nie mogą zmieniać haseł przez Gogs.",
"create_new_account": "Załóż nowe konto",
"register_hepler_msg": "Masz już konto? Zaloguj się teraz!",
"sign_up": "Zarejestruj się",
"sign_up_now": "Potrzebujesz konta? Zarejestruj się teraz.",
"reset_password": "Resetowanie hasła",
"invalid_code": "Niestety, Twój kod potwierdzający wygasł lub jest nieprawidłowy.",
"new_password": "Nowe hasło",
"confirm_password": "Potwierdź hasło",
"diff.parent": "rodzic",
"diff.commit": "commit",
"diff.view_file": "Wyświetl plik",
"editor.edit_file": "Edytuj plik",
"editor.delete_this_file": "Usuń ten plik"
"status.page_not_found": "Strona nie została znaleziona",
"status.internal_server_error": "Wewnętrzny błąd serwera",
"auth.auth_source": "Źródło uwierzytelniania",
"auth.local": "Lokalne",
"auth.forget_password": "Zapomniałeś hasła?",
"auth.disable_register_mail": "Przepraszamy, potwierdzenia rejestracji zostały wyłączone przez administratora.",
"auth.disable_register_prompt": "Przepraszamy rejestracja została wyłączona. Prosimy o kontakt z administratorem serwisu.",
"auth.non_local_account": "Nie lokalne konta nie mogą zmieniać haseł przez Gogs.",
"auth.create_new_account": "Załóż nowe konto",
"auth.register_hepler_msg": "Masz już konto? Zaloguj się teraz!",
"auth.sign_up_now": "Potrzebujesz konta? Zarejestruj się teraz.",
"auth.reset_password": "Resetowanie hasła",
"auth.invalid_code": "Niestety, Twój kod potwierdzający wygasł lub jest nieprawidłowy.",
"tool.now": "teraz",
"tool.ago": "temu",
"tool.from_now": "od teraz",
"tool.1s": "1 sekundę %s",
"tool.1m": "1 minutę %s",
"tool.1h": "1 godzinę %s",
"tool.1d": "1 dzień %s",
"tool.1w": "1 tydzień %s",
"tool.1mon": "1 miesiąc %s",
"tool.1y": "1 rok %s",
"tool.seconds": "%d sekund %s",
"tool.minutes": "%d minut %s",
"tool.hours": "%d godzin %s",
"tool.days": "%d dni %s",
"tool.weeks": "%d tygodni %s",
"tool.months": "%d miesięcy %s",
"tool.years": "%d lat %s",
"repo.editor.edit_file": "Edytuj plik",
"repo.editor.delete_this_file": "Usuń ten plik",
"repo.files": "Pliki",
"repo.settings": "Ustawienia",
"repo.wiki": "Wiki",
"repo.watch": "Obserwuj",
"repo.unwatch": "Przestań obserwować",
"repo.star": "Polub",
"repo.fork": "Forkuj"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Painel do administrador",
"settings": "Configurações",
"language": "Idioma",
"page_not_found": "Página Não Encontrada",
"internal_server_error": "Erro interno do servidor",
"repository": "Repositório",
"username": "Usuário",
"email": "E-mail",
"password": "Senha",
"captcha": "Captcha",
"auth_source": "Fonte de autenticação",
"local": "Local",
"forget_password": "Esqueceu a senha?",
"disable_register_mail": "Desculpe, a confirmação de registro por e-mail foi desabilitada.",
"disable_register_prompt": "Desculpe, novos registros estão desabilitados. Por favor entre em contato com o administrador do site.",
"non_local_account": "Não é possível mudar a senha de contas remotas pelo Gogs.",
"create_new_account": "Criar nova conta",
"register_hepler_msg": "Já tem uma conta? Entre agora!",
"sign_up": "Cadastrar",
"sign_up_now": "Precisa de uma conta? Cadastre-se agora.",
"reset_password": "Redefinir sua senha",
"invalid_code": "Desculpe, seu código de confirmação expirou ou não é válido.",
"new_password": "Nova senha",
"confirm_password": "Confirmar senha",
"diff.parent": "pai",
"diff.commit": "commit",
"diff.view_file": "Ver arquivo",
"editor.edit_file": "Editar arquivo",
"editor.delete_this_file": "Excluir este arquivo"
"status.page_not_found": "Página Não Encontrada",
"status.internal_server_error": "Erro interno do servidor",
"auth.auth_source": "Fonte de autenticação",
"auth.local": "Local",
"auth.forget_password": "Esqueceu a senha?",
"auth.disable_register_mail": "Desculpe, a confirmação de registro por e-mail foi desabilitada.",
"auth.disable_register_prompt": "Desculpe, novos registros estão desabilitados. Por favor entre em contato com o administrador do site.",
"auth.non_local_account": "Não é possível mudar a senha de contas remotas pelo Gogs.",
"auth.create_new_account": "Criar nova conta",
"auth.register_hepler_msg": "Já tem uma conta? Entre agora!",
"auth.sign_up_now": "Precisa de uma conta? Cadastre-se agora.",
"auth.reset_password": "Redefinir sua senha",
"auth.invalid_code": "Desculpe, seu código de confirmação expirou ou não é válido.",
"tool.now": "agora",
"tool.ago": "atrás",
"tool.from_now": "a partir de agora",
"tool.1s": "1 segundo %s",
"tool.1m": "1 minuto %s",
"tool.1h": "1 hora %s",
"tool.1d": "1 dia %s",
"tool.1w": "1 semana %s",
"tool.1mon": "1 mês %s",
"tool.1y": "1 ano %s",
"tool.seconds": "%d segundos %s",
"tool.minutes": "%d minutos %s",
"tool.hours": "%d horas %s",
"tool.days": "%d dias %s",
"tool.weeks": "%d semanas %s",
"tool.months": "%d meses %s",
"tool.years": "%d anos %s",
"repo.editor.edit_file": "Editar arquivo",
"repo.editor.delete_this_file": "Excluir este arquivo",
"repo.files": "Arquivos",
"repo.settings": "Configurações",
"repo.wiki": "Wiki",
"repo.watch": "Observar",
"repo.unwatch": "Deixar de observar",
"repo.star": "Favorito",
"repo.fork": "Fork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Painel de Administração",
"settings": "Definições",
"language": "Língua",
"page_not_found": "Página Não Encontrada",
"internal_server_error": "Erro do servidor interno",
"repository": "Repositório",
"username": "Nome de utilizador",
"email": "Endereço de email",
"password": "Palavra-chave",
"captcha": "Captcha",
"auth_source": "Tipo de autenticação",
"local": "Local",
"forget_password": "Esqueceu a sua senha?",
"disable_register_mail": "Desculpe, os serviços de email estão desativados. Por favor contacte o administrador.",
"disable_register_prompt": "Desculpe, o registo de novos utilizadores está desativado. Por favor contacte o administrador.",
"non_local_account": "Contas não-locais não podem mudar a palavra-passe através do Gogs.",
"create_new_account": "Criar Nova Conta",
"register_hepler_msg": "Já tem uma conta? Inicie sessão!",
"sign_up": "Criar conta",
"sign_up_now": "Precisa de uma conta? Inscreva-se agora.",
"reset_password": "Restaurar a sua senha",
"invalid_code": "Desculpe, o seu código de confirmação expirou ou é inválido.",
"new_password": "Nova senha",
"confirm_password": "Confirmar senha",
"diff.parent": "pai",
"diff.commit": "commit",
"diff.view_file": "Ver Ficheiro",
"editor.edit_file": "Edita ficheiro",
"editor.delete_this_file": "Apagar este ficheiro"
"status.page_not_found": "Página Não Encontrada",
"status.internal_server_error": "Erro do servidor interno",
"auth.auth_source": "Tipo de autenticação",
"auth.local": "Local",
"auth.forget_password": "Esqueceu a sua senha?",
"auth.disable_register_mail": "Desculpe, os serviços de email estão desativados. Por favor contacte o administrador.",
"auth.disable_register_prompt": "Desculpe, o registo de novos utilizadores está desativado. Por favor contacte o administrador.",
"auth.non_local_account": "Contas não-locais não podem mudar a palavra-passe através do Gogs.",
"auth.create_new_account": "Criar Nova Conta",
"auth.register_hepler_msg": "Já tem uma conta? Inicie sessão!",
"auth.sign_up_now": "Precisa de uma conta? Inscreva-se agora.",
"auth.reset_password": "Restaurar a sua senha",
"auth.invalid_code": "Desculpe, o seu código de confirmação expirou ou é inválido.",
"tool.now": "agora",
"tool.ago": "atrás",
"tool.from_now": "a partir de agora",
"tool.1s": "1 segundo %s",
"tool.1m": "há 1 minuto %s",
"tool.1h": "há 1 hora %s",
"tool.1d": "há 1 dia %s",
"tool.1w": "há 1 semana %s",
"tool.1mon": "há 1 mês %s",
"tool.1y": "há 1 ano %s",
"tool.seconds": "há %d segundos %s",
"tool.minutes": "há %d minutos %s",
"tool.hours": "há %d horas %s",
"tool.days": "há %d dias %s",
"tool.weeks": "há %d semanas %s",
"tool.months": "há %d meses %s",
"tool.years": "há %d anos %s",
"repo.editor.edit_file": "Edita ficheiro",
"repo.editor.delete_this_file": "Apagar este ficheiro",
"repo.files": "Ficheiros",
"repo.settings": "Definições",
"repo.wiki": "Wiki",
"repo.watch": "Vigiar",
"repo.unwatch": "Deixar de vigiar",
"repo.star": "Colocar Estrela",
"repo.fork": "Fork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Panou Administrator",
"settings": "Setări",
"language": "Limba",
"page_not_found": "Pagina nu a fost găsită",
"internal_server_error": "Eroare internă de server",
"repository": "Repositoriu",
"username": "Numele de utilizator",
"email": "E-mail",
"password": "Parolă",
"captcha": "Captcha",
"auth_source": "Sursa de autentificare",
"local": "Local",
"forget_password": "Ați uitat parola?",
"disable_register_mail": "Ne pare rău, serviciile de e-mail sunt dezactivate. Vă rugăm să contactați administratorul site-ului.",
"disable_register_prompt": "Ne pare rău, înregistrarea a fost dezactivată. Vă rugăm să contactați administratorul site-ului.",
"non_local_account": "Conturile non-locale nu pot schimba parolele prin Gogs.",
"create_new_account": "Creați un cont nou",
"register_hepler_msg": "Aveți deja un cont? Conectați-vă acum!",
"sign_up": "Înregistrare",
"sign_up_now": "Nevoie de un cont? Inscrie-te acum.",
"reset_password": "Resetați-vă parola",
"invalid_code": "Ne pare rău, codul dvs. de confirmare a expirat sau nu este valabil.",
"new_password": "Parolă nouă",
"confirm_password": "Confirmați Parola",
"diff.parent": "părinte",
"diff.commit": "comite",
"diff.view_file": "Vizualizați fișierul",
"editor.edit_file": "Modifica fisier",
"editor.delete_this_file": "Șterge acest fișier"
"status.page_not_found": "Pagina nu a fost găsită",
"status.internal_server_error": "Eroare internă de server",
"auth.auth_source": "Sursa de autentificare",
"auth.local": "Local",
"auth.forget_password": "Ați uitat parola?",
"auth.disable_register_mail": "Ne pare rău, serviciile de e-mail sunt dezactivate. Vă rugăm să contactați administratorul site-ului.",
"auth.disable_register_prompt": "Ne pare rău, înregistrarea a fost dezactivată. Vă rugăm să contactați administratorul site-ului.",
"auth.non_local_account": "Conturile non-locale nu pot schimba parolele prin Gogs.",
"auth.create_new_account": "Creați un cont nou",
"auth.register_hepler_msg": "Aveți deja un cont? Conectați-vă acum!",
"auth.sign_up_now": "Nevoie de un cont? Inscrie-te acum.",
"auth.reset_password": "Resetați-vă parola",
"auth.invalid_code": "Ne pare rău, codul dvs. de confirmare a expirat sau nu este valabil.",
"tool.now": "acum",
"tool.ago": "în urmă",
"tool.from_now": "de acum",
"tool.1s": "1 secundă %s",
"tool.1m": "1 minut %s",
"tool.1h": "1 oră %s",
"tool.1d": "1 zi %s",
"tool.1w": "1 săptămână %s",
"tool.1mon": "1 lună %s",
"tool.1y": "1 an %s",
"tool.seconds": "%d secunde %s",
"tool.minutes": "%d minute %s",
"tool.hours": "%d ore %s",
"tool.days": "%d zile %s",
"tool.weeks": "%d săptămâni %s",
"tool.months": "%d luni %s",
"tool.years": "%d ani %s",
"repo.editor.edit_file": "Modifica fisier",
"repo.editor.delete_this_file": "Șterge acest fișier",
"repo.files": "Fisiere",
"repo.settings": "Setări",
"repo.wiki": "Wiki",
"repo.watch": "Urmărește",
"repo.unwatch": "Nevizionat",
"repo.star": "Stea",
"repo.fork": "Bifurcare"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Панель администратора",
"settings": "Настройки",
"language": "Язык",
"page_not_found": "Страница не найдена",
"internal_server_error": "Внутренняя ошибка сервера",
"repository": "Репозиторий",
"username": "Имя пользователя",
"email": "Эл. почта",
"password": "Пароль",
"captcha": "Капча",
"auth_source": "Тип аутентификации",
"local": "Локальный",
"forget_password": "Забыли пароль?",
"disable_register_mail": "К сожалению подтверждение регистрации по почте отключено.",
"disable_register_prompt": "Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта.",
"non_local_account": "Нелокальные аккаунты не могут изменить пароль через Gogs.",
"create_new_account": "Создать новый аккаунт",
"register_hepler_msg": "Уже есть аккаунт? Авторизуйтесь!",
"sign_up": "Регистрация",
"sign_up_now": "Нужен аккаунт? Зарегистрируйтесь.",
"reset_password": "Сброс пароля",
"invalid_code": "Извините, ваш код подтверждения истек или не является допустимым.",
"new_password": "Новый пароль",
"confirm_password": "Подтвердить пароль",
"diff.parent": "Родитель",
"diff.commit": "Сommit",
"diff.view_file": "Просмотреть файл",
"editor.edit_file": "Редактировать файл",
"editor.delete_this_file": "Удалить файл"
"status.page_not_found": "Страница не найдена",
"status.internal_server_error": "Внутренняя ошибка сервера",
"auth.auth_source": "Тип аутентификации",
"auth.local": "Локальный",
"auth.forget_password": "Забыли пароль?",
"auth.disable_register_mail": "К сожалению подтверждение регистрации по почте отключено.",
"auth.disable_register_prompt": "Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта.",
"auth.non_local_account": "Нелокальные аккаунты не могут изменить пароль через Gogs.",
"auth.create_new_account": "Создать новый аккаунт",
"auth.register_hepler_msg": "Уже есть аккаунт? Авторизуйтесь!",
"auth.sign_up_now": "Нужен аккаунт? Зарегистрируйтесь.",
"auth.reset_password": "Сброс пароля",
"auth.invalid_code": "Извините, ваш код подтверждения истек или не является допустимым.",
"tool.now": "сейчас",
"tool.ago": "назад",
"tool.from_now": "с этого момента",
"tool.1s": "1 секунду %s",
"tool.1m": "1 минуту %s",
"tool.1h": "1 час %s",
"tool.1d": "1 день %s",
"tool.1w": "1 неделя %s",
"tool.1mon": "1 месяц %s",
"tool.1y": "1 год %s",
"tool.seconds": "%d секунд %s",
"tool.minutes": "%d минут %s",
"tool.hours": "%d часов %s",
"tool.days": "%d дней %s",
"tool.weeks": "%d недель %s",
"tool.months": "%d месяцев %s",
"tool.years": "%d лет %s",
"repo.editor.edit_file": "Редактировать файл",
"repo.editor.delete_this_file": "Удалить файл",
"repo.files": "Файлы",
"repo.settings": "Настройки",
"repo.wiki": "Вики",
"repo.watch": "Следить",
"repo.unwatch": "Перестать следить",
"repo.star": "В избранное",
"repo.fork": "Ответвить"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Admin Panel",
"settings": "Nastavenia",
"language": "Jazyk",
"page_not_found": "Page Not Found",
"internal_server_error": "Internal Server Error",
"repository": "Repozitár",
"username": "Používateľské meno",
"email": "E-mail",
"password": "Heslo",
"captcha": "Kontrolný kód",
"auth_source": "Zdroj overovania",
"local": "Lokálny",
"forget_password": "Zabudli ste heslo?",
"disable_register_mail": "Ospravedlňujeme sa, potvrdenie registračného e-mailu bolo vypnuté.",
"disable_register_prompt": "Ospravedlňujeme sa, ale registrácia bola vypnutá. Obráťte sa na administrátora stránky.",
"non_local_account": "Miestne účty nemôžu meniť heslá cez Gogs.",
"create_new_account": "Vytvoriť nový účet",
"register_hepler_msg": "Máte už účet? Prihláste sa teraz!",
"sign_up": "Zaregistrovať sa",
"sign_up_now": "Potrebujete účet? Zaregistrujte sa teraz.",
"reset_password": "Obnovenie hesla",
"invalid_code": "Ospravedlňujeme sa, váš potvrdzovací kód vypršal alebo nie je platný.",
"new_password": "Nové heslo",
"confirm_password": "Potvrdiť heslo",
"diff.parent": "rodič",
"diff.commit": "commit",
"diff.view_file": "Zobraziť súbor",
"editor.edit_file": "Upraviť súbor",
"editor.delete_this_file": "Vymazať tento súbor"
"status.page_not_found": "Page Not Found",
"status.internal_server_error": "Internal Server Error",
"auth.auth_source": "Zdroj overovania",
"auth.local": "Lokálny",
"auth.forget_password": "Zabudli ste heslo?",
"auth.disable_register_mail": "Ospravedlňujeme sa, potvrdenie registračného e-mailu bolo vypnuté.",
"auth.disable_register_prompt": "Ospravedlňujeme sa, ale registrácia bola vypnutá. Obráťte sa na administrátora stránky.",
"auth.non_local_account": "Miestne účty nemôžu meniť heslá cez Gogs.",
"auth.create_new_account": "Vytvoriť nový účet",
"auth.register_hepler_msg": "Máte už účet? Prihláste sa teraz!",
"auth.sign_up_now": "Potrebujete účet? Zaregistrujte sa teraz.",
"auth.reset_password": "Obnovenie hesla",
"auth.invalid_code": "Ospravedlňujeme sa, váš potvrdzovací kód vypršal alebo nie je platný.",
"tool.now": "teraz",
"tool.ago": "pred",
"tool.from_now": "od tejto chvíle",
"tool.1s": "1 sekunda %s",
"tool.1m": "1 minúta %s",
"tool.1h": "1 hodinu %s",
"tool.1d": "1 deň %s",
"tool.1w": "1 týždeň %s",
"tool.1mon": "1 mesiac %s",
"tool.1y": "1 rok %s",
"tool.seconds": "%d sekúnd %s",
"tool.minutes": "%d minút %s",
"tool.hours": "%d hodín %s",
"tool.days": "%d dní %s",
"tool.weeks": "%d týždňov %s",
"tool.months": "%d mesiacov %s",
"tool.years": "%d rokov %s",
"repo.editor.edit_file": "Upraviť súbor",
"repo.editor.delete_this_file": "Vymazať tento súbor",
"repo.files": "Súbory",
"repo.settings": "Nastavenia",
"repo.wiki": "Wiki",
"repo.watch": "Pridať medzi pozorované",
"repo.unwatch": "Odobrať z pozorovaných",
"repo.star": "Hviezda",
"repo.fork": "Fork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Админ панела",
"settings": "Подешавања",
"language": "Језик",
"page_not_found": "Page Not Found",
"internal_server_error": "Internal Server Error",
"repository": "Спремиште",
"username": "Корисничко име",
"email": "E-пошта",
"password": "Лозинка",
"captcha": "Captcha",
"auth_source": "Извор аутентикације",
"local": "Локално",
"forget_password": "Заборавили сте лозинку?",
"disable_register_mail": "Извините, потврда путем поште је онемогућено.",
"disable_register_prompt": "Извините регистрација је онемогућено. Молимо вас, контактирајте администратора.",
"non_local_account": "Нелокални налози не могу да промените лозинку преко Gogs.",
"create_new_account": "Креирате нови налог",
"register_hepler_msg": "Већ имате налог? Пријавите се!",
"sign_up": "Регистрација",
"sign_up_now": "Немате налог? Пријавите се.",
"reset_password": "Ресет лозинке",
"invalid_code": "Извините, ваш код за потврду је истекао или није валидан.",
"new_password": "Нова лозинка",
"confirm_password": "Потврдите лозинку",
"diff.parent": "родитељ",
"diff.commit": "комит",
"diff.view_file": "Прегледај датотеку",
"editor.edit_file": "Ажурирај датотеку",
"editor.delete_this_file": "Уклони ову датотеку"
"status.page_not_found": "Page Not Found",
"status.internal_server_error": "Internal Server Error",
"auth.auth_source": "Извор аутентикације",
"auth.local": "Локално",
"auth.forget_password": "Заборавили сте лозинку?",
"auth.disable_register_mail": "Извините, потврда путем поште је онемогућено.",
"auth.disable_register_prompt": "Извините регистрација је онемогућено. Молимо вас, контактирајте администратора.",
"auth.non_local_account": "Нелокални налози не могу да промените лозинку преко Gogs.",
"auth.create_new_account": "Креирате нови налог",
"auth.register_hepler_msg": "Већ имате налог? Пријавите се!",
"auth.sign_up_now": "Немате налог? Пријавите се.",
"auth.reset_password": "Ресет лозинке",
"auth.invalid_code": "Извините, ваш код за потврду је истекао или није валидан.",
"tool.now": "сада",
"tool.ago": "пре",
"tool.from_now": "од сада",
"tool.1s": "%s 1 секунд",
"tool.1m": "%s 1 минут",
"tool.1h": "%s 1 час",
"tool.1d": "%s 1 дан",
"tool.1w": "%s 1 недеља",
"tool.1mon": "%s 1 месец",
"tool.1y": "%s 1 година",
"tool.seconds": "%[2]s %[1]d секунди",
"tool.minutes": "%[2]s %[1]d минута",
"tool.hours": "%[2]s %[1]d часа",
"tool.days": "%[2]s %[1]d дана",
"tool.weeks": "%[2]s %[1]d недеља",
"tool.months": "%[2]s %[1]d месеци",
"tool.years": "%[2]s %[1]d година",
"repo.editor.edit_file": "Ажурирај датотеку",
"repo.editor.delete_this_file": "Уклони ову датотеку",
"repo.files": "Датотеке",
"repo.settings": "Подешавања",
"repo.wiki": "Вики",
"repo.watch": "Прати",
"repo.unwatch": "Престани пратити",
"repo.star": "Волим",
"repo.fork": "Креирај огранак"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Admin-panel",
"settings": "inställningar",
"language": "Språk",
"page_not_found": "Sidan hittades inte",
"internal_server_error": "Internt serverfel",
"repository": "Utvecklingskatalog",
"username": "Användarnamn",
"email": "E-post",
"password": "Lösenord",
"captcha": "Captcha",
"auth_source": "Autentiseringskälla",
"local": "Lokal",
"forget_password": "Glömt lösenordet?",
"disable_register_mail": "Tyvärr så är registreringsbekräftelemailutskick inaktiverat.",
"disable_register_prompt": "Tyvärr är användarregistreringen inaktiverad. Vänligen kontakta din administratör.",
"non_local_account": "Icke-lokala konton får inte ändra lösenord genom Gogs.",
"create_new_account": "Skapa nytt konto",
"register_hepler_msg": "Har du redan ett konto? Logga in nu!",
"sign_up": "Registrera dig",
"sign_up_now": "Behöver du ett konto? Registrera dig nu.",
"reset_password": "Återställ ditt lösenord",
"invalid_code": "Tyvärr, din bekräftelsekod har antingen upphört att gälla eller är ogiltig.",
"new_password": "Nytt lösenord",
"confirm_password": "Bekräfta lösenord",
"diff.parent": "förälder",
"diff.commit": "incheckning",
"diff.view_file": "Visa fil",
"editor.edit_file": "Redigera fil",
"editor.delete_this_file": "Tag bort denna fil"
"status.page_not_found": "Sidan hittades inte",
"status.internal_server_error": "Internt serverfel",
"auth.auth_source": "Autentiseringskälla",
"auth.local": "Lokal",
"auth.forget_password": "Glömt lösenordet?",
"auth.disable_register_mail": "Tyvärr så är registreringsbekräftelemailutskick inaktiverat.",
"auth.disable_register_prompt": "Tyvärr är användarregistreringen inaktiverad. Vänligen kontakta din administratör.",
"auth.non_local_account": "Icke-lokala konton får inte ändra lösenord genom Gogs.",
"auth.create_new_account": "Skapa nytt konto",
"auth.register_hepler_msg": "Har du redan ett konto? Logga in nu!",
"auth.sign_up_now": "Behöver du ett konto? Registrera dig nu.",
"auth.reset_password": "Återställ ditt lösenord",
"auth.invalid_code": "Tyvärr, din bekräftelsekod har antingen upphört att gälla eller är ogiltig.",
"tool.now": "nu",
"tool.ago": "sedan",
"tool.from_now": "från och med nu",
"tool.1s": "1 sekund %s",
"tool.1m": "1 minut %s",
"tool.1h": "1 timme %s",
"tool.1d": "1 dag %s",
"tool.1w": "1 vecka %s",
"tool.1mon": "1 månad %s",
"tool.1y": "1 år %s",
"tool.seconds": "%d sekunder %s",
"tool.minutes": "%d minuter %s",
"tool.hours": "%d timmar %s",
"tool.days": "%d dagar %s",
"tool.weeks": "%d veckor %s",
"tool.months": "%d månader %s",
"tool.years": "%d år %s",
"repo.editor.edit_file": "Redigera fil",
"repo.editor.delete_this_file": "Tag bort denna fil",
"repo.files": "Filer",
"repo.settings": "Inställningar",
"repo.wiki": "Wiki",
"repo.watch": "Bevaka",
"repo.unwatch": "Avsluta bevakning",
"repo.star": "Stjärnmärk",
"repo.fork": "Fork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Yönetim Paneli",
"settings": "Ayarlar",
"language": "Dil",
"page_not_found": "Sayfa Bulunamadı",
"internal_server_error": "İç Sunucu Hatası.",
"repository": "Depo",
"username": "Kullanıcı Adı",
"email": "E-Posta",
"password": "Parola",
"captcha": "Captcha",
"auth_source": "Yetkilendirme Kaynağı",
"local": "Yerel",
"forget_password": "Parolanızı mı unuttunuz?",
"disable_register_mail": "Üzgünüz, kayıt doğrulama e-postası devre dışı bırakıldı.",
"disable_register_prompt": "Üzgünüz, kaydolma devre dışı bırakıldı. Lütfen site yöneticisiyle irtibata geçin.",
"non_local_account": "Yerel olmayan hesapların şifrelerini Gogs aracılığıyla değiştiremezsiniz.",
"create_new_account": "Yeni Hesap Oluştur",
"register_hepler_msg": "Bir hesabınız var mı? Şimdi giriş yapın!",
"sign_up": "Kaydol",
"sign_up_now": "Bir hesaba mı ihtiyacınız var? Şimdi kaydolun.",
"reset_password": "Parolanızı Sıfırlayın",
"invalid_code": "Üzgünüz, doğrulama kodunuz geçersiz veya süresi dolmuş.",
"new_password": "Yeni Parola",
"confirm_password": "Parolayı Doğrula",
"diff.parent": "ebeveyn",
"diff.commit": "işleme",
"diff.view_file": "Dosyayı Görüntüle",
"editor.edit_file": "Dosya düzenle",
"editor.delete_this_file": "Bu dosyayı sil"
"status.page_not_found": "Sayfa Bulunamadı",
"status.internal_server_error": "İç Sunucu Hatası.",
"auth.auth_source": "Yetkilendirme Kaynağı",
"auth.local": "Yerel",
"auth.forget_password": "Parolanızı mı unuttunuz?",
"auth.disable_register_mail": "Üzgünüz, kayıt doğrulama e-postası devre dışı bırakıldı.",
"auth.disable_register_prompt": "Üzgünüz, kaydolma devre dışı bırakıldı. Lütfen site yöneticisiyle irtibata geçin.",
"auth.non_local_account": "Yerel olmayan hesapların şifrelerini Gogs aracılığıyla değiştiremezsiniz.",
"auth.create_new_account": "Yeni Hesap Oluştur",
"auth.register_hepler_msg": "Bir hesabınız var mı? Şimdi giriş yapın!",
"auth.sign_up_now": "Bir hesaba mı ihtiyacınız var? Şimdi kaydolun.",
"auth.reset_password": "Parolanızı Sıfırlayın",
"auth.invalid_code": "Üzgünüz, doğrulama kodunuz geçersiz veya süresi dolmuş.",
"tool.now": "şimdi",
"tool.ago": "önce",
"tool.from_now": "şu andan",
"tool.1s": "1 saniye %s",
"tool.1m": "1 dakika %s",
"tool.1h": "1 saat %s",
"tool.1d": "1 gün %s",
"tool.1w": "1 hafta %s",
"tool.1mon": "1 ay %s",
"tool.1y": "1 yıl %s",
"tool.seconds": "%d saniye %s",
"tool.minutes": "%d dakika %s",
"tool.hours": "%d saat %s",
"tool.days": "%d gün %s",
"tool.weeks": "%d hafta %s",
"tool.months": "%d ay %s",
"tool.years": "%d yıl %s",
"repo.editor.edit_file": "Dosya düzenle",
"repo.editor.delete_this_file": "Bu dosyayı sil",
"repo.files": "Dosyalar",
"repo.settings": "Ayarlar",
"repo.wiki": "Wiki",
"repo.watch": "İzle",
"repo.unwatch": "İzlemeyi Bırak",
"repo.star": "Yıldızla",
"repo.fork": "Çatalla"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Панель адміністратора",
"settings": "Налаштування",
"language": "Мова",
"page_not_found": "Сторінку не знайдено",
"internal_server_error": "Внутрішня помилка серверу",
"repository": "Репозиторій",
"username": "Ім'я користувача",
"email": "Електронна пошта",
"password": "Пароль",
"captcha": "CAPTCHA",
"auth_source": "Джерело автентифікації",
"local": "Локальний",
"forget_password": "Забули пароль?",
"disable_register_mail": "На жаль, підтвердження реєстрації на електрону пошту вимкнено адміністратором.",
"disable_register_prompt": "Вибачте, реєстрація відключена. Будь ласка, зв'яжіться з адміністратором сайту.",
"non_local_account": "Нелокальні облікові записи не можуть змінити пароль через Gogs.",
"create_new_account": "Створити новий обліковий запис",
"register_hepler_msg": "Вже зареєстровані? Увійдіть зараз!",
"sign_up": "Реєстрація",
"sign_up_now": "Потрібен обліковий запис? Зареєструватися зараз.",
"reset_password": "Скинути пароль",
"invalid_code": "На жаль, код підтвердження, закінчився або помилковий.",
"new_password": "Новий пароль",
"confirm_password": "Підтвердження паролю",
"diff.parent": "батько",
"diff.commit": "коміт",
"diff.view_file": "Переглянути файл",
"editor.edit_file": "Редагування файла",
"editor.delete_this_file": "Видалити цей файл"
"status.page_not_found": "Сторінку не знайдено",
"status.internal_server_error": "Внутрішня помилка серверу",
"auth.auth_source": "Джерело автентифікації",
"auth.local": "Локальний",
"auth.forget_password": "Забули пароль?",
"auth.disable_register_mail": "На жаль, підтвердження реєстрації на електрону пошту вимкнено адміністратором.",
"auth.disable_register_prompt": "Вибачте, реєстрація відключена. Будь ласка, зв'яжіться з адміністратором сайту.",
"auth.non_local_account": "Нелокальні облікові записи не можуть змінити пароль через Gogs.",
"auth.create_new_account": "Створити новий обліковий запис",
"auth.register_hepler_msg": "Вже зареєстровані? Увійдіть зараз!",
"auth.sign_up_now": "Потрібен обліковий запис? Зареєструватися зараз.",
"auth.reset_password": "Скинути пароль",
"auth.invalid_code": "На жаль, код підтвердження, закінчився або помилковий.",
"tool.now": "зараз",
"tool.ago": "тому",
"tool.from_now": "віднині",
"tool.1s": "1 секунду %s",
"tool.1m": "1 хвилину %s",
"tool.1h": "1 годину %s",
"tool.1d": "1 день %s",
"tool.1w": "1 тиждень %s",
"tool.1mon": "1 місяць %s",
"tool.1y": "1 рік %s",
"tool.seconds": "%d секунд %s",
"tool.minutes": "%d хвилин %s",
"tool.hours": "%d годин %s",
"tool.days": "%d днів %s",
"tool.weeks": "%d тижнів %s",
"tool.months": "%d місяців %s",
"tool.years": "%d роки %s",
"repo.editor.edit_file": "Редагування файла",
"repo.editor.delete_this_file": "Видалити цей файл",
"repo.files": "Файли",
"repo.settings": "Налаштування",
"repo.wiki": "Wiki",
"repo.watch": "Слідкувати",
"repo.unwatch": "Не стежити",
"repo.star": "Зірка",
"repo.fork": "Відгалуження"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "Bảng quản trị",
"settings": "Cài đặt",
"language": "Ngôn ngữ",
"page_not_found": "Không tìm thấy trang này!",
"internal_server_error": "Lỗi nội bộ máy chủ.",
"repository": "Kho",
"username": "Username",
"email": "Email",
"password": "Mật khẩu",
"captcha": "Mã xác minh",
"auth_source": "Authentication Source",
"local": "Local",
"forget_password": "Quên mật khẩu?",
"disable_register_mail": "Xin lỗi, đăng ký đã bị vô hiệu. Xin vui lòng liên hệ với người quản trị trang web.",
"disable_register_prompt": "Xin lỗi, đăng ký đã bị vô hiệu. Xin vui lòng liên hệ với người quản trị trang web.",
"non_local_account": "Tài khoản Non-local không thể thay đổi mật khẩu thông qua Gogs.",
"create_new_account": "Tạo một Tài khoản mới",
"register_hepler_msg": "Đã có tài khoản? Đăng nhập bây giờ!",
"sign_up": "Đăng ký",
"sign_up_now": "Cần một tài khoản? Đăng bây giờ.",
"reset_password": "Đặt lại mật khẩu của bạn",
"invalid_code": "Xin lỗi, mã số xác nhận của bạn đã hết hạn hoặc không hợp lệ.",
"new_password": "Mật khẩu mới",
"confirm_password": "Xác nhận mật khẩu",
"diff.parent": "mục cha",
"diff.commit": "commit",
"diff.view_file": "Xem Tập Tin",
"editor.edit_file": "Sửa tập tin",
"editor.delete_this_file": "Xóa tập tin này"
"status.page_not_found": "Không tìm thấy trang này!",
"status.internal_server_error": "Lỗi nội bộ máy chủ.",
"auth.auth_source": "Authentication Source",
"auth.local": "Local",
"auth.forget_password": "Quên mật khẩu?",
"auth.disable_register_mail": "Xin lỗi, đăng ký đã bị vô hiệu. Xin vui lòng liên hệ với người quản trị trang web.",
"auth.disable_register_prompt": "Xin lỗi, đăng ký đã bị vô hiệu. Xin vui lòng liên hệ với người quản trị trang web.",
"auth.non_local_account": "Tài khoản Non-local không thể thay đổi mật khẩu thông qua Gogs.",
"auth.create_new_account": "Tạo một Tài khoản mới",
"auth.register_hepler_msg": "Đã có tài khoản? Đăng nhập bây giờ!",
"auth.sign_up_now": "Cần một tài khoản? Đăng ký bây giờ.",
"auth.reset_password": "Đặt lại mật khẩu của bạn",
"auth.invalid_code": "Xin lỗi, mã số xác nhận của bạn đã hết hạn hoặc không hợp lệ.",
"tool.now": "bây giờ",
"tool.ago": "cách đây",
"tool.from_now": "từ bây giờ",
"tool.1s": "1 giây trước %s",
"tool.1m": "1 phút trước %s",
"tool.1h": "1 giờ trước %s",
"tool.1d": "1 ngày trước %s",
"tool.1w": "1 tuần trước %s",
"tool.1mon": "1 tháng trước %s",
"tool.1y": "1 năm trước %s",
"tool.seconds": "%d giây trước %s",
"tool.minutes": "%d phút trước %s",
"tool.hours": "%d giờ trước %s",
"tool.days": "%d ngày trước %s",
"tool.weeks": "%d tuần trước %s",
"tool.months": "%d tháng trước %s",
"tool.years": "%d năm trước %s",
"repo.editor.edit_file": "Sửa tập tin",
"repo.editor.delete_this_file": "Xóa tập tin này",
"repo.files": "Các tập tin",
"repo.settings": "Cài đặt",
"repo.wiki": "Wiki",
"repo.watch": "Xem",
"repo.unwatch": "Ngừng theo dõi",
"repo.star": "Star",
"repo.fork": "Fork"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "管理面板",
"settings": "帐户设置",
"language": "语言选项",
"page_not_found": "页面未找到",
"internal_server_error": "内部服务器错误",
"repository": "仓库",
"username": "用户名",
"email": "邮箱",
"password": "密码",
"captcha": "验证码",
"auth_source": "认证源",
"local": "本地",
"forget_password": "忘记密码?",
"disable_register_mail": "对不起,注册邮箱确认功能已被关闭。",
"disable_register_prompt": "对不起,注册功能已被关闭。请联系网站管理员。",
"non_local_account": "非本地类型的帐户无法通过 Gogs 修改密码。",
"create_new_account": "创建帐户",
"register_hepler_msg": "已经注册?立即登录!",
"sign_up": "注册",
"sign_up_now": "还没帐户?马上注册。",
"reset_password": "重置密码",
"invalid_code": "对不起,您的确认代码已过期或已失效。",
"new_password": "新的密码",
"confirm_password": "确认密码",
"diff.parent": "父节点",
"diff.commit": "当前提交",
"diff.view_file": "查看文件",
"editor.edit_file": "编辑文件",
"editor.delete_this_file": "删除此文件"
"status.page_not_found": "页面未找到",
"status.internal_server_error": "内部服务器错误",
"auth.auth_source": "认证源",
"auth.local": "本地",
"auth.forget_password": "忘记密码?",
"auth.disable_register_mail": "对不起,注册邮箱确认功能已被关闭。",
"auth.disable_register_prompt": "对不起,注册功能已被关闭。请联系网站管理员。",
"auth.non_local_account": "非本地类型的帐户无法通过 Gogs 修改密码。",
"auth.create_new_account": "创建帐户",
"auth.register_hepler_msg": "已经注册?立即登录!",
"auth.sign_up_now": "还没帐户?马上注册。",
"auth.reset_password": "重置密码",
"auth.invalid_code": "对不起,您的确认代码已过期或已失效。",
"tool.now": "刚刚",
"tool.ago": "之前",
"tool.from_now": "之后",
"tool.1s": "1 秒%s",
"tool.1m": "1 分钟%s",
"tool.1h": "1 小时%s",
"tool.1d": "1 天%s",
"tool.1w": "1 周%s",
"tool.1mon": "1 月%s",
"tool.1y": "1 年%s",
"tool.seconds": "%d 秒%s",
"tool.minutes": "%d 分钟%s",
"tool.hours": "%d 小时%s",
"tool.days": "%d 天%s",
"tool.weeks": "%d 周%s",
"tool.months": "%d 月%s",
"tool.years": "%d 年%s",
"repo.editor.edit_file": "编辑文件",
"repo.editor.delete_this_file": "删除此文件",
"repo.files": "文件",
"repo.settings": "仓库设置",
"repo.wiki": "Wiki",
"repo.watch": "关注",
"repo.unwatch": "取消关注",
"repo.star": "点赞",
"repo.fork": "派生"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "管理面板",
"settings": "設定",
"language": "語言",
"page_not_found": "Page Not Found",
"internal_server_error": "Internal Server Error",
"repository": "儲存庫",
"username": "用戶名稱",
"email": "電子郵件",
"password": "密碼",
"captcha": "驗證碼",
"auth_source": "Authentication Source",
"local": "Local",
"forget_password": "忘記密碼?",
"disable_register_mail": "對不起,註冊郵箱確認功能已被關閉。",
"disable_register_prompt": "對不起,註冊功能已被關閉。請聯系網站管理員。",
"non_local_account": "Non-local accounts cannot change passwords through Gogs.",
"create_new_account": "創建帳戶",
"register_hepler_msg": "已經註冊?立即登錄!",
"sign_up": "註冊",
"sign_up_now": "還沒帳戶?馬上註冊。",
"reset_password": "重置密碼",
"invalid_code": "對不起,您的確認代碼已過期或已失效。",
"new_password": "新的密碼",
"confirm_password": "確認密碼",
"diff.parent": "父節點",
"diff.commit": "當前提交",
"diff.view_file": "查看文件",
"editor.edit_file": "Edit file",
"editor.delete_this_file": "Delete this file"
"status.page_not_found": "Page Not Found",
"status.internal_server_error": "Internal Server Error",
"auth.auth_source": "Authentication Source",
"auth.local": "Local",
"auth.forget_password": "忘記密碼?",
"auth.disable_register_mail": "對不起,註冊郵箱確認功能已被關閉。",
"auth.disable_register_prompt": "對不起,註冊功能已被關閉。請聯系網站管理員。",
"auth.non_local_account": "Non-local accounts cannot change passwords through Gogs.",
"auth.create_new_account": "創建帳戶",
"auth.register_hepler_msg": "已經註冊?立即登錄!",
"auth.sign_up_now": "還沒帳戶?馬上註冊。",
"auth.reset_password": "重置密碼",
"auth.invalid_code": "對不起,您的確認代碼已過期或已失效。",
"tool.now": "現在",
"tool.ago": "之前",
"tool.from_now": "之後",
"tool.1s": "1 秒%s",
"tool.1m": "1 分鐘%s",
"tool.1h": "1 小時%s",
"tool.1d": "1 天%s",
"tool.1w": "1 周%s",
"tool.1mon": "1 月%s",
"tool.1y": "1 年%s",
"tool.seconds": "%d 秒%s",
"tool.minutes": "%d 分鐘%s",
"tool.hours": "%d 小時%s",
"tool.days": "%d 天%s",
"tool.weeks": "%d 周%s",
"tool.months": "%d 月%s",
"tool.years": "%d 年%s",
"repo.editor.edit_file": "Edit file",
"repo.editor.delete_this_file": "Delete this file",
"repo.files": "Files",
"repo.settings": "倉庫設置",
"repo.wiki": "Wiki",
"repo.watch": "關註",
"repo.unwatch": "取消關注",
"repo.star": "讚好",
"repo.fork": "複刻"
}
+40 -21
View File
@@ -20,29 +20,48 @@
"admin_panel": "管理面板",
"settings": "設定",
"language": "語言",
"page_not_found": "找不到頁面",
"internal_server_error": "內部伺服器錯誤",
"repository": "儲存庫",
"username": "用戶名稱",
"email": "電子郵件",
"password": "密碼",
"captcha": "驗證碼",
"auth_source": "認證來源",
"local": "本地",
"forget_password": "忘記密碼?",
"disable_register_mail": "對不起,註冊郵箱確認功能已被關閉。",
"disable_register_prompt": "對不起,註冊功能已被關閉。請聯系網站管理員。",
"non_local_account": "非本地帳戶無法通過 Gogs 修改密碼。",
"create_new_account": "創建帳戶",
"register_hepler_msg": "已經註冊?立即登錄!",
"sign_up": "註冊",
"sign_up_now": "還沒帳戶?馬上註冊。",
"reset_password": "重置密碼",
"invalid_code": "對不起,您的確認代碼已過期或已失效。",
"new_password": "新的密碼",
"confirm_password": "確認密碼",
"diff.parent": "父節點",
"diff.commit": "當前提交",
"diff.view_file": "查看文件",
"editor.edit_file": "編輯文件",
"editor.delete_this_file": "刪除此文件"
"status.page_not_found": "找不到頁面",
"status.internal_server_error": "內部伺服器錯誤",
"auth.auth_source": "認證來源",
"auth.local": "本地",
"auth.forget_password": "忘記密碼?",
"auth.disable_register_mail": "對不起,註冊郵箱確認功能已被關閉。",
"auth.disable_register_prompt": "對不起,註冊功能已被關閉。請聯系網站管理員。",
"auth.non_local_account": "非本地帳戶無法通過 Gogs 修改密碼。",
"auth.create_new_account": "創建帳戶",
"auth.register_hepler_msg": "已經註冊?立即登錄!",
"auth.sign_up_now": "還沒帳戶?馬上註冊。",
"auth.reset_password": "重置密碼",
"auth.invalid_code": "對不起,您的確認代碼已過期或已失效。",
"tool.now": "現在",
"tool.ago": "之前",
"tool.from_now": "之後",
"tool.1s": "1 秒%s",
"tool.1m": "1 分鐘%s",
"tool.1h": "1 小時%s",
"tool.1d": "1 天%s",
"tool.1w": "1 周%s",
"tool.1mon": "1 月%s",
"tool.1y": "1 年%s",
"tool.seconds": "%d 秒%s",
"tool.minutes": "%d 分鐘%s",
"tool.hours": "%d 小時%s",
"tool.days": "%d 天%s",
"tool.weeks": "%d 周%s",
"tool.months": "%d 月%s",
"tool.years": "%d 年%s",
"repo.editor.edit_file": "編輯文件",
"repo.editor.delete_this_file": "刪除此文件",
"repo.files": "檔案",
"repo.settings": "倉庫設置",
"repo.wiki": "Wiki",
"repo.watch": "關注",
"repo.unwatch": "取消關注",
"repo.star": "讚好",
"repo.fork": "複刻"
}
+1 -1
View File
@@ -1,10 +1,10 @@
import { createRoot } from "react-dom/client";
import { App } from "./App";
import { ThemeProvider } from "./components/ThemeProvider";
import { UserInfoProvider } from "./components/UserInfoProvider";
import "./index.css";
import "./lib/i18n";
import { ThemeProvider } from "./lib/theme";
import { fetchUserInfo } from "./lib/user-info";
const userInfo = await fetchUserInfo();
+1 -1
View File
@@ -4,7 +4,7 @@ import { usePageTitle } from "@/lib/page-title";
export function NotFound() {
const { t } = useTranslation();
usePageTitle(t("page_not_found"));
usePageTitle(t("status.page_not_found"));
const path = typeof window === "undefined" ? "/" : window.location.pathname;
return (
<main className="flex flex-1 items-center justify-center px-4 py-10 sm:px-6 sm:py-16">
+2 -2
View File
@@ -6,14 +6,14 @@ import { usePageTitle } from "@/lib/page-title";
export function ServerError({ error }: ErrorComponentProps) {
const { t } = useTranslation();
usePageTitle(t("internal_server_error"));
usePageTitle(t("status.internal_server_error"));
const path = typeof window === "undefined" ? "/" : window.location.pathname;
// Prefer the structured `error` field from the webapi JSON response; fall
// back to the raw body when the upstream returned non-JSON (e.g. a proxy
// error page); fall back again to the generic message when nothing useful
// was carried over.
let detail = t("internal_server_error");
let detail = t("status.internal_server_error");
if (error instanceof LoaderResponseError) {
if (error.errorField) {
detail = error.errorField;
+37 -36
View File
@@ -149,8 +149,8 @@ const TREE_THEME_STYLE: CSSProperties = {
"--trees-selected-bg-override": "var(--color-surface)",
"--trees-focus-ring-color-override": "var(--color-ring)",
// The search input's defaults fall through `--trees-input-bg`, which uses
// `light-dark()` keyed off the shadow host's own `color-scheme: light dark`
// — that resolves to the OS preference, not the app's class-based theme,
// `light-dark()` keyed off the shadow host's own `color-scheme: light dark`.
// That resolves to the OS preference, not the app's class-based theme,
// so the box stays light when the page is dark. Pin it to our tokens.
"--trees-search-bg-override": "var(--color-surface)",
"--trees-search-fg-override": "var(--color-foreground)",
@@ -159,6 +159,7 @@ const TREE_THEME_STYLE: CSSProperties = {
const BODY_CLAMP_LINES = 3;
function CommitBody({ body }: { body: string }) {
const { t } = useTranslation();
const lines = body.split("\n");
const needsClamp = lines.length > BODY_CLAMP_LINES;
const [expanded, setExpanded] = useState(!needsClamp);
@@ -173,7 +174,7 @@ function CommitBody({ body }: { body: string }) {
onClick={() => setExpanded((e) => !e)}
className="mt-1.5 cursor-pointer rounded border border-(--color-border) bg-(--color-surface) px-2 py-0.5 text-xs text-(--color-muted-foreground) hover:bg-(--color-surface)/80 hover:text-(--color-foreground)"
>
{expanded ? "Show less" : "Show more"}
{expanded ? t("show_less") : t("show_more")}
</button>
) : null}
</div>
@@ -231,8 +232,8 @@ export function RepoCommit() {
// Desktop-only handler. The lock-and-forward dance was designed for the
// two-pane workspace pinned to the viewport on `lg+`. On mobile the
// workspace stacks into a single column and Pierre's container handles
// wheel events directly — any redirection here breaks trackpad
// scrolling inside the diff body.
// wheel events directly. Any redirection here breaks trackpad scrolling
// inside the diff body.
if (!desktopMatch.matches) return;
const root = document.scrollingElement ?? document.documentElement;
const pageMaxScroll = root.scrollHeight - root.clientHeight;
@@ -550,7 +551,7 @@ export function RepoCommit() {
if (item.type !== "diff") return null;
const collapsed = collapsedById[item.id] ?? false;
const Icon = collapsed ? ChevronRight : ChevronDown;
const label = collapsed ? t("diff.expand_file") : t("diff.collapse_file");
const label = collapsed ? t("repo.diff.expand_file") : t("repo.diff.collapse_file");
const buttonClass =
"grid size-6 cursor-pointer place-items-center rounded text-(--color-muted-foreground) hover:bg-(--color-surface) hover:text-(--color-foreground)";
return (
@@ -614,7 +615,7 @@ export function RepoCommit() {
<TooltipTrigger asChild>
<button
type="button"
aria-label={t("diff.copy_file_path")}
aria-label={t("repo.copy_file_path")}
onPointerDown={(e) => e.stopPropagation()}
onMouseDown={(e) => e.stopPropagation()}
onClick={(e) => {
@@ -631,14 +632,14 @@ export function RepoCommit() {
)}
</button>
</TooltipTrigger>
<TooltipContent>{t("diff.copy_file_path")}</TooltipContent>
<TooltipContent>{t("repo.copy_file_path")}</TooltipContent>
</Tooltip>
{supportsExpand ? (
<Tooltip>
<TooltipTrigger asChild>
<button
type="button"
aria-label={expandDone ? t("diff.all_lines_expanded") : t("diff.expand_all_lines")}
aria-label={expandDone ? t("repo.diff.all_lines_expanded") : t("repo.diff.expand_all_lines")}
disabled={expandLoading || expandDone}
onPointerDown={(e) => e.stopPropagation()}
onMouseDown={(e) => e.stopPropagation()}
@@ -656,7 +657,9 @@ export function RepoCommit() {
)}
</button>
</TooltipTrigger>
<TooltipContent>{expandDone ? t("diff.all_lines_expanded") : t("diff.expand_all_lines")}</TooltipContent>
<TooltipContent>
{expandDone ? t("repo.diff.all_lines_expanded") : t("repo.diff.expand_all_lines")}
</TooltipContent>
</Tooltip>
) : null}
<FileHeaderMenu
@@ -701,7 +704,7 @@ export function RepoCommit() {
className="inline-flex h-7 shrink-0 items-center gap-1 rounded-md border border-(--color-border) px-2 text-sm hover:bg-(--color-surface)"
>
<FileCode2 className="size-3.5" aria-hidden />
<span>{t("diff.browse_files")}</span>
<span>{t("repo.browse_files")}</span>
</a>
</div>
</div>
@@ -711,10 +714,10 @@ export function RepoCommit() {
<span className="inline-flex items-center gap-1.5">
<img src={author.avatarURL} alt="" className="size-6 rounded-full" />
{authorLabel}
<span>{t("diff.authored")}</span>
<span>{t("repo.authored")}</span>
<Tooltip>
<TooltipTrigger asChild>
<time dateTime={author.when}>{formatRelativeTime(author.when)}</time>
<time dateTime={author.when}>{formatRelativeTime(t, author.when)}</time>
</TooltipTrigger>
<TooltipContent>{formatAbsoluteTime(author.when)}</TooltipContent>
</Tooltip>
@@ -727,16 +730,16 @@ export function RepoCommit() {
<span className="inline-flex items-center gap-1 font-mono text-xs">
<a href={subUrl(`/${owner}/${repo}/commit/${sha}.patch`)} className="hover:underline">
{t("diff.patch")}
{t("repo.patch_label")}
</a>
<span aria-hidden>·</span>
<a href={subUrl(`/${owner}/${repo}/commit/${sha}.diff`)} className="hover:underline">
{t("diff.diff")}
{t("repo.diff_label")}
</a>
{parents.length > 0 ? (
<>
<span aria-hidden>·</span>
<span>{parents.length > 1 ? `${parents.length} ${t("diff.parents")}` : t("diff.parent")}</span>
<span>{parents.length > 1 ? `${parents.length} ${t("repo.parents")}` : t("repo.commit_parent")}</span>
{parents.map((p) => (
<a
key={p}
@@ -749,7 +752,7 @@ export function RepoCommit() {
</>
) : null}
<span aria-hidden>·</span>
<span>{t("diff.commit")}</span>
<span>{t("repo.commit_label")}</span>
<code className="rounded bg-(--color-surface) px-1.5 py-0.5 text-(--color-foreground)">
{sha.slice(0, 10)}
</code>
@@ -758,7 +761,7 @@ export function RepoCommit() {
<button
type="button"
onClick={copySha}
aria-label={t("diff.copy_full_sha")}
aria-label={t("repo.copy_full_sha")}
className="grid size-6 cursor-pointer place-items-center rounded hover:bg-(--color-surface)"
>
{copied ? (
@@ -768,7 +771,7 @@ export function RepoCommit() {
)}
</button>
</TooltipTrigger>
<TooltipContent>{t("diff.copy_full_sha")}</TooltipContent>
<TooltipContent>{t("repo.copy_full_sha")}</TooltipContent>
</Tooltip>
</span>
</div>
@@ -818,14 +821,14 @@ export function RepoCommit() {
<button
type="button"
onClick={() => setTreeSearchOpen((open) => !open)}
aria-label={treeSearchOpen ? t("diff.hide_search") : t("diff.search_files")}
aria-label={treeSearchOpen ? t("repo.search_hide") : t("repo.search_files")}
aria-pressed={treeSearchOpen}
className="grid size-6 cursor-pointer place-items-center rounded text-(--color-muted-foreground) hover:bg-(--color-surface) hover:text-(--color-foreground)"
>
<Search className="size-3.5" aria-hidden />
</button>
</TooltipTrigger>
<TooltipContent>{treeSearchOpen ? t("diff.hide_search") : t("diff.search_files")}</TooltipContent>
<TooltipContent>{treeSearchOpen ? t("repo.search_hide") : t("repo.search_files")}</TooltipContent>
</Tooltip>
<span className="inline-flex items-stretch overflow-hidden rounded-md border border-(--color-border)">
<Tooltip>
@@ -833,26 +836,26 @@ export function RepoCommit() {
<button
type="button"
onClick={() => treeRef.current?.expandAll()}
aria-label={t("diff.expand_all_directories")}
aria-label={t("repo.expand_all_directories")}
className="grid size-6 cursor-pointer place-items-center text-(--color-muted-foreground) hover:bg-(--color-surface) hover:text-(--color-foreground)"
>
<ChevronsUpDown className="size-3.5" aria-hidden />
</button>
</TooltipTrigger>
<TooltipContent>{t("diff.expand_all_directories")}</TooltipContent>
<TooltipContent>{t("repo.expand_all_directories")}</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger asChild>
<button
type="button"
onClick={() => treeRef.current?.collapseAll()}
aria-label={t("diff.collapse_all_directories")}
aria-label={t("repo.collapse_all_directories")}
className="grid size-6 cursor-pointer place-items-center border-l border-(--color-border) text-(--color-muted-foreground) hover:bg-(--color-surface) hover:text-(--color-foreground)"
>
<ChevronsDownUp className="size-3.5" aria-hidden />
</button>
</TooltipTrigger>
<TooltipContent>{t("diff.collapse_all_directories")}</TooltipContent>
<TooltipContent>{t("repo.collapse_all_directories")}</TooltipContent>
</Tooltip>
</span>
</span>
@@ -907,12 +910,10 @@ export function RepoCommit() {
event.preventDefault();
}}
>
<SheetTitle className="flex items-center justify-between border-b border-(--color-border) px-3 py-2 text-sm font-semibold">
<span>
Files changed
<span className="ml-2 rounded-full bg-(--color-surface) px-1.5 text-xs leading-5 tabular-nums text-(--color-muted-foreground)">
{stats.fileCount}
</span>
<SheetTitle className="flex items-center justify-between border-b border-(--color-border) py-2 pl-4 pr-3 text-sm font-semibold">
<span className="inline-flex items-center text-(--color-muted-foreground)">
<FolderTree className="size-4 shrink-0" aria-hidden />
<span className="sr-only">{t("repo.show_file_tree")}</span>
</span>
<span className="inline-flex items-center gap-1">
<span className="inline-flex items-stretch overflow-hidden rounded-md border border-(--color-border)">
@@ -921,32 +922,32 @@ export function RepoCommit() {
<button
type="button"
onClick={() => mobileTreeRef.current?.expandAll()}
aria-label={t("diff.expand_all_directories")}
aria-label={t("repo.expand_all_directories")}
className="grid size-7 cursor-pointer place-items-center text-(--color-muted-foreground) hover:bg-(--color-surface) hover:text-(--color-foreground)"
>
<ChevronsUpDown className="size-3.5" aria-hidden />
</button>
</TooltipTrigger>
<TooltipContent>{t("diff.expand_all_directories")}</TooltipContent>
<TooltipContent>{t("repo.expand_all_directories")}</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger asChild>
<button
type="button"
onClick={() => mobileTreeRef.current?.collapseAll()}
aria-label={t("diff.collapse_all_directories")}
aria-label={t("repo.collapse_all_directories")}
className="grid size-7 cursor-pointer place-items-center border-l border-(--color-border) text-(--color-muted-foreground) hover:bg-(--color-surface) hover:text-(--color-foreground)"
>
<ChevronsDownUp className="size-3.5" aria-hidden />
</button>
</TooltipTrigger>
<TooltipContent>{t("diff.collapse_all_directories")}</TooltipContent>
<TooltipContent>{t("repo.collapse_all_directories")}</TooltipContent>
</Tooltip>
</span>
<SheetClose asChild>
<button
type="button"
aria-label="Close"
aria-label={t("close")}
className="grid size-7 cursor-pointer place-items-center rounded-md text-(--color-muted-foreground) hover:bg-(--color-surface) hover:text-(--color-foreground)"
>
<X className="size-4" aria-hidden />
+13 -13
View File
@@ -29,7 +29,7 @@ export function Activate() {
const { t } = useTranslation();
const { code, email, codeLifetimeHours } = route.useLoaderData();
const authenticated = useUserInfo() !== null;
usePageTitle(t("activate_your_account"));
usePageTitle(t("auth.activate_your_account"));
const isVerifying = code !== "";
const [verifyFailed, setVerifyFailed] = useState(false);
@@ -72,14 +72,14 @@ export function Activate() {
});
if (!res.ok) {
const body = (await res.json().catch(() => ({}))) as ActivateErrorResponse;
setFormError(body.error ?? t("send_activation_email_failed"));
setFormError(body.error ?? t("auth.send_activation_email_failed"));
setSubmitting(false);
return;
}
setResent((await res.json()) as ActivateResponse);
setSubmitting(false);
} catch {
setFormError(t("send_activation_email_failed"));
setFormError(t("auth.send_activation_email_failed"));
setSubmitting(false);
}
})();
@@ -89,7 +89,7 @@ export function Activate() {
<main className="flex flex-1 items-center justify-center px-4 py-10 sm:px-6 sm:py-16">
<Card className="w-full max-w-md">
<CardHeader className="items-center text-center">
<CardTitle>{t("activate_your_account")}</CardTitle>
<CardTitle>{t("auth.activate_your_account")}</CardTitle>
</CardHeader>
<CardContent className="pt-2">{renderContent()}</CardContent>
</Card>
@@ -102,17 +102,17 @@ export function Activate() {
return (
<div className="flex flex-col gap-4 text-center">
<p role="alert" className="text-sm text-(--color-destructive)">
{t("invalid_code")}
{t("auth.invalid_code")}
</p>
<Button variant="link" size="inline" asChild className="self-center">
<a href={subUrl("/user/sign-in")}>{t("back_to_sign_in")}</a>
<a href={subUrl("/user/sign-in")}>{t("auth.back_to_sign_in")}</a>
</Button>
</div>
);
}
return (
<p role="status" className="text-center text-sm text-(--color-foreground)">
{t("activating_account")}
{t("auth.activating_account")}
</p>
);
}
@@ -120,9 +120,9 @@ export function Activate() {
if (!authenticated) {
return (
<div className="flex flex-col gap-4 text-center">
<p className="text-sm text-(--color-foreground)">{t("check_activation_email")}</p>
<p className="text-sm text-(--color-foreground)">{t("auth.check_activation_email")}</p>
<Button variant="link" size="inline" asChild className="self-center">
<a href={subUrl("/user/sign-in")}>{t("back_to_sign_in")}</a>
<a href={subUrl("/user/sign-in")}>{t("auth.back_to_sign_in")}</a>
</Button>
</div>
);
@@ -132,10 +132,10 @@ export function Activate() {
return (
<p role="status" className="text-center text-sm text-(--color-foreground)">
{resent.rateLimited ? (
t("resend_rate_limited")
t("auth.resend_rate_limited")
) : (
<Trans
i18nKey="activation_email_sent"
i18nKey="auth.activation_email_sent"
values={{ email, hours: resent.codeLifetimeHours }}
components={{ email: <b />, hours: <b /> }}
/>
@@ -158,13 +158,13 @@ export function Activate() {
<div className="flex flex-col gap-4">
<p className="text-sm text-(--color-foreground)">
<Trans
i18nKey="activation_email_pending"
i18nKey="auth.activation_email_pending"
values={{ email, hours: codeLifetimeHours }}
components={{ email: <b />, hours: <b /> }}
/>
</p>
<Button type="submit" disabled={submitting} className="w-full">
{submitting ? t("sending_activation_email") : t("send_activation_email")}
{submitting ? t("auth.sending_activation_email") : t("auth.send_activation_email")}
</Button>
</div>
</fieldset>
+11 -11
View File
@@ -20,7 +20,7 @@ const route = getRouteApi("/user/mfa");
export function MFA() {
const { t } = useTranslation();
usePageTitle(t("mfa_title"));
usePageTitle(t("auth.mfa_title"));
const navigate = useNavigate();
// When no challenge is pending the loader has already kicked off a full
// navigation away; the early return keeps this page from flashing.
@@ -80,7 +80,7 @@ export function MFA() {
if (errBody.error) setFormError(errBody.error);
if (errBody.fields) setFieldErrors(errBody.fields);
if (!errBody.error && !errBody.fields) {
setFormError(t("mfa_verify_failed"));
setFormError(t("auth.mfa_verify_failed"));
}
setSubmitting(false);
// Focus after React re-enables the fieldset; .focus() is a no-op
@@ -95,7 +95,7 @@ export function MFA() {
const to = new URLSearchParams(window.location.search).get("redirect_to") ?? "";
window.location.assign(subUrl("/redirect") + "?to=" + encodeURIComponent(to));
} catch {
setFormError(t("mfa_verify_failed"));
setFormError(t("auth.mfa_verify_failed"));
setSubmitting(false);
}
})();
@@ -109,7 +109,7 @@ export function MFA() {
<main className="flex flex-1 items-center justify-center px-4 py-10 sm:px-6 sm:py-16">
<Card className="w-full max-w-md">
<CardHeader className="items-center text-center">
<CardTitle>{t("mfa_title")}</CardTitle>
<CardTitle>{t("auth.mfa_title")}</CardTitle>
</CardHeader>
<CardContent className="pt-2">
<form onSubmit={onSubmit} noValidate>
@@ -126,7 +126,7 @@ export function MFA() {
<div className="flex flex-col gap-4">
{isPasscode ? (
<div className="flex flex-col gap-1.5">
<Label htmlFor={inputId}>{t("mfa_passcode")}</Label>
<Label htmlFor={inputId}>{t("auth.mfa_passcode")}</Label>
<Input
ref={passcodeRef}
id={inputId}
@@ -137,7 +137,7 @@ export function MFA() {
required
autoFocus
tabIndex={1}
placeholder={t("mfa_passcode_placeholder")}
placeholder={t("auth.mfa_passcode_placeholder")}
value={passcode}
onChange={(e) => setPasscode(e.target.value)}
aria-invalid={inputErrorKey in fieldErrors ? true : undefined}
@@ -151,7 +151,7 @@ export function MFA() {
</div>
) : (
<div className="flex flex-col gap-1.5">
<Label htmlFor={inputId}>{t("mfa_recovery_code")}</Label>
<Label htmlFor={inputId}>{t("auth.mfa_recovery_code")}</Label>
<Input
ref={recoveryRef}
id={inputId}
@@ -161,7 +161,7 @@ export function MFA() {
required
autoFocus
tabIndex={1}
placeholder={t("mfa_recovery_code_placeholder")}
placeholder={t("auth.mfa_recovery_code_placeholder")}
value={recoveryCode}
onChange={(e) => setRecoveryCode(e.target.value)}
aria-invalid={inputErrorKey in fieldErrors ? true : undefined}
@@ -177,7 +177,7 @@ export function MFA() {
<div className="mt-2 flex flex-col gap-3">
<Button type="submit" disabled={submitting} tabIndex={2} className="w-full">
{submitting ? t("mfa_verifying") : t("mfa_verify")}
{submitting ? t("auth.mfa_verifying") : t("auth.mfa_verify")}
</Button>
<Button
type="button"
@@ -187,7 +187,7 @@ export function MFA() {
className="self-center"
onClick={() => switchMode(isPasscode ? "recovery" : "passcode")}
>
{isPasscode ? t("mfa_use_recovery_code") : t("mfa_use_passcode")}
{isPasscode ? t("auth.mfa_use_recovery_code") : t("auth.mfa_use_passcode")}
</Button>
<Button variant="link" size="inline" asChild className="self-center">
<Link
@@ -199,7 +199,7 @@ export function MFA() {
if (submitting) e.preventDefault();
}}
>
{t("back_to_sign_in")}
{t("auth.back_to_sign_in")}
</Link>
</Button>
</div>
+16 -16
View File
@@ -33,7 +33,7 @@ export function ResetPassword() {
const navigate = useNavigate();
const { code, emailEnabled, valid } = route.useLoaderData();
const isResetForm = code !== "";
usePageTitle(t("reset_password"));
usePageTitle(t("auth.reset_password"));
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
@@ -55,7 +55,7 @@ export function ResetPassword() {
if (isResetForm && password !== confirmPassword) {
setFormError(null);
setFieldErrors({ password: null, confirmPassword: t("password_mismatch") });
setFieldErrors({ password: null, confirmPassword: t("auth.password_mismatch") });
requestAnimationFrame(() => confirmPasswordRef.current?.focus());
return;
}
@@ -102,7 +102,7 @@ export function ResetPassword() {
})();
}
const title = t("reset_password");
const title = t("auth.reset_password");
return (
<main className="flex flex-1 items-center justify-center px-4 py-10 sm:px-6 sm:py-16">
@@ -119,7 +119,7 @@ export function ResetPassword() {
if (!emailEnabled) {
return (
<p role="alert" className="text-center text-sm text-(--color-destructive)">
{t("disable_register_mail")}
{t("auth.disable_register_mail")}
</p>
);
}
@@ -128,17 +128,17 @@ export function ResetPassword() {
<div className="flex flex-col gap-4 text-center">
<p role="status" className="text-sm text-(--color-foreground)">
{sent.resendLimited ? (
t("reset_password_resend_limited")
t("auth.reset_password_resend_limited")
) : (
<Trans
i18nKey="reset_password_email_sent"
i18nKey="auth.reset_password_email_sent"
values={{ email, hours: sent.hours }}
components={{ email: <b />, hours: <b /> }}
/>
)}
</p>
<Button variant="link" size="inline" asChild className="self-center">
<a href={subUrl("/user/sign-in")}>{t("back_to_sign_in")}</a>
<a href={subUrl("/user/sign-in")}>{t("auth.back_to_sign_in")}</a>
</Button>
</div>
);
@@ -173,7 +173,7 @@ export function ResetPassword() {
)}
</div>
<FormActions
submitLabel={submitting ? t("reset_password_email_submitting") : t("send_reset_email")}
submitLabel={submitting ? t("auth.reset_password_email_submitting") : t("auth.send_reset_email")}
submitTabIndex={3}
/>
</div>
@@ -187,10 +187,10 @@ export function ResetPassword() {
return (
<div className="flex flex-col gap-4 text-center">
<p role="alert" className="text-sm text-(--color-destructive)">
{t("invalid_code")}
{t("auth.invalid_code")}
</p>
<Button variant="link" size="inline" asChild className="self-center">
<a href={subUrl("/user/sign-in")}>{t("back_to_sign_in")}</a>
<a href={subUrl("/user/sign-in")}>{t("auth.back_to_sign_in")}</a>
</Button>
</div>
);
@@ -202,13 +202,13 @@ export function ResetPassword() {
{renderFormError()}
<div className="flex flex-col gap-4">
<div className="flex flex-col gap-1.5">
<Label htmlFor="password">{t("new_password")}</Label>
<Label htmlFor="password">{t("auth.new_password")}</Label>
<PasswordInput
inputRef={passwordRef}
id="password"
value={password}
tabIndex={1}
placeholder={t("new_password_placeholder")}
placeholder={t("auth.new_password_placeholder")}
show={showPassword}
onToggleShow={() => setShowPassword((v) => !v)}
disabled={submitting}
@@ -224,13 +224,13 @@ export function ResetPassword() {
)}
</div>
<div className="flex flex-col gap-1.5">
<Label htmlFor="confirmPassword">{t("confirm_new_password")}</Label>
<Label htmlFor="confirmPassword">{t("auth.confirm_new_password")}</Label>
<PasswordInput
inputRef={confirmPasswordRef}
id="confirmPassword"
value={confirmPassword}
tabIndex={3}
placeholder={t("confirm_new_password_placeholder")}
placeholder={t("auth.confirm_new_password_placeholder")}
show={showConfirmPassword}
onToggleShow={() => setShowConfirmPassword((v) => !v)}
disabled={submitting}
@@ -245,7 +245,7 @@ export function ResetPassword() {
)}
</div>
<FormActions
submitLabel={submitting ? t("reset_password_submitting") : t("reset_password_submit")}
submitLabel={submitting ? t("auth.reset_password_submitting") : t("auth.reset_password_submit")}
submitTabIndex={5}
/>
</div>
@@ -282,7 +282,7 @@ export function ResetPassword() {
if (submitting) e.preventDefault();
}}
>
{t("back_to_sign_in")}
{t("auth.back_to_sign_in")}
</a>
</Button>
</div>
+8 -8
View File
@@ -75,7 +75,7 @@ export function SignIn() {
focusField = FIELD_ORDER.find((f) => f in (body.fields ?? {}));
}
if (!body.error && !body.fields) {
setFormError(t("sign_in_failed"));
setFormError(t("auth.sign_in_failed"));
}
setSubmitting(false);
// Defer focus past the React commit so the fieldset is re-enabled
@@ -101,7 +101,7 @@ export function SignIn() {
// /redirect is a server endpoint (303), must be a full navigation.
window.location.assign(subUrl("/redirect") + "?to=" + encodeURIComponent(to));
} catch {
setFormError(t("sign_in_failed"));
setFormError(t("auth.sign_in_failed"));
setSubmitting(false);
}
})();
@@ -163,7 +163,7 @@ export function SignIn() {
if (submitting) e.preventDefault();
}}
>
{t("forget_password")}
{t("auth.forget_password")}
</a>
</Button>
</div>
@@ -188,7 +188,7 @@ export function SignIn() {
tabIndex={3}
disabled={submitting}
onClick={() => setShowPassword((v) => !v)}
aria-label={showPassword ? t("hide_password") : t("show_password")}
aria-label={showPassword ? t("auth.hide_password") : t("auth.show_password")}
aria-pressed={showPassword}
className="absolute inset-y-0 right-0 flex w-10 cursor-pointer items-center justify-center rounded-r-md text-(--color-muted-foreground) outline-none hover:text-(--color-foreground) focus-visible:text-(--color-foreground) focus-visible:ring-1 focus-visible:ring-(--color-ring) disabled:cursor-not-allowed disabled:opacity-50"
>
@@ -208,7 +208,7 @@ export function SignIn() {
{loginSources.length > 0 && (
<div className="flex flex-col gap-1.5">
<Label htmlFor="login_source">{t("auth_source")}</Label>
<Label htmlFor="login_source">{t("auth.auth_source")}</Label>
<Select
value={String(loginSource)}
onValueChange={(v) => setLoginSource(Number(v))}
@@ -218,7 +218,7 @@ export function SignIn() {
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="0">{t("local")}</SelectItem>
<SelectItem value="0">{t("auth.local")}</SelectItem>
{loginSources.map((s) => (
<SelectItem key={s.id} value={String(s.id)}>
{s.name}
@@ -231,7 +231,7 @@ export function SignIn() {
<div className="mt-2 flex flex-col gap-3">
<Button type="submit" disabled={submitting} tabIndex={5} className="w-full">
{submitting ? t("sign_in_submitting") : t("sign_in")}
{submitting ? t("auth.sign_in_submitting") : t("sign_in")}
</Button>
<Button variant="link" size="inline" asChild className="self-center">
<a
@@ -243,7 +243,7 @@ export function SignIn() {
if (submitting) e.preventDefault();
}}
>
{t("sign_up_now")}
{t("auth.sign_up_now")}
</a>
</Button>
</div>
+10 -10
View File
@@ -65,7 +65,7 @@ export function SignUp() {
setFormError(null);
if (password !== confirmPassword) {
setFieldErrors({ password: null, confirmPassword: t("password_mismatch") });
setFieldErrors({ password: null, confirmPassword: t("auth.password_mismatch") });
requestAnimationFrame(() => confirmPasswordRef.current?.focus());
return;
}
@@ -88,7 +88,7 @@ export function SignUp() {
focusField = FIELD_ORDER.find((f) => f in (body.fields ?? {}));
}
if (!body.error && !body.fields) {
setFormError(t("sign_up_failed"));
setFormError(t("auth.sign_up_failed"));
}
setSubmitting(false);
if (captchaEnabled) refreshCaptcha();
@@ -110,7 +110,7 @@ export function SignUp() {
}
await navigate({ to: "/user/sign-in" });
} catch {
setFormError(t("sign_up_failed"));
setFormError(t("auth.sign_up_failed"));
setSubmitting(false);
if (captchaEnabled) refreshCaptcha();
}
@@ -132,7 +132,7 @@ export function SignUp() {
if (registrationDisabled) {
return (
<p role="alert" className="text-center text-sm text-(--color-destructive)">
{t("disable_register_prompt")}
{t("auth.disable_register_prompt")}
</p>
);
}
@@ -141,13 +141,13 @@ export function SignUp() {
<div className="flex flex-col gap-4 text-center">
<p role="status" className="text-sm text-(--color-foreground)">
<Trans
i18nKey="activation_email_sent"
i18nKey="auth.activation_email_sent"
values={{ email: sent.email, hours: sent.hours }}
components={{ email: <b />, hours: <b /> }}
/>
</p>
<Button variant="link" size="inline" asChild className="self-center">
<a href={subUrl("/user/sign-in")}>{t("back_to_sign_in")}</a>
<a href={subUrl("/user/sign-in")}>{t("auth.back_to_sign_in")}</a>
</Button>
</div>
);
@@ -236,13 +236,13 @@ export function SignUp() {
</div>
<div className="flex flex-col gap-1.5">
<Label htmlFor="confirmPassword">{t("confirm_password")}</Label>
<Label htmlFor="confirmPassword">{t("auth.confirm_password")}</Label>
<PasswordInput
inputRef={confirmPasswordRef}
id="confirmPassword"
value={confirmPassword}
tabIndex={5}
placeholder={t("confirm_password_placeholder")}
placeholder={t("auth.confirm_password_placeholder")}
show={showConfirmPassword}
onToggleShow={() => setShowConfirmPassword((v) => !v)}
disabled={submitting}
@@ -306,7 +306,7 @@ export function SignUp() {
<div className="mt-2 flex flex-col gap-3">
<Button type="submit" disabled={submitting} tabIndex={9} className="w-full">
{submitting ? t("sign_up_submitting") : t("create_new_account")}
{submitting ? t("auth.sign_up_submitting") : t("auth.create_new_account")}
</Button>
<Button variant="link" size="inline" asChild className="self-center">
<a
@@ -318,7 +318,7 @@ export function SignUp() {
if (submitting) e.preventDefault();
}}
>
{t("register_hepler_msg")}
{t("auth.register_hepler_msg")}
</a>
</Button>
</div>