mirror of
https://github.com/gogs/gogs.git
synced 2026-05-28 21:30:36 +00:00
1231
This commit is contained in:
@@ -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
@@ -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)`);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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"
|
||||
>
|
||||
|
||||
@@ -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)}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 ký 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
@@ -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
@@ -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
@@ -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
@@ -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();
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 />
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user