diff --git a/apps/mobile/src/app/(app)/_layout.tsx b/apps/mobile/src/app/(app)/_layout.tsx
index b906648f86..ed169ee76b 100644
--- a/apps/mobile/src/app/(app)/_layout.tsx
+++ b/apps/mobile/src/app/(app)/_layout.tsx
@@ -158,6 +158,15 @@ export default function AppLayout() {
headerShown: false,
}}
/>
+
({ back: vi.fn() }));
+const slot = vi.hoisted(() => ({ bridge: undefined as BranchPickerBridge | undefined }));
+
+vi.mock('expo-router', () => ({
+ useRouter: () => router,
+}));
+vi.mock('react-native', () => ({
+ Pressable: 'Pressable',
+ ScrollView: 'ScrollView',
+ View: 'View',
+}));
+vi.mock('@/components/picker-sheet', () => ({
+ // The fake shell renders the header contract (title + both dismiss
+ // controls) and the rows below it, so a test can assert the header
+ // controls and the rows in one tree.
+ PickerSheet: (props: {
+ title: string;
+ onDone: () => void;
+ onCancel?: () => void;
+ expired?: boolean;
+ children?: React.ReactNode;
+ }) =>
+ createElement(
+ 'PickerSheet',
+ {
+ title: props.title,
+ expired: props.expired === true,
+ onCancel: props.onCancel,
+ onDone: props.onDone,
+ },
+ props.children
+ ),
+}));
+vi.mock('@/components/ui/text', async () => {
+ const React = await import('react');
+ return { Text: 'Text', TextClassContext: React.createContext(undefined) };
+});
+vi.mock('@/components/ui/icons', () => ({ Check: 'Check' }));
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({ primary: '#0a84ff' }),
+}));
+vi.mock('@/lib/route-registry', () => ({
+ UNFENCED_ROUTE_KEY: 'unscoped',
+ useRouteRegistry: vi.fn(),
+ branchPickerSlot: {
+ get: () => slot.bridge,
+ clear: vi.fn(),
+ },
+}));
+
+function texts(renderer: TestRenderer.ReactTestRenderer): string[] {
+ return renderer.root
+ .findAllByType('Text' as never)
+ .flatMap(node => node.children)
+ .filter((child): child is string => typeof child === 'string');
+}
+
+function branchLabel(branch: string): string {
+ return i18n.t('agentChat.newSession.branchAccessibility', { label: branch });
+}
+
+function branchRow(renderer: TestRenderer.ReactTestRenderer, branch: string) {
+ return renderer.root.findAll(
+ node =>
+ node.props.accessibilityLabel === branchLabel(branch) &&
+ typeof node.props.onPress === 'function'
+ )[0];
+}
+
+/** Fire a node's `onPress`, the way a tap would. */
+function press(node: TestRenderer.ReactTestInstance | undefined) {
+ act(() => {
+ (node?.props.onPress as (() => void) | undefined)?.();
+ });
+}
+
+/** Mount the screen inside act, so i18n's subscription settles inside it. */
+function mount(): TestRenderer.ReactTestRenderer {
+ const ref: { current: TestRenderer.ReactTestRenderer | null } = { current: null };
+ act(() => {
+ ref.current = TestRenderer.create(createElement(BranchPickerScreen));
+ });
+ const created = ref.current;
+ if (created === null) {
+ throw new Error('the branch picker route did not render');
+ }
+ return created;
+}
+
+function setBridge(overrides: Partial = {}) {
+ slot.bridge = {
+ branches: ['main', 'release/2.0'],
+ defaultBranch: 'main',
+ selectedBranch: 'main',
+ onSelect: vi.fn(() => undefined),
+ ...overrides,
+ };
+}
+
+beforeEach(() => {
+ (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
+ slot.bridge = undefined;
+ router.back.mockClear();
+});
+
+describe('BranchPickerScreen', () => {
+ it('renders the header shell with both dismiss controls and one row per branch', () => {
+ setBridge();
+ const renderer = mount();
+
+ const shell = renderer.root.findByType('PickerSheet' as never);
+ expect(shell.props.title).toBe(i18n.t('agentChat.newSession.branchPickerTitle'));
+ expect(typeof shell.props.onCancel).toBe('function');
+ expect(typeof shell.props.onDone).toBe('function');
+
+ expect(branchRow(renderer, 'main')).toBeDefined();
+ expect(branchRow(renderer, 'release/2.0')).toBeDefined();
+ });
+
+ it('marks the provider default row and the selected row', () => {
+ setBridge({ selectedBranch: 'release/2.0' });
+ const renderer = mount();
+
+ expect(texts(renderer)).toContain(i18n.t('agentChat.newSession.branchDefault'));
+ expect(branchRow(renderer, 'release/2.0')?.props.accessibilityState).toEqual({
+ selected: true,
+ });
+ expect(branchRow(renderer, 'main')?.props.accessibilityState).toEqual({ selected: false });
+ });
+
+ it('hands the picked branch name back and dismisses', () => {
+ const onSelect = vi.fn(() => undefined);
+ setBridge({ onSelect });
+ const renderer = mount();
+
+ press(branchRow(renderer, 'release/2.0'));
+
+ expect(onSelect).toHaveBeenCalledWith('release/2.0');
+ expect(router.back).toHaveBeenCalledTimes(1);
+ });
+
+ it('hands the default branch name back too — the trigger owns the override decision', () => {
+ const onSelect = vi.fn(() => undefined);
+ setBridge({ onSelect });
+ const renderer = mount();
+
+ press(branchRow(renderer, 'main'));
+
+ expect(onSelect).toHaveBeenCalledWith('main');
+ });
+
+ it('dismisses from the header Cancel without reporting a pick', () => {
+ const onSelect = vi.fn(() => undefined);
+ setBridge({ onSelect });
+ const renderer = mount();
+
+ const shell = renderer.root.findByType('PickerSheet' as never);
+ act(() => {
+ (shell.props.onCancel as () => void)();
+ });
+
+ expect(router.back).toHaveBeenCalledTimes(1);
+ expect(onSelect).not.toHaveBeenCalled();
+ });
+
+ it('renders the standard expired shell when the slot is gone', () => {
+ const renderer = mount();
+
+ const shell = renderer.root.findByType('PickerSheet' as never);
+ expect(shell.props.expired).toBe(true);
+ expect(texts(renderer)).not.toContain('main');
+ });
+});
diff --git a/apps/mobile/src/app/(app)/agent-chat/branch-picker.tsx b/apps/mobile/src/app/(app)/agent-chat/branch-picker.tsx
new file mode 100644
index 0000000000..2585e7a9be
--- /dev/null
+++ b/apps/mobile/src/app/(app)/agent-chat/branch-picker.tsx
@@ -0,0 +1,85 @@
+import { useRouter } from 'expo-router';
+import { Check } from '@/components/ui/icons';
+import { useState } from 'react';
+import { Pressable, View } from 'react-native';
+import { useTranslation } from 'react-i18next';
+
+import { PickerSheet } from '@/components/picker-sheet';
+import { Text } from '@/components/ui/text';
+import { useThemeColors } from '@/lib/hooks/use-theme-colors';
+import { type BranchPickerBridge } from '@/lib/picker-bridge';
+import { branchPickerSlot, UNFENCED_ROUTE_KEY, useRouteRegistry } from '@/lib/route-registry';
+
+/**
+ * The new-session branch picker, presented as the standard formSheet (same
+ * shell as the repo/mode/model pickers). The shell's header carries the
+ * dismiss controls and the rows render below it, so a Cancel control can
+ * never float over — or drift away from — the branch rows.
+ */
+export default function BranchPickerScreen() {
+ const router = useRouter();
+ const colors = useThemeColors();
+ const { t } = useTranslation();
+ useRouteRegistry(UNFENCED_ROUTE_KEY);
+ // Lazy init reads the slot synchronously on first render — no effect, no
+ // "Options expired" flash before a later effect populates state.
+ const [bridge] = useState(() => branchPickerSlot.get(UNFENCED_ROUTE_KEY));
+
+ function close() {
+ router.back();
+ }
+
+ function handleSelect(picker: BranchPickerBridge, branch: string) {
+ picker.onSelect(branch);
+ branchPickerSlot.clear(UNFENCED_ROUTE_KEY);
+ router.back();
+ }
+
+ if (!bridge) {
+ return (
+
+ );
+ }
+
+ return (
+
+
+ {bridge.branches.map(branch => {
+ const isSelected = branch === bridge.selectedBranch;
+ const isDefault = branch === bridge.defaultBranch;
+ return (
+ {
+ handleSelect(bridge, branch);
+ }}
+ >
+
+ {branch}
+
+ {isDefault ? (
+
+ {t('agentChat.newSession.branchDefault')}
+
+ ) : null}
+ {isSelected ? : null}
+
+ );
+ })}
+
+
+ );
+}
diff --git a/apps/mobile/src/app/(app)/agent-chat/repo-picker.tsx b/apps/mobile/src/app/(app)/agent-chat/repo-picker.tsx
index 3caa8c6961..432c31f82d 100644
--- a/apps/mobile/src/app/(app)/agent-chat/repo-picker.tsx
+++ b/apps/mobile/src/app/(app)/agent-chat/repo-picker.tsx
@@ -2,9 +2,8 @@ import { useFocusEffect, useRouter } from 'expo-router';
import * as Haptics from 'expo-haptics';
import { Check, Info, Lock, Search, SearchX, Unlock } from '@/components/ui/icons';
import { useCallback, useMemo, useRef, useState } from 'react';
-import { FlatList, Pressable, TextInput, View } from 'react-native';
+import { Pressable, TextInput, View } from 'react-native';
import { useTranslation } from 'react-i18next';
-import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { EmptyState } from '@/components/empty-state';
import { PickerSheet } from '@/components/picker-sheet';
@@ -21,7 +20,6 @@ type PickerListItem =
export default function RepoPickerScreen() {
const router = useRouter();
const colors = useThemeColors();
- const { bottom } = useSafeAreaInsets();
const { t } = useTranslation();
const [search, setSearch] = useState('');
const [bridge, setBridge] = useState(() => repoPickerSlot.get(UNFENCED_ROUTE_KEY));
@@ -102,7 +100,6 @@ export default function RepoPickerScreen() {
@@ -136,17 +133,18 @@ export default function RepoPickerScreen() {
}
/>
) : (
- item.key}
- keyboardShouldPersistTaps="handled"
- keyboardDismissMode="on-drag"
- contentContainerStyle={{ paddingBottom: bottom }}
- renderItem={({ item }) => {
+ // Mapped rows inside the shell ScrollView instead of a FlatList: the
+ // FlatList stretches into the space the formSheet offers and its rows
+ // painted over the pinned search header while scrolling. The shell
+ // scroll view starts below the header, so a row can never overlap it.
+
+ {listItems.map(item => {
if (item.kind === 'header') {
return (
-
+
{t(item.titleKey)}
);
@@ -156,6 +154,7 @@ export default function RepoPickerScreen() {
const rowLabel = `${platformName} ${repo.fullName}`;
return (
{
handleSelect(`${repo.platform}:${repo.fullName}`);
@@ -182,9 +181,33 @@ export default function RepoPickerScreen() {
) : null}
);
- }}
- />
+ })}
+ {renderBitbucketNote()}
+
)}
);
+
+ /**
+ * Personal Bitbucket never lists repositories (organization-only), so the
+ * grouped list would end at GitLab with nothing explaining the gap. The
+ * note renders once, after the provider sections, whenever the picker has
+ * rows but no Bitbucket section; a connected org's rows suppress it.
+ */
+ function renderBitbucketNote() {
+ if (search.trim() || !bridge) {
+ return null;
+ }
+ if (bridge.sections.some(section => section.key === 'bitbucket')) {
+ return null;
+ }
+ return (
+
+
+ {t('agentChat.repoPicker.platformBitbucket')}
+
+ {t('agentChat.newSession.bitbucketOrganizationsOnly')}
+
+ );
+ }
}
diff --git a/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/_layout.tsx b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/_layout.tsx
new file mode 100644
index 0000000000..5c917ab7f9
--- /dev/null
+++ b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/_layout.tsx
@@ -0,0 +1,125 @@
+import { type Href, Redirect, Stack, useLocalSearchParams } from 'expo-router';
+import { useMemo } from 'react';
+
+import { appUnlockScreenLayout } from '@/components/app-unlock-screen';
+import { InvalidRouteState } from '@/components/invalid-route-state';
+import { PrReviewConnectGate } from '@/components/pr-review/pr-review-connect-gate';
+import { useFormSheetDetents } from '@/lib/form-sheet';
+import { useCurrentUserId } from '@/lib/hooks/use-current-user-id';
+import { useRouteForegroundRefresh } from '@/lib/hooks/use-route-foreground-refresh';
+import { useOrganization } from '@/lib/organization-context';
+import {
+ pendingReviewDraftKey,
+ PendingReviewProvider,
+} from '@/lib/pr-review/pending-review-provider';
+import {
+ parseProviderPrRoute,
+ providerPrRefKey,
+ providerPrRoutePath,
+ ProviderPrScopeProvider,
+ providerPrTriple,
+} from '@/lib/pr-review/provider-pr-ref';
+import { parseParam } from '@/lib/route-params';
+
+type Params = {
+ platform: string;
+ identity: string[];
+ instance?: string;
+};
+
+/**
+ * Param guard + scope hoist for the provider PR-review surface.
+ *
+ * The route is `[platform]/[...identity]`, where the LAST identity segment is
+ * the number (a GitLab MR iid, a Bitbucket PR id) and everything before it is
+ * the project path — a GitLab FULL nested path (`group/sub/repo`) or a
+ * Bitbucket `workspace/repo`. `parseProviderPrRoute` validates every segment,
+ * so a hand-built deep link with a missing, repeated or non-numeric segment
+ * never reaches a query.
+ *
+ * GitHub keeps its original `[owner]/[repo]/[number]` route untouched — this
+ * layout only redirects a hand-built `/pr-review/github/...` link there so
+ * that surface, its connect gate and its write sheets stay exactly as they
+ * were.
+ *
+ * The scope (ref + organization) is published in context rather than threaded
+ * through props: the diff list, the file navigator and the discussion tree
+ * take the GitHub-shaped `owner`/`repo`/`number` triple, and reading the real
+ * ref from context moves their queries to the right provider without a
+ * per-provider copy of that tree.
+ */
+export default function ProviderPrReviewLayout() {
+ const params = useLocalSearchParams();
+ const platform = parseParam(params.platform) ?? '';
+ // A catch-all param is a fresh array on every render; the joined form is a
+ // stable dependency, and a `/` inside a segment is percent-encoded by
+ // `providerPrRoutePath`, so splitting it back is lossless.
+ const identity = Array.isArray(params.identity)
+ ? params.identity.join('/')
+ : (parseParam(params.identity) ?? '');
+ const instance = parseParam(params.instance) ?? '';
+ const { organizationId } = useOrganization();
+ const { fullSheetDetent } = useFormSheetDetents();
+ const { userId } = useCurrentUserId();
+ useRouteForegroundRefresh([[['providerReview']]]);
+
+ const ref = useMemo(
+ () =>
+ parseProviderPrRoute({
+ platform,
+ identity: identity.split('/'),
+ instance: instance || undefined,
+ }),
+ [platform, identity, instance]
+ );
+ const scope = useMemo(() => (ref ? { ref, organizationId } : null), [ref, organizationId]);
+
+ if (!ref || !scope) {
+ return ;
+ }
+
+ if (ref.platform === 'github') {
+ return ;
+ }
+
+ // One draft queue per PR/MR: the GitHub-shaped key the store already uses,
+ // suffixed with the s1 collision-free ref identity so a GitLab MR and a
+ // GitHub PR that share `owner/repo#number` — and one project reached on two
+ // GitLab instances — never share a queue.
+ const triple = providerPrTriple(ref);
+ const draftEntityKey = `${pendingReviewDraftKey(triple.owner, triple.repo, triple.number)}@${providerPrRefKey(ref)}`;
+
+ const sheetOptions = {
+ presentation: 'formSheet' as const,
+ sheetAllowedDetents: [0.5, fullSheetDetent] as [number, number],
+ sheetInitialDetentIndex: 'last' as const,
+ sheetGrabberVisible: true,
+ headerShown: false,
+ };
+
+ return (
+
+
+ {/* The provider-aware connect gate (s7): a disconnected reader can
+ never reach the authenticated queries and mutations below, and a
+ Bitbucket personal scope gets the terminal org-only explanation
+ instead of a retry that could not succeed. */}
+
+
+ {/* The three write sheets (s6) are siblings of the GitHub route's
+ sheets: they mount inside this layout, so they see the provider
+ scope and this PR's single `PendingReviewProvider` queue. */}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/comment-composer.tsx b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/comment-composer.tsx
new file mode 100644
index 0000000000..4a141c120b
--- /dev/null
+++ b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/comment-composer.tsx
@@ -0,0 +1,5 @@
+import { PrReviewCommentComposerScreen } from '@/components/pr-review/pr-review-comment-composer-screen';
+
+export default function ProviderPrReviewCommentComposerRoute() {
+ return ;
+}
diff --git a/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/file-navigator.tsx b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/file-navigator.tsx
new file mode 100644
index 0000000000..f5e1922b64
--- /dev/null
+++ b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/file-navigator.tsx
@@ -0,0 +1,5 @@
+import { PrReviewFileNavigatorScreen } from '@/components/pr-review/pr-review-file-navigator-screen';
+
+export default function ProviderPrReviewFileNavigatorRoute() {
+ return ;
+}
diff --git a/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/index.tsx b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/index.tsx
new file mode 100644
index 0000000000..33d1ce0458
--- /dev/null
+++ b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/index.tsx
@@ -0,0 +1,40 @@
+import { type Href, Stack, useLocalSearchParams } from 'expo-router';
+
+import { InvalidRouteState } from '@/components/invalid-route-state';
+import { PrReviewScreen } from '@/components/pr-review/pr-review-screen';
+import { parseProviderPrRoute, providerPrTriple } from '@/lib/pr-review/provider-pr-ref';
+import { parseParam } from '@/lib/route-params';
+
+type Params = {
+ platform: string;
+ identity: string[];
+ instance?: string;
+};
+
+/**
+ * The provider PR/MR detail screen. The layout above already validated the
+ * route and published the scope, so the screen renders through the same tree
+ * GitHub uses; the triple it takes is the GitHub-shaped identity its stores
+ * are keyed on, while its queries follow the ref from the scope.
+ */
+export default function ProviderPrReviewIndexRoute() {
+ const params = useLocalSearchParams();
+ const ref = parseProviderPrRoute({
+ platform: parseParam(params.platform) ?? '',
+ identity: params.identity,
+ instance: params.instance,
+ });
+
+ if (!ref) {
+ return ;
+ }
+
+ const { owner, repo, number } = providerPrTriple(ref);
+
+ return (
+ <>
+
+
+ >
+ );
+}
diff --git a/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/merge.tsx b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/merge.tsx
new file mode 100644
index 0000000000..e337d7891b
--- /dev/null
+++ b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/merge.tsx
@@ -0,0 +1,5 @@
+import { PrReviewMergeScreen } from '@/components/pr-review/pr-review-merge-screen';
+
+export default function ProviderPrReviewMergeRoute() {
+ return ;
+}
diff --git a/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/review-submit.tsx b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/review-submit.tsx
new file mode 100644
index 0000000000..a6f5f35433
--- /dev/null
+++ b/apps/mobile/src/app/(app)/pr-review/[platform]/[...identity]/review-submit.tsx
@@ -0,0 +1,5 @@
+import { PrReviewReviewSubmitScreen } from '@/components/pr-review/pr-review-review-submit-screen';
+
+export default function ProviderPrReviewSubmitRoute() {
+ return ;
+}
diff --git a/apps/mobile/src/components/agents/new-session-configure-form.tsx b/apps/mobile/src/components/agents/new-session-configure-form.tsx
index 6ebae1b378..33d9762546 100644
--- a/apps/mobile/src/components/agents/new-session-configure-form.tsx
+++ b/apps/mobile/src/components/agents/new-session-configure-form.tsx
@@ -217,6 +217,7 @@ export function NewSessionConfigureForm({
contentContainerClassName="flex-grow px-4 pb-8 pt-4"
keyboardShouldPersistTaps="handled"
automaticallyAdjustKeyboardInsets
+ keyboardDismissMode="on-drag"
>
({
+ ActivityIndicator: 'ActivityIndicator',
+ View: 'View',
+}));
+vi.mock('@/components/ui/text', async () => {
+ const React = await import('react');
+ return { Text: 'Text', TextClassContext: React.createContext(undefined) };
+});
+vi.mock('@/components/ui/button', () => ({ Button: 'Button' }));
+vi.mock('@/components/ui/icons', () => ({ ExternalLink: 'ExternalLink', RefreshCw: 'RefreshCw' }));
+vi.mock('@/components/ui/activity-indicator', () => ({ ActivityIndicator: 'ActivityIndicator' }));
+vi.mock('@/components/query-error', () => ({ QueryError: 'QueryError' }));
+vi.mock('@/components/agents/repo-selector', () => ({ RepoSelector: 'RepoSelector' }));
+vi.mock('@/components/agents/repository-branch-selector', () => ({
+ RepositoryBranchSelector: 'RepositoryBranchSelector',
+}));
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({ foreground: '#000000', mutedForeground: '#777777' }),
+}));
+
+const githubRow: NewSessionRepository = {
+ platform: 'github',
+ fullName: 'owner/repo',
+ isPrivate: false,
+};
+const gitlabRow: NewSessionRepository = {
+ platform: 'gitlab',
+ fullName: 'owner/repo',
+ isPrivate: false,
+};
+
+const group = (
+ key: RepositoryGroup['key'],
+ status: RepositoryGroup['status'],
+ repositories: NewSessionRepository[] = []
+): RepositoryGroup => ({ key, status, repositories });
+
+function mountSection(overrides: {
+ value?: string;
+ repositories?: NewSessionRepository[];
+ groups?: RepositoryGroup[];
+}) {
+ const renderer: { current: TestRenderer.ReactTestRenderer | null } = { current: null };
+ act(() => {
+ renderer.current = TestRenderer.create(
+ createElement(NewSessionRepositorySection, {
+ disabled: false,
+ isRetrying: false,
+ onChange: vi.fn(() => undefined),
+ onConnect: vi.fn(() => undefined),
+ onRefreshRepos: vi.fn(() => undefined),
+ repositories: overrides.repositories ?? [githubRow, gitlabRow],
+ recents: [],
+ groups: overrides.groups ?? [group('github', 'repos'), group('gitlab', 'repos')],
+ value: overrides.value ?? '',
+ })
+ );
+ });
+ const created = renderer.current;
+ if (created === null) {
+ throw new Error('the section did not render');
+ }
+ return created;
+}
+
+function branchSelectorProps(renderer: TestRenderer.ReactTestRenderer) {
+ return renderer.root.findAllByType('RepositoryBranchSelector' as never)[0]?.props as {
+ repository: NewSessionRepository | null;
+ disabled: boolean;
+ };
+}
+
+function renderedText(renderer: TestRenderer.ReactTestRenderer): string[] {
+ return renderer.root
+ .findAllByType('Text' as never)
+ .flatMap(node => node.children)
+ .filter((child): child is string => typeof child === 'string');
+}
+
+beforeEach(() => {
+ resetSelectedBranchOverrides();
+});
+
+describe('NewSessionRepositorySection branch row', () => {
+ it('hands the branch selector the resolved repository row', () => {
+ const renderer = mountSection({ value: 'github:owner/repo' });
+
+ expect(branchSelectorProps(renderer).repository).toEqual(githubRow);
+ });
+
+ it('keeps same-named rows on two providers distinct', () => {
+ const renderer = mountSection({ value: 'gitlab:owner/repo' });
+
+ expect(branchSelectorProps(renderer).repository).toEqual(gitlabRow);
+ });
+
+ it('offers no branch row until a repository is selected', () => {
+ const renderer = mountSection({ value: '' });
+
+ expect(branchSelectorProps(renderer).repository).toBeNull();
+ });
+
+ it('clears a stale branch override when the section mounts', () => {
+ setSelectedBranchOverride(githubRow, 'release/2.0');
+
+ mountSection({ value: 'github:owner/repo' });
+
+ expect(getSelectedBranchOverride(githubRow)).toBeNull();
+ });
+
+ it('clears the branch override when the section unmounts', () => {
+ const renderer = mountSection({ value: 'github:owner/repo' });
+ setSelectedBranchOverride(githubRow, 'release/2.0');
+
+ act(() => {
+ renderer.unmount();
+ });
+
+ expect(getSelectedBranchOverride(githubRow)).toBeNull();
+ });
+});
+
+describe('NewSessionRepositorySection Bitbucket connect card', () => {
+ it('states outright that Bitbucket is organizations-only', () => {
+ const renderer = mountSection({
+ groups: [group('github', 'repos'), group('gitlab', 'repos'), group('bitbucket', 'connect')],
+ });
+
+ expect(renderedText(renderer)).toContain(
+ i18n.t('agentChat.newSession.bitbucketOrganizationsOnly')
+ );
+ });
+
+ it('leaves the GitHub connect card free of the Bitbucket restriction', () => {
+ const renderer = mountSection({
+ groups: [group('github', 'connect'), group('gitlab', 'repos')],
+ });
+
+ expect(renderedText(renderer)).not.toContain(
+ i18n.t('agentChat.newSession.bitbucketOrganizationsOnly')
+ );
+ });
+});
diff --git a/apps/mobile/src/components/agents/new-session-repository-section.tsx b/apps/mobile/src/components/agents/new-session-repository-section.tsx
index 0022bb02d6..415bff7def 100644
--- a/apps/mobile/src/components/agents/new-session-repository-section.tsx
+++ b/apps/mobile/src/components/agents/new-session-repository-section.tsx
@@ -1,4 +1,4 @@
-import { Fragment, type ReactElement } from 'react';
+import { Fragment, type ReactElement, useEffect } from 'react';
import { View } from 'react-native';
import { ActivityIndicator } from '@/components/ui/activity-indicator';
import { useTranslation } from 'react-i18next';
@@ -8,11 +8,13 @@ import { Button } from '@/components/ui/button';
import { Text } from '@/components/ui/text';
import { QueryError } from '@/components/query-error';
import { RepoSelector } from '@/components/agents/repo-selector';
+import { RepositoryBranchSelector } from '@/components/agents/repository-branch-selector';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
import {
type NewSessionRepository,
type RepositoryGroup,
type RepositoryPlatform,
+ resetSelectedBranchOverrides,
} from './new-session-repository-state';
type NewSessionRepositorySectionProps = {
@@ -65,6 +67,16 @@ const PROVIDER_COPY = {
}
>;
+/**
+ * The restriction a provider's connect card must state outright. Bitbucket
+ * connects for an organization, never for a personal account, so "connect it"
+ * can never read as a promise that a personal session will get Bitbucket
+ * repositories — or their branches.
+ */
+function connectNoteKey(platform: RepositoryPlatform): string | undefined {
+ return platform === 'bitbucket' ? 'agentChat.newSession.bitbucketOrganizationsOnly' : undefined;
+}
+
/**
* Provider-aware repository section. One group per provider renders its own
* connect/empty/error state independently, and the picker trigger lists every
@@ -87,6 +99,22 @@ export function NewSessionRepositorySection({
const hasRepos = repositories.length > 0;
const anyLoading = groups.some(group => group.status === 'loading');
+ // The picker reports `platform:fullName`; resolve it to the row so the branch
+ // selector queries (and keys) the full repository identity. The prefill seeds
+ // the same platform-qualified key, so no bare-fullName fallback is needed —
+ // one would bind a same-named row on another provider.
+ const selectedRepository =
+ repositories.find(repository => `${repository.platform}:${repository.fullName}` === value) ??
+ null;
+
+ // The branch choice belongs to this screen: clear it when the section mounts
+ // and when it goes away, so a branch picked for one draft can never reach the
+ // next one.
+ useEffect(() => {
+ resetSelectedBranchOverrides();
+ return resetSelectedBranchOverrides;
+ }, []);
+
return (
@@ -104,6 +132,8 @@ export function NewSessionRepositorySection({
/>
)}
+
+
{groups.map(group => (
{renderGroupCard(group.key, group.status)}
))}
@@ -149,11 +179,13 @@ export function NewSessionRepositorySection({
function renderConnectCard(platform: RepositoryPlatform): ReactElement | null {
const copy = PROVIDER_COPY[platform];
+ const noteKey = connectNoteKey(platform);
return (
{t(copy.connectTitle)}
{t(copy.connectDescription)}
+ {noteKey ? {t(noteKey)} : null}
{scrollable && !expired ? (
- {body}
+ // keyboardShouldPersistTaps keeps a first tap on a row working while
+ // a picker's search field holds the keyboard open.
+
+ {body}
+
) : (
body
)}
diff --git a/apps/mobile/src/components/pr-review/composer-inline-error.tsx b/apps/mobile/src/components/pr-review/composer-inline-error.tsx
index 73c9500a8b..a5fa43772d 100644
--- a/apps/mobile/src/components/pr-review/composer-inline-error.tsx
+++ b/apps/mobile/src/components/pr-review/composer-inline-error.tsx
@@ -90,7 +90,7 @@ export function useComposerInlineError(error: unknown, isEdit: boolean) {
})();
return;
}
- const display = mutationErrorDisplay('composer', classification, error);
+ const display = mutationErrorDisplay('composer', classification, { rawError: error });
setInlineError(display.message);
setInlineErrorKind(display.kind);
setInlineErrorIsLocal(false);
diff --git a/apps/mobile/src/components/pr-review/diff/diff-line.mounted.test.tsx b/apps/mobile/src/components/pr-review/diff/diff-line.mounted.test.tsx
new file mode 100644
index 0000000000..840eac4046
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/diff/diff-line.mounted.test.tsx
@@ -0,0 +1,108 @@
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (same pattern as pr-diff-hunk-rows.test.tsx) */
+import { createElement } from 'react';
+import TestRenderer, { act } from 'react-test-renderer';
+import { describe, expect, it, vi } from 'vitest';
+
+import '@/i18n';
+import { DiffLine } from './diff-line';
+import { type ParsedDiffLine } from '@/lib/pr-review/diff/parse-patch';
+
+vi.mock('react-native', () => ({
+ Pressable: 'Pressable',
+ Text: 'RNText',
+ View: 'View',
+}));
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({
+ background: '#FFFFFF',
+ foreground: '#111111',
+ good: '#0a0',
+ destructive: '#d00',
+ mutedForeground: '#777777',
+ }),
+}));
+
+function line(overrides: Partial = {}): ParsedDiffLine {
+ return {
+ type: 'context',
+ oldLine: 12,
+ newLine: 12,
+ text: 'const value = computeSomething(x);',
+ noNewlineAtEndOfFile: false,
+ ...overrides,
+ };
+}
+
+/** Mount a DiffLine inside act, so subscription updates stay inside it. */
+function mountLine(props: {
+ line: ParsedDiffLine;
+ language: string | null;
+ keyId: string;
+}): TestRenderer.ReactTestRenderer {
+ const ref: { current: TestRenderer.ReactTestRenderer | null } = { current: null };
+ act(() => {
+ ref.current = TestRenderer.create(createElement(DiffLine, props));
+ });
+ const created = ref.current;
+ if (created === null) {
+ throw new Error('the diff line did not render');
+ }
+ return created;
+}
+
+/** The row is the only `flex-row items-stretch` View in a DiffLine. */
+function findRow(renderer: TestRenderer.ReactTestRenderer): TestRenderer.ReactTestInstance {
+ const rows = renderer.root.findAll(
+ node =>
+ node.type === ('View' as never) &&
+ typeof node.props.className === 'string' &&
+ node.props.className.includes('flex-row items-stretch')
+ );
+ const [row] = rows;
+ if (rows.length !== 1 || row === undefined) {
+ throw new Error(`expected exactly one diff row, found ${rows.length}`);
+ }
+ return row;
+}
+
+describe('DiffLine gutter alignment', () => {
+ // The row is `flex-row items-stretch`, so the gutter View stretches to the
+ // row's full height. A long code line wraps and makes the row several
+ // visual lines tall; the line number must sit on the FIRST visual line —
+ // aligned with the code's first line via the same top padding the code
+ // container uses — never centered onto a later visual line.
+ it('aligns the gutter number with the start of the row on a wrapped line', () => {
+ const renderer = mountLine({
+ line: line({
+ text: 'const wrappedValue = someVeryLongExpression(thatDoesNotFitOnOneLine, atPhoneWidth) + trailingOperand;',
+ }),
+ language: null,
+ keyId: 'line-12',
+ });
+
+ const row = findRow(renderer);
+ const [gutter, code] = row.props.children as [
+ TestRenderer.ReactTestInstance,
+ TestRenderer.ReactTestInstance,
+ ];
+
+ expect(gutter.props.className).toContain('justify-start');
+ expect(gutter.props.className).not.toContain('justify-center');
+ expect((gutter.props.style as { paddingTop: number }).paddingTop).toBe(2);
+ // The code container pads by the same amount, so the gutter's first line
+ // and the code's first visual line share one baseline.
+ expect((code.props.style as { paddingVertical: number }).paddingVertical).toBe(2);
+ });
+
+ it('keeps the same alignment for add and delete rows', () => {
+ for (const type of ['add', 'del', 'context'] as const) {
+ const renderer = mountLine({ line: line({ type }), language: null, keyId: `k-${type}` });
+ const row = findRow(renderer);
+ const [gutter] = row.props.children as [
+ TestRenderer.ReactTestInstance,
+ TestRenderer.ReactTestInstance,
+ ];
+ expect(gutter.props.className).toContain('justify-start');
+ }
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/diff/diff-line.tsx b/apps/mobile/src/components/pr-review/diff/diff-line.tsx
index 07001afad6..795ab003fa 100644
--- a/apps/mobile/src/components/pr-review/diff/diff-line.tsx
+++ b/apps/mobile/src/components/pr-review/diff/diff-line.tsx
@@ -121,6 +121,11 @@ function DiffLineImpl({ line, language, onTap, isSelected }: Readonly
-
+
{/* eslint-disable-next-line react-native/no-inline-styles, react-native/no-color-literals -- dynamic theme color + mono font for gutter */}
void;
};
-const FILE_NAVIGATOR_PATH = '/(app)/pr-review/[owner]/[repo]/[number]/file-navigator' as const;
-
export function PrDiffFileListHeader({
owner,
repo,
@@ -51,10 +50,14 @@ export function PrDiffFileListHeader({
const colors = useThemeColors();
const { t } = useTranslation();
- const navigatorHref = useMemo(
- () => ({ pathname: FILE_NAVIGATOR_PATH, params: { owner, repo, number } }),
- [owner, repo, number]
- );
+ // The sheet is a sibling of the screen it was opened from, so its href is
+ // built from the live scope: a GitHub ref keeps the original
+ // `[owner]/[repo]/[number]/file-navigator` path, a GitLab or Bitbucket ref
+ // opens the sheet inside the provider layout — the only place its scope is
+ // published, and therefore the only place the sheet can query the right
+ // provider.
+ const { ref } = useProviderPrScope({ owner, repo, number });
+ const navigatorHref = useMemo(() => providerPrChildRoutePath(ref, 'file-navigator'), [ref]);
const handleOpenNavigator = useCallback(() => {
router.push(navigatorHref);
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-file-list.test.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-file-list.test.tsx
index 3de14a9903..14c521b0f3 100644
--- a/apps/mobile/src/components/pr-review/diff/pr-diff-file-list.test.tsx
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-file-list.test.tsx
@@ -4,10 +4,17 @@ import { type RefreshControlProps } from 'react-native';
import TestRenderer, { act } from 'react-test-renderer';
import { beforeEach, describe, expect, it, vi } from 'vitest';
+import { ProviderPrScopeProvider } from '@/lib/pr-review/provider-pr-ref';
+
import { PrReviewFileList } from './pr-diff-file-list';
const insetsState = vi.hoisted(() => ({ top: 0, bottom: 0, left: 0, right: 0 }));
+// Records every (ref, headSha) the list hands to the viewed-files hook, so
+// the provider-scoped keying (s6, identity rule 17) is proven at the call
+// site rather than only in the store's unit tests.
+const viewedFilesCalls = vi.hoisted(() => [] as unknown[][]);
+
const listQueryState = vi.hoisted(() => ({
query: {
isLoading: false,
@@ -89,7 +96,10 @@ vi.mock('@/lib/pr-review/diff/use-pr-diff-context-loader', () => ({
}));
vi.mock('@/lib/pr-review/diff/pr-review-file-list-state', () => ({
usePrReviewFileListQuery: () => listQueryState,
- usePrReviewViewedFiles: () => ({ isViewed: () => false, toggle: vi.fn(), isLoading: false }),
+ usePrReviewViewedFiles: (...args: unknown[]) => {
+ viewedFilesCalls.push(args);
+ return { isViewed: () => false, toggle: vi.fn(), isLoading: false };
+ },
useFetchToCompletion: () => ({
run: vi.fn(),
isRunning: false,
@@ -130,6 +140,29 @@ function mountList(changedFiles = BASE_PROPS.changedFiles): TestRenderer.ReactTe
return renderer;
}
+function mountListInScope(
+ ref: Parameters[0]['value']['ref']
+): TestRenderer.ReactTestRenderer {
+ const holder: { current: TestRenderer.ReactTestRenderer | undefined } = { current: undefined };
+ act(() => {
+ holder.current = TestRenderer.create(
+
+
+
+ );
+ });
+ const renderer = holder.current;
+ if (!renderer) {
+ throw new Error('renderer was not created');
+ }
+ return renderer;
+}
+
+function listBottomPadding(renderer: TestRenderer.ReactTestRenderer): number {
+ const list = renderer.root.find(node => String(node.type) === 'FlashList');
+ return (list.props.contentContainerStyle as { paddingBottom: number }).paddingBottom;
+}
+
function bottomPaddedViews(
renderer: TestRenderer.ReactTestRenderer
): TestRenderer.ReactTestInstance[] {
@@ -212,3 +245,85 @@ describe('PrReviewFileList full-body states', () => {
expect(renderer.root.findAll(node => String(node.type) === 'QueryError')).toHaveLength(0);
});
});
+
+// The comment composer and the review-submit sheet are route siblings on
+// every provider (s6): the write bar renders on a GitLab MR / Bitbucket PR
+// too, and the bar carries the provider ref so it pushes the sheet inside
+// the ref's own route — never the GitHub sibling.
+describe('PrReviewFileList write affordances per provider', () => {
+ beforeEach(() => {
+ insetsState.bottom = 0;
+ resetState();
+ listQueryState.files = [{ path: 'src/file.ts' }];
+ viewedFilesCalls.length = 0;
+ });
+
+ it('keeps the write bar on a GitHub pull request', () => {
+ const renderer = mountList();
+ const bar = renderer.root.find(node => String(node.type) === 'PrDiffFloatingActions');
+ expect(bar.props.prRef).toBeUndefined();
+ });
+
+ // The viewed set must be keyed by the live provider ref (s6, identity
+ // rule 17): the store folds `providerPrRefKey` into the key only when the
+ // call site hands it a ref, so the bare triple would silently collide.
+ it('keys the viewed set by the live ref, never the bare triple', () => {
+ mountList();
+ expect(viewedFilesCalls[0]).toEqual([
+ { platform: 'github', owner: 'octocat', repo: 'hello-world', number: 7 },
+ 'sha',
+ ]);
+ mountListInScope({ platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 });
+ expect(viewedFilesCalls[1]).toEqual([
+ { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 },
+ 'sha',
+ ]);
+ mountListInScope({ platform: 'bitbucket', workspace: 'acme', repoSlug: 'api', prId: 42 });
+ expect(viewedFilesCalls[2]).toEqual([
+ { platform: 'bitbucket', workspace: 'acme', repoSlug: 'api', prId: 42 },
+ 'sha',
+ ]);
+ });
+
+ it('keeps the write bar on a GitLab merge request, carrying the provider ref', () => {
+ const renderer = mountListInScope({
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ });
+ const bar = renderer.root.find(node => String(node.type) === 'PrDiffFloatingActions');
+ expect(bar.props.prRef).toEqual({
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ });
+ });
+
+ it('keeps the write bar on a Bitbucket pull request, carrying the provider ref', () => {
+ const renderer = mountListInScope({
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'api',
+ prId: 42,
+ });
+ const bar = renderer.root.find(node => String(node.type) === 'PrDiffFloatingActions');
+ expect(bar.props.prRef).toEqual({
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'api',
+ prId: 42,
+ });
+ });
+
+ it('keeps the small footer gap under a provider diff list too', () => {
+ const githubPadding = listBottomPadding(mountList());
+ const gitlabPadding = listBottomPadding(
+ mountListInScope({ platform: 'gitlab', projectPath: 'group/repo', mrIid: 12 })
+ );
+ // The bar is an in-flow footer below the list (spot check e3), so no
+ // row can ever scroll under it; the list only keeps a 12-point gap
+ // between its last row and the footer's top edge, on every provider.
+ expect(githubPadding).toBe(12);
+ expect(gitlabPadding).toBe(12);
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-file-list.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-file-list.tsx
index db42a09621..3540a51fd4 100644
--- a/apps/mobile/src/components/pr-review/diff/pr-diff-file-list.tsx
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-file-list.tsx
@@ -12,8 +12,9 @@
// * S7a adds diff-line selection: tapping a line runs the pure
// `selectLine` reducer; the result is mirrored into the
// `diff-selection-bridge` (so the comment composer can read it on
-// mount) and a floating action bar (`PrDiffFloatingActions`)
-// hosts the "Comment" and "Finish review" affordances.
+// mount) and a footer action bar (`PrDiffFloatingActions`) rendered
+// in-flow below the list hosts the "Comment" and "Finish review"
+// affordances.
//
// Cold first paint: FlashList mounts only after the first page of files is
// present. The first-load waiting state is a plain skeleton outside the list
@@ -26,7 +27,7 @@
import { FlashList, type FlashListRef } from '@shopify/flash-list';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
-import { View, type ViewStyle } from 'react-native';
+import { View } from 'react-native';
import { RefreshControl } from '@/components/ui/refresh-control';
import { QueryError } from '@/components/query-error';
@@ -41,11 +42,12 @@ import {
} from '@/components/pr-review/diff/pr-diff-file-list-header';
import { PrDiffFileListLoading } from '@/components/pr-review/diff/pr-diff-file-list-loading';
import { PrDiffFloatingActions } from '@/components/pr-review/diff/pr-diff-floating-actions';
+import { usePrDiffStateCopy } from '@/components/pr-review/diff/pr-diff-state-copy';
+import { useProviderPrScope } from '@/lib/pr-review/provider-pr-ref';
import { useDiffRenderItem } from '@/components/pr-review/diff/pr-diff-file-list-render';
import { useDiffSelection } from '@/components/pr-review/diff/use-diff-selection';
import { EmptyFilesView, TabStateMessage } from '@/components/pr-review/diff/pr-diff-rows';
import { buildFileItems, buildPaginationItem } from '@/lib/pr-review/diff/pr-diff-list-builder';
-import { prDiffListBottomPadding } from '@/lib/pr-review/diff/pr-diff-list-bottom-padding';
import { itemTypeFor, type ListItem } from '@/lib/pr-review/diff/pr-diff-list-items';
import { stickyFileHeaderIndices } from '@/lib/pr-review/diff/sticky-file-headers';
import { usePrDiffContextLoader } from '@/lib/pr-review/diff/use-pr-diff-context-loader';
@@ -59,6 +61,9 @@ import { clearDiffSelection } from '@/lib/pr-review/diff-selection-bridge';
import { CenteredState } from '@/components/centered-state';
import { useIsTablet } from '@/lib/hooks/use-is-tablet';
+// Gap between the last diff row and the in-flow footer bar's top edge.
+const PR_DIFF_LIST_FOOTER_GAP = 12;
+
type PrReviewFileListProps = {
readonly owner: string;
readonly repo: string;
@@ -91,7 +96,12 @@ export function PrReviewFileList({
number,
enabled: true,
});
- const viewed = usePrReviewViewedFiles({ owner, repo, number }, headSha);
+ // The live provider scope: the viewed set is keyed by the ref (s6,
+ // identity rule 17), so a GitLab MR and a same-numbered GitHub PR — or
+ // one project on two GitLab instances — never share a set. On the GitHub
+ // route the fallback ref is the triple itself, keeping the legacy bytes.
+ const scope = useProviderPrScope({ owner, repo, number });
+ const viewed = usePrReviewViewedFiles(scope.ref, headSha);
const fetchToCompletion = useFetchToCompletion(query, changedFiles);
const [expanded, setExpanded] = useState>({});
@@ -121,24 +131,16 @@ export function PrReviewFileList({
[owner, repo, number]
);
- // Measured floating-bar height (null until the first layout event).
- const [barHeight, setBarHeight] = useState(null);
-
- // Stable callback: ignore sub-one-point noise to avoid unnecessary
- // re-renders. Layout events can fire with fractional-pixel deltas.
- const handleHeightChange = useCallback((height: number) => {
- setBarHeight(prev => {
- if (prev !== null && Math.abs(prev - height) < 1) {
- return prev;
- }
- return height;
- });
- }, []);
+ // The write bar renders on every provider (s6): its two routes — the
+ // comment composer and the review-submit sheet — are siblings of the
+ // GitHub route AND of the provider route, so the bar pushes the sheet
+ // inside the scope its queries run under. The bar is an in-flow footer
+ // below the list (spot check e3), so the list only keeps a small gap
+ // between its last row and the footer's top edge.
+ const listContentStyle = useMemo(() => ({ paddingBottom: PR_DIFF_LIST_FOOTER_GAP }), []);
- const contentContainerStyle = useMemo(
- () => ({ paddingBottom: prDiffListBottomPadding(barHeight) }),
- [barHeight]
- );
+ // Which provider's words the terminal and empty states use.
+ const copy = usePrDiffStateCopy({ owner, repo, number });
const viewedCount = useMemo(() => {
let count = 0;
@@ -262,19 +264,11 @@ export function PrReviewFileList({
if (files.length === 0) {
if (firstPageErrorState?.kind === 'not-found') {
- return (
-
- );
+ return ;
}
if (firstPageErrorState?.kind === 'permission') {
return (
-
+
);
}
if (firstPageErrorState?.kind === 'reconnect') {
@@ -301,6 +295,7 @@ export function PrReviewFileList({
return (
0 ? (
@@ -357,7 +352,7 @@ export function PrReviewFileList({
}
}}
onEndReachedThreshold={0.5}
- contentContainerStyle={contentContainerStyle}
+ contentContainerStyle={listContentStyle}
ItemSeparatorComponent={null}
/>
)}
@@ -365,10 +360,10 @@ export function PrReviewFileList({
owner={owner}
repo={repo}
number={number}
+ prRef={scope.ref.platform === 'github' ? undefined : scope.ref}
viewMode={effectiveViewMode}
selection={selection}
onClearSelection={clearSelection}
- onHeightChange={handleHeightChange}
/>
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.test.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.test.tsx
index d8c25eb1bd..e51f73d7f7 100644
--- a/apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.test.tsx
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.test.tsx
@@ -16,6 +16,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
import '@/i18n';
import { PrDiffFileNavigator } from '@/components/pr-review/diff/pr-diff-file-navigator';
import { type PrReviewFile } from '@/lib/pr-review/diff/pr-review-file-types';
+import { type ProviderPrRef, ProviderPrScopeProvider } from '@/lib/pr-review/provider-pr-ref';
import { renderWithProviders } from '@/test/render-with-providers';
// ── Hoisted mocks ──────────────────────────────────────────────────────────
@@ -31,6 +32,11 @@ const rowRenders = vi.hoisted(
() => [] as { path: string; onSelect: () => void; onToggleViewed: () => void }[]
);
+// Records every (ref, headSha) the navigator hands to the viewed-files hook,
+// so the provider-scoped keying (s6, identity rule 17) is proven at the call
+// site rather than only in the store's unit tests.
+const viewedFilesCalls = vi.hoisted(() => [] as unknown[][]);
+
// Captures the latest FlashList props so tests can read `onEndReached`.
const flashListProps = vi.hoisted(() => ({ current: null as null | Record }));
@@ -153,7 +159,10 @@ let fetchAllResult: FetchAllResult = {
vi.mock('@/lib/pr-review/diff/pr-review-file-list-state', () => ({
usePrReviewFileListQuery: () => listQueryResult,
- usePrReviewViewedFiles: () => viewedResult,
+ usePrReviewViewedFiles: (...args: unknown[]) => {
+ viewedFilesCalls.push(args);
+ return viewedResult;
+ },
useFetchToCompletion: () => fetchAllResult,
}));
@@ -571,3 +580,60 @@ describe('PrDiffFileNavigator list bottom inset (plan §6)', () => {
expect(listContentStyle()).toEqual({ paddingBottom: 66, paddingTop: 8 });
});
});
+
+// s6 (identity rule 17): the sheet toggling a file here and the diff list
+// behind it share the viewed store, so both must key it by the LIVE provider
+// ref. A bare triple would silently collide across providers and GitLab
+// instances; the store only folds the collision-free key when it receives
+// the ref.
+describe('PrDiffFileNavigator viewed-set provider keying (s6)', () => {
+ const GITLAB_REF: ProviderPrRef = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ };
+
+ beforeEach(() => {
+ viewedFilesCalls.length = 0;
+ listQueryResult = {
+ query: {
+ isLoading: false,
+ isFetching: false,
+ isFetchingNextPage: false,
+ hasNextPage: false,
+ fetchNextPage: fetchNextPageMock,
+ refetch: vi.fn(),
+ },
+ files: [makeFile('src/a.ts')],
+ firstPageErrorState: null,
+ laterPageError: false,
+ };
+ viewedResult = { isViewed: () => false, toggle: vi.fn(() => undefined), isLoading: false };
+ fetchAllResult = {
+ run: fetchAllRunMock,
+ isRunning: false,
+ loadedFiles: 0,
+ totalFiles: null,
+ error: null,
+ };
+ });
+
+ it('keys the viewed set by the provider ref under the provider scope', async () => {
+ await renderWithProviders(
+
+
+
+ );
+
+ expect(viewedFilesCalls[0]).toEqual([GITLAB_REF, 'sha']);
+ });
+
+ it('falls back to the GitHub ref triple on the GitHub route', async () => {
+ await renderWithProviders();
+
+ expect(viewedFilesCalls[0]).toEqual([
+ { platform: 'github', owner: 'octocat', repo: 'hello-world', number: 7 },
+ 'sha',
+ ]);
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.tsx
index 1b68b7e368..8b041df532 100644
--- a/apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.tsx
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.tsx
@@ -43,6 +43,7 @@ import {
} from '@/lib/pr-review/diff/pr-review-file-list-state';
import { type PrReviewFile } from '@/lib/pr-review/diff/pr-review-file-types';
import { filterNavigatorFiles } from '@/lib/pr-review/diff/navigator-file-filter';
+import { useProviderPrScope } from '@/lib/pr-review/provider-pr-ref';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
// Memoized row so recycled cells do not re-render on every keystroke: `file`
@@ -108,7 +109,11 @@ export function PrDiffFileNavigator({
number,
enabled: true,
});
- const viewed = usePrReviewViewedFiles({ owner, repo, number }, headSha);
+ // The viewed set is keyed by the live provider ref (s6, identity rule 17),
+ // so the sheet toggling a file here and the diff list behind it read and
+ // write the SAME provider-scoped set — and never a same-numbered PR's.
+ const scope = useProviderPrScope({ owner, repo, number });
+ const viewed = usePrReviewViewedFiles(scope.ref, headSha);
const fetchAll = useFetchToCompletion(query, changedFiles);
const hasActiveSearch = searchRef.current.trim().length > 0;
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.backdrop.test.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.backdrop.test.tsx
new file mode 100644
index 0000000000..7338b83730
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.backdrop.test.tsx
@@ -0,0 +1,102 @@
+// Spot check e2-expand.png: the Finish review island floated over the
+// unified diff with deleted-line text still visible around and below the
+// button. The card was opaque but the bar's padding ring was not, so diff
+// rows scrolled under it showed through. The bar container itself must
+// carry the screen background and swallow touches in that ring.
+// (Extracted from pr-diff-floating-actions.test.tsx to keep that file
+// inside the max-lines budget.)
+
+import * as React from 'react';
+import { describe, expect, it, vi } from 'vitest';
+
+import '@/i18n';
+import type * as ReactI18next from 'react-i18next';
+import { PrDiffFloatingActions } from './pr-diff-floating-actions';
+import { type SelectionState } from '@/lib/pr-review/diff-selection';
+
+vi.mock('react-i18next', async importOriginal => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ useTranslation: () => {
+ const i18n = actual.getI18n();
+ return { t: i18n.t.bind(i18n), i18n };
+ },
+ };
+});
+
+vi.mock('expo-router', () => ({
+ useRouter: () => ({ push: vi.fn() }),
+}));
+
+vi.mock('react-native', () => ({
+ View: 'View',
+ Platform: { OS: 'ios' },
+}));
+
+vi.mock('react-native-safe-area-context', () => ({
+ useSafeAreaInsets: () => ({ top: 0, bottom: 0, left: 0, right: 0 }),
+}));
+
+vi.mock('@/components/ui/icons', () => ({
+ MessageCirclePlus: () => null,
+}));
+
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({
+ primaryForeground: '#FFFFFF',
+ foreground: '#000000',
+ mutedForeground: '#6F6A61',
+ }),
+}));
+
+vi.mock('@/components/ui/button', () => ({ Button: 'Button' }));
+vi.mock('@/components/ui/text', () => ({ Text: 'Text' }));
+vi.mock('@/lib/pr-review/diff-selection-bridge', () => ({
+ clearDiffSelection: vi.fn(),
+}));
+
+vi.mock('@/lib/pr-review/pending-review-provider', () => ({
+ usePendingReview: () => ({
+ items: [],
+ addComment: vi.fn(() => undefined),
+ updateComment: vi.fn(() => undefined),
+ removeComment: vi.fn(() => undefined),
+ clear: vi.fn(() => undefined),
+ }),
+}));
+
+const baseProps = {
+ owner: 'octocat',
+ repo: 'hello',
+ number: 7,
+ viewMode: 'unified' as const,
+ selection: null as SelectionState | null,
+ onClearSelection: vi.fn(),
+};
+
+function renderBar(): React.ReactElement {
+ // eslint-disable-next-line new-cap -- plain function component, no hooks state needed for the container props
+ return PrDiffFloatingActions(baseProps);
+}
+
+describe('PrDiffFloatingActions opaque backdrop (spot check e2)', () => {
+ it('paints the bar container with the screen background and swallows touches', () => {
+ // With a transparent container the diff rows scrolled under the bar
+ // stayed visible around and below the button. The container carries the
+ // screen background, and the removed `pointerEvents="box-none"` means a
+ // tap in the padding ring can never reach a diff row hidden behind it.
+ const props = renderBar().props as { className?: string; pointerEvents?: string };
+ expect(props.pointerEvents).toBeUndefined();
+ expect((props.className ?? '').split(' ')).toContain('bg-background');
+ });
+
+ it('keeps the action card on the same background inside the bar', () => {
+ const card = (renderBar().props as { children?: React.ReactElement }).children;
+ if (!card) {
+ throw new Error('floating action card not found');
+ }
+ const classes = (card.props as { className?: string }).className ?? '';
+ expect(classes.split(' ')).toContain('bg-background');
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.badge.mounted.test.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.badge.mounted.test.tsx
new file mode 100644
index 0000000000..381fc20647
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.badge.mounted.test.tsx
@@ -0,0 +1,252 @@
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (same pattern as pr-diff-file-list.test.tsx) */
+// Spot check e1-select-line / e1-line1-comment: the Finish review count badge
+// rode the label's top-right corner (`absolute -right-2.5 -top-2.5`), so the
+// opaque pill drew over the last glyphs of the label. The earlier repairs
+// pinned the bar's container and footer classes, never the badge's own
+// placement inside the button, so the overlap survived them. This file mounts
+// the real `PrDiffFloatingActions` inside the real `Button` (the composed
+// render path the e1 screenshots show: a GitLab MR, a line selected so the
+// Comment row is up, a non-empty pending queue) and pins what makes the
+// overlap structurally impossible: the badge is an in-flow sibling AFTER the
+// label in the button's `flex-row items-center justify-center gap-2` line,
+// no node in the whole tree is absolute, and a two-digit count behaves the
+// same. Mutation-inversion gate: re-wrapping the label in a `relative` View
+// with an `absolute` badge must fail tests 1–3.
+import TestRenderer, { act } from 'react-test-renderer';
+import { describe, expect, it, vi } from 'vitest';
+
+import '@/i18n';
+import type * as ReactI18next from 'react-i18next';
+import { type PendingReviewItem } from '@/lib/pr-review/pending-review-provider';
+import { type ProviderPrRef } from '@/lib/pr-review/provider-pr-ref';
+import { type SelectionState } from '@/lib/pr-review/diff-selection';
+import { PrDiffFloatingActions } from './pr-diff-floating-actions';
+
+vi.mock('react-i18next', async importOriginal => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ useTranslation: () => {
+ const i18n = actual.getI18n();
+ return { t: i18n.t.bind(i18n), i18n };
+ },
+ };
+});
+
+const insets = vi.hoisted(() => ({ top: 0, bottom: 0, left: 0, right: 0 }));
+
+const pendingState = vi.hoisted((): { items: PendingReviewItem[] } => ({ items: [] }));
+
+// The real Button and the real Text mount against these host stubs, so the
+// button's own `flex-row items-center justify-center gap-2` classes — the gap
+// that separates label from badge — are the ones under test.
+vi.mock('react-native', () => ({
+ View: 'View',
+ Pressable: 'Pressable',
+ ActivityIndicator: 'ActivityIndicator',
+ Text: 'RNText',
+ Platform: { OS: 'ios' },
+ I18nManager: { isRTL: false, doLeftAndRightSwapInRTL: false },
+}));
+vi.mock('@rn-primitives/slot', () => ({ Text: 'SlotText', View: 'SlotView' }));
+vi.mock('expo-router', () => ({
+ useRouter: () => ({ push: vi.fn() }),
+}));
+vi.mock('react-native-safe-area-context', () => ({
+ useSafeAreaInsets: () => insets,
+}));
+vi.mock('@/components/ui/icons', () => ({
+ MessageCirclePlus: () => null,
+}));
+// The real Button reaches the UI spinner through its loading arm; the real
+// spinner pulls the motion policy (expo-battery), which this harness does not
+// mount. The badge placement under test never renders the spinner.
+vi.mock('@/components/ui/activity-indicator', () => ({ ActivityIndicator: 'ActivityIndicator' }));
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({
+ primaryForeground: '#FFFFFF',
+ foreground: '#000000',
+ mutedForeground: '#6F6A61',
+ }),
+}));
+vi.mock('@/lib/pr-review/diff-selection-bridge', () => ({
+ clearDiffSelection: vi.fn(),
+}));
+vi.mock('@/lib/pr-review/pending-review-provider', () => ({
+ usePendingReview: () => ({
+ items: pendingState.items,
+ addComment: vi.fn(() => undefined),
+ updateComment: vi.fn(() => undefined),
+ removeComment: vi.fn(() => undefined),
+ clear: vi.fn(() => undefined),
+ }),
+}));
+
+const GITLAB_REF: ProviderPrRef = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+};
+
+// The e1 moment: a README line is selected, so the bar shows the selection
+// row (Comment + Clear) above the Finish review button.
+const SELECTION: SelectionState = {
+ path: 'README.md',
+ side: 'RIGHT',
+ hunkKey: 'README.md:0',
+ startLine: 5,
+ line: 5,
+ selectedText: '- old readme line',
+};
+
+function makeItem(index: number): PendingReviewItem {
+ return {
+ id: `id-${index}`,
+ path: 'README.md',
+ side: 'RIGHT',
+ line: index + 1,
+ body: 'comment',
+ commitSha: 'head-1',
+ };
+}
+
+function classesOf(node: TestRenderer.ReactTestInstance): string[] {
+ return typeof node.props.className === 'string' ? node.props.className.split(' ') : [];
+}
+
+function styleOf(node: TestRenderer.ReactTestInstance): Record {
+ const style = node.props.style;
+ return style != null && typeof style === 'object' && !Array.isArray(style)
+ ? (style as Record)
+ : {};
+}
+
+/** The instance children of a node, dropping raw text nodes. */
+function instanceChildren(node: TestRenderer.ReactTestInstance): TestRenderer.ReactTestInstance[] {
+ return node.children.filter(
+ (child): child is TestRenderer.ReactTestInstance => typeof child !== 'string'
+ );
+}
+
+/** Resolve a child to its rendered host node: the label mounts as the real
+ * Text composite, so the button's child is the composite, not the RNText. */
+function hostRoot(node: TestRenderer.ReactTestInstance): TestRenderer.ReactTestInstance {
+ let current = node;
+ while (typeof current.type !== 'string') {
+ const [first] = instanceChildren(current);
+ if (!first) {
+ throw new Error('composite rendered nothing');
+ }
+ current = first;
+ }
+ return current;
+}
+
+/** The instance child at `index`, or a thrown error naming the tree. */
+function childAt(
+ node: TestRenderer.ReactTestInstance,
+ index: number
+): TestRenderer.ReactTestInstance {
+ const kids = instanceChildren(node);
+ const kid = kids[index];
+ if (!kid) {
+ throw new Error(`expected a child at index ${index}, got ${kids.length} children`);
+ }
+ return kid;
+}
+
+function hostText(node: TestRenderer.ReactTestInstance): string {
+ return node.children.filter((child): child is string => typeof child === 'string').join('');
+}
+
+function mountBar(pendingCount: number): TestRenderer.ReactTestRenderer {
+ pendingState.items = Array.from({ length: pendingCount }, (_, index) => makeItem(index));
+ const ref: { current: TestRenderer.ReactTestRenderer | undefined } = { current: undefined };
+ act(() => {
+ ref.current = TestRenderer.create(
+ undefined)}
+ />
+ );
+ });
+ const renderer = ref.current;
+ if (!renderer) {
+ throw new Error('renderer was not created');
+ }
+ return renderer;
+}
+
+function finishReviewButton(
+ renderer: TestRenderer.ReactTestRenderer
+): TestRenderer.ReactTestInstance {
+ return renderer.root.find(
+ node => String(node.type) === 'Pressable' && node.props.accessibilityLabel === 'Finish review'
+ );
+}
+
+describe('Finish review count badge placement (spot check e1)', () => {
+ it('lays the badge out in-flow after the label, never over it', () => {
+ const renderer = mountBar(3);
+ const button = finishReviewButton(renderer);
+ const buttonClasses = classesOf(button);
+ // The button is the row that spaces label and badge apart.
+ expect(buttonClasses).toContain('flex-row');
+ expect(buttonClasses).toContain('items-center');
+ expect(buttonClasses).toContain('justify-center');
+ expect(buttonClasses).toContain('gap-2');
+
+ const kids = instanceChildren(button);
+ expect(kids).toHaveLength(2);
+ const label = hostRoot(childAt(button, 0));
+ expect(String(label.type)).toBe('RNText');
+ expect(hostText(label)).toBe('Finish review');
+ const badge = childAt(button, 1);
+ expect(String(badge.type)).toBe('View');
+ expect(classesOf(badge)).toContain('rounded-full');
+ // The defect: the badge was anchored to the label's corner with negative
+ // offsets, so it drew over the last glyphs. In-flow it cannot.
+ expect(classesOf(badge)).not.toContain('absolute');
+ expect(styleOf(badge).position).not.toBe('absolute');
+ expect(styleOf(badge).right).toBeUndefined();
+ expect(styleOf(badge).top).toBeUndefined();
+ // The badge is a direct sibling of the label in the button row, after it.
+ expect(badge.parent).toBe(button);
+ expect(hostText(hostRoot(childAt(badge, 0)))).toBe('3');
+ });
+
+ it('renders no absolutely positioned node anywhere in the bar', () => {
+ const renderer = mountBar(3);
+ const absolutes = renderer.root.findAll(node => {
+ if (classesOf(node).includes('absolute')) {
+ return true;
+ }
+ return styleOf(node).position === 'absolute';
+ });
+ expect(absolutes).toHaveLength(0);
+ });
+
+ it('keeps the badge in-flow for a two-digit pending count', () => {
+ const renderer = mountBar(12);
+ const button = finishReviewButton(renderer);
+ expect(instanceChildren(button)).toHaveLength(2);
+ const badge = childAt(button, 1);
+ expect(String(badge.type)).toBe('View');
+ expect(classesOf(badge)).not.toContain('absolute');
+ expect(hostText(hostRoot(childAt(badge, 0)))).toBe('12');
+ });
+
+ it('renders the label alone when the pending queue is empty', () => {
+ const renderer = mountBar(0);
+ const button = finishReviewButton(renderer);
+ expect(instanceChildren(button)).toHaveLength(1);
+ expect(hostText(hostRoot(childAt(button, 0)))).toBe('Finish review');
+ const badges = renderer.root.findAll(node => classesOf(node).includes('rounded-full'));
+ expect(badges).toHaveLength(0);
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.test.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.test.tsx
index 565b69700a..51c844330c 100644
--- a/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.test.tsx
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.test.tsx
@@ -18,6 +18,7 @@ import '@/i18n';
import type * as ReactI18next from 'react-i18next';
import { PrDiffFloatingActions } from './pr-diff-floating-actions';
import { type PendingReviewItem } from '@/lib/pr-review/pending-review-provider';
+import { type ProviderPrRef } from '@/lib/pr-review/provider-pr-ref';
import { type SelectionState } from '@/lib/pr-review/diff-selection';
vi.mock('react-i18next', async importOriginal => {
@@ -241,6 +242,66 @@ describe('PrDiffFloatingActions submit reachability (P1-F-46b)', () => {
});
});
+// ── Provider arms (s6) ───────────────────────────────────────────────
+//
+// The two sheets are route siblings on every provider, so a bar holding a
+// provider ref pushes the sheet inside the ref's own route (the provider
+// scope the layout publishes), never the GitHub sibling.
+
+const GITLAB_REF: ProviderPrRef = { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 };
+const BITBUCKET_REF: ProviderPrRef = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'api',
+ prId: 42,
+};
+
+describe('PrDiffFloatingActions provider routes (s6)', () => {
+ const selection: SelectionState = {
+ path: 'src/lib.ts',
+ side: 'RIGHT',
+ hunkKey: 'h1',
+ startLine: 3,
+ line: 5,
+ selectedText: 'x',
+ };
+
+ function pressButtonWith(prRef: ProviderPrRef | undefined, label: string): void {
+ routerPush.mockClear();
+ // eslint-disable-next-line new-cap
+ const element = PrDiffFloatingActions({ ...baseProps, prRef, selection });
+ const button = findElement({
+ node: element,
+ type: 'Button',
+ prop: 'accessibilityLabel',
+ value: label,
+ });
+ if (!button) {
+ throw new Error(`${label} button not found`);
+ }
+ (button.props as { onPress?: () => void }).onPress?.();
+ }
+
+ it('pushes the comment composer inside the GitLab ref route with the line params', () => {
+ pressButtonWith(GITLAB_REF, 'Comment on selected lines');
+
+ expect(routerPush).toHaveBeenCalledTimes(1);
+ expect(routerPush).toHaveBeenCalledWith(
+ '/(app)/pr-review/gitlab/group/sub/repo/12/comment-composer?path=src%2Flib.ts&side=RIGHT&line=5&startLine=3'
+ );
+ });
+
+ it.each<[ProviderPrRef, string]>([
+ [GITLAB_REF, '/(app)/pr-review/gitlab/group/sub/repo/12/review-submit'],
+ [BITBUCKET_REF, '/(app)/pr-review/bitbucket/acme/api/42/review-submit'],
+ ])('pushes the review-submit sheet inside the %s ref route', (prRef, expectedHref) => {
+ pressButtonWith(prRef, 'Finish review');
+
+ expect(routerPush).toHaveBeenCalledTimes(1);
+ expect(routerPush).toHaveBeenCalledWith(expectedHref);
+ });
+});
+
describe('PrDiffFloatingActions bottom inset (plan §6)', () => {
beforeEach(() => {
insets.bottom = 0;
@@ -249,18 +310,13 @@ describe('PrDiffFloatingActions bottom inset (plan §6)', () => {
function findRootBar(): React.ReactElement | null {
// eslint-disable-next-line new-cap
const element = PrDiffFloatingActions(baseProps);
- return findElement({
- node: element,
- type: 'View',
- prop: 'pointerEvents',
- value: 'box-none',
- });
+ return element;
}
function rootPaddingBottom(): number | undefined {
const root = findRootBar();
if (!root) {
- throw new Error('floating action bar root not found');
+ throw new Error('footer action bar root not found');
}
return (root.props as { style?: { paddingBottom?: number } }).style?.paddingBottom;
}
@@ -274,27 +330,17 @@ describe('PrDiffFloatingActions bottom inset (plan §6)', () => {
expect(rootPaddingBottom()).toBe(58);
});
- it('reports the measured layout height through onHeightChange', () => {
- const onHeightChange = vi.fn(() => undefined);
- // eslint-disable-next-line new-cap
- const element = PrDiffFloatingActions({ ...baseProps, onHeightChange });
- const root = findElement({
- node: element,
- type: 'View',
- prop: 'pointerEvents',
- value: 'box-none',
- });
+ it('renders in-flow, not as an overlay over the list', () => {
+ // Spot check e3: the bar used to sit `absolute inset-x-0 bottom-0` over
+ // the FlashList, so a partly-scrolled diff row was clipped at its top
+ // edge. As an in-flow footer the list ends above it at every scroll
+ // position.
+ const root = findRootBar();
if (!root) {
- throw new Error('floating action bar root not found');
+ throw new Error('footer action bar root not found');
}
- const onLayout = (
- root.props as {
- onLayout?: (event: { nativeEvent: { layout: { height: number } } }) => void;
- }
- ).onLayout;
- onLayout?.({ nativeEvent: { layout: { height: 150 } } });
-
- expect(onHeightChange).toHaveBeenCalledTimes(1);
- expect(onHeightChange).toHaveBeenCalledWith(150);
+ const classes = ((root.props as { className?: string }).className ?? '').split(' ');
+ expect(classes).not.toContain('absolute');
+ expect(classes).toContain('w-full');
});
});
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.tsx
index a2b47ab08c..46ff49f6b9 100644
--- a/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.tsx
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-floating-actions.tsx
@@ -1,4 +1,7 @@
-// Floating action bar rendered over the PR diff FlashList. Hosts:
+// Footer action bar rendered in-flow below the PR diff FlashList. The list
+// ends at its top edge, so a diff row is never clipped by it at any scroll
+// position (spot check e3: the bar floated over the list and cut the last
+// src/beta.ts line). Hosts:
// - The "Comment" affordance that pushes the comment-composer route
// when a diff-line selection exists, plus a "Clear" button that
// drops the selection.
@@ -13,14 +16,16 @@
import { type Href, useRouter } from 'expo-router';
import { MessageCirclePlus } from '@/components/ui/icons';
import { useTranslation } from 'react-i18next';
-import { type LayoutChangeEvent, View } from 'react-native';
+import { View } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { Button } from '@/components/ui/button';
import { Text } from '@/components/ui/text';
+import { providerPrSheetHref } from '@/components/pr-review/pr-review-provider-sheet-href';
import { clearDiffSelection } from '@/lib/pr-review/diff-selection-bridge';
import { type SelectionState } from '@/lib/pr-review/diff-selection';
import { type DiffViewMode } from '@/lib/pr-review/diff/pr-diff-list-items';
+import { type ProviderPrRef } from '@/lib/pr-review/provider-pr-ref';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
import { usePendingReview } from '@/lib/pr-review/pending-review-provider';
import { cn } from '@/lib/utils';
@@ -32,32 +37,38 @@ type PrDiffFloatingActionsProps = Readonly<{
owner: string;
repo: string;
number: number;
+ /**
+ * The provider ref when the diff renders under a GitLab / Bitbucket scope
+ * (s6). The two sheets are route siblings on every provider, so the bar
+ * pushes the sheet inside the ref's own route — pushing the GitHub sibling
+ * would leave the provider scope and write to the wrong provider.
+ */
+ prRef?: ProviderPrRef;
/** Unified (default) or side-by-side (tablet only). */
viewMode: DiffViewMode;
/** `null` when no selection exists. Drives the "Comment" affordance. */
selection: SelectionState | null;
/** Setter for the parent's selection state — `null` clears. */
onClearSelection: () => void;
- /** Optional callback for the measured root layout height (points). */
- onHeightChange?: (height: number) => void;
}>;
export function PrDiffFloatingActions({
owner,
repo,
number,
+ prRef,
viewMode,
selection,
onClearSelection,
- onHeightChange,
}: PrDiffFloatingActionsProps) {
const router = useRouter();
const colors = useThemeColors();
const { t } = useTranslation();
const pending = usePendingReview();
- // The bar sits on the bottom edge, so its bottom padding must include the
- // Android system inset. The measured height (onLayout) therefore already
- // includes the inset, which `prDiffListBottomPadding` reserves for the list.
+ // The footer sits on the bottom edge, so its bottom padding must include
+ // the Android system inset. The container is opaque (`bg-background`) and
+ // in-flow: the diff list ends at its top edge, so no row is ever clipped
+ // by it and nothing shows through around the card.
const insets = useSafeAreaInsets();
const showSelectionAction = viewMode === 'unified' && selection !== null;
@@ -70,22 +81,29 @@ export function PrDiffFloatingActions({
if (!selection) {
return;
}
+ const lineParams = {
+ path: selection.path,
+ side: selection.side,
+ line: selection.line,
+ ...(selection.startLine !== selection.line ? { startLine: selection.startLine } : {}),
+ };
+ if (prRef) {
+ router.push(providerPrSheetHref(prRef, 'comment-composer', lineParams));
+ return;
+ }
const href: Href = {
pathname: COMMENT_COMPOSER_PATH,
- params: {
- owner,
- repo,
- number,
- path: selection.path,
- side: selection.side,
- line: selection.line,
- ...(selection.startLine !== selection.line ? { startLine: selection.startLine } : {}),
- },
+ // The bracketed GitHub pathname needs the route segments as params.
+ params: { owner, repo, number, ...lineParams },
};
router.push(href);
}
function openReviewSubmit() {
+ if (prRef) {
+ router.push(providerPrSheetHref(prRef, 'review-submit'));
+ return;
+ }
const href: Href = {
pathname: REVIEW_SUBMIT_PATH,
params: { owner, repo, number },
@@ -95,11 +113,7 @@ export function PrDiffFloatingActions({
return (
{
- onHeightChange?.(event.nativeEvent.layout.height);
- }}
- pointerEvents="box-none"
- className="absolute inset-x-0 bottom-0 items-center gap-2 px-4 pt-3"
+ className="w-full items-center gap-2 bg-background px-4 pt-3"
style={{ paddingBottom: 24 + insets.bottom }}
>
@@ -129,19 +143,23 @@ export function PrDiffFloatingActions({
) : null}
+ {/* The Button row is `flex-row items-center justify-center gap-2`, so
+ the count badge is an in-flow pill AFTER the label. It used to ride
+ the label's top-right corner (`absolute -right-2.5 -top-2.5`),
+ which drew the opaque badge over the last glyphs of the label
+ (spot check e1-select-line / e1-line1-comment). In-flow the badge
+ can never cover the label, at any pending count or font scale. */}
-
- {t('prReview.floatingActions.finishReview')}
- {pending.items.length > 0 ? (
-
- {pending.items.length}
-
- ) : null}
-
+ {t('prReview.floatingActions.finishReview')}
+ {pending.items.length > 0 ? (
+
+ {pending.items.length}
+
+ ) : null}
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-hunk-rows.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-hunk-rows.tsx
index c592db7706..c11d423ca9 100644
--- a/apps/mobile/src/components/pr-review/diff/pr-diff-hunk-rows.tsx
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-hunk-rows.tsx
@@ -273,10 +273,13 @@ export function TabStateMessage({ title, message }: { title: string; message: st
export function EmptyFilesView({
changedFiles,
+ noChangesDescription,
onRequestOverview,
refreshControl,
}: {
changedFiles: number;
+ /** Provider wording for the 0-changed-files case; GitHub copy when absent. */
+ noChangesDescription?: string;
onRequestOverview?: () => void;
refreshControl?: ScrollViewProps['refreshControl'];
}) {
@@ -291,7 +294,7 @@ export function EmptyFilesView({
{changedFiles === 0
- ? t('prReview.noFilesChangedDescription')
+ ? (noChangesDescription ?? t('prReview.noFilesChangedDescription'))
: t('prReview.hunkRows.filesStillLoading')}
{onRequestOverview ? (
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-side-by-side-row.mounted.test.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-side-by-side-row.mounted.test.tsx
new file mode 100644
index 0000000000..203a827ce7
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-side-by-side-row.mounted.test.tsx
@@ -0,0 +1,86 @@
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (same pattern as diff-line.mounted.test.tsx) */
+import { createElement } from 'react';
+import TestRenderer, { act } from 'react-test-renderer';
+import { describe, expect, it, vi } from 'vitest';
+
+import '@/i18n';
+import { SideBySideRow } from './pr-diff-side-by-side-row';
+import { type ParsedDiffLine } from '@/lib/pr-review/diff/parse-patch';
+import { type SideBySideRow as SideBySideRowData } from '@/lib/pr-review/diff/side-by-side';
+
+vi.mock('react-native', () => ({
+ Text: 'RNText',
+ View: 'View',
+}));
+vi.mock('@/components/ui/text', async () => {
+ const React = await import('react');
+ return { Text: 'Text', TextClassContext: React.createContext(undefined) };
+});
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({
+ background: '#FFFFFF',
+ foreground: '#111111',
+ mutedForeground: '#777777',
+ }),
+}));
+
+function line(overrides: Partial = {}): ParsedDiffLine {
+ return {
+ type: 'context',
+ oldLine: 7,
+ newLine: 7,
+ text: 'const value = computeSomething(x);',
+ noNewlineAtEndOfFile: false,
+ ...overrides,
+ };
+}
+
+function row(overrides: Partial = {}): SideBySideRowData {
+ return { left: { line: line(overrides) }, right: { line: line(overrides) } };
+}
+
+function mountRow(data: SideBySideRowData): TestRenderer.ReactTestRenderer {
+ const ref: { current: TestRenderer.ReactTestRenderer | null } = { current: null };
+ act(() => {
+ ref.current = TestRenderer.create(
+ createElement(SideBySideRow, { row: data, language: null, rowKeyId: 'row-7' })
+ );
+ });
+ const created = ref.current;
+ if (created === null) {
+ throw new Error('the side-by-side row did not render');
+ }
+ return created;
+}
+
+describe('SideBySideRow gutter alignment', () => {
+ // Same defect class as the unified DiffLine gutter: a wrapped code line
+ // makes the column several visual lines tall, and a centered number would
+ // drift onto a later visual line instead of the column's start.
+ it('top-aligns both column gutters with the code first line', () => {
+ const renderer = mountRow(
+ row({
+ text: 'const wrappedValue = someVeryLongExpression(thatDoesNotFitOnOneLine, atPhoneWidth);',
+ })
+ );
+
+ const columns = renderer.root.findAll(
+ node =>
+ node.type === ('View' as never) &&
+ typeof node.props.className === 'string' &&
+ node.props.className.includes('flex-1 flex-row items-stretch')
+ );
+ expect(columns).toHaveLength(2);
+
+ for (const column of columns) {
+ const children = column.props.children as TestRenderer.ReactTestInstance[];
+ const gutter = children[0];
+ if (gutter === undefined) {
+ throw new Error('the column rendered without a gutter');
+ }
+ expect(gutter.props.className).toContain('justify-start');
+ expect(gutter.props.className).not.toContain('justify-center');
+ expect((gutter.props.style as { paddingTop: number }).paddingTop).toBe(2);
+ }
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-side-by-side-row.tsx b/apps/mobile/src/components/pr-review/diff/pr-diff-side-by-side-row.tsx
index 8dde148dac..31ce207518 100644
--- a/apps/mobile/src/components/pr-review/diff/pr-diff-side-by-side-row.tsx
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-side-by-side-row.tsx
@@ -90,6 +90,9 @@ function SideColumnImpl({ line, side, language, isDark, foreground }: SideColumn
const gutterStyle: ViewStyle = {
width: COLUMN_GUTTER_WIDTH,
minHeight: metrics.rowMinHeight,
+ // Top-aligned with the code's first line (see DiffLine's gutter): a
+ // centered number drifts onto a later visual line when the code wraps.
+ paddingTop: VERTICAL_PADDING,
};
const codeContainerStyle: ViewStyle = { paddingVertical: VERTICAL_PADDING };
const codeBaseStyle: TextStyle = {
@@ -114,7 +117,7 @@ function SideColumnImpl({ line, side, language, isDark, foreground }: SideColumn
style={rowStyle}
>
{/* eslint-disable-next-line react-native/no-inline-styles, react-native/no-color-literals -- dynamic theme muted color */}
diff --git a/apps/mobile/src/components/pr-review/diff/pr-diff-state-copy.ts b/apps/mobile/src/components/pr-review/diff/pr-diff-state-copy.ts
new file mode 100644
index 0000000000..740d3f2625
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/diff/pr-diff-state-copy.ts
@@ -0,0 +1,41 @@
+// Provider wording for the file list's terminal and empty states.
+//
+// GitLab calls this a merge request, and its copy must not name the Kilo
+// GitHub App or "this pull request"; GitHub and Bitbucket both say pull
+// request, so the provider term alone switches the strings and the list keeps
+// one set of states for all three providers.
+
+import { useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import { type ProviderPrTriple, useProviderPrScope } from '@/lib/pr-review/provider-pr-ref';
+
+type PrDiffStateCopy = {
+ readonly unavailableTitle: string;
+ readonly unavailableMessage: string;
+ readonly accessDeniedMessage: string;
+ /** Undefined keeps the GitHub wording inside `EmptyFilesView`. */
+ readonly noChangesDescription: string | undefined;
+};
+
+export function usePrDiffStateCopy(triple: ProviderPrTriple): PrDiffStateCopy {
+ const { t } = useTranslation();
+ const isMergeRequest = useProviderPrScope(triple).ref.platform === 'gitlab';
+ return useMemo(
+ () => ({
+ unavailableTitle: isMergeRequest
+ ? t('prReview.terms.mergeRequestUnavailable')
+ : t('prReview.pullRequestUnavailable'),
+ unavailableMessage: isMergeRequest
+ ? t('prReview.terms.unavailableDescription')
+ : t('prReview.pullRequestUnavailableDescription'),
+ accessDeniedMessage: isMergeRequest
+ ? t('prReview.terms.accessDeniedMergeRequest')
+ : t('prReview.accessDeniedDescription'),
+ noChangesDescription: isMergeRequest
+ ? t('prReview.terms.noFilesChangedDescription')
+ : undefined,
+ }),
+ [isMergeRequest, t]
+ );
+}
diff --git a/apps/mobile/src/components/pr-review/discussion/comment-row.test.tsx b/apps/mobile/src/components/pr-review/discussion/comment-row.test.tsx
index c6e6481844..5f53a7fa87 100644
--- a/apps/mobile/src/components/pr-review/discussion/comment-row.test.tsx
+++ b/apps/mobile/src/components/pr-review/discussion/comment-row.test.tsx
@@ -302,3 +302,43 @@ describe('CommentRow overflow actions', () => {
renderer.unmount();
});
});
+
+describe('CommentRow reactions capability gate (s6)', () => {
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ async function renderWithCapabilities(
+ reactionsSupported: boolean
+ ): Promise {
+ let renderer: TestRenderer.ReactTestRenderer | null = null;
+ await act(async () => {
+ await Promise.resolve();
+ renderer = TestRenderer.create(
+ createElement(CommentRow, {
+ comment: makeComment(),
+ onToggleReaction: vi.fn<() => void>(),
+ readOnly: true,
+ reactionsSupported,
+ })
+ );
+ });
+ // eslint-disable-next-line typescript-eslint/no-unnecessary-condition
+ if (!renderer) {
+ throw new Error('Failed to create test renderer');
+ }
+ return renderer;
+ }
+
+ it('supported (default): renders the reactions row', async () => {
+ const renderer = await renderWithCapabilities(true);
+ expect(renderer.root.findAll(node => (node.type as string) === 'ReactionsRow')).toHaveLength(1);
+ renderer.unmount();
+ });
+
+ it('unsupported: renders no reactions row at all — never an empty or failing one', async () => {
+ const renderer = await renderWithCapabilities(false);
+ expect(renderer.root.findAll(node => (node.type as string) === 'ReactionsRow')).toHaveLength(0);
+ renderer.unmount();
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/discussion/comment-row.tsx b/apps/mobile/src/components/pr-review/discussion/comment-row.tsx
index 18fa553fc4..fa034f1439 100644
--- a/apps/mobile/src/components/pr-review/discussion/comment-row.tsx
+++ b/apps/mobile/src/components/pr-review/discussion/comment-row.tsx
@@ -43,6 +43,13 @@ type CommentRowProps = {
readonly onToggleReaction: (content: ReviewReactionContent) => void;
readonly reactionsDisabled?: boolean;
readonly readOnly?: boolean;
+ /**
+ * The `capabilities.reactions.supported` flag (s6). False renders NO
+ * reactions row at all — the provider has no reaction affordance to
+ * offer, so the row shows nothing instead of an empty or failing one.
+ * Defaults to true, so the GitHub call sites are unchanged.
+ */
+ readonly reactionsSupported?: boolean;
/** The viewer's GitHub login, used to disable self-target moderation. */
readonly viewerLogin?: string | null;
};
@@ -96,6 +103,7 @@ export function CommentRow({
onToggleReaction,
reactionsDisabled,
readOnly,
+ reactionsSupported = true,
viewerLogin = null,
}: Readonly) {
const authorName = selectCommentAuthorName(comment.author);
@@ -257,12 +265,14 @@ export function CommentRow({
-
+ {reactionsSupported ? (
+
+ ) : null}
);
}
diff --git a/apps/mobile/src/components/pr-review/discussion/discussion-thread.provider-gate.test.tsx b/apps/mobile/src/components/pr-review/discussion/discussion-thread.provider-gate.test.tsx
new file mode 100644
index 0000000000..a408a3490f
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/discussion/discussion-thread.provider-gate.test.tsx
@@ -0,0 +1,243 @@
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to test React/RN structure under vitest */
+import { createElement } from 'react';
+import TestRenderer, { act } from 'react-test-renderer';
+import { describe, expect, it, vi } from 'vitest';
+
+import { type ReviewThread } from '@/lib/pr-review/discussion/review-discussion-types';
+import { type ProviderPrRef, ProviderPrScopeProvider } from '@/lib/pr-review/provider-pr-ref';
+
+import { DiscussionThread } from './discussion-thread';
+
+// The s6 write arm of the provider discussion surface. The reply and resolve
+// mutations route through the `providerReview` seam on a GitLab MR / Bitbucket
+// PR (the hooks pick the arm from the provider scope the layout publishes), so
+// the thread OFFERS resolve and reply on every platform whose capabilities
+// allow it — with the provider-native ids (discussion id / verbatim comment
+// id) riding on the wire. Reactions have no seam write path and no provider
+// read layer returns reaction data, so a provider comment row stays read-only:
+// the row shows nothing rather than a dead or failing affordance, and the
+// capability flag removes the reaction row entirely where the provider says
+// unsupported (Bitbucket). The read-only facts the providers DO report — the
+// Resolved badge — stay rendered.
+
+const GITLAB_REF: ProviderPrRef = { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 };
+const BITBUCKET_REF: ProviderPrRef = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'api',
+ prId: 42,
+};
+
+function makeThread(overrides: Partial = {}): ReviewThread {
+ return {
+ threadId: 'D-12',
+ isResolved: false,
+ isOutdated: false,
+ subjectType: 'LINE',
+ path: 'src/index.ts',
+ line: 10,
+ startLine: null,
+ originalLine: null,
+ originalStartLine: null,
+ diffSide: 'RIGHT',
+ diffHunk: null,
+ comments: [
+ {
+ commentId: 12,
+ nodeId: '12',
+ author: { login: 'alice', avatarUrl: null },
+ bodyMarkdown: 'hello',
+ createdAt: '2024-01-01T00:00:00Z',
+ reactions: [],
+ },
+ ],
+ ...overrides,
+ };
+}
+
+const baseProps = {
+ owner: 'group/sub',
+ repo: 'repo',
+ number: 12,
+ onToggleExpand: vi.fn<() => void>(),
+};
+
+vi.mock('react-native', () => ({
+ Pressable: 'Pressable',
+ View: 'View',
+}));
+vi.mock('expo-haptics', () => ({ selectionAsync: vi.fn() }));
+vi.mock('@/components/ui/icons', () => ({
+ Check: 'Check',
+ CheckCheck: 'CheckCheck',
+ ChevronDown: 'ChevronDown',
+ ChevronUp: 'ChevronUp',
+}));
+vi.mock('@/components/pr-review/discussion/comment-row', () => ({ CommentRow: 'CommentRow' }));
+vi.mock('@/components/pr-review/discussion/reply-input', () => ({ ReplyInput: 'ReplyInput' }));
+vi.mock('@/components/pr-review/discussion/thread-diff-snippet', () => ({
+ ThreadDiffSnippet: 'ThreadDiffSnippet',
+}));
+vi.mock('@/components/ui/text', () => ({ Text: 'Text' }));
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({ mutedForeground: '#6F6A61', good: '#22C55E' }),
+}));
+const { resolveMutate } = vi.hoisted(() => ({ resolveMutate: vi.fn<() => void>() }));
+
+vi.mock('@/lib/pr-review/discussion/use-review-discussion-mutations', () => ({
+ useAddReactionMutation: () => ({ mutate: vi.fn(), isPending: false }),
+ useRemoveReactionMutation: () => ({ mutate: vi.fn(), isPending: false }),
+ useReplyToCommentMutation: () => ({ mutate: vi.fn(), isPending: false }),
+ useResolveThreadMutation: () => ({ mutate: resolveMutate, isPending: false }),
+ useUnresolveThreadMutation: () => ({ mutate: vi.fn(), isPending: false }),
+}));
+
+function countByType(
+ root: TestRenderer.ReactTestInstance,
+ type: string,
+ match?: (props: Record) => boolean
+): number {
+ return root.findAll(
+ node =>
+ typeof node.type === 'string' &&
+ (node.type as string) === type &&
+ (match === undefined || match(node.props as Record))
+ ).length;
+}
+
+async function renderThread(
+ ref: ProviderPrRef | null,
+ expanded: boolean,
+ thread: ReviewThread
+): Promise {
+ const card = createElement(DiscussionThread, { ...baseProps, thread, expanded });
+ const tree = ref ? (
+ {card}
+ ) : (
+ card
+ );
+ let renderer: TestRenderer.ReactTestRenderer | null = null;
+ await act(async () => {
+ await Promise.resolve();
+ renderer = TestRenderer.create(tree);
+ });
+ // Runtime safety: act() could theoretically fail without assigning.
+ // eslint-disable-next-line typescript-eslint/no-unnecessary-condition
+ if (!renderer) {
+ throw new Error('Failed to create test renderer');
+ }
+ return renderer;
+}
+
+function pressableCount(root: TestRenderer.ReactTestInstance, label: string): number {
+ return countByType(
+ root,
+ 'Pressable',
+ props => props.accessibilityLabel === label || props.children === label
+ );
+}
+
+/** Press the resolve toggle (its own nested pressable in the header). */
+function pressResolve(root: TestRenderer.ReactTestInstance): void {
+ const resolveToggle = root.findAll(
+ node =>
+ typeof node.type === 'string' &&
+ (node.type as string) === 'Pressable' &&
+ (node.props as Record).accessibilityLabel === 'Resolve thread'
+ )[0];
+ if (!resolveToggle) {
+ throw new Error('Resolve toggle not found');
+ }
+ (resolveToggle.props as { onPress?: () => void }).onPress?.();
+}
+
+describe('DiscussionThread provider write arm (s6)', () => {
+ it.each<[string, ProviderPrRef]>([
+ ['gitlab', GITLAB_REF],
+ ['bitbucket', BITBUCKET_REF],
+ ])('offers resolve and reply through the seam on a %s thread', async (_platform, ref) => {
+ const renderer = await renderThread(ref, true, makeThread());
+ try {
+ // Resolve is offered and carries the provider-native thread id.
+ expect(pressableCount(renderer.root, 'Resolve thread')).toBe(1);
+ pressResolve(renderer.root);
+ expect(resolveMutate).toHaveBeenCalledWith({ threadId: 'D-12' });
+
+ // Reply is offered with the provider target (discussion id + verbatim
+ // comment id), so the seam posts it for this provider identity.
+ expect(countByType(renderer.root, 'ReplyInput')).toBe(1);
+ const replyInput = renderer.root.find(
+ node => typeof node.type === 'string' && (node.type as string) === 'ReplyInput'
+ );
+ expect(replyInput.props.provider).toEqual({
+ ref,
+ threadId: 'D-12',
+ commentNodeId: '12',
+ });
+
+ expect(countByType(renderer.root, 'CommentRow')).toBe(1);
+ } finally {
+ renderer.unmount();
+ }
+ });
+
+ it('makes thread comments read-only on a provider scope (no reaction write path)', async () => {
+ const renderer = await renderThread(GITLAB_REF, true, makeThread());
+ try {
+ const row = renderer.root.find(
+ node => typeof node.type === 'string' && (node.type as string) === 'CommentRow'
+ );
+ expect(row.props.readOnly).toBe(true);
+ // GitLab's capability says reactions are supported, so the row is
+ // gated on the flag (true) — but it is read-only and the read layer
+ // returns no reaction data, so nothing renders.
+ expect(row.props.reactionsSupported).toBe(true);
+ } finally {
+ renderer.unmount();
+ }
+ });
+
+ it('drops the reaction row entirely on a Bitbucket thread (capability unsupported)', async () => {
+ const renderer = await renderThread(BITBUCKET_REF, true, makeThread());
+ try {
+ const row = renderer.root.find(
+ node => typeof node.type === 'string' && (node.type as string) === 'CommentRow'
+ );
+ expect(row.props.reactionsSupported).toBe(false);
+ expect(row.props.readOnly).toBe(true);
+ } finally {
+ renderer.unmount();
+ }
+ });
+
+ it('keeps the resolve toggle, reply input and writable reactions on GitHub', async () => {
+ const renderer = await renderThread(null, true, makeThread());
+ try {
+ expect(pressableCount(renderer.root, 'Resolve thread')).toBe(1);
+ expect(countByType(renderer.root, 'ReplyInput')).toBe(1);
+ const replyInput = renderer.root.find(
+ node => typeof node.type === 'string' && (node.type as string) === 'ReplyInput'
+ );
+ // GitHub carries no provider target — the exact pre-s6 call shape.
+ expect(replyInput.props.provider).toBeUndefined();
+ const row = renderer.root.find(
+ node => typeof node.type === 'string' && (node.type as string) === 'CommentRow'
+ );
+ expect(row.props.readOnly).toBe(false);
+ } finally {
+ renderer.unmount();
+ }
+ });
+
+ it('keeps the read-only Resolved badge on a provider thread', async () => {
+ const renderer = await renderThread(GITLAB_REF, false, makeThread({ isResolved: true }));
+ try {
+ // Collapsed provider thread: the unresolve affordance is offered
+ // through the seam, and the read-only Resolved badge stays.
+ expect(pressableCount(renderer.root, 'Unresolve thread')).toBe(1);
+ expect(countByType(renderer.root, 'Text', props => props.children === 'Resolved')).toBe(1);
+ } finally {
+ renderer.unmount();
+ }
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/discussion/discussion-thread.tsx b/apps/mobile/src/components/pr-review/discussion/discussion-thread.tsx
index c6d172fc45..c8f24d0403 100644
--- a/apps/mobile/src/components/pr-review/discussion/discussion-thread.tsx
+++ b/apps/mobile/src/components/pr-review/discussion/discussion-thread.tsx
@@ -55,6 +55,7 @@ import {
useResolveThreadMutation,
useUnresolveThreadMutation,
} from '@/lib/pr-review/discussion/use-review-discussion-mutations';
+import { providerPrCapabilities, useProviderPrScope } from '@/lib/pr-review/provider-pr-ref';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
import { cn, parseTimestamp, timeAgo } from '@/lib/utils';
@@ -79,6 +80,19 @@ export function DiscussionThread({
onToggleExpand,
viewerLogin = null,
}: Readonly) {
+ // s6: the reply and resolve writes route through the `providerReview` seam
+ // on a GitLab MR / Bitbucket PR (the mutation hooks pick the arm from the
+ // provider scope the layout publishes), so what this card offers is decided
+ // by the capability list, not by the platform. Reactions stay behind the
+ // GitHub write path: the seam has no reaction procedure and no provider
+ // read layer returns reaction data, so a provider comment row renders
+ // read-only — the row shows nothing rather than a dead or failing
+ // affordance.
+ const scope = useProviderPrScope({ owner, repo, number });
+ const capabilities = providerPrCapabilities(scope.ref.platform);
+ const isGithub = scope.ref.platform === 'github';
+ const canReply = capabilities.canComment;
+ const canResolve = capabilities.canResolveThreads;
const resolve = useResolveThreadMutation();
const unresolve = useUnresolveThreadMutation();
const addReaction = useAddReactionMutation(thread.threadId);
@@ -131,11 +145,23 @@ export function DiscussionThread({
firstTimestamp: firstComment?.createdAt ?? null,
expanded,
onToggleResolve,
+ canResolve,
resolveDisabled: isResolving,
onToggleExpand,
} as const;
if (expanded) {
+ // The provider reply target carries the provider-native ids the seam
+ // needs: the thread's discussion/root-comment id and the first comment's
+ // verbatim provider id (kept in `nodeId` by the read layer).
+ const providerReply =
+ !isGithub && firstComment
+ ? {
+ ref: scope.ref,
+ threadId: thread.threadId,
+ commentNodeId: firstComment.nodeId,
+ }
+ : undefined;
return (
{
onToggleReaction(comment, content);
@@ -157,13 +185,14 @@ export function DiscussionThread({
))}
- {firstComment ? (
+ {firstComment && canReply ? (
) : null}
@@ -195,6 +224,8 @@ type ThreadHeaderProps = {
readonly expanded: boolean;
readonly onToggleExpand: () => void;
readonly onToggleResolve: () => void;
+ /** False on a GitLab/Bitbucket scope: the resolve control is withheld. */
+ readonly canResolve: boolean;
readonly resolveDisabled: boolean;
};
@@ -208,6 +239,7 @@ function ThreadHeader({
expanded,
onToggleExpand,
onToggleResolve,
+ canResolve,
resolveDisabled,
}: Readonly) {
const colors = useThemeColors();
@@ -237,7 +269,9 @@ function ThreadHeader({
{anchorLabel}
-
+ {canResolve ? (
+
+ ) : null}
{resolved ? (
diff --git a/apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.mounted.test.tsx b/apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.mounted.test.tsx
new file mode 100644
index 0000000000..e29a6d8fa7
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.mounted.test.tsx
@@ -0,0 +1,162 @@
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the repository's native-free mounted test tool. */
+import { createElement, Fragment, type ReactNode } from 'react';
+import TestRenderer, { act } from 'react-test-renderer';
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+
+import { type DiscussionListItem } from '@/lib/pr-review/discussion/review-discussion-types';
+import { ProviderPrScopeProvider } from '@/lib/pr-review/provider-pr-ref';
+import { PrReviewDiscussionList } from './pr-review-discussion-list';
+
+type TaggedOptions = { tag: string; input?: unknown };
+
+const observed = vi.hoisted(() => ({ options: [] as TaggedOptions[] }));
+
+// Records every query the list mounts and answers the overview with a viewer
+// login, so a test can assert BOTH which namespace was asked and what the
+// answer drives.
+vi.mock('@tanstack/react-query', () => ({
+ useQuery: (options: TaggedOptions) => {
+ observed.options.push(options);
+ if (options.tag === 'moderation') {
+ return { data: { blockedLogins: [], mutedLogins: [] } };
+ }
+ return { data: { repo: { viewerLogin: 'octocat' } } };
+ },
+}));
+vi.mock('@/lib/trpc', () => ({
+ useTRPC: () => ({
+ moderation: { listHiddenUsers: { queryOptions: () => ({ tag: 'moderation' }) } },
+ githubPrReview: {
+ getPullRequest: {
+ queryOptions: (input: unknown) => ({ tag: 'githubPrReview.getPullRequest', input }),
+ },
+ },
+ providerReview: {
+ getPullRequest: {
+ queryOptions: (input: unknown) => ({ tag: 'providerReview.getPullRequest', input }),
+ },
+ },
+ }),
+}));
+vi.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string) => key }) }));
+vi.mock('react-native', () => ({ View: 'View' }));
+vi.mock('@shopify/flash-list', () => ({
+ FlashList: ({
+ data,
+ renderItem,
+ }: {
+ data: readonly unknown[];
+ renderItem: (args: { item: unknown; index: number }) => ReactNode;
+ }) =>
+ createElement(
+ Fragment,
+ null,
+ data.map((item, index) =>
+ createElement(Fragment, { key: index }, renderItem({ item, index }))
+ )
+ ),
+}));
+vi.mock('@/components/pr-review/discussion/comment-row', () => ({ CommentRow: 'CommentRow' }));
+vi.mock('@/components/pr-review/discussion/discussion-thread', () => ({
+ DiscussionThread: 'DiscussionThread',
+}));
+vi.mock('@/components/ui/button', () => ({ Button: 'Button' }));
+vi.mock('@/components/ui/text', () => ({ Text: 'Text' }));
+vi.mock('@/lib/screen-insets', () => ({ useDetailScreenBottomPadding: () => 0 }));
+
+function noop(): void {
+ // The viewer query is what this file asserts; the list callbacks are inert.
+}
+
+const listItems: readonly DiscussionListItem[] = [
+ {
+ kind: 'comment',
+ comment: {
+ commentId: 1,
+ nodeId: 'c1',
+ author: { login: 'octocat', avatarUrl: null },
+ bodyMarkdown: 'hello',
+ createdAt: '2026-01-01T00:00:00Z',
+ reactions: [],
+ },
+ },
+];
+
+function mountList(scope?: {
+ ref: { platform: 'gitlab'; projectPath: string; mrIid: number };
+ organizationId: string | null;
+}) {
+ const list = (
+
+ );
+ const created: { current: TestRenderer.ReactTestRenderer | undefined } = { current: undefined };
+ act(() => {
+ created.current = TestRenderer.create(
+ scope ? {list} : list
+ );
+ });
+ const renderer = created.current;
+ if (!renderer) {
+ throw new Error('renderer was not created');
+ }
+ return renderer;
+}
+
+describe('PrReviewDiscussionList viewer query', () => {
+ beforeEach(() => {
+ observed.options = [];
+ });
+
+ it('reads the viewer login from the GitHub procedure on a GitHub scope', () => {
+ const renderer = mountList();
+
+ expect(observed.options.map(options => options.tag)).toEqual([
+ 'moderation',
+ 'githubPrReview.getPullRequest',
+ ]);
+ expect(observed.options[1]?.input).toEqual({ owner: 'group/sub', repo: 'repo', number: 12 });
+ expect(
+ renderer.root.findAll(node => String(node.type) === 'CommentRow')[0]?.props.viewerLogin
+ ).toBe('octocat');
+
+ act(() => {
+ renderer.unmount();
+ });
+ });
+
+ it('never fires the GitHub procedure under a GitLab scope', () => {
+ const renderer = mountList({
+ ref: { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 },
+ organizationId: null,
+ });
+
+ expect(observed.options.map(options => options.tag)).toEqual([
+ 'moderation',
+ 'providerReview.getPullRequest',
+ ]);
+ expect(observed.options[1]?.input).toMatchObject({
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ });
+
+ act(() => {
+ renderer.unmount();
+ });
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.tsx b/apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.tsx
index 88fdca7364..61e28a5d96 100644
--- a/apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.tsx
+++ b/apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.tsx
@@ -17,6 +17,7 @@ import {
type ReviewThread,
} from '@/lib/pr-review/discussion/review-discussion-types';
import { expandedForThread } from '@/lib/pr-review/discussion/thread-expansion';
+import { useProviderPrQueries } from '@/lib/pr-review/provider-pr-queries';
import { useDetailScreenBottomPadding } from '@/lib/screen-insets';
import { useTRPC } from '@/lib/trpc';
@@ -61,8 +62,14 @@ export function PrReviewDiscussionList({
const trpc = useTRPC();
// Account-local hidden users (blocked + muted GitHub logins) filter rows.
const hiddenUsers = useQuery(trpc.moderation.listHiddenUsers.queryOptions());
- // Viewer login for self-target gating on the comment overflow menu.
- const pr = useQuery(trpc.githubPrReview.getPullRequest.queryOptions({ owner, repo, number }));
+ // Viewer login for self-target gating on the comment overflow menu. The
+ // overview goes through the provider seam, not `githubPrReview` directly:
+ // this list also renders under a GitLab MR / Bitbucket PR scope, where the
+ // GitHub-shaped triple is a synthesized stand-in and a GitHub call with it
+ // would fail on every render. On GitHub the key is unchanged, so this
+ // still dedupes with the screen's own overview query.
+ const queries = useProviderPrQueries({ owner, repo, number });
+ const pr = useQuery(queries.overviewOptions());
const viewerLogin = pr.data?.repo.viewerLogin ?? null;
const hiddenLogins = useMemo(() => {
@@ -118,6 +125,9 @@ export function PrReviewDiscussionList({
diff --git a/apps/mobile/src/components/pr-review/discussion/reply-input.test.ts b/apps/mobile/src/components/pr-review/discussion/reply-input.test.ts
index 1862348e6b..6eba07309b 100644
--- a/apps/mobile/src/components/pr-review/discussion/reply-input.test.ts
+++ b/apps/mobile/src/components/pr-review/discussion/reply-input.test.ts
@@ -18,6 +18,7 @@ import type * as ReactI18next from 'react-i18next';
import { ensureTermsAcceptedOutcome, ReplyInput } from './reply-input';
import { clearDraft } from '@/lib/persist/drafts';
import { type useReplyToCommentMutation } from '@/lib/pr-review/discussion/use-review-discussion-mutations';
+import { type ProviderPrRef, providerPrRefKey } from '@/lib/pr-review/provider-pr-ref';
vi.mock('react-i18next', async importOriginal => {
const actual = await importOriginal();
@@ -111,11 +112,21 @@ vi.mock('@/lib/hooks/use-current-user-id', () => ({
// the React hook primitives are stubbed to no-op/simple versions, mirroring
// pr-merge-sheet.test.tsx. The pure `ensureTermsAcceptedOutcome` tests above
// do not touch these.
+//
+// The useState mock records every setter it hands out: the error effect
+// writes its inline copy through one of them, so a test can observe the
+// state write even though the no-op mock never re-renders.
+const stateSetters = vi.hoisted(() => [] as { mock: { calls: unknown[][] } }[]);
+
vi.mock('react', async () => {
const actual = await vi.importActual('react');
return {
...actual,
- useState: vi.fn((initial: T) => [initial, vi.fn() as () => void] as [T, (value: T) => void]),
+ useState: vi.fn((initial: T) => {
+ const setter = vi.fn();
+ stateSetters.push(setter);
+ return [initial, setter as () => void] as [T, (value: T) => void];
+ }),
useMemo: vi.fn((factory: () => T) => factory()),
useRef: vi.fn((initial: T) => {
const ref: React.RefObject = { current: initial };
@@ -418,6 +429,82 @@ describe('ReplyInput seeds the field from the settled draft during render', () =
});
});
+// ── Provider arm (s6) ────────────────────────────────────────────────
+
+const GITLAB_REF: ProviderPrRef = { platform: 'gitlab', projectPath: 'octocat/hello', mrIid: 1 };
+
+describe('ReplyInput provider arm (s6)', () => {
+ beforeEach(() => {
+ alertCalls.length = 0;
+ getTermsStatusMock.mockReset();
+ acceptTermsMock.mockReset();
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ function mountProviderReply(mutate: unknown): void {
+ // eslint-disable-next-line new-cap
+ const element = ReplyInput({
+ owner: 'octocat',
+ repo: 'hello',
+ number: 1,
+ commentId: 42,
+ reply: makeReply(mutate),
+ provider: { ref: GITLAB_REF, threadId: 'D-77', commentNodeId: '9001' },
+ });
+ const input = findElement({
+ node: element,
+ type: 'TextInput',
+ prop: 'accessibilityLabel',
+ value: 'Reply body',
+ });
+ if (!input) {
+ throw new Error('Reply body TextInput not found');
+ }
+ (input.props as { onChangeText?: (value: string) => void }).onChangeText?.('hello');
+ const button = findElement({
+ node: element,
+ type: 'Button',
+ prop: 'accessibilityLabel',
+ value: 'Submit reply',
+ });
+ if (!button) {
+ throw new Error('Submit reply Button not found');
+ }
+ (button.props as { onPress?: () => void }).onPress?.();
+ }
+
+ it('posts the seam vars (provider-native ids), never the GitHub-shaped input', async () => {
+ getTermsStatusMock.mockResolvedValue({ accepted: true, currentVersion: 'v1' });
+ const mutate = vi.fn((_input: unknown, options: { onSuccess?: () => void }) => {
+ options.onSuccess?.();
+ });
+ mountProviderReply(mutate);
+ await flush();
+
+ expect(mutate).toHaveBeenCalledWith(
+ { threadId: 'D-77', commentNodeId: '9001', body: 'hello' },
+ expect.anything()
+ );
+ });
+
+ it('folds the provider ref identity into the durable reply draft key', async () => {
+ getTermsStatusMock.mockResolvedValue({ accepted: true, currentVersion: 'v1' });
+ const mutate = vi.fn((_input: unknown, options: { onSuccess?: () => void }) => {
+ options.onSuccess?.();
+ });
+ mountProviderReply(mutate);
+ await flush();
+
+ // The mocked prReplyDraftKey answers 'pr-reply:key'; the provider arm
+ // appends the collision-free ref identity (identity rule 17) so a
+ // same-numbered GitHub PR can never share this reply's draft.
+ expect(clearDraft).toHaveBeenCalledWith('u1', `pr-reply:key@${providerPrRefKey(GITLAB_REF)}`);
+ });
+});
+
describe('ReplyInput gates input on draft settle', () => {
it('hides the input and disables submit until the draft settles', () => {
draftLoadMock.mockReturnValue({ settled: false, value: null });
@@ -467,3 +554,63 @@ describe('ReplyInput gates input on draft settle', () => {
).not.toBeNull();
});
});
+
+// ── s6f: refused-reply wording ───────────────────────────────────────
+
+/** True when the error effect wrote `value` into any state slot. */
+function stateValueWritten(value: string): boolean {
+ return stateSetters.some(setter => setter.mock.calls.some(call => call[0] === value));
+}
+
+function forbiddenError(): Error {
+ return Object.assign(new Error('403 Forbidden'), { data: { code: 'FORBIDDEN' } });
+}
+
+describe('ReplyInput refused-reply wording (s6f)', () => {
+ beforeEach(() => {
+ stateSetters.length = 0;
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ function mountWithForbiddenError(provider?: {
+ ref: ProviderPrRef;
+ threadId: string;
+ commentNodeId: string;
+ }): void {
+ const errored = {
+ mutate: vi.fn(),
+ isPending: false,
+ error: forbiddenError(),
+ } as unknown as ReplyMutation;
+ // eslint-disable-next-line new-cap
+ ReplyInput({
+ owner: 'octocat',
+ repo: 'hello',
+ number: 1,
+ commentId: 42,
+ reply: errored,
+ provider,
+ });
+ }
+
+ it('words a refused provider reply after the merge-request noun', () => {
+ mountWithForbiddenError({ ref: GITLAB_REF, threadId: 'D-77', commentNodeId: '9001' });
+ // The provider 403 must never read "pull request" on a merge request.
+ expect(stateValueWritten("You don't have permission to reply to this merge request.")).toBe(
+ true
+ );
+ expect(stateValueWritten("You don't have permission to reply to this pull request.")).toBe(
+ false
+ );
+ });
+
+ it('keeps the exact pre-s6 forbidden copy on the GitHub arm', () => {
+ mountWithForbiddenError();
+ expect(stateValueWritten("You don't have permission to reply to this pull request.")).toBe(
+ true
+ );
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/discussion/reply-input.tsx b/apps/mobile/src/components/pr-review/discussion/reply-input.tsx
index 3d6902ddee..64ac0e6b33 100644
--- a/apps/mobile/src/components/pr-review/discussion/reply-input.tsx
+++ b/apps/mobile/src/components/pr-review/discussion/reply-input.tsx
@@ -10,6 +10,7 @@ import * as WebBrowser from 'expo-web-browser';
import { UGC_AGE_POSTURE } from '@kilocode/app-shared/moderation';
import { PrReviewReconnectNotice } from '@/components/pr-review/pr-review-reconnect-notice';
+import { providerPrNounKey } from '@/components/pr-review/pr-review-provider-noun';
import { Button } from '@/components/ui/button';
import { Text } from '@/components/ui/text';
import { i18n } from '@/i18n';
@@ -22,6 +23,7 @@ import { useFencedDraftLoad } from '@/lib/persist/use-draft-load';
import { classifyPrReviewMutationError } from '@/lib/pr-review/classify-pr-review-query-state';
import { type useReplyToCommentMutation } from '@/lib/pr-review/discussion/use-review-discussion-mutations';
import { isPrOperationPersistenceFailed } from '@/lib/pr-review/merge/pr-operation-ledger';
+import { type ProviderPrRef, providerPrRefKey } from '@/lib/pr-review/provider-pr-ref';
import { trpcClient } from '@/lib/trpc';
/**
@@ -139,9 +141,32 @@ type ReplyInputProps = {
readonly number: number;
readonly commentId: number;
readonly reply: ReturnType;
+ /**
+ * The provider arm (s6). Present on a GitLab MR / Bitbucket PR thread:
+ * the reply posts `{ threadId, commentNodeId, body }` through the
+ * `providerReview` seam (GitLab answers inside the discussion, Bitbucket
+ * attaches to the root comment), and the durable draft key folds the
+ * collision-free ref identity so the same-numbered PR on another provider
+ * can never share this reply's draft (identity rule 17). Absent on GitHub,
+ * which keeps the exact pre-s6 call and key bytes.
+ */
+ readonly provider?:
+ | {
+ readonly ref: ProviderPrRef;
+ readonly threadId: string;
+ readonly commentNodeId: string;
+ }
+ | undefined;
};
-export function ReplyInput({ owner, repo, number, commentId, reply }: Readonly) {
+export function ReplyInput({
+ owner,
+ repo,
+ number,
+ commentId,
+ reply,
+ provider,
+}: Readonly) {
const colors = useThemeColors();
const { t } = useTranslation();
const bodyRef = useRef('');
@@ -151,11 +176,19 @@ export function ReplyInput({ owner, repo, number, commentId, reply }: Readonly(null);
const [resetKey, setResetKey] = useState(0);
+ // The provider platform as a stable primitive: the error effect words a
+ // refusal after it without depending on the `provider` object identity.
+ const providerPlatform = provider?.ref.platform;
// Durable reply draft, keyed by account and thread. Nothing is saved or
// restored while the user id is unknown.
const { userId, isLoading: isIdentityLoading } = useCurrentUserId();
- const replyDraftKey = prReplyDraftKey(owner, repo, number, commentId);
+ const positionReplyDraftKey = prReplyDraftKey(owner, repo, number, commentId);
+ // Provider arms fold the collision-free ref identity into the key (identity
+ // rule 17); the GitHub bytes stay exactly as stored before this slice.
+ const replyDraftKey = provider
+ ? `${positionReplyDraftKey}@${providerPrRefKey(provider.ref)}`
+ : positionReplyDraftKey;
const draft = useFencedDraftLoad({ userId, isIdentityLoading, entityKey: replyDraftKey });
useDraftFlushOnBackground(userId, replyDraftKey, true);
@@ -205,7 +238,15 @@ export function ReplyInput({ owner, repo, number, commentId, reply }: Readonly {
const body = bodyRef.current.trim();
@@ -238,7 +279,12 @@ export function ReplyInput({ owner, repo, number, commentId, reply }: Readonly {
bodyRef.current = '';
diff --git a/apps/mobile/src/components/pr-review/full-surface-states.mounted.test.tsx b/apps/mobile/src/components/pr-review/full-surface-states.mounted.test.tsx
index c783ff16c5..84a4167f54 100644
--- a/apps/mobile/src/components/pr-review/full-surface-states.mounted.test.tsx
+++ b/apps/mobile/src/components/pr-review/full-surface-states.mounted.test.tsx
@@ -24,16 +24,22 @@ vi.mock('@tanstack/react-query', async importOriginal => ({
...(await importOriginal()),
useQuery: () => query,
}));
-vi.mock('expo-router', () => ({
- useRouter: () => ({ back: vi.fn(), push: vi.fn() }),
- useLocalSearchParams: () => ({
+// Mutable so one suite can hand the composer route a malformed param set
+// without re-mocking `expo-router` per test.
+const routeParams = vi.hoisted(() => {
+ const current: Record = {
owner: 'org',
repo: 'repo',
number: '1',
path: 'src/a.ts',
line: '1',
side: 'RIGHT',
- }),
+ };
+ return { current };
+});
+vi.mock('expo-router', () => ({
+ useRouter: () => ({ back: vi.fn(), push: vi.fn(), replace: vi.fn() }),
+ useLocalSearchParams: () => routeParams.current,
}));
vi.mock('react-native', () => ({
View: 'View',
@@ -63,6 +69,9 @@ vi.mock('@/components/pr-review/diff/pr-diff-file-navigator', () => ({
vi.mock('@/components/pr-review/merge/pr-merge-section', () => ({
PrMergeSection: 'PrMergeSection',
}));
+vi.mock('@/components/pr-review/merge/pr-merge-section-provider', () => ({
+ PrMergeSectionProvider: 'PrMergeSectionProvider',
+}));
vi.mock('@/components/pr-review/pr-review-checks-section', () => ({
PrReviewChecksSection: 'PrReviewChecksSection',
}));
@@ -102,6 +111,13 @@ vi.mock('@/lib/trpc', () => ({
useTRPC: () => ({
githubPrReview: { getPullRequest: { queryOptions: () => ({}) } },
githubApps: { getUserAuthorization: { queryKey: () => [] } },
+ // s6: the submit/merge screens build the provider seam's capability and
+ // merge-state options even on the GitHub arm (the queries register
+ // disabled and never fetch), so the router mock carries the namespace.
+ providerReview: {
+ getCapabilities: { queryOptions: () => ({}) },
+ getMergeState: { queryOptions: () => ({}) },
+ },
}),
}));
@@ -110,6 +126,14 @@ beforeEach(() => {
query.isError = true;
query.isLoading = false;
query.error.data.code = 'INTERNAL_SERVER_ERROR';
+ routeParams.current = {
+ owner: 'org',
+ repo: 'repo',
+ number: '1',
+ path: 'src/a.ts',
+ line: '1',
+ side: 'RIGHT',
+ };
vi.clearAllMocks();
});
@@ -199,3 +223,22 @@ describe.each([
unmount();
});
});
+
+describe('composer malformed route', () => {
+ it('renders the terminal invalid state without the Add-comment chrome', async () => {
+ // A hand-built or restored composer link with no valid comment target
+ // failed at the ROUTE, not at the comment: the sheet must not announce
+ // "Add comment" over a "Page not found" body.
+ routeParams.current = { owner: 'org', repo: 'repo', number: '1' };
+ const { renderer, unmount } = await renderWithProviders(
+ createElement(PrReviewCommentComposerScreen)
+ );
+ expect(renderer.root.findAll(node => String(node.type) === 'InvalidRouteState')).toHaveLength(
+ 1
+ );
+ expect(renderer.root.findAll(node => String(node.type) === 'PrFormSheetHeader')).toHaveLength(
+ 0
+ );
+ unmount();
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/merge/pr-merge-section-parts.tsx b/apps/mobile/src/components/pr-review/merge/pr-merge-section-parts.tsx
index 4c6539c888..e8042acbc3 100644
--- a/apps/mobile/src/components/pr-review/merge/pr-merge-section-parts.tsx
+++ b/apps/mobile/src/components/pr-review/merge/pr-merge-section-parts.tsx
@@ -16,12 +16,40 @@ import {
type PrOverviewDto,
} from '@/lib/pr-review/merge/merge-blocked-reasons';
-export function TerminalChip({ state }: Readonly<{ state: PrOverviewDto['state'] }>) {
+// Mid-sentence lowercase noun (common.*) vs the capitalized standalone
+// label (prReview.terms.*) — see providerPrTermKey.
+// i18n-dup-ok: one copy, two senses: mid-sentence lowercase noun vs
+// capitalized standalone label; languages case-decline them apart.
+type TerminalNounKey = 'common.mergeRequest' | 'common.pullRequest';
+
+function terminalLabelKey(
+ state: PrOverviewDto['state'],
+ nounKey: TerminalNounKey
+):
+ | 'prReview.merge.terminal.alreadyMerged'
+ | 'prReview.merge.terminal.closedMergeRequest'
+ | 'prReview.merge.terminal.closed' {
+ if (state === 'merged') {
+ return 'prReview.merge.terminal.alreadyMerged';
+ }
+ return nounKey === 'common.mergeRequest'
+ ? 'prReview.merge.terminal.closedMergeRequest'
+ : 'prReview.merge.terminal.closed';
+}
+
+export function TerminalChip({
+ state,
+ nounKey = 'common.pullRequest',
+}: Readonly<{
+ state: PrOverviewDto['state'];
+ /**
+ * The provider's own noun for the closed sentence (s6): a GitLab merge
+ * request says "merge request", GitHub and Bitbucket say "pull request".
+ */
+ nounKey?: TerminalNounKey;
+}>) {
const { t } = useTranslation();
- const label =
- state === 'merged'
- ? t('prReview.merge.terminal.alreadyMerged')
- : t('prReview.merge.terminal.closed');
+ const label = t(terminalLabelKey(state, nounKey));
return (
diff --git a/apps/mobile/src/components/pr-review/merge/pr-merge-section-provider.test.tsx b/apps/mobile/src/components/pr-review/merge/pr-merge-section-provider.test.tsx
new file mode 100644
index 0000000000..2f07d94580
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/merge/pr-merge-section-provider.test.tsx
@@ -0,0 +1,166 @@
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (same pattern as comment-row.test.tsx) */
+// The provider merge section (s6): the overview's merge affordance on a
+// GitLab MR / Bitbucket PR. The merge CTA always pushes the ref's own sheet
+// route (the sheet renders the s2/s3 restrictions); the auto-merge row
+// follows the capability list — GitLab gets the enable CTA, Bitbucket gets
+// the explicit capability banner instead of a dead button or a silent
+// absence. A terminal PR renders the terminal chip and no CTAs.
+
+import * as React from 'react';
+import { createElement } from 'react';
+import TestRenderer, { act } from 'react-test-renderer';
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+
+import '@/i18n';
+
+import { PrMergeSectionProvider } from './pr-merge-section-provider';
+import { type ProviderPrRef } from '@/lib/pr-review/provider-pr-ref';
+
+const routerPush = vi.fn();
+
+vi.mock('expo-router', () => ({
+ useRouter: () => ({ push: routerPush }),
+}));
+
+vi.mock('react-native', () => ({
+ View: 'View',
+ ActivityIndicator: 'ActivityIndicator',
+}));
+
+vi.mock('@/components/ui/icons', () => ({
+ AlertTriangle: 'AlertTriangle',
+ GitBranch: 'GitBranch',
+ GitMerge: 'GitMerge',
+ GitPullRequest: 'GitPullRequest',
+ RefreshCw: 'RefreshCw',
+ ShieldAlert: 'ShieldAlert',
+ XCircle: 'XCircle',
+}));
+
+vi.mock('@/components/ui/button', () => ({ Button: 'Button' }));
+vi.mock('@/components/ui/text', () => ({ Text: 'Text' }));
+// The section parts render the UI spinner; the real one reaches the motion
+// policy (expo-battery), which stays unmocked in this pure harness.
+vi.mock('@/components/ui/activity-indicator', () => ({ ActivityIndicator: 'ActivityIndicator' }));
+
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({
+ primaryForeground: '#FFFFFF',
+ foreground: '#000000',
+ mutedForeground: '#6F6A61',
+ destructive: '#DC2626',
+ }),
+}));
+
+const GITLAB_REF: ProviderPrRef = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+};
+const BITBUCKET_REF: ProviderPrRef = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'api',
+ prId: 42,
+};
+
+async function mount(
+ prRef: ProviderPrRef,
+ state: 'open' | 'closed' | 'merged'
+): Promise {
+ let renderer: TestRenderer.ReactTestRenderer | null = null;
+ await act(async () => {
+ await Promise.resolve();
+ renderer = TestRenderer.create(createElement(PrMergeSectionProvider, { prRef, state }));
+ });
+ // eslint-disable-next-line typescript-eslint/no-unnecessary-condition -- the closure assignment cannot cross into TS's narrow
+ if (!renderer) {
+ throw new Error('renderer was not created');
+ }
+ return renderer;
+}
+
+function findButtons(renderer: TestRenderer.ReactTestRenderer, label: string): number {
+ return renderer.root.findAll(
+ node =>
+ String(node.type) === 'Button' &&
+ (node.props as Record).accessibilityLabel === label
+ ).length;
+}
+
+function findButton(renderer: TestRenderer.ReactTestRenderer, label: string) {
+ const button = renderer.root.find(
+ node =>
+ String(node.type) === 'Button' &&
+ (node.props as Record).accessibilityLabel === label
+ );
+ return (button.props as { onPress?: () => void }).onPress;
+}
+
+describe('PrMergeSectionProvider (s6)', () => {
+ beforeEach(() => {
+ routerPush.mockClear();
+ });
+
+ it('offers merge and enable-auto-merge on a GitLab merge request (capability supported)', async () => {
+ const renderer = await mount(GITLAB_REF, 'open');
+ expect(findButtons(renderer, 'Merge merge request')).toBe(1);
+ expect(findButtons(renderer, 'Enable auto-merge')).toBe(1);
+ renderer.unmount();
+ });
+
+ it('offers merge with the explicit capability banner on Bitbucket (auto-merge unsupported)', async () => {
+ const renderer = await mount(BITBUCKET_REF, 'open');
+ expect(findButtons(renderer, 'Merge pull request')).toBe(1);
+ expect(findButtons(renderer, 'Enable auto-merge')).toBe(0);
+ const banner = renderer.root.find(
+ node =>
+ typeof node.type === 'function' &&
+ (node.type as { name?: string }).name === 'PrReviewCapabilityBanner'
+ );
+ expect(
+ (banner.props as { capability: { supported: boolean; reason: string } }).capability
+ ).toEqual({
+ supported: false,
+ reason: 'Bitbucket Cloud does not expose auto-merge in its API',
+ });
+ renderer.unmount();
+ });
+
+ it('pushes the merge sheet inside the GitLab ref route on press', async () => {
+ const renderer = await mount(GITLAB_REF, 'open');
+ act(() => {
+ findButton(renderer, 'Merge merge request')?.();
+ });
+ expect(routerPush).toHaveBeenCalledWith(
+ '/(app)/pr-review/gitlab/group/sub/repo/12/merge?mode=merge'
+ );
+ renderer.unmount();
+ });
+
+ it('pushes the auto-merge arm inside the ref route on the enable CTA', async () => {
+ const renderer = await mount(GITLAB_REF, 'open');
+ act(() => {
+ findButton(renderer, 'Enable auto-merge')?.();
+ });
+ expect(routerPush).toHaveBeenCalledWith(
+ '/(app)/pr-review/gitlab/group/sub/repo/12/merge?mode=enable-auto-merge'
+ );
+ renderer.unmount();
+ });
+
+ it.each<['closed' | 'merged', string]>([
+ ['merged', 'Already merged'],
+ ['closed', 'This merge request is closed'],
+ ])(
+ 'renders only the terminal chip with provider wording on a %s GitLab merge request',
+ async (state, label) => {
+ const renderer = await mount(GITLAB_REF, state);
+ expect(renderer.root.findAll(node => String(node.type) === 'Button')).toHaveLength(0);
+ expect(
+ renderer.root.findAll(node => String(node.type) === 'Text' && node.props.children === label)
+ ).toHaveLength(1);
+ renderer.unmount();
+ }
+ );
+});
diff --git a/apps/mobile/src/components/pr-review/merge/pr-merge-section-provider.tsx b/apps/mobile/src/components/pr-review/merge/pr-merge-section-provider.tsx
new file mode 100644
index 0000000000..cdd9093068
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/merge/pr-merge-section-provider.tsx
@@ -0,0 +1,82 @@
+// The provider merge section (s6). The GitHub section derives its gate from
+// the GitHub overview DTO; a GitLab MR / Bitbucket PR normalizes `mergeable`
+// to null, so this arm offers the merge affordance directly and lets the
+// confirmation sheet — which reads `providerReview.getMergeState` — render
+// the restrictions list and refuse the submit. Auto-merge follows the
+// capability list: GitLab (supported) gets the enable CTA, Bitbucket gets
+// the explicit capability banner with the provider's reason — never a dead
+// button and never a silent absence.
+
+import { useRouter } from 'expo-router';
+import { useTranslation } from 'react-i18next';
+import { View } from 'react-native';
+
+import { PrReviewCapabilityBanner } from '@/components/pr-review/pr-review-capability-banner';
+import { TerminalChip } from '@/components/pr-review/merge/pr-merge-section-parts';
+import { providerPrNounKey } from '@/components/pr-review/pr-review-provider-noun';
+import { providerPrSheetHref } from '@/components/pr-review/pr-review-provider-sheet-href';
+import { Button } from '@/components/ui/button';
+import { GitMerge } from '@/components/ui/icons';
+import { Text } from '@/components/ui/text';
+import { useThemeColors } from '@/lib/hooks/use-theme-colors';
+import { providerPrCapabilities, type ProviderPrRef } from '@/lib/pr-review/provider-pr-ref';
+
+type PrMergeSectionProviderProps = Readonly<{
+ /** The provider ref the section pushes its sheet route under. */
+ prRef: ProviderPrRef;
+ /** The overview lifecycle state; `open` is the only mergeable one. */
+ state: 'open' | 'closed' | 'merged';
+}>;
+
+export function PrMergeSectionProvider({ prRef, state }: PrMergeSectionProviderProps) {
+ const router = useRouter();
+ const colors = useThemeColors();
+ const { t } = useTranslation();
+
+ if (state !== 'open') {
+ // Provider wording (s6): a closed GitLab merge request says "merge
+ // request"; Bitbucket keeps "pull request" — that is its own noun.
+ return ;
+ }
+
+ const autoMerge = providerPrCapabilities(prRef.platform).autoMerge;
+ const mergeLabel = t('prReview.merge.mergeTermTitle', {
+ term: t(providerPrNounKey(prRef.platform)),
+ });
+
+ return (
+
+
+ {t('prReview.merge.merge')}
+
+ {
+ router.push(providerPrSheetHref(prRef, 'merge', { mode: 'merge' }));
+ }}
+ accessibilityLabel={mergeLabel}
+ >
+
+
+ {t('prReview.merge.merge')}
+
+
+ {autoMerge.supported ? (
+ {
+ router.push(
+ providerPrSheetHref(prRef, 'merge', {
+ mode: 'enable-auto-merge',
+ })
+ );
+ }}
+ accessibilityLabel={t('prReview.merge.enableAutoMerge')}
+ >
+ {t('prReview.merge.enableAutoMerge')}
+
+ ) : (
+
+ )}
+
+ );
+}
diff --git a/apps/mobile/src/components/pr-review/merge/pr-merge-sheet-parts.test.tsx b/apps/mobile/src/components/pr-review/merge/pr-merge-sheet-parts.test.tsx
new file mode 100644
index 0000000000..e73c0272cf
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/merge/pr-merge-sheet-parts.test.tsx
@@ -0,0 +1,121 @@
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (node env, no jsdom); see src/lib/pr-review/pending-review-provider.mounted.test.tsx */
+// MergeSheetFormBody field contract (s6f): the Bitbucket merge arm passes
+// showTitle=false because the provider merge takes only the message — no
+// commit-title input may exist on that arm whose value would be silently
+// dropped on submit. The GitLab and GitHub arms keep the field.
+
+import * as React from 'react';
+import TestRenderer from 'react-test-renderer';
+import { describe, expect, it, vi } from 'vitest';
+
+import '@/i18n';
+import type * as ReactI18next from 'react-i18next';
+import { MergeSheetFormBody } from './pr-merge-sheet-parts';
+import { type AllowedMergeMethod } from '@/lib/pr-review/merge/merge-blocked-reasons';
+
+vi.mock('react-i18next', async importOriginal => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ useTranslation: () => {
+ const i18n = actual.getI18n();
+ return { t: i18n.t.bind(i18n), i18n };
+ },
+ };
+});
+
+vi.mock('react-native', () => ({
+ Pressable: 'Pressable',
+ Switch: 'Switch',
+ TextInput: 'TextInput',
+ View: 'View',
+}));
+
+vi.mock('expo-haptics', () => ({
+ selectionAsync: vi.fn(),
+}));
+
+vi.mock('@/components/pr-review/pr-form-sheet-chrome', () => ({
+ PrFormSheetFooter: 'PrFormSheetFooter',
+ useFormSheetKeyboardVisible: () => false,
+}));
+vi.mock('@/components/ui/button', () => ({ Button: 'Button' }));
+vi.mock('@/components/ui/text', () => ({ Text: 'Text' }));
+vi.mock('@/components/ui/radio-group', () => ({
+ RadioGroup: 'RadioGroup',
+ radioItemA11y: (props: unknown) => props,
+}));
+vi.mock('@/components/ui/accessible-status', () => ({ AccessibleStatus: 'AccessibleStatus' }));
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({ mutedForeground: '#000000' }),
+}));
+vi.mock('@/components/pr-review/pr-review-reconnect-notice', () => ({
+ PrReviewReconnectNotice: 'PrReviewReconnectNotice',
+}));
+
+function formBodyProps(showTitle: boolean) {
+ const titleRef = { current: 'Merge pull request #1 from Feature' };
+ const messageRef = { current: '' };
+ return {
+ noMethodsAllowed: false,
+ methodOptions: [{ value: 'merge' as AllowedMergeMethod, label: 'Merge', icon: 'merge' }],
+ method: 'merge' as AllowedMergeMethod,
+ isMutating: false,
+ onMethodChange: vi.fn(),
+ titleRef,
+ titleInputRef: { current: null },
+ titlePlaceholder: 'Merge pull request #1 from Feature',
+ showTitle,
+ messageRef,
+ messageInputRef: { current: null },
+ isHalfDetent: false,
+ showDeleteBranchToggle: false,
+ deleteBranch: false,
+ onDeleteBranchChange: vi.fn(),
+ inlineError: null,
+ inlineErrorKind: null,
+ submitLabel: 'Merge',
+ onConfirm: vi.fn(),
+ onDismiss: vi.fn(),
+ };
+}
+
+function inputByA11yLabel(
+ renderer: TestRenderer.ReactTestRenderer,
+ label: string
+): TestRenderer.ReactTestInstance | null {
+ const found = renderer.root.findAll(node => node.props.accessibilityLabel === label);
+ return found[0] ?? null;
+}
+
+describe('MergeSheetFormBody commit-title field (s6f)', () => {
+ it('renders no commit-title input when showTitle is false (Bitbucket arm)', () => {
+ let renderer: TestRenderer.ReactTestRenderer | undefined = undefined;
+ TestRenderer.act(() => {
+ renderer = TestRenderer.create();
+ });
+ // eslint-disable-next-line typescript-eslint/no-unnecessary-condition -- the guard proves it, the cast cannot
+ if (!renderer) {
+ throw new Error('Failed to mount MergeSheetFormBody');
+ }
+ expect(inputByA11yLabel(renderer, 'Commit title')).toBeNull();
+ // The message field stays: the Bitbucket merge takes the message.
+ expect(inputByA11yLabel(renderer, 'Commit message')).not.toBeNull();
+ });
+
+ it('keeps the commit-title input when showTitle is true (GitLab and GitHub arms)', () => {
+ let renderer: TestRenderer.ReactTestRenderer | undefined = undefined;
+ TestRenderer.act(() => {
+ renderer = TestRenderer.create();
+ });
+ // eslint-disable-next-line typescript-eslint/no-unnecessary-condition -- the guard proves it, the cast cannot
+ if (!renderer) {
+ throw new Error('Failed to mount MergeSheetFormBody');
+ }
+ const title = inputByA11yLabel(renderer, 'Commit title');
+ if (!title) {
+ throw new Error('Commit title input not found');
+ }
+ expect(title.props.defaultValue).toBe('Merge pull request #1 from Feature');
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/merge/pr-merge-sheet-parts.tsx b/apps/mobile/src/components/pr-review/merge/pr-merge-sheet-parts.tsx
index a578c3529e..2d4b1d7449 100644
--- a/apps/mobile/src/components/pr-review/merge/pr-merge-sheet-parts.tsx
+++ b/apps/mobile/src/components/pr-review/merge/pr-merge-sheet-parts.tsx
@@ -205,6 +205,12 @@ export function MergeSheetFormBody(props: {
titleRef: RefObject;
titleInputRef: RefObject;
titlePlaceholder: string;
+ /**
+ * False on the Bitbucket merge arm (s6f): the provider merge takes only
+ * the message, so no commit-title input exists whose value would be
+ * silently dropped on submit.
+ */
+ showTitle: boolean;
messageRef: RefObject;
messageInputRef: RefObject;
isHalfDetent: boolean;
@@ -226,6 +232,7 @@ export function MergeSheetFormBody(props: {
titleRef,
titleInputRef,
titlePlaceholder,
+ showTitle,
messageRef,
messageInputRef,
isHalfDetent,
@@ -260,12 +267,14 @@ export function MergeSheetFormBody(props: {
onChange={onMethodChange}
/>
)}
-
+ {showTitle ? (
+
+ ) : null}
({
error: null as Error | null,
}));
+// Every useState setter the mocked hook primitives hand out, in call order.
+// The error effect writes its inline copy through one of them, so a test can
+// observe the state write even though the no-op mock never re-renders.
+const stateSetters = vi.hoisted(() => [] as { mock: { calls: unknown[][] } }[]);
+
vi.mock('react', async () => {
const actual = await vi.importActual('react');
return {
...actual,
- useState: vi.fn(
- (initial: T) => [initial, vi.fn() as () => void] as [T, (value: T) => void]
- ),
+ useState: vi.fn((initial: T) => {
+ const setter = vi.fn();
+ stateSetters.push(setter);
+ return [initial, setter as () => void] as [T, (value: T) => void];
+ }),
useMemo: vi.fn((factory: () => T) => factory()),
useRef: vi.fn((initial: T) => {
const ref: React.RefObject = { current: initial };
@@ -57,14 +75,17 @@ vi.mock('react', async () => {
};
});
+const alertCalls = vi.hoisted(() => [] as { title: string; message: string }[]);
+
vi.mock('react-native', () => ({
Alert: {
alert: vi.fn(
(
- _title: string,
- _message: string,
+ title: string,
+ message: string,
buttons: readonly { style?: string; onPress?: () => void }[]
) => {
+ alertCalls.push({ title, message });
const destructive = buttons.find(b => b.style === 'destructive');
destructive?.onPress?.();
}
@@ -117,6 +138,7 @@ vi.mock('@/components/pr-review/pr-review-reconnect-notice', () => ({
}));
vi.mock('@/components/pr-review/pr-form-sheet-chrome', () => ({
PrFormSheetHeader: 'PrFormSheetHeader',
+ PrFormSheetFooter: 'PrFormSheetFooter',
}));
vi.mock('@/components/pr-review/merge/pr-merge-icons', () => ({
defaultMergeMethodOptionFor: () => 'squash',
@@ -239,7 +261,7 @@ function findElement({ node, type, prop, value }: FindElementArgs): React.ReactE
return null;
}
-function pressMerge(props: typeof baseProps) {
+function pressMerge(props: Parameters[0]) {
// eslint-disable-next-line new-cap
const element = PrMergeSheet(props);
// The submit CTA lives inside MergeSheetFormBody (mocked as a string
@@ -388,3 +410,535 @@ describe('PrMergeSheet performSubmit wiring (P0-B-08)', () => {
expect(onDismiss).toHaveBeenCalledTimes(1);
});
});
+
+// ── Provider arms (s6) ───────────────────────────────────────────────
+
+/** Find an element whose type is a real (unmocked) component — by identity. */
+function findComponent(node: unknown, component: unknown): React.ReactElement | null {
+ if (React.isValidElement(node)) {
+ if (node.type === component) {
+ return node;
+ }
+ const children = (node.props as Record).children;
+ const found = findComponent(children, component);
+ if (found) {
+ return found;
+ }
+ }
+ if (Array.isArray(node)) {
+ for (const child of node) {
+ const found = findComponent(child, component);
+ if (found) {
+ return found;
+ }
+ }
+ }
+ return null;
+}
+
+/** findComponent, but fails the test loudly when the component is absent. */
+function requireComponent(node: unknown, component: unknown): React.ReactElement {
+ const found = findComponent(node, component);
+ if (!found) {
+ throw new Error(`component ${(component as { name?: string }).name ?? '?'} not found`);
+ }
+ return found;
+}
+
+/** Every string a directly-invoked component function rendered, in order. */
+function collectTexts(node: unknown): string[] {
+ const out: string[] = [];
+ const walk = (value: unknown): void => {
+ if (typeof value === 'string') {
+ out.push(value);
+ return;
+ }
+ if (Array.isArray(value)) {
+ for (const child of value) {
+ walk(child);
+ }
+ return;
+ }
+ if (React.isValidElement(value)) {
+ walk((value.props as Record).children);
+ }
+ };
+ walk(node);
+ return out;
+}
+
+const GITLAB_REF: ProviderPrRef = { platform: 'gitlab', projectPath: 'octocat/hello', mrIid: 1 };
+const BITBUCKET_REF: ProviderPrRef = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'hello',
+ prId: 1,
+};
+
+function mergeState(overrides: Partial = {}): ProviderPrMergeState {
+ return {
+ canMerge: true,
+ approvalsRequired: 0,
+ pipelineMustSucceed: false,
+ conflicts: false,
+ blockedReasons: [],
+ ...overrides,
+ };
+}
+
+const AUTO_MERGE_SUPPORTED: ProviderReviewCapability = { supported: true, reason: '' };
+const AUTO_MERGE_UNSUPPORTED: ProviderReviewCapability = {
+ supported: false,
+ reason: 'Bitbucket Cloud does not expose auto-merge in its API',
+};
+
+describe('PrMergeSheet provider merge arm (s6)', () => {
+ beforeEach(() => {
+ alertCalls.length = 0;
+ __resetMergePartialSuccessStoreForTests();
+ mergeMutationMocks.mutateAsync.mockReset();
+ mergeMutationMocks.isPending = false;
+ mergeMutationMocks.error = null;
+ autoMergeMutationMocks.mutateAsync.mockReset();
+ autoMergeMutationMocks.isPending = false;
+ autoMergeMutationMocks.error = null;
+ vi.clearAllMocks();
+ });
+
+ it('fences the merge on the head and folds the method into squash for GitLab', () => {
+ mergeMutationMocks.mutateAsync.mockResolvedValueOnce({
+ merged: true,
+ sha: 'mergedsha',
+ branchDeleted: true,
+ });
+ pressMerge({ ...baseProps, prRef: GITLAB_REF, mergeState: mergeState() });
+
+ // The confirm dialog speaks the connected provider's noun, in sentence
+ // form: "Merge merge request?", never "Merge Merge request?".
+ expect(alertCalls[0]).toEqual({
+ title: 'Merge merge request?',
+ message: 'This will merge your changes into the base branch.',
+ });
+ expect(mergeMutationMocks.mutateAsync).toHaveBeenCalledWith({
+ expectedHeadSha: 'a'.repeat(40),
+ squash: true,
+ deleteBranch: true,
+ // The commit-title field rides the merge: GitLab takes the title the
+ // user sees (here the mocked default).
+ commitTitle: 'Merge pull request #1 from Feature',
+ });
+ });
+
+ it('keeps the GitHub arm confirm copy and full input unchanged', () => {
+ mergeMutationMocks.mutateAsync.mockResolvedValueOnce({
+ merged: true,
+ sha: 'mergedsha',
+ branchDeleted: true,
+ });
+ pressMerge(baseProps);
+
+ expect(alertCalls[0]?.title).toBe('Merge pull request?');
+ expect(mergeMutationMocks.mutateAsync).toHaveBeenCalledWith(
+ expect.objectContaining({
+ owner: 'octocat',
+ repo: 'hello',
+ number: 1,
+ method: 'squash',
+ expectedHeadSha: 'a'.repeat(40),
+ })
+ );
+ });
+
+ it('folds the provider ref identity into the durable merge draft key', async () => {
+ mergeMutationMocks.mutateAsync.mockResolvedValueOnce({
+ merged: true,
+ sha: 'mergedsha',
+ branchDeleted: true,
+ });
+ pressMerge({ ...baseProps, prRef: GITLAB_REF, mergeState: mergeState() });
+ await flushMicrotasks();
+
+ expect(clearDraft).toHaveBeenCalledWith(
+ 'u1',
+ `pr-merge:octocat/hello#1@${providerPrRefKey(GITLAB_REF)}`
+ );
+ });
+
+ it('shows the restrictions list above the form when the merge is allowed', () => {
+ // eslint-disable-next-line new-cap
+ const element = PrMergeSheet({
+ ...baseProps,
+ prRef: GITLAB_REF,
+ mergeState: mergeState({ approvalsRequired: 2, pipelineMustSucceed: true }),
+ });
+ expect(
+ findElement({
+ node: element,
+ type: 'MergeSheetFormBody',
+ prop: 'submitLabel',
+ value: 'Merge',
+ })
+ ).not.toBeNull();
+ expect(findComponent(element, MergeRestrictionsList)).not.toBeNull();
+ });
+
+ it('replaces the form with the restrictions list when the merge is blocked', () => {
+ // eslint-disable-next-line new-cap
+ const element = PrMergeSheet({
+ ...baseProps,
+ prRef: GITLAB_REF,
+ mergeState: mergeState({
+ canMerge: false,
+ blockedReasons: [{ code: 'failing_pipeline', message: 'Pipeline #123 failed' }],
+ }),
+ });
+ // Nothing to submit: the form is gone and only Cancel remains.
+ expect(
+ findElement({
+ node: element,
+ type: 'MergeSheetFormBody',
+ prop: 'submitLabel',
+ value: 'Merge',
+ })
+ ).toBeNull();
+ expect(findComponent(element, MergeRestrictionsList)).not.toBeNull();
+ expect(
+ findElement({ node: element, type: 'Button', prop: 'accessibilityLabel', value: 'Cancel' })
+ ).not.toBeNull();
+ });
+
+ it('pins the blocked-arm footer to the sheet bottom (spot check e7)', () => {
+ // eslint-disable-next-line new-cap
+ const element = PrMergeSheet({
+ ...baseProps,
+ prRef: GITLAB_REF,
+ mergeState: mergeState({
+ canMerge: false,
+ blockedReasons: [{ code: 'failing_pipeline', message: 'Pipeline #123 failed' }],
+ }),
+ });
+ // The sheet opens at the full detent; a growing spacer plus a content
+ // container that fills the viewport keep Cancel on the sheet's bottom
+ // edge instead of floating mid-sheet over an empty region.
+ const scroll = findElement({
+ node: element,
+ type: 'ScrollView',
+ prop: 'className',
+ value: 'flex-1 bg-background',
+ });
+ expect(scroll).not.toBeNull();
+ if (!scroll) {
+ return;
+ }
+ expect(
+ (scroll.props as { contentContainerStyle?: Record }).contentContainerStyle
+ ).toEqual({ flexGrow: 1, paddingBottom: 4 });
+ expect(
+ findElement({ node: scroll, type: 'View', prop: 'className', value: 'flex-1' })
+ ).not.toBeNull();
+ });
+});
+
+// ── s6f: reviewer blocking findings ──────────────────────────────────
+
+function forbiddenError(): Error {
+ return Object.assign(new Error('403 Forbidden'), { data: { code: 'FORBIDDEN' } });
+}
+
+/** True when the error effect wrote `value` into any state slot. */
+function stateValueWritten(value: string): boolean {
+ return stateSetters.some(setter => setter.mock.calls.some(call => call[0] === value));
+}
+
+describe('PrMergeSheet commit-title arm (s6f)', () => {
+ beforeEach(() => {
+ stateSetters.length = 0;
+ mergeMutationMocks.mutateAsync.mockReset();
+ mergeMutationMocks.isPending = false;
+ mergeMutationMocks.error = null;
+ vi.clearAllMocks();
+ });
+
+ function formBodyProps(props: Parameters[0]) {
+ // eslint-disable-next-line new-cap
+ const element = PrMergeSheet(props);
+ const formBody = findElement({
+ node: element,
+ type: 'MergeSheetFormBody',
+ prop: 'submitLabel',
+ value: 'Merge',
+ });
+ if (!formBody) {
+ throw new Error('MergeSheetFormBody not found in rendered tree');
+ }
+ return formBody.props as { showTitle?: boolean };
+ }
+
+ it('hides the commit-title field on the Bitbucket arm (the provider takes only the message)', () => {
+ expect(
+ formBodyProps({ ...baseProps, prRef: BITBUCKET_REF, mergeState: mergeState() }).showTitle
+ ).toBe(false);
+ });
+
+ it('keeps the commit-title field on the GitLab and GitHub arms', () => {
+ expect(
+ formBodyProps({ ...baseProps, prRef: GITLAB_REF, mergeState: mergeState() }).showTitle
+ ).toBe(true);
+ expect(formBodyProps(baseProps).showTitle).toBe(true);
+ });
+
+ it('never carries a commitTitle on the Bitbucket merge input', () => {
+ mergeMutationMocks.mutateAsync.mockResolvedValueOnce({
+ merged: true,
+ sha: 'mergedsha',
+ branchDeleted: true,
+ });
+ pressMerge({ ...baseProps, prRef: BITBUCKET_REF, mergeState: mergeState() });
+ expect(mergeMutationMocks.mutateAsync).toHaveBeenCalledWith(
+ expect.not.objectContaining({ commitTitle: expect.anything() })
+ );
+ });
+});
+
+describe('PrMergeSheet refused-merge wording (s6f)', () => {
+ beforeEach(() => {
+ stateSetters.length = 0;
+ mergeMutationMocks.mutateAsync.mockReset();
+ mergeMutationMocks.isPending = false;
+ mergeMutationMocks.error = null;
+ vi.clearAllMocks();
+ });
+
+ it('words a refused GitLab merge after the merge-request noun', () => {
+ mergeMutationMocks.error = forbiddenError();
+ // eslint-disable-next-line new-cap
+ PrMergeSheet({ ...baseProps, prRef: GITLAB_REF, mergeState: mergeState() });
+ // The provider 403 must never read "pull request" on a merge request.
+ expect(stateValueWritten("You don't have permission to merge this merge request.")).toBe(true);
+ expect(stateValueWritten("You don't have permission to merge this pull request.")).toBe(false);
+ });
+
+ it('keeps the exact pre-s6 forbidden copy on the GitHub arm', () => {
+ mergeMutationMocks.error = forbiddenError();
+ // eslint-disable-next-line new-cap
+ PrMergeSheet(baseProps);
+ expect(stateValueWritten("You don't have permission to merge this pull request.")).toBe(true);
+ });
+});
+
+describe('PrMergeSheet provider auto-merge arms (s6)', () => {
+ beforeEach(() => {
+ alertCalls.length = 0;
+ __resetMergePartialSuccessStoreForTests();
+ mergeMutationMocks.mutateAsync.mockReset();
+ autoMergeMutationMocks.mutateAsync.mockReset();
+ autoMergeMutationMocks.isPending = false;
+ autoMergeMutationMocks.error = null;
+ vi.clearAllMocks();
+ });
+
+ function autoMergeProps(ref: ProviderPrRef, capability: ProviderReviewCapability) {
+ return {
+ ...baseProps,
+ mode: 'enable-auto-merge' as const,
+ prRef: ref,
+ mergeState: mergeState({ approvalsRequired: 2 }),
+ autoMergeCapability: capability,
+ };
+ }
+
+ function pressSubmit(element: React.ReactElement): () => void {
+ const submit = findElement({
+ node: element,
+ type: 'Button',
+ prop: 'accessibilityLabel',
+ value: 'Enable auto-merge',
+ });
+ if (!submit) {
+ throw new Error('auto-merge submit button not found');
+ }
+ const onPress = (submit.props as { onPress?: () => void }).onPress;
+ // eslint-disable-next-line typescript-eslint/no-unnecessary-condition -- the guard above proves it, the cast cannot
+ if (!onPress) {
+ throw new Error('auto-merge submit has no onPress');
+ }
+ return onPress;
+ }
+
+ it('arms GitLab auto-merge through the head fence with the provider confirm copy', () => {
+ autoMergeMutationMocks.mutateAsync.mockResolvedValueOnce({ supported: true, reason: '' });
+ // eslint-disable-next-line new-cap
+ const element = PrMergeSheet(autoMergeProps(GITLAB_REF, AUTO_MERGE_SUPPORTED));
+ expect(findComponent(element, ProviderAutoMergeBody)).not.toBeNull();
+
+ pressSubmit(element)();
+ expect(alertCalls[0]?.message).toBe(
+ 'The merge request will merge automatically once its pipeline succeeds.'
+ );
+ expect(autoMergeMutationMocks.mutateAsync).toHaveBeenCalledWith({
+ expectedHeadSha: 'a'.repeat(40),
+ });
+ });
+
+ it('shows the capability banner with the provider reason for Bitbucket, with nothing to submit', () => {
+ // eslint-disable-next-line new-cap
+ const element = PrMergeSheet(autoMergeProps(BITBUCKET_REF, AUTO_MERGE_UNSUPPORTED));
+ // The banner carries the server's explicit reason; no submit CTA exists.
+ const banner = requireComponent(element, PrReviewCapabilityBanner);
+ expect((banner.props as { capability?: ProviderReviewCapability }).capability).toBe(
+ AUTO_MERGE_UNSUPPORTED
+ );
+ expect(
+ findElement({
+ node: element,
+ type: 'Button',
+ prop: 'accessibilityLabel',
+ value: 'Enable auto-merge',
+ })
+ ).toBeNull();
+ expect(autoMergeMutationMocks.mutateAsync).not.toHaveBeenCalled();
+ });
+});
+
+describe('MergeRestrictionsList (s6)', () => {
+ it('lists the policy flags in localized copy', () => {
+ // eslint-disable-next-line new-cap
+ const tree = MergeRestrictionsList({
+ mergeState: mergeState({
+ canMerge: false,
+ approvalsRequired: 2,
+ pipelineMustSucceed: true,
+ conflicts: true,
+ }),
+ term: 'merge request',
+ });
+ const texts = collectTexts(tree);
+ expect(texts).toContain('Merge restrictions');
+ expect(texts).toContain('Resolve the merge conflicts on this branch before merging.');
+ expect(texts).toContain('2 approvals required');
+ expect(texts).toContain('The pipeline must succeed before merging.');
+ });
+
+ it('localizes known provider reasons and keeps the server message for `other`', () => {
+ // eslint-disable-next-line new-cap
+ const tree = MergeRestrictionsList({
+ mergeState: mergeState({
+ canMerge: false,
+ blockedReasons: [
+ { code: 'failing_pipeline', message: 'Pipeline #123 failed' },
+ { code: 'pending_pipeline', message: 'Pipeline #124 running' },
+ { code: 'permission', message: '403 Forbidden' },
+ { code: 'other', message: 'A merge is already running' },
+ ],
+ }),
+ term: 'merge request',
+ });
+ const texts = collectTexts(tree);
+ expect(texts).toContain('The pipeline is failing on the latest commit.');
+ expect(texts).toContain('The pipeline is still running on the latest commit.');
+ expect(texts).toContain("You don't have permission to merge this merge request.");
+ // The `other` code keeps the provider's own message verbatim.
+ expect(texts).toContain('A merge is already running');
+ });
+
+ it('does not repeat a flag the reasons list already carries', () => {
+ // eslint-disable-next-line new-cap
+ const tree = MergeRestrictionsList({
+ mergeState: mergeState({
+ canMerge: false,
+ approvalsRequired: 3,
+ pipelineMustSucceed: true,
+ conflicts: true,
+ blockedReasons: [
+ { code: 'conflicts', message: 'conflicts exist' },
+ { code: 'failing_pipeline', message: 'Pipeline #123 failed' },
+ ],
+ }),
+ term: 'merge request',
+ });
+ const texts = collectTexts(tree);
+ const conflictRows = texts.filter(
+ text => text === 'Resolve the merge conflicts on this branch before merging.'
+ );
+ expect(conflictRows).toHaveLength(1);
+ // The pipeline flag row is suppressed: the failing-pipeline reason says it.
+ expect(texts).not.toContain('The pipeline must succeed before merging.');
+ expect(texts).toContain('3 approvals required');
+ });
+
+ it('maps the draft reason onto the provider noun', () => {
+ // eslint-disable-next-line new-cap
+ const tree = MergeRestrictionsList({
+ mergeState: mergeState({
+ canMerge: false,
+ blockedReasons: [{ code: 'draft', message: 'Draft status' }],
+ }),
+ term: 'merge request',
+ });
+ expect(collectTexts(tree)).toContain(
+ 'Mark the merge request as ready for review before merging.'
+ );
+ });
+
+ it('renders nothing when no restriction applies', () => {
+ // eslint-disable-next-line new-cap
+ expect(MergeRestrictionsList({ mergeState: mergeState(), term: 'merge request' })).toBeNull();
+ });
+});
+
+describe('ProviderAutoMergeBody (s6)', () => {
+ it('explains the arm in the provider noun and repeats the restrictions', () => {
+ // eslint-disable-next-line new-cap
+ const tree = ProviderAutoMergeBody({
+ mergeState: mergeState({ approvalsRequired: 2 }),
+ term: 'merge request',
+ });
+ // The restrictions render as a mounted MergeRestrictionsList child.
+ const restrictions = requireComponent(tree, MergeRestrictionsList);
+ expect(
+ (restrictions.props as { mergeState?: ProviderPrMergeState }).mergeState?.approvalsRequired
+ ).toBe(2);
+ expect(collectTexts(tree)).toContain(
+ 'GitLab merges this merge request automatically once its pipeline succeeds.'
+ );
+ });
+
+ it('renders just the explanation while the merge state has not loaded', () => {
+ // eslint-disable-next-line new-cap
+ const tree = ProviderAutoMergeBody({ mergeState: null, term: 'merge request' });
+ expect(collectTexts(tree)).toEqual([
+ 'GitLab merges this merge request automatically once its pipeline succeeds.',
+ ]);
+ });
+});
+
+function conflictError(message: string): Error {
+ return Object.assign(new Error(message), { data: { code: 'CONFLICT' } });
+}
+
+describe('staleHeadRejectionMessage (s6)', () => {
+ it('returns the provider reason for a moved head', () => {
+ const message =
+ 'The merge request changed since it was loaded. Reload the merge request and try again.';
+ expect(staleHeadRejectionMessage(conflictError(message))).toBe(message);
+ });
+
+ it('returns the reason for a target closed without merging', () => {
+ const message = 'The merge request was closed without merging.';
+ expect(staleHeadRejectionMessage(conflictError(message))).toBe(message);
+ });
+
+ it('leaves other conflicts to the generic classification', () => {
+ expect(staleHeadRejectionMessage(conflictError('A merge is already running'))).toBeNull();
+ });
+
+ it('ignores errors that are not conflicts', () => {
+ expect(
+ staleHeadRejectionMessage(
+ Object.assign(new Error('The merge request changed since it was loaded.'), {
+ data: { code: 'FORBIDDEN' },
+ })
+ )
+ ).toBeNull();
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/merge/pr-merge-sheet.tsx b/apps/mobile/src/components/pr-review/merge/pr-merge-sheet.tsx
index 2de1156233..d7b63c5ec1 100644
--- a/apps/mobile/src/components/pr-review/merge/pr-merge-sheet.tsx
+++ b/apps/mobile/src/components/pr-review/merge/pr-merge-sheet.tsx
@@ -14,19 +14,36 @@
// dismisses (cancel) or the mutation succeeds (auto-dismiss).
import * as Haptics from 'expo-haptics';
-import { Alert, Keyboard, ScrollView, type TextInput, useWindowDimensions } from 'react-native';
-import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import {
+ Alert,
+ Keyboard,
+ ScrollView,
+ type TextInput,
+ useWindowDimensions,
+ View,
+} from 'react-native';
+import { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
-import { type inferRouterInputs, type MobileRouter } from '@kilocode/trpc/mobile';
+import {
+ type ProviderPrMergeBlockedReason,
+ type ProviderPrMergeState,
+ type ProviderPrPlatform,
+ type ProviderReviewCapability,
+} from '@kilocode/app-shared/provider-review';
-import { PrFormSheetHeader } from '@/components/pr-review/pr-form-sheet-chrome';
+import { PrFormSheetFooter, PrFormSheetHeader } from '@/components/pr-review/pr-form-sheet-chrome';
+import { PrReviewCapabilityBanner } from '@/components/pr-review/pr-review-capability-banner';
+import { Button } from '@/components/ui/button';
+import { Text } from '@/components/ui/text';
import {
type AllowedMergeMethod,
type PrMergeMethod,
type PrOverviewRepoSettings,
} from '@/lib/pr-review/merge/merge-blocked-reasons';
import {
+ type EnableAutoMergeVars,
+ type MergeVars,
useEnableAutoMergeMutation,
useMergePullRequestMutation,
} from '@/lib/pr-review/merge/use-pr-merge-mutations';
@@ -41,17 +58,26 @@ import {
mergeMethodOptionsFor,
} from '@/components/pr-review/merge/pr-merge-icons';
import { MergeSheetFormBody } from '@/components/pr-review/merge/pr-merge-sheet-parts';
+import { providerPrNounKey } from '@/components/pr-review/pr-review-provider-noun';
import {
defaultCommitMessage,
defaultCommitTitle,
} from '@/lib/pr-review/merge/merge-commit-defaults';
import { useCurrentUserId } from '@/lib/hooks/use-current-user-id';
+import { formatNumber } from '@/lib/format';
+import { i18n } from '@/i18n';
+import { type ProviderPrRef, providerPrRefKey } from '@/lib/pr-review/provider-pr-ref';
+import { readTrpcErrorField } from '@/lib/trpc-error';
import { clearDraft, isMergeDraft, prMergeDraftKey, saveDraft } from '@/lib/persist/drafts';
import { useDraftFlushOnBackground } from '@/lib/persist/use-draft-flush';
import { useFencedDraftLoad } from '@/lib/persist/use-draft-load';
type PrMergeSheetMode = 'merge' | 'enable-auto-merge';
+// flexGrow makes the ScrollView's content container at least the viewport
+// tall, so a short arm's spacer can push its footer to the sheet's bottom.
+const SHEET_SCROLL_CONTENT_STYLE = { flexGrow: 1, paddingBottom: 4 };
+
type PrMergeSheetProps = Readonly<{
owner: string;
/** The GitHub repository name (the `repo` path segment, not the settings object). */
@@ -69,15 +95,67 @@ type PrMergeSheetProps = Readonly<{
mode: PrMergeSheetMode;
sheetTitle: string;
eyebrow: string;
+ /**
+ * The provider ref (s6). Present on the GitLab/Bitbucket surface: the merge
+ * posts through `providerReview.mergePullRequest` with the head fence, the
+ * method list comes from the provider (not the GitHub repo settings), and
+ * the draft key folds the ref identity. Absent on GitHub, which keeps the
+ * exact pre-s6 path.
+ */
+ prRef?: ProviderPrRef;
+ /**
+ * The provider merge gate from `providerReview.getMergeState` (s2/s3).
+ * Rendered as the restrictions list and gates the submit; null on GitHub,
+ * whose gate derives from the overview DTO in the merge section.
+ */
+ mergeState?: ProviderPrMergeState | null;
+ /**
+ * The auto-merge capability (provider arms). A `supported: false` answer
+ * (Bitbucket) renders the explicit capability banner instead of the form.
+ */
+ autoMergeCapability?: ProviderReviewCapability;
/** Called after a successful merge / auto-merge enable so the orchestrator can refetch. */
onRefetch: () => Promise;
/** Called when the user cancels or after a successful submit. */
onDismiss: () => void;
}>;
-type RouterInputs = inferRouterInputs;
-type MergePullRequestInput = RouterInputs['githubPrReview']['mergePullRequest'];
-type AutoMergeInput = RouterInputs['githubPrReview']['enableAutoMerge'];
+/**
+ * The provider's own noun in sentence form (s6). Defined in
+ * `pr-review-provider-noun.ts` (shared with the overview's provider merge
+ * arm) and re-exported here for the sheet's callers.
+ */
+export { providerPrNounKey } from '@/components/pr-review/pr-review-provider-noun';
+
+/**
+ * The explicit stale-head rejection (s6): the server refuses a merge whose
+ * head moved (or whose target closed) with CONFLICT carrying the provider's
+ * own reason. There is nothing to retry against the old head, so the sheet
+ * keeps that reason inline and stays put — no redirect, no retry affordance.
+ * Returns the reason to show, or null when the error is not a stale-head.
+ */
+export function staleHeadRejectionMessage(error: unknown): string | null {
+ if (readTrpcErrorField(error, 'code') !== 'CONFLICT') {
+ return null;
+ }
+ const message = error instanceof Error ? error.message : '';
+ return /changed since it was loaded|closed without merging/.test(message) ? message : null;
+}
+
+/**
+ * The inline copy for a refused merge (s6f): the provider arm words the
+ * refusal after the connected provider (merge request vs pull request)
+ * through the existing term-parameterized key; GitHub keeps the exact
+ * pre-s6 copy.
+ */
+function mergeForbiddenCopy(
+ platform: ProviderPrPlatform | undefined,
+ t: ReturnType['t']
+): string {
+ return platform
+ ? t('prReview.merge.providerBlocked.permission', { term: t(providerPrNounKey(platform)) })
+ : t('prReview.merge.forbidden');
+}
/**
* Wraps an uncontrolled-input ref so every `.current` write (the parts file's
@@ -98,6 +176,16 @@ function savingRef(target: { current: T }, onWrite: () => void) {
});
}
+// The short arms (blocked merge, capability banner, provider auto-merge)
+// carry a small body; the sheet still opens at the full detent, so their
+// footers are pinned to the sheet's bottom edge with a growing spacer
+// (spot check e7: Cancel sat mid-sheet over a large empty region). The
+// ScrollView's content container grows to at least the viewport, so the
+// spacer only expands when the body is shorter than the sheet.
+function bodySpacer() {
+ return ;
+}
+
export function PrMergeSheet(props: PrMergeSheetProps) {
const {
owner,
@@ -113,22 +201,45 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
mode,
sheetTitle,
eyebrow,
+ prRef,
+ mergeState,
+ autoMergeCapability,
onRefetch,
onDismiss,
} = props;
const { t } = useTranslation();
- const methodOptions = useMemo(() => mergeMethodOptionsFor(repoSettings), [repoSettings]);
+ // Provider arms derive the method list from the platform, not the GitHub
+ // repo settings: GitLab offers merge + squash, Bitbucket Cloud only the
+ // merge commit. GitHub keeps the repo-settings list unchanged.
+ const providerMethodOptions = useMemo(() => {
+ if (!prRef) {
+ return null;
+ }
+ return mergeMethodOptionsFor({
+ ...repoSettings,
+ allowMergeCommit: true,
+ allowSquashMerge: prRef.platform === 'gitlab',
+ allowRebaseMerge: false,
+ allowAutoMerge: prRef.platform === 'gitlab',
+ });
+ }, [prRef, repoSettings]);
+ const methodOptions = useMemo(
+ () => providerMethodOptions ?? mergeMethodOptionsFor(repoSettings),
+ [providerMethodOptions, repoSettings]
+ );
const safeInitial: AllowedMergeMethod = useMemo(
() =>
methodOptions.find(o => o.value === initialMethod)?.value ??
- defaultMergeMethodOptionFor(repoSettings),
- [initialMethod, methodOptions, repoSettings]
+ (providerMethodOptions
+ ? (providerMethodOptions[0]?.value ?? defaultMergeMethodOptionFor(repoSettings))
+ : defaultMergeMethodOptionFor(repoSettings)),
+ [initialMethod, methodOptions, providerMethodOptions, repoSettings]
);
const [method, setMethod] = useState(safeInitial);
- const showDeleteBranchToggle = !isCrossRepo;
+ const showDeleteBranchToggle = prRef ? true : !isCrossRepo;
const [deleteBranch, setDeleteBranch] = useState(repoSettings.deleteBranchOnMerge);
// iOS uncontrolled-input pattern: store text in a ref via onChangeText,
@@ -145,7 +256,10 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
// read while the user id is unknown. The inputs render only once the draft
// settles, seeded from the stored value or today's defaults.
const { userId, isLoading: isIdentityLoading } = useCurrentUserId();
- const mergeDraftKey = prMergeDraftKey(owner, repoName, number);
+ const positionDraftKey = prMergeDraftKey(owner, repoName, number);
+ // Provider arms fold the collision-free ref identity into the key (identity
+ // rule 17); the GitHub bytes stay exactly as stored before this slice.
+ const mergeDraftKey = prRef ? `${positionDraftKey}@${providerPrRefKey(prRef)}` : positionDraftKey;
const draft = useFencedDraftLoad<{ title: string; message: string }>({
userId,
isIdentityLoading,
@@ -190,13 +304,16 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
[owner, repoName, number]
);
- const mergeMutation = useMergePullRequestMutation(ref);
- const enableAutoMergeMutation = useEnableAutoMergeMutation(ref);
+ const mergeMutation = useMergePullRequestMutation(prRef ?? ref);
+ const enableAutoMergeMutation = useEnableAutoMergeMutation(prRef ?? ref);
const isMutating =
(mode === 'merge' && mergeMutation.isPending) ||
(mode === 'enable-auto-merge' && enableAutoMergeMutation.isPending);
const lastError = mode === 'merge' ? mergeMutation.error : enableAutoMergeMutation.error;
+ // The provider platform as a stable primitive: the error effect words a
+ // refusal after it without depending on the `prRef` object identity.
+ const providerPlatform = prRef?.platform;
useEffect(() => {
if (lastError) {
@@ -207,11 +324,20 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
setInlineErrorKind('non-retryable');
return;
}
+ // A moved head is the explicit stale-head rejection (s6): the server
+ // answers CONFLICT with the provider's own reason, there is nothing to
+ // retry against the old head, and the sheet stays put showing it.
+ const staleHead = staleHeadRejectionMessage(lastError);
+ if (staleHead !== null) {
+ setInlineError(staleHead);
+ setInlineErrorKind('non-retryable');
+ return;
+ }
const classification = classifyPrReviewMutationError(lastError);
if (classification.kind === 'bad-request' || classification.kind === 'forbidden') {
setInlineError(
classification.kind === 'forbidden'
- ? t('prReview.merge.forbidden')
+ ? mergeForbiddenCopy(providerPlatform, t)
: t('prReview.merge.cannotMerge')
);
setInlineErrorKind('non-retryable');
@@ -225,7 +351,7 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
setInlineErrorKind('retryable');
}
}
- }, [lastError, t]);
+ }, [lastError, t, providerPlatform]);
useEffect(() => {
const sub = Keyboard.addListener('keyboardDidShow', () => {
@@ -242,7 +368,29 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
setMethod(next);
}
- function buildMergeInput(): MergePullRequestInput {
+ function buildMergeInput(): MergeVars {
+ if (prRef) {
+ // The provider merge carries the head fence (the server refuses a moved
+ // head before any merge call); GitLab folds the method into `squash`
+ // and takes a commit title, Bitbucket only the message — and the form
+ // hides the title input on that arm (s6f), so no typed value is ever
+ // dropped. The term rides the fingerprint so a retried intent re-merges
+ // the same revision.
+ const commitMessage = messageRef.current.trim();
+ return {
+ expectedHeadSha: headSha,
+ ...(prRef.platform === 'gitlab'
+ ? {
+ squash: method === 'squash',
+ ...(titleRef.current.trim().length > 0
+ ? { commitTitle: titleRef.current.trim() }
+ : {}),
+ }
+ : {}),
+ deleteBranch: showDeleteBranchToggle ? deleteBranch : false,
+ ...(commitMessage.length > 0 ? { commitMessage } : {}),
+ };
+ }
return {
owner,
repo: repoName,
@@ -255,7 +403,13 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
};
}
- function buildAutoMergeInput(): AutoMergeInput {
+ function buildAutoMergeInput(): EnableAutoMergeVars {
+ if (prRef) {
+ // GitLab arms merge-when-pipeline-succeeds fenced on the head; the
+ // method rides the server-side squash handling. Bitbucket never gets
+ // here: the capability banner replaces the form.
+ return { expectedHeadSha: headSha };
+ }
const autoMethod: 'MERGE' | 'SQUASH' | 'REBASE' = (() => {
if (method === 'merge') {
return 'MERGE';
@@ -328,8 +482,16 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
void performSubmit();
};
+ // Provider arms word the nouns after the connected provider (merge
+ // request vs pull request); GitHub keeps its exact pre-s6 copy.
if (mode === 'merge') {
- Alert.alert(t('prReview.merge.confirmTitle'), t('prReview.merge.confirmMessage'), [
+ const [confirmTitle, confirmMessage] = prRef
+ ? [
+ t('prReview.merge.confirmTitleTerm', { term: t(providerPrNounKey(prRef.platform)) }),
+ t('prReview.merge.confirmMessage'),
+ ]
+ : [t('prReview.merge.confirmTitle'), t('prReview.merge.confirmMessage')];
+ Alert.alert(confirmTitle, confirmMessage, [
{ text: t('common.cancel'), style: 'cancel' },
{ text: t('prReview.merge.merge'), style: 'destructive', onPress: submit },
]);
@@ -337,7 +499,11 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
}
Alert.alert(
t('prReview.merge.enableAutoMergeConfirmTitle'),
- t('prReview.merge.enableAutoMergeConfirmMessage'),
+ prRef
+ ? t('prReview.merge.enableAutoMergeConfirmMessageTerm', {
+ term: t(providerPrNounKey(prRef.platform)),
+ })
+ : t('prReview.merge.enableAutoMergeConfirmMessage'),
[
{ text: t('common.cancel'), style: 'cancel' },
{ text: t('prReview.merge.enableAutoMerge'), style: 'destructive', onPress: submit },
@@ -347,6 +513,12 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
const submitLabel =
mode === 'merge' ? t('prReview.merge.merge') : t('prReview.merge.enableAutoMerge');
+ // Provider arms (s6): the provider's own noun for the confirm copy, and the
+ // two auto-merge shapes — GitLab arms through the seam, Bitbucket Cloud has
+ // no auto-merge API and opens onto the capability banner instead.
+ const providerTerm = prRef ? t(providerPrNounKey(prRef.platform)) : '';
+ const providerAutoMerge = Boolean(prRef) && mode === 'enable-auto-merge';
+ const autoMergeUnsupported = providerAutoMerge && autoMergeCapability?.supported === false;
// A repository can (rarely) have every merge method disabled. GitHub would
// reject any submission, so surface it explicitly and block the action
// rather than sending a method the repo does not allow.
@@ -361,14 +533,126 @@ export function PrMergeSheet(props: PrMergeSheetProps) {
onDismiss();
}
+ // The body a settled draft renders: the arm the provider state selects —
+ // the Bitbucket auto-merge capability banner, the GitLab auto-merge body,
+ // a blocked merge state's restrictions, or the form. The cancel-only
+ // arms share the ghost footer button.
+ function cancelOnlyFooter() {
+ return (
+
+
+ {t('common.cancel')}
+
+
+ );
+ }
+
+ const settledBody = ((): ReactNode => {
+ if (autoMergeUnsupported) {
+ // A Bitbucket auto-merge opens onto the capability banner: the provider
+ // has no API to arm, so there is nothing to submit or retry.
+ return (
+ <>
+
+
+
+ {bodySpacer()}
+ {cancelOnlyFooter()}
+ >
+ );
+ }
+ if (providerAutoMerge) {
+ return (
+ <>
+
+ {bodySpacer()}
+
+
+ {t('prReview.merge.enableAutoMerge')}
+
+
+ {t('common.cancel')}
+
+
+ >
+ );
+ }
+ if (mergeState && !mergeState.canMerge) {
+ // A blocked merge state replaces the form with the restrictions list
+ // (nothing to submit).
+ return (
+ <>
+
+
+
+ {bodySpacer()}
+ {cancelOnlyFooter()}
+ >
+ );
+ }
+ return (
+ <>
+ {mergeState ? (
+
+
+
+ ) : null}
+
+ >
+ );
+ })();
+
// PickerSheet invariant: [header, ScrollView]; footer is trailing content.
+ // Provider arms (s6): the s2/s3 merge state renders as the restrictions
+ // list; a blocked state replaces the form with that list (nothing to
+ // submit), and a Bitbucket auto-merge opens onto the capability banner.
return (
<>
- {draft.settled ? (
-
- ) : null}
+ {draft.settled ? settledBody : null}
>
);
}
+
+/** The localized copy for one provider blocked reason; `other` keeps the server's message. */
+function providerBlockedReasonText(
+ reason: ProviderPrMergeBlockedReason,
+ term: string,
+ t: ReturnType['t']
+): string {
+ // Literal keys, never a template: the catalog check scans the source for
+ // the keys a lookup passes on, and a computed key is invisible to it.
+ const KEY_BY_CODE = {
+ conflicts: 'prReview.merge.blocked.conflictsDetail',
+ required_approvals: 'prReview.merge.blocked.requiredReviewsDetail',
+ failing_pipeline: 'prReview.merge.providerBlocked.failingPipeline',
+ pending_pipeline: 'prReview.merge.providerBlocked.pendingPipeline',
+ draft: 'prReview.merge.providerBlocked.draft',
+ permission: 'prReview.merge.providerBlocked.permission',
+ other: null,
+ } satisfies Record;
+ const key = KEY_BY_CODE[reason.code];
+ if (key === null) {
+ return reason.message;
+ }
+ return t(key, { term });
+}
+
+/**
+ * The s2/s3 merge state as an explicit restrictions list (s6): the branch
+ * policy flags first, then the provider's concrete blocked reasons. Rows the
+ * reasons list already carries are not repeated from the flags.
+ */
+export function MergeRestrictionsList({
+ mergeState,
+ term,
+}: Readonly<{ mergeState: ProviderPrMergeState; term: string }>) {
+ const { t } = useTranslation();
+ const hasConflictReason = mergeState.blockedReasons.some(reason => reason.code === 'conflicts');
+ const hasApprovalsReason = mergeState.blockedReasons.some(
+ reason => reason.code === 'required_approvals'
+ );
+ const hasPipelineReason = mergeState.blockedReasons.some(
+ reason => reason.code === 'failing_pipeline' || reason.code === 'pending_pipeline'
+ );
+ const rows: { id: string; text: string }[] = [];
+ if (mergeState.conflicts && !hasConflictReason) {
+ rows.push({ id: 'conflicts', text: t('prReview.merge.blocked.conflictsDetail') });
+ }
+ if (mergeState.approvalsRequired > 0 && !hasApprovalsReason) {
+ rows.push({
+ id: 'approvals',
+ text: t('prReview.merge.restrictions.approvalsRequired', {
+ count: mergeState.approvalsRequired,
+ displayCount: formatNumber(mergeState.approvalsRequired, i18n.language),
+ }),
+ });
+ }
+ if (mergeState.pipelineMustSucceed && !hasPipelineReason) {
+ rows.push({
+ id: 'pipeline',
+ text: t('prReview.merge.restrictions.pipelineMustSucceed'),
+ });
+ }
+ for (const reason of mergeState.blockedReasons) {
+ rows.push({
+ id: `blocked:${reason.code}:${reason.message}`,
+ text: providerBlockedReasonText(reason, term, t),
+ });
+ }
+ if (rows.length === 0) {
+ return null;
+ }
+ return (
+
+
+ {t('prReview.merge.restrictions.title')}
+
+ {rows.map(row => (
+
+ {'• '}
+ {row.text}
+
+ ))}
+
+ );
+}
+
+/**
+ * The GitLab auto-merge body (s6): the merge state's restrictions plus one
+ * plain explanation. No form fields exist on this arm — arming rides only
+ * the head fence.
+ */
+export function ProviderAutoMergeBody({
+ mergeState,
+ term,
+}: Readonly<{ mergeState: ProviderPrMergeState | null | undefined; term: string }>) {
+ const { t } = useTranslation();
+ return (
+
+ {mergeState ? : null}
+
+ {t('prReview.merge.enableAutoMergeDescriptionTerm', { term })}
+
+
+ );
+}
diff --git a/apps/mobile/src/components/pr-review/pr-form-sheet-chrome.tsx b/apps/mobile/src/components/pr-review/pr-form-sheet-chrome.tsx
index 10138e03fa..1c222e1be5 100644
--- a/apps/mobile/src/components/pr-review/pr-form-sheet-chrome.tsx
+++ b/apps/mobile/src/components/pr-review/pr-form-sheet-chrome.tsx
@@ -49,6 +49,9 @@ export function useFormSheetKeyboardVisible(): boolean {
export function PrFormSheetHeader(props: { title: string; eyebrow: string; onBack: () => void }) {
return (
+ {/* Left-aligned heading on the back row: `centerTitle` would split the
+ header into a centered title row and a second row holding a lone
+ dismiss chevron, which read as a stray control under the title. */}
{
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ useTranslation: () => {
+ const i18n = actual.getI18n();
+ return { t: i18n.t.bind(i18n), i18n };
+ },
+ };
+});
+
+vi.mock('react-native', () => ({ View: 'View' }));
+vi.mock('@/components/ui/text', () => ({ Text: 'Text' }));
+
+const UNSUPPORTED: ProviderReviewCapability = {
+ supported: false,
+ reason: 'Bitbucket Cloud does not expose auto-merge in its API',
+};
+const SUPPORTED: ProviderReviewCapability = { supported: true, reason: '' };
+
+function renderBanner(
+ capability: ProviderReviewCapability | undefined
+): TestRenderer.ReactTestRenderer {
+ let renderer: TestRenderer.ReactTestRenderer | null = null;
+ act(() => {
+ renderer = TestRenderer.create(createElement(PrReviewCapabilityBanner, { capability }));
+ });
+ // eslint-disable-next-line typescript-eslint/no-unnecessary-condition -- the act() callback runs synchronously; this narrows the definite assignment
+ if (!renderer) {
+ throw new Error('Failed to create test renderer');
+ }
+ return renderer;
+}
+
+function textsOf(renderer: TestRenderer.ReactTestRenderer): string[] {
+ return renderer.root
+ .findAll(node => (node.type as string) === 'Text')
+ .flatMap(node => [node.props.children as string])
+ .flat()
+ .filter((child): child is string => typeof child === 'string');
+}
+
+describe('PrReviewCapabilityBanner', () => {
+ it('renders the localized title and the provider reason for a supported:false capability', () => {
+ const renderer = renderBanner(UNSUPPORTED);
+ const texts = textsOf(renderer);
+ expect(texts).toContain('Not available on this provider');
+ expect(texts).toContain(UNSUPPORTED.reason);
+ renderer.unmount();
+ });
+
+ it('announces title and reason together for accessibility', () => {
+ const renderer = renderBanner(UNSUPPORTED);
+ const view = renderer.root.find(node => (node.type as string) === 'View');
+ expect(view.props.accessibilityLabel).toBe(
+ `Not available on this provider: ${UNSUPPORTED.reason}`
+ );
+ renderer.unmount();
+ });
+
+ it('renders nothing for a supported capability — the affordance itself shows', () => {
+ const renderer = renderBanner(SUPPORTED);
+ expect(renderer.toJSON()).toBeNull();
+ renderer.unmount();
+ });
+
+ it('renders nothing while the capability is not loaded (undefined)', () => {
+ const renderer = renderBanner(undefined);
+ expect(renderer.toJSON()).toBeNull();
+ renderer.unmount();
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/pr-review-capability-banner.tsx b/apps/mobile/src/components/pr-review/pr-review-capability-banner.tsx
new file mode 100644
index 0000000000..1dcda5690c
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/pr-review-capability-banner.tsx
@@ -0,0 +1,37 @@
+// The explicit capability explanation (s6). A provider that cannot do
+// something answers `{ supported: false, reason }`; this banner renders that
+// answer as a visible, localized explanation — never a silent absence and
+// never a generic failure. Any review surface holding a capability object
+// (the merge sheet's Bitbucket auto-merge arm today, the discussion
+// limitations after it) renders it through here so the wording stays one.
+
+import { useTranslation } from 'react-i18next';
+import { View } from 'react-native';
+
+import { type ProviderReviewCapability } from '@kilocode/app-shared/provider-review';
+
+import { Text } from '@/components/ui/text';
+
+export function PrReviewCapabilityBanner({
+ capability,
+}: Readonly<{ capability: ProviderReviewCapability | undefined }>) {
+ const { t } = useTranslation();
+ // A supported (or not-yet-loaded) capability has nothing to explain: the
+ // surface renders the affordance itself, so the banner draws nothing.
+ if (capability === undefined || capability.supported) {
+ return null;
+ }
+ return (
+
+
+ {t('prReview.capabilities.banner.title')}
+
+ {capability.reason}
+
+ );
+}
diff --git a/apps/mobile/src/components/pr-review/pr-review-checks-section.mounted.test.tsx b/apps/mobile/src/components/pr-review/pr-review-checks-section.mounted.test.tsx
index 3c2fac4fdb..cae7521cd3 100644
--- a/apps/mobile/src/components/pr-review/pr-review-checks-section.mounted.test.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-checks-section.mounted.test.tsx
@@ -1,9 +1,14 @@
/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the repository's native-free mounted test tool. */
+// eslint-disable-next-line import/no-nodejs-modules -- vitest-only theme-token guard, runs in node, never bundled into the app
+import { readFileSync } from 'node:fs';
+
import { createElement } from 'react';
import TestRenderer, { act } from 'react-test-renderer';
-import { describe, expect, it, vi } from 'vitest';
+import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { SpinningIcon } from '@/components/ui/spinning-icon';
+import { ProviderPrScopeProvider } from '@/lib/pr-review/provider-pr-ref';
+import { openExternalUrl } from '@/lib/external-link';
import { PrReviewChecksSection } from './pr-review-checks-section';
const query = vi.hoisted(() => ({
@@ -60,6 +65,7 @@ vi.mock('@/components/ui/icons', () => ({
XCircle: 'XCircle',
}));
vi.mock('@/components/ui/spinning-icon', () => ({ SpinningIcon: 'SpinningIcon' }));
+vi.mock('@/components/ui/skeleton', () => ({ Skeleton: 'Skeleton' }));
vi.mock('@/components/ui/text', () => ({ Text: 'Text' }));
vi.mock('@/components/pr-review/pr-review-reconnect-notice', () => ({
PrReviewReconnectNotice: 'PrReviewReconnectNotice',
@@ -83,7 +89,10 @@ vi.mock('@/lib/pr-review/classify-pr-review-query-state', () => ({
classifyPrReviewQueryState: () => ({ kind: 'retryable' }),
}));
vi.mock('@/lib/trpc', () => ({
- useTRPC: () => ({ githubPrReview: { listChecks: { queryOptions: () => ({}) } } }),
+ useTRPC: () => ({
+ githubPrReview: { listChecks: { queryOptions: () => ({}) } },
+ providerReview: { listChecks: { queryOptions: () => ({}) } },
+ }),
}));
describe('PrReviewChecksSection check status icons', () => {
@@ -123,3 +132,211 @@ describe('PrReviewChecksSection check status icons', () => {
});
});
});
+
+describe('PrReviewChecksSection view-on-provider link', () => {
+ const gitlabScope = {
+ ref: {
+ platform: 'gitlab' as const,
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ instanceHint: 'https://gitlab.example.com',
+ },
+ organizationId: null,
+ };
+
+ function mountSection(scope?: { ref: typeof gitlabScope.ref; organizationId: string | null }) {
+ const previousData = query.data;
+ query.data = {
+ checkRuns: [],
+ rollup: { total: 0, success: 0, failure: 0, pending: 0, skipped: 0 },
+ };
+ const section = (
+
+ );
+ const renderer: { current: TestRenderer.ReactTestRenderer | undefined } = {
+ current: undefined,
+ };
+ act(() => {
+ renderer.current = TestRenderer.create(
+ scope ? {section} : section
+ );
+ });
+ const created = renderer.current;
+ if (!created) {
+ throw new Error('renderer was not created');
+ }
+ return {
+ renderer: created,
+ restore: () => {
+ query.data = previousData;
+ },
+ };
+ }
+
+ beforeEach(() => {
+ vi.mocked(openExternalUrl).mockClear();
+ });
+
+ function pressViewButton(renderer: TestRenderer.ReactTestRenderer) {
+ const button = renderer.root.findAllByType('Button' as never)[0];
+ if (!button) {
+ throw new Error('the view-on-provider button did not render');
+ }
+ act(() => {
+ (button.props.onPress as () => void)();
+ });
+ }
+
+ it('labels the opened link "pull request" on the GitHub arm', () => {
+ const { renderer, restore } = mountSection();
+ pressViewButton(renderer);
+
+ expect(openExternalUrl).toHaveBeenCalledWith('https://github.com/group/sub/repo/pull/12', {
+ label: 'prReview.terms.pullRequest',
+ });
+ act(() => {
+ renderer.unmount();
+ });
+ restore();
+ });
+
+ it('labels the same link "merge request" on a GitLab scope', () => {
+ const { renderer, restore } = mountSection(gitlabScope);
+ pressViewButton(renderer);
+
+ expect(openExternalUrl).toHaveBeenCalledWith(
+ 'https://gitlab.example.com/group/sub/repo/-/merge_requests/12',
+ { label: 'prReview.terms.mergeRequest' }
+ );
+ act(() => {
+ renderer.unmount();
+ });
+ restore();
+ });
+});
+
+// Spot check e1-nav-mr.png: the CHECKS section rendered as an empty gray
+// block — no loading indicator, no empty copy, no error copy. The screen
+// was in the loading state, and the state was invisible: the skeleton bars
+// carried `bg-muted` inside a `bg-secondary` card, and `--muted` equals
+// `--secondary` in BOTH themes (apps/mobile/src/global.css), so the bars
+// painted the card's own colour. This test pins the fixed render path: the
+// card holds three shared Skeleton bars in `bg-muted-soft` — the one gray
+// that differs from the card in both themes — and no bar keeps the
+// collision token. The CSS guard below proves the collision is real
+// (`--muted` == `--secondary`) and that the token the bars now use is not
+// the collision token, so a future theme change that reintroduces the
+// collision fails here instead of shipping another empty gray block.
+describe('PrReviewChecksSection loading state is visible on the card', () => {
+ const previous = { isLoading: false, data: query.data };
+
+ beforeEach(() => {
+ query.isLoading = true;
+ });
+
+ afterEach(() => {
+ query.isLoading = previous.isLoading;
+ query.data = previous.data;
+ });
+
+ function mountLoading() {
+ const renderer: { current: TestRenderer.ReactTestRenderer | undefined } = {
+ current: undefined,
+ };
+ act(() => {
+ renderer.current = TestRenderer.create(
+ createElement(PrReviewChecksSection, {
+ owner: 'group/sub',
+ repo: 'repo',
+ number: 12,
+ headSha: 'head',
+ })
+ );
+ });
+ const created = renderer.current;
+ if (!created) {
+ throw new Error('renderer was not created');
+ }
+ return created;
+ }
+
+ function findCard(renderer: TestRenderer.ReactTestRenderer) {
+ const cards = renderer.root.findAll(
+ node =>
+ String(node.type) === 'View' &&
+ typeof node.props.className === 'string' &&
+ node.props.className.split(/\s+/).includes('bg-secondary')
+ );
+ expect(cards).toHaveLength(1);
+ const card = cards[0];
+ if (!card) {
+ throw new Error('the checks card did not render');
+ }
+ return card;
+ }
+
+ it('paints three animated skeleton bars in a colour distinct from the card', () => {
+ const renderer = mountLoading();
+ const card = findCard(renderer);
+
+ // The shared Skeleton component — the app's loading indicator (pulse +
+ // shimmer), not a static block.
+ const bars = card.findAll(node => String(node.type) === 'Skeleton');
+ expect(bars).toHaveLength(3);
+ for (const bar of bars) {
+ const className = String(bar.props.className ?? '');
+ expect(className.split(/\s+/)).toContain('bg-muted-soft');
+ }
+
+ // The defect itself: no node in the card may keep the bare `bg-muted`
+ // token — on this card it is the card's own colour, i.e. invisible.
+ const invisible = card.findAll(
+ node =>
+ typeof node.props.className === 'string' &&
+ /(^|\s)bg-muted(\s|$)/.test(node.props.className)
+ );
+ expect(invisible).toHaveLength(0);
+
+ // The state is announced, not only shown.
+ expect(card.props.accessibilityRole).toBe('progressbar');
+ expect(card.props.accessibilityLabel).toBe('common.loading');
+
+ act(() => {
+ renderer.unmount();
+ });
+ });
+
+ it('keeps the CHECKS heading rendered while loading, so the block is labelled', () => {
+ const renderer = mountLoading();
+ const headings = renderer.root.findAll(
+ node => String(node.type) === 'Text' && node.props.children === 'prReview.checks.title'
+ );
+ expect(headings).toHaveLength(1);
+ act(() => {
+ renderer.unmount();
+ });
+ });
+
+ it('guards the theme tokens: bg-muted collides with the card, bg-muted-soft does not', () => {
+ const css = readFileSync(new URL('../../global.css', import.meta.url), 'utf8');
+ const values = (name: string) =>
+ [...css.matchAll(new RegExp(`--${name}:\\s*([^;]+);`, 'g'))].map(match =>
+ (match[1] ?? '').trim().toLowerCase()
+ );
+ const secondary = values('secondary');
+ const muted = values('muted');
+ const mutedSoft = values('muted-soft');
+
+ // Both theme blocks are present.
+ expect(secondary.length).toBeGreaterThanOrEqual(2);
+ expect(muted).toHaveLength(secondary.length);
+ expect(mutedSoft).toHaveLength(secondary.length);
+ // The collision that made the old skeleton invisible, pinned so the
+ // test above stays meaningful.
+ expect(muted).toEqual(secondary);
+ // The fix token must contrast with the card in every theme.
+ for (const [index, soft] of mutedSoft.entries()) {
+ expect(soft).not.toBe(secondary[index]);
+ }
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/pr-review-checks-section.test.tsx b/apps/mobile/src/components/pr-review/pr-review-checks-section.test.tsx
index 810930ca99..7e3377f252 100644
--- a/apps/mobile/src/components/pr-review/pr-review-checks-section.test.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-checks-section.test.tsx
@@ -61,6 +61,9 @@ vi.mock('@/components/ui/icons', () => ({
}));
vi.mock('@/components/ui/spinning-icon', () => ({ SpinningIcon: 'SpinningIcon' }));
vi.mock('@/components/ui/text', () => ({ Text: 'Text' }));
+// The section's loading card renders the UI skeleton; the real one reaches
+// expo-linear-gradient and the reanimated worklets, which stay unmocked here.
+vi.mock('@/components/ui/skeleton', () => ({ Skeleton: 'Skeleton' }));
vi.mock('@/i18n', () => ({ i18n: { language: 'en', t: (key: string) => key } }));
vi.mock('@/lib/external-link', () => ({ openExternalUrl: vi.fn() }));
vi.mock('@/lib/format', () => ({
diff --git a/apps/mobile/src/components/pr-review/pr-review-checks-section.tsx b/apps/mobile/src/components/pr-review/pr-review-checks-section.tsx
index 7b3f5bce5f..9c0b1ef608 100644
--- a/apps/mobile/src/components/pr-review/pr-review-checks-section.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-checks-section.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable max-lines -- the section owns every CHECKS state in one file: the card shell, the tone/rollup helpers and the rows share one surface, and splitting the visible-loading fix away from the states it must match scatters it across callers. */
import { useQuery } from '@tanstack/react-query';
import { type inferRouterOutputs, type MobileRouter } from '@kilocode/trpc/mobile';
import {
@@ -9,19 +10,21 @@ import {
MinusCircle,
XCircle,
} from '@/components/ui/icons';
-import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { Pressable, View } from 'react-native';
import { PrReviewReconnectNotice } from '@/components/pr-review/pr-review-reconnect-notice';
import { Button } from '@/components/ui/button';
+import { Skeleton } from '@/components/ui/skeleton';
import { SpinningIcon } from '@/components/ui/spinning-icon';
import { Text } from '@/components/ui/text';
import { i18n } from '@/i18n';
+import { reviewerPlatformLabel } from '@/lib/code-reviewer-config';
import { formatList, formatNumber } from '@/lib/format';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
import { classifyPrReviewQueryState } from '@/lib/pr-review/classify-pr-review-query-state';
-import { useTRPC } from '@/lib/trpc';
+import { useProviderPrQueries } from '@/lib/pr-review/provider-pr-queries';
+import { providerPrTermKey, providerPrWebUrl } from '@/lib/pr-review/provider-pr-ref';
import { cn } from '@/lib/utils';
import { openExternalUrl } from '@/lib/external-link';
@@ -175,30 +178,36 @@ export function PrReviewChecksSection({
number,
headSha,
}: PrReviewChecksSectionProps) {
- const trpc = useTRPC();
+ const queries = useProviderPrQueries({ owner, repo, number });
const colors = useThemeColors();
const { t } = useTranslation();
- const prUrl = useMemo(
- () => `https://github.com/${owner}/${repo}/pull/${number}`,
- [owner, repo, number]
- );
+ // Null on a GitLab ref with no instance hint: no host, so no link out.
+ const prUrl = providerPrWebUrl(queries.ref);
- const checks = useQuery(
- trpc.githubPrReview.listChecks.queryOptions({ owner, repo, ref: headSha })
- );
+ const checks = useQuery(queries.checksOptions(headSha));
// Loading (first time, no cached data): show three skeleton rows in a
// card so the section matches the final dimensions once the data lands.
+ // The bars must NOT be `bg-muted` here: `--muted` and `--secondary` are
+ // the same colour in both themes (apps/mobile/src/global.css), so a
+ // `bg-muted` bar inside this `bg-secondary` card paints nothing and the
+ // section reads as an empty gray block (spot check e1-nav-mr). The shared
+ // Skeleton gives the pulse + shimmer, and `bg-muted-soft` is the one gray
+ // that contrasts with the card in both themes.
if (checks.isLoading) {
return (
{t('prReview.checks.title')}
-
-
-
-
+
+
+
+
);
@@ -269,6 +278,11 @@ export function PrReviewChecksSection({
);
}
+ const viewOnProviderLabel =
+ queries.platform === 'github'
+ ? t('prReview.checks.viewOnGitHub')
+ : t('prReview.terms.viewOnProvider', { provider: reviewerPlatformLabel(queries.platform) });
+
const data = checks.data;
const runList = data?.checkRuns ?? [];
const rollup = data?.rollup ?? { total: 0, success: 0, failure: 0, pending: 0, skipped: 0 };
@@ -282,18 +296,20 @@ export function PrReviewChecksSection({
{rollupLine}
- {
- void openExternalUrl(prUrl, { label: t('common.pullRequest') });
- }}
- accessibilityLabel={t('prReview.checks.viewOnGitHub')}
- >
-
-
- {t('prReview.checks.viewOnGitHub')}
-
-
+ {prUrl ? (
+ {
+ void openExternalUrl(prUrl, { label: t(providerPrTermKey(queries.platform)) });
+ }}
+ accessibilityLabel={viewOnProviderLabel}
+ >
+
+
+ {viewOnProviderLabel}
+
+
+ ) : null}
);
diff --git a/apps/mobile/src/components/pr-review/pr-review-comment-composer-screen.tsx b/apps/mobile/src/components/pr-review/pr-review-comment-composer-screen.tsx
index 26541d6c69..9848fb2468 100644
--- a/apps/mobile/src/components/pr-review/pr-review-comment-composer-screen.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-comment-composer-screen.tsx
@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query';
import { useLocalSearchParams, useRouter } from 'expo-router';
-import { type ReactNode, useEffect, useRef } from 'react';
+import { type ReactNode, useEffect, useMemo, useRef } from 'react';
import { useTranslation } from 'react-i18next';
import { Alert } from 'react-native';
import { ActivityIndicator } from '@/components/ui/activity-indicator';
@@ -14,6 +14,14 @@ import { InvalidRouteState } from '@/components/invalid-route-state';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
import { parseComposerParams } from '@/lib/pr-review/comment-composer-params';
import { usePendingReview } from '@/lib/pr-review/pending-review-provider';
+import { buildPrOverviewQueryOptions } from '@/lib/pr-review/provider-pr-queries';
+import {
+ isProviderScopeReady,
+ parseProviderPrRoute,
+ providerPrRefLabel,
+ providerPrTriple,
+ useProviderPrScope,
+} from '@/lib/pr-review/provider-pr-ref';
import { useTRPC } from '@/lib/trpc';
type Params = {
@@ -25,30 +33,76 @@ type Params = {
line: string;
startLine?: string;
pendingId?: string;
+ // Provider route shape (`[platform]/[...identity]/comment-composer`).
+ platform?: string;
+ identity?: string[] | string;
+ instance?: string;
};
+/**
+ * Comment-composer formSheet, mounted by BOTH routes: the GitHub
+ * `[owner]/[repo]/[number]/comment-composer` route and the provider
+ * `[platform]/[...identity]/comment-composer` route (s6). The route decides
+ * the ref; the provider layout publishes the scope the queries run under.
+ */
export function PrReviewCommentComposerScreen() {
const router = useRouter();
const colors = useThemeColors();
const { t } = useTranslation();
const params = useLocalSearchParams();
- const parsed = parseComposerParams(params);
const pending = usePendingReview();
+ // The provider route carries the identity segments; the GitHub route the
+ // plain triple. Exactly one parses — the provider layout redirects a
+ // hand-built `/pr-review/github/...` link to the GitHub route.
+ const providerRef = useMemo(
+ () =>
+ parseProviderPrRoute({
+ platform: params.platform,
+ identity: params.identity,
+ instance: params.instance,
+ }),
+ [params.platform, params.identity, params.instance]
+ );
+ const providerTriple = providerRef ? providerPrTriple(providerRef) : null;
+ const parsed = useMemo(
+ () =>
+ parseComposerParams(
+ providerTriple
+ ? {
+ ...params,
+ owner: providerTriple.owner,
+ repo: providerTriple.repo,
+ number: String(providerTriple.number),
+ }
+ : params
+ ),
+ // `providerTriple` is derived from `providerRef`; the segments it reads
+ // are the same memo inputs.
+ [params, providerTriple]
+ );
+
const pendingId = parsed?.pendingId;
const isEdit = pendingId !== undefined;
const pendingItem = isEdit ? pending.items.find(item => item.id === pendingId) : undefined;
const title = isEdit ? t('prReview.composer.editTitle') : t('prReview.composer.addTitle');
- const eyebrow = parsed ? `${parsed.owner}/${parsed.repo}#${parsed.number}` : '';
+ const githubEyebrow = parsed ? `${parsed.owner}/${parsed.repo}#${parsed.number}` : '';
+ const eyebrow = providerRef ? providerPrRefLabel(providerRef) : githubEyebrow;
+
+ // The scope the overview runs under: the layout publishes the provider
+ // scope in context; the GitHub route falls back to the parsed triple, so
+ // the GitHub query key is byte-identical to the pre-s6 one.
+ const scope = useProviderPrScope(parsed ?? { owner: '', repo: '', number: 0 });
// Edit mode is local-only: do not fire getPullRequest and do not gate on it.
+ // The readiness gate rides the same predicate the provider reads use, so a
+ // Bitbucket scope without its organization waits instead of querying.
const trpc = useTRPC();
- const pr = useQuery(
- trpc.githubPrReview.getPullRequest.queryOptions(
- { owner: parsed?.owner ?? '', repo: parsed?.repo ?? '', number: parsed?.number ?? 0 },
- { enabled: parsed !== null && !isEdit }
- )
- );
+ const overviewOptions = useMemo(() => buildPrOverviewQueryOptions(trpc, scope), [trpc, scope]);
+ const pr = useQuery({
+ ...overviewOptions,
+ enabled: parsed !== null && !isEdit && isProviderScopeReady(scope),
+ });
// Missing pending item: alert above the formSheet and back out once.
const missingAlertedRef = useRef(false);
@@ -83,6 +137,7 @@ export function PrReviewCommentComposerScreen() {
owner={parsed.owner}
repo={parsed.repo}
number={parsed.number}
+ prRef={providerRef && providerRef.platform !== 'github' ? providerRef : undefined}
mode={{ kind: 'edit', pendingItemId: pendingItem.id }}
path={parsed.path}
side={parsed.side}
@@ -104,6 +159,7 @@ export function PrReviewCommentComposerScreen() {
owner={parsed.owner}
repo={parsed.repo}
number={parsed.number}
+ prRef={providerRef && providerRef.platform !== 'github' ? providerRef : undefined}
mode={{ kind: 'create', headSha: pr.data.headSha }}
path={parsed.path}
side={parsed.side}
@@ -116,10 +172,17 @@ export function PrReviewCommentComposerScreen() {
);
}
- let body: ReactNode = null;
+ // A route with no valid comment target is not a broken comment flow: the
+ // route failed, nothing the composer could post. The "Add comment" chrome
+ // over a "Page not found" body read as a comment sheet that cannot save, so
+ // the terminal invalid state renders alone — no misleading title, no lone
+ // dismiss chevron — and carries its own Go back to the shared inbox.
if (!parsed) {
- body = ;
- } else if (isEdit) {
+ return ;
+ }
+
+ let body: ReactNode = null;
+ if (isEdit) {
body = null;
} else if (pr.isLoading) {
body = (
diff --git a/apps/mobile/src/components/pr-review/pr-review-comment-composer.test.tsx b/apps/mobile/src/components/pr-review/pr-review-comment-composer.test.tsx
index 1a1820b71d..f79cb0ca9c 100644
--- a/apps/mobile/src/components/pr-review/pr-review-comment-composer.test.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-comment-composer.test.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable max-lines -- the composer suite covers the draft clear rules and the provider-arm anchored post in one cohesive file */
// Clear-rule coverage for the comment composer's durable draft. The composer
// clears its draft on three committed outcomes — comment post, add-to-review,
// and a confirmed discard — and keeps it on a dismissed-without-confirmation
@@ -14,6 +15,7 @@ import '@/i18n';
import type * as ReactI18next from 'react-i18next';
import { PrReviewCommentComposer } from './pr-review-comment-composer';
import { clearDraft } from '@/lib/persist/drafts';
+import { providerPrRefKey } from '@/lib/pr-review/provider-pr-ref';
vi.mock('react-i18next', async importOriginal => {
const actual = await importOriginal();
@@ -256,6 +258,18 @@ describe('PrReviewCommentComposer draft clear rules', () => {
footerProp(element, 'onCommentNow')?.();
await flushMicrotasks();
+ // The GitHub arm keeps its exact pre-s6 variables: the position rides
+ // the flat input fields, never the provider `anchor` shape (c3).
+ expect(createCommentMocks.mutateAsync).toHaveBeenCalledWith({
+ owner: 'octocat',
+ repo: 'hello',
+ number: 1,
+ body: 'hello',
+ path: 'src/a.ts',
+ line: 10,
+ side: 'RIGHT',
+ commitSha: 'a'.repeat(40),
+ });
expect(clearDraft).toHaveBeenCalledWith('u1', 'pr-comment:key');
});
@@ -287,3 +301,73 @@ describe('PrReviewCommentComposer draft clear rules', () => {
expect(clearDraft).not.toHaveBeenCalled();
});
});
+
+describe('PrReviewCommentComposer provider arm (s6)', () => {
+ // A GitLab MR with the same owner/repo/number triple as the GitHub
+ // fixtures: the folded draft key and the anchored post must differ from
+ // the GitHub arm in both bytes.
+ const gitlabRef = { platform: 'gitlab' as const, projectPath: 'octocat/hello', mrIid: 1 };
+ const providerProps = { ...baseProps, prRef: gitlabRef };
+
+ function mountProviderComposer(): React.ReactElement {
+ // eslint-disable-next-line new-cap
+ return PrReviewCommentComposer(providerProps);
+ }
+
+ beforeEach(() => {
+ createCommentMocks.mutateAsync.mockReset();
+ createCommentMocks.isPending = false;
+ createCommentMocks.error = null;
+ vi.clearAllMocks();
+ });
+
+ it('posts the tapped diff position as the real anchor through the provider arm (c3)', async () => {
+ createCommentMocks.mutateAsync.mockResolvedValueOnce({});
+ const element = mountProviderComposer();
+ typeBody(element, 'hello');
+ footerProp(element, 'onCommentNow')?.();
+ await flushMicrotasks();
+
+ expect(createCommentMocks.mutateAsync).toHaveBeenCalledWith({
+ body: 'hello',
+ anchor: { path: 'src/a.ts', side: 'RIGHT', line: 10 },
+ });
+ });
+
+ it('carries a multi-line range into the anchor (c3)', async () => {
+ createCommentMocks.mutateAsync.mockResolvedValueOnce({});
+ // eslint-disable-next-line new-cap
+ const element = PrReviewCommentComposer({
+ ...providerProps,
+ startLine: 8,
+ });
+ typeBody(element, 'hello');
+ footerProp(element, 'onCommentNow')?.();
+ await flushMicrotasks();
+
+ expect(createCommentMocks.mutateAsync).toHaveBeenCalledWith({
+ body: 'hello',
+ anchor: { path: 'src/a.ts', side: 'RIGHT', line: 10, startLine: 8 },
+ });
+ });
+
+ it('keeps the provider comment out of the pending queue path (comment now is direct)', () => {
+ createCommentMocks.mutateAsync.mockResolvedValueOnce({});
+ const element = mountProviderComposer();
+ typeBody(element, 'hello');
+ footerProp(element, 'onAddToReview')?.();
+
+ // Add-to-review stays provider-agnostic: the queue is local and the
+ // submit sheet folds it into the review body later.
+ expect(createCommentMocks.mutateAsync).not.toHaveBeenCalled();
+ });
+
+ it('folds the provider ref identity into the durable comment draft key', () => {
+ const element = mountProviderComposer();
+ typeBody(element, 'hello');
+ footerProp(element, 'onAddToReview')?.();
+
+ const expected = `pr-comment:key@${providerPrRefKey(gitlabRef)}`;
+ expect(clearDraft).toHaveBeenCalledWith('u1', expected);
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/pr-review-comment-composer.tsx b/apps/mobile/src/components/pr-review/pr-review-comment-composer.tsx
index 9b37ca9e58..1371ce4a39 100644
--- a/apps/mobile/src/components/pr-review/pr-review-comment-composer.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-comment-composer.tsx
@@ -36,6 +36,7 @@ import { buildSuggestionFence } from '@/lib/pr-review/build-suggestion-fence';
import { getDiffSelection } from '@/lib/pr-review/diff-selection-bridge';
import { usePendingReview } from '@/lib/pr-review/pending-review-provider';
import { useCreateReviewCommentMutation } from '@/lib/pr-review/use-pr-review-mutations';
+import { type ProviderPrRef, providerPrRefKey } from '@/lib/pr-review/provider-pr-ref';
type CommentComposerMode =
| { kind: 'create'; headSha: string }
@@ -45,6 +46,14 @@ type PrReviewCommentComposerProps = Readonly<{
owner: string;
repo: string;
number: number;
+ /**
+ * The provider ref (s6). Present on the GitLab/Bitbucket surface: the
+ * comment posts through `providerReview.addComment` with the tapped diff
+ * position as a real anchor (c3), and the durable comment draft key folds
+ * the ref identity so a same-numbered GitHub PR never shares this sheet's
+ * draft. Absent on GitHub, which keeps the exact pre-s6 write path.
+ */
+ prRef?: ProviderPrRef;
mode: CommentComposerMode;
path: string;
side: 'LEFT' | 'RIGHT';
@@ -62,6 +71,7 @@ export function PrReviewCommentComposer(props: PrReviewCommentComposerProps) {
owner,
repo,
number,
+ prRef,
mode,
path,
side,
@@ -74,13 +84,18 @@ export function PrReviewCommentComposer(props: PrReviewCommentComposerProps) {
} = props;
const pending = usePendingReview();
const { t } = useTranslation();
- const createComment = useCreateReviewCommentMutation({ owner, repo, number });
+ const createComment = useCreateReviewCommentMutation(prRef ?? { owner, repo, number });
const isEdit = mode.kind === 'edit';
// Durable comment draft (create mode only). Edit mode edits an already-queued
// item, durable through the pending-review provider, so no draft there.
const { userId, isLoading: isIdentityLoading } = useCurrentUserId();
- const commentDraftKey = prCommentDraftKey(owner, repo, number, path, side, line, startLine);
+ const positionDraftKey = prCommentDraftKey(owner, repo, number, path, side, line, startLine);
+ // Provider arms fold the collision-free ref identity into the key (identity
+ // rule 17); the GitHub bytes stay exactly as stored before this slice.
+ const commentDraftKey = prRef
+ ? `${positionDraftKey}@${providerPrRefKey(prRef)}`
+ : positionDraftKey;
const draftUserId = isEdit ? undefined : userId;
const draft = useFencedDraftLoad({
userId: draftUserId,
@@ -199,17 +214,32 @@ export function PrReviewCommentComposer(props: PrReviewCommentComposerProps) {
return;
}
try {
- await createComment.mutateAsync({
- owner,
- repo,
- number,
- body,
- path,
- line,
- side,
- ...(startLine !== undefined ? { startLine, startSide: side } : {}),
- commitSha: mode.headSha,
- });
+ // Provider arms post the real diff position (c3): the sheet's
+ // path/side/line selection rides the `anchor` the provider router
+ // turns into an inline discussion / inline comment.
+ await createComment.mutateAsync(
+ prRef
+ ? {
+ body,
+ anchor: {
+ path,
+ side,
+ line,
+ ...(startLine !== undefined ? { startLine } : {}),
+ },
+ }
+ : {
+ owner,
+ repo,
+ number,
+ body,
+ path,
+ line,
+ side,
+ ...(startLine !== undefined ? { startLine, startSide: side } : {}),
+ commitSha: mode.headSha,
+ }
+ );
if (draftUserId) {
void clearDraft(draftUserId, commentDraftKey);
}
diff --git a/apps/mobile/src/components/pr-review/pr-review-connect-gate-view.test.ts b/apps/mobile/src/components/pr-review/pr-review-connect-gate-view.test.ts
index c18825f1af..b3aa79454d 100644
--- a/apps/mobile/src/components/pr-review/pr-review-connect-gate-view.test.ts
+++ b/apps/mobile/src/components/pr-review/pr-review-connect-gate-view.test.ts
@@ -1,14 +1,9 @@
import * as React from 'react';
import { describe, expect, it, vi } from 'vitest';
-import '@/i18n';
import type * as ReactI18next from 'react-i18next';
+import '@/i18n';
import { PrReviewConnectGate } from './pr-review-connect-gate';
-import {
- type PrReviewGateView,
- selectPrReviewGateView,
- type SelectPrReviewGateViewInput,
-} from './pr-review-connect-gate-view';
vi.mock('react-i18next', async importOriginal => {
const actual = await importOriginal();
@@ -21,57 +16,6 @@ vi.mock('react-i18next', async importOriginal => {
};
});
-const base: SelectPrReviewGateViewInput = {
- isError: false,
- isLoading: false,
- connected: true,
- revoked: false,
-};
-
-function viewFor(patch: Partial): PrReviewGateView {
- return selectPrReviewGateView({ ...base, ...patch });
-}
-
-describe('selectPrReviewGateView', () => {
- it('returns loading while the query is loading', () => {
- expect(viewFor({ isLoading: true })).toBe('loading');
- });
-
- it('returns error when the query failed and is not loading', () => {
- expect(viewFor({ isError: true })).toBe('error');
- });
-
- it('returns error when both error and loading are true', () => {
- expect(selectPrReviewGateView({ ...base, isError: true, isLoading: true })).toBe('error');
- });
-
- it('returns connect when not connected and not revoked', () => {
- expect(viewFor({ connected: false })).toBe('connect');
- });
-
- it('returns reconnect when the connection was revoked', () => {
- expect(viewFor({ connected: false, revoked: true })).toBe('reconnect');
- });
-
- it('returns children when connected', () => {
- expect(viewFor({ connected: true })).toBe('children');
- });
-
- it('exposes only one happy view and four non-happy header-bearing views', () => {
- const inputs: Partial[] = [
- { isLoading: true },
- { isError: true },
- { connected: false },
- { connected: false, revoked: true },
- { connected: true },
- ];
- const views = inputs.map(patch => viewFor(patch));
- expect(views.filter(view => view === 'children')).toHaveLength(1);
- expect(views.filter(view => view !== 'children')).toHaveLength(4);
- expect(new Set(views).size).toBe(views.length);
- });
-});
-
// The gate passes `authorization.isPending` (no data yet) to the view
// selector, not `isLoading` (isPending && isFetching). A paused query
// (offline/unknown connectivity, empty cache) is pending but not fetching,
@@ -80,6 +24,9 @@ describe('selectPrReviewGateView', () => {
// a revert to `isLoading` would make the paused query render Connect and
// fail the assertions below.
//
+// The view selector itself lives in `@/lib/pr-review/pr-review-connect-gate-view`
+// with its decision table beside it.
+//
// Rendered as a plain function call (same pattern as pr-review-screen.test.tsx)
// with hooks and child components stubbed so the tree walk stays deterministic.
@@ -118,6 +65,13 @@ vi.mock('@/lib/trpc', () => ({
}),
}));
+vi.mock('@/lib/config', () => ({ WEB_BASE_URL: 'https://web.example' }));
+
+vi.mock('expo-router', () => ({
+ // Any non-entry pathname reaches the GitHub arm.
+ usePathname: () => '/pr-review/github/owner/repo/1',
+}));
+
vi.mock('@/lib/hooks/use-theme-colors', () => ({
useThemeColors: () => ({ mutedForeground: '#6F6A61', primaryForeground: '#FFFFFF' }),
}));
@@ -164,6 +118,14 @@ function containsType(node: unknown, type: string): boolean {
if (element.type === type) {
return true;
}
+ // A function component element (the gate dispatches to GitHubConnectGate)
+ // is walked by calling it: hooks are stubbed, so a plain call renders.
+ if (
+ typeof element.type === 'function' &&
+ containsType((element.type as (props: unknown) => unknown)(element.props), type)
+ ) {
+ return true;
+ }
return Object.values(element.props as Record).some(value =>
containsType(value, type)
);
diff --git a/apps/mobile/src/components/pr-review/pr-review-connect-gate-view.ts b/apps/mobile/src/components/pr-review/pr-review-connect-gate-view.ts
deleted file mode 100644
index b8f0267f8b..0000000000
--- a/apps/mobile/src/components/pr-review/pr-review-connect-gate-view.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-export type PrReviewGateView = 'error' | 'loading' | 'connect' | 'reconnect' | 'children';
-
-export type SelectPrReviewGateViewInput = {
- readonly isError: boolean;
- readonly isLoading: boolean;
- readonly connected: boolean;
- readonly revoked: boolean;
-};
-
-/**
- * Pure view selector for the PR-review connect gate.
- *
- * The gate is intentionally a simple priority ladder: error → loading →
- * not-connected → children. This mirrors the original component's branch
- * order and keeps every non-happy outcome in a fixed set of header-bearing
- * states.
- */
-export function selectPrReviewGateView(args: SelectPrReviewGateViewInput): PrReviewGateView {
- if (args.isError) {
- return 'error';
- }
- if (args.isLoading) {
- return 'loading';
- }
- if (!args.connected) {
- return args.revoked ? 'reconnect' : 'connect';
- }
- return 'children';
-}
diff --git a/apps/mobile/src/components/pr-review/pr-review-connect-gate.tsx b/apps/mobile/src/components/pr-review/pr-review-connect-gate.tsx
index 530c49ae4e..f0bbabdcb3 100644
--- a/apps/mobile/src/components/pr-review/pr-review-connect-gate.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-connect-gate.tsx
@@ -1,9 +1,10 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
-import { PlugZap, ShieldAlert } from '@/components/ui/icons';
-import { type ReactNode, useCallback, useState } from 'react';
+import { PlugZap, RefreshCcw, ShieldAlert } from '@/components/ui/icons';
+import { type ReactNode, useCallback, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Platform, View } from 'react-native';
import { ActivityIndicator } from '@/components/ui/activity-indicator';
+import { usePathname } from 'expo-router';
import { CenteredState } from '@/components/centered-state';
import { toast } from 'sonner-native';
@@ -13,36 +14,86 @@ import { QueryError } from '@/components/query-error';
import { ScreenHeader } from '@/components/screen-header';
import { Button } from '@/components/ui/button';
import { Text } from '@/components/ui/text';
+import { WEB_BASE_URL } from '@/lib/config';
+import { getBitbucketIntegrationUrl, getGitLabIntegrationUrl } from '@/lib/integration-urls';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
import { useExternalAuthReturn } from '@/lib/external-auth/use-external-auth-return';
import { openAuthorizationAndWaitForReturn } from '@/lib/pr-review/connect-gate-platform';
-import { selectPrReviewGateView } from './pr-review-connect-gate-view';
+import { selectPrReviewGateView } from '@/lib/pr-review/pr-review-connect-gate-view';
+import { type ProviderPrPlatform } from '@/lib/pr-review/provider-pr-ref';
import { useTRPC } from '@/lib/trpc';
+/**
+ * Cold deep links land straight on a gate state with no navigation history,
+ * so `ScreenHeader` would render without a back control. The provider-neutral
+ * inbox is the one exit every PR-review surface shares.
+ */
+const PR_REVIEW_ENTRY_HREF = '/(app)/pr-review' as const;
+
type PrReviewConnectGateProps = {
readonly children: ReactNode;
+ /**
+ * Which provider's connection this mount checks. The GitHub detail route
+ * and every pre-s7 mount keep the default; the provider layout passes the
+ * route's platform.
+ */
+ readonly platform?: ProviderPrPlatform;
+ /** The selected organization for a provider check; null = personal scope. */
+ readonly organizationId?: string | null;
};
/**
- * Wraps every PR-review surface. The user's GitHub identity (separate from
- * a per-org GitHub App installation) is required to post review comments
- * via the mobile app — without it, every mutation would 401 in the same
- * way. The gate is the single place that handles:
+ * Wraps every PR-review surface, with one arm per provider:
*
+ * - GitHub: the user's GitHub identity (separate from a per-org GitHub App
+ * installation) is required to post review comments — the existing
+ * `getUserAuthorization` check and `connectUserAuthorization` CTA.
+ * - GitLab (personal + org) and Bitbucket (org): the integration status the
+ * s4 endpoints expose; the CTA opens the web integration page and the
+ * status refetches when the app returns.
+ * - Bitbucket personal: Cloud has no personal review scope, so the gate
+ * shows the org-only explanation with no CTA — nothing a retry could fix.
+ *
+ * Each arm handles the same states:
* - happy: connected → render children
- * - retryable: getUserAuthorization fails → QueryError + Retry
- * - empty: not connected / revoked → EmptyState CTA
- * - non-retryable: structurally n/a (this is a configuration gate, not a
- * transient server failure).
+ * - retryable: the status check fails → QueryError + Retry
+ * - empty: not connected → EmptyState CTA into the provider's connect flow
+ * - non-retryable: Bitbucket personal → org-only explanation, no CTA
+ *
+ * The entry screen is provider-neutral — a pasted GitLab or Bitbucket link
+ * must work for a user with no GitHub connection — so the gate is a
+ * pass-through there; the provider gates protect each detail route.
*
- * The CTA calls `githubApps.connectUserAuthorization` and opens the
+ * The GitHub CTA calls `githubApps.connectUserAuthorization` and opens the
* returned URL with the platform-appropriate browser launcher (iOS native
* auth session that resolves on sheet close; Android custom tab that
- * resolves on app-foreground via AppState). Cancellation on either
- * platform simply leaves the gate showing — there's nothing to roll
- * back because the auth flow is server-driven.
+ * resolves on app-foreground via AppState). Cancellation on either platform
+ * simply leaves the gate showing — there's nothing to roll back because the
+ * auth flow is server-driven.
*/
-export function PrReviewConnectGate({ children }: PrReviewConnectGateProps) {
+export function PrReviewConnectGate({
+ children,
+ platform = 'github',
+ organizationId = null,
+}: PrReviewConnectGateProps) {
+ const pathname = usePathname();
+ // The entry route (`(app)/pr-review` → pathname `/pr-review`) is the one
+ // PR-review surface that serves all three providers at once; gating it on
+ // any single connection would lock out the other two.
+ if (pathname === '/pr-review') {
+ return <>{children}>;
+ }
+ if (platform === 'github') {
+ return {children};
+ }
+ return (
+
+ {children}
+
+ );
+}
+
+function GitHubConnectGate({ children }: Readonly<{ children: ReactNode }>) {
const trpc = useTRPC();
const queryClient = useQueryClient();
const colors = useThemeColors();
@@ -99,6 +150,7 @@ export function PrReviewConnectGate({ children }: PrReviewConnectGateProps) {
};
const view = selectPrReviewGateView({
+ platform: 'github',
isError: authorization.isError,
// `isPending` (no data yet) rather than `isLoading` (isPending &&
// isFetching): a paused query (offline/unknown connectivity, empty cache)
@@ -108,12 +160,13 @@ export function PrReviewConnectGate({ children }: PrReviewConnectGateProps) {
isLoading: authorization.isPending,
connected: authorization.data?.connected === true,
revoked: authorization.data?.revoked === true,
+ organizationId: null,
});
if (view === 'error') {
return (
-
+
-
+
@@ -142,7 +195,7 @@ export function PrReviewConnectGate({ children }: PrReviewConnectGateProps) {
const revoked = view === 'reconnect';
return (
-
+
{children}>;
}
+
+/**
+ * GitLab / Bitbucket arm. The status query is the s4 integration status the
+ * connect flow updates; a Bitbucket personal scope disables it entirely
+ * because there is nothing to check — the selector renders the terminal
+ * org-only explanation for that case.
+ */
+function ProviderConnectGate({
+ platform,
+ organizationId,
+ children,
+}: Readonly<{
+ platform: Exclude;
+ organizationId: string | null;
+ children: ReactNode;
+}>) {
+ const trpc = useTRPC();
+ const colors = useThemeColors();
+ const { t } = useTranslation();
+
+ // The two providers answer with different status shapes, so each arm
+ // subscribes to its own query and only one is enabled per mount — a
+ // union of the two queryOptions types is not assignable to one useQuery.
+ const gitlabOptions = useMemo(
+ () =>
+ organizationId
+ ? trpc.organizations.reviewAgent.getGitLabStatus.queryOptions({ organizationId })
+ : trpc.personalReviewAgent.getGitLabStatus.queryOptions(),
+ [trpc, organizationId]
+ );
+ const bitbucketOptions = useMemo(
+ () =>
+ trpc.organizations.reviewAgent.getBitbucketReadiness.queryOptions({
+ organizationId: organizationId ?? '',
+ }),
+ [trpc, organizationId]
+ );
+ // Bitbucket Cloud is organization-context only (s4): with no organization
+ // selected there is no endpoint to ask, so the query stays disabled and the
+ // gate renders the org-only explanation.
+ const gitlabStatus = useQuery({ ...gitlabOptions, enabled: platform === 'gitlab' });
+ const bitbucketStatus = useQuery({
+ ...bitbucketOptions,
+ enabled: platform === 'bitbucket' && organizationId !== null,
+ });
+ const status = platform === 'gitlab' ? gitlabStatus : bitbucketStatus;
+
+ const refetchStatus = useCallback(() => {
+ void status.refetch();
+ }, [status]);
+ const { markLaunched, clearLaunch } = useExternalAuthReturn(refetchStatus);
+ const [connecting, setConnecting] = useState(false);
+
+ const handleConnect = async () => {
+ setConnecting(true);
+ try {
+ // The provider connections are web-side integrations: open the
+ // existing integration page and re-check the status when the app
+ // returns (pattern: `openAuthorizationAndWaitForReturn`).
+ markLaunched();
+ const integrationUrl =
+ platform === 'gitlab'
+ ? getGitLabIntegrationUrl(WEB_BASE_URL, organizationId ?? undefined)
+ : getBitbucketIntegrationUrl(WEB_BASE_URL, organizationId ?? '');
+ const trigger = await openAuthorizationAndWaitForReturn(Platform.OS, integrationUrl);
+ if (trigger === 'sheet-close') {
+ clearLaunch();
+ await status.refetch();
+ }
+ // Android: the AppState listener in `useExternalAuthReturn` refetches
+ // when the app returns to foreground; the sentinel stays set until it
+ // consumes the launch.
+ } catch {
+ // The browser failed to open — clear the sentinel so a later unrelated
+ // foreground doesn't trigger a stray refetch, and keep the gate showing.
+ clearLaunch();
+ } finally {
+ setConnecting(false);
+ }
+ };
+
+ const view = selectPrReviewGateView({
+ platform,
+ isError: status.isError,
+ isLoading: status.isPending,
+ connected: status.data?.connected === true,
+ // `revoked` is the GitHub App's vocabulary; provider statuses only ever
+ // answer connected / not connected.
+ revoked: false,
+ organizationId,
+ });
+
+ if (view === 'org-only') {
+ return (
+
+
+
+
+ );
+ }
+
+ if (view === 'error') {
+ return (
+
+
+ {
+ void status.refetch();
+ }}
+ isRetrying={status.isFetching}
+ />
+
+ );
+ }
+
+ if (view === 'loading') {
+ return (
+
+
+
+
+
+
+ );
+ }
+
+ if (view === 'connect') {
+ const title = platform === 'gitlab' ? t('common.connectGitlab') : t('common.connectBitbucket');
+ return (
+
+
+ {
+ void handleConnect();
+ }}
+ >
+ {connecting ? (
+
+ ) : (
+
+ )}
+ {title}
+
+ }
+ />
+
+ );
+ }
+
+ return <>{children}>;
+}
diff --git a/apps/mobile/src/components/pr-review/pr-review-discussion-tab-view.test.ts b/apps/mobile/src/components/pr-review/pr-review-discussion-tab-view.test.ts
index d25d35521a..ad7450159e 100644
--- a/apps/mobile/src/components/pr-review/pr-review-discussion-tab-view.test.ts
+++ b/apps/mobile/src/components/pr-review/pr-review-discussion-tab-view.test.ts
@@ -5,6 +5,7 @@ import { selectDiscussionTabView } from './pr-review-discussion-tab-view';
const base = {
firstPageErrorState: null,
isPending: false,
+ isPaused: false,
isEmpty: false,
};
@@ -37,6 +38,15 @@ describe('selectDiscussionTabView', () => {
expect(selectDiscussionTabView({ ...base, isPending: true })).toEqual({ kind: 'loading' });
});
+ it('returns retryable when the first page is pending but paused', () => {
+ // A paused fetch (offline, or never started) has no end: the skeleton
+ // would sit there with no comments, empty state, or error (spot check
+ // e7). The retryable state carries the working Retry CTA instead.
+ expect(
+ selectDiscussionTabView({ ...base, isPending: true, isPaused: true, isEmpty: true })
+ ).toEqual({ kind: 'retryable' });
+ });
+
it('returns empty when there is no error, no pending, and no items', () => {
expect(selectDiscussionTabView({ ...base, isEmpty: true })).toEqual({ kind: 'empty' });
});
@@ -50,6 +60,7 @@ describe('selectDiscussionTabView', () => {
selectDiscussionTabView({
firstPageErrorState: { kind: 'permission' },
isPending: true,
+ isPaused: false,
isEmpty: true,
})
).toEqual({ kind: 'permission' });
diff --git a/apps/mobile/src/components/pr-review/pr-review-discussion-tab-view.ts b/apps/mobile/src/components/pr-review/pr-review-discussion-tab-view.ts
index 326b006f9c..5b47a60830 100644
--- a/apps/mobile/src/components/pr-review/pr-review-discussion-tab-view.ts
+++ b/apps/mobile/src/components/pr-review/pr-review-discussion-tab-view.ts
@@ -11,15 +11,24 @@ export type DiscussionTabView = {
export function selectDiscussionTabView(args: {
firstPageErrorState: { kind: 'permission' | 'not-found' | 'reconnect' | 'retryable' } | null;
isPending: boolean;
+ /**
+ * The pending first page is paused — offline, or a fetch that will never
+ * start (spot check e7).
+ */
+ isPaused: boolean;
isEmpty: boolean;
}): DiscussionTabView {
- const { firstPageErrorState, isPending, isEmpty } = args;
+ const { firstPageErrorState, isPending, isPaused, isEmpty } = args;
if (firstPageErrorState) {
return { kind: firstPageErrorState.kind };
}
if (isPending) {
- return { kind: 'loading' };
+ // A paused page has no end: the skeleton would sit there with no
+ // comments, no empty state, and no error. Surface the retryable state so
+ // the tab always carries an escape. A page in flight — and the one frame
+ // before the fetch starts — keeps the skeleton.
+ return { kind: isPaused ? 'retryable' : 'loading' };
}
if (isEmpty) {
return { kind: 'empty' };
diff --git a/apps/mobile/src/components/pr-review/pr-review-discussion-tab.test.tsx b/apps/mobile/src/components/pr-review/pr-review-discussion-tab.test.tsx
index c29a18c02d..c5356983e9 100644
--- a/apps/mobile/src/components/pr-review/pr-review-discussion-tab.test.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-discussion-tab.test.tsx
@@ -3,6 +3,8 @@ import { createElement } from 'react';
import TestRenderer, { act } from 'react-test-renderer';
import { beforeEach, describe, expect, it, vi } from 'vitest';
+import { type ProviderPrRef, ProviderPrScopeProvider } from '@/lib/pr-review/provider-pr-ref';
+
import { PrReviewDiscussionTab } from './pr-review-discussion-tab';
const insetsState = vi.hoisted(() => ({ top: 0, bottom: 0, left: 0, right: 0 }));
@@ -11,6 +13,7 @@ const discussionState = vi.hoisted(() => ({
query: {
isPending: false,
isFetching: false,
+ isPaused: false,
hasNextPage: false,
isFetchingNextPage: false,
fetchNextPage: vi.fn(),
@@ -56,10 +59,19 @@ const BASE_PROPS = {
onRequestFiles: vi.fn(() => undefined),
};
-function mountTab(): TestRenderer.ReactTestRenderer {
+/** Mounts the tab, optionally under a provider scope (no scope = GitHub). */
+function mountTab(scopeRef?: ProviderPrRef): TestRenderer.ReactTestRenderer {
+ const tab = createElement(PrReviewDiscussionTab, BASE_PROPS);
+ const tree = scopeRef ? (
+
+ {tab}
+
+ ) : (
+ tab
+ );
const ref: { current: TestRenderer.ReactTestRenderer | undefined } = { current: undefined };
act(() => {
- ref.current = TestRenderer.create(createElement(PrReviewDiscussionTab, BASE_PROPS));
+ ref.current = TestRenderer.create(tree);
});
const renderer = ref.current;
if (!renderer) {
@@ -94,6 +106,7 @@ function expectSinglePadding(renderer: TestRenderer.ReactTestRenderer, expected:
function resetState(): void {
discussionState.query.isPending = false;
discussionState.query.isFetching = false;
+ discussionState.query.isPaused = false;
discussionState.query.hasNextPage = false;
discussionState.query.isFetchingNextPage = false;
discussionState.threads = [];
@@ -137,6 +150,23 @@ describe('PrReviewDiscussionTab full-body states', () => {
expectSinglePadding(mountTab(), 32);
});
+ it('escapes a stuck skeleton when the first page is paused, not in flight', () => {
+ // Spot check e7: the tab showed only skeleton cards — no comments, no
+ // empty state, no error. A pending page whose fetch is paused has no
+ // end, so the tab must render the retryable state with a working Retry
+ // CTA instead of the permanent skeleton.
+ discussionState.query.isPending = true;
+ discussionState.query.isPaused = true;
+ const renderer = mountTab();
+
+ expect(renderer.root.findAll(node => String(node.type) === 'Skeleton')).toHaveLength(0);
+ const error = renderer.root.find(node => String(node.type) === 'QueryError');
+ act(() => {
+ (error.props.onRetry as () => void)();
+ });
+ expect(discussionState.query.refetch).toHaveBeenCalled();
+ });
+
it('lets EmptyState own the empty body and keeps its Files action', () => {
const renderer = mountTab();
const empty = renderer.root.find(node => String(node.type) === 'EmptyState');
@@ -168,6 +198,41 @@ describe('PrReviewDiscussionTab full-body states', () => {
).toHaveLength(0);
});
+ // Wording, not layout: the same three states below must never call a GitLab
+ // merge request a "pull request". Every other state's copy is already
+ // provider-neutral, so it stays on one key.
+ const GITLAB_REF: ProviderPrRef = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ };
+
+ function errorMessage(scopeRef?: ProviderPrRef): unknown {
+ return mountTab(scopeRef).root.find(node => String(node.type) === 'QueryError').props.message;
+ }
+
+ it.each(['permission', 'not-found'])('names a merge request in the %s copy', kind => {
+ discussionState.firstPageErrorState = { kind };
+ expect(errorMessage(GITLAB_REF)).toContain('merge request');
+ expect(errorMessage(GITLAB_REF)).not.toContain('pull request');
+ });
+
+ it.each(['permission', 'not-found'])(
+ 'keeps the pull request copy on the %s state without a provider scope',
+ kind => {
+ discussionState.firstPageErrorState = { kind };
+ expect(errorMessage()).not.toContain('merge request');
+ }
+ );
+
+ it('names a merge request in the empty state description', () => {
+ const description = (scopeRef?: ProviderPrRef) =>
+ mountTab(scopeRef).root.find(node => String(node.type) === 'EmptyState').props
+ .description as string;
+ expect(description(GITLAB_REF)).toContain('merge request');
+ expect(description()).toContain('pull request');
+ });
+
it('renders the happy list without a chrome wrapper', () => {
discussionState.conversation = [{ nodeId: 'c1', createdAt: null }];
const renderer = mountTab();
diff --git a/apps/mobile/src/components/pr-review/pr-review-discussion-tab.tsx b/apps/mobile/src/components/pr-review/pr-review-discussion-tab.tsx
index baca0fc176..a5e0f1c296 100644
--- a/apps/mobile/src/components/pr-review/pr-review-discussion-tab.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-discussion-tab.tsx
@@ -7,7 +7,11 @@
// the entire loaded set on every update (R4: a
// later page can insert rows mid-list).
// - loading: first page in flight; render `Skeleton`
-// placeholders matching the row dimensions.
+// placeholders matching the row dimensions. A first
+// page that is pending but PAUSED (offline, or a fetch
+// that will never start) is not "in flight": it falls
+// to the retryable state below so the tab never sits
+// on a skeleton with no escape (spot check e7).
// - retryable: first page failed with a transient error;
// render `QueryError` with the standard Retry
// CTA wired to `refetch()`.
@@ -70,6 +74,7 @@ import {
toggleThreadExpanded,
} from '@/lib/pr-review/discussion/thread-expansion';
import { usePrReviewDiscussionThreads } from '@/lib/pr-review/discussion/use-pr-review-discussion-threads';
+import { useProviderPrScope } from '@/lib/pr-review/provider-pr-ref';
import { selectDiscussionTabView } from '@/components/pr-review/pr-review-discussion-tab-view';
import { useDetailScreenBottomPadding } from '@/lib/screen-insets';
@@ -100,6 +105,11 @@ export function PrReviewDiscussionTab({
});
const { t } = useTranslation();
+ // GitLab calls this a merge request; GitHub and Bitbucket both say pull
+ // request, so the three provider-named strings below switch on that term
+ // alone rather than forking the tab per provider.
+ const { ref } = useProviderPrScope({ owner, repo, number });
+ const isMergeRequest = ref.platform === 'gitlab';
const [expansion, setExpansion] = useState>({});
const [suppressContentPosition, setSuppressContentPosition] = useState(false);
@@ -214,12 +224,23 @@ export function PrReviewDiscussionTab({
const view = selectDiscussionTabView({
firstPageErrorState: retainedContentError ? null : firstPageErrorState,
isPending: query.isPending && isEmpty,
+ // A pending page whose fetch is paused (offline, or a fetch that will
+ // never start) has no end — the retryable state, not the skeleton (spot
+ // check e7).
+ isPaused: query.isPaused,
isEmpty,
});
if (view.kind === 'permission') {
return (
-
+
);
}
if (view.kind === 'not-found') {
@@ -227,7 +248,11 @@ export function PrReviewDiscussionTab({
);
}
@@ -278,7 +303,11 @@ export function PrReviewDiscussionTab({
{
+ vi.clearAllMocks();
+ resetHookSlots();
+ store.clear();
+});
+
+describe('recents identity across providers', () => {
+ beforeEach(() => {
+ seedRecents([
+ { ...SAME_TRIPLE, title: 'GitHub one' },
+ {
+ ...SAME_TRIPLE,
+ title: 'GitLab one',
+ platform: 'gitlab',
+ instanceHint: 'https://gitlab.example.com',
+ },
+ { ...SAME_TRIPLE, title: 'Bitbucket one', platform: 'bitbucket' },
+ ]);
+ });
+
+ it('renders one row per provider with a provider label', async () => {
+ const tree = await renderLoaded();
+ const rows = findAll(tree, 'View').filter(p => p.props?.testID === 'recent-row');
+ expect(rows).toHaveLength(3);
+ const labels = textValues(tree);
+ expect(labels).toContain('GitHub');
+ expect(labels).toContain('GitLab');
+ expect(labels).toContain('Bitbucket');
+ // The GitLab row writes the MR identity with the provider's own separator.
+ expect(labels).toContain('acme/api!7');
+ expect(labels).toContain('acme/api#7');
+ });
+
+ it("row presses navigate to the row's own provider route", async () => {
+ const tree = await renderLoaded();
+ const rowPressables = findAll(tree, 'Pressable').filter(
+ p => p.props?.accessibilityLabel == null
+ );
+ expect(rowPressables).toHaveLength(3);
+ const pushes: unknown[] = [];
+ for (const row of rowPressables) {
+ mocks.push.mockClear();
+ (propsOf(row).onPress as () => void)();
+ pushes.push(mocks.push.mock.calls[0]?.[0]);
+ }
+ // Seed order is stored order: GitHub, GitLab, Bitbucket.
+ expect(pushes).toEqual([
+ '/(app)/pr-review/acme/api/7',
+ '/(app)/pr-review/gitlab/acme/api/7?instance=https%3A%2F%2Fgitlab.example.com',
+ '/(app)/pr-review/bitbucket/acme/api/7',
+ ]);
+ });
+
+ it('remove confirms with provider-neutral copy and deletes only the targeted row', async () => {
+ const tree = await renderLoaded();
+ const removeGitLab = find(
+ tree,
+ 'Button',
+ p => p.accessibilityLabel === 'Remove acme/api!7 from recents'
+ );
+ (propsOf(removeGitLab).onPress as () => void)();
+ expect(mocks.alert).toHaveBeenCalledWith(
+ 'Remove from recents?',
+ 'This review will be removed from your recents.',
+ expect.arrayContaining([
+ expect.objectContaining({ text: 'Cancel' }),
+ expect.objectContaining({ text: 'Remove' }),
+ ])
+ );
+ const alertCall = mocks.alert.mock.calls[0] as
+ | [string, string, { text: string; onPress?: () => void }[]]
+ | undefined;
+ const destructive = alertCall?.[2].find(button => button.text === 'Remove');
+ destructive?.onPress?.();
+ await flush();
+ const remaining = storedRecents();
+ expect(remaining).toHaveLength(2);
+ expect(remaining.map(entry => recentPrKey(entry))).toEqual([
+ 'github||acme/api#7',
+ 'bitbucket||acme/api#7',
+ ]);
+ });
+
+ it('a failed row keeps the retry CTA and provider label', async () => {
+ store.clear();
+ seedRecents([
+ {
+ ...SAME_TRIPLE,
+ title: 'Broken MR',
+ platform: 'gitlab',
+ instanceHint: 'https://gl.acme.dev',
+ lastResult: 'failed',
+ },
+ ]);
+ const tree = await renderLoaded();
+ expect(textValues(tree)).toContain("Couldn't load");
+ const retry = find(tree, 'Button', p => p.accessibilityLabel === 'Retry');
+ (propsOf(retry).onPress as () => void)();
+ expect(mocks.push).toHaveBeenCalledWith(
+ '/(app)/pr-review/gitlab/acme/api/7?instance=https%3A%2F%2Fgl.acme.dev'
+ );
+ });
+
+ it('an empty recents store shows the neutral empty state', async () => {
+ store.clear();
+ seedRecents([]);
+ const tree = await renderLoaded();
+ const empty = find(tree, 'EmptyState', () => true);
+ expect(empty.props?.title).toBe('No recent reviews');
+ expect(empty.props?.description).toBe(
+ "Paste a link above to start a review — it'll show up here next time."
+ );
+ });
+
+ it('the recents load renders into an indicator while pending', () => {
+ // getRecentPrs is still in flight on the first call: the body is the
+ // spinner, never a blank that would jump the layout on arrival.
+ store.set('pr-review-recents', JSON.stringify([{ ...SAME_TRIPLE, title: 'X' }]));
+ const tree = render();
+ expect(findAll(tree, 'ActivityIndicator').length).toBeGreaterThan(0);
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/pr-review-entry-screen-test-utils.ts b/apps/mobile/src/components/pr-review/pr-review-entry-screen-test-utils.ts
new file mode 100644
index 0000000000..47350bb3a1
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/pr-review-entry-screen-test-utils.ts
@@ -0,0 +1,253 @@
+// Shared plain-function-call harness for the pr-review entry screen tests.
+// The entry screen is rendered without a React renderer: state and refs live
+// in a per-test slot array, so calling the component again re-reads what the
+// previous call's setters wrote. The vi.mock registrations live here so the
+// two test files (URL field, recents) share one wiring; a test file must
+// import this module before anything that pulls the screen in.
+
+import { vi } from 'vitest';
+
+import type * as ReactI18next from 'react-i18next';
+import type * as ReactNamespace from 'react';
+
+import { PrReviewEntryScreen } from './pr-review-entry-screen';
+import { type RecentPr } from '@/lib/pr-review/recent-prs';
+
+import '@/i18n';
+
+const harnessMocks = vi.hoisted(() => ({
+ push: vi.fn(),
+ alert: vi.fn(),
+ toastError: vi.fn(),
+ clipboard: { current: '' as string },
+}));
+
+// A hoisted binding cannot be exported directly; alias it for the test files.
+export const mocks = harnessMocks;
+
+// The store doubles as the recents disk: tests seed it directly and assert
+// removals by reading it back.
+export const store = new Map();
+
+vi.mock('react-i18next', async importOriginal => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ useTranslation: () => {
+ const i18n = actual.getI18n();
+ return { t: i18n.t.bind(i18n), i18n };
+ },
+ };
+});
+
+vi.mock('expo-router', () => ({
+ useFocusEffect: (effect: () => (() => void) | undefined) => {
+ effect();
+ },
+ useRouter: () => ({ push: harnessMocks.push }),
+}));
+
+vi.mock('expo-clipboard', () => ({
+ getStringAsync: async () => {
+ await Promise.resolve();
+ return harnessMocks.clipboard.current;
+ },
+}));
+
+vi.mock('expo-secure-store', () => ({
+ getItemAsync: async (key: string) => {
+ await Promise.resolve();
+ return store.get(key) ?? null;
+ },
+ setItemAsync: async (key: string, value: string) => {
+ await Promise.resolve();
+ store.set(key, value);
+ },
+ deleteItemAsync: async (key: string) => {
+ await Promise.resolve();
+ store.delete(key);
+ },
+}));
+vi.mock('@/lib/storage-keys', () => ({ PR_REVIEW_RECENTS_KEY: 'pr-review-recents' }));
+vi.mock('@/lib/auth/account-metadata-write', () => ({
+ writeAccountMetadata: async (_key: string, write: () => Promise) => {
+ await write();
+ },
+ deleteAccountMetadata: async (key: string) => {
+ await Promise.resolve();
+ store.delete(key);
+ },
+}));
+
+vi.mock('react-native', () => ({
+ ActivityIndicator: 'ActivityIndicator',
+ Alert: { alert: harnessMocks.alert },
+ Pressable: 'Pressable',
+ TextInput: 'TextInput',
+ View: 'View',
+}));
+
+vi.mock('@/components/empty-state', () => ({ EmptyState: 'EmptyState' }));
+vi.mock('@/components/screen-header', () => ({ ScreenHeader: 'ScreenHeader' }));
+vi.mock('@/components/ui/button', () => ({ Button: 'Button' }));
+vi.mock('@/components/ui/text', () => ({ Text: 'Text' }));
+vi.mock('@/components/ui/activity-indicator', () => ({ ActivityIndicator: 'ActivityIndicator' }));
+vi.mock('@/components/ui/icons', () => ({
+ Clipboard: 'ClipboardIcon',
+ Link2: 'Link2',
+ SearchX: 'SearchX',
+ X: 'X',
+}));
+vi.mock('@/components/ui/directional-icons', () => ({
+ DirectionalChevronRight: 'DirectionalChevronRight',
+}));
+vi.mock('@/components/pr-review/pr-review-inbox-list', () => ({
+ PrReviewInboxList: 'PrReviewInboxList',
+}));
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({ mutedForeground: '#6F6A61', primaryForeground: '#FFFFFF' }),
+}));
+vi.mock('@/lib/a11y/announcing-toast', () => ({
+ announcingToast: { error: harnessMocks.toastError },
+}));
+
+// The screen's hooks run without a React renderer: state and refs live in a
+// per-test slot array, so calling the component again re-reads what the
+// previous call's setters wrote.
+let hookSlots: unknown[] = [];
+let hookIndex = 0;
+
+vi.mock('react', async importOriginal => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ useState: (initial: unknown) => {
+ const index = hookIndex;
+ hookIndex += 1;
+ if (!(index in hookSlots)) {
+ hookSlots[index] = initial;
+ }
+ return [
+ hookSlots[index],
+ (next: unknown) => {
+ hookSlots[index] =
+ typeof next === 'function'
+ ? (next as (prev: unknown) => unknown)(hookSlots[index])
+ : next;
+ },
+ ];
+ },
+ useRef: (initial: unknown) => {
+ const index = hookIndex;
+ hookIndex += 1;
+ if (!(index in hookSlots)) {
+ hookSlots[index] = { current: initial };
+ }
+ return hookSlots[index];
+ },
+ useCallback: (fn: unknown) => fn,
+ useMemo: (factory: () => unknown) => factory(),
+ };
+});
+
+export type El = {
+ type?: unknown;
+ props?: Record;
+};
+
+function isElement(value: unknown): value is El {
+ return typeof value === 'object' && value !== null && 'type' in value && 'props' in value;
+}
+
+function collect(node: unknown, typeName: string, out: El[]): void {
+ if (node == null) {
+ return;
+ }
+ if (Array.isArray(node)) {
+ for (const child of node) {
+ collect(child, typeName, out);
+ }
+ return;
+ }
+ if (!isElement(node)) {
+ return;
+ }
+ if (node.type === typeName) {
+ out.push(node);
+ }
+ for (const value of Object.values(node.props ?? {})) {
+ collect(value, typeName, out);
+ }
+}
+
+export function findAll(tree: unknown, typeName: string): El[] {
+ const out: El[] = [];
+ collect(tree, typeName, out);
+ return out;
+}
+
+export function find(
+ tree: unknown,
+ typeName: string,
+ where: (props: Record) => boolean
+): El {
+ const match = findAll(tree, typeName).find(el => where(el.props ?? {}));
+ if (!match) {
+ throw new Error(`no ${typeName} matched the predicate`);
+ }
+ return match;
+}
+
+/** A matched element's props, guaranteed present — call handlers through this. */
+export function propsOf(el: El): Record {
+ if (!el.props) {
+ throw new Error('element has no props');
+ }
+ return el.props;
+}
+
+export function textValues(tree: unknown): string[] {
+ return findAll(tree, 'Text')
+ .map(el => {
+ const child = el.props?.children;
+ return typeof child === 'string' ? child : '';
+ })
+ .filter(value => value.length > 0);
+}
+
+export function render(): unknown {
+ // Re-rendering restarts the hook order but keeps the slot values, so a
+ // second call re-reads what the previous call's setters wrote.
+ hookIndex = 0;
+ // The component is a plain function call in this harness, not a constructor.
+ // eslint-disable-next-line new-cap
+ return PrReviewEntryScreen();
+}
+
+/** Drop all hook state so the next render starts from its initial values. */
+export function resetHookSlots(): void {
+ hookSlots = [];
+ hookIndex = 0;
+}
+
+/** Flush the mocked SecureStore's microtask chain to completion. */
+export async function flush(): Promise {
+ await new Promise(resolve => {
+ setTimeout(resolve, 0);
+ });
+}
+
+export async function renderLoaded(): Promise {
+ render();
+ // Flush the focus-effect recents load.
+ await flush();
+ return render();
+}
+
+export function seedRecents(entries: RecentPr[]): void {
+ store.set('pr-review-recents', JSON.stringify(entries));
+}
+
+export function storedRecents(): RecentPr[] {
+ return JSON.parse(store.get('pr-review-recents') ?? '[]') as RecentPr[];
+}
diff --git a/apps/mobile/src/components/pr-review/pr-review-entry-screen.test.ts b/apps/mobile/src/components/pr-review/pr-review-entry-screen.test.ts
new file mode 100644
index 0000000000..e589d7b1ee
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/pr-review-entry-screen.test.ts
@@ -0,0 +1,138 @@
+// The entry screen is the first route into a review for every provider
+// (s7): the field must accept a GitHub PR, a GitLab MR (gitlab.com or a
+// self-managed host) and a Bitbucket PR. The URL-field arm of the tests;
+// the recents arm lives in pr-review-entry-recents.test.ts and the shared
+// plain-function-call harness in pr-review-entry-screen-test-utils.ts.
+
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+
+import {
+ find,
+ findAll,
+ flush,
+ mocks,
+ propsOf,
+ render,
+ renderLoaded,
+ resetHookSlots,
+ seedRecents,
+} from './pr-review-entry-screen-test-utils';
+
+beforeEach(() => {
+ vi.clearAllMocks();
+ resetHookSlots();
+ mocks.clipboard.current = '';
+ seedRecents([]);
+});
+
+describe('provider-neutral URL field', () => {
+ it('labels and placeholders name both review nouns, no provider host', async () => {
+ const tree = await renderLoaded();
+ const input = find(tree, 'TextInput', () => true);
+ expect(input.props?.placeholder).toBe('Pull request or merge request URL');
+ expect(input.props?.accessibilityLabel).toBe('Enter a pull request or merge request URL');
+ expect(String(input.props?.placeholder)).not.toContain('github');
+ });
+
+ it('opens a GitHub PR URL on the GitHub route', async () => {
+ const tree = await renderLoaded();
+ const input = find(tree, 'TextInput', () => true);
+ (propsOf(input).onChangeText as (value: string) => void)(
+ 'https://github.com/octocat/hello-world/pull/42'
+ );
+ const open = render();
+ (
+ propsOf(
+ find(open, 'Button', p => p.accessibilityLabel === 'Open pull request or merge request')
+ ).onPress as () => void
+ )();
+ expect(mocks.push).toHaveBeenCalledWith('/(app)/pr-review/octocat/hello-world/42');
+ });
+
+ it('opens a self-managed GitLab MR on the provider route with its instance', async () => {
+ const tree = await renderLoaded();
+ const input = find(tree, 'TextInput', () => true);
+ (propsOf(input).onChangeText as (value: string) => void)(
+ 'https://gitlab.example.com/group/sub/repo/-/merge_requests/9'
+ );
+ const open = render();
+ (
+ propsOf(
+ find(open, 'Button', p => p.accessibilityLabel === 'Open pull request or merge request')
+ ).onPress as () => void
+ )();
+ expect(mocks.push).toHaveBeenCalledWith(
+ '/(app)/pr-review/gitlab/group/sub/repo/9?instance=https%3A%2F%2Fgitlab.example.com'
+ );
+ });
+
+ it('opens a Bitbucket PR on the provider route', async () => {
+ const tree = await renderLoaded();
+ const input = find(tree, 'TextInput', () => true);
+ (propsOf(input).onChangeText as (value: string) => void)(
+ 'https://bitbucket.org/acme/api/pull-requests/7/overview'
+ );
+ const open = render();
+ (
+ propsOf(
+ find(open, 'Button', p => p.accessibilityLabel === 'Open pull request or merge request')
+ ).onPress as () => void
+ )();
+ expect(mocks.push).toHaveBeenCalledWith('/(app)/pr-review/bitbucket/acme/api/7');
+ });
+
+ it('toasts the provider-neutral invalid copy for a link no provider serves', async () => {
+ const tree = await renderLoaded();
+ const input = find(tree, 'TextInput', () => true);
+ (propsOf(input).onChangeText as (value: string) => void)('https://example.com/blog/post');
+ const open = render();
+ (
+ propsOf(
+ find(open, 'Button', p => p.accessibilityLabel === 'Open pull request or merge request')
+ ).onPress as () => void
+ )();
+ expect(mocks.toastError).toHaveBeenCalledWith('Not a pull request or merge request link');
+ expect(mocks.push).not.toHaveBeenCalled();
+ });
+
+ it('paste replaces the field and opens a GitLab MR straight away', async () => {
+ mocks.clipboard.current = 'https://gitlab.com/acme/api/-/merge_requests/3';
+ const tree = await renderLoaded();
+ const paste = find(
+ tree,
+ 'Pressable',
+ p => p.accessibilityLabel === 'Paste pull request or merge request link'
+ );
+ await (propsOf(paste).onPress as () => Promise)();
+ await flush();
+ expect(mocks.push).toHaveBeenCalledWith(
+ '/(app)/pr-review/gitlab/acme/api/3?instance=https%3A%2F%2Fgitlab.com'
+ );
+ expect(mocks.toastError).not.toHaveBeenCalled();
+ });
+
+ it('paste of plain text keeps the invalid toast without navigating', async () => {
+ mocks.clipboard.current = 'just some notes';
+ const tree = await renderLoaded();
+ const paste = find(
+ tree,
+ 'Pressable',
+ p => p.accessibilityLabel === 'Paste pull request or merge request link'
+ );
+ await (propsOf(paste).onPress as () => Promise)();
+ await flush();
+ expect(mocks.toastError).toHaveBeenCalledWith('Not a pull request or merge request link');
+ expect(mocks.push).not.toHaveBeenCalled();
+ });
+
+ it('shows the clear control only once the field has text', async () => {
+ const before = await renderLoaded();
+ expect(
+ findAll(before, 'Pressable').some(p => p.props?.accessibilityLabel === 'Clear link')
+ ).toBe(false);
+ const input = find(before, 'TextInput', () => true);
+ (propsOf(input).onChangeText as (value: string) => void)('anything');
+ const after = render();
+ expect(find(after, 'Pressable', p => p.accessibilityLabel === 'Clear link')).toBeTruthy();
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx b/apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx
index 58e42ee93e..cf177f2d42 100644
--- a/apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx
@@ -9,24 +9,28 @@ import { ActivityIndicator } from '@/components/ui/activity-indicator';
import { EmptyState } from '@/components/empty-state';
import { PrReviewInboxList } from '@/components/pr-review/pr-review-inbox-list';
-import { selectRecentPrRowState } from '@/components/pr-review/recent-pr-row-state';
+import { selectRecentPrRowState } from '@/lib/pr-review/recent-pr-row-state';
import { ScreenHeader } from '@/components/screen-header';
import { Button } from '@/components/ui/button';
import { Text } from '@/components/ui/text';
import { announcingToast } from '@/lib/a11y/announcing-toast';
-import { parseGitHubPrUrl } from '@/lib/github-pr-url';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
-import { getPrReviewPath } from '@/lib/profile-agent-navigation';
+import { providerPrRefLabel, providerPrRoutePath } from '@/lib/pr-review/provider-pr-ref';
import { consumePrLinkInputEcho, pushPrLinkInputEcho } from '@/lib/pr-review/pr-link-input-echo';
import {
+ decidePrLinkOpen,
decidePrLinkPaste,
prLinkToastClipboardEmptyCopy,
prLinkToastInvalidCopy,
selectPrLinkClearButtonVisible,
} from '@/lib/pr-review/pr-link-paste';
-import { getRecentPrs, type RecentPr, removeRecentPr } from '@/lib/pr-review/recent-prs';
-
-const URL_PLACEHOLDER = 'https://github.com/owner/repo/pull/123';
+import {
+ getRecentPrs,
+ providerRefFromRecentPr,
+ type RecentPr,
+ recentPrKey,
+ removeRecentPr,
+} from '@/lib/pr-review/recent-prs';
export function PrReviewEntryScreen() {
const router = useRouter();
@@ -72,16 +76,18 @@ export function PrReviewEntryScreen() {
};
const handleSubmit = () => {
- const raw = inputValueRef.current;
- const parsed = parseGitHubPrUrl(raw.trim());
- if (!parsed) {
+ const decision = decidePrLinkOpen(inputValueRef.current);
+ if (decision.kind === 'invalid') {
announcingToast.error(prLinkToastInvalidCopy());
return;
}
- // Navigate straight to the PR route. Recents are written only after an
- // authorized payload (the PR screen's backfill effect), so a failed or
- // unauthorized open never persists an entry.
- router.push(getPrReviewPath(parsed.owner, parsed.repo, parsed.number));
+ // Navigate straight to the ref's own provider route. Recents are written
+ // only after an authorized payload (the review screen's backfill effect),
+ // so a failed or unauthorized open never persists an entry. A
+ // self-managed GitLab host parses to a ref whose instanceHint rides as
+ // the route's `instance` param — the server re-derives the authoritative
+ // instance, so a mismatched host lands on the clear not-authorized state.
+ router.push(providerPrRoutePath(decision.ref));
};
const handlePaste = async () => {
@@ -105,9 +111,11 @@ export function PrReviewEntryScreen() {
};
const handleRecentPress = (entry: RecentPr) => {
- // Navigate only. The PR screen's backfill effect updates `lastOpenedAt`
- // (and `lastResult`) once an authorized payload loads.
- router.push(getPrReviewPath(entry.owner, entry.repo, entry.number));
+ // Navigate only. The review screen's backfill effect updates
+ // `lastOpenedAt` (and `lastResult`) once an authorized payload loads.
+ // The entry's platform (legacy entries: GitHub) decides the route, so a
+ // GitLab row opens the GitLab surface, never a same-named GitHub PR.
+ router.push(providerPrRoutePath(providerRefFromRecentPr(entry)));
};
const handleRemoveRecent = (entry: RecentPr) => {
@@ -157,11 +165,12 @@ export function PrReviewEntryScreen() {
const isLast = index === recent.length - 1;
const rowState = selectRecentPrRowState(entry);
const removeLabel = t('prReview.entry.removeRecentAccessibility', {
- repo: `${entry.owner}/${entry.repo}#${entry.number}`,
+ repo: providerPrRefLabel(providerRefFromRecentPr(entry)),
});
return (
+
+ {rowState.provider}
+
{rowState.primary}
@@ -240,7 +255,7 @@ export function PrReviewEntryScreen() {
{t('prReview.entry.open')}
diff --git a/apps/mobile/src/components/pr-review/pr-review-file-navigator-screen.test.tsx b/apps/mobile/src/components/pr-review/pr-review-file-navigator-screen.test.tsx
new file mode 100644
index 0000000000..932337e136
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/pr-review-file-navigator-screen.test.tsx
@@ -0,0 +1,135 @@
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (same pattern as pr-review-discussion-tab.test.tsx) */
+import { createElement } from 'react';
+import TestRenderer, { act } from 'react-test-renderer';
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+
+import { type ProviderPrRef } from '@/lib/pr-review/provider-pr-ref';
+
+import { PrReviewFileNavigatorScreen } from './pr-review-file-navigator-screen';
+
+const queryState = vi.hoisted(() => ({
+ data: null as { headSha: string; counts: { changedFiles: number } } | null,
+ isLoading: false,
+ isError: false,
+ isFetching: false,
+ error: null as unknown,
+ refetch: vi.fn(),
+}));
+
+const scopeState: { ref: ProviderPrRef; isReady: boolean } = vi.hoisted(() => ({
+ ref: { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 },
+ isReady: true,
+}));
+
+vi.mock('react-native', () => ({ View: 'View', ActivityIndicator: 'ActivityIndicator' }));
+vi.mock('@tanstack/react-query', () => ({ useQuery: () => queryState }));
+vi.mock('expo-router', () => ({
+ useLocalSearchParams: () => ({}),
+ useRouter: () => ({ back: vi.fn() }),
+}));
+vi.mock('@/lib/pr-review/provider-pr-queries', () => ({
+ useProviderPrQueries: () => ({ ...scopeState, overviewOptions: () => ({}) }),
+}));
+vi.mock('@/lib/hooks/use-theme-colors', () => ({
+ useThemeColors: () => ({ mutedForeground: '#888' }),
+}));
+vi.mock('@/components/centered-state', () => ({ CenteredState: 'CenteredState' }));
+vi.mock('@/components/query-error', () => ({ QueryError: 'QueryError' }));
+vi.mock('@/components/screen-header', () => ({ ScreenHeader: 'ScreenHeader' }));
+// The screen renders the UI spinner while loading; the real one reaches the
+// motion policy (expo-battery), which stays unmocked in this pure harness.
+vi.mock('@/components/ui/activity-indicator', () => ({ ActivityIndicator: 'ActivityIndicator' }));
+vi.mock('@/components/pr-review/pr-review-reconnect-notice', () => ({
+ PrReviewReconnectNotice: 'PrReviewReconnectNotice',
+}));
+vi.mock('@/components/pr-review/diff/pr-diff-file-navigator', () => ({
+ PrDiffFileNavigator: 'PrDiffFileNavigator',
+}));
+
+function mountScreen(): TestRenderer.ReactTestRenderer {
+ const ref: { current: TestRenderer.ReactTestRenderer | undefined } = { current: undefined };
+ act(() => {
+ ref.current = TestRenderer.create(createElement(PrReviewFileNavigatorScreen));
+ });
+ const renderer = ref.current;
+ if (!renderer) {
+ throw new Error('renderer was not created');
+ }
+ return renderer;
+}
+
+function find(renderer: TestRenderer.ReactTestRenderer, type: string) {
+ return renderer.root.find(node => String(node.type) === type);
+}
+
+function trpcError(code: string): unknown {
+ return Object.assign(new Error(code), { data: { code }, shape: { data: { code } } });
+}
+
+describe('PrReviewFileNavigatorScreen states', () => {
+ beforeEach(() => {
+ queryState.data = null;
+ queryState.isLoading = false;
+ queryState.isError = false;
+ queryState.isFetching = false;
+ queryState.error = null;
+ queryState.refetch.mockClear();
+ scopeState.ref = { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 };
+ scopeState.isReady = true;
+ });
+
+ it('titles the sheet with the provider ref, not a GitHub triple', () => {
+ expect(find(mountScreen(), 'ScreenHeader').props.eyebrow).toBe('group/sub/repo!12');
+ });
+
+ it('shows one loading indicator while the first load is in flight', () => {
+ queryState.isLoading = true;
+ const renderer = mountScreen();
+ expect(renderer.root.findAll(node => String(node.type) === 'ActivityIndicator')).toHaveLength(
+ 1
+ );
+ expect(renderer.root.findAll(node => String(node.type) === 'QueryError')).toHaveLength(0);
+ });
+
+ it('hands the navigator the resolved provider identity on the happy path', () => {
+ queryState.data = { headSha: 'abc123', counts: { changedFiles: 4 } };
+ const navigator = find(mountScreen(), 'PrDiffFileNavigator');
+ expect(navigator.props).toMatchObject({
+ owner: 'group/sub',
+ repo: 'repo',
+ number: 12,
+ headSha: 'abc123',
+ changedFiles: 4,
+ });
+ });
+
+ it('offers a retry only for a transient failure', () => {
+ queryState.isError = true;
+ queryState.error = trpcError('INTERNAL_SERVER_ERROR');
+ const error = find(mountScreen(), 'QueryError');
+ expect(error.props.variant).toBe('server');
+ act(() => {
+ (error.props.onRetry as () => void)();
+ });
+ expect(queryState.refetch).toHaveBeenCalled();
+ });
+
+ it.each([
+ ['FORBIDDEN', 'permission'],
+ ['NOT_FOUND', 'not-found'],
+ ])('renders %s as a terminal state with no retry', (code, variant) => {
+ queryState.isError = true;
+ queryState.error = trpcError(code);
+ const error = find(mountScreen(), 'QueryError');
+ expect(error.props.variant).toBe(variant);
+ expect(error.props.onRetry).toBeUndefined();
+ });
+
+ it('points a broken connection at the reconnect notice instead of a retry', () => {
+ queryState.isError = true;
+ queryState.error = trpcError('PRECONDITION_FAILED');
+ const renderer = mountScreen();
+ expect(find(renderer, 'PrReviewReconnectNotice')).toBeDefined();
+ expect(renderer.root.findAll(node => String(node.type) === 'QueryError')).toHaveLength(0);
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/pr-review-file-navigator-screen.tsx b/apps/mobile/src/components/pr-review/pr-review-file-navigator-screen.tsx
index 2fa40b135c..d05acc8567 100644
--- a/apps/mobile/src/components/pr-review/pr-review-file-navigator-screen.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-file-navigator-screen.tsx
@@ -7,11 +7,14 @@ import { ActivityIndicator } from '@/components/ui/activity-indicator';
import { CenteredState } from '@/components/centered-state';
import { PrDiffFileNavigator } from '@/components/pr-review/diff/pr-diff-file-navigator';
+import { PrReviewReconnectNotice } from '@/components/pr-review/pr-review-reconnect-notice';
import { QueryError } from '@/components/query-error';
import { ScreenHeader } from '@/components/screen-header';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
+import { classifyPrReviewQueryState } from '@/lib/pr-review/classify-pr-review-query-state';
+import { useProviderPrQueries } from '@/lib/pr-review/provider-pr-queries';
+import { providerPrRefLabel, providerPrTriple } from '@/lib/pr-review/provider-pr-ref';
import { parseParam } from '@/lib/route-params';
-import { useTRPC } from '@/lib/trpc';
type Params = {
owner: string;
@@ -23,29 +26,38 @@ type Params = {
* File-navigator formSheet route. Fetches the PR overview for the head SHA
* (the navigator keys viewed state + the diff list on it) and mounts the S6c
* navigator content. Rendered inside the `[number]` layout's formSheet stack.
+ *
+ * Provider-agnostic (s5): the same sheet is a sibling of the provider route's
+ * stack, where the identity comes from the published scope rather than from
+ * `owner`/`repo`/`number` params. The GitHub params below stay the fallback
+ * scope, so the GitHub route reaches the exact same query it did before.
*/
export function PrReviewFileNavigatorScreen() {
const router = useRouter();
const colors = useThemeColors();
const { t } = useTranslation();
const params = useLocalSearchParams();
- const owner = parseParam(params.owner) ?? '';
- const repo = parseParam(params.repo) ?? '';
const rawNumber = parseParam(params.number) ?? '';
- const number = Number.parseInt(rawNumber, 10);
+ const queries = useProviderPrQueries({
+ owner: parseParam(params.owner) ?? '',
+ repo: parseParam(params.repo) ?? '',
+ number: Number.parseInt(rawNumber, 10),
+ });
+ const { owner, repo, number } = providerPrTriple(queries.ref);
- const trpc = useTRPC();
- const pr = useQuery(
- trpc.githubPrReview.getPullRequest.queryOptions(
- { owner, repo, number },
- { enabled: Boolean(owner) && Boolean(repo) && Number.isInteger(number) && number > 0 }
- )
- );
+ // The route layout above validates the identity before this sheet can
+ // mount; the guard stays as the belt-and-braces it always was, ANDed with
+ // the scope readiness a Bitbucket ref carries.
+ const hasIdentity = Boolean(owner) && Boolean(repo) && Number.isInteger(number) && number > 0;
+ const pr = useQuery({
+ ...queries.overviewOptions(),
+ enabled: queries.isReady && hasIdentity,
+ });
const header = (
{
router.back();
@@ -77,9 +89,8 @@ export function PrReviewFileNavigatorScreen() {
) : (
- {
void pr.refetch();
}}
@@ -89,3 +100,39 @@ export function PrReviewFileNavigatorScreen() {
>
);
}
+
+/**
+ * The sheet's failure states, split the same way the Overview and Discussion
+ * bodies split them: a permission denial, a missing PR/MR and a broken
+ * connection are terminal and carry no retry, because retrying the identical
+ * request cannot change any of them. Only a transient failure gets the CTA.
+ */
+function NavigatorError({
+ error,
+ onRetry,
+ isRetrying,
+}: Readonly<{ error: unknown; onRetry: () => void; isRetrying: boolean }>) {
+ const { t } = useTranslation();
+ const state = error === null ? null : classifyPrReviewQueryState(error);
+ if (state?.kind === 'permission') {
+ return ;
+ }
+ if (state?.kind === 'not-found') {
+ return ;
+ }
+ if (state?.kind === 'reconnect') {
+ return (
+
+
+
+ );
+ }
+ return (
+
+ );
+}
diff --git a/apps/mobile/src/components/pr-review/pr-review-files-tab.tsx b/apps/mobile/src/components/pr-review/pr-review-files-tab.tsx
index 87f015aa75..07de0b67b7 100644
--- a/apps/mobile/src/components/pr-review/pr-review-files-tab.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-files-tab.tsx
@@ -16,6 +16,12 @@ type PrReviewFilesTabProps = {
* Files tab: hosts the S6b diff file list (a virtualized FlashList, so the
* screen renders this outside its Overview ScrollView). S6c layers the file
* navigator sheet and the tablet unified/side-by-side toggle on top of this.
+ *
+ * Provider-agnostic (s5): the identity below is the GitHub-shaped triple the
+ * list and its stores are written against, while the list's own queries
+ * (`usePrReviewFileListQuery`, `usePrDiffContextLoader`) resolve the real
+ * `ProviderPrRef` from the provider scope, so the same list renders GitLab
+ * and Bitbucket diffs without a per-provider copy of this tree.
*/
export function PrReviewFilesTab({
owner,
diff --git a/apps/mobile/src/components/pr-review/pr-review-inbox-list.tsx b/apps/mobile/src/components/pr-review/pr-review-inbox-list.tsx
index 8d01d02197..5f9d26e9ab 100644
--- a/apps/mobile/src/components/pr-review/pr-review-inbox-list.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-inbox-list.tsx
@@ -24,13 +24,17 @@ import { DirectionalChevronRight } from '@/components/ui/directional-icons';
import { Skeleton } from '@/components/ui/skeleton';
import { Text } from '@/components/ui/text';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
-import { getPrReviewPath } from '@/lib/profile-agent-navigation';
-import { usePrInbox } from '@/lib/pr-review/use-pr-inbox';
+import {
+ providerPrRefLabel,
+ providerPrRoutePath,
+ providerPrTermKey,
+} from '@/lib/pr-review/provider-pr-ref';
+import { type ProviderInboxRow, useProviderInbox } from '@/lib/pr-review/use-provider-inbox';
import { parseTimestamp, timeAgo } from '@/lib/utils';
const SKELETON_ROW_COUNT = 5;
-type InboxItem = ReturnType['items'][number];
+type InboxItem = ProviderInboxRow;
type PrReviewInboxListProps = {
/** The "Paste a PR link" block, rendered above the Inbox eyebrow. */
@@ -40,18 +44,33 @@ type PrReviewInboxListProps = {
};
export function PrReviewInboxList({ header, recents }: Readonly) {
- const { query, items, firstPageErrorState, laterPageError } = usePrInbox(true);
+ const inbox = useProviderInbox(true);
+ // Two different retries, because they recover two different failures: the
+ // empty-state CTA re-runs the inbox from scratch, while the footer CTA must
+ // load only the page (or the provider) that failed — re-fetching pages the
+ // list already shows would never load the missing one.
+ const handleRetry = () => {
+ inbox.refetch();
+ };
+ const handleRetryMore = () => {
+ inbox.retryFailedPages();
+ };
const view = selectPrInboxView({
- isLoading: query.isPending,
- itemCount: items.length,
- firstPageErrorState,
- laterPageError,
+ isLoading: inbox.isPending,
+ itemCount: inbox.items.length,
+ firstPageErrorState: inbox.firstPageErrorState,
+ laterPageError: inbox.laterPageError,
});
+ // A provider outage while the merged list happens to be empty is still a
+ // retryable failure, not "no review requests": keep the footer retry so the
+ // failing provider has a CTA the empty state itself must not carry.
+ const showLoadMoreRetry =
+ view.showLoadMoreRetry || (view.kind === 'empty' && inbox.laterPageError);
return (
`${item.owner}/${item.repo}#${item.number}`}
+ data={view.kind === 'happy' ? inbox.items : []}
+ keyExtractor={item => item.key}
renderItem={({ item }) => }
ListHeaderComponent={
@@ -60,30 +79,18 @@ export function PrReviewInboxList({ header, recents }: Readonly
}
ListEmptyComponent={
- {
- void query.refetch();
- }}
- isRetrying={query.isFetching}
- />
+
}
ListFooterComponent={
- {view.showLoadMoreRetry ? (
- {
- void query.fetchNextPage();
- }}
- />
- ) : null}
+ {showLoadMoreRetry ? : null}
{recents}
}
onEndReached={() => {
- if (query.hasNextPage && !query.isFetchingNextPage) {
- void query.fetchNextPage();
+ if (inbox.hasNextPage && !inbox.isFetchingNextPage) {
+ inbox.fetchNextPage();
}
}}
onEndReachedThreshold={0.5}
@@ -124,12 +131,14 @@ function InboxRow({ item }: Readonly<{ item: InboxItem }>) {
const colors = useThemeColors();
const { t } = useTranslation();
const updatedLabel = timeAgo(parseTimestamp(item.updatedAt));
- const rowLabel = `${item.owner}/${item.repo}#${item.number}`;
+ // `group/sub/repo!12` on GitLab, `owner/repo#7` elsewhere — the row says
+ // which provider it came from before the term chip repeats it in words.
+ const rowLabel = providerPrRefLabel(item.ref);
return (
{
- router.push(getPrReviewPath(item.owner, item.repo, item.number));
+ router.push(providerPrRoutePath(item.ref));
}}
accessibilityRole="button"
accessibilityLabel={rowLabel}
@@ -141,15 +150,10 @@ function InboxRow({ item }: Readonly<{ item: InboxItem }>) {
- {item.owner}/{item.repo}#{item.number} · {updatedLabel}
+ {rowLabel} · {updatedLabel}
- {item.isDraft ? (
-
-
- {t('common.draft')}
-
-
- ) : null}
+
+ {item.isDraft ? : null}
@@ -157,6 +161,16 @@ function InboxRow({ item }: Readonly<{ item: InboxItem }>) {
);
}
+function InboxChip({ label }: Readonly<{ label: string }>) {
+ return (
+
+
+ {label}
+
+
+ );
+}
+
function InboxEmpty({
view,
onRetry,
diff --git a/apps/mobile/src/components/pr-review/pr-review-merge-screen.mounted.test.tsx b/apps/mobile/src/components/pr-review/pr-review-merge-screen.mounted.test.tsx
new file mode 100644
index 0000000000..5efa4cd26b
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/pr-review-merge-screen.mounted.test.tsx
@@ -0,0 +1,297 @@
+// The merge screen gates its sheet on the provider reads' DATA (ux2): an
+// errored `providerReview.getMergeState` must not mount the GitLab sheet
+// without its restrictions list, and an errored `providerReview.getCapabilities`
+// must not mount the Bitbucket auto-merge sheet without its capability banner.
+// The gate is data presence, not `isSuccess`: a foreground refresh whose
+// refetch fails retains the last good read, and the open sheet must stay
+// mounted on that retained data rather than drop the user's typed message.
+// The failure body's Retry refetches the failed provider reads alongside the
+// overview. Mounted with a keyed `useQuery` mock so each read can settle into a
+// different state than its siblings.
+
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (node env, no jsdom); see src/components/pr-review/pr-review-submit.test.tsx */
+/* eslint-disable require-await, @typescript-eslint/require-await -- the fake refetch factories settle without await because they resolve immediately */
+
+import type * as ReactQuery from '@tanstack/react-query';
+import { type ReactNode } from 'react';
+import { type ReactTestInstance, type ReactTestRenderer } from 'react-test-renderer';
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+
+import '@/i18n';
+import { PrReviewMergeScreen } from './pr-review-merge-screen';
+import { type ProviderPrScope, ProviderPrScopeProvider } from '@/lib/pr-review/provider-pr-ref';
+import { renderWithProviders } from '@/test/render-with-providers';
+
+type MockQueryResult = {
+ data: unknown;
+ isLoading: boolean;
+ isPending: boolean;
+ isSuccess: boolean;
+ isError: boolean;
+ isFetching: boolean;
+ refetch: () => Promise;
+};
+
+type ResultKey = 'overview' | 'mergeState' | 'capabilities';
+
+type MockState = {
+ results: Partial>;
+ params: Record;
+ scope: ProviderPrScope | null;
+};
+
+const mock = vi.hoisted(
+ (): MockState => ({
+ results: {},
+ params: {},
+ scope: null,
+ })
+);
+
+function mockResult(overrides: Partial = {}): MockQueryResult {
+ return {
+ data: undefined,
+ isLoading: false,
+ isPending: false,
+ isSuccess: true,
+ isError: false,
+ isFetching: false,
+ refetch: vi.fn(async () => undefined),
+ ...overrides,
+ };
+}
+
+function resultOf(key: ResultKey): MockQueryResult {
+ const query = mock.results[key];
+ if (query === undefined) {
+ throw new Error(`the test did not set a mock result for the ${key} read`);
+ }
+ return query;
+}
+
+vi.mock('@tanstack/react-query', async importOriginal => ({
+ ...(await importOriginal()),
+ useQuery: (options: { queryKey: readonly unknown[] }) =>
+ mock.results[String(options.queryKey[0]) as ResultKey],
+}));
+vi.mock('expo-router', () => ({
+ useRouter: () => ({ back: vi.fn(), push: vi.fn() }),
+ useLocalSearchParams: () => mock.params,
+}));
+vi.mock('react-native', () => ({
+ View: 'View',
+ ActivityIndicator: 'ActivityIndicator',
+}));
+vi.mock('@/components/centered-state', () => ({ CenteredState: 'CenteredState' }));
+vi.mock('@/components/query-error', () => ({ QueryError: 'QueryError' }));
+// The screen renders the UI spinner while the overview loads; the real one
+// reaches the motion policy (expo-battery), unmocked in this harness.
+vi.mock('@/components/ui/activity-indicator', () => ({ ActivityIndicator: 'ActivityIndicator' }));
+vi.mock('@/components/pr-review/pr-form-sheet-chrome', () => ({
+ PrFormSheetHeader: 'PrFormSheetHeader',
+}));
+vi.mock('@/components/pr-review/merge/pr-merge-sheet', () => ({
+ PrMergeSheet: 'PrMergeSheet',
+ providerPrNounKey: (platform: string) =>
+ platform === 'gitlab' ? 'common.mergeRequest' : 'common.pullRequest',
+}));
+vi.mock('@/lib/hooks/use-theme-colors', () => ({ useThemeColors: () => ({}) }));
+vi.mock('@/lib/trpc', () => ({
+ trpcClient: {},
+ useTRPC: () => ({
+ githubPrReview: { getPullRequest: { queryOptions: () => ({ queryKey: ['overview'] }) } },
+ providerReview: {
+ getPullRequest: { queryOptions: () => ({ queryKey: ['overview'] }) },
+ getMergeState: { queryOptions: () => ({ queryKey: ['mergeState'] }) },
+ getCapabilities: { queryOptions: () => ({ queryKey: ['capabilities'] }) },
+ },
+ }),
+}));
+
+function ScopeWrapper({ children }: Readonly<{ children: ReactNode }>) {
+ const { scope } = mock;
+ if (scope === null) {
+ throw new Error('the test did not set a provider scope');
+ }
+ return {children};
+}
+
+const gitlabMergeState = {
+ canMerge: false,
+ approvalsRequired: 2,
+ pipelineMustSucceed: true,
+ conflicts: false,
+ blockedReasons: [{ code: 'approvals', message: '2 approvals required' }],
+};
+
+const overviewData = {
+ headSha: 'abc123',
+ headRef: 'feature',
+ isCrossRepo: false,
+ prNodeId: 'gitlab:group/repo!12',
+ title: 'Ship it',
+ bodyMarkdown: '',
+ baseRef: 'main',
+ repo: { allowMergeCommit: true, allowSquashMerge: true, allowRebaseMerge: false },
+};
+
+const autoMergeUnsupported = { supported: false, reason: 'Workspace has no auto-merge' };
+
+function gitlabMergeParams() {
+ mock.params = { platform: 'gitlab', identity: ['group', 'repo', '12'] };
+ mock.scope = {
+ ref: { platform: 'gitlab', projectPath: 'group/repo', mrIid: 12 },
+ organizationId: null,
+ };
+}
+
+function bitbucketAutoMergeParams() {
+ mock.params = { platform: 'bitbucket', identity: ['ws', 'repo', '7'], mode: 'enable-auto-merge' };
+ mock.scope = {
+ ref: { platform: 'bitbucket', workspace: 'ws', repoSlug: 'repo', prId: 7 },
+ organizationId: 'org-1',
+ };
+}
+
+async function renderScreen() {
+ return renderWithProviders(, { wrapper: ScopeWrapper });
+}
+
+function findSheet(renderer: ReactTestRenderer) {
+ return renderer.root.findAll(node => String(node.type) === 'PrMergeSheet');
+}
+
+function oneSheet(renderer: ReactTestRenderer): ReactTestInstance {
+ const [sheet] = findSheet(renderer);
+ if (sheet === undefined) {
+ throw new Error('the merge sheet did not mount');
+ }
+ return sheet;
+}
+
+function findError(renderer: ReactTestRenderer) {
+ return renderer.root.findAll(node => String(node.type) === 'QueryError');
+}
+
+function oneError(renderer: ReactTestRenderer): ReactTestInstance {
+ const [error] = findError(renderer);
+ if (error === undefined) {
+ throw new Error('the failure body did not render');
+ }
+ return error;
+}
+
+beforeEach(() => {
+ vi.clearAllMocks();
+ mock.results = {
+ overview: mockResult({ data: overviewData }),
+ mergeState: mockResult({ data: gitlabMergeState }),
+ capabilities: mockResult({ data: { autoMerge: autoMergeUnsupported } }),
+ };
+});
+
+describe('PrReviewMergeScreen provider-read gating', () => {
+ it('keeps the GitLab sheet unmounted when getMergeState fails while the overview succeeds', async () => {
+ gitlabMergeParams();
+ mock.results.mergeState = mockResult({ data: undefined, isSuccess: false, isError: true });
+ const { renderer, unmount } = await renderScreen();
+ expect(findSheet(renderer)).toHaveLength(0);
+ expect(findError(renderer)).toHaveLength(1);
+ unmount();
+ });
+
+ it('refetches the failed merge-state read alongside the overview on Retry', async () => {
+ gitlabMergeParams();
+ mock.results.mergeState = mockResult({ data: undefined, isSuccess: false, isError: true });
+ const { renderer, unmount } = await renderScreen();
+ const error = oneError(renderer);
+ (error.props.onRetry as () => void)();
+ await vi.waitFor(() => {
+ expect(resultOf('overview').refetch).toHaveBeenCalledOnce();
+ expect(resultOf('mergeState').refetch).toHaveBeenCalledOnce();
+ });
+ expect(resultOf('capabilities').refetch).not.toHaveBeenCalled();
+ unmount();
+ });
+
+ it('keeps the Bitbucket auto-merge sheet unmounted when getCapabilities fails', async () => {
+ bitbucketAutoMergeParams();
+ mock.results.mergeState = mockResult({ data: { ...gitlabMergeState, canMerge: true } });
+ mock.results.capabilities = mockResult({ data: undefined, isSuccess: false, isError: true });
+ const { renderer, unmount } = await renderScreen();
+ expect(findSheet(renderer)).toHaveLength(0);
+ expect(findError(renderer)).toHaveLength(1);
+ const error = oneError(renderer);
+ (error.props.onRetry as () => void)();
+ await vi.waitFor(() => {
+ expect(resultOf('overview').refetch).toHaveBeenCalledOnce();
+ expect(resultOf('capabilities').refetch).toHaveBeenCalledOnce();
+ });
+ // The merge-state read succeeded, so Retry does not refetch it.
+ expect(resultOf('mergeState').refetch).not.toHaveBeenCalled();
+ unmount();
+ });
+
+ it('mounts the sheet with the restrictions list and the capability banner once both reads succeed', async () => {
+ bitbucketAutoMergeParams();
+ mock.results.mergeState = mockResult({ data: { ...gitlabMergeState, canMerge: true } });
+ const { renderer, unmount } = await renderScreen();
+ expect(findSheet(renderer)).toHaveLength(1);
+ const sheet = oneSheet(renderer);
+ expect(sheet.props.mergeState).toEqual({ ...gitlabMergeState, canMerge: true });
+ expect(sheet.props.autoMergeCapability).toEqual(autoMergeUnsupported);
+ expect(findError(renderer)).toHaveLength(0);
+ unmount();
+ });
+
+ it('shows one loading body while the merge-state read is in flight, not a sheet without it', async () => {
+ gitlabMergeParams();
+ mock.results.mergeState = mockResult({
+ data: undefined,
+ isSuccess: false,
+ isPending: true,
+ isLoading: true,
+ });
+ const { renderer, unmount } = await renderScreen();
+ expect(findSheet(renderer)).toHaveLength(0);
+ expect(findError(renderer)).toHaveLength(0);
+ expect(renderer.root.findAll(node => String(node.type) === 'CenteredState')).toHaveLength(1);
+ unmount();
+ });
+
+ it('keeps the open GitLab sheet mounted when a refresh refetch of getMergeState fails on retained data', async () => {
+ // A foreground refresh invalidates the provider reads; the refetch errors
+ // but the query keeps its last good data. Gating on `isSuccess` would
+ // unmount the sheet and drop the commit message the user typed.
+ gitlabMergeParams();
+ mock.results.mergeState = mockResult({
+ data: gitlabMergeState,
+ isSuccess: false,
+ isError: true,
+ isFetching: true,
+ });
+ const { renderer, unmount } = await renderScreen();
+ expect(findSheet(renderer)).toHaveLength(1);
+ const sheet = oneSheet(renderer);
+ expect(sheet.props.mergeState).toEqual(gitlabMergeState);
+ expect(findError(renderer)).toHaveLength(0);
+ unmount();
+ });
+
+ it('keeps the open Bitbucket auto-merge sheet mounted when a refresh refetch of getCapabilities fails on retained data', async () => {
+ bitbucketAutoMergeParams();
+ mock.results.mergeState = mockResult({ data: { ...gitlabMergeState, canMerge: true } });
+ mock.results.capabilities = mockResult({
+ data: { autoMerge: autoMergeUnsupported },
+ isSuccess: false,
+ isError: true,
+ isFetching: true,
+ });
+ const { renderer, unmount } = await renderScreen();
+ expect(findSheet(renderer)).toHaveLength(1);
+ const sheet = oneSheet(renderer);
+ expect(sheet.props.autoMergeCapability).toEqual(autoMergeUnsupported);
+ expect(findError(renderer)).toHaveLength(0);
+ unmount();
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/pr-review-merge-screen.tsx b/apps/mobile/src/components/pr-review/pr-review-merge-screen.tsx
index 5689accd15..90c99d32c8 100644
--- a/apps/mobile/src/components/pr-review/pr-review-merge-screen.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-merge-screen.tsx
@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query';
import { useLocalSearchParams, useRouter } from 'expo-router';
-import { type ReactNode } from 'react';
+import { type ReactNode, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { ActivityIndicator } from '@/components/ui/activity-indicator';
@@ -8,10 +8,23 @@ import { CenteredState } from '@/components/centered-state';
import { PrFormSheetHeader } from '@/components/pr-review/pr-form-sheet-chrome';
import { QueryError } from '@/components/query-error';
-import { PrMergeSheet } from '@/components/pr-review/merge/pr-merge-sheet';
+import { PrMergeSheet, providerPrNounKey } from '@/components/pr-review/merge/pr-merge-sheet';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
import { type PrMergeMethod } from '@/lib/pr-review/merge/merge-blocked-reasons';
import { parseParam } from '@/lib/route-params';
+import {
+ buildPrMergeStateQueryOptions,
+ buildPrOverviewQueryOptions,
+ providerCapabilitiesIdentity,
+ selectProviderCapabilitiesData,
+} from '@/lib/pr-review/provider-pr-queries';
+import {
+ isProviderScopeReady,
+ parseProviderPrRoute,
+ providerPrRefLabel,
+ providerPrTriple,
+ useProviderPrScope,
+} from '@/lib/pr-review/provider-pr-ref';
import { useTRPC } from '@/lib/trpc';
type Params = {
@@ -20,6 +33,10 @@ type Params = {
number: string;
mode?: string;
method?: string;
+ // Provider route shape (`[platform]/[...identity]/merge`).
+ platform?: string;
+ identity?: string[] | string;
+ instance?: string;
};
const MERGE_METHODS = new Set(['merge', 'squash', 'rebase']);
@@ -27,39 +44,118 @@ const MERGE_METHODS = new Set(['merge', 'squash', 'rebase']);
/**
* Merge formSheet route. Reads the PR + mode/method from params, fetches the
* overview so the sheet has the repo settings + head SHA fence, and mounts the
- * S8 merge sheet. Rendered inside the `[number]` layout's formSheet stack.
+ * merge sheet. Rendered inside BOTH the GitHub `[number]` layout and the
+ * provider `[...identity]` layout (s6): on provider arms the s2/s3 merge
+ * state rides along as the confirmation sheet's restrictions list, and the
+ * wording follows the connected provider (merge request vs pull request).
*/
export function PrReviewMergeScreen() {
const router = useRouter();
const colors = useThemeColors();
const { t } = useTranslation();
const params = useLocalSearchParams();
- const owner = parseParam(params.owner) ?? '';
- const repo = parseParam(params.repo) ?? '';
- const rawNumber = parseParam(params.number) ?? '';
+
+ // The provider route carries the identity segments; the GitHub route the
+ // plain triple. Exactly one parses — the provider layout redirects a
+ // hand-built `/pr-review/github/...` link to the GitHub route.
+ const providerRef = useMemo(
+ () =>
+ parseProviderPrRoute({
+ platform: params.platform,
+ identity: params.identity,
+ instance: params.instance,
+ }),
+ [params.platform, params.identity, params.instance]
+ );
+ const providerTriple = providerRef ? providerPrTriple(providerRef) : null;
+ const owner = providerTriple ? providerTriple.owner : (parseParam(params.owner) ?? '');
+ const repo = providerTriple ? providerTriple.repo : (parseParam(params.repo) ?? '');
+ const rawNumber = providerTriple
+ ? String(providerTriple.number)
+ : (parseParam(params.number) ?? '');
const number = Number.parseInt(rawNumber, 10);
+
const mode = params.mode === 'enable-auto-merge' ? 'enable-auto-merge' : 'merge';
const method: PrMergeMethod = MERGE_METHODS.has(params.method as PrMergeMethod)
? (params.method as PrMergeMethod)
: 'merge';
- const sheetTitle =
- mode === 'enable-auto-merge'
- ? t('prReview.merge.enableAutoMerge')
- : t('prReview.merge.mergePullRequest');
- const eyebrow = `${owner}/${repo}#${rawNumber}`;
+ const sheetTitle = (() => {
+ if (mode === 'enable-auto-merge') {
+ return t('prReview.merge.enableAutoMerge');
+ }
+ if (providerRef && providerRef.platform !== 'github') {
+ return t('prReview.merge.mergeTermTitle', {
+ term: t(providerPrNounKey(providerRef.platform)),
+ });
+ }
+ return t('prReview.merge.mergePullRequest');
+ })();
+ const eyebrow = providerRef ? providerPrRefLabel(providerRef) : `${owner}/${repo}#${rawNumber}`;
const dismiss = () => {
router.back();
};
+ // The scope the reads run under: the layout publishes the provider scope in
+ // context; the GitHub route falls back to the parsed triple, so the GitHub
+ // query key is byte-identical to the pre-s6 one.
+ const scope = useProviderPrScope(
+ owner && repo && Number.isInteger(number) && number > 0
+ ? { owner, repo, number }
+ : { owner: '', repo: '', number: 0 }
+ );
+
const trpc = useTRPC();
- const pr = useQuery(
- trpc.githubPrReview.getPullRequest.queryOptions(
- { owner, repo, number },
- { enabled: Boolean(owner) && Boolean(repo) && Number.isInteger(number) && number > 0 }
- )
+ const overviewOptions = useMemo(() => buildPrOverviewQueryOptions(trpc, scope), [trpc, scope]);
+ const paramsValid = Boolean(owner) && Boolean(repo) && Number.isInteger(number) && number > 0;
+ const pr = useQuery({
+ ...overviewOptions,
+ enabled: paramsValid && isProviderScopeReady(scope),
+ });
+
+ // The auto-merge capability, provider auto-merge arms only: a
+ // `supported: false` answer (Bitbucket) renders the capability banner.
+ // The GitHub arm keeps its query disabled — it never touches the
+ // `providerReview` namespace over the network.
+ const needsAutoMergeCapability =
+ providerRef !== null && providerRef.platform !== 'github' && mode === 'enable-auto-merge';
+ // The options call sits directly in the body and the result is bound
+ // before `useQuery`: wrapped in a helper/useMemo closure the linter's
+ // inference loses the option type, and passed inline the type-checker's
+ // inference collapses every `.data` read. The data itself is read back
+ // through the seam's typed selector.
+ const capabilitiesOptions = trpc.providerReview.getCapabilities.queryOptions(
+ providerCapabilitiesIdentity(scope),
+ {
+ enabled:
+ needsAutoMergeCapability && scope.ref.platform !== 'github' && isProviderScopeReady(scope),
+ }
);
+ const capabilitiesQuery = useQuery(capabilitiesOptions);
+ const capabilitiesData = selectProviderCapabilitiesData(capabilitiesQuery.data);
- if (pr.data) {
+ // The s2/s3 merge gate, provider arms only (GitHub's gate derives from the
+ // overview DTO in the merge section — the GitHub arm's query registers
+ // disabled and never touches the `providerReview` namespace).
+ const mergeStateOptions = useMemo(
+ () => buildPrMergeStateQueryOptions(trpc, scope),
+ [trpc, scope]
+ );
+ const mergeStateQuery = useQuery(mergeStateOptions);
+
+ // The sheet mounts only once its reads HAVE DATA, so its content never
+ // shifts and a doomed submit is never offered: loading → content happens in
+ // the screen body, not inside the sheet, and a first-load failure of a
+ // provider read (no data yet) keeps the sheet unmounted rather than losing
+ // the restrictions list (getMergeState) or the capability banner
+ // (getCapabilities). Data presence, not `isSuccess`: a foreground refresh
+ // whose refetch fails RETAINS the last good read, and gating on success
+ // would unmount an open sheet — dropping the commit message the user typed
+ // — over data the sheet still has.
+ const isProviderArm = scope.ref.platform !== 'github';
+ const mergeStateReady = !isProviderArm || mergeStateQuery.data !== undefined;
+ const capabilitiesReady = !needsAutoMergeCapability || capabilitiesQuery.data !== undefined;
+
+ if (pr.data && mergeStateReady && capabilitiesReady) {
return (
{
await pr.refetch();
}}
@@ -85,20 +186,38 @@ export function PrReviewMergeScreen() {
);
}
- const body: ReactNode = pr.isLoading ? (
-
-
-
- ) : (
- {
- void pr.refetch();
- }}
- isRetrying={pr.isFetching}
- />
- );
+ const body: ReactNode =
+ pr.isLoading ||
+ (isProviderArm && mergeStateQuery.isLoading) ||
+ (needsAutoMergeCapability && capabilitiesQuery.isLoading) ? (
+
+
+
+ ) : (
+ {
+ // Retry recovers every read the screen is waiting on: the overview
+ // and, on the provider arms, the errored merge gate / capability
+ // read — a Retry that refetched only the overview could never
+ // clear the failure that kept the sheet from mounting. Each
+ // refetch starts as it is called, so the reads run concurrently.
+ void pr.refetch();
+ if (isProviderArm && mergeStateQuery.isError) {
+ void mergeStateQuery.refetch();
+ }
+ if (needsAutoMergeCapability && capabilitiesQuery.isError) {
+ void capabilitiesQuery.refetch();
+ }
+ }}
+ isRetrying={
+ pr.isFetching ||
+ (isProviderArm && mergeStateQuery.isFetching) ||
+ (needsAutoMergeCapability && capabilitiesQuery.isFetching)
+ }
+ />
+ );
return (
<>
diff --git a/apps/mobile/src/components/pr-review/pr-review-overview-parts.tsx b/apps/mobile/src/components/pr-review/pr-review-overview-parts.tsx
index 6e982720af..832fac0fa6 100644
--- a/apps/mobile/src/components/pr-review/pr-review-overview-parts.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-overview-parts.tsx
@@ -180,7 +180,8 @@ export function PrCountsLine({
additions,
deletions,
}: Readonly<{
- commits: number;
+ /** Null where the provider reports no commit count; the chip is dropped. */
+ commits: number | null;
changedFiles: number;
additions: number;
deletions: number;
@@ -189,12 +190,15 @@ export function PrCountsLine({
const { t } = useTranslation();
return (
-
-
-
- {formatNumber(commits, i18n.language)} {t('prReview.overview.commit', { count: commits })}
-
-
+ {commits === null ? null : (
+
+
+
+ {formatNumber(commits, i18n.language)}{' '}
+ {t('prReview.overview.commit', { count: commits })}
+
+
+ )}
diff --git a/apps/mobile/src/components/pr-review/pr-review-overview.tsx b/apps/mobile/src/components/pr-review/pr-review-overview.tsx
index 0647bf47bc..d17a1b8e01 100644
--- a/apps/mobile/src/components/pr-review/pr-review-overview.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-overview.tsx
@@ -14,6 +14,7 @@ import { MarkdownText } from '@/components/agents/markdown-text';
import { PrOverviewMeta } from '@/components/pr-review/pr-review-meta-parts';
import { PrReviewChecksSection } from '@/components/pr-review/pr-review-checks-section';
import { PrMergeSection } from '@/components/pr-review/merge/pr-merge-section';
+import { PrMergeSectionProvider } from '@/components/pr-review/merge/pr-merge-section-provider';
import {
describePrState,
formatPrCounts,
@@ -28,8 +29,9 @@ import { getGitHubIntegrationUrl } from '@/lib/agent-github-integration';
import { WEB_BASE_URL } from '@/lib/config';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
import { classifyPrReviewQueryState } from '@/lib/pr-review/classify-pr-review-query-state';
+import { useProviderPrQueries } from '@/lib/pr-review/provider-pr-queries';
import { useCheckGitHubConnection } from '@/lib/pr-review/use-check-github-connection';
-import { trpcClient, useTRPC } from '@/lib/trpc';
+import { trpcClient } from '@/lib/trpc';
const REVIEW_SUBMIT_PATH = '/(app)/pr-review/[owner]/[repo]/[number]/review-submit' as const;
@@ -76,13 +78,19 @@ export function PrReviewOverview({
isActive: _isActive,
refreshControl,
}: PrReviewOverviewProps) {
- const trpc = useTRPC();
+ const queries = useProviderPrQueries({ owner, repo, number });
const connection = useCheckGitHubConnection();
const router = useRouter();
const colors = useThemeColors();
const { t } = useTranslation();
- const pr = useQuery(trpc.githubPrReview.getPullRequest.queryOptions({ owner, repo, number }));
+ // GitHub-only affordances: the install/reconnect CTAs and the review-submit
+ // sheet are GitHub App flows and GitHub-route siblings. On GitLab and
+ // Bitbucket the same states render without a CTA that cannot work.
+ const isGitHub = queries.platform === 'github';
+ const isMergeRequest = queries.platform === 'gitlab';
+
+ const pr = useQuery(queries.overviewOptions());
const handleOpenReviewSubmit = useCallback(() => {
const href: Href = {
@@ -112,12 +120,22 @@ export function PrReviewOverview({
- {t('prReview.installKiloGitHubApp')}
-
+ isGitHub ? (
+
+ {t('prReview.installKiloGitHubApp')}
+
+ ) : null
}
/>
);
@@ -129,7 +147,11 @@ export function PrReviewOverview({
refreshControl={refreshControl}
icon={GitPullRequest}
title={t('common.accessDenied')}
- description={t('prReview.accessDeniedDescription')}
+ description={
+ isMergeRequest
+ ? t('prReview.terms.accessDeniedMergeRequest')
+ : t('prReview.accessDeniedDescription')
+ }
/>
);
}
@@ -141,15 +163,17 @@ export function PrReviewOverview({
title={t('prReview.reconnectNotice.title')}
description={t('prReview.reconnectNotice.message')}
action={
- {
- connection.mutate();
- }}
- loading={connection.isPending}
- >
- {t('prReview.checkConnection')}
-
+ isGitHub ? (
+ {
+ connection.mutate();
+ }}
+ loading={connection.isPending}
+ >
+ {t('prReview.checkConnection')}
+
+ ) : null
}
/>
);
@@ -159,7 +183,11 @@ export function PrReviewOverview({
{
void pr.refetch();
}}
@@ -232,30 +260,38 @@ export function PrReviewOverview({
-
-
- {t('prReview.review')}
-
-
-
-
- {t('prReview.review')}
-
-
-
+ {isGitHub ? (
+
+
+ {t('prReview.review')}
+
+
+
+
+ {t('prReview.review')}
+
+
+
+ ) : null}
- {
- await pr.refetch();
- }}
- isRefetching={pr.isFetching}
- />
+ {isGitHub ? (
+ {
+ await pr.refetch();
+ }}
+ isRefetching={pr.isFetching}
+ />
+ ) : (
+ // The provider merge arm (s6): the merge affordance and the
+ // capability-gated auto-merge row, pushing the ref's own sheet route.
+
+ )}
{t('prReview.headLine', {
diff --git a/apps/mobile/src/components/pr-review/pr-review-provider-noun.ts b/apps/mobile/src/components/pr-review/pr-review-provider-noun.ts
new file mode 100644
index 0000000000..37c2f27219
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/pr-review-provider-noun.ts
@@ -0,0 +1,15 @@
+// The provider's own noun in sentence form (s6). The `prReview.terms.*`
+// labels are capitalized for chips and headers, so a mid-sentence
+// `{{term}}` interpolation rides the lowercase `common.*` nouns instead —
+// "Merge Merge request?" never renders. Standalone (no React imports) so
+// the merge sheet, the merge screen and the overview's provider merge arm
+// share the one mapping without pulling each other's bundles together.
+
+import { type ProviderPrPlatform } from '@kilocode/app-shared/provider-review';
+
+export function providerPrNounKey(
+ platform: ProviderPrPlatform
+): 'common.mergeRequest' | 'common.pullRequest' {
+ // i18n-dup-ok: mid-sentence lowercase noun for {{term}} interpolation vs the capitalized standalone prReview.terms.* label; languages case-decline them apart.
+ return platform === 'gitlab' ? 'common.mergeRequest' : 'common.pullRequest';
+}
diff --git a/apps/mobile/src/components/pr-review/pr-review-provider-sheet-href.ts b/apps/mobile/src/components/pr-review/pr-review-provider-sheet-href.ts
new file mode 100644
index 0000000000..c787e4dfd4
--- /dev/null
+++ b/apps/mobile/src/components/pr-review/pr-review-provider-sheet-href.ts
@@ -0,0 +1,40 @@
+// The write-sheet routes inside the provider layout (s6). The comment
+// composer, the review-submit sheet and the merge sheet are children of the
+// PR's own route on every provider: the provider scope and the
+// `PendingReviewProvider` queue are published by the provider layout, so a
+// provider sheet must be reached through the provider route — pushing the
+// GitHub sibling would leave that scope and write to the wrong provider. The
+// GitHub route keeps its own literal paths untouched.
+import { type Href } from 'expo-router';
+
+import { type ProviderPrRef, providerPrRouteSegments } from '@/lib/pr-review/provider-pr-ref';
+
+export type ProviderPrSheetRoute = 'comment-composer' | 'review-submit' | 'merge';
+
+/**
+ * The href for one sheet under the ref's own route. A GitLab `instanceHint`
+ * rides as the `instance` query param — the same param the provider layout
+ * reads for the base route — so the sheet stays on the instance the reader
+ * opened. Extra params (composer position, merge mode) ride as query params.
+ */
+export function providerPrSheetHref(
+ ref: ProviderPrRef,
+ sheet: ProviderPrSheetRoute,
+ params: Record = {}
+): Href {
+ const { platform, identity } = providerPrRouteSegments(ref);
+ const encoded = identity.map(segment => encodeURIComponent(segment)).join('/');
+ // The path is built at runtime, so it never appears in the generated
+ // typed-routes literal union; like `providerPrHref` (provider-pr-ref.ts),
+ // the params ride in an encoded query string and the href is the cast
+ // string.
+ const queryParts: string[] = [];
+ if (ref.platform === 'gitlab' && ref.instanceHint) {
+ queryParts.push(`instance=${encodeURIComponent(ref.instanceHint)}`);
+ }
+ for (const [key, value] of Object.entries(params)) {
+ queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
+ }
+ const search = queryParts.length > 0 ? `?${queryParts.join('&')}` : '';
+ return `/(app)/pr-review/${platform}/${encoded}/${sheet}${search}` as Href;
+}
diff --git a/apps/mobile/src/components/pr-review/pr-review-reconnect-notice.tsx b/apps/mobile/src/components/pr-review/pr-review-reconnect-notice.tsx
index 1ea7172108..87a8bc34e5 100644
--- a/apps/mobile/src/components/pr-review/pr-review-reconnect-notice.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-reconnect-notice.tsx
@@ -3,24 +3,58 @@ import { View } from 'react-native';
import { Button } from '@/components/ui/button';
import { Text } from '@/components/ui/text';
+import { useProviderPrScopeOrNull } from '@/lib/pr-review/provider-pr-ref';
import { useCheckGitHubConnection } from '@/lib/pr-review/use-check-github-connection';
+import { useCheckProviderConnection } from '@/lib/pr-review/use-check-provider-connection';
+/**
+ * The mid-session recovery notice for an expired provider connection. The
+ * surface that caught the precondition failure renders it; this component
+ * decides WHICH connection to re-check from the provider scope the route
+ * published — the GitHub route publishes none, so the GitHub arm (and the
+ * original copy) is the fallback. A GitLab or Bitbucket surface re-checks
+ * its own integration status instead, because a GitHub retry can never fix
+ * an expired GitLab connection.
+ */
export function PrReviewReconnectNotice() {
const connection = useCheckGitHubConnection();
+ const providerConnection = useCheckProviderConnection();
+ const scope = useProviderPrScopeOrNull();
+ const platform = scope?.ref.platform ?? 'github';
+ const organizationId = scope?.organizationId ?? null;
+ const providerPlatform = platform === 'github' ? null : platform;
const { t } = useTranslation();
+ let title = t('prReview.reconnectNotice.title');
+ if (platform === 'gitlab') {
+ title = t('prReview.reconnectNotice.gitlabTitle');
+ } else if (platform === 'bitbucket') {
+ title = t('prReview.reconnectNotice.bitbucketTitle');
+ }
+ const message =
+ providerPlatform === null
+ ? t('prReview.reconnectNotice.message')
+ : t('prReview.reconnectNotice.providerMessage', {
+ provider:
+ platform === 'gitlab'
+ ? t('common.gitlab')
+ : t('agentChat.repoPicker.platformBitbucket'),
+ });
+
return (
-
- {t('prReview.reconnectNotice.title')}
-
- {t('prReview.reconnectNotice.message')}
+ {title}
+ {message}
{
+ if (providerPlatform) {
+ providerConnection.mutate({ platform: providerPlatform, organizationId });
+ return;
+ }
connection.mutate();
}}
- loading={connection.isPending}
+ loading={providerPlatform ? providerConnection.isPending : connection.isPending}
accessibilityLabel={t('prReview.checkConnection')}
>
{t('prReview.checkConnection')}
diff --git a/apps/mobile/src/components/pr-review/pr-review-review-submit-screen.tsx b/apps/mobile/src/components/pr-review/pr-review-review-submit-screen.tsx
index e72890ed26..dc3dd654b5 100644
--- a/apps/mobile/src/components/pr-review/pr-review-review-submit-screen.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-review-submit-screen.tsx
@@ -1,6 +1,6 @@
import { useQuery } from '@tanstack/react-query';
import { useLocalSearchParams, useRouter } from 'expo-router';
-import { type ReactNode } from 'react';
+import { type ReactNode, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { ActivityIndicator } from '@/components/ui/activity-indicator';
@@ -11,38 +11,108 @@ import { PrReviewSubmit } from '@/components/pr-review/pr-review-submit';
import { QueryError } from '@/components/query-error';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
import { parseParam } from '@/lib/route-params';
+import {
+ buildPrOverviewQueryOptions,
+ providerCapabilitiesIdentity,
+ selectProviderCapabilitiesData,
+} from '@/lib/pr-review/provider-pr-queries';
+import {
+ isProviderScopeReady,
+ parseProviderPrRoute,
+ providerPrRefLabel,
+ providerPrTriple,
+ useProviderPrScope,
+} from '@/lib/pr-review/provider-pr-ref';
import { useTRPC } from '@/lib/trpc';
type Params = {
owner: string;
repo: string;
number: string;
+ // Provider route shape (`[platform]/[...identity]/review-submit`).
+ platform?: string;
+ identity?: string[] | string;
+ instance?: string;
};
+/**
+ * Review-submit formSheet, mounted by BOTH routes: the GitHub
+ * `[owner]/[repo]/[number]/review-submit` route and the provider
+ * `[platform]/[...identity]/review-submit` route (s6). The review events the
+ * sheet offers come from the server capability list on provider arms, so a
+ * GitLab MR never offers `request changes` (the provider has no such event).
+ */
export function PrReviewReviewSubmitScreen() {
const router = useRouter();
const colors = useThemeColors();
const { t } = useTranslation();
const params = useLocalSearchParams();
- const owner = parseParam(params.owner) ?? '';
- const repo = parseParam(params.repo) ?? '';
- const rawNumber = parseParam(params.number) ?? '';
+
+ // The provider route carries the identity segments; the GitHub route the
+ // plain triple. Exactly one parses — the provider layout redirects a
+ // hand-built `/pr-review/github/...` link to the GitHub route.
+ const providerRef = useMemo(
+ () =>
+ parseProviderPrRoute({
+ platform: params.platform,
+ identity: params.identity,
+ instance: params.instance,
+ }),
+ [params.platform, params.identity, params.instance]
+ );
+ const providerTriple = providerRef ? providerPrTriple(providerRef) : null;
+ const owner = providerTriple ? providerTriple.owner : (parseParam(params.owner) ?? '');
+ const repo = providerTriple ? providerTriple.repo : (parseParam(params.repo) ?? '');
+ const rawNumber = providerTriple
+ ? String(providerTriple.number)
+ : (parseParam(params.number) ?? '');
const number = Number.parseInt(rawNumber, 10);
+
const title = t('prReview.submit.submitReview');
- const eyebrow = `${owner}/${repo}#${rawNumber}`;
+ const eyebrow = providerRef ? providerPrRefLabel(providerRef) : `${owner}/${repo}#${rawNumber}`;
const dismiss = () => {
router.back();
};
+ // The scope the overview runs under: the layout publishes the provider
+ // scope in context; the GitHub route falls back to the parsed triple, so
+ // the GitHub query key is byte-identical to the pre-s6 one.
+ const scope = useProviderPrScope(
+ owner && repo && Number.isInteger(number) && number > 0
+ ? { owner, repo, number }
+ : { owner: '', repo: '', number: 0 }
+ );
+
const trpc = useTRPC();
- const pr = useQuery(
- trpc.githubPrReview.getPullRequest.queryOptions(
- { owner, repo, number },
- { enabled: Boolean(owner) && Boolean(repo) && Number.isInteger(number) && number > 0 }
- )
+ const overviewOptions = useMemo(() => buildPrOverviewQueryOptions(trpc, scope), [trpc, scope]);
+ const paramsValid = Boolean(owner) && Boolean(repo) && Number.isInteger(number) && number > 0;
+ const pr = useQuery({
+ ...overviewOptions,
+ enabled: paramsValid && isProviderScopeReady(scope),
+ });
+
+ // The server capability list, provider arms only. The github arm never
+ // touches the `providerReview` namespace (the GitHub path is unchanged):
+ // its query registers disabled and never fetches; the query also waits for
+ // a ready scope, so a Bitbucket PR without its organization waits instead
+ // of querying.
+ const isProviderArm = scope.ref.platform !== 'github';
+ // The options call sits directly in the body and the result is bound
+ // before `useQuery`: wrapped in a helper/useMemo closure the linter's
+ // inference loses the option type, and passed inline the type-checker's
+ // inference collapses every `.data` read. The data itself is read back
+ // through the seam's typed selector.
+ const capabilitiesOptions = trpc.providerReview.getCapabilities.queryOptions(
+ providerCapabilitiesIdentity(scope),
+ { enabled: isProviderArm && isProviderScopeReady(scope) }
);
+ const capabilities = useQuery(capabilitiesOptions);
+ const capabilitiesData = selectProviderCapabilitiesData(capabilities.data);
+
+ const capabilitiesReady = !isProviderArm || capabilitiesData !== undefined;
+ const capabilitiesFailed = isProviderArm && capabilities.isError;
- if (pr.data) {
+ if (pr.data && capabilitiesReady) {
return (
);
}
- const body: ReactNode = pr.isLoading ? (
-
-
-
- ) : (
- {
- void pr.refetch();
- }}
- isRetrying={pr.isFetching}
- />
- );
+ const body: ReactNode =
+ pr.isLoading || (isProviderArm && capabilities.isLoading) ? (
+
+
+
+ ) : (
+ {
+ if (capabilitiesFailed) {
+ void capabilities.refetch();
+ }
+ void pr.refetch();
+ }}
+ isRetrying={pr.isFetching || (isProviderArm && capabilities.isFetching)}
+ />
+ );
return (
<>
diff --git a/apps/mobile/src/components/pr-review/pr-review-screen.test.tsx b/apps/mobile/src/components/pr-review/pr-review-screen.test.tsx
index ae8f8c02c0..9e032e372d 100644
--- a/apps/mobile/src/components/pr-review/pr-review-screen.test.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-screen.test.tsx
@@ -18,6 +18,7 @@ import '@/i18n';
import type * as ReactI18next from 'react-i18next';
import { PrReviewScreen } from './pr-review-screen';
import { type PendingReviewItem } from '@/lib/pr-review/pending-review-provider';
+import { markRecentPrFailed, upsertRecentPr } from '@/lib/pr-review/recent-prs';
vi.mock('react-i18next', async importOriginal => {
const actual = await importOriginal();
@@ -43,6 +44,9 @@ vi.mock('react', async () => {
(initial: T) => [initial, vi.fn() as () => void] as [T, (value: T) => void]
),
useMemo: vi.fn((factory: () => T) => factory()),
+ // The provider scope context is only mounted by the provider route; the
+ // GitHub route reads the fallback triple, which a null context selects.
+ useContext: vi.fn(() => null),
useRef: vi.fn((initial: T) => {
const ref: React.RefObject = { current: initial };
return ref;
@@ -84,9 +88,12 @@ vi.mock('@tanstack/react-query', () => ({
vi.mock('@/components/ui/icons', () => ({
Check: () => null,
+ GitPullRequest: () => null,
Share: () => null,
}));
+vi.mock('@/components/empty-state', () => ({ EmptyState: 'EmptyState' }));
+
vi.mock('@/lib/hooks/use-theme-colors', () => ({
useThemeColors: () => ({
primaryForeground: '#FFFFFF',
@@ -98,8 +105,13 @@ vi.mock('@/lib/hooks/use-theme-colors', () => ({
vi.mock('@/lib/trpc', () => ({
useTRPC: () => ({
githubPrReview: {
- getPullRequest: { queryOptions: () => ({}), queryKey: () => [] },
- listChecks: { queryKey: () => [] },
+ getPullRequest: { queryOptions: () => ({ queryKey: [] }) },
+ listChecks: { queryOptions: () => ({ queryKey: [] }) },
+ },
+ providerReview: {
+ getPullRequest: { queryOptions: () => ({ queryKey: [] }) },
+ listChecks: { queryOptions: () => ({ queryKey: [] }) },
+ getMergeState: { queryOptions: () => ({ queryKey: [] }) },
},
githubApps: { getUserAuthorization: { queryKey: () => [] } },
}),
@@ -111,6 +123,7 @@ vi.mock('@/lib/pr-review/merge/merge-result-banner-store', () => ({
vi.mock('@/lib/pr-review/recent-prs', () => ({
upsertRecentPr: vi.fn(),
+ markRecentPrFailed: vi.fn(),
}));
vi.mock('@/components/screen-header', () => {
@@ -374,3 +387,116 @@ describe('PrReviewScreen Overview scrolling', () => {
expect((refresh.props as { onRefresh: unknown }).onRefresh).toEqual(expect.any(Function));
});
});
+
+// The recents store is keyed on `owner/repo#number` and its rows navigate to
+// the GitHub route, so only a GitHub pull request may be written there — a
+// GitLab MR filed under that key would send the user to a GitHub PR on the
+// way back. This describe is the only one that runs effects: the rest of the
+// file asserts render output, where the recents backfill is noise.
+describe('PrReviewScreen recents backfill per provider', () => {
+ const GITLAB_SCOPE = {
+ ref: { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 },
+ organizationId: null,
+ };
+
+ beforeEach(() => {
+ vi.mocked(upsertRecentPr).mockClear();
+ vi.mocked(markRecentPrFailed).mockClear();
+ vi.mocked(React.useEffect).mockImplementation((effect: React.EffectCallback) => {
+ effect();
+ });
+ });
+
+ afterEach(() => {
+ vi.mocked(React.useEffect).mockImplementation(() => undefined);
+ vi.mocked(React.useContext).mockReturnValue(null);
+ });
+
+ it('writes a recents entry for a loaded GitHub pull request', () => {
+ prQueryResult = {
+ data: { title: 'Fix the thing' },
+ isLoading: false,
+ isError: false,
+ isFetching: false,
+ };
+ // eslint-disable-next-line new-cap
+ PrReviewScreen({ owner: 'octocat', repo: 'hello', number: 7 });
+ expect(upsertRecentPr).toHaveBeenCalledWith(
+ expect.objectContaining({ owner: 'octocat', repo: 'hello', number: 7, lastResult: 'ok' })
+ );
+ });
+
+ it('marks the GitHub entry failed when the load errors', () => {
+ prQueryResult = { data: undefined, isLoading: false, isError: true, isFetching: false };
+ // eslint-disable-next-line new-cap
+ PrReviewScreen({ owner: 'octocat', repo: 'hello', number: 7 });
+ expect(markRecentPrFailed).toHaveBeenCalledWith({
+ owner: 'octocat',
+ repo: 'hello',
+ number: 7,
+ platform: 'github',
+ });
+ });
+
+ it('files a loaded GitLab merge request under its GitLab identity, never a GitHub triple', () => {
+ vi.mocked(React.useContext).mockReturnValue(GITLAB_SCOPE);
+ prQueryResult = {
+ data: { title: 'Bump the dep' },
+ isLoading: false,
+ isError: false,
+ isFetching: false,
+ };
+ // eslint-disable-next-line new-cap
+ PrReviewScreen({ owner: 'group/sub', repo: 'repo', number: 12 });
+ expect(upsertRecentPr).toHaveBeenCalledWith(
+ expect.objectContaining({
+ owner: 'group/sub',
+ repo: 'repo',
+ number: 12,
+ platform: 'gitlab',
+ title: 'Bump the dep',
+ lastResult: 'ok',
+ })
+ );
+ const written = vi.mocked(upsertRecentPr).mock.calls[0]?.[0];
+ expect(written?.platform).toBe('gitlab');
+ // No instance hint on the scope: no hint key on the entry.
+ expect(written && 'instanceHint' in written).toBe(false);
+ });
+
+ it('keeps the GitLab instance hint on the entry for identity and recents', () => {
+ vi.mocked(React.useContext).mockReturnValue({
+ ref: {
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ instanceHint: 'https://gl.acme.dev',
+ },
+ organizationId: null,
+ });
+ prQueryResult = {
+ data: { title: 'Bump the dep' },
+ isLoading: false,
+ isError: false,
+ isFetching: false,
+ };
+ // eslint-disable-next-line new-cap
+ PrReviewScreen({ owner: 'group/sub', repo: 'repo', number: 12 });
+ expect(upsertRecentPr).toHaveBeenCalledWith(
+ expect.objectContaining({ platform: 'gitlab', instanceHint: 'https://gl.acme.dev' })
+ );
+ });
+
+ it('marks a GitLab merge request failed on its own row, not the GitHub twin', () => {
+ vi.mocked(React.useContext).mockReturnValue(GITLAB_SCOPE);
+ prQueryResult = { data: undefined, isLoading: false, isError: true, isFetching: false };
+ // eslint-disable-next-line new-cap
+ PrReviewScreen({ owner: 'group/sub', repo: 'repo', number: 12 });
+ expect(markRecentPrFailed).toHaveBeenCalledWith({
+ owner: 'group/sub',
+ repo: 'repo',
+ number: 12,
+ platform: 'gitlab',
+ });
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/pr-review-screen.tsx b/apps/mobile/src/components/pr-review/pr-review-screen.tsx
index 0e021f10ab..909bf75376 100644
--- a/apps/mobile/src/components/pr-review/pr-review-screen.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-screen.tsx
@@ -1,7 +1,7 @@
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { type Href, useFocusEffect, useRouter } from 'expo-router';
-import { Check, Share as ShareIcon } from '@/components/ui/icons';
-import { type ReactNode, useCallback, useEffect, useRef, useState } from 'react';
+import { Check, GitPullRequest, Share as ShareIcon } from '@/components/ui/icons';
+import { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Pressable, Share, View } from 'react-native';
import { RefreshControl } from '@/components/ui/refresh-control';
@@ -10,17 +10,20 @@ import { PrMergePartialSuccessBanner } from '@/components/pr-review/merge/pr-mer
import { PrReviewDiscussionTab } from '@/components/pr-review/pr-review-discussion-tab';
import { PrReviewFilesTab } from '@/components/pr-review/pr-review-files-tab';
import { PrReviewOverview } from '@/components/pr-review/pr-review-overview';
+import { providerPrSheetHref } from '@/components/pr-review/pr-review-provider-sheet-href';
import {
type PrReviewTabId,
PrReviewTabSelector,
} from '@/components/pr-review/pr-review-tab-selector';
+import { EmptyState } from '@/components/empty-state';
import { ScreenHeader } from '@/components/screen-header';
import { Button } from '@/components/ui/button';
import { Text } from '@/components/ui/text';
import { consumeMergePartialSuccess } from '@/lib/pr-review/merge/merge-result-banner-store';
import { useThemeColors } from '@/lib/hooks/use-theme-colors';
+import { useProviderPrQueries } from '@/lib/pr-review/provider-pr-queries';
+import { providerPrTriple, providerPrWebUrl } from '@/lib/pr-review/provider-pr-ref';
import { markRecentPrFailed, upsertRecentPr } from '@/lib/pr-review/recent-prs';
-import { useTRPC } from '@/lib/trpc';
import { cn } from '@/lib/utils';
const REVIEW_SUBMIT_PATH = '/(app)/pr-review/[owner]/[repo]/[number]/review-submit' as const;
@@ -39,6 +42,12 @@ type PrReviewScreenProps = {
* - the recents title backfill (upsertRecentPr with the real title
* on the first successful `getPullRequest`).
*
+ * Provider parameterization (s5): the screen reads its identity from the
+ * provider scope published by the route (`useProviderPrQueries`), so the same
+ * tree renders a GitHub pull request, a GitLab merge request and a Bitbucket
+ * pull request. The `owner`/`repo`/`number` props stay the GitHub route's
+ * contract and are the fallback scope when no provider route is above.
+ *
* The screen intentionally fetches the PR DTO once and passes the
* `headSha` and `changedFiles` down to the Files tab so the placeholder
* can show useful info and S6b can drop in without a new fetch layer.
@@ -47,7 +56,7 @@ type PrReviewScreenProps = {
* `PrReviewOverview`.
*/
export function PrReviewScreen({ owner, repo, number }: PrReviewScreenProps) {
- const trpc = useTRPC();
+ const queries = useProviderPrQueries({ owner, repo, number });
const queryClient = useQueryClient();
const router = useRouter();
const colors = useThemeColors();
@@ -57,14 +66,16 @@ export function PrReviewScreen({ owner, repo, number }: PrReviewScreenProps) {
// P1-F-46b: push the review-submit route with the same params the
// Files-tab `PrDiffFloatingActions` uses, so a clean PR (no queued
- // comments) can still be approved from the Overview tab.
+ // comments) can still be approved from the Overview tab. On a provider
+ // arm the sheet is a sibling of the ref's own route (s6), so the push
+ // carries the provider identity through the provider route.
const openReviewSubmit = useCallback(() => {
- const href: Href = {
- pathname: REVIEW_SUBMIT_PATH,
- params: { owner, repo, number },
- };
+ const href: Href =
+ queries.ref.platform === 'github'
+ ? { pathname: REVIEW_SUBMIT_PATH, params: { owner, repo, number } }
+ : providerPrSheetHref(queries.ref, 'review-submit');
router.push(href);
- }, [router, owner, repo, number]);
+ }, [router, owner, repo, number, queries.ref]);
// P0-B-08: post-merge "branch delete failed" partial-success banner.
// The merge sheet writes the reason into the in-memory store right
@@ -85,26 +96,42 @@ export function PrReviewScreen({ owner, repo, number }: PrReviewScreenProps) {
// and pass `headSha` / `changedFiles` to the Files tab. The Overview
// re-uses the same query — tanstack-query dedupes by key, so this is
// a single network round-trip even though both components subscribe.
- const pr = useQuery(trpc.githubPrReview.getPullRequest.queryOptions({ owner, repo, number }));
+ const overviewOptions = queries.overviewOptions();
+ const pr = useQuery(overviewOptions);
// Recents backfill. This is the ONLY writer that creates an entry: a
// successful load upserts the real title with `lastResult: 'ok'`, which
// also clears any previous `'failed'` marker. A never-authorized PR
// (no successful load) never gets an entry.
+ //
+ // Every provider writes through the same triple — `providerPrTriple` splits
+ // the ref's project path at its last separator, and `providerRefFromRecentPr`
+ // folds it back — plus the platform and (GitLab) the instance hint, so the
+ // collision-free `recentPrKey` keeps one row per provider and per instance,
+ // and a row navigates back to the surface it was opened on.
+ const recentIdentity = useMemo(() => {
+ const triple = providerPrTriple(queries.ref);
+ const instanceHint = queries.ref.platform === 'gitlab' ? queries.ref.instanceHint : undefined;
+ return {
+ owner: triple.owner,
+ repo: triple.repo,
+ number: triple.number,
+ platform: queries.ref.platform,
+ ...(instanceHint ? { instanceHint } : {}),
+ };
+ }, [queries.ref]);
useEffect(() => {
const data = pr.data;
if (!data?.title) {
return;
}
void upsertRecentPr({
- owner,
- repo,
- number,
+ ...recentIdentity,
title: data.title,
lastOpenedAt: Date.now(),
lastResult: 'ok',
});
- }, [pr.data, owner, repo, number]);
+ }, [pr.data, recentIdentity]);
// Mark an existing recents entry as failed exactly once per error. The
// ref guards against re-writing on re-render; `markRecentPrFailed` is a
@@ -121,39 +148,43 @@ export function PrReviewScreen({ owner, repo, number }: PrReviewScreenProps) {
return;
}
markedFailedRef.current = true;
- void markRecentPrFailed({ owner, repo, number });
- }, [pr.isError, owner, repo, number]);
+ void markRecentPrFailed(recentIdentity);
+ }, [pr.isError, recentIdentity]);
// Share the PR's public GitHub URL via the native share sheet. The URL comes
// from the route params, so this works before the PR query resolves; the title
// is added once it is known. Fire-and-forget, like the invite-link share in
// `invited-member-row.tsx` — cancelling resolves with `dismissedAction`, and a
// sheet the platform refuses to present has no actionable recovery.
+ // Null on a GitLab ref reached without an instance hint: there is no host to
+ // build a public link from, so the affordance is hidden rather than sharing
+ // a link into some other instance's project.
+ const webUrl = providerPrWebUrl(queries.ref);
const sharePullRequest = useCallback(() => {
- const url = `https://github.com/${owner}/${repo}/pull/${number}`;
+ if (!webUrl) {
+ return;
+ }
const title = pr.data?.title;
- void Share.share({ message: title ? `${title}\n${url}` : url });
- }, [owner, repo, number, pr.data?.title]);
+ void Share.share({ message: title ? `${title}\n${webUrl}` : webUrl });
+ }, [webUrl, pr.data?.title]);
const handleRefresh = useCallback(() => {
void (async () => {
setRefreshing(true);
try {
const headSha = pr.data?.headSha;
+ // The keys are read off fresh builder calls rather than off the
+ // render-scope `overviewOptions`: a builder returns a new options
+ // object (and a new key array) every call, so closing over one would
+ // make this callback churn on every render for no behaviour change.
await Promise.all([
- queryClient.invalidateQueries({
- queryKey: trpc.githubPrReview.getPullRequest.queryKey({
- owner,
- repo,
- number,
- }),
- }),
+ queryClient.invalidateQueries({ queryKey: queries.overviewOptions().queryKey }),
// Only invalidate checks when we know the head SHA; invalidating with
// an empty ref would target a key that never matches the live query.
...(headSha
? [
queryClient.invalidateQueries({
- queryKey: trpc.githubPrReview.listChecks.queryKey({ owner, repo, ref: headSha }),
+ queryKey: queries.checksOptions(headSha).queryKey,
}),
]
: []),
@@ -162,10 +193,34 @@ export function PrReviewScreen({ owner, repo, number }: PrReviewScreenProps) {
setRefreshing(false);
}
})();
- }, [queryClient, trpc, owner, repo, number, pr.data?.headSha]);
+ }, [queryClient, queries, pr.data?.headSha]);
+
+ const isMergeRequest = queries.platform === 'gitlab';
+ // A first-load failure of the overview leaves the screen without a PR
+ // body: Submit review and share would open sheets or share a link for a
+ // merge request that never loaded, so they stay rendered (no header
+ // shift) but stop responding. The tabs are disabled for the same reason —
+ // their reads cannot succeed while the overview that gates them failed.
+ const loadFailed = pr.isError && pr.data === undefined;
+ // The review-submit sheet is a route sibling on every provider (s6), so
+ // the affordance is offered wherever its scope can actually be queried:
+ // a Bitbucket PR without a selected organization waits at the boundary
+ // instead of opening a sheet that cannot load.
+ const canSubmitReview = queries.isReady;
let body: ReactNode = null;
- if (tab === 'overview') {
+ if (!queries.isReady) {
+ // Non-retryable: Bitbucket Cloud review is organization-scoped and no
+ // organization is selected. Nothing on this screen can fix that, so the
+ // state names where the switch lives instead of offering a dead retry.
+ body = (
+
+ );
+ } else if (tab === 'overview') {
body = (
<>
{partialMergeReason ? : null}
@@ -207,26 +262,39 @@ export function PrReviewScreen({ owner, repo, number }: PrReviewScreenProps) {
return (
-
-
-
+ {webUrl ? (
+
+
+
+ ) : null}
{/* P1-F-46b: the Submit-review affordance is reachable from the
Overview tab (header right) and the Files tab (floating
action bar). The Discussion tab is intentionally left without
a submit affordance — comment threads there are read-only. */}
- {tab === 'overview' ? (
+ {tab === 'overview' && canSubmitReview ? (
@@ -237,13 +305,16 @@ export function PrReviewScreen({ owner, repo, number }: PrReviewScreenProps) {
}
/>
-
-
-
+ {queries.isReady ? (
+
+
+
+ ) : null}
{body}
);
diff --git a/apps/mobile/src/components/pr-review/pr-review-submit.test.tsx b/apps/mobile/src/components/pr-review/pr-review-submit.test.tsx
index 8039eff5ab..db1c769d51 100644
--- a/apps/mobile/src/components/pr-review/pr-review-submit.test.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-submit.test.tsx
@@ -1,9 +1,11 @@
+/* eslint-disable max-lines -- the submit suite covers queue retention, the footer preference, and the refused-submit wording wiring in one cohesive file */
/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (node env, no jsdom); see src/lib/pr-review/pending-review-provider.mounted.test.tsx */
/* eslint-disable require-await, @typescript-eslint/require-await -- the fake mutation and drafts factories settle without await because they resolve immediately */
import TestRenderer, { act } from 'react-test-renderer';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { PrReviewSubmit } from './pr-review-submit';
+import { type ProviderPrRef } from '@/lib/pr-review/provider-pr-ref';
import {
type PendingReviewItem,
PendingReviewProvider,
@@ -12,6 +14,7 @@ import {
const submitMutationMock = vi.hoisted(() => ({
mutateAsync: vi.fn(async (): Promise => undefined),
+ error: null as Error | null,
}));
const feedbackMock = vi.hoisted(() => ({
@@ -22,8 +25,42 @@ vi.mock('@/lib/pr-review/use-pr-review-mutations', () => ({
useSubmitReviewMutation: () => ({
mutateAsync: submitMutationMock.mutateAsync,
isPending: false,
- error: null,
+ error: submitMutationMock.error,
}),
+ // Mirrors the real mapper (pure field routing, tested in
+ // use-pr-review-mutations.test.ts): anchored items ride the `comments`
+ // batch, an item without a side keeps the text-anchored body fallback.
+ buildProviderSubmitInput: (
+ summary: string,
+ items: readonly {
+ path: string;
+ side?: 'LEFT' | 'RIGHT';
+ line: number;
+ startLine?: number;
+ body: string;
+ }[]
+ ) => {
+ const comments: {
+ path: string;
+ side: 'LEFT' | 'RIGHT';
+ line: number;
+ startLine?: number;
+ body: string;
+ }[] = [];
+ const folded: string[] = [];
+ for (const item of items) {
+ if (item.side === undefined) {
+ folded.push(`${item.path}:L${item.line}\n\n${item.body}`);
+ } else {
+ const { path, side, line, startLine, body } = item;
+ comments.push({ path, side, line, startLine, body });
+ }
+ }
+ return {
+ body: [summary.trim(), ...folded].filter(part => part.length > 0).join('\n\n'),
+ comments,
+ };
+ },
}));
const footerPreferenceMock = vi.hoisted(() => ({
@@ -147,7 +184,13 @@ function Consumer() {
const SUBMIT_TITLE = 'Submit review';
-function mount(): TestRenderer.ReactTestRenderer {
+const GITLAB_REF: ProviderPrRef = {
+ platform: 'gitlab',
+ projectPath: 'acme/kilo',
+ mrIid: 42,
+};
+
+function mount(prRef?: ProviderPrRef): TestRenderer.ReactTestRenderer {
let renderer: TestRenderer.ReactTestRenderer | undefined = undefined;
act(() => {
renderer = TestRenderer.create(
@@ -160,6 +203,7 @@ function mount(): TestRenderer.ReactTestRenderer {
headSha="head-1"
title={SUBMIT_TITLE}
eyebrow="acme/kilo#42"
+ prRef={prRef}
onDismiss={vi.fn(() => undefined)}
/>
@@ -212,6 +256,7 @@ beforeEach(() => {
addCommentFn = null;
submitMutationMock.mutateAsync.mockReset();
submitMutationMock.mutateAsync.mockResolvedValue(undefined);
+ submitMutationMock.error = null;
feedbackMock.maybeAskAfterSuccessfulOutcome.mockReset();
feedbackMock.maybeAskAfterSuccessfulOutcome.mockResolvedValue(undefined);
footerPreferenceMock.hasLoaded = true;
@@ -309,3 +354,144 @@ describe('PrReviewSubmit footer preference', () => {
expect(findSubmitButton(renderer).disabled).toBe(true);
});
});
+
+// ── c3: provider arm submits anchored comments ───────────────────────
+
+describe('PrReviewSubmit provider arm (c3)', () => {
+ const ITEM_FRESH_RANGE: PendingReviewItem = {
+ id: 'fresh-r',
+ path: 'src/r.ts',
+ side: 'LEFT',
+ line: 8,
+ startLine: 5,
+ body: 'R',
+ commitSha: 'head-1',
+ };
+
+ it('submits fresh pending items as a real anchored comments batch', async () => {
+ const renderer = mount(GITLAB_REF);
+
+ act(() => {
+ addCommentFn?.(ITEM_FRESH_A);
+ addCommentFn?.(ITEM_FRESH_B);
+ addCommentFn?.(ITEM_STALE);
+ });
+ act(() => {
+ submitOnPress(renderer)();
+ });
+ await flush();
+
+ // The tapped positions ride the `comments` batch (event + items, no
+ // summary typed); stale items are never sent and stay queued.
+ expect(submitMutationMock.mutateAsync).toHaveBeenCalledWith({
+ event: 'comment',
+ comments: [
+ { path: 'src/a.ts', side: 'RIGHT', line: 1, body: 'A' },
+ { path: 'src/b.ts', side: 'RIGHT', line: 2, body: 'B' },
+ ],
+ });
+ expect(latestItems.map(item => item.id)).toEqual(['stale-c']);
+ });
+
+ it('carries a multi-line range into the comment item', async () => {
+ const renderer = mount(GITLAB_REF);
+
+ act(() => {
+ addCommentFn?.(ITEM_FRESH_RANGE);
+ });
+ act(() => {
+ submitOnPress(renderer, 'Submit review')();
+ });
+ await flush();
+
+ expect(submitMutationMock.mutateAsync).toHaveBeenCalledWith({
+ event: 'comment',
+ comments: [{ path: 'src/r.ts', side: 'LEFT', line: 8, startLine: 5, body: 'R' }],
+ });
+ });
+
+ it('posts the summary alone when nothing is queued (empty state, no comments key)', async () => {
+ footerPreferenceMock.prReviewFooter = true;
+ const renderer = mount(GITLAB_REF);
+
+ act(() => {
+ submitOnPress(renderer, 'Submit review')();
+ });
+ await flush();
+
+ expect(submitMutationMock.mutateAsync).toHaveBeenCalledWith({
+ event: 'comment',
+ body: '---\nReviewed via the [Kilo iOS app](https://apps.apple.com/app/id6761193135)',
+ });
+ });
+
+ it('keeps the summary as the review body beside the anchored batch', async () => {
+ footerPreferenceMock.prReviewFooter = true;
+ const renderer = mount(GITLAB_REF);
+
+ act(() => {
+ addCommentFn?.(ITEM_FRESH_A);
+ });
+ act(() => {
+ submitOnPress(renderer, 'Submit review')();
+ });
+ await flush();
+
+ expect(submitMutationMock.mutateAsync).toHaveBeenCalledWith({
+ event: 'comment',
+ body: '---\nReviewed via the [Kilo iOS app](https://apps.apple.com/app/id6761193135)',
+ comments: [{ path: 'src/a.ts', side: 'RIGHT', line: 1, body: 'A' }],
+ });
+ });
+});
+
+// ── s6f: refused-submit wording ──────────────────────────────────────
+
+/** Every string the mounted tree rendered inside a Text element. */
+function renderedTexts(renderer: TestRenderer.ReactTestRenderer): string[] {
+ return renderer.root
+ .findAll(node => typeof node.props.children === 'string')
+ .map(node => node.props.children as string);
+}
+
+function badRequestError(): Error {
+ return Object.assign(new Error('You cannot perform the requested action'), {
+ data: { code: 'BAD_REQUEST' },
+ });
+}
+
+describe('PrReviewSubmit refused-submit wording (s6f)', () => {
+ it('words a rejected provider submit after the merge-request noun', () => {
+ submitMutationMock.error = badRequestError();
+ const renderer = mount(GITLAB_REF);
+ const texts = renderedTexts(renderer);
+ // A rejected review submit on a GitLab merge request must never read
+ // "your own pull request".
+ expect(
+ texts.some(
+ text =>
+ text ===
+ "This review can't be submitted as is. The merge request may have changed, or you can't review your own merge request."
+ )
+ ).toBe(true);
+ expect(
+ texts.some(
+ text =>
+ text ===
+ "This review can't be submitted as is. The PR may have changed, or you can't review your own pull request."
+ )
+ ).toBe(false);
+ });
+
+ it('keeps the exact pre-s6 submit copy on the GitHub arm', () => {
+ submitMutationMock.error = badRequestError();
+ const renderer = mount();
+ expect(
+ renderedTexts(renderer).some(
+ text =>
+ text ===
+ "This review can't be submitted as is. The PR may have changed, or you can't review your own pull request."
+ )
+ ).toBe(true);
+ });
+});
diff --git a/apps/mobile/src/components/pr-review/pr-review-submit.tsx b/apps/mobile/src/components/pr-review/pr-review-submit.tsx
index 70163eee46..1357e1e8ee 100644
--- a/apps/mobile/src/components/pr-review/pr-review-submit.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-submit.tsx
@@ -17,11 +17,15 @@ import {
InteractionManager,
Keyboard,
Platform,
+ Pressable,
ScrollView,
type TextInput,
View,
} from 'react-native';
+import { RadioGroup, radioItemA11y } from '@/components/ui/radio-group';
+import { cn } from '@/lib/utils';
+
import {
PrFormSheetFooter,
PrFormSheetHeader,
@@ -44,14 +48,21 @@ import {
reviewSubmitBlockReason,
} from '@/lib/pr-review/build-submit-review-input';
import { PrReviewReconnectNotice } from '@/components/pr-review/pr-review-reconnect-notice';
+import { providerPrNounKey } from '@/components/pr-review/pr-review-provider-noun';
import { ensureTermsAcceptedOutcome } from '@/components/pr-review/discussion/reply-input';
import { i18n } from '@/i18n';
import { formatNumber } from '@/lib/format';
import { classifyPrReviewMutationError } from '@/lib/pr-review/classify-pr-review-query-state';
import { mutationErrorDisplay } from '@/lib/pr-review/mutation-error-display';
+import {
+ buildProviderSubmitInput,
+ type ProviderReviewEventOption,
+ useSubmitReviewMutation,
+} from '@/lib/pr-review/use-pr-review-mutations';
import { type PendingReviewItem, usePendingReview } from '@/lib/pr-review/pending-review-provider';
import { partitionPendingItems } from '@/lib/pr-review/partition-pending-items';
-import { useSubmitReviewMutation } from '@/lib/pr-review/use-pr-review-mutations';
+import { providerPrSheetHref } from '@/components/pr-review/pr-review-provider-sheet-href';
+import { type ProviderPrRef } from '@/lib/pr-review/provider-pr-ref';
import { useCurrentUserId } from '@/lib/hooks/use-current-user-id';
import { usePrReviewFooterPreference } from '@/lib/hooks/use-pr-review-footer-preference';
import { maybeAskAfterSuccessfulOutcome } from '@/lib/feedback';
@@ -63,6 +74,83 @@ import {
const COMMENT_COMPOSER_PATH = '/(app)/pr-review/[owner]/[repo]/[number]/comment-composer' as const;
+/** The review event a provider `submitReview` input accepts, per chip event. */
+const EVENT_TO_PROVIDER = {
+ APPROVE: 'approve',
+ REQUEST_CHANGES: 'request_changes',
+ COMMENT: 'comment',
+} satisfies Record;
+
+/** The chip label for one capability review event. */
+const PROVIDER_EVENT_LABEL_KEYS = {
+ approve: 'common.approve',
+ request_changes: 'prReview.eventChips.requestChanges',
+ comment: 'prReview.eventChips.comment',
+} satisfies Record;
+
+/**
+ * Event chips driven by the server capability list (s6). The shared
+ * `ReviewEventChips` renders GitHub's three fixed options; on provider arms
+ * the capability list decides what is offered — a GitLab MR never offers
+ * request changes — so this renders only the events the provider accepts.
+ */
+function CapabilityReviewEventChips(props: {
+ events: readonly ProviderReviewEventOption[];
+ value: ReviewEvent;
+ disabled: boolean;
+ onChange: (next: ReviewEvent) => void;
+}) {
+ const { t } = useTranslation();
+ return (
+
+
+ {t('prReview.eventChips.label')}
+
+
+ {props.events.map(providerEvent => {
+ const event = (Object.keys(EVENT_TO_PROVIDER) as ReviewEvent[]).find(
+ candidate => EVENT_TO_PROVIDER[candidate] === providerEvent
+ );
+ if (!event) {
+ return null;
+ }
+ const active = props.value === event;
+ return (
+ {
+ void Haptics.selectionAsync();
+ props.onChange(event);
+ }}
+ {...radioItemA11y({
+ label: t(PROVIDER_EVENT_LABEL_KEYS[providerEvent]),
+ checked: active,
+ disabled: props.disabled,
+ })}
+ className={cn(
+ 'min-h-11 items-center justify-center rounded-full border px-4 py-2 active:opacity-70',
+ active ? 'border-primary bg-primary' : 'bg-secondary',
+ !active && (props.disabled ? 'border-hair-soft' : 'border-border')
+ )}
+ >
+
+ {t(PROVIDER_EVENT_LABEL_KEYS[providerEvent])}
+
+
+ );
+ })}
+
+
+ );
+}
+
type PrReviewSubmitProps = Readonly<{
owner: string;
repo: string;
@@ -70,15 +158,28 @@ type PrReviewSubmitProps = Readonly<{
headSha: string;
title: string;
eyebrow: string;
+ /**
+ * The provider ref (s6). Present on the GitLab/Bitbucket surface: the
+ * submit posts one `providerReview.submitReview` event whose fresh pending
+ * comments ride the real inline `comments` batch (c3), and the
+ * pending-comment edit route is the ref's own. Absent on GitHub, which
+ * keeps the exact pre-s6 path.
+ */
+ prRef?: ProviderPrRef;
+ /**
+ * The review events the server capability list accepts (provider arms).
+ * Absent on GitHub, which keeps the fixed three-option chip row.
+ */
+ reviewEvents?: readonly ProviderReviewEventOption[];
onDismiss: () => void;
}>;
export function PrReviewSubmit(props: PrReviewSubmitProps) {
- const { owner, repo, number, headSha, title, eyebrow, onDismiss } = props;
+ const { owner, repo, number, headSha, title, eyebrow, prRef, reviewEvents, onDismiss } = props;
const router = useRouter();
const pending = usePendingReview();
const { t } = useTranslation();
- const submitReview = useSubmitReviewMutation({ owner, repo, number });
+ const submitReview = useSubmitReviewMutation(prRef ?? { owner, repo, number });
const { userId } = useCurrentUserId();
const { prReviewFooter, hasLoaded: prReviewFooterLoaded } = usePrReviewFooterPreference();
@@ -108,6 +209,10 @@ export function PrReviewSubmit(props: PrReviewSubmitProps) {
const isSubmitting = submitReview.isPending;
const queuedCount = pending.items.length;
+ // The provider platform as a stable primitive: the error effect words a
+ // rejected submit after the connected provider (s6f) without depending on
+ // the `prRef` object identity.
+ const providerPlatform = prRef?.platform;
const { fresh, stale } = partitionPendingItems(pending.items, headSha);
const staleIds = new Set(stale.map(item => item.id));
const blockReason = reviewSubmitBlockReason({
@@ -142,11 +247,17 @@ export function PrReviewSubmit(props: PrReviewSubmitProps) {
})();
return;
}
- const display = mutationErrorDisplay('submit', classification, submitReview.error);
+ // The provider arm words the rejected submit after the connected
+ // provider (merge request vs pull request); GitHub rides no term and
+ // keeps the exact pre-s6 copy.
+ const display = mutationErrorDisplay('submit', classification, {
+ rawError: submitReview.error,
+ term: providerPlatform ? i18n.t(providerPrNounKey(providerPlatform)) : undefined,
+ });
setInlineError(display.message);
setInlineErrorKind(display.kind);
}
- }, [submitReview.error]);
+ }, [submitReview.error, providerPlatform]);
useEffect(() => {
const sub = Keyboard.addListener('keyboardDidShow', () => {
@@ -182,16 +293,27 @@ export function PrReviewSubmit(props: PrReviewSubmitProps) {
}
try {
const body = bodyRef.current.trim();
+ // Provider arms post one event with a real inline batch (c3): every
+ // fresh pending comment rides `comments` anchored at its tapped diff
+ // position, and the summary stays the review body. An item without an
+ // anchor keeps the text-anchored body fallback.
+ const provider = buildProviderSubmitInput(body, fresh);
await submitReview.mutateAsync(
- buildSubmitReviewInput({
- owner,
- repo,
- number,
- event,
- ...(body.length > 0 ? { body } : {}),
- commitSha: headSha,
- items: fresh,
- })
+ prRef
+ ? {
+ event: EVENT_TO_PROVIDER[event],
+ ...(provider.body.length > 0 ? { body: provider.body } : {}),
+ ...(provider.comments.length > 0 ? { comments: provider.comments } : {}),
+ }
+ : buildSubmitReviewInput({
+ owner,
+ repo,
+ number,
+ event,
+ ...(body.length > 0 ? { body } : {}),
+ commitSha: headSha,
+ items: fresh,
+ })
);
pending.removeComments(fresh.map(item => item.id));
void Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);
@@ -214,6 +336,20 @@ export function PrReviewSubmit(props: PrReviewSubmitProps) {
}
function openEditComposer(item: PendingReviewItem) {
+ if (prRef) {
+ // The pending comment edits through the ref's own composer route, so
+ // the composer stays inside the scope its queries run under.
+ router.push(
+ providerPrSheetHref(prRef, 'comment-composer', {
+ path: item.path,
+ side: item.side,
+ line: String(item.line),
+ ...(item.startLine !== undefined ? { startLine: String(item.startLine) } : {}),
+ pendingId: item.id,
+ })
+ );
+ return;
+ }
const href: Href = {
pathname: COMMENT_COMPOSER_PATH,
params: {
@@ -286,14 +422,26 @@ export function PrReviewSubmit(props: PrReviewSubmitProps) {
keyboardDismissMode="interactive"
>
- {
- setEvent(next);
- clearRecoverableError();
- }}
- />
+ {reviewEvents ? (
+ {
+ setEvent(next);
+ clearRecoverableError();
+ }}
+ />
+ ) : (
+ {
+ setEvent(next);
+ clearRecoverableError();
+ }}
+ />
+ )}
{t('prReview.submit.summaryOptional')}
diff --git a/apps/mobile/src/components/pr-review/pr-review-tab-selector.tsx b/apps/mobile/src/components/pr-review/pr-review-tab-selector.tsx
index ac71ab5522..78bf8fecde 100644
--- a/apps/mobile/src/components/pr-review/pr-review-tab-selector.tsx
+++ b/apps/mobile/src/components/pr-review/pr-review-tab-selector.tsx
@@ -24,6 +24,12 @@ type PrReviewTabSelectorProps = {
* while the PR query is still loading, which draws no badge.
*/
discussionCount?: number;
+ /**
+ * Disables every tab while the PR body is in a failed load state: the
+ * tabs' own reads cannot succeed while the overview that gates them
+ * failed, so the row stays at its size but stops switching.
+ */
+ disabled?: boolean;
};
/**
@@ -36,6 +42,7 @@ export function PrReviewTabSelector({
activeTab,
onChange,
discussionCount,
+ disabled = false,
}: PrReviewTabSelectorProps) {
const { t } = useTranslation();
return (
@@ -50,7 +57,8 @@ export function PrReviewTabSelector({
{
if (active) {
return;
@@ -60,7 +68,8 @@ export function PrReviewTabSelector({
}}
className={cn(
'flex-1 items-center justify-center rounded-md py-2 active:opacity-70',
- active && 'bg-card shadow-sm shadow-[#0000000D]'
+ active && 'bg-card shadow-sm shadow-[#0000000D]',
+ disabled && 'opacity-60'
)}
>
diff --git a/apps/mobile/src/components/pr-review/recent-pr-row-state.test.ts b/apps/mobile/src/components/pr-review/recent-pr-row-state.test.ts
deleted file mode 100644
index 9a16af0c47..0000000000
--- a/apps/mobile/src/components/pr-review/recent-pr-row-state.test.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { describe, expect, it } from 'vitest';
-
-import { selectRecentPrRowState } from './recent-pr-row-state';
-import { type RecentPr } from '@/lib/pr-review/recent-prs';
-
-function makeRecent(overrides: Partial = {}): RecentPr {
- return {
- owner: 'octocat',
- repo: 'hello-world',
- number: 42,
- title: 'Hello PR',
- lastOpenedAt: 1_700_000_000_000,
- ...overrides,
- };
-}
-
-describe('selectRecentPrRowState', () => {
- it('uses the title as primary and the identity as secondary', () => {
- expect(selectRecentPrRowState(makeRecent({ title: 'Hello PR' }))).toEqual({
- primary: 'Hello PR',
- secondary: 'octocat/hello-world#42',
- failed: false,
- });
- });
-
- it('drops the secondary line when the title is empty (no duplicate)', () => {
- expect(selectRecentPrRowState(makeRecent({ title: '' }))).toEqual({
- primary: 'octocat/hello-world#42',
- secondary: null,
- failed: false,
- });
- });
-
- it('marks a failed entry', () => {
- expect(selectRecentPrRowState(makeRecent({ lastResult: 'failed' }))).toEqual({
- primary: 'Hello PR',
- secondary: 'octocat/hello-world#42',
- failed: true,
- });
- });
-
- it('treats a missing lastResult as ok', () => {
- expect(selectRecentPrRowState(makeRecent()).failed).toBe(false);
- });
-});
diff --git a/apps/mobile/src/components/pr-review/recent-pr-row-state.ts b/apps/mobile/src/components/pr-review/recent-pr-row-state.ts
deleted file mode 100644
index 806037cfb1..0000000000
--- a/apps/mobile/src/components/pr-review/recent-pr-row-state.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-// Pure row-state selection for a recents entry. Extracted so the
-// duplicated fallback line (title-less entries printing the identity
-// twice) and the failed-entry marker are unit-tested.
-
-import { type RecentPr } from '@/lib/pr-review/recent-prs';
-
-export type RecentPrRowState = {
- /** Title when non-empty, else the identity line. */
- primary: string;
- /** The identity line, or null when it would repeat `primary`. */
- secondary: string | null;
- /** True when the entry's last load attempt failed. */
- failed: boolean;
-};
-
-export function selectRecentPrRowState(entry: RecentPr): RecentPrRowState {
- const identity = `${entry.owner}/${entry.repo}#${entry.number}`;
- const primary = entry.title.length > 0 ? entry.title : identity;
- return {
- primary,
- secondary: primary === identity ? null : identity,
- failed: entry.lastResult === 'failed',
- };
-}
diff --git a/apps/mobile/src/i18n/locales/af.json b/apps/mobile/src/i18n/locales/af.json
index 1ef9c7a489..7238acf401 100644
--- a/apps/mobile/src/i18n/locales/af.json
+++ b/apps/mobile/src/i18n/locales/af.json
@@ -36,6 +36,7 @@
"cost": "Koste",
"discard": "Gooi weg",
"findings": "Bevindings",
+ "mergeRequest": "merge request",
"notConnected": "Nie gekoppel nie",
"notifications": "Kennisgewings",
"pullRequest": "trekversoek",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Leë ry in die verskille"
},
"connectionExpired": "Die GitHub-verbinding het verval.",
+ "capabilities": {
+ "banner": {
+ "title": "Nie beskikbaar by hierdie verskaffer nie",
+ "accessibility": "Nie beskikbaar by hierdie verskaffer nie: {{reason}}"
+ }
+ },
"merge": {
"merge": "Samevoeging",
"mergeNow": "Voeg nou saam",
"mergePullRequest": "Voeg trekversoek saam",
+ "mergeTermTitle": "Voeg {{term}} saam",
"enableAutoMerge": "Aktiveer outomatiese samevoeging",
"disableAutoMerge": "Deaktiveer outomatiese samevoeging",
"autoMergeOn": "Outomatiese samevoeging is aan",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Skrap die tak ná samevoeging",
"noEnabledMethods": "Geen samevoegingsmetodes is vir hierdie bewaarplek geaktiveer nie. Vra 'n administrateur van die bewaarplek om gewone samevoeging, saampersing of herbasering te aktiveer.",
"confirmTitle": "Voeg trekversoek saam?",
+ "confirmTitleTerm": "Voeg {{term}} saam?",
"confirmMessage": "Dit sal jou veranderings met die basistak saamvoeg.",
"enableAutoMergeConfirmTitle": "Aktiveer outomatiese samevoeging?",
"enableAutoMergeConfirmMessage": "GitHub sal hierdie trekversoek outomaties saamvoeg wanneer alle vereiste kontroles slaag.",
+ "enableAutoMergeConfirmMessageTerm": "Sodra die pipeline slaag, word die {{term}} outomaties saamgevoeg.",
+ "enableAutoMergeDescriptionTerm": "GitLab voeg hierdie {{term}} outomaties saam sodra die pipeline slaag.",
"forbidden": "Jy het nie toestemming om hierdie trekversoek saam te voeg nie.",
"cannotMerge": "Hierdie trekversoek kan nie in sy huidige vorm saamgevoeg word nie.",
"couldNotMerge": "Kon nie die trekversoek saamvoeg nie.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Reeds saamgevoeg",
- "closed": "Hierdie trekversoek is gesluit"
+ "closed": "Hierdie trekversoek is gesluit",
+ "closedMergeRequest": "Hierdie merge request is gesluit"
},
"partialSuccessBanner": {
"body": "Kon nie die tak skrap nie: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Hierdie trekversoek kan nog nie saamgevoeg word nie",
"notMergeableDetail": "GitHub het die samevoegingstatus as {{state}} aangegee."
},
+ "restrictions": {
+ "title": "Saamvoegbeperkings",
+ "approvalsRequired_one": "{{displayCount}} goedkeuring vereis",
+ "approvalsRequired_other": "{{displayCount}} goedkeurings vereis",
+ "pipelineMustSucceed": "Die pipeline moet slaag voordat saamgevoeg kan word."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Die pipeline misluk by die laaste commit.",
+ "pendingPipeline": "Die pipeline hardloop nog by die laaste commit.",
+ "permission": "Jy het nie toestemming om hierdie {{term}} saam te voeg nie.",
+ "draft": "Merk die {{term}} as gereed vir hersiening voordat jy saamvoeg."
+ },
"methodLabels": {
"merge": "Skep 'n samevoegingsvaslegging",
"squash": "Pers saam en voeg saam",
@@ -448,6 +472,7 @@
"acceptTerms": "Aanvaar",
"replyBadRequest": "Hierdie antwoord kan nie geplaas word nie. Die draad het dalk verander.",
"replyForbidden": "Jy het nie toestemming om op hierdie trekversoek te antwoord nie.",
+ "replyForbiddenTerm": "Jy het nie toestemming om op hierdie {{term}} te antwoord nie.",
"moderation": {
"reportContent": {
"terminal": "Hierdie kommentaar kan nie gerapporteer word nie.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Hersien trekversoek",
"headLine": "{{counts}} · jongste vaslegging {{sha}}",
"entry": {
- "eyebrow": "Maak 'n trekversoek met sy URL oop.",
- "pastePrLink": "Plak 'n PR-skakel",
- "noRecentPrs": "Geen onlangse PR's nie",
- "noRecentPrsDescription": "Plak hierbo 'n PR-skakel om 'n hersiening te begin — dit sal volgende keer hier verskyn.",
+ "eyebrow": "Maak 'n trekversoek of merge request met sy URL oop",
+ "pastePrLink": "Plak 'n trekversoek- of merge request-skakel",
+ "noRecentPrs": "Geen onlangse hersieninge nie",
+ "noRecentPrsDescription": "Plak hierbo 'n skakel om 'n hersiening te begin — dit sal volgende keer hier verskyn.",
"couldNotLoad": "Kon nie laai nie.",
"removeFromRecentsTitle": "Verwyder uit onlangse trekversoeke?",
- "removeFromRecentsMessage": "Hierdie trekversoek sal uit jou lys van onlangse trekversoeke verwyder word.",
+ "removeFromRecentsMessage": "Hierdie hersiening sal uit jou onlangse lys verwyder word.",
"removeRecentAccessibility": "Verwyder {{repo}} uit onlangse trekversoeke",
- "urlAccessibility": "GitHub-trekversoek-URL",
- "clearLink": "Vee die trekversoekskakel uit",
- "pasteLink": "Plak trekversoekskakel",
+ "urlAccessibility": "Voer 'n trekversoek- of merge request-URL in",
+ "urlPlaceholder": "Trekversoek- of merge request-URL",
+ "openAccessibility": "Maak trekversoek of merge request oop",
+ "clearLink": "Vee die skakel uit",
+ "pasteLink": "Plak trekversoek- of merge request-skakel",
"open": "Oop"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Kon nie die GitHub-verbinding kontroleer nie.",
"checkFailedMessage": "Die aanmeldstatus is nie beskikbaar voordat hierdie inligting gelaai is nie.",
+ "checkFailedTitleGitLab": "Kon nie die GitLab-verbinding kontroleer nie.",
+ "checkFailedTitleBitbucket": "Kon nie die Bitbucket-verbinding kontroleer nie.",
+ "providerCheckFailedMessage": "Verbindingsstatus is nie beskikbaar voordat die laai voltooi is nie.",
"reconnectTitle": "Koppel GitHub weer",
"reconnectDescription": "Jou GitHub-verbinding is herroep. Koppel weer om steeds trekversoeke op jou foon te kan hersien.",
- "description": "Koppel jou GitHub-rekening om trekversoeke op jou foon te hersien."
+ "description": "Koppel jou GitHub-rekening om trekversoeke op jou foon te hersien.",
+ "gitlabDescription": "Koppel jou GitLab-rekening om merge requests op jou foon te hersien.",
+ "bitbucketDescription": "Koppel Bitbucket aan hierdie organisasie om trekversoeke op jou foon te hersien.",
+ "bitbucketOrgOnlyDescription": "Kies 'n organisasie in jou profiel om sy Bitbucket-trekversoeke te hersien."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Die GitHub-verbinding het verval.",
- "message": "Jou GitHub-verbinding is nie meer geldig nie. Kontroleer jou verbinding weer — jy sal gevra word om weer te koppel indien nodig."
+ "message": "Jou GitHub-verbinding is nie meer geldig nie. Kontroleer jou verbinding weer — jy sal gevra word om weer te koppel indien nodig.",
+ "gitlabTitle": "Die GitLab-verbinding het verval.",
+ "bitbucketTitle": "Die Bitbucket-verbinding het verval.",
+ "providerMessage": "Jou {{provider}}-verbinding is nie meer geldig nie. Kontroleer jou verbinding weer — jy sal gevra word om weer te koppel indien nodig."
},
"eventChips": {
"comment": "Kommentaar",
@@ -643,6 +679,21 @@
"files": "Lêers",
"discussion": "Bespreking"
},
+ "terms": {
+ "pullRequest": "Trekversoek",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Deel merge request",
+ "viewOnProvider": "Bekyk op {{provider}}",
+ "mergeRequestUnavailable": "Merge request onbeskikbaar",
+ "unavailableDescription": "Dit is dalk uitgevee, of jy het nie toegang daartoe nie.",
+ "accessDeniedMergeRequest": "Jy het nie toestemming om hierdie merge request te bekyk nie.",
+ "couldNotLoadMergeRequest": "Kon nie die merge request laai nie.",
+ "discussionAccessDenied": "Jy het nie toestemming om hierdie merge request se bespreking te bekyk nie.",
+ "discussionUnavailableMessage": "Hierdie merge request is dalk verwyder.",
+ "noDiscussionDescription": "Daar is nog geen hersieningsdrade of gesprekskommentare op hierdie merge request nie.",
+ "noFilesChangedDescription": "Hierdie merge request het geen lêerveranderings nie."
+ },
"fileStatus": {
"modified": "Gewysig",
"renamed": "Hernoem",
@@ -659,7 +710,7 @@
"emptyLine": "(leeg)"
},
"linkPasteClipboardEmpty": "Die knipbord is leeg.",
- "linkPasteNotAPullRequest": "Dit is nie 'n skakel na 'n GitHub-trekversoek nie.",
+ "linkPasteNotAPullRequest": "Dit is nie 'n skakel na 'n trekversoek of merge request nie",
"announce": {
"commentPosted": "Kommentaar geplaas",
"reviewSubmitted": "Hersiening ingedien",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Hierdie kommentaar kan nie geplaas word nie. Die gekose reël het dalk verander, of die PR is dalk bygewerk.",
"reviewNotSubmitted": "Hierdie hersiening kan nie in sy huidige vorm ingedien word nie. Die PR het dalk verander, of jy probeer dalk jou eie trekversoek hersien, wat nie toegelaat word nie.",
+ "reviewNotSubmittedTerm": "Hierdie hersiening kan nie in sy huidige vorm ingedien word nie. Die {{term}} het dalk verander, of jy kan nie jou eie {{term}} hersien nie.",
"couldNotPostComment": "Kon nie kommentaar plaas nie.",
"couldNotSubmitReview": "Kon nie die hersiening indien nie. Kontroleer jou verbinding en probeer weer."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Die antwoord kon nie gestuur word nie.",
"couldNotCompleteAction": "Kon nie hierdie aksie voltooi nie.",
"mergeResultDefaultError": "GitHub het nie die samevoeging voltooi nie.",
+ "mergeResultNotCompleted": "Die {{term}} is nie saamgevoeg nie. Gaan sy status na en probeer weer.",
"ambiguous": "Kon nie bevestig nie — kyk na die PR voordat jy weer probeer.",
"persistenceFailed": "Ons kon nie hierdie aksie aanteken nie. Probeer asseblief later weer.",
"forbidden": "Toegang is verbode."
@@ -1988,11 +2041,31 @@
"retryConnection": "Probeer weer koppel"
},
"newSession": {
+ "recentlyUsed": "Onlangs gebruik",
+ "couldNotLoadGithubRepositories": "Die GitHub-bewaarplekke kon nie gelaai word nie.",
+ "couldNotLoadGitlabRepositories": "Die GitLab-bewaarplekke kon nie gelaai word nie.",
+ "couldNotLoadBitbucketRepositories": "Die Bitbucket-bewaarplekke kon nie gelaai word nie.",
"connectGithubDescription": "Koppel GitHub in jou blaaier en kom dan hierheen terug om 'n bewaarplek te kies.",
+ "connectGitlabDescription": "Koppel GitLab in jou blaaier en kom dan hierheen terug om 'n bewaarplek te kies.",
+ "connectBitbucketDescription": "Koppel Bitbucket in jou blaaier en kom dan hierheen terug om 'n bewaarplek te kies.",
"openGithub": "Maak GitHub oop",
+ "openGitlab": "Maak GitLab oop",
+ "openBitbucket": "Maak Bitbucket oop",
"refreshRepositories": "Verfris bewaarplekke",
"githubConnected": "GitHub gekoppel",
+ "gitlabConnected": "GitLab gekoppel",
"noRepositoriesVisible": "Geen bewaarplekke is sigbaar nie. Gaan die Kilo GitHub-toep se toegang tot bewaarplekke na en verfris dan die lys.",
+ "noRepositoriesVisibleGitlab": "Geen bewaarplekke is sigbaar nie. Gaan GitLab se toegang tot bewaarplekke na en verfris dan die lys.",
+ "noRepositoriesVisibleBitbucket": "Geen bewaarplekke is sigbaar nie. Gaan Bitbucket se toegang tot bewaarplekke na en verfris dan die lys.",
+ "bitbucketOrganizationsOnly": "Bitbucket is slegs vir organisasies beskikbaar.",
+ "branchPickerTitle": "Kies tak",
+ "branchDefault": "Verstek",
+ "branchAccessibility": "Tak: {{label}}",
+ "branchLoading": "Takke word gelaai",
+ "branchLoadError": "Takke kon nie gelaai word nie",
+ "branchUnavailable": "Takke is nie beskikbaar vir hierdie bewaarplek nie. Gaan jou toegang by die verskaffer na en kies 'n ander bewaarplek.",
+ "branchEmpty": "Geen takke beskikbaar nie",
+ "branchPlaceholder": "Kies 'n tak",
"runOnWithTarget": "Voer uit op: {{target}}",
"environment": "Omgewing",
"couldNotLoadEnvironment": "Jou omgewing kon nie gelaai word nie.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Die bewaarplekke kon nie verfris word nie. Probeer asseblief weer.",
"discardDraftTitle": "Konsep weggooi?",
"discardDraftMessage": "Jou opdrag sal verlore gaan.",
+ "discardWithUploadsMessage": "Jou opdrag en enige opgelaaide lêers wat nie aan gestuurde boodskappe geheg is nie, sal geskrap word.",
"discardFailed": "Die konsep kon nie weggegooi word nie. Probeer asseblief weer.",
"remoteHint": "Voer `kilo remote` op jou rekenaar uit, of `/remote` in 'n aktiewe CLI-sessie, om 'n plaaslike kilo-proses te beheer.",
- "connectBitbucketDescription": "Koppel Bitbucket in jou blaaier en kom dan hierheen terug om 'n bewaarplek te kies.",
- "connectGitlabDescription": "Koppel GitLab in jou blaaier en kom dan hierheen terug om 'n bewaarplek te kies.",
- "couldNotLoadBitbucketRepositories": "Die Bitbucket-bewaarplekke kon nie gelaai word nie.",
- "couldNotLoadGithubRepositories": "Die GitHub-bewaarplekke kon nie gelaai word nie.",
- "couldNotLoadGitlabRepositories": "Die GitLab-bewaarplekke kon nie gelaai word nie.",
- "gitlabConnected": "GitLab gekoppel",
- "noRepositoriesVisibleBitbucket": "Geen bewaarplekke is sigbaar nie. Gaan Bitbucket se toegang tot bewaarplekke na en verfris dan die lys.",
- "noRepositoriesVisibleGitlab": "Geen bewaarplekke is sigbaar nie. Gaan GitLab se toegang tot bewaarplekke na en verfris dan die lys.",
- "openBitbucket": "Maak Bitbucket oop",
- "openGitlab": "Maak GitLab oop",
- "recentlyUsed": "Onlangs gebruik",
"continueFrom": "Die sessie {{title}} word voortgesit.",
"importingSession": "Sessie word ingevoer",
"cliCannotContinue": "Hierdie CLI kan nie 'n sessie voortsit nie. Kies Cloud Agent of 'n ander CLI.",
- "importFailed": "Hierdie sessie kon nie ingevoer word nie.",
- "discardWithUploadsMessage": "Jou opdrag en enige opgelaaide lêers wat nie aan gestuurde boodskappe geheg is nie, sal geskrap word."
+ "importFailed": "Hierdie sessie kon nie ingevoer word nie."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} lêer is bygewerk.",
diff --git a/apps/mobile/src/i18n/locales/am.json b/apps/mobile/src/i18n/locales/am.json
index 3a832accce..83560cace3 100644
--- a/apps/mobile/src/i18n/locales/am.json
+++ b/apps/mobile/src/i18n/locales/am.json
@@ -36,6 +36,7 @@
"cost": "ወጪ",
"discard": "አስወግድ",
"findings": "ግኝቶች",
+ "mergeRequest": "የማዋሃድ ጥያቄ",
"notConnected": "አልተገናኘም",
"notifications": "ማሳወቂያዎች",
"pullRequest": "የማዋሃድ ጥያቄ",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ባዶ የልዩነት ረድፍ"
},
"connectionExpired": "የGitHub ግንኙነት ጊዜው አልፏል።",
+ "capabilities": {
+ "banner": {
+ "title": "በዚህ አቅራቢ ላይ አይገኝም",
+ "accessibility": "በዚህ አቅራቢ ላይ አይገኝም፦ {{reason}}"
+ }
+ },
"merge": {
"merge": "ማዋሃድ",
"mergeNow": "አሁን አዋህድ",
"mergePullRequest": "የማዋሃድ ጥያቄን ማዋሃድ",
+ "mergeTermTitle": "{{term}}ን ማዋሃድ",
"enableAutoMerge": "ራስ-ሰር ማዋሃድን አንቃ",
"disableAutoMerge": "ራስ-ሰር ማዋሃድን አሰናክል",
"autoMergeOn": "ራስ-ሰር ማዋሃድ ነቅቷል",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "ከውህደቱ በኋላ ቅርንጫፉን ሰርዝ",
"noEnabledMethods": "በዚህ ማከማቻ ላይ የነቃ የውህደት ዘዴ የለም። የማከማቻውን አስተዳዳሪ በውህደት ኮሚት፣ በማጠቃለል ወይም መሠረት በመቀየር የማዋሃድ ዘዴን እንዲያነቃ ጠይቅ።",
"confirmTitle": "የማዋሃድ ጥያቄው ይዋሃድ?",
+ "confirmTitleTerm": "{{term}}ው ይዋሃድ?",
"confirmMessage": "ይህ ለውጦችህን ወደ መሠረት ቅርንጫፉ ያዋህዳል።",
"enableAutoMergeConfirmTitle": "ራስ-ሰር ማዋሃድ ይንቃ?",
"enableAutoMergeConfirmMessage": "ሁሉም አስፈላጊ ፍተሻዎች ሲያልፉ፣ GitHub ይህን የማዋሃድ ጥያቄ በራስ-ሰር ያዋህደዋል።",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} ፋይፕላይኑ ከሳካ በኋላ በራስ-ሰር ይዋሃዳል።",
+ "enableAutoMergeDescriptionTerm": "GitLab ይህን {{term}} ፋይፕላይኑ ከሳካ በኋላ በራስ-ሰር ያዋህደዋል።",
"forbidden": "ይህን የማዋሃድ ጥያቄ ለማዋሃድ ፈቃድ የለህም።",
"cannotMerge": "ይህን የማዋሃድ ጥያቄ ባለበት ሁኔታ ማዋሃድ አይቻልም።",
"couldNotMerge": "የማዋሃድ ጥያቄውን ማዋሃድ አልተቻለም።",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "አስቀድሞ ተዋህዷል",
- "closed": "ይህ የማዋሃድ ጥያቄ ተዘግቷል"
+ "closed": "ይህ የማዋሃድ ጥያቄ ተዘግቷል",
+ "closedMergeRequest": "ይህ የማዋሃድ ጥያቄ ተዘግቷል"
},
"partialSuccessBanner": {
"body": "ቅርንጫፉን መሰረዝ አልተቻለም፦ {{reason}}።",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ይህን የማዋሃድ ጥያቄ ገና ማዋሃድ አይቻልም",
"notMergeableDetail": "GitHub የማዋሃድ ሁኔታው {{state}} እንደሆነ አሳውቋል።"
},
+ "restrictions": {
+ "title": "የማዋሃድ ገደቦች",
+ "approvalsRequired_one": "{{displayCount}} ማጽደቅ ያስፈልጋል",
+ "approvalsRequired_other": "{{displayCount}} ማጽደቆች ያስፈልጋሉ",
+ "pipelineMustSucceed": "ማዋሃድ ከመፈጸሙ በፊት ፋይፕላይኑ መሳካት አለበት።"
+ },
+ "providerBlocked": {
+ "failingPipeline": "ፋይፕላይኑ በቅርብ ጊዜው ኮሚት ላይ እየወደቀ ነው።",
+ "pendingPipeline": "ፋይፕላይኑ በቅርብ ጊዜው ኮሚት ላይ ገና እየሰራ ነው።",
+ "permission": "ይህን {{term}} ለማዋሃድ ፈቃድ የለህም።",
+ "draft": "ከማዋሃድህ በፊት {{term}}ው ለግምገማ ዝግጁ መሆኑን ምልክት አድርግ።"
+ },
"methodLabels": {
"merge": "የውህደት ኮሚት ፍጠር",
"squash": "አጠቃልለህ አዋህድ",
@@ -448,6 +472,7 @@
"acceptTerms": "ተቀበል",
"replyBadRequest": "ይህን ምላሽ መለጠፍ አይቻልም። የውይይት ሰንሰለቱ ተለውጦ ሊሆን ይችላል።",
"replyForbidden": "ለዚህ የማዋሃድ ጥያቄ ምላሽ ለመስጠት ፈቃድ የለህም።",
+ "replyForbiddenTerm": "ለዚህ {{term}} ምላሽ ለመስጠት ፈቃድ የለህም።",
"moderation": {
"reportContent": {
"terminal": "ይህ አስተያየት ሪፖርት ሊደረግ አይችልም።",
@@ -508,17 +533,19 @@
"reviewPullRequest": "የማዋሃድ ጥያቄውን ገምግም",
"headLine": "{{counts}} · የቅርንጫፉ የመጨረሻ ኮሚት {{sha}}",
"entry": {
- "eyebrow": "የማዋሃድ ጥያቄን በURL ክፈት።",
- "pastePrLink": "የPR አገናኝ ለጥፍ",
- "noRecentPrs": "የቅርብ ጊዜ PRዎች የሉም",
- "noRecentPrsDescription": "ግምገማ ለመጀመር ከላይ የPR አገናኝ ለጥፍ — በሚቀጥለው ጊዜ እዚህ ይታያል።",
+ "eyebrow": "የማዋሃድ ጥያቄን በURL ይክፈቱ",
+ "pastePrLink": "የማዋሃድ ጥያቄ አገናኝ ያስገቡ",
+ "noRecentPrs": "የቅርብ ጊዜ ግምገማዎች የሉም",
+ "noRecentPrsDescription": "ግምገማ ለመጀመር ከላይ አገናኝ ያስገቡ — ለቀጣዩ ጊዜ እዚህ ይታያል።",
"couldNotLoad": "መጫን አልተቻለም።",
"removeFromRecentsTitle": "ከቅርብ ጊዜ ዝርዝሩ ይወገድ?",
- "removeFromRecentsMessage": "ይህ የማዋሃድ ጥያቄ ከቅርብ ጊዜ ዝርዝርህ ይወገዳል።",
+ "removeFromRecentsMessage": "ይህ ግምገማ ከቅርብ ጊዜዎችዎ ውስጥ ይወገዳል።",
"removeRecentAccessibility": "{{repo}}ን ከቅርብ ጊዜ ዝርዝሩ አስወግድ",
- "urlAccessibility": "የGitHub ማዋሃድ ጥያቄ URL",
- "clearLink": "የማዋሃድ ጥያቄውን አገናኝ አጽዳ",
- "pasteLink": "የማዋሃድ ጥያቄ አገናኝ ለጥፍ",
+ "urlAccessibility": "የማዋሃድ ጥያቄ URL ያስገቡ",
+ "urlPlaceholder": "የማዋሃድ ጥያቄ URL",
+ "openAccessibility": "የማዋሃድ ጥያቄ ክፈት",
+ "clearLink": "አገናኙን ያጽዱ",
+ "pasteLink": "የማዋሃድ ጥያቄ አገናኝ ያስገቡ",
"open": "ክፍት"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "የGitHub ግንኙነቱን መፈተሽ አልተቻለም።",
"checkFailedMessage": "ይህ እስኪጫን ድረስ የመግቢያ ሁኔታውን ማወቅ አይቻልም።",
+ "checkFailedTitleGitLab": "የGitLab ግንኙነቱን መፈተሽ አልተቻለም።",
+ "checkFailedTitleBitbucket": "የBitbucket ግንኙነቱን መፈተሽ አልተቻለም።",
+ "providerCheckFailedMessage": "ይህ እስኪጫን ድረስ የግንኙነት ሁኔታ አይገኝም።",
"reconnectTitle": "GitHubን እንደገና ማገናኘት",
"reconnectDescription": "የGitHub ግንኙነትህ ፈቃድ ተሰርዟል። በሞባይል ላይ የማዋሃድ ጥያቄዎችን መገምገም ለመቀጠል እንደገና አገናኝ።",
- "description": "በሞባይል ላይ የማዋሃድ ጥያቄዎችን ለመገምገም የGitHub መለያህን አገናኝ።"
+ "description": "በሞባይል ላይ የማዋሃድ ጥያቄዎችን ለመገምገም የGitHub መለያህን አገናኝ።",
+ "gitlabDescription": "በሞባይል ላይ የማዋሃድ ጥያቄዎችን ለመገምገም የGitLab መለያዎን ያገናኙ።",
+ "bitbucketDescription": "Bitbucketን ከዚህ ድርጅት ጋር ያገናኙ የማዋሃድ ጥያቄዎችን በሞባይል ለመገምገም።",
+ "bitbucketOrgOnlyDescription": "የBitbucket የማዋሃድ ጥያቄዎቹን ለመገምገም በመገለጫዎ ውስጥ አንድ ድርጅት ይምረጡ።"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "የGitHub ግንኙነት ጊዜው አልፏል።",
- "message": "የGitHub ግንኙነትህ ከእንግዲህ አይሠራም። ግንኙነትህን እንደገና ፈትሽ — ካስፈለገ እንደገና እንድታገናኝ ትጠየቃለህ።"
+ "message": "የGitHub ግንኙነትህ ከእንግዲህ አይሠራም። ግንኙነትህን እንደገና ፈትሽ — ካስፈለገ እንደገና እንድታገናኝ ትጠየቃለህ።",
+ "gitlabTitle": "የGitLab ግንኙነት ጊዜው አልፏል።",
+ "bitbucketTitle": "የBitbucket ግንኙነት ጊዜው አልፏል።",
+ "providerMessage": "የ{{provider}} ግንኙነትህ ከእንግዲህ አይሠራም። ግንኙነትህን እንደገና ፈትሽ — ካስፈለገ እንደገና እንድታገናኝ ትጠየቃለህ።"
},
"eventChips": {
"comment": "አስተያየት",
@@ -643,6 +679,21 @@
"files": "ፋይሎች",
"discussion": "ውይይት"
},
+ "terms": {
+ "pullRequest": "የማዋሃድ ጥያቄ",
+ "mergeRequest": "የማዋሃድ ጥያቄ",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "የማዋሃድ ጥያቄውን አጋራ",
+ "viewOnProvider": "በ{{provider}} ይመልከቱ",
+ "mergeRequestUnavailable": "የማዋሃድ ጥያቄው አይገኝም",
+ "unavailableDescription": "ተሰርዞ ሊሆን ይችላል፣ ወይም የመዳረስ ፈቃድ ላይኖርዎት ይችላል።",
+ "accessDeniedMergeRequest": "ይህን የማዋሃድ ጥያቄ ለማየት ፈቃድ የለህም።",
+ "couldNotLoadMergeRequest": "የማዋሃድ ጥያቄውን መጫን አልተቻለም።",
+ "discussionAccessDenied": "የዚህን የማዋሃድ ጥያቄ ውይይት ለማየት ፈቃድ የለህም።",
+ "discussionUnavailableMessage": "ይህ የማዋሃድ ጥያቄ ተወግዶ ሊሆን ይችላል።",
+ "noDiscussionDescription": "በዚህ የማዋሃድ ጥያቄ ላይ የግምገማ ውይይቶች ወይም አጠቃላይ አስተያየቶች የሉም።",
+ "noFilesChangedDescription": "ይህ የማዋሃድ ጥያቄ ምንም የፋይል ለውጥ አልያዘም።"
+ },
"fileStatus": {
"modified": "ተቀይሯል",
"renamed": "ስሙ ተቀይሯል",
@@ -659,7 +710,7 @@
"emptyLine": "(ባዶ)"
},
"linkPasteClipboardEmpty": "ቅንጥብ ሰሌዳው ባዶ ነው።",
- "linkPasteNotAPullRequest": "ይህ የGitHub ማዋሃድ ጥያቄ አገናኝ አይደለም።",
+ "linkPasteNotAPullRequest": "የማዋሃድ ጥያቄ አገናኝ አይደለም",
"announce": {
"commentPosted": "አስተያየት ተለጥፏል",
"reviewSubmitted": "ግምገማ ቀርቧል",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ይህን አስተያየት መለጠፍ አይቻልም። የተመረጠው መስመር ተለውጦ ወይም PR ተዘምኖ ሊሆን ይችላል።",
"reviewNotSubmitted": "ይህን ግምገማ ባለበት ሁኔታ መላክ አይቻልም። PR ተለውጦ ሊሆን ይችላል፣ ወይም የራስህን የማዋሃድ ጥያቄ እየገመገምክ ሊሆን ይችላል። የራስህን ጥያቄ መገምገም አይፈቀድም።",
+ "reviewNotSubmittedTerm": "ይህ ግምገማ እንዳለ ማስገባት አይቻልም። {{term}} ተቀይሮ ሊሆን ወይም የራስዎን {{term}} መገምገም አይችሉም።",
"couldNotPostComment": "አስተያየት መለጠፍ አልተቻለም።",
"couldNotSubmitReview": "ግምገማውን መላክ አልተቻለም። ግንኙነትህን ፈትሽና እንደገና ሞክር።"
},
@@ -675,6 +727,7 @@
"couldNotReply": "መልስ መስጠት አልተቻለም።",
"couldNotCompleteAction": "ይህን እርምጃ ማጠናቀቅ አልተቻለም።",
"mergeResultDefaultError": "GitHub ውህደቱን አላጠናቀቀም።",
+ "mergeResultNotCompleted": "{{term}} አልተዋሃደም። ሁኔታውን ያረጋግጡ እና እንደገና ይሞክሩ።",
"ambiguous": "ማረጋገጥ አልተቻለም — እንደገና ከመሞከርህ በፊት PRን ፈትሽ።",
"persistenceFailed": "ይህን እርምጃ መመዝገብ አልቻልንም። በኋላ እንደገና ሞክር።",
"forbidden": "ይህ እርምጃ አይፈቀድም።"
@@ -1988,11 +2041,31 @@
"retryConnection": "እንደገና ለመገናኘት ይሞክሩ"
},
"newSession": {
+ "recentlyUsed": "በቅርቡ ጥቅም ላይ የዋሉ",
+ "couldNotLoadGithubRepositories": "የGitHub ማከማቻዎችን መጫን አልተቻለም።",
+ "couldNotLoadGitlabRepositories": "የGitLab ማከማቻዎችን መጫን አልተቻለም።",
+ "couldNotLoadBitbucketRepositories": "የBitbucket ማከማቻዎችን መጫን አልተቻለም።",
"connectGithubDescription": "GitHubን በአሳሽዎ ውስጥ ያገናኙ፣ ከዚያ ማከማቻ ለመምረጥ ወደዚህ ይመለሱ።",
+ "connectGitlabDescription": "GitLabን በአሳሽዎ ውስጥ ያገናኙ፣ ከዚያ ማከማቻ ለመምረጥ ወደዚህ ይመለሱ።",
+ "connectBitbucketDescription": "Bitbucketን በአሳሽዎ ውስጥ ያገናኙ፣ ከዚያ ማከማቻ ለመምረጥ ወደዚህ ይመለሱ።",
"openGithub": "GitHubን ይክፈቱ",
+ "openGitlab": "GitLabን ይክፈቱ",
+ "openBitbucket": "Bitbucketን ይክፈቱ",
"refreshRepositories": "ማከማቻዎችን ያድሱ",
"githubConnected": "GitHub ተገናኝቷል",
+ "gitlabConnected": "GitLab ተገናኝቷል",
"noRepositoriesVisible": "ምንም ማከማቻዎች አይታዩም። የKilo GitHub መተግበሪያ ማከማቻዎቹን የመድረስ ፈቃድ እንዳለው ያረጋግጡ፣ ከዚያ ያድሱ።",
+ "noRepositoriesVisibleGitlab": "ምንም ማከማቻዎች አይታዩም። በGitLab ላይ ማከማቻዎቹን የመድረስ ፈቃድ እንዳለ ያረጋግጡ፣ ከዚያ ያድሱ።",
+ "noRepositoriesVisibleBitbucket": "ምንም ማከማቻዎች አይታዩም። በBitbucket ላይ ማከማቻዎቹን የመድረስ ፈቃድ እንዳለ ያረጋግጡ፣ ከዚያ ያድሱ።",
+ "bitbucketOrganizationsOnly": "Bitbucket ለድርጅቶች ብቻ ይገኛል።",
+ "branchPickerTitle": "ቅርንጫፍ ይምረጡ",
+ "branchDefault": "ነባሪ",
+ "branchAccessibility": "ቅርንጫፍ፦ {{label}}",
+ "branchLoading": "ቅርንጫፎች በመጫን ላይ",
+ "branchLoadError": "ቅርንጫፎችን መጫን አልተቻለም",
+ "branchUnavailable": "ለዚህ ማከማቻ ቅርንጫፎች አይገኙም። ከአቅራቢው ጋር ያለዎትን መዳረስ ያረጋግጡ፣ ከዚያ ሌላ ማከማቻ ይምረጡ።",
+ "branchEmpty": "ምንም ቅርንጫፎች አይገኙም",
+ "branchPlaceholder": "አንድ ቅርንጫፍ ይምረጡ",
"runOnWithTarget": "ማስኬጃ፦ {{target}}",
"environment": "የሥራ አካባቢ",
"couldNotLoadEnvironment": "የሥራ አካባቢዎን መጫን አልተቻለም።",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "ማከማቻዎችን ማደስ አልተቻለም። እባክዎ እንደገና ይሞክሩ።",
"discardDraftTitle": "ረቂቁን ማስወገድ ይፈልጋሉ?",
"discardDraftMessage": "ጥያቄዎ ይጠፋል።",
+ "discardWithUploadsMessage": "ጥያቄዎና ከተላኩ መልእክቶች ጋር ያልተያያዙ የተሰቀሉ ፋይሎች ይሰረዛሉ።",
"discardFailed": "ረቂቁን ማስወገድ አልተቻለም። እባክዎ እንደገና ይሞክሩ።",
"remoteHint": "በኮምፒውተርዎ ላይ ያለን የkilo ሂደት ለመቆጣጠር `kilo remote`ን በኮምፒውተርዎ ላይ ያስኪዱ፣ ወይም እየሠራ ባለ የCLI ክፍለ ጊዜ ውስጥ `/remote`ን ይጠቀሙ።",
- "connectBitbucketDescription": "Bitbucketን በአሳሽዎ ውስጥ ያገናኙ፣ ከዚያ ማከማቻ ለመምረጥ ወደዚህ ይመለሱ።",
- "connectGitlabDescription": "GitLabን በአሳሽዎ ውስጥ ያገናኙ፣ ከዚያ ማከማቻ ለመምረጥ ወደዚህ ይመለሱ።",
- "couldNotLoadBitbucketRepositories": "የBitbucket ማከማቻዎችን መጫን አልተቻለም።",
- "couldNotLoadGithubRepositories": "የGitHub ማከማቻዎችን መጫን አልተቻለም።",
- "couldNotLoadGitlabRepositories": "የGitLab ማከማቻዎችን መጫን አልተቻለም።",
- "gitlabConnected": "GitLab ተገናኝቷል",
- "noRepositoriesVisibleBitbucket": "ምንም ማከማቻዎች አይታዩም። በBitbucket ላይ ማከማቻዎቹን የመድረስ ፈቃድ እንዳለ ያረጋግጡ፣ ከዚያ ያድሱ።",
- "noRepositoriesVisibleGitlab": "ምንም ማከማቻዎች አይታዩም። በGitLab ላይ ማከማቻዎቹን የመድረስ ፈቃድ እንዳለ ያረጋግጡ፣ ከዚያ ያድሱ።",
- "openBitbucket": "Bitbucketን ይክፈቱ",
- "openGitlab": "GitLabን ይክፈቱ",
- "recentlyUsed": "በቅርቡ ጥቅም ላይ የዋሉ",
- "cliCannotContinue": "ይህ CLI ክፍለ ጊዜን መቀጠል አይችልም። Cloud Agent ወይም ሌላ CLI ይምረጡ።",
"continueFrom": "{{title}} እየቀጠለ ነው።",
- "importFailed": "ይህን ክፍለ ጊዜ ማስመጣት አልተቻለም።",
"importingSession": "ክፍለ ጊዜውን በማስመጣት ላይ",
- "discardWithUploadsMessage": "ጥያቄዎና ከተላኩ መልእክቶች ጋር ያልተያያዙ የተሰቀሉ ፋይሎች ይሰረዛሉ።"
+ "cliCannotContinue": "ይህ CLI ክፍለ ጊዜን መቀጠል አይችልም። Cloud Agent ወይም ሌላ CLI ይምረጡ።",
+ "importFailed": "ይህን ክፍለ ጊዜ ማስመጣት አልተቻለም።"
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} ፋይል ተዘምኗል።",
diff --git a/apps/mobile/src/i18n/locales/ar.json b/apps/mobile/src/i18n/locales/ar.json
index 10a5704b88..07fc033891 100644
--- a/apps/mobile/src/i18n/locales/ar.json
+++ b/apps/mobile/src/i18n/locales/ar.json
@@ -4,6 +4,8 @@
"done": "تم",
"retry": "إعادة المحاولة",
"tryAgain": "إعادة المحاولة",
+ "continue": "متابعة",
+ "notNow": "ليس الآن",
"language": "اللغة",
"device": "الجهاز",
"share": "مشاركة {{title}}",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "تعذّر النسخ إلى الحافظة.",
"required": "مطلوب",
"error": "خطأ: {{error}}",
- "notNow": "ليس الآن",
- "continue": "متابعة",
"back": "رجوع",
"somethingWentWrong": "حدث خطأ ما.",
"couldNotOpen": "تعذّر فتح {{label}}.",
@@ -36,6 +36,7 @@
"cost": "التكلفة",
"discard": "تجاهل",
"findings": "الملاحظات",
+ "mergeRequest": "طلب دمج",
"notConnected": "غير مرتبط",
"notifications": "الإشعارات",
"pullRequest": "طلب سحب",
@@ -1593,11 +1594,31 @@
"retryConnection": "إعادة محاولة الاتصال"
},
"newSession": {
+ "recentlyUsed": "المستخدمة مؤخرًا",
+ "couldNotLoadGithubRepositories": "تعذّر تحميل مستودعات GitHub.",
+ "couldNotLoadGitlabRepositories": "تعذّر تحميل مستودعات GitLab.",
+ "couldNotLoadBitbucketRepositories": "تعذّر تحميل مستودعات Bitbucket.",
"connectGithubDescription": "اربط حسابك على GitHub من المتصفح، ثم عد إلى هنا لاختيار مستودع.",
+ "connectGitlabDescription": "اربط حسابك على GitLab من المتصفح، ثم عد إلى هنا لاختيار مستودع.",
+ "connectBitbucketDescription": "اربط حسابك على Bitbucket من المتصفح، ثم عد إلى هنا لاختيار مستودع.",
"openGithub": "فتح GitHub",
+ "openGitlab": "فتح GitLab",
+ "openBitbucket": "فتح Bitbucket",
"refreshRepositories": "تحديث المستودعات",
"githubConnected": "حساب GitHub مرتبط",
+ "gitlabConnected": "حساب GitLab مرتبط",
"noRepositoriesVisible": "لا تظهر أي مستودعات. تحقق من صلاحيات وصول تطبيق Kilo على GitHub إلى المستودعات، ثم حدّث القائمة.",
+ "noRepositoriesVisibleGitlab": "لا تظهر أي مستودعات. تحقق من صلاحيات الوصول إلى مستودعات GitLab، ثم حدّث القائمة.",
+ "noRepositoriesVisibleBitbucket": "لا تظهر أي مستودعات. تحقق من صلاحيات الوصول إلى مستودعات Bitbucket، ثم حدّث القائمة.",
+ "bitbucketOrganizationsOnly": "Bitbucket متاح للمؤسسات فقط.",
+ "branchPickerTitle": "اختيار الفرع",
+ "branchDefault": "افتراضي",
+ "branchAccessibility": "الفرع: {{label}}",
+ "branchLoading": "جارٍ تحميل الفروع",
+ "branchLoadError": "تعذّر تحميل الفروع",
+ "branchUnavailable": "الفروع غير متاحة لهذا المستودع. تحقق من صلاحيتك لدى المزوّد، ثم اختر مستودعًا آخر.",
+ "branchEmpty": "لا توجد فروع متاحة",
+ "branchPlaceholder": "اختر فرعًا",
"runOnWithTarget": "التشغيل على: {{target}}",
"environment": "البيئة",
"couldNotLoadEnvironment": "تعذّر تحميل بيئتك.",
@@ -1616,26 +1637,15 @@
"couldNotReadPendingSessions": "تعذّرت قراءة الجلسات المعلقة. حاول مرة أخرى.",
"failedToCreate": "تعذّر إنشاء الجلسة.",
"couldNotRefreshRepositories": "تعذّر تحديث المستودعات. حاول مرة أخرى.",
- "discardDraftMessage": "ستفقد التعليمات التي كتبتها.",
"discardDraftTitle": "حذف المسودة؟",
+ "discardDraftMessage": "ستفقد التعليمات التي كتبتها.",
+ "discardWithUploadsMessage": "ستُحذف تعليماتك وأي ملفات مرفوعة لم تُرفق برسائل مرسلة.",
"discardFailed": "تعذّر حذف المسودة. حاول مرة أخرى.",
"remoteHint": "شغّل `kilo remote` على جهاز الكمبيوتر، أو `/remote` في جلسة CLI قيد التشغيل، للتحكم في عملية kilo محلية.",
- "connectBitbucketDescription": "اربط حسابك على Bitbucket من المتصفح، ثم عد إلى هنا لاختيار مستودع.",
- "connectGitlabDescription": "اربط حسابك على GitLab من المتصفح، ثم عد إلى هنا لاختيار مستودع.",
- "couldNotLoadBitbucketRepositories": "تعذّر تحميل مستودعات Bitbucket.",
- "couldNotLoadGithubRepositories": "تعذّر تحميل مستودعات GitHub.",
- "couldNotLoadGitlabRepositories": "تعذّر تحميل مستودعات GitLab.",
- "gitlabConnected": "حساب GitLab مرتبط",
- "noRepositoriesVisibleBitbucket": "لا تظهر أي مستودعات. تحقق من صلاحيات الوصول إلى مستودعات Bitbucket، ثم حدّث القائمة.",
- "noRepositoriesVisibleGitlab": "لا تظهر أي مستودعات. تحقق من صلاحيات الوصول إلى مستودعات GitLab، ثم حدّث القائمة.",
- "openBitbucket": "فتح Bitbucket",
- "openGitlab": "فتح GitLab",
- "recentlyUsed": "المستخدمة مؤخرًا",
"continueFrom": "تجري متابعة {{title}}.",
"importingSession": "جارٍ استيراد الجلسة",
"cliCannotContinue": "إصدار CLI هذا لا يدعم متابعة الجلسات. اختر Cloud Agent أو CLI آخر.",
- "importFailed": "تعذر استيراد هذه الجلسة.",
- "discardWithUploadsMessage": "ستُحذف تعليماتك وأي ملفات مرفوعة لم تُرفق برسائل مرسلة."
+ "importFailed": "تعذر استيراد هذه الجلسة."
},
"partRenderer": {
"updatedFileCount_one": "تم تحديث ملف واحد ({{displayCount}}).",
@@ -2368,168 +2378,11 @@
"installAttributionPromptTitle": "السماح بتحديد مصدر التثبيت؟"
},
"prReview": {
+ "pullRequestUnavailable": "طلب السحب غير متاح",
+ "pullRequestUnavailableDescription": "لا يمكن فتح PR هذا. ربما حُذف، أو أن المستودع خاص، أو أن تطبيق Kilo على GitHub غير مثبّت فيه.",
"accessDeniedDescription": "ليست لديك صلاحية لعرض طلب السحب هذا.",
- "checkConnection": "التحقق من الاتصال",
- "checks": {
- "checksCount": "الفحوصات: {{displayCount}}",
- "couldNotLoad": "تعذّر تحميل الفحوصات.",
- "failed": "فاشلة: {{displayCount}}",
- "noAccess": "ليست لديك صلاحية للوصول إلى فحوصات هذا المستودع.",
- "noChecksReported": "لا توجد نتائج فحوصات",
- "notAvailable": "الفحوصات غير متاحة بعد. ربما لم يُعالَج آخر إيداع، أو أن تطبيق Kilo على GitHub غير مثبّت في المستودع المصدر.",
- "openDetails": "فتح تفاصيل {{name}}",
- "passed": "ناجحة: {{displayCount}}",
- "pending": "قيد الانتظار: {{displayCount}}",
- "retryChecks": "إعادة محاولة تحميل الفحوصات",
- "skipped": "تم تخطيها: {{displayCount}}",
- "title": "الفحوصات",
- "viewOnGitHub": "عرض PR على GitHub",
- "checkDetails": "تفاصيل الفحص"
- },
- "composer": {
- "addTitle": "إضافة تعليق",
- "addToReview": "إضافة إلى المراجعة",
- "comment": "تعليق",
- "commentBody": "نص التعليق",
- "commentBodyPlaceholder": "نص التعليق",
- "commentNow": "نشر التعليق الآن",
- "discardMessage": "ستفقد مسودتك.",
- "discardTitle": "إلغاء التعليق؟",
- "editTitle": "تعديل التعليق",
- "insertSuggestion": "إدراج اقتراح",
- "insertSuggestionA11y": "إدراج اقتراح شيفرة",
- "loadFailedTitle": "تعذّر تحميل محرر التعليقات.",
- "ok": "حسنًا",
- "unavailableMessage": "تم حذف هذا التعليق المعلّق أو إرساله بالفعل.",
- "unavailableTitle": "التعليق غير متاح",
- "bodyEmpty": "لا يمكن أن يكون نص التعليق فارغًا.",
- "suggestionsOnlyAddedLines": "تنطبق الاقتراحات على الأسطر المضافة فقط.",
- "tapDiffLineToSuggest": "اضغط على سطر في عرض الفروق لتفعيل الاقتراحات."
- },
- "connect": {
- "checkFailedMessage": "لا يمكن معرفة حالة تسجيل الدخول حتى يكتمل التحميل.",
- "checkFailedTitle": "تعذّر التحقق من ربط حساب GitHub.",
- "description": "اربط حسابك على GitHub لمراجعة طلبات السحب على الجوال.",
- "reconnectDescription": "أُلغي ربط حسابك على GitHub. أعد ربطه لمواصلة مراجعة طلبات السحب على الجوال.",
- "reconnectTitle": "إعادة ربط GitHub"
- },
- "connectionExpired": "انتهت صلاحية الربط مع GitHub.",
- "couldNotLoadPullRequest": "تعذّر تحميل طلب السحب.",
- "couldNotOpenGitHubAppSettings": "تعذّر فتح إعدادات تطبيق GitHub.",
- "description": "الوصف",
- "discussion": {
- "acceptTerms": "قبول",
- "accessDeniedMessage": "ليست لديك صلاحية لعرض مناقشة PR هذا.",
- "addReaction": "إضافة تفاعل",
- "block": "حظر",
- "blockedUser": "تم حظر {{login}}",
- "collapseThread": "طي سلسلة المناقشة",
- "commentActions": "إجراءات التعليق",
- "comment": "التعليقات: {{displayCount}}",
- "comment_other": "التعليقات: {{displayCount}}",
- "couldNotLoad": "تعذّر تحميل المناقشة.",
- "couldNotLoadMore": "تعذّر تحميل المزيد من التعليقات.",
- "loadMoreComments": "تحميل المزيد من التعليقات",
- "loading": "جارٍ تحميل المناقشة",
- "moderation": {
- "block": {
- "retryable": "تعذّر حظر هذا المستخدم. تحقق من اتصالك وحاول مرة أخرى.",
- "terminal": "لا يمكن حظر هذا المستخدم."
- },
- "mute": {
- "retryable": "تعذّر كتم هذا المستخدم. تحقق من اتصالك وحاول مرة أخرى.",
- "terminal": "لا يمكن كتم هذا المستخدم."
- },
- "reportContent": {
- "retryable": "تعذّر الإبلاغ عن هذا التعليق. تحقق من اتصالك وحاول مرة أخرى.",
- "terminal": "لا يمكن الإبلاغ عن هذا التعليق."
- },
- "reportUser": {
- "retryable": "تعذّر الإبلاغ عن هذا المستخدم. تحقق من اتصالك وحاول مرة أخرى.",
- "terminal": "لا يمكن الإبلاغ عن هذا المستخدم."
- }
- },
- "moreLinesAbove": "… توجد أسطر أخرى أعلاه، عددها {{displayCount}}.",
- "mute": "كتم",
- "mutedUser": "تم كتم {{login}}",
- "noDiscussion": "لا توجد مناقشة بعد",
- "noDiscussionDescription": "لا توجد سلاسل مناقشة للمراجعة أو تعليقات عامة على طلب السحب هذا.",
- "comment_one": "تعليق واحد",
- "outdated": "قديم",
- "quotedDiffSnippet": "مقتطف مقتبس من الفروق",
- "reactionPill": "تفاعل {{emoji}}، {{displayCount}} {{countLabel}}",
- "reaction": "تفاعل",
- "reaction_other": "تفاعل",
- "reaction_one": "تفاعل",
- "replyBadRequest": "لا يمكن نشر هذا الرد. ربما تغيّرت سلسلة المناقشة.",
- "replyBody": "نص الرد",
- "replyForbidden": "ليست لديك صلاحية للرد على طلب السحب هذا.",
- "replyPlaceholder": "الرد…",
- "reportContent": "الإبلاغ عن المحتوى",
- "reportUser": "الإبلاغ عن المستخدم",
- "resolveThread": "تحديد سلسلة المناقشة كمحلولة",
- "resolved": "تم الحل",
- "retryLoadingMore": "إعادة محاولة تحميل المزيد من التعليقات",
- "reviewFiles": "مراجعة الملفات",
- "startedRelative": " · بدأت {{relative}}",
- "submitReply": "إرسال الرد",
- "termsAcceptRetry": "تعذّر قبول الشروط. تحقق من اتصالك وحاول مرة أخرى.",
- "termsCopy": "يجب أن يكون عمرك 13 عامًا أو أكثر للنشر.",
- "termsTitle": "شروط الخدمة",
- "threadAccessibilityLabel": "سلسلة المناقشة {{anchorLabel}}",
- "unavailable": "المناقشة غير متاحة.",
- "unavailableMessage": "ربما تمت إزالة طلب السحب هذا.",
- "unresolveThread": "إلغاء تحديد سلسلة المناقشة كمحلولة",
- "viewTerms": "عرض الشروط",
- "termsAcceptRequired": "يجب أن توافق على شروط الخدمة للنشر.",
- "termsCheckRetryCopy": "تعذّر التحقق من شروط الخدمة. تحقق من اتصالك وحاول مرة أخرى.",
- "termsOutdatedCopy": "تغيّرت شروط الخدمة. أعد فتح هذه الشاشة للموافقة على أحدث نسخة.",
- "comment_zero": "عدد التعليقات: {{displayCount}}",
- "comment_two": "تعليقان ({{displayCount}})",
- "comment_few": "{{displayCount}} تعليقات",
- "comment_many": "{{displayCount}} تعليقًا",
- "reaction_zero": "تفاعل",
- "reaction_two": "تفاعلان",
- "reaction_few": "تفاعلات",
- "reaction_many": "تفاعلًا",
- "reactions": {
- "thumbsUp": "إعجاب",
- "thumbsDown": "عدم إعجاب",
- "laugh": "ضحك",
- "hooray": "احتفال",
- "confused": "حيرة",
- "heart": "قلب",
- "rocket": "صاروخ",
- "eyes": "عيون"
- },
- "anchor": {
- "fileCommentOnPath": "تعليق على الملف {{path}}",
- "fileComment": "تعليق على الملف",
- "outdatedOnPathLines": "قديم في {{path}} {{lines}}",
- "outdatedOnLines": "قديم في {{lines}}",
- "outdatedOnPath": "قديم في {{path}}"
- },
- "deletedUser": "مستخدم محذوف"
- },
- "entry": {
- "clearLink": "مسح رابط طلب السحب",
- "couldNotLoad": "تعذّر التحميل.",
- "eyebrow": "افتح طلب سحب باستخدام عنوان URL.",
- "noRecentPrs": "لا توجد طلبات PR حديثة",
- "noRecentPrsDescription": "الصق رابط PR أعلاه لبدء المراجعة. سيظهر هنا في المرة القادمة.",
- "open": "فتح",
- "pasteLink": "لصق رابط طلب السحب",
- "pastePrLink": "لصق رابط PR",
- "removeFromRecentsMessage": "سيُزال طلب السحب هذا من قائمة الطلبات الأخيرة.",
- "removeFromRecentsTitle": "إزالة الطلب من القائمة الأخيرة؟",
- "removeRecentAccessibility": "إزالة {{repo}} من قائمة الطلبات الأخيرة",
- "urlAccessibility": "عنوان URL لطلب السحب على GitHub"
- },
- "eventChips": {
- "comment": "تعليق",
- "label": "نوع المراجعة",
- "requestChanges": "طلب تغييرات"
- },
+ "noFilesChanged": "لم تتغير أي ملفات",
+ "noFilesChangedDescription": "لا يتضمن طلب السحب هذا أي تغييرات على الملفات.",
"fileList": {
"filesList": "قائمة الملفات",
"filesViewed": "الملفات · تم الاطلاع على {{viewed}} من {{total}}",
@@ -2574,7 +2427,6 @@
"commentOnSelectedLines": "إضافة تعليق على الأسطر المحددة",
"finishReview": "إنهاء المراجعة"
},
- "headLine": "{{counts}} · آخر إيداع: {{sha}}",
"hunkRows": {
"contextUnavailable": "السياق غير متاح في هذا المرجع.",
"expandAll": "توسيع الكل",
@@ -2615,56 +2467,68 @@
"fileLoadedOfTotalCount_few": "تم تحميل {{displayCount}} ملفات من {{total}}",
"fileLoadedOfTotalCount_many": "تم تحميل {{displayCount}} ملفًا من {{total}}"
},
- "inbox": {
- "couldNotLoad": "تعذّر تحميل صندوق الوارد.",
- "loading": "جارٍ تحميل صندوق الوارد",
- "noReviewRequests": "لا توجد طلبات مراجعة",
- "noReviewRequestsDescription": "تظهر هنا طلبات السحب التي تنتظر مراجعتك. ويمكنك أيضًا لصق أي رابط PR أعلاه.",
- "title": "صندوق الوارد"
+ "sideBySide": {
+ "emptyDiffColumn": "عمود فارغ في عرض الفروق",
+ "emptyDiffRow": "صف فارغ في عرض الفروق",
+ "newOnly": "الجديد فقط: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ لا يوجد سطر جديد في نهاية الملف",
+ "oldNew": "القديم: {{old}} | الجديد: {{new}}",
+ "oldOnly": "القديم فقط: {{text}}"
+ },
+ "connectionExpired": "انتهت صلاحية الربط مع GitHub.",
+ "capabilities": {
+ "banner": {
+ "title": "غير متاح لدى هذا المزوّد",
+ "accessibility": "غير متاح لدى هذا المزوّد: {{reason}}"
+ }
},
- "installKiloGitHubApp": "تثبيت تطبيق Kilo على GitHub",
"merge": {
- "autoMergeDescription": "سيدمج GitHub طلب السحب هذا تلقائيًا عند نجاح جميع الفحوصات المطلوبة (الطريقة: {{method}}).",
+ "merge": "دمج",
+ "mergeNow": "دمج الآن",
+ "mergePullRequest": "دمج طلب السحب",
+ "mergeTermTitle": "دمج {{term}}",
+ "enableAutoMerge": "تفعيل الدمج التلقائي",
+ "disableAutoMerge": "تعطيل الدمج التلقائي",
"autoMergeOn": "الدمج التلقائي مفعّل",
- "blockedTitle": "أسباب تعذّر الدمج حاليًا",
- "cannotMerge": "لا يمكن دمج طلب السحب هذا كما هو.",
+ "autoMergeDescription": "سيدمج GitHub طلب السحب هذا تلقائيًا عند نجاح جميع الفحوصات المطلوبة (الطريقة: {{method}}).",
"checking": "جارٍ التحقق من إمكانية الدمج…",
+ "couldNotDetermine": "تعذّر تحديد إمكانية الدمج.",
+ "refreshMergeability": "إعادة التحقق من إمكانية الدمج",
+ "blockedTitle": "أسباب تعذّر الدمج حاليًا",
+ "updateBranch": "تحديث الفرع",
+ "updateBranchFromBase": "تحديث الفرع من الفرع الأساسي",
+ "methodLabel": "طريقة الدمج",
+ "commitTitle": "عنوان الإيداع",
"commitMessage": "رسالة الإيداع",
"commitMessagePlaceholder": "وصف اختياري لإيداع الدمج",
- "commitTitle": "عنوان الإيداع",
- "confirmMessage": "ستُدمج تغييراتك في الفرع الأساسي.",
- "confirmTitle": "دمج طلب السحب؟",
- "couldNotDetermine": "تعذّر تحديد إمكانية الدمج.",
- "couldNotMerge": "تعذّر دمج طلب السحب.",
"deleteBranch": "حذف الفرع",
"deleteBranchAfterMerge": "حذف الفرع بعد الدمج",
- "disableAutoMerge": "تعطيل الدمج التلقائي",
- "enableAutoMerge": "تفعيل الدمج التلقائي",
- "enableAutoMergeConfirmMessage": "سيدمج GitHub طلب السحب هذا تلقائيًا عند نجاح جميع الفحوصات المطلوبة.",
+ "noEnabledMethods": "لا توجد طرق دمج مفعّلة في هذا المستودع. اطلب من مسؤول المستودع تفعيل الدمج العادي أو الدمج المضغوط أو الدمج مع إعادة التأسيس.",
+ "confirmTitle": "دمج طلب السحب؟",
+ "confirmTitleTerm": "دمج {{term}}؟",
+ "confirmMessage": "ستُدمج تغييراتك في الفرع الأساسي.",
"enableAutoMergeConfirmTitle": "تفعيل الدمج التلقائي؟",
+ "enableAutoMergeConfirmMessage": "سيدمج GitHub طلب السحب هذا تلقائيًا عند نجاح جميع الفحوصات المطلوبة.",
+ "enableAutoMergeConfirmMessageTerm": "سيتم دمج {{term}} تلقائيًا عند نجاح خط الأنابيب.",
+ "enableAutoMergeDescriptionTerm": "سيقوم GitLab بدمج {{term}} تلقائيًا بمجرد نجاح خط الأنابيب الخاص به.",
"forbidden": "ليست لديك صلاحية لدمج طلب السحب هذا.",
- "loadFailedTitle": "تعذّر تحميل خيارات الدمج.",
- "merge": "دمج",
- "mergeNow": "دمج الآن",
- "mergePullRequest": "دمج طلب السحب",
- "methodLabel": "طريقة الدمج",
+ "cannotMerge": "لا يمكن دمج طلب السحب هذا كما هو.",
+ "couldNotMerge": "تعذّر دمج طلب السحب.",
"methods": {
"merge": "دمج",
"rebase": "إعادة التأسيس",
"squash": "دمج مضغوط"
},
- "noEnabledMethods": "لا توجد طرق دمج مفعّلة في هذا المستودع. اطلب من مسؤول المستودع تفعيل الدمج العادي أو الدمج المضغوط أو الدمج مع إعادة التأسيس.",
+ "terminal": {
+ "alreadyMerged": "تم الدمج بالفعل",
+ "closed": "طلب السحب هذا مغلق",
+ "closedMergeRequest": "طلب الدمج هذا مغلق"
+ },
"partialSuccessBanner": {
"accessibility": "تم الدمج. تعذّر حذف الفرع: {{reason}}",
"body": "تعذّر حذف الفرع: {{reason}}."
},
- "refreshMergeability": "إعادة التحقق من إمكانية الدمج",
- "terminal": {
- "alreadyMerged": "تم الدمج بالفعل",
- "closed": "طلب السحب هذا مغلق"
- },
- "updateBranch": "تحديث الفرع",
- "updateBranchFromBase": "تحديث الفرع من الفرع الأساسي",
+ "loadFailedTitle": "تعذّر تحميل خيارات الدمج.",
"blocked": {
"unknownStateTitle": "لم يؤكد GitHub إمكانية الدمج",
"unknownStateDetail": "حاول تحديث نظرة عامة بعد قليل.",
@@ -2684,6 +2548,22 @@
"notMergeableTitle": "طلب السحب هذا غير قابل للدمج بعد",
"notMergeableDetail": "أبلغ GitHub عن حالة إمكانية الدمج التالية: {{state}}."
},
+ "restrictions": {
+ "title": "قيود الدمج",
+ "approvalsRequired_one": "مطلوب {{displayCount}} موافقة واحدة",
+ "approvalsRequired_other": "مطلوب {{displayCount}} موافقة",
+ "pipelineMustSucceed": "يجب أن ينجح خط الأنابيب قبل الدمج.",
+ "approvalsRequired_many": "مطلوب {{displayCount}} موافقة",
+ "approvalsRequired_few": "مطلوب {{displayCount}} موافقات",
+ "approvalsRequired_two": "مطلوب {{displayCount}} موافقتين",
+ "approvalsRequired_zero": "مطلوب {{displayCount}} موافقات"
+ },
+ "providerBlocked": {
+ "failingPipeline": "خط الأنابيب يفشل في أحدث إيداع.",
+ "pendingPipeline": "خط الأنابيب لا يزال يعمل في أحدث إيداع.",
+ "permission": "ليست لديك صلاحية لدمج {{term}} هذا.",
+ "draft": "حدّد {{term}} على أنه جاهز للمراجعة قبل الدمج."
+ },
"methodLabels": {
"merge": "إنشاء إيداع دمج",
"squash": "ضغط الإيداعات ودمجها",
@@ -2695,9 +2575,216 @@
"rebase": "أعد تطبيق جميع إيداعات هذا الفرع على الفرع الأساسي دون إنشاء إيداع دمج."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "سلسلة المناقشة {{anchorLabel}}",
+ "collapseThread": "طي سلسلة المناقشة",
+ "resolveThread": "تحديد سلسلة المناقشة كمحلولة",
+ "unresolveThread": "إلغاء تحديد سلسلة المناقشة كمحلولة",
+ "resolved": "تم الحل",
+ "outdated": "قديم",
+ "comment_one": "تعليق واحد",
+ "comment": "التعليقات: {{displayCount}}",
+ "comment_other": "التعليقات: {{displayCount}}",
+ "startedRelative": " · بدأت {{relative}}",
+ "couldNotLoadMore": "تعذّر تحميل المزيد من التعليقات.",
+ "retryLoadingMore": "إعادة محاولة تحميل المزيد من التعليقات",
+ "loadMoreComments": "تحميل المزيد من التعليقات",
+ "addReaction": "إضافة تفاعل",
+ "reactionPill": "تفاعل {{emoji}}، {{displayCount}} {{countLabel}}",
+ "reaction_one": "تفاعل",
+ "reaction": "تفاعل",
+ "reaction_other": "تفاعل",
+ "commentActions": "إجراءات التعليق",
+ "reportContent": "الإبلاغ عن المحتوى",
+ "reportUser": "الإبلاغ عن المستخدم",
+ "mute": "كتم",
+ "block": "حظر",
+ "blockedUser": "تم حظر {{login}}",
+ "mutedUser": "تم كتم {{login}}",
+ "replyPlaceholder": "الرد…",
+ "replyBody": "نص الرد",
+ "submitReply": "إرسال الرد",
+ "termsTitle": "شروط الخدمة",
+ "termsCopy": "يجب أن يكون عمرك 13 عامًا أو أكثر للنشر.",
+ "termsAcceptRetry": "تعذّر قبول الشروط. تحقق من اتصالك وحاول مرة أخرى.",
+ "viewTerms": "عرض الشروط",
+ "acceptTerms": "قبول",
+ "replyBadRequest": "لا يمكن نشر هذا الرد. ربما تغيّرت سلسلة المناقشة.",
+ "replyForbidden": "ليست لديك صلاحية للرد على طلب السحب هذا.",
+ "replyForbiddenTerm": "ليست لديك صلاحية للرد على {{term}} هذا.",
+ "moderation": {
+ "block": {
+ "retryable": "تعذّر حظر هذا المستخدم. تحقق من اتصالك وحاول مرة أخرى.",
+ "terminal": "لا يمكن حظر هذا المستخدم."
+ },
+ "mute": {
+ "retryable": "تعذّر كتم هذا المستخدم. تحقق من اتصالك وحاول مرة أخرى.",
+ "terminal": "لا يمكن كتم هذا المستخدم."
+ },
+ "reportContent": {
+ "retryable": "تعذّر الإبلاغ عن هذا التعليق. تحقق من اتصالك وحاول مرة أخرى.",
+ "terminal": "لا يمكن الإبلاغ عن هذا التعليق."
+ },
+ "reportUser": {
+ "retryable": "تعذّر الإبلاغ عن هذا المستخدم. تحقق من اتصالك وحاول مرة أخرى.",
+ "terminal": "لا يمكن الإبلاغ عن هذا المستخدم."
+ }
+ },
+ "accessDeniedMessage": "ليست لديك صلاحية لعرض مناقشة PR هذا.",
+ "unavailable": "المناقشة غير متاحة.",
+ "unavailableMessage": "ربما تمت إزالة طلب السحب هذا.",
+ "couldNotLoad": "تعذّر تحميل المناقشة.",
+ "loading": "جارٍ تحميل المناقشة",
+ "noDiscussion": "لا توجد مناقشة بعد",
+ "noDiscussionDescription": "لا توجد سلاسل مناقشة للمراجعة أو تعليقات عامة على طلب السحب هذا.",
+ "reviewFiles": "مراجعة الملفات",
+ "quotedDiffSnippet": "مقتطف مقتبس من الفروق",
+ "moreLinesAbove": "… توجد أسطر أخرى أعلاه، عددها {{displayCount}}.",
+ "termsAcceptRequired": "يجب أن توافق على شروط الخدمة للنشر.",
+ "termsOutdatedCopy": "تغيّرت شروط الخدمة. أعد فتح هذه الشاشة للموافقة على أحدث نسخة.",
+ "termsCheckRetryCopy": "تعذّر التحقق من شروط الخدمة. تحقق من اتصالك وحاول مرة أخرى.",
+ "reactions": {
+ "thumbsUp": "إعجاب",
+ "thumbsDown": "عدم إعجاب",
+ "laugh": "ضحك",
+ "hooray": "احتفال",
+ "confused": "حيرة",
+ "heart": "قلب",
+ "rocket": "صاروخ",
+ "eyes": "عيون"
+ },
+ "anchor": {
+ "fileCommentOnPath": "تعليق على الملف {{path}}",
+ "fileComment": "تعليق على الملف",
+ "outdatedOnPathLines": "قديم في {{path}} {{lines}}",
+ "outdatedOnLines": "قديم في {{lines}}",
+ "outdatedOnPath": "قديم في {{path}}"
+ },
+ "deletedUser": "مستخدم محذوف",
+ "comment_zero": "عدد التعليقات: {{displayCount}}",
+ "comment_two": "تعليقان ({{displayCount}})",
+ "comment_few": "{{displayCount}} تعليقات",
+ "comment_many": "{{displayCount}} تعليقًا",
+ "reaction_zero": "تفاعل",
+ "reaction_two": "تفاعلان",
+ "reaction_few": "تفاعلات",
+ "reaction_many": "تفاعلًا"
+ },
+ "couldNotOpenGitHubAppSettings": "تعذّر فتح إعدادات تطبيق GitHub.",
+ "installKiloGitHubApp": "تثبيت تطبيق Kilo على GitHub",
+ "checkConnection": "التحقق من الاتصال",
+ "couldNotLoadPullRequest": "تعذّر تحميل طلب السحب.",
+ "description": "الوصف",
"noDescriptionProvided": "لا يوجد وصف.",
- "noFilesChanged": "لم تتغير أي ملفات",
- "noFilesChangedDescription": "لا يتضمن طلب السحب هذا أي تغييرات على الملفات.",
+ "review": "مراجعة",
+ "reviewPullRequest": "مراجعة طلب السحب",
+ "headLine": "{{counts}} · آخر إيداع: {{sha}}",
+ "entry": {
+ "eyebrow": "افتح طلب سحب أو طلب دمج باستخدام عنوان URL.",
+ "pastePrLink": "الصق رابط طلب سحب أو طلب دمج",
+ "noRecentPrs": "لا توجد مراجعات حديثة",
+ "noRecentPrsDescription": "الصق رابطًا أعلاه لبدء المراجعة. سيظهر هنا في المرة القادمة.",
+ "couldNotLoad": "تعذّر التحميل.",
+ "removeFromRecentsTitle": "إزالة الطلب من القائمة الأخيرة؟",
+ "removeFromRecentsMessage": "ستتم إزالة هذه المراجعة من قائمة العناصر الأخيرة.",
+ "removeRecentAccessibility": "إزالة {{repo}} من قائمة الطلبات الأخيرة",
+ "urlAccessibility": "أدخل عنوان URL لطلب سحب أو طلب دمج",
+ "urlPlaceholder": "عنوان URL لطلب السحب أو طلب الدمج",
+ "openAccessibility": "فتح طلب سحب أو طلب دمج",
+ "clearLink": "مسح الرابط",
+ "pasteLink": "الصق رابط طلب سحب أو طلب دمج",
+ "open": "فتح"
+ },
+ "checks": {
+ "checksCount": "الفحوصات: {{displayCount}}",
+ "couldNotLoad": "تعذّر تحميل الفحوصات.",
+ "failed": "فاشلة: {{displayCount}}",
+ "noAccess": "ليست لديك صلاحية للوصول إلى فحوصات هذا المستودع.",
+ "noChecksReported": "لا توجد نتائج فحوصات",
+ "notAvailable": "الفحوصات غير متاحة بعد. ربما لم يُعالَج آخر إيداع، أو أن تطبيق Kilo على GitHub غير مثبّت في المستودع المصدر.",
+ "openDetails": "فتح تفاصيل {{name}}",
+ "passed": "ناجحة: {{displayCount}}",
+ "pending": "قيد الانتظار: {{displayCount}}",
+ "retryChecks": "إعادة محاولة تحميل الفحوصات",
+ "skipped": "تم تخطيها: {{displayCount}}",
+ "title": "الفحوصات",
+ "viewOnGitHub": "عرض PR على GitHub",
+ "checkDetails": "تفاصيل الفحص"
+ },
+ "inbox": {
+ "couldNotLoad": "تعذّر تحميل صندوق الوارد.",
+ "loading": "جارٍ تحميل صندوق الوارد",
+ "noReviewRequests": "لا توجد طلبات مراجعة",
+ "noReviewRequestsDescription": "تظهر هنا طلبات السحب التي تنتظر مراجعتك. ويمكنك أيضًا لصق أي رابط PR أعلاه.",
+ "title": "صندوق الوارد"
+ },
+ "composer": {
+ "addTitle": "إضافة تعليق",
+ "addToReview": "إضافة إلى المراجعة",
+ "comment": "تعليق",
+ "commentBody": "نص التعليق",
+ "commentBodyPlaceholder": "نص التعليق",
+ "commentNow": "نشر التعليق الآن",
+ "discardMessage": "ستفقد مسودتك.",
+ "discardTitle": "إلغاء التعليق؟",
+ "editTitle": "تعديل التعليق",
+ "insertSuggestion": "إدراج اقتراح",
+ "insertSuggestionA11y": "إدراج اقتراح شيفرة",
+ "loadFailedTitle": "تعذّر تحميل محرر التعليقات.",
+ "ok": "حسنًا",
+ "unavailableMessage": "تم حذف هذا التعليق المعلّق أو إرساله بالفعل.",
+ "unavailableTitle": "التعليق غير متاح",
+ "bodyEmpty": "لا يمكن أن يكون نص التعليق فارغًا.",
+ "suggestionsOnlyAddedLines": "تنطبق الاقتراحات على الأسطر المضافة فقط.",
+ "tapDiffLineToSuggest": "اضغط على سطر في عرض الفروق لتفعيل الاقتراحات."
+ },
+ "connect": {
+ "checkFailedTitle": "تعذّر التحقق من ربط حساب GitHub.",
+ "checkFailedMessage": "لا يمكن معرفة حالة تسجيل الدخول حتى يكتمل التحميل.",
+ "checkFailedTitleGitLab": "تعذّر التحقق من ربط حساب GitLab.",
+ "checkFailedTitleBitbucket": "تعذّر التحقق من ربط حساب Bitbucket.",
+ "providerCheckFailedMessage": "حالة الاتصال غير متاحة حتى يتم تحميلها.",
+ "reconnectTitle": "إعادة ربط GitHub",
+ "reconnectDescription": "أُلغي ربط حسابك على GitHub. أعد ربطه لمواصلة مراجعة طلبات السحب على الجوال.",
+ "description": "اربط حسابك على GitHub لمراجعة طلبات السحب على الجوال.",
+ "gitlabDescription": "اربط حسابك في GitLab لمراجعة طلبات الدمج على الجوال.",
+ "bitbucketDescription": "اربط Bitbucket بهذه المؤسسة لمراجعة طلبات السحب على الجوال.",
+ "bitbucketOrgOnlyDescription": "اختر مؤسسة في ملفك الشخصي لمراجعة طلبات السحب الخاصة بها على Bitbucket."
+ },
+ "screen": {
+ "shareA11y": "مشاركة طلب السحب",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "ستتم إزالة هذا التعليق من قائمة انتظار المراجعة.",
+ "deletePendingTitle": "حذف التعليق المعلّق؟",
+ "loadFailedTitle": "تعذّر تحميل شاشة إرسال المراجعة.",
+ "pendingComment": "تعليق معلّق",
+ "pendingComment_other": "تعليق معلّق",
+ "pendingComment_one": "تعليق معلّق",
+ "summaryOptional": "الملخص (اختياري)",
+ "partialPostedMessage": "عدد التعليقات المنشورة: {{displayFreshCount}}. بقيت في قائمة الانتظار تعليقات مرتبطة بإيداع أقدم، وعددها {{displayStaleCount}}.",
+ "submitCountOfTotal": "إرسال التعليقات: {{displayFreshCount}} من {{displayTotalCount}}",
+ "submitReview": "إرسال المراجعة",
+ "pendingComment_zero": "تعليق معلّق",
+ "pendingComment_two": "تعليقان معلّقان",
+ "pendingComment_few": "تعليقات معلّقة",
+ "pendingComment_many": "تعليقًا معلّقًا",
+ "blockedRequestChanges": "أضف ملخصًا أو تعليقًا واحدًا على الأقل لطلب تغييرات.",
+ "blockedComment": "أضف ملخصًا أو تعليقًا واحدًا على الأقل لنشر مراجعة من نوع تعليق."
+ },
+ "reconnectNotice": {
+ "title": "انتهت صلاحية الربط مع GitHub.",
+ "message": "لم يعد ربط حسابك على GitHub صالحًا. أعد التحقق من الربط، وسيُطلب منك إعادة ربط الحساب إذا لزم الأمر.",
+ "gitlabTitle": "انتهت صلاحية الربط مع GitLab.",
+ "bitbucketTitle": "انتهت صلاحية الربط مع Bitbucket.",
+ "providerMessage": "لم يعد ربط حسابك على {{provider}} صالحًا. أعد التحقق من الربط، وسيُطلب منك إعادة ربط الحساب إذا لزم الأمر."
+ },
+ "eventChips": {
+ "comment": "تعليق",
+ "label": "نوع المراجعة",
+ "requestChanges": "طلب تغييرات"
+ },
"overview": {
"commit": "إيداع",
"commit_other": "إيداع",
@@ -2746,43 +2833,25 @@
"summaryA11y": "ملخص المراجعة",
"summaryPlaceholder": "ملخص اختياري للمراجعة"
},
- "pullRequestUnavailable": "طلب السحب غير متاح",
- "pullRequestUnavailableDescription": "لا يمكن فتح PR هذا. ربما حُذف، أو أن المستودع خاص، أو أن تطبيق Kilo على GitHub غير مثبّت فيه.",
- "reconnectNotice": {
- "message": "لم يعد ربط حسابك على GitHub صالحًا. أعد التحقق من الربط، وسيُطلب منك إعادة ربط الحساب إذا لزم الأمر.",
- "title": "انتهت صلاحية الربط مع GitHub."
- },
- "review": "مراجعة",
- "reviewPullRequest": "مراجعة طلب السحب",
- "screen": {
- "shareA11y": "مشاركة طلب السحب",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "عمود فارغ في عرض الفروق",
- "emptyDiffRow": "صف فارغ في عرض الفروق",
- "newOnly": "الجديد فقط: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ لا يوجد سطر جديد في نهاية الملف",
- "oldNew": "القديم: {{old}} | الجديد: {{new}}",
- "oldOnly": "القديم فقط: {{text}}"
+ "tabs": {
+ "discussion": "المناقشة",
+ "files": "ملف",
+ "overview": "نظرة عامة"
},
- "submit": {
- "deletePendingMessage": "ستتم إزالة هذا التعليق من قائمة انتظار المراجعة.",
- "deletePendingTitle": "حذف التعليق المعلّق؟",
- "loadFailedTitle": "تعذّر تحميل شاشة إرسال المراجعة.",
- "pendingComment": "تعليق معلّق",
- "pendingComment_other": "تعليق معلّق",
- "pendingComment_one": "تعليق معلّق",
- "summaryOptional": "الملخص (اختياري)",
- "partialPostedMessage": "عدد التعليقات المنشورة: {{displayFreshCount}}. بقيت في قائمة الانتظار تعليقات مرتبطة بإيداع أقدم، وعددها {{displayStaleCount}}.",
- "submitCountOfTotal": "إرسال التعليقات: {{displayFreshCount}} من {{displayTotalCount}}",
- "submitReview": "إرسال المراجعة",
- "pendingComment_zero": "تعليق معلّق",
- "pendingComment_two": "تعليقان معلّقان",
- "pendingComment_few": "تعليقات معلّقة",
- "pendingComment_many": "تعليقًا معلّقًا",
- "blockedRequestChanges": "أضف ملخصًا أو تعليقًا واحدًا على الأقل لطلب تغييرات.",
- "blockedComment": "أضف ملخصًا أو تعليقًا واحدًا على الأقل لنشر مراجعة من نوع تعليق."
+ "terms": {
+ "pullRequest": "طلب سحب",
+ "mergeRequest": "طلب دمج",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "مشاركة طلب الدمج",
+ "viewOnProvider": "عرض على {{provider}}",
+ "mergeRequestUnavailable": "طلب الدمج غير متاح",
+ "unavailableDescription": "ربما تم حذفه، أو ربما لا تملك صلاحية الوصول إليه.",
+ "accessDeniedMergeRequest": "ليست لديك صلاحية لعرض طلب الدمج هذا.",
+ "couldNotLoadMergeRequest": "تعذّر تحميل طلب الدمج.",
+ "discussionAccessDenied": "ليست لديك صلاحية لعرض مناقشة طلب الدمج هذا.",
+ "discussionUnavailableMessage": "ربما تمت إزالة طلب الدمج هذا.",
+ "noDiscussionDescription": "لا توجد سلاسل مناقشة للمراجعة أو تعليقات عامة على طلب الدمج هذا.",
+ "noFilesChangedDescription": "لا يتضمن طلب الدمج هذا أي تغييرات على الملفات."
},
"fileStatus": {
"changed": "متغيّر",
@@ -2790,11 +2859,6 @@
"modified": "معدّل",
"renamed": "أُعيدت تسميته"
},
- "tabs": {
- "discussion": "المناقشة",
- "files": "ملف",
- "overview": "نظرة عامة"
- },
"diff": {
"selectedTapToChange": "تم تحديد {{label}}، اضغط لتغيير التحديد",
"truncationBanner": "نعرض أول {{limit}} ملفًا من الملفات التي تغيّرت، وعددها {{total}}، بسبب حد API لدى GitHub.",
@@ -2805,7 +2869,7 @@
"emptyLine": "(فارغ)"
},
"linkPasteClipboardEmpty": "الحافظة فارغة.",
- "linkPasteNotAPullRequest": "هذا ليس رابط طلب سحب على GitHub.",
+ "linkPasteNotAPullRequest": "هذا ليس رابط طلب سحب أو طلب دمج",
"announce": {
"commentPosted": "تم نشر التعليق",
"reviewSubmitted": "تم إرسال المراجعة",
@@ -2814,6 +2878,7 @@
"mutationError": {
"commentNotPosted": "لا يمكن نشر هذا التعليق. ربما تغيّر السطر المحدد، أو تم تحديث PR.",
"reviewNotSubmitted": "لا يمكن إرسال هذه المراجعة كما هي. ربما تغيّر PR، أو أنك تحاول مراجعة طلب سحب أنشأته بنفسك.",
+ "reviewNotSubmittedTerm": "لا يمكن إرسال هذه المراجعة كما هي. ربما تم تغيير {{term}}، أو لا يمكنك مراجعة {{term}} الخاص بك.",
"couldNotPostComment": "تعذّر نشر التعليق.",
"couldNotSubmitReview": "تعذّر إرسال المراجعة. تحقق من اتصالك وحاول مرة أخرى."
},
@@ -2821,6 +2886,7 @@
"couldNotReply": "تعذّر الرد.",
"couldNotCompleteAction": "تعذّر إكمال هذا الإجراء.",
"mergeResultDefaultError": "لم يكمل GitHub الدمج.",
+ "mergeResultNotCompleted": "لم يتم دمج {{term}}. تحقق من حالته وأعد المحاولة.",
"ambiguous": "تعذّر التأكيد — تحقق من PR قبل إعادة المحاولة.",
"persistenceFailed": "تعذّر تسجيل هذا الإجراء. حاول مرة أخرى لاحقًا.",
"forbidden": "هذا الإجراء غير مسموح."
diff --git a/apps/mobile/src/i18n/locales/az.json b/apps/mobile/src/i18n/locales/az.json
index 0c06a787b1..9925f27e12 100644
--- a/apps/mobile/src/i18n/locales/az.json
+++ b/apps/mobile/src/i18n/locales/az.json
@@ -36,6 +36,7 @@
"cost": "Xərc",
"discard": "Ləğv et",
"findings": "Aşkarlanan problemlər",
+ "mergeRequest": "merge sorğusu",
"notConnected": "Qoşulmayıb",
"notifications": "Bildirişlər",
"pullRequest": "birləşdirmə sorğusu",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Boş dəyişiklik sətri"
},
"connectionExpired": "GitHub bağlantısının müddəti bitdi.",
+ "capabilities": {
+ "banner": {
+ "title": "Bu provayderdə əlçatan deyil",
+ "accessibility": "Bu provayderdə əlçatan deyil: {{reason}}"
+ }
+ },
"merge": {
"merge": "Birləşdirmə",
"mergeNow": "İndi birləşdir",
"mergePullRequest": "Sorğunun birləşdirilməsi",
+ "mergeTermTitle": "{{term}}nun birləşdirilməsi",
"enableAutoMerge": "Avtomatik birləşdirməni aktivləşdir",
"disableAutoMerge": "Avtomatik birləşdirməni söndür",
"autoMergeOn": "Avtomatik birləşdirmə aktivdir",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Birləşdirmədən sonra budağı sil",
"noEnabledMethods": "Bu repozitoriyada heç bir birləşdirmə üsulu aktiv deyil. Repozitoriyanın inzibatçısından adi birləşdirmə, sıxlaşdırma və ya bazanı dəyişmə üsulunu aktivləşdirməsini istə.",
"confirmTitle": "Birləşdirmə sorğusu birləşdirilsin?",
+ "confirmTitleTerm": "{{term}} birləşdirilsin?",
"confirmMessage": "Dəyişikliklərin əsas budağa birləşdiriləcək.",
"enableAutoMergeConfirmTitle": "Avtomatik birləşdirmə aktivləşdirilsin?",
"enableAutoMergeConfirmMessage": "Bütün məcburi yoxlamalar uğurla başa çatdıqda GitHub bu birləşdirmə sorğusunu avtomatik birləşdirəcək.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}}, pipeline uğurlu olduqda avtomatik olaraq birləşdiriləcək.",
+ "enableAutoMergeDescriptionTerm": "GitLab, pipeline uğurlu olduqda bu {{term}}nu avtomatik olaraq birləşdirir.",
"forbidden": "Bu birləşdirmə sorğusunu birləşdirmək icazən yoxdur.",
"cannotMerge": "Bu birləşdirmə sorğusunu indiki vəziyyətdə birləşdirmək mümkün deyil.",
"couldNotMerge": "Birləşdirmə sorğusunu birləşdirmək mümkün olmadı.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Artıq birləşdirilib",
- "closed": "Bu birləşdirmə sorğusu bağlanıb"
+ "closed": "Bu birləşdirmə sorğusu bağlanıb",
+ "closedMergeRequest": "Bu merge sorğusu bağlanıb"
},
"partialSuccessBanner": {
"body": "Budağı silmək mümkün olmadı. Səbəb: {{reason}}",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Bu birləşdirmə sorğusunu hələ birləşdirmək mümkün deyil",
"notMergeableDetail": "GitHub birləşdirmə vəziyyətini {{state}} kimi bildirdi."
},
+ "restrictions": {
+ "title": "Birləşdirmə məhdudiyyətləri",
+ "approvalsRequired_one": "{{displayCount}} təsdiq tələb olunur",
+ "approvalsRequired_other": "{{displayCount}} təsdiq tələb olunur",
+ "pipelineMustSucceed": "Birləşdirmədən əvvəl pipeline uğurlu olmalıdır."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline ən son kommitdə uğursuz olur.",
+ "pendingPipeline": "Pipeline ən son kommitdə hələ işləyir.",
+ "permission": "Bu {{term}}nu birləşdirmək icazən yoxdur.",
+ "draft": "Birləşdirmədən əvvəl {{term}}nu kod baxışına hazır kimi işarələ."
+ },
"methodLabels": {
"merge": "Birləşdirmə kommiti yarat",
"squash": "Sıxlaşdır və birləşdir",
@@ -448,6 +472,7 @@
"acceptTerms": "Qəbul et",
"replyBadRequest": "Bu cavabı göndərmək mümkün deyil. Müzakirə dəyişmiş ola bilər.",
"replyForbidden": "Bu birləşdirmə sorğusuna cavab vermək icazən yoxdur.",
+ "replyForbiddenTerm": "Bu {{term}}na cavab vermək icazən yoxdur.",
"moderation": {
"reportContent": {
"terminal": "Bu şərhdən şikayət etmək mümkün deyil.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Birləşdirmə sorğusunu nəzərdən keçir",
"headLine": "{{counts}} · son kommit: {{sha}}",
"entry": {
- "eyebrow": "Birləşdirmə sorğusunu URL ilə aç.",
- "pastePrLink": "PR keçidini yapışdır",
- "noRecentPrs": "Son baxılan PR yoxdur",
- "noRecentPrsDescription": "Kod baxışına başlamaq üçün yuxarıdakı sahəyə PR keçidini yapışdır — növbəti dəfə burada görünəcək.",
+ "eyebrow": "Birləşdirmə sorğusunu və ya merge sorğusunu URL ilə aç",
+ "pastePrLink": "Birləşdirmə sorğusu və ya merge sorğusu keçidini yapışdır",
+ "noRecentPrs": "Son baxış yoxdur",
+ "noRecentPrsDescription": "Kod baxışına başlamaq üçün yuxarıya keçid yapışdır — növbəti dəfə burada görünəcək.",
"couldNotLoad": "Yükləmək mümkün olmadı.",
"removeFromRecentsTitle": "Son baxılanlardan silinsin?",
- "removeFromRecentsMessage": "Bu birləşdirmə sorğusu son baxılanlar siyahından silinəcək.",
+ "removeFromRecentsMessage": "Bu baxış son baxılanlar siyahısından silinəcək.",
"removeRecentAccessibility": "{{repo}} repozitoriyasını son baxılanlardan sil",
- "urlAccessibility": "GitHub birləşdirmə sorğusunun URL-i",
- "clearLink": "Birləşdirmə sorğusunun keçidini təmizlə",
- "pasteLink": "Birləşdirmə sorğusunun keçidini yapışdır",
+ "urlAccessibility": "Birləşdirmə sorğusu və ya merge sorğusu URL-ni daxil et",
+ "urlPlaceholder": "Birləşdirmə sorğusu və ya merge sorğusu URL-i",
+ "openAccessibility": "Birləşdirmə sorğusu və ya merge sorğusu aç",
+ "clearLink": "Keçidi təmizlə",
+ "pasteLink": "Birləşdirmə sorğusunun və ya merge sorğusunun keçidini yapışdır",
"open": "Açıq"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub bağlantısını yoxlamaq mümkün olmadı.",
"checkFailedMessage": "Bu məlumat yüklənənədək giriş statusunu göstərmək mümkün deyil.",
+ "checkFailedTitleGitLab": "GitLab bağlantısını yoxlamaq mümkün olmadı.",
+ "checkFailedTitleBitbucket": "Bitbucket bağlantısını yoxlamaq mümkün olmadı.",
+ "providerCheckFailedMessage": "Yüklənənə qədər bağlantı statusu əlçatan deyil.",
"reconnectTitle": "GitHub-a yenidən qoşul",
"reconnectDescription": "GitHub bağlantın ləğv edilib. Mobil cihazda birləşdirmə sorğularını nəzərdən keçirməyə davam etmək üçün yenidən qoşul.",
- "description": "Mobil cihazda birləşdirmə sorğularını nəzərdən keçirmək üçün GitHub hesabını qoş."
+ "description": "Mobil cihazda birləşdirmə sorğularını nəzərdən keçirmək üçün GitHub hesabını qoş.",
+ "gitlabDescription": "Mobil cihazda merge sorğularına baxış keçirmək üçün GitLab hesabını qoş.",
+ "bitbucketDescription": "Mobil cihazda birləşdirmə sorğularına baxış keçirmək üçün Bitbucket-ı bu təşkilata qoş.",
+ "bitbucketOrgOnlyDescription": "Profilində bir təşkilat seç və onun Bitbucket birləşdirmə sorğularına baxış keçir."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub bağlantısının müddəti bitdi.",
- "message": "GitHub bağlantın artıq etibarlı deyil. Bağlantını yenidən yoxla — lazım olsa, yenidən qoşulmaq təklif olunacaq."
+ "message": "GitHub bağlantın artıq etibarlı deyil. Bağlantını yenidən yoxla — lazım olsa, yenidən qoşulmaq təklif olunacaq.",
+ "gitlabTitle": "GitLab bağlantısının müddəti bitdi.",
+ "bitbucketTitle": "Bitbucket bağlantısının müddəti bitdi.",
+ "providerMessage": "{{provider}} bağlantın artıq etibarlı deyil. Bağlantını yenidən yoxla — lazım olsa, yenidən qoşulmaq təklif olunacaq."
},
"eventChips": {
"comment": "Şərh",
@@ -643,6 +679,21 @@
"files": "Fayl",
"discussion": "Müzakirə"
},
+ "terms": {
+ "pullRequest": "Birləşdirmə sorğusu",
+ "mergeRequest": "Merge sorğusu",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Merge sorğusunu paylaş",
+ "viewOnProvider": "{{provider}} üzərində bax",
+ "mergeRequestUnavailable": "Merge sorğusu əlçatan deyil",
+ "unavailableDescription": "Silinmiş ola bilər, yaxud ona giriş icazən olmaya bilər.",
+ "accessDeniedMergeRequest": "Bu merge sorğusuna baxmaq icazən yoxdur.",
+ "couldNotLoadMergeRequest": "Merge sorğusunu yükləmək mümkün olmadı.",
+ "discussionAccessDenied": "Bu merge sorğusunun müzakirəsinə baxmaq icazən yoxdur.",
+ "discussionUnavailableMessage": "Bu merge sorğusu silinmiş ola bilər.",
+ "noDiscussionDescription": "Bu merge sorğusunda kod baxışı müzakirələri və ya ümumi şərhlər yoxdur.",
+ "noFilesChangedDescription": "Bu merge sorğusunda fayl dəyişikliyi yoxdur."
+ },
"fileStatus": {
"modified": "Dəyişdirilib",
"renamed": "Adı dəyişdirilib",
@@ -659,7 +710,7 @@
"emptyLine": "(boş)"
},
"linkPasteClipboardEmpty": "Mübadilə buferi boşdur.",
- "linkPasteNotAPullRequest": "Bu, GitHub birləşdirmə sorğusunun keçidi deyil.",
+ "linkPasteNotAPullRequest": "Bu, birləşdirmə sorğusu və ya merge sorğusu keçidi deyil",
"announce": {
"commentPosted": "Şərh göndərildi",
"reviewSubmitted": "Kod baxışı göndərildi",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Bu şərhi göndərmək mümkün deyil. Seçilmiş sətir dəyişmiş və ya PR yenilənmiş ola bilər.",
"reviewNotSubmitted": "Bu kod baxışını indiki vəziyyətdə göndərmək mümkün deyil. PR dəyişmiş ola bilər və ya öz birləşdirmə sorğuna kod baxışı göndərməyə çalışırsan.",
+ "reviewNotSubmittedTerm": "Bu baxış olduğu kimi göndərilə bilmir. {{term}} dəyişmiş ola bilər və ya öz {{term}}na baxış keçirə bilməzsən.",
"couldNotPostComment": "Şərhi göndərmək mümkün olmadı.",
"couldNotSubmitReview": "Kod baxışını göndərmək mümkün olmadı. Bağlantını yoxla və yenidən cəhd et."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Cavab vermək mümkün olmadı.",
"couldNotCompleteAction": "Bu əməliyyatı tamamlamaq mümkün olmadı.",
"mergeResultDefaultError": "GitHub birləşdirməni tamamlamadı.",
+ "mergeResultNotCompleted": "{{term}} birləşdirilmədi. Vəziyyətini yoxla və yenidən cəhd et.",
"ambiguous": "Nəticəni təsdiqləmək mümkün olmadı — yenidən cəhd etməzdən əvvəl PR-i yoxla.",
"persistenceFailed": "Bu əməliyyatı qeydə almaq mümkün olmadı. Bir az sonra yenidən cəhd et.",
"forbidden": "İcazə yoxdur."
@@ -1988,11 +2041,31 @@
"retryConnection": "Yenidən qoşul"
},
"newSession": {
+ "recentlyUsed": "Son istifadə edilənlər",
+ "couldNotLoadGithubRepositories": "GitHub repozitoriyalarını yükləmək mümkün olmadı.",
+ "couldNotLoadGitlabRepositories": "GitLab repozitoriyalarını yükləmək mümkün olmadı.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket repozitoriyalarını yükləmək mümkün olmadı.",
"connectGithubDescription": "GitHub hesabını brauzerdə qoş, sonra repozitoriya seçmək üçün buraya qayıt.",
+ "connectGitlabDescription": "GitLab hesabını brauzerdə qoş, sonra repozitoriya seçmək üçün buraya qayıt.",
+ "connectBitbucketDescription": "Bitbucket hesabını brauzerdə qoş, sonra repozitoriya seçmək üçün buraya qayıt.",
"openGithub": "GitHub-u aç",
+ "openGitlab": "GitLab-ı aç",
+ "openBitbucket": "Bitbucket-ı aç",
"refreshRepositories": "Repozitoriyaları yenilə",
"githubConnected": "GitHub qoşulub",
+ "gitlabConnected": "GitLab qoşulub",
"noRepositoriesVisible": "Heç bir repozitoriya görünmür. Kilo GitHub tətbiqinin repozitoriyalara giriş icazəsini yoxla, sonra siyahını yenilə.",
+ "noRepositoriesVisibleGitlab": "Heç bir repozitoriya görünmür. GitLab repozitoriyalarına giriş icazəsini yoxla, sonra siyahını yenilə.",
+ "noRepositoriesVisibleBitbucket": "Heç bir repozitoriya görünmür. Bitbucket repozitoriyalarına giriş icazəsini yoxla, sonra siyahını yenilə.",
+ "bitbucketOrganizationsOnly": "Bitbucket yalnız təşkilatlar üçün əlçatandır.",
+ "branchPickerTitle": "Budaq seç",
+ "branchDefault": "Defolt",
+ "branchAccessibility": "Budaq: {{label}}",
+ "branchLoading": "Budaqlar yüklənir",
+ "branchLoadError": "Budaqları yükləmək mümkün olmadı",
+ "branchUnavailable": "Bu repozitoriya üçün budaq əlçatan deyil. Provayderdəki icazələrini yoxla, sonra başqa repozitoriya seç.",
+ "branchEmpty": "Əlçatan budaq yoxdur",
+ "branchPlaceholder": "Budaq seç",
"runOnWithTarget": "İcra mühiti: {{target}}",
"environment": "Mühit",
"couldNotLoadEnvironment": "Mühitini yükləmək mümkün olmadı.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Repozitoriyaları yeniləmək mümkün olmadı. Yenidən cəhd et.",
"discardDraftTitle": "Qaralama silinsin?",
"discardDraftMessage": "Sorğun silinəcək.",
+ "discardWithUploadsMessage": "Sorğun və heç bir mesaja əlavə edilməmiş yüklənən fayllar silinəcək.",
"discardFailed": "Qaralamanı silmək mümkün olmadı. Yenidən cəhd et.",
"remoteHint": "Kompüterindəki kilo prosesini idarə etmək üçün kompüterdə `kilo remote` əmrini və ya işləyən CLI sessiyasında `/remote` əmrini işə sal.",
- "connectBitbucketDescription": "Bitbucket hesabını brauzerdə qoş, sonra repozitoriya seçmək üçün buraya qayıt.",
- "connectGitlabDescription": "GitLab hesabını brauzerdə qoş, sonra repozitoriya seçmək üçün buraya qayıt.",
- "couldNotLoadBitbucketRepositories": "Bitbucket repozitoriyalarını yükləmək mümkün olmadı.",
- "couldNotLoadGithubRepositories": "GitHub repozitoriyalarını yükləmək mümkün olmadı.",
- "couldNotLoadGitlabRepositories": "GitLab repozitoriyalarını yükləmək mümkün olmadı.",
- "gitlabConnected": "GitLab qoşulub",
- "noRepositoriesVisibleBitbucket": "Heç bir repozitoriya görünmür. Bitbucket repozitoriyalarına giriş icazəsini yoxla, sonra siyahını yenilə.",
- "noRepositoriesVisibleGitlab": "Heç bir repozitoriya görünmür. GitLab repozitoriyalarına giriş icazəsini yoxla, sonra siyahını yenilə.",
- "openBitbucket": "Bitbucket-ı aç",
- "openGitlab": "GitLab-ı aç",
- "recentlyUsed": "Son istifadə edilənlər",
"continueFrom": "{{title}} davam etdirilir.",
"importingSession": "Sessiya idxal olunur",
"cliCannotContinue": "Bu CLI sessiyanı davam etdirə bilmir. Cloud Agent və ya başqa CLI seç.",
- "importFailed": "Bu sessiyanı idxal etmək mümkün olmadı.",
- "discardWithUploadsMessage": "Sorğun və heç bir mesaja əlavə edilməmiş yüklənən fayllar silinəcək."
+ "importFailed": "Bu sessiyanı idxal etmək mümkün olmadı."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} fayl yeniləndi.",
diff --git a/apps/mobile/src/i18n/locales/be.json b/apps/mobile/src/i18n/locales/be.json
index e4f18b2c76..a5d4f1ff32 100644
--- a/apps/mobile/src/i18n/locales/be.json
+++ b/apps/mobile/src/i18n/locales/be.json
@@ -36,6 +36,7 @@
"cost": "Кошт",
"discard": "Адкінуць",
"findings": "Выяўленыя праблемы",
+ "mergeRequest": "merge-запыт",
"notConnected": "Не падключана",
"notifications": "Апавяшчэнні",
"pullRequest": "запыт на зліццё",
@@ -344,10 +345,17 @@
"emptyDiffRow": "Пусты радок параўнання"
},
"connectionExpired": "Тэрмін дзеяння падключэння да GitHub скончыўся.",
+ "capabilities": {
+ "banner": {
+ "title": "Недаступна ў гэтага правайдара",
+ "accessibility": "Недаступна ў гэтага правайдара: {{reason}}"
+ }
+ },
"merge": {
"merge": "Зліццё",
"mergeNow": "Зліць зараз",
"mergePullRequest": "Зліццё запыту",
+ "mergeTermTitle": "Зліць {{term}}",
"enableAutoMerge": "Уключыць аўтазліццё",
"disableAutoMerge": "Адключыць аўтазліццё",
"autoMergeOn": "Аўтазліццё ўключана",
@@ -366,9 +374,12 @@
"deleteBranchAfterMerge": "Выдаліць галіну пасля зліцця",
"noEnabledMethods": "У гэтым рэпазіторыі не дазволены ніводны метад зліцця. Папрасі адміністратара дазволіць зліццё з асобным камітам, з аб'яднаннем камітаў або з перабазаваннем.",
"confirmTitle": "Зліць запыт?",
+ "confirmTitleTerm": "Зліць {{term}}?",
"confirmMessage": "Твае змены будуць уключаны ў базавую галіну.",
"enableAutoMergeConfirmTitle": "Уключыць аўтазліццё?",
"enableAutoMergeConfirmMessage": "GitHub аўтаматычна зліе гэты запыт, калі ўсе абавязковыя праверкі завершацца паспяхова.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} будзе аўтаматычна зліты пасля паспяховага выканання канвеера.",
+ "enableAutoMergeDescriptionTerm": "GitLab аўтаматычна злівае гэты {{term}} пасля паспяховага выканання канвеера.",
"forbidden": "У цябе няма дазволу зліваць гэты запыт.",
"cannotMerge": "Гэты запыт на зліццё немагчыма зліць у яго бягучым стане.",
"couldNotMerge": "Не атрымалася зліць запыт.",
@@ -379,7 +390,8 @@
},
"terminal": {
"alreadyMerged": "Ужо зліта",
- "closed": "Гэты запыт на зліццё закрыты"
+ "closed": "Гэты запыт на зліццё закрыты",
+ "closedMergeRequest": "Гэты merge-запыт закрыты"
},
"partialSuccessBanner": {
"body": "Не атрымалася выдаліць галіну: {{reason}}.",
@@ -405,6 +417,20 @@
"notMergeableTitle": "Гэты запыт пакуль немагчыма зліць",
"notMergeableDetail": "GitHub паведаміў пра наступны стан магчымасці зліцця: {{state}}."
},
+ "restrictions": {
+ "title": "Абмежаванні на зліццё",
+ "approvalsRequired_one": "Патрабуецца {{displayCount}} зацвярджэнне",
+ "approvalsRequired_other": "Патрабуецца {{displayCount}} зацвярджэнняў",
+ "pipelineMustSucceed": "Перад зліццём канвеер павінен завяршыцца паспяхова.",
+ "approvalsRequired_many": "Патрабуецца {{displayCount}} зацвярджэнняў",
+ "approvalsRequired_few": "Патрабуецца {{displayCount}} зацвярджэння"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Канвеер завяршаецца памылкай на апошнім каміце.",
+ "pendingPipeline": "Канвеер яшчэ выконваецца на апошнім каміце.",
+ "permission": "У вас няма правоў на зліццё {{term}}.",
+ "draft": "Перад зліццём перавядзіце {{term}} у стан гатоўнасці да агляду."
+ },
"methodLabels": {
"merge": "Стварыць каміт зліцця",
"squash": "Аб'яднаць каміты і зліць",
@@ -452,6 +478,7 @@
"acceptTerms": "Прыняць",
"replyBadRequest": "Немагчыма апублікаваць гэты адказ. Магчыма, абмеркаванне змянілася.",
"replyForbidden": "У цябе няма дазволу адказваць у гэтым запыце на зліццё.",
+ "replyForbiddenTerm": "У вас няма правоў адказваць у {{term}}.",
"moderation": {
"reportContent": {
"terminal": "На гэты каментар немагчыма паскардзіцца.",
@@ -483,10 +510,6 @@
"termsAcceptRequired": "Каб пакідаць паведамленні, трэба прыняць умовы выкарыстання.",
"termsOutdatedCopy": "Умовы выкарыстання змяніліся. Адкрый гэты экран зноў, каб прыняць новую версію.",
"termsCheckRetryCopy": "Не атрымалася праверыць умовы выкарыстання. Правер падключэнне да інтэрнэту і паспрабуй яшчэ раз.",
- "comment_few": "{{displayCount}} каментары",
- "comment_many": "{{displayCount}} каментароў",
- "reaction_few": "рэакцыі",
- "reaction_many": "рэакцый",
"reactions": {
"thumbsUp": "Вялікі палец уверх",
"thumbsDown": "Вялікі палец уніз",
@@ -504,7 +527,11 @@
"outdatedOnLines": "Састарэлы каментар: {{lines}}",
"outdatedOnPath": "Састарэлы каментар: {{path}}"
},
- "deletedUser": "выдалены карыстальнік"
+ "deletedUser": "выдалены карыстальнік",
+ "comment_few": "{{displayCount}} каментары",
+ "comment_many": "{{displayCount}} каментароў",
+ "reaction_few": "рэакцыі",
+ "reaction_many": "рэакцый"
},
"couldNotOpenGitHubAppSettings": "Не атрымалася адкрыць налады праграмы GitHub.",
"installKiloGitHubApp": "Усталяваць праграму Kilo для GitHub",
@@ -516,17 +543,19 @@
"reviewPullRequest": "Праверыць запыт на зліццё",
"headLine": "{{counts}} · апошні каміт {{sha}}",
"entry": {
- "eyebrow": "Адкрый запыт на зліццё па URL.",
- "pastePrLink": "Уставіць спасылку на PR",
- "noRecentPrs": "Няма нядаўніх PR",
- "noRecentPrsDescription": "Устаў вышэй спасылку на PR, каб пачаць праверку кода. У наступны раз гэты PR з'явіцца тут.",
+ "eyebrow": "Адкрыйце запыт на зліццё або merge-запыт па URL",
+ "pastePrLink": "Устаўце спасылку на запыт на зліццё або merge-запыт",
+ "noRecentPrs": "Няма нядаўніх аглядаў",
+ "noRecentPrsDescription": "Каб пачаць агляд, устаўце спасылку вышэй — наступным разам ён з'явіцца тут.",
"couldNotLoad": "Не атрымалася загрузіць.",
"removeFromRecentsTitle": "Выдаліць са спіса нядаўніх?",
- "removeFromRecentsMessage": "Гэты запыт на зліццё знікне з твайго спіса нядаўніх.",
+ "removeFromRecentsMessage": "Гэты агляд будзе выдалены са спісу нядаўніх.",
"removeRecentAccessibility": "Выдаліць {{repo}} са спіса нядаўніх",
- "urlAccessibility": "URL запыту на зліццё на GitHub",
- "clearLink": "Ачысціць спасылку на запыт на зліццё",
- "pasteLink": "Уставіць спасылку на запыт на зліццё",
+ "urlAccessibility": "Увядзіце URL запыту на зліццё або merge-запыту",
+ "urlPlaceholder": "URL запыту на зліццё або merge-запыту",
+ "openAccessibility": "Адкрыць запыт на зліццё або merge-запыт",
+ "clearLink": "Ачысціць спасылку",
+ "pasteLink": "Уставіць спасылку на запыт на зліццё або merge-запыт",
"open": "Адкрыць"
},
"checks": {
@@ -575,9 +604,15 @@
"connect": {
"checkFailedTitle": "Не атрымалася праверыць падключэнне да GitHub.",
"checkFailedMessage": "Стан уваходу недаступны, пакуль даныя не загрузяцца.",
+ "checkFailedTitleGitLab": "Не ўдалося праверыць падключэнне да GitLab",
+ "checkFailedTitleBitbucket": "Не ўдалося праверыць падключэнне да Bitbucket",
+ "providerCheckFailedMessage": "Стан падключэння недаступны, пакуль гэта не загрузіцца.",
"reconnectTitle": "Падключыць GitHub зноў",
"reconnectDescription": "Тваё падключэнне да GitHub адклікана. Падключыся зноў, каб працягнуць правяраць запыты на зліццё з мабільнай прылады.",
- "description": "Падключы свой уліковы запіс GitHub, каб правяраць запыты на зліццё з мабільнай прылады."
+ "description": "Падключы свой уліковы запіс GitHub, каб правяраць запыты на зліццё з мабільнай прылады.",
+ "gitlabDescription": "Падключыце ўліковы запіс GitLab, каб разглядаць merge-запыты з мабільнай прылады.",
+ "bitbucketDescription": "Падключыце Bitbucket да гэтай арганізацыі, каб разглядаць запыты на зліццё з мабільнай прылады.",
+ "bitbucketOrgOnlyDescription": "Выберыце арганізацыю ў профілі, каб разглядаць яе запыты на зліццё Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -601,7 +636,10 @@
},
"reconnectNotice": {
"title": "Тэрмін дзеяння падключэння да GitHub скончыўся.",
- "message": "Тваё падключэнне да GitHub больш не дзейнічае. Правер яго яшчэ раз — пры патрэбе табе прапануюць падключыцца зноў."
+ "message": "Тваё падключэнне да GitHub больш не дзейнічае. Правер яго яшчэ раз — пры патрэбе табе прапануюць падключыцца зноў.",
+ "gitlabTitle": "Тэрмін дзеяння падключэння да GitLab скончыўся",
+ "bitbucketTitle": "Тэрмін дзеяння падключэння да Bitbucket скончыўся",
+ "providerMessage": "Вашае падключэнне да {{provider}} больш не сапраўднае. Праверце падключэнне яшчэ раз — пры неабходнасці вам прапануюць падключыцца зноў."
},
"eventChips": {
"comment": "Каментаваць",
@@ -657,6 +695,21 @@
"files": "Файлы",
"discussion": "Абмеркаванне"
},
+ "terms": {
+ "pullRequest": "Запыт на зліццё",
+ "mergeRequest": "Merge-запыт",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Падзяліцца merge-запытам",
+ "viewOnProvider": "Адкрыць у {{provider}}",
+ "mergeRequestUnavailable": "Merge-запыт недаступны",
+ "unavailableDescription": "Магчыма, ён быў выдалены або ў вас няма да яго доступу.",
+ "accessDeniedMergeRequest": "У вас няма правоў на прагляд гэтага merge-запыту.",
+ "couldNotLoadMergeRequest": "Не ўдалося загрузіць merge-запыт",
+ "discussionAccessDenied": "У вас няма правоў на прагляд абмеркавання гэтага merge-запыту.",
+ "discussionUnavailableMessage": "Гэты merge-запыт магчыма, быў выдалены.",
+ "noDiscussionDescription": "У гэтым merge-запыце няма галін агляду ці каментароў размовы.",
+ "noFilesChangedDescription": "У гэтым merge-запыце няма змен файлаў."
+ },
"fileStatus": {
"modified": "Зменены",
"renamed": "Перайменаваны",
@@ -673,7 +726,7 @@
"emptyLine": "(пуста)"
},
"linkPasteClipboardEmpty": "Буфер абмену пусты.",
- "linkPasteNotAPullRequest": "Гэта не спасылка на запыт на зліццё на GitHub.",
+ "linkPasteNotAPullRequest": "Гэта не спасылка на запыт на зліццё або merge-запыт",
"announce": {
"commentPosted": "Каментар апублікаваны",
"reviewSubmitted": "Праверка кода адпраўлена",
@@ -682,6 +735,7 @@
"mutationError": {
"commentNotPosted": "Немагчыма апублікаваць гэты каментар. Магчыма, вылучаны радок змяніўся або PR абнавілі.",
"reviewNotSubmitted": "Немагчыма адправіць гэтую праверку кода ў яе бягучым выглядзе. Магчыма, PR змяніўся або ты спрабуеш праверыць уласны запыт на зліццё.",
+ "reviewNotSubmittedTerm": "Гэты агляд немагчыма адправіць як ёсць. {{term}} магчыма змяніўся, або вы не можаце разглядаць уласны {{term}}.",
"couldNotPostComment": "Не атрымалася апублікаваць каментар.",
"couldNotSubmitReview": "Не атрымалася адправіць праверку кода. Правер падключэнне да інтэрнэту і паспрабуй яшчэ раз."
},
@@ -689,6 +743,7 @@
"couldNotReply": "Не атрымалася адказаць.",
"couldNotCompleteAction": "Не атрымалася выканаць гэтае дзеянне.",
"mergeResultDefaultError": "GitHub не завяршыў зліццё.",
+ "mergeResultNotCompleted": "{{term}} не быў зліты. Праверце яго стан і паўтарыце спробу.",
"ambiguous": "Не атрымалася пацвердзіць вынік — правер PR перад паўторнай спробай.",
"persistenceFailed": "Не атрымалася запісаць гэтае дзеянне. Паспрабуй яшчэ раз пазней.",
"forbidden": "Доступ забаронены."
@@ -2020,11 +2075,31 @@
"retryConnection": "Паўтарыць падключэнне"
},
"newSession": {
+ "recentlyUsed": "Нядаўна выкарыстаныя",
+ "couldNotLoadGithubRepositories": "Не ўдалося загрузіць рэпазіторыі GitHub.",
+ "couldNotLoadGitlabRepositories": "Не ўдалося загрузіць рэпазіторыі GitLab.",
+ "couldNotLoadBitbucketRepositories": "Не ўдалося загрузіць рэпазіторыі Bitbucket.",
"connectGithubDescription": "Падключыце GitHub у браўзеры, потым вярніцеся сюды, каб выбраць рэпазіторый.",
+ "connectGitlabDescription": "Падключыце GitLab у браўзеры, потым вярніцеся сюды, каб выбраць рэпазіторый.",
+ "connectBitbucketDescription": "Падключыце Bitbucket у браўзеры, потым вярніцеся сюды, каб выбраць рэпазіторый.",
"openGithub": "Адкрыць GitHub",
+ "openGitlab": "Адкрыць GitLab",
+ "openBitbucket": "Адкрыць Bitbucket",
"refreshRepositories": "Абнавіць рэпазіторыі",
"githubConnected": "GitHub падключаны",
+ "gitlabConnected": "GitLab падключаны",
"noRepositoriesVisible": "Рэпазіторыі не адлюстроўваюцца. Праверце, ці мае праграма Kilo для GitHub доступ да іх, і абнавіце спіс.",
+ "noRepositoriesVisibleGitlab": "Рэпазіторыі не адлюстроўваюцца. Праверце доступ да рэпазіторыяў GitLab і абнавіце спіс.",
+ "noRepositoriesVisibleBitbucket": "Рэпазіторыі не адлюстроўваюцца. Праверце доступ да рэпазіторыяў Bitbucket і абнавіце спіс.",
+ "bitbucketOrganizationsOnly": "Bitbucket даступны толькі для арганізацый.",
+ "branchPickerTitle": "Выбраць галіну",
+ "branchDefault": "Прадвызначаная",
+ "branchAccessibility": "Галіна: {{label}}",
+ "branchLoading": "Загрузка галін",
+ "branchLoadError": "Не ўдалося загрузіць галіны",
+ "branchUnavailable": "Галіны недаступныя для гэтага рэпазіторыя. Праверце доступ у правайдара, затым выберыце іншы рэпазіторый.",
+ "branchEmpty": "Няма даступных галін",
+ "branchPlaceholder": "Выберыце галіну",
"runOnWithTarget": "Асяроддзе запуску: {{target}}",
"environment": "Асяроддзе",
"couldNotLoadEnvironment": "Не ўдалося загрузіць ваша асяроддзе.",
@@ -2045,24 +2120,13 @@
"couldNotRefreshRepositories": "Не ўдалося абнавіць рэпазіторыі. Паспрабуйце яшчэ раз.",
"discardDraftTitle": "Выдаліць чарнавік?",
"discardDraftMessage": "Ваш запыт будзе страчаны.",
+ "discardWithUploadsMessage": "Ваш запыт і загружаныя файлы, не прымацаваныя да адпраўленых паведамленняў, будуць выдаленыя.",
"discardFailed": "Не ўдалося выдаліць чарнавік. Паспрабуйце яшчэ раз.",
"remoteHint": "Выканайце `kilo remote` на сваім камп'ютары або `/remote` у актыўным сеансе CLI, каб кіраваць лакальным працэсам kilo.",
- "connectBitbucketDescription": "Падключыце Bitbucket у браўзеры, потым вярніцеся сюды, каб выбраць рэпазіторый.",
- "connectGitlabDescription": "Падключыце GitLab у браўзеры, потым вярніцеся сюды, каб выбраць рэпазіторый.",
- "couldNotLoadBitbucketRepositories": "Не ўдалося загрузіць рэпазіторыі Bitbucket.",
- "couldNotLoadGithubRepositories": "Не ўдалося загрузіць рэпазіторыі GitHub.",
- "couldNotLoadGitlabRepositories": "Не ўдалося загрузіць рэпазіторыі GitLab.",
- "gitlabConnected": "GitLab падключаны",
- "noRepositoriesVisibleBitbucket": "Рэпазіторыі не адлюстроўваюцца. Праверце доступ да рэпазіторыяў Bitbucket і абнавіце спіс.",
- "noRepositoriesVisibleGitlab": "Рэпазіторыі не адлюстроўваюцца. Праверце доступ да рэпазіторыяў GitLab і абнавіце спіс.",
- "openBitbucket": "Адкрыць Bitbucket",
- "openGitlab": "Адкрыць GitLab",
- "recentlyUsed": "Нядаўна выкарыстаныя",
"continueFrom": "Працягваецца сеанс «{{title}}».",
"importingSession": "Імпартаванне сеанса",
"cliCannotContinue": "Гэты CLI не падтрымлівае працяг сеанса. Выберыце Cloud Agent або іншы CLI.",
- "importFailed": "Не ўдалося імпартаваць гэты сеанс.",
- "discardWithUploadsMessage": "Ваш запыт і загружаныя файлы, не прымацаваныя да адпраўленых паведамленняў, будуць выдаленыя."
+ "importFailed": "Не ўдалося імпартаваць гэты сеанс."
},
"partRenderer": {
"updatedFileCount_one": "Абноўлены {{displayCount}} файл.",
diff --git a/apps/mobile/src/i18n/locales/bg.json b/apps/mobile/src/i18n/locales/bg.json
index 507daf6267..dae61eea00 100644
--- a/apps/mobile/src/i18n/locales/bg.json
+++ b/apps/mobile/src/i18n/locales/bg.json
@@ -36,6 +36,7 @@
"cost": "Разход",
"discard": "Отхвърли",
"findings": "Открити проблеми",
+ "mergeRequest": "merge заявка",
"notConnected": "Не е свързан",
"notifications": "Известия",
"pullRequest": "заявка за сливане",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Празен ред в изгледа с разликите"
},
"connectionExpired": "Срокът на връзката с GitHub изтече.",
+ "capabilities": {
+ "banner": {
+ "title": "Не е налично при този доставчик",
+ "accessibility": "Не е налично при този доставчик: {{reason}}"
+ }
+ },
"merge": {
"merge": "Сливане",
"mergeNow": "Обедини сега",
"mergePullRequest": "Обединяване на заявката",
+ "mergeTermTitle": "Обедини {{term}}",
"enableAutoMerge": "Активирай автоматично обединяване",
"disableAutoMerge": "Деактивирай автоматичното обединяване",
"autoMergeOn": "Автоматичното обединяване е включено",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Изтрий клона след обединяването",
"noEnabledMethods": "В това хранилище няма активирани методи за обединяване. Помоли администратор на хранилището да активира обединяване с комит, свиване или пребазиране.",
"confirmTitle": "Да се обедини ли заявката?",
+ "confirmTitleTerm": "Да се обедини ли {{term}}?",
"confirmMessage": "Това ще обедини промените ти в основния клон.",
"enableAutoMergeConfirmTitle": "Да се активира ли автоматичното обединяване?",
"enableAutoMergeConfirmMessage": "GitHub ще обедини тази заявка автоматично, когато всички задължителни проверки завършат успешно.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} ще бъде обединен автоматично, след като конвейерът завърши успешно.",
+ "enableAutoMergeDescriptionTerm": "GitLab обединява тази {{term}} автоматично, след като конвейерът завърши успешно.",
"forbidden": "Нямаш права да обединяваш тази заявка.",
"cannotMerge": "Тази заявка не може да се обедини в сегашния си вид.",
"couldNotMerge": "Не можахме да обединим заявката.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Вече обединена",
- "closed": "Заявката е затворена"
+ "closed": "Заявката е затворена",
+ "closedMergeRequest": "Тази merge заявка е затворена"
},
"partialSuccessBanner": {
"body": "Не можахме да изтрием клона: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Тази заявка все още не може да се обедини",
"notMergeableDetail": "GitHub съобщи следното състояние за възможността за обединяване: {{state}}."
},
+ "restrictions": {
+ "title": "Ограничения при обединяване",
+ "approvalsRequired_one": "Необходимо е {{displayCount}} одобрение",
+ "approvalsRequired_other": "Необходими са {{displayCount}} одобрения",
+ "pipelineMustSucceed": "Конвейерът трябва да завърши успешно преди обединяването."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Конвейерът се проваля при последния комит.",
+ "pendingPipeline": "Конвейерът все още работи при последния комит.",
+ "permission": "Нямате разрешение да обединявате {{term}}.",
+ "draft": "Маркирайте {{term}} като готов за преглед преди обединяване."
+ },
"methodLabels": {
"merge": "Създай комит за обединяване",
"squash": "Свий комитите и обедини",
@@ -448,6 +472,7 @@
"acceptTerms": "Приеми",
"replyBadRequest": "Този отговор не може да бъде публикуван. Нишката може да се е променила.",
"replyForbidden": "Нямаш права да отговаряш в тази заявка за обединяване.",
+ "replyForbiddenTerm": "Нямате разрешение да отговаряте в {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Не можеш да подадеш сигнал за този коментар.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Прегледай заявката за обединяване",
"headLine": "{{counts}} · последен комит {{sha}}",
"entry": {
- "eyebrow": "Отвори заявка за обединяване чрез URL.",
- "pastePrLink": "Постави връзка към PR",
- "noRecentPrs": "Няма скорошни PR",
- "noRecentPrsDescription": "Постави връзка към PR по-горе, за да започнеш преглед. Следващия път този PR ще се покаже тук.",
+ "eyebrow": "Отворете заявка за сливане или merge заявка чрез URL",
+ "pastePrLink": "Поставете връзка към заявка за сливане или merge заявка",
+ "noRecentPrs": "Няма скорошни прегледи",
+ "noRecentPrsDescription": "Поставете връзка по-горе, за да започнете преглед — следващия път ще се появи тук.",
"couldNotLoad": "Не можахме да заредим данните.",
"removeFromRecentsTitle": "Да се премахне ли от последно отваряните?",
- "removeFromRecentsMessage": "Тази заявка за обединяване ще бъде премахната от списъка ти с последно отваряни заявки.",
+ "removeFromRecentsMessage": "Този преглед ще бъде премахнат от скорошните ви.",
"removeRecentAccessibility": "Премахни {{repo}} от последно отваряните",
- "urlAccessibility": "URL на заявка за обединяване в GitHub",
- "clearLink": "Изчисти връзката към заявката за обединяване",
- "pasteLink": "Постави връзка към заявка за обединяване",
+ "urlAccessibility": "Въведете URL на заявка за сливане или merge заявка",
+ "urlPlaceholder": "URL на заявка за сливане или merge заявка",
+ "openAccessibility": "Отвори заявка за сливане или merge заявка",
+ "clearLink": "Изчисти връзката",
+ "pasteLink": "Поставете връзка към заявка за сливане или merge заявка",
"open": "Отваряне"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Не можахме да проверим връзката с GitHub.",
"checkFailedMessage": "Не можем да проверим дали си влязъл, докато данните не се заредят.",
+ "checkFailedTitleGitLab": "Не можа да се провери връзката с GitLab",
+ "checkFailedTitleBitbucket": "Не можа да се провери връзката с Bitbucket",
+ "providerCheckFailedMessage": "Състоянието на връзката е недостъпно, докато това се зареди.",
"reconnectTitle": "Повторно свързване с GitHub",
"reconnectDescription": "Достъпът ти до GitHub е отнет. Свържи се отново, за да продължиш да преглеждаш заявки за обединяване от телефона си.",
- "description": "Свържи акаунта си в GitHub, за да преглеждаш заявки за обединяване от телефона си."
+ "description": "Свържи акаунта си в GitHub, за да преглеждаш заявки за обединяване от телефона си.",
+ "gitlabDescription": "Свържете акаунта си в GitLab, за да преглеждате merge заявки на мобилно устройство.",
+ "bitbucketDescription": "Свържете Bitbucket с тази организация, за да преглеждате заявки за сливане на мобилно устройство.",
+ "bitbucketOrgOnlyDescription": "Изберете организация в профила си, за да преглеждате нейните Bitbucket заявки за сливане."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Срокът на връзката с GitHub изтече.",
- "message": "Връзката ти с GitHub вече не е валидна. Провери я отново — при нужда ще получиш подкана да се свържеш отново."
+ "message": "Връзката ти с GitHub вече не е валидна. Провери я отново — при нужда ще получиш подкана да се свържеш отново.",
+ "gitlabTitle": "Връзката с GitLab изтече",
+ "bitbucketTitle": "Връзката с Bitbucket изтече",
+ "providerMessage": "Връзката ви с {{provider}} вече не е валидна. Проверете връзката отново — при необходимост ще бъдете подканени да се свържете повторно."
},
"eventChips": {
"comment": "Коментар",
@@ -643,6 +679,21 @@
"files": "Файлове",
"discussion": "Дискусия"
},
+ "terms": {
+ "pullRequest": "Заявка за сливане",
+ "mergeRequest": "Merge заявка",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Сподели merge заявка",
+ "viewOnProvider": "Преглед в {{provider}}",
+ "mergeRequestUnavailable": "Merge заявката е недостъпна",
+ "unavailableDescription": "Може би е изтрита или нямате достъп до нея.",
+ "accessDeniedMergeRequest": "Нямате разрешение да прегледате тази merge заявка.",
+ "couldNotLoadMergeRequest": "Merge заявката не можа да се зареди",
+ "discussionAccessDenied": "Нямате разрешение да прегледате дискусиата по тази merge заявка.",
+ "discussionUnavailableMessage": "Тази merge заявка може би е премахната.",
+ "noDiscussionDescription": "Няма нишки за преглед или коментари по тази merge заявка.",
+ "noFilesChangedDescription": "Тази merge заявка няма промени по файлове."
+ },
"fileStatus": {
"modified": "Променен",
"renamed": "Преименуван",
@@ -659,7 +710,7 @@
"emptyLine": "(празно)"
},
"linkPasteClipboardEmpty": "Клипбордът е празен.",
- "linkPasteNotAPullRequest": "Това не е връзка към заявка за обединяване в GitHub.",
+ "linkPasteNotAPullRequest": "Това не е връзка към заявка за сливане или merge заявка",
"announce": {
"commentPosted": "Коментарът е публикуван",
"reviewSubmitted": "Прегледът е изпратен",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Този коментар не може да се публикува. Избраният ред може да се е променил или този PR да е обновен.",
"reviewNotSubmitted": "Този преглед не може да се изпрати в сегашния си вид. Възможно е този PR да е променен или да се опитваш да прегледаш собствената си заявка за обединяване.",
+ "reviewNotSubmittedTerm": "Този преглед не може да бъде изпратен такъв. {{term}} може да се е променил или не можете да преглеждате собствения си {{term}}.",
"couldNotPostComment": "Не можахме да публикуваме коментара.",
"couldNotSubmitReview": "Не можахме да изпратим прегледа. Провери връзката си и опитай отново."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Отговорът не беше изпратен.",
"couldNotCompleteAction": "Не можахме да завършим това действие.",
"mergeResultDefaultError": "GitHub не завърши обединяването.",
+ "mergeResultNotCompleted": "{{term}} не беше обединен. Проверете състоянието му и опитайте отново.",
"ambiguous": "Не можахме да потвърдим резултата. Провери този PR, преди да опиташ отново.",
"persistenceFailed": "Не можахме да запишем това действие. Опитай отново по-късно.",
"forbidden": "Действието не е разрешено."
@@ -1988,11 +2041,31 @@
"retryConnection": "Опитай да се свържеш отново"
},
"newSession": {
+ "recentlyUsed": "Наскоро използвани",
+ "couldNotLoadGithubRepositories": "Не успяхме да заредим хранилищата в GitHub.",
+ "couldNotLoadGitlabRepositories": "Не успяхме да заредим хранилищата в GitLab.",
+ "couldNotLoadBitbucketRepositories": "Не успяхме да заредим хранилищата в Bitbucket.",
"connectGithubDescription": "Свържи GitHub в браузъра си, след което се върни тук, за да избереш хранилище.",
+ "connectGitlabDescription": "Свържи GitLab в браузъра си, след което се върни тук, за да избереш хранилище.",
+ "connectBitbucketDescription": "Свържи Bitbucket в браузъра си, след което се върни тук, за да избереш хранилище.",
"openGithub": "Отвори GitHub",
+ "openGitlab": "Отвори GitLab",
+ "openBitbucket": "Отвори Bitbucket",
"refreshRepositories": "Опресни хранилищата",
"githubConnected": "Връзка с GitHub",
+ "gitlabConnected": "Връзка с GitLab",
"noRepositoriesVisible": "Няма видими хранилища. Провери достъпа на приложението Kilo за GitHub до хранилищата, след което опресни списъка.",
+ "noRepositoriesVisibleGitlab": "Няма видими хранилища. Провери достъпа до хранилищата в GitLab, след което опресни списъка.",
+ "noRepositoriesVisibleBitbucket": "Няма видими хранилища. Провери достъпа до хранилищата в Bitbucket, след което опресни списъка.",
+ "bitbucketOrganizationsOnly": "Bitbucket е наличен само за организации.",
+ "branchPickerTitle": "Избери клон",
+ "branchDefault": "По подразбиране",
+ "branchAccessibility": "Клон: {{label}}",
+ "branchLoading": "Клоновете се зареждат",
+ "branchLoadError": "Клоновете не можаха да се заредят",
+ "branchUnavailable": "Клоновете не са налични за това хранилище. Проверете достъпа си при доставчика и изберете друго хранилище.",
+ "branchEmpty": "Няма налични клонове",
+ "branchPlaceholder": "Изберете клон",
"runOnWithTarget": "Изпълнение в: {{target}}",
"environment": "Среда",
"couldNotLoadEnvironment": "Не успяхме да заредим средата ти.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Не успяхме да опресним хранилищата. Опитай отново.",
"discardDraftTitle": "Да се изтрие ли черновата?",
"discardDraftMessage": "Подканата ти ще се загуби.",
+ "discardWithUploadsMessage": "Подканата ти и всички качени файлове, които не са прикачени към изпратени съобщения, ще бъдат изтрити.",
"discardFailed": "Не успяхме да изтрием черновата. Опитай отново.",
"remoteHint": "Изпълни `kilo remote` на компютъра си или `/remote` в работеща CLI сесия, за да управляваш локален процес на kilo.",
- "connectBitbucketDescription": "Свържи Bitbucket в браузъра си, след което се върни тук, за да избереш хранилище.",
- "connectGitlabDescription": "Свържи GitLab в браузъра си, след което се върни тук, за да избереш хранилище.",
- "couldNotLoadBitbucketRepositories": "Не успяхме да заредим хранилищата в Bitbucket.",
- "couldNotLoadGithubRepositories": "Не успяхме да заредим хранилищата в GitHub.",
- "couldNotLoadGitlabRepositories": "Не успяхме да заредим хранилищата в GitLab.",
- "gitlabConnected": "Връзка с GitLab",
- "noRepositoriesVisibleBitbucket": "Няма видими хранилища. Провери достъпа до хранилищата в Bitbucket, след което опресни списъка.",
- "noRepositoriesVisibleGitlab": "Няма видими хранилища. Провери достъпа до хранилищата в GitLab, след което опресни списъка.",
- "openBitbucket": "Отвори Bitbucket",
- "openGitlab": "Отвори GitLab",
- "recentlyUsed": "Наскоро използвани",
"continueFrom": "Продължаваш сесията {{title}}.",
"importingSession": "Импортиране на сесията",
"cliCannotContinue": "Този CLI не може да продължи сесия. Избери Cloud Agent или друг CLI.",
- "importFailed": "Тази сесия не можа да бъде импортирана.",
- "discardWithUploadsMessage": "Подканата ти и всички качени файлове, които не са прикачени към изпратени съобщения, ще бъдат изтрити."
+ "importFailed": "Тази сесия не можа да бъде импортирана."
},
"partRenderer": {
"updatedFileCount_one": "Актуализиран е {{displayCount}} файл.",
diff --git a/apps/mobile/src/i18n/locales/bn.json b/apps/mobile/src/i18n/locales/bn.json
index 6386fe7c61..0882ddcdd7 100644
--- a/apps/mobile/src/i18n/locales/bn.json
+++ b/apps/mobile/src/i18n/locales/bn.json
@@ -36,6 +36,7 @@
"cost": "খরচ",
"discard": "বাতিল করুন",
"findings": "শনাক্ত সমস্যা",
+ "mergeRequest": "মার্জ রিকোয়েস্ট",
"notConnected": "সংযুক্ত নয়",
"notifications": "বিজ্ঞপ্তি",
"pullRequest": "পুল রিকোয়েস্ট",
@@ -340,10 +341,17 @@
"emptyDiffRow": "খালি ডিফ সারি"
},
"connectionExpired": "GitHub সংযোগের মেয়াদ শেষ হয়েছে।",
+ "capabilities": {
+ "banner": {
+ "title": "এই প্রোভাইডারে উপলব্ধ নয়",
+ "accessibility": "এই প্রোভাইডারে উপলব্ধ নয়: {{reason}}"
+ }
+ },
"merge": {
"merge": "মার্জ",
"mergeNow": "এখনই মার্জ করুন",
"mergePullRequest": "পুল রিকোয়েস্ট মার্জ",
+ "mergeTermTitle": "{{term}} মার্জ",
"enableAutoMerge": "অটো-মার্জ চালু করুন",
"disableAutoMerge": "অটো-মার্জ বন্ধ করুন",
"autoMergeOn": "অটো-মার্জ চালু আছে",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "মার্জের পর ব্রাঞ্চ মুছুন",
"noEnabledMethods": "এই রিপোজিটরিতে মার্জ করার কোনো পদ্ধতি চালু নেই। রিপোজিটরির অ্যাডমিনকে মার্জ, স্কোয়াশ বা রিবেস পদ্ধতি চালু করতে বলুন।",
"confirmTitle": "পুল রিকোয়েস্ট মার্জ করবেন?",
+ "confirmTitleTerm": "{{term}} মার্জ করবেন?",
"confirmMessage": "এতে আপনার পরিবর্তনগুলো বেস ব্রাঞ্চে মার্জ হবে।",
"enableAutoMergeConfirmTitle": "অটো-মার্জ চালু করবেন?",
"enableAutoMergeConfirmMessage": "প্রয়োজনীয় সব চেক পাস করলে GitHub এই পুল রিকোয়েস্ট স্বয়ংক্রিয়ভাবে মার্জ করবে।",
+ "enableAutoMergeConfirmMessageTerm": "পাইপলাইন সফল হলে {{term}} স্বয়ংক্রিয়ভাবে মার্জ হবে।",
+ "enableAutoMergeDescriptionTerm": "পাইপলাইন সফল হলে GitLab এই {{term}} স্বয়ংক্রিয়ভাবে মার্জ করে।",
"forbidden": "এই পুল রিকোয়েস্ট মার্জ করার অনুমতি আপনার নেই।",
"cannotMerge": "এই পুল রিকোয়েস্ট বর্তমান অবস্থায় মার্জ করা যাবে না।",
"couldNotMerge": "পুল রিকোয়েস্ট মার্জ করা যায়নি।",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "ইতিমধ্যে মার্জ হয়েছে",
- "closed": "এই পুল রিকোয়েস্ট বন্ধ"
+ "closed": "এই পুল রিকোয়েস্ট বন্ধ",
+ "closedMergeRequest": "এই মার্জ রিকোয়েস্ট বন্ধ"
},
"partialSuccessBanner": {
"body": "ব্রাঞ্চ মুছে ফেলা যায়নি: {{reason}}।",
@@ -401,6 +413,18 @@
"notMergeableTitle": "এই পুল রিকোয়েস্ট এখনও মার্জ করা যাচ্ছে না",
"notMergeableDetail": "GitHub-এর দেওয়া মার্জের অবস্থা: {{state}}।"
},
+ "restrictions": {
+ "title": "মার্জ সংক্রান্ত সীমাবদ্ধতা",
+ "approvalsRequired_one": "{{displayCount}}টি অনুমোদন প্রয়োজন",
+ "approvalsRequired_other": "{{displayCount}}টি অনুমোদন প্রয়োজন",
+ "pipelineMustSucceed": "মার্জ করার আগে পাইপলাইন সফল হতে হবে।"
+ },
+ "providerBlocked": {
+ "failingPipeline": "সর্বশেষ কমিটে পাইপলাইন ব্যর্থ হচ্ছে।",
+ "pendingPipeline": "সর্বশেষ কমিটে পাইপলাইন এখনও চলছে।",
+ "permission": "এই {{term}} মার্জ করার অনুমতি আপনার নেই।",
+ "draft": "মার্জ করার আগে {{term}}টিকে রিভিউয়ের জন্য প্রস্তুত হিসেবে চিহ্নিত করুন।"
+ },
"methodLabels": {
"merge": "একটি মার্জ কমিট তৈরি করুন",
"squash": "স্কোয়াশ করে মার্জ করুন",
@@ -448,6 +472,7 @@
"acceptTerms": "গ্রহণ করুন",
"replyBadRequest": "এই উত্তরটি পোস্ট করা যাচ্ছে না। থ্রেডটি বদলে গিয়ে থাকতে পারে।",
"replyForbidden": "এই পুল রিকোয়েস্টে উত্তর দেওয়ার অনুমতি আপনার নেই।",
+ "replyForbiddenTerm": "এই {{term}}ে উত্তর দেওয়ার অনুমতি আপনার নেই।",
"moderation": {
"reportContent": {
"terminal": "এই মন্তব্যটি রিপোর্ট করা যাবে না।",
@@ -508,17 +533,19 @@
"reviewPullRequest": "পুল রিকোয়েস্ট রিভিউ করুন",
"headLine": "{{counts}} · হেড {{sha}}",
"entry": {
- "eyebrow": "URL দিয়ে একটি পুল রিকোয়েস্ট খুলুন।",
- "pastePrLink": "একটি PR লিংক পেস্ট করুন",
- "noRecentPrs": "কোনো সাম্প্রতিক PR নেই",
- "noRecentPrsDescription": "রিভিউ শুরু করতে উপরে একটি PR লিংক পেস্ট করুন — এটি পরের বার এখানে দেখা যাবে।",
+ "eyebrow": "URL দিয়ে পুল রিকোয়েস্ট বা মার্জ রিকোয়েস্ট খুলুন",
+ "pastePrLink": "পুল রিকোয়েস্ট বা মার্জ রিকোয়েস্টের লিংক পেস্ট করুন",
+ "noRecentPrs": "কোনও সাম্প্রতিক রিভিউ নেই",
+ "noRecentPrsDescription": "রিভিউ শুরু করতে উপরে একটি লিংক পেস্ট করুন — পরের বার এটি এখানে দেখা যাবে।",
"couldNotLoad": "লোড করা যায়নি।",
"removeFromRecentsTitle": "সাম্প্রতিক তালিকা থেকে সরাবেন?",
- "removeFromRecentsMessage": "এই পুল রিকোয়েস্টটি আপনার সাম্প্রতিক তালিকা থেকে সরানো হবে।",
+ "removeFromRecentsMessage": "এই রিভিউটি আপনার সাম্প্রতিক তালিকা থেকে সরানো হবে।",
"removeRecentAccessibility": "সাম্প্রতিক তালিকা থেকে {{repo}} সরান",
- "urlAccessibility": "GitHub পুল রিকোয়েস্টের URL",
- "clearLink": "পুল রিকোয়েস্টের লিংক মুছুন",
- "pasteLink": "পুল রিকোয়েস্টের লিংক পেস্ট করুন",
+ "urlAccessibility": "পুল রিকোয়েস্ট বা মার্জ রিকোয়েস্টের URL লিখুন",
+ "urlPlaceholder": "পুল রিকোয়েস্ট বা মার্জ রিকোয়েস্টের URL",
+ "openAccessibility": "পুল রিকোয়েস্ট বা মার্জ রিকোয়েস্ট খুলুন",
+ "clearLink": "লিংক মুছুন",
+ "pasteLink": "পুল রিকোয়েস্ট বা মার্জ রিকোয়েস্টের লিংক পেস্ট করুন",
"open": "খোলা"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub সংযোগ পরীক্ষা করা যায়নি।",
"checkFailedMessage": "এটি লোড না হওয়া পর্যন্ত সাইন-ইন করা আছে কি না জানা যাবে না।",
+ "checkFailedTitleGitLab": "GitLab সংযোগ পরীক্ষা করা যায়নি।",
+ "checkFailedTitleBitbucket": "Bitbucket সংযোগ পরীক্ষা করা যায়নি।",
+ "providerCheckFailedMessage": "লোড হওয়া পর্যন্ত সংযোগের অবস্থা উপলব্ধ নয়।",
"reconnectTitle": "GitHub-এর সঙ্গে আবার সংযোগ",
"reconnectDescription": "আপনার GitHub সংযোগের অনুমতি বাতিল করা হয়েছে। মোবাইলে পুল রিকোয়েস্ট রিভিউ চালিয়ে যেতে আবার সংযোগ করুন।",
- "description": "মোবাইলে পুল রিকোয়েস্ট রিভিউ করতে আপনার GitHub অ্যাকাউন্ট সংযুক্ত করুন।"
+ "description": "মোবাইলে পুল রিকোয়েস্ট রিভিউ করতে আপনার GitHub অ্যাকাউন্ট সংযুক্ত করুন।",
+ "gitlabDescription": "মোবাইলে মার্জ রিকোয়েস্ট রিভিউ করতে আপনার GitLab অ্যাকাউন্ট সংযুক্ত করুন।",
+ "bitbucketDescription": "মোবাইলে পুল রিকোয়েস্ট রিভিউ করতে এই অর্গানাইজেশনটিকে Bitbucket-এর সঙ্গে সংযুক্ত করুন।",
+ "bitbucketOrgOnlyDescription": "আপনার প্রোফাইলে একটি অর্গানাইজেশন বেছে নিন যাতে তার Bitbucket পুল রিকোয়েস্টগুলো রিভিউ করা যায়।"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub সংযোগের মেয়াদ শেষ হয়েছে।",
- "message": "আপনার GitHub সংযোগের অনুমতি আর কার্যকর নেই। সংযোগ আবার পরীক্ষা করুন — প্রয়োজনে আপনাকে আবার সংযোগ করতে বলা হবে।"
+ "message": "আপনার GitHub সংযোগের অনুমতি আর কার্যকর নেই। সংযোগ আবার পরীক্ষা করুন — প্রয়োজনে আপনাকে আবার সংযোগ করতে বলা হবে।",
+ "gitlabTitle": "GitLab সংযোগের মেয়াদ শেষ হয়েছে।",
+ "bitbucketTitle": "Bitbucket সংযোগের মেয়াদ শেষ হয়েছে।",
+ "providerMessage": "আপনার {{provider}} সংযোগের অনুমতি আর কার্যকর নেই। সংযোগ আবার পরীক্ষা করুন — প্রয়োজনে আপনাকে আবার সংযোগ করতে বলা হবে।"
},
"eventChips": {
"comment": "মন্তব্য",
@@ -643,6 +679,21 @@
"files": "ফাইল",
"discussion": "আলোচনা"
},
+ "terms": {
+ "pullRequest": "পুল রিকোয়েস্ট",
+ "mergeRequest": "মার্জ রিকোয়েস্ট",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "মার্জ রিকোয়েস্ট শেয়ার করুন",
+ "viewOnProvider": "{{provider}}-এ দেখুন",
+ "mergeRequestUnavailable": "মার্জ রিকোয়েস্ট পাওয়া যাচ্ছে না",
+ "unavailableDescription": "সম্ভবত এটি মুছে ফেলা হয়েছে, অথবা আপনার এর অ্যাক্সেস নেই।",
+ "accessDeniedMergeRequest": "এই মার্জ রিকোয়েস্ট দেখার অনুমতি আপনার নেই।",
+ "couldNotLoadMergeRequest": "মার্জ রিকোয়েস্ট লোড করা যায়নি।",
+ "discussionAccessDenied": "এই মার্জ রিকোয়েস্ট-এর আলোচনা দেখার অনুমতি আপনার নেই।",
+ "discussionUnavailableMessage": "এই মার্জ রিকোয়েস্টটি সরিয়ে ফেলা হয়ে থাকতে পারে।",
+ "noDiscussionDescription": "এই মার্জ রিকোয়েস্টে এখনও কোনো রিভিউ থ্রেড বা আলোচনার মন্তব্য নেই।",
+ "noFilesChangedDescription": "এই মার্জ রিকোয়েস্টে কোনো ফাইলে পরিবর্তন করা হয়নি।"
+ },
"fileStatus": {
"modified": "পরিবর্তিত",
"renamed": "নাম বদলানো হয়েছে",
@@ -659,7 +710,7 @@
"emptyLine": "(খালি)"
},
"linkPasteClipboardEmpty": "ক্লিপবোর্ড খালি।",
- "linkPasteNotAPullRequest": "এটি GitHub পুল রিকোয়েস্টের লিংক নয়।",
+ "linkPasteNotAPullRequest": "এটি পুল রিকোয়েস্ট বা মার্জ রিকোয়েস্টের লিংক নয়",
"announce": {
"commentPosted": "মন্তব্য পোস্ট হয়েছে",
"reviewSubmitted": "রিভিউ জমা হয়েছে",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "এই মন্তব্যটি পোস্ট করা যাবে না। নির্বাচিত লাইনটি পরিবর্তিত হয়ে থাকতে পারে, বা PR আপডেট হয়ে থাকতে পারে।",
"reviewNotSubmitted": "এই রিভিউটি বর্তমান অবস্থায় জমা দেওয়া যাবে না। PR বদলে গিয়ে থাকতে পারে অথবা এটি আপনার নিজের পুল রিকোয়েস্ট, যা আপনি রিভিউ করতে পারবেন না।",
+ "reviewNotSubmittedTerm": "এই রিভিউটি যেমন আছে তেমনই জমা দেওয়া যাবে না। সম্ভবত {{term}} বদলে গেছে, অথবা আপনি নিজের {{term}} রিভিউ করতে পারবেন না।",
"couldNotPostComment": "মন্তব্য পোস্ট করা যায়নি।",
"couldNotSubmitReview": "রিভিউ জমা দেওয়া যায়নি। আপনার সংযোগ পরীক্ষা করে আবার চেষ্টা করুন।"
},
@@ -675,6 +727,7 @@
"couldNotReply": "উত্তর দেওয়া যায়নি।",
"couldNotCompleteAction": "এই কাজটি সম্পূর্ণ করা যায়নি।",
"mergeResultDefaultError": "GitHub মার্জ সম্পূর্ণ করেনি।",
+ "mergeResultNotCompleted": "{{term}} মার্জ হয়নি। এর অবস্থা পরীক্ষা করে আবার চেষ্টা করুন।",
"ambiguous": "নিশ্চিত করা যায়নি — আবার চেষ্টা করার আগে PR-টি পরীক্ষা করুন।",
"persistenceFailed": "এই কাজের তথ্য সংরক্ষণ করা যায়নি। পরে আবার চেষ্টা করুন।",
"forbidden": "এই কাজের অনুমতি নেই।"
@@ -1988,11 +2041,31 @@
"retryConnection": "আবার সংযোগের চেষ্টা করুন"
},
"newSession": {
+ "recentlyUsed": "সম্প্রতি ব্যবহৃত",
+ "couldNotLoadGithubRepositories": "GitHub রিপোজিটরি লোড করা যায়নি।",
+ "couldNotLoadGitlabRepositories": "GitLab রিপোজিটরি লোড করা যায়নি।",
+ "couldNotLoadBitbucketRepositories": "Bitbucket রিপোজিটরি লোড করা যায়নি।",
"connectGithubDescription": "আপনার ব্রাউজারে GitHub সংযুক্ত করুন, তারপর একটি রিপোজিটরি বেছে নিতে এখানে ফিরে আসুন।",
+ "connectGitlabDescription": "আপনার ব্রাউজারে GitLab সংযুক্ত করুন, তারপর একটি রিপোজিটরি বেছে নিতে এখানে ফিরে আসুন।",
+ "connectBitbucketDescription": "আপনার ব্রাউজারে Bitbucket সংযুক্ত করুন, তারপর একটি রিপোজিটরি বেছে নিতে এখানে ফিরে আসুন।",
"openGithub": "GitHub খুলুন",
+ "openGitlab": "GitLab খুলুন",
+ "openBitbucket": "Bitbucket খুলুন",
"refreshRepositories": "রিপোজিটরি রিফ্রেশ করুন",
"githubConnected": "GitHub সংযুক্ত",
+ "gitlabConnected": "GitLab সংযুক্ত",
"noRepositoriesVisible": "কোনো রিপোজিটরি দেখা যাচ্ছে না। Kilo GitHub অ্যাপের রিপোজিটরি অ্যাক্সেসের অনুমতি পরীক্ষা করে রিফ্রেশ করুন।",
+ "noRepositoriesVisibleGitlab": "কোনো রিপোজিটরি দেখা যাচ্ছে না। GitLab-এর রিপোজিটরি অ্যাক্সেসের অনুমতি পরীক্ষা করে রিফ্রেশ করুন।",
+ "noRepositoriesVisibleBitbucket": "কোনো রিপোজিটরি দেখা যাচ্ছে না। Bitbucket-এর রিপোজিটরি অ্যাক্সেসের অনুমতি পরীক্ষা করে রিফ্রেশ করুন।",
+ "bitbucketOrganizationsOnly": "শুধু অর্গানাইজেশনের জন্য Bitbucket উপলব্ধ।",
+ "branchPickerTitle": "ব্রাঞ্চ বেছে নিন",
+ "branchDefault": "ডিফল্ট",
+ "branchAccessibility": "ব্রাঞ্চ: {{label}}",
+ "branchLoading": "ব্রাঞ্চ লোড হচ্ছে",
+ "branchLoadError": "ব্রাঞ্চ লোড করা যায়নি",
+ "branchUnavailable": "এই রিপোজিটরির জন্য ব্রাঞ্চ উপলব্ধ নয়। প্রোভাইডারে আপনার অ্যাক্সেস পরীক্ষা করুন, তারপর অন্য রিপোজিটরি বেছে নিন।",
+ "branchEmpty": "কোনও ব্রাঞ্চ উপলব্ধ নয়",
+ "branchPlaceholder": "একটি ব্রাঞ্চ বেছে নিন",
"runOnWithTarget": "চলবে: {{target}}",
"environment": "পরিবেশ",
"couldNotLoadEnvironment": "আপনার পরিবেশ লোড করা যায়নি।",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "রিপোজিটরি রিফ্রেশ করা যায়নি। আবার চেষ্টা করুন।",
"discardDraftTitle": "খসড়া বাতিল করবেন?",
"discardDraftMessage": "আপনার প্রম্পট হারিয়ে যাবে।",
+ "discardWithUploadsMessage": "আপনার প্রম্পট এবং আপলোড করা কিন্তু কোনো বার্তায় ব্যবহার না করা ফাইলগুলো মুছে ফেলা হবে।",
"discardFailed": "খসড়াটি বাতিল করা যায়নি। আবার চেষ্টা করুন।",
"remoteHint": "আপনার কম্পিউটারে চলা kilo প্রক্রিয়া নিয়ন্ত্রণ করতে `kilo remote` চালান, অথবা চলমান CLI সেশনে `/remote` চালান।",
- "connectBitbucketDescription": "আপনার ব্রাউজারে Bitbucket সংযুক্ত করুন, তারপর একটি রিপোজিটরি বেছে নিতে এখানে ফিরে আসুন।",
- "connectGitlabDescription": "আপনার ব্রাউজারে GitLab সংযুক্ত করুন, তারপর একটি রিপোজিটরি বেছে নিতে এখানে ফিরে আসুন।",
- "couldNotLoadBitbucketRepositories": "Bitbucket রিপোজিটরি লোড করা যায়নি।",
- "couldNotLoadGithubRepositories": "GitHub রিপোজিটরি লোড করা যায়নি।",
- "couldNotLoadGitlabRepositories": "GitLab রিপোজিটরি লোড করা যায়নি।",
- "gitlabConnected": "GitLab সংযুক্ত",
- "noRepositoriesVisibleBitbucket": "কোনো রিপোজিটরি দেখা যাচ্ছে না। Bitbucket-এর রিপোজিটরি অ্যাক্সেসের অনুমতি পরীক্ষা করে রিফ্রেশ করুন।",
- "noRepositoriesVisibleGitlab": "কোনো রিপোজিটরি দেখা যাচ্ছে না। GitLab-এর রিপোজিটরি অ্যাক্সেসের অনুমতি পরীক্ষা করে রিফ্রেশ করুন।",
- "openBitbucket": "Bitbucket খুলুন",
- "openGitlab": "GitLab খুলুন",
- "recentlyUsed": "সম্প্রতি ব্যবহৃত",
"continueFrom": "{{title}} চালিয়ে যাওয়া হচ্ছে।",
"importingSession": "সেশন ইমপোর্ট হচ্ছে",
"cliCannotContinue": "এই CLI দিয়ে আগের সেশন চালিয়ে যাওয়া যায় না। Cloud Agent বা অন্য একটি CLI বেছে নিন।",
- "importFailed": "এই সেশনটি ইমপোর্ট করা যায়নি।",
- "discardWithUploadsMessage": "আপনার প্রম্পট এবং আপলোড করা কিন্তু কোনো বার্তায় ব্যবহার না করা ফাইলগুলো মুছে ফেলা হবে।"
+ "importFailed": "এই সেশনটি ইমপোর্ট করা যায়নি।"
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}}টি ফাইল আপডেট হয়েছে।",
diff --git a/apps/mobile/src/i18n/locales/bs.json b/apps/mobile/src/i18n/locales/bs.json
index 5fc78947f9..2015ef3932 100644
--- a/apps/mobile/src/i18n/locales/bs.json
+++ b/apps/mobile/src/i18n/locales/bs.json
@@ -36,6 +36,7 @@
"cost": "Trošak",
"discard": "Odbaci",
"findings": "Nalazi",
+ "mergeRequest": "merge request",
"notConnected": "Nije povezano",
"notifications": "Obavijesti",
"pullRequest": "zahtjev za spajanje",
@@ -342,10 +343,17 @@
"emptyDiffRow": "Prazan red prikaza razlika"
},
"connectionExpired": "Veza s GitHubom je istekla.",
+ "capabilities": {
+ "banner": {
+ "title": "Nije dostupno kod ovog pružatelja usluga",
+ "accessibility": "Nije dostupno kod ovog pružatelja usluga: {{reason}}"
+ }
+ },
"merge": {
"merge": "Spajanje",
"mergeNow": "Spoji sada",
"mergePullRequest": "Spajanje zahtjeva",
+ "mergeTermTitle": "Spoji {{term}}",
"enableAutoMerge": "Uključi automatsko spajanje",
"disableAutoMerge": "Isključi automatsko spajanje",
"autoMergeOn": "Automatsko spajanje je uključeno",
@@ -364,9 +372,12 @@
"deleteBranchAfterMerge": "Obriši granu nakon spajanja",
"noEnabledMethods": "U ovom repozitoriju nije omogućena nijedna metoda spajanja. Zamoli administratora repozitorija da omogući spajanje uz novu reviziju, objedinjavanje revizija ili promjenu osnove.",
"confirmTitle": "Spojiti zahtjev?",
+ "confirmTitleTerm": "Spojiti {{term}}?",
"confirmMessage": "Ovim će se tvoje promjene spojiti s osnovnom granom.",
"enableAutoMergeConfirmTitle": "Uključiti automatsko spajanje?",
"enableAutoMergeConfirmMessage": "GitHub će automatski spojiti ovaj zahtjev za spajanje kada sve obavezne provjere prođu.",
+ "enableAutoMergeConfirmMessageTerm": "Kada pipeline uspije, {{term}} će se automatski spojiti.",
+ "enableAutoMergeDescriptionTerm": "GitLab automatski spaja ovaj {{term}} kada pipeline uspije.",
"forbidden": "Nemaš dozvolu za spajanje ovog zahtjeva.",
"cannotMerge": "Ovaj zahtjev za spajanje ne može se spojiti u trenutnom stanju.",
"couldNotMerge": "Spajanje zahtjeva nije uspjelo.",
@@ -377,7 +388,8 @@
},
"terminal": {
"alreadyMerged": "Već spojeno",
- "closed": "Ovaj zahtjev za spajanje je zatvoren"
+ "closed": "Ovaj zahtjev za spajanje je zatvoren",
+ "closedMergeRequest": "Ovaj merge request je zatvoren"
},
"partialSuccessBanner": {
"body": "Brisanje grane nije uspjelo. Razlog: {{reason}}",
@@ -403,6 +415,19 @@
"notMergeableTitle": "Ovaj zahtjev za spajanje još se ne može spojiti",
"notMergeableDetail": "GitHub je prijavio sljedeće stanje spajanja: {{state}}."
},
+ "restrictions": {
+ "title": "Ograničenja spajanja",
+ "approvalsRequired_one": "Potrebno je {{displayCount}} odobrenje",
+ "approvalsRequired_other": "Potrebno je {{displayCount}} odobrenja",
+ "pipelineMustSucceed": "Prije spajanja pipeline mora uspjeti.",
+ "approvalsRequired_few": "Potrebna su {{displayCount}} odobrenja"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline ne uspijeva na zadnjem commitu.",
+ "pendingPipeline": "Pipeline je još u toku na zadnjem commitu.",
+ "permission": "Nemaš dozvolu za spajanje ovog {{term}}.",
+ "draft": "Prije spajanja označi {{term}} kao spreman za pregled."
+ },
"methodLabels": {
"merge": "Kreiraj reviziju spajanja",
"squash": "Objedini revizije i spoji",
@@ -450,6 +475,7 @@
"acceptTerms": "Prihvati",
"replyBadRequest": "Ovaj odgovor se ne može objaviti. Nit se možda promijenila.",
"replyForbidden": "Nemaš dozvolu da odgovoriš na ovaj zahtjev za spajanje.",
+ "replyForbiddenTerm": "Nemaš dozvolu da odgovoriš na ovaj {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Ovaj komentar se ne može prijaviti.",
@@ -481,8 +507,6 @@
"termsAcceptRequired": "Za objavljivanje moraš prihvatiti uslove korištenja.",
"termsOutdatedCopy": "Uslovi korištenja su promijenjeni. Ponovo otvori ovaj ekran da prihvatiš najnoviju verziju.",
"termsCheckRetryCopy": "Provjera uslova korištenja nije uspjela. Provjeri vezu i pokušaj ponovo.",
- "comment_few": "{{displayCount}} komentara",
- "reaction_few": "reakcije",
"reactions": {
"thumbsUp": "Palac gore",
"thumbsDown": "Palac dolje",
@@ -500,7 +524,9 @@
"outdatedOnLines": "Zastarjelo na {{lines}}",
"outdatedOnPath": "Zastarjelo na {{path}}"
},
- "deletedUser": "obrisani korisnik"
+ "deletedUser": "obrisani korisnik",
+ "comment_few": "{{displayCount}} komentara",
+ "reaction_few": "reakcije"
},
"couldNotOpenGitHubAppSettings": "Nije moguće otvoriti postavke GitHub aplikacije.",
"installKiloGitHubApp": "Instaliraj aplikaciju Kilo za GitHub",
@@ -512,17 +538,19 @@
"reviewPullRequest": "Pregledaj zahtjev za spajanje",
"headLine": "{{counts}} · najnovija revizija {{sha}}",
"entry": {
- "eyebrow": "Otvori zahtjev za spajanje putem URL-a.",
- "pastePrLink": "Zalijepi poveznicu na PR",
- "noRecentPrs": "Nema nedavnih PR-ova",
- "noRecentPrsDescription": "Zalijepi poveznicu na PR iznad da započneš pregled — sljedeći put će se pojaviti ovdje.",
+ "eyebrow": "Otvori zahtjev za spajanje ili merge request putem URL-a",
+ "pastePrLink": "Zalijepi povezanicu na zahtjev za spajanje ili merge request",
+ "noRecentPrs": "Nema nedavnih pregleda",
+ "noRecentPrsDescription": "Da započnete pregled, zalijepite povezanicu gore — sljedeći put će se pojaviti ovdje.",
"couldNotLoad": "Učitavanje nije uspjelo.",
"removeFromRecentsTitle": "Ukloniti iz nedavnih zahtjeva?",
- "removeFromRecentsMessage": "Ovaj zahtjev za spajanje bit će uklonjen s tvoje liste nedavnih zahtjeva.",
+ "removeFromRecentsMessage": "Ovaj pregled će biti uklonjen iz nedavnih.",
"removeRecentAccessibility": "Ukloni {{repo}} iz nedavnih zahtjeva",
- "urlAccessibility": "URL zahtjeva za spajanje na GitHubu",
- "clearLink": "Obriši poveznicu na zahtjev za spajanje",
- "pasteLink": "Zalijepi poveznicu na zahtjev za spajanje",
+ "urlAccessibility": "Unesite URL zahtjeva za spajanje ili merge requesta",
+ "urlPlaceholder": "URL zahtjeva za spajanje ili merge requesta",
+ "openAccessibility": "Otvori zahtjev za spajanje ili merge request",
+ "clearLink": "Izbriši povezanicu",
+ "pasteLink": "Zalijepi povezanicu na zahtjev za spajanje ili merge request",
"open": "Otvori"
},
"checks": {
@@ -571,9 +599,15 @@
"connect": {
"checkFailedTitle": "Provjera veze s GitHubom nije uspjela.",
"checkFailedMessage": "Status prijave nije dostupan dok se podaci ne učitaju.",
+ "checkFailedTitleGitLab": "Provjera veze s GitLabom nije uspjela.",
+ "checkFailedTitleBitbucket": "Provjera veze s Bitbucketom nije uspjela.",
+ "providerCheckFailedMessage": "Status povezave dostupan je nakon učitavanja.",
"reconnectTitle": "Ponovo poveži GitHub",
"reconnectDescription": "Pristup tvom GitHub računu je opozvan. Ponovo poveži račun da nastaviš pregledati zahtjeve za spajanje na mobitelu.",
- "description": "Poveži svoj GitHub račun da pregledaš zahtjeve za spajanje na mobitelu."
+ "description": "Poveži svoj GitHub račun da pregledaš zahtjeve za spajanje na mobitelu.",
+ "gitlabDescription": "Poveži svoj GitLab račun da pregledaš merge requeste na mobitelu.",
+ "bitbucketDescription": "Poveži Bitbucket s ovom organizacijom da pregledaš zahtjeve za spajanje na mobitelu.",
+ "bitbucketOrgOnlyDescription": "Odaberi organizaciju u svom profilu da pregledaš njene zahtjeve za spajanje na Bitbucketu."
},
"screen": {
"title": "#{{number}}",
@@ -596,7 +630,10 @@
},
"reconnectNotice": {
"title": "Veza s GitHubom je istekla.",
- "message": "Tvoja veza s GitHubom više ne važi. Ponovo provjeri vezu — po potrebi će se pojaviti zahtjev za ponovno povezivanje."
+ "message": "Tvoja veza s GitHubom više ne važi. Ponovo provjeri vezu — po potrebi će se pojaviti zahtjev za ponovno povezivanje.",
+ "gitlabTitle": "Veza s GitLabom je istekla.",
+ "bitbucketTitle": "Veza s Bitbucketom je istekla.",
+ "providerMessage": "Tvoja veza s {{provider}}om više ne važi. Ponovo provjeri vezu — po potrebi će se pojaviti zahtjev za ponovno povezivanje."
},
"eventChips": {
"comment": "Komentar",
@@ -650,6 +687,21 @@
"files": "Datoteke",
"discussion": "Rasprava"
},
+ "terms": {
+ "pullRequest": "Zahtjev za spajanje",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Podijeli merge request",
+ "viewOnProvider": "Pogledaj na {{provider}}",
+ "mergeRequestUnavailable": "Merge request nije dostupan",
+ "unavailableDescription": "Možda je obrisan ili nemaš pristup njemu.",
+ "accessDeniedMergeRequest": "Nemaš dozvolu za pregled ovog merge requesta.",
+ "couldNotLoadMergeRequest": "Učitavanje merge requesta nije uspjelo.",
+ "discussionAccessDenied": "Nemaš dozvolu za pregled rasprave o ovom merge requestu.",
+ "discussionUnavailableMessage": "Ovaj merge request je možda uklonjen.",
+ "noDiscussionDescription": "Ovaj merge request još nema niti za pregled koda ni komentara u raspravi.",
+ "noFilesChangedDescription": "Ovaj merge request ne sadrži promjene u datotekama."
+ },
"fileStatus": {
"modified": "Izmijenjeno",
"renamed": "Preimenovano",
@@ -666,7 +718,7 @@
"emptyLine": "(prazno)"
},
"linkPasteClipboardEmpty": "Međuspremnik je prazan.",
- "linkPasteNotAPullRequest": "Ovo nije poveznica na zahtjev za spajanje na GitHubu.",
+ "linkPasteNotAPullRequest": "Ovo nije povezanica na zahtjev za spajanje niti merge request",
"announce": {
"commentPosted": "Komentar objavljen",
"reviewSubmitted": "Pregled poslan",
@@ -675,6 +727,7 @@
"mutationError": {
"commentNotPosted": "Ovaj komentar se ne može objaviti. Odabrani red je možda promijenjen ili je PR ažuriran.",
"reviewNotSubmitted": "Ovaj pregled se ne može poslati u trenutnom obliku. PR je možda promijenjen ili pokušavaš pregledati vlastiti zahtjev za spajanje.",
+ "reviewNotSubmittedTerm": "Ovaj pregled se ne može poslati u trenutnom obliku. {{term}} je možda promijenjen ili ne možeš pregledati vlastiti {{term}}.",
"couldNotPostComment": "Objavljivanje komentara nije uspjelo.",
"couldNotSubmitReview": "Slanje pregleda nije uspjelo. Provjeri vezu i pokušaj ponovo."
},
@@ -682,6 +735,7 @@
"couldNotReply": "Nije moguće poslati odgovor.",
"couldNotCompleteAction": "Nije moguće dovršiti ovu radnju.",
"mergeResultDefaultError": "GitHub nije dovršio spajanje.",
+ "mergeResultNotCompleted": "{{term}} nije spojen. Provjeri njegovo stanje i pokušaj ponovo.",
"ambiguous": "Nije moguće potvrditi ishod radnje — provjeri PR prije ponovnog pokušaja.",
"persistenceFailed": "Nismo mogli zabilježiti ovu radnju. Pokušaj ponovo kasnije.",
"forbidden": "Radnja nije dozvoljena."
@@ -2004,11 +2058,31 @@
"retryConnection": "Ponovo se poveži"
},
"newSession": {
+ "recentlyUsed": "Nedavno korišteno",
+ "couldNotLoadGithubRepositories": "Nije moguće učitati GitHub repozitorije.",
+ "couldNotLoadGitlabRepositories": "Nije moguće učitati GitLab repozitorije.",
+ "couldNotLoadBitbucketRepositories": "Nije moguće učitati Bitbucket repozitorije.",
"connectGithubDescription": "Poveži GitHub u pregledniku, zatim se vrati ovdje i odaberi repozitorij.",
+ "connectGitlabDescription": "Poveži GitLab u pregledniku, zatim se vrati ovdje i odaberi repozitorij.",
+ "connectBitbucketDescription": "Poveži Bitbucket u pregledniku, zatim se vrati ovdje i odaberi repozitorij.",
"openGithub": "Otvori GitHub",
+ "openGitlab": "Otvori GitLab",
+ "openBitbucket": "Otvori Bitbucket",
"refreshRepositories": "Osvježi repozitorije",
"githubConnected": "GitHub povezan",
+ "gitlabConnected": "GitLab povezan",
"noRepositoriesVisible": "Nema vidljivih repozitorija. Provjeri ima li aplikacija Kilo GitHub pristup repozitorijima, zatim osvježi spisak.",
+ "noRepositoriesVisibleGitlab": "Nema vidljivih repozitorija. Provjeri pristup GitLab repozitorijima, zatim osvježi spisak.",
+ "noRepositoriesVisibleBitbucket": "Nema vidljivih repozitorija. Provjeri pristup Bitbucket repozitorijima, zatim osvježi spisak.",
+ "bitbucketOrganizationsOnly": "Bitbucket je dostupan samo za organizacije.",
+ "branchPickerTitle": "Odaberi granu",
+ "branchDefault": "Zadano",
+ "branchAccessibility": "Grana: {{label}}",
+ "branchLoading": "Učitavanje grana",
+ "branchLoadError": "Učitavanje grana nije uspjelo",
+ "branchUnavailable": "Grane nisu dostupne za ovaj repozitorij. Provjeri svoj pristup kod pružatelja usluga, pa odaberi drugi repozitorij.",
+ "branchEmpty": "Nema dostupnih grana",
+ "branchPlaceholder": "Odaberi granu",
"runOnWithTarget": "Pokreni na: {{target}}",
"environment": "Okruženje",
"couldNotLoadEnvironment": "Nije moguće učitati tvoje okruženje.",
@@ -2029,24 +2103,13 @@
"couldNotRefreshRepositories": "Nije moguće osvježiti repozitorije. Pokušaj ponovo.",
"discardDraftTitle": "Odbaciti nacrt?",
"discardDraftMessage": "Tvoj upit će biti izgubljen.",
+ "discardWithUploadsMessage": "Tvoj upit i sve otpremljene datoteke koje nisu priložene poslanim porukama bit će obrisani.",
"discardFailed": "Nije moguće odbaciti nacrt. Pokušaj ponovo.",
"remoteHint": "Pokreni `kilo remote` na računaru ili `/remote` u aktivnoj CLI sesiji da upravljaš lokalnim procesom kilo.",
- "connectBitbucketDescription": "Poveži Bitbucket u pregledniku, zatim se vrati ovdje i odaberi repozitorij.",
- "connectGitlabDescription": "Poveži GitLab u pregledniku, zatim se vrati ovdje i odaberi repozitorij.",
- "couldNotLoadBitbucketRepositories": "Nije moguće učitati Bitbucket repozitorije.",
- "couldNotLoadGithubRepositories": "Nije moguće učitati GitHub repozitorije.",
- "couldNotLoadGitlabRepositories": "Nije moguće učitati GitLab repozitorije.",
- "gitlabConnected": "GitLab povezan",
- "noRepositoriesVisibleBitbucket": "Nema vidljivih repozitorija. Provjeri pristup Bitbucket repozitorijima, zatim osvježi spisak.",
- "noRepositoriesVisibleGitlab": "Nema vidljivih repozitorija. Provjeri pristup GitLab repozitorijima, zatim osvježi spisak.",
- "openBitbucket": "Otvori Bitbucket",
- "openGitlab": "Otvori GitLab",
- "recentlyUsed": "Nedavno korišteno",
"continueFrom": "Nastavlja se sesija {{title}}.",
"importingSession": "Uvoz sesije",
"cliCannotContinue": "Ovaj CLI ne može nastaviti sesiju. Odaberi Cloud Agent ili drugi CLI.",
- "importFailed": "Nije moguće uvesti ovu sesiju.",
- "discardWithUploadsMessage": "Tvoj upit i sve otpremljene datoteke koje nisu priložene poslanim porukama bit će obrisani."
+ "importFailed": "Nije moguće uvesti ovu sesiju."
},
"partRenderer": {
"updatedFileCount_one": "Ažurirana je {{displayCount}} datoteka.",
diff --git a/apps/mobile/src/i18n/locales/ca.json b/apps/mobile/src/i18n/locales/ca.json
index 21132bd768..cee7d80e8c 100644
--- a/apps/mobile/src/i18n/locales/ca.json
+++ b/apps/mobile/src/i18n/locales/ca.json
@@ -36,6 +36,7 @@
"cost": "Import",
"discard": "Descarta",
"findings": "Problemes",
+ "mergeRequest": "sol·licitud de fusió",
"notConnected": "No connectat",
"notifications": "Notificacions",
"pullRequest": "pR",
@@ -342,10 +343,17 @@
"emptyDiffRow": "Fila de diferències buida"
},
"connectionExpired": "La connexió amb GitHub ha caducat.",
+ "capabilities": {
+ "banner": {
+ "title": "No està disponible amb aquest proveïdor",
+ "accessibility": "No està disponible amb aquest proveïdor: {{reason}}"
+ }
+ },
"merge": {
"merge": "Fusió",
"mergeNow": "Fusiona ara",
"mergePullRequest": "Fusió de la sol·licitud d'integració",
+ "mergeTermTitle": "Fusió de la {{term}}",
"enableAutoMerge": "Activa la fusió automàtica",
"disableAutoMerge": "Desactiva la fusió automàtica",
"autoMergeOn": "Fusió automàtica activada",
@@ -364,9 +372,12 @@
"deleteBranchAfterMerge": "Elimina la branca després de fusionar",
"noEnabledMethods": "Aquest repositori no té cap mètode de fusió activat. Demana a un administrador del repositori que activi la fusió, l'agrupació de comissions o el canvi de base.",
"confirmTitle": "Vols fusionar la sol·licitud d'integració?",
+ "confirmTitleTerm": "Vols fusionar la {{term}}?",
"confirmMessage": "Això fusionarà els teus canvis a la branca base.",
"enableAutoMergeConfirmTitle": "Vols activar la fusió automàtica?",
"enableAutoMergeConfirmMessage": "GitHub fusionarà aquesta sol·licitud d'integració automàticament quan se superin totes les comprovacions obligatòries.",
+ "enableAutoMergeConfirmMessageTerm": "La {{term}} es fusionarà automàticament un cop la seva pipeline tingui èxit.",
+ "enableAutoMergeDescriptionTerm": "El GitLab fusiona automàticament aquesta {{term}} un cop la seva pipeline té èxit.",
"forbidden": "No tens permís per fusionar aquesta sol·licitud d'integració.",
"cannotMerge": "Aquesta sol·licitud d'integració no es pot fusionar tal com està.",
"couldNotMerge": "No s'ha pogut fusionar la sol·licitud d'integració.",
@@ -377,7 +388,8 @@
},
"terminal": {
"alreadyMerged": "Ja fusionada",
- "closed": "Sol·licitud d'integració tancada"
+ "closed": "Sol·licitud d'integració tancada",
+ "closedMergeRequest": "Sol·licitud de fusió tancada"
},
"partialSuccessBanner": {
"body": "No s'ha pogut eliminar la branca: {{reason}}.",
@@ -403,6 +415,19 @@
"notMergeableTitle": "Aquesta sol·licitud d'integració encara no es pot fusionar",
"notMergeableDetail": "GitHub indica aquest estat de fusió: {{state}}."
},
+ "restrictions": {
+ "title": "Restriccions de fusió",
+ "approvalsRequired_one": "{{displayCount}} aprovació necessària",
+ "approvalsRequired_other": "{{displayCount}} aprovacions necessàries",
+ "pipelineMustSucceed": "La pipeline ha de tenir èxit abans de fusionar.",
+ "approvalsRequired_many": "{{displayCount}} d'aprovacions necessàries"
+ },
+ "providerBlocked": {
+ "failingPipeline": "La pipeline falla a la darrera comissió.",
+ "pendingPipeline": "La pipeline encara s'està executant a la darrera comissió.",
+ "permission": "No tens permís per fusionar aquesta {{term}}.",
+ "draft": "Marca la {{term}} com a preparada per a la revisió abans de fusionar-la."
+ },
"methodLabels": {
"merge": "Crea una comissió de fusió",
"squash": "Agrupa i fusiona",
@@ -450,6 +475,7 @@
"acceptTerms": "Accepta",
"replyBadRequest": "Aquesta resposta no es pot publicar. Pot ser que el fil hagi canviat.",
"replyForbidden": "No tens permís per respondre a aquesta sol·licitud d'integració.",
+ "replyForbiddenTerm": "No tens permís per respondre a aquesta {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Aquest comentari no es pot denunciar.",
@@ -481,8 +507,6 @@
"termsAcceptRequired": "Has d'acceptar les condicions del servei per publicar.",
"termsOutdatedCopy": "Les condicions del servei han canviat. Torna a obrir aquesta pantalla per acceptar-ne la versió més recent.",
"termsCheckRetryCopy": "No s'han pogut comprovar les condicions del servei. Comprova la connexió i torna-ho a provar.",
- "comment_many": "{{displayCount}} comentaris",
- "reaction_many": "reaccions",
"reactions": {
"thumbsUp": "Polze amunt",
"thumbsDown": "Polze avall",
@@ -500,7 +524,9 @@
"outdatedOnLines": "Desactualitzat a {{lines}}",
"outdatedOnPath": "Desactualitzat a {{path}}"
},
- "deletedUser": "usuari eliminat"
+ "deletedUser": "usuari eliminat",
+ "comment_many": "{{displayCount}} comentaris",
+ "reaction_many": "reaccions"
},
"couldNotOpenGitHubAppSettings": "No s'ha pogut obrir la configuració de l'aplicació de GitHub.",
"installKiloGitHubApp": "Instal·la l'aplicació de Kilo per a GitHub",
@@ -512,17 +538,19 @@
"reviewPullRequest": "Revisa la sol·licitud d'integració",
"headLine": "{{counts}} · última comissió {{sha}}",
"entry": {
- "eyebrow": "Obre una sol·licitud d'integració amb el seu URL.",
- "pastePrLink": "Enganxa l'enllaç d'una PR",
- "noRecentPrs": "Cap PR recent",
- "noRecentPrsDescription": "Enganxa l'enllaç d'una PR al camp de dalt per començar una revisió. La propera vegada apareixerà aquí.",
+ "eyebrow": "Obre una sol·licitud d'integració o de fusió amb el seu URL",
+ "pastePrLink": "Enganxa l'enllaç d'una sol·licitud d'integració o de fusió",
+ "noRecentPrs": "Cap revisió recent",
+ "noRecentPrsDescription": "Enganxa un enllaç a dalt per començar una revisió — la propera vegada apareixerà aquí.",
"couldNotLoad": "No s'ha pogut carregar.",
"removeFromRecentsTitle": "Vols eliminar-la de la llista de recents?",
- "removeFromRecentsMessage": "Aquesta sol·licitud d'integració s'eliminarà de la llista de recents.",
+ "removeFromRecentsMessage": "Aquesta revisió s'eliminarà de la llista de recents.",
"removeRecentAccessibility": "Elimina {{repo}} de la llista de recents",
- "urlAccessibility": "URL de la sol·licitud d'integració de GitHub",
- "clearLink": "Esborra l'enllaç de la sol·licitud d'integració",
- "pasteLink": "Enganxa l'enllaç de la sol·licitud d'integració",
+ "urlAccessibility": "Introdueix l'URL d'una sol·licitud d'integració o de fusió",
+ "urlPlaceholder": "URL d'una sol·licitud d'integració o de fusió",
+ "openAccessibility": "Obre una sol·licitud d'integració o de fusió",
+ "clearLink": "Esborra l'enllaç",
+ "pasteLink": "Enganxa l'enllaç de la sol·licitud d'integració o de fusió",
"open": "Obertura"
},
"checks": {
@@ -571,9 +599,15 @@
"connect": {
"checkFailedTitle": "No s'ha pogut comprovar la connexió amb GitHub.",
"checkFailedMessage": "No es pot saber si has iniciat la sessió fins que es carregui aquesta informació.",
+ "checkFailedTitleGitLab": "No s'ha pogut comprovar la connexió amb GitLab.",
+ "checkFailedTitleBitbucket": "No s'ha pogut comprovar la connexió amb Bitbucket.",
+ "providerCheckFailedMessage": "L'estat de la connexió no està disponible fins que es carregui.",
"reconnectTitle": "Torna a connectar GitHub",
"reconnectDescription": "S'ha revocat la teva connexió amb GitHub. Torna a connectar-te per continuar revisant sol·licituds d'integració al mòbil.",
- "description": "Connecta el teu compte de GitHub per revisar sol·licituds d'integració al mòbil."
+ "description": "Connecta el teu compte de GitHub per revisar sol·licituds d'integració al mòbil.",
+ "gitlabDescription": "Connecta el teu compte de GitLab per revisar sol·licituds de fusió des del mòbil.",
+ "bitbucketDescription": "Connecta Bitbucket a aquesta organització per revisar sol·licituds d'integració des del mòbil.",
+ "bitbucketOrgOnlyDescription": "Selecciona una organització al teu perfil per revisar-ne les sol·licituds d'integració de Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -596,7 +630,10 @@
},
"reconnectNotice": {
"title": "La connexió amb GitHub ha caducat.",
- "message": "La teva connexió amb GitHub ja no és vàlida. Torna a comprovar-la. Si cal, se't demanarà que et tornis a connectar."
+ "message": "La teva connexió amb GitHub ja no és vàlida. Torna a comprovar-la. Si cal, se't demanarà que et tornis a connectar.",
+ "gitlabTitle": "La connexió amb GitLab ha caducat.",
+ "bitbucketTitle": "La connexió amb Bitbucket ha caducat.",
+ "providerMessage": "La teva connexió amb {{provider}} ja no és vàlida. Torna a comprovar-la. Si cal, se't demanarà que et tornis a connectar."
},
"eventChips": {
"comment": "Comentari",
@@ -650,6 +687,21 @@
"files": "Fitxers",
"discussion": "Discussió"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Sol·licitud de fusió",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Comparteix la sol·licitud de fusió",
+ "viewOnProvider": "Mostra-ho a {{provider}}",
+ "mergeRequestUnavailable": "Sol·licitud de fusió no disponible",
+ "unavailableDescription": "Pot ser que l'hagin eliminat o que no hi tinguis accés.",
+ "accessDeniedMergeRequest": "No tens permís per veure aquesta sol·licitud de fusió.",
+ "couldNotLoadMergeRequest": "No s'ha pogut carregar la sol·licitud de fusió.",
+ "discussionAccessDenied": "No tens permís per veure la discussió d'aquesta sol·licitud de fusió.",
+ "discussionUnavailableMessage": "Pot ser que aquesta sol·licitud de fusió s'hagi eliminat.",
+ "noDiscussionDescription": "Aquesta sol·licitud de fusió encara no té cap fil de revisió ni cap comentari a la conversa.",
+ "noFilesChangedDescription": "Aquesta sol·licitud de fusió no modifica cap fitxer."
+ },
"fileStatus": {
"modified": "Modificat",
"renamed": "Reanomenat",
@@ -666,7 +718,7 @@
"emptyLine": "(buit)"
},
"linkPasteClipboardEmpty": "El porta-retalls és buit.",
- "linkPasteNotAPullRequest": "No és un enllaç a una sol·licitud d'integració de GitHub.",
+ "linkPasteNotAPullRequest": "No és un enllaç a una sol·licitud d'integració o de fusió",
"announce": {
"commentPosted": "Comentari publicat",
"reviewSubmitted": "Revisió enviada",
@@ -675,6 +727,7 @@
"mutationError": {
"commentNotPosted": "Aquest comentari no es pot publicar. Pot ser que la línia seleccionada hagi canviat o que la PR s'hagi actualitzat.",
"reviewNotSubmitted": "Aquesta revisió no es pot enviar tal com està. Pot ser que la PR hagi canviat o que estiguis intentant revisar la teva pròpia sol·licitud d'integració.",
+ "reviewNotSubmittedTerm": "Aquesta revisió no es pot enviar tal com està. Pot ser que la {{term}} hagi canviat o que no puguis revisar la teva pròpia {{term}}.",
"couldNotPostComment": "No s'ha pogut publicar el comentari.",
"couldNotSubmitReview": "No s'ha pogut enviar la revisió. Comprova la connexió i torna-ho a provar."
},
@@ -682,6 +735,7 @@
"couldNotReply": "No s'ha pogut respondre.",
"couldNotCompleteAction": "No s'ha pogut completar aquesta acció.",
"mergeResultDefaultError": "GitHub no ha completat la fusió.",
+ "mergeResultNotCompleted": "La {{term}} no s'ha fusionat. Comprova-ne l'estat i torna-ho a provar.",
"ambiguous": "No s'ha pogut confirmar l'acció. Comprova la PR abans de tornar-ho a provar.",
"persistenceFailed": "No s'ha pogut registrar aquesta acció. Torna-ho a provar més tard.",
"forbidden": "No tens permís per fer aquesta acció."
@@ -2004,11 +2058,31 @@
"retryConnection": "Torna a provar la connexió"
},
"newSession": {
+ "recentlyUsed": "Utilitzats recentment",
+ "couldNotLoadGithubRepositories": "No s'han pogut carregar els repositoris de GitHub.",
+ "couldNotLoadGitlabRepositories": "No s'han pogut carregar els repositoris de GitLab.",
+ "couldNotLoadBitbucketRepositories": "No s'han pogut carregar els repositoris de Bitbucket.",
"connectGithubDescription": "Connecta GitHub al navegador i torna aquí per triar un repositori.",
+ "connectGitlabDescription": "Connecta GitLab al navegador i torna aquí per triar un repositori.",
+ "connectBitbucketDescription": "Connecta Bitbucket al navegador i torna aquí per triar un repositori.",
"openGithub": "Obre GitHub",
+ "openGitlab": "Obre GitLab",
+ "openBitbucket": "Obre Bitbucket",
"refreshRepositories": "Actualitza els repositoris",
"githubConnected": "GitHub connectat",
+ "gitlabConnected": "GitLab connectat",
"noRepositoriesVisible": "No hi ha cap repositori visible. Comprova que l'aplicació de Kilo per a GitHub tingui accés als repositoris i actualitza la llista.",
+ "noRepositoriesVisibleGitlab": "No hi ha cap repositori visible. Comprova l'accés als repositoris de GitLab i actualitza la llista.",
+ "noRepositoriesVisibleBitbucket": "No hi ha cap repositori visible. Comprova l'accés als repositoris de Bitbucket i actualitza la llista.",
+ "bitbucketOrganizationsOnly": "Bitbucket només està disponible per a organitzacions.",
+ "branchPickerTitle": "Selecciona una branca",
+ "branchDefault": "Per defecte",
+ "branchAccessibility": "Branca: {{label}}",
+ "branchLoading": "Carregant branques",
+ "branchLoadError": "No s'han pogut carregar les branques",
+ "branchUnavailable": "No hi ha branques disponibles per a aquest repositori. Comprova el teu accés amb el proveïdor i tria un altre repositori.",
+ "branchEmpty": "No hi ha branques disponibles",
+ "branchPlaceholder": "Selecciona una branca",
"runOnWithTarget": "Execució a: {{target}}",
"environment": "Entorn",
"couldNotLoadEnvironment": "No s'ha pogut carregar el teu entorn.",
@@ -2029,24 +2103,13 @@
"couldNotRefreshRepositories": "No s'han pogut actualitzar els repositoris. Torna-ho a provar.",
"discardDraftTitle": "Vols descartar l'esborrany?",
"discardDraftMessage": "Es perdrà el teu missatge.",
+ "discardWithUploadsMessage": "S'eliminaran el teu missatge i els fitxers penjats que no s'hagin adjuntat a missatges enviats.",
"discardFailed": "No s'ha pogut descartar l'esborrany. Torna-ho a provar.",
"remoteHint": "Executa `kilo remote` a l'ordinador, o `/remote` en una sessió activa del CLI, per controlar un procés local de kilo.",
- "connectBitbucketDescription": "Connecta Bitbucket al navegador i torna aquí per triar un repositori.",
- "connectGitlabDescription": "Connecta GitLab al navegador i torna aquí per triar un repositori.",
- "couldNotLoadBitbucketRepositories": "No s'han pogut carregar els repositoris de Bitbucket.",
- "couldNotLoadGithubRepositories": "No s'han pogut carregar els repositoris de GitHub.",
- "couldNotLoadGitlabRepositories": "No s'han pogut carregar els repositoris de GitLab.",
- "gitlabConnected": "GitLab connectat",
- "noRepositoriesVisibleBitbucket": "No hi ha cap repositori visible. Comprova l'accés als repositoris de Bitbucket i actualitza la llista.",
- "noRepositoriesVisibleGitlab": "No hi ha cap repositori visible. Comprova l'accés als repositoris de GitLab i actualitza la llista.",
- "openBitbucket": "Obre Bitbucket",
- "openGitlab": "Obre GitLab",
- "recentlyUsed": "Utilitzats recentment",
- "cliCannotContinue": "Aquest CLI no pot continuar una sessió. Tria Cloud Agent o un altre CLI.",
"continueFrom": "S'està continuant la sessió {{title}}.",
- "importFailed": "No s'ha pogut importar aquesta sessió.",
"importingSession": "Important la sessió…",
- "discardWithUploadsMessage": "S'eliminaran el teu missatge i els fitxers penjats que no s'hagin adjuntat a missatges enviats."
+ "cliCannotContinue": "Aquest CLI no pot continuar una sessió. Tria Cloud Agent o un altre CLI.",
+ "importFailed": "No s'ha pogut importar aquesta sessió."
},
"partRenderer": {
"updatedFileCount_one": "S'ha actualitzat {{displayCount}} fitxer.",
diff --git a/apps/mobile/src/i18n/locales/ckb.json b/apps/mobile/src/i18n/locales/ckb.json
index 5bd018aa88..a78300ce7f 100644
--- a/apps/mobile/src/i18n/locales/ckb.json
+++ b/apps/mobile/src/i18n/locales/ckb.json
@@ -36,6 +36,7 @@
"cost": "تێچوون",
"discard": "وازهێنان",
"findings": "دۆزینەوەکان",
+ "mergeRequest": "داواکاری تێکەڵکردن",
"notConnected": "نەبەستراوەتەوە",
"notifications": "ئاگادارکردنەوەکان",
"pullRequest": "داواکاری یەکخستن",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ڕیزی بەتاڵی جیاوازی"
},
"connectionExpired": "ماوەی پەیوەندی بە GitHub بەسەرچووە.",
+ "capabilities": {
+ "banner": {
+ "title": "لەم پێشکەشکارە بەردەست نییە",
+ "accessibility": "لەم پێشکەشکارە بەردەست نییە: {{reason}}"
+ }
+ },
"merge": {
"merge": "یەکخستن",
"mergeNow": "ئێستا تێکەڵ بکە",
"mergePullRequest": "تێکەڵکردنی داواکاری ڕاکێشان",
+ "mergeTermTitle": "تێکەڵکردنی {{term}}",
"enableAutoMerge": "تێکەڵکردنی ئۆتۆماتیکی چالاک بکە",
"disableAutoMerge": "تێکەڵکردنی ئۆتۆماتیکی ناچالاک بکە",
"autoMergeOn": "تێکەڵکردنی ئۆتۆماتیکی چالاکە",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "دوای تێکەڵکردن لقەکە بسڕەوە",
"noEnabledMethods": "لە ئەم ڕێپۆیەدا هیچ شێوازێکی تێکەڵکردن چالاک نییە. لە بەڕێوەبەرێکی ڕێپۆکە داوا بکە تێکەڵکردنی ئاسایی، یەکخستنی کۆمیتەکان، یان گۆڕینی بنەما چالاک بکات.",
"confirmTitle": "داواکارییەکەی ڕاکێشان تێکەڵ بکرێت؟",
+ "confirmTitleTerm": "{{term}} تێکەڵ بکرێت؟",
"confirmMessage": "بەم کارە گۆڕانکارییەکانت لە لقە بنەڕەتییەکەدا تێکەڵ دەکرێن.",
"enableAutoMergeConfirmTitle": "تێکەڵکردنی ئۆتۆماتیکی چالاک بکرێت؟",
"enableAutoMergeConfirmMessage": "کاتێک هەموو پشکنینە پێویستەکان سەرکەوتوو بن، GitHub ئەم داواکارییەی ڕاکێشان بە ئۆتۆماتیکی تێکەڵ دەکات.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} بەشێوازی خۆکار تێکەڵ دەکرێت کاتێک پایپلاینەکەی سەرکەوتوو دەبێت.",
+ "enableAutoMergeDescriptionTerm": "GitLab ئەم {{term}}ە بەشێوازی خۆکار تێکەڵ دەکات کاتێک پایپلاینەکەی سەرکەوتوو دەبێت.",
"forbidden": "مۆڵەتی تێکەڵکردنی ئەم داواکاری ڕاکێشانەت نییە.",
"cannotMerge": "ناتوانرێت ئەم داواکارییەی ڕاکێشان بە دۆخی ئێستای تێکەڵ بکرێت.",
"couldNotMerge": "نەتوانرا داواکاری ڕاکێشان تێکەڵ بکرێت.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "پێشتر تێکەڵ کراوە",
- "closed": "ئەم داواکاری ڕاکێشانە داخراوە"
+ "closed": "ئەم داواکاری ڕاکێشانە داخراوە",
+ "closedMergeRequest": "ئەم داواکاری تێکەڵکردنە داخراوە"
},
"partialSuccessBanner": {
"body": "نەتوانرا لقەکە بسڕدرێتەوە: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ئەم داواکاری ڕاکێشانە هێشتا ناتوانرێت تێکەڵ بکرێت",
"notMergeableDetail": "GitHub دۆخی ئەگەری تێکەڵکردنی بە {{state}} ڕاگەیاندووە."
},
+ "restrictions": {
+ "title": "سنووردارکردنی تێکەڵکردن",
+ "approvalsRequired_one": "پێویست بە {{displayCount}} پەسەندکردنە",
+ "approvalsRequired_other": "پێویست بە {{displayCount}} پەسەندکردنە",
+ "pipelineMustSucceed": "پێویستە پایپلاین پێش تێکەڵکردن سەرکەوتوو بێت."
+ },
+ "providerBlocked": {
+ "failingPipeline": "پایپلاین لە دواین کۆمیتدا سەرکەوتوو نییە.",
+ "pendingPipeline": "پایپلاین هێشتا لە دواین کۆمیتدا کار دەکات.",
+ "permission": "مۆڵەتی تێکەڵکردنی ئەم {{term}}ەت نییە.",
+ "draft": "پێش تێکەڵکردن، {{term}} وەک ئامادە بۆ پێداچوونەوە نیشان بکە."
+ },
"methodLabels": {
"merge": "کۆمیتێکی تێکەڵکردن دروست بکە",
"squash": "کۆمیتەکان یەک بخە و تێکەڵ بکە",
@@ -448,6 +472,7 @@
"acceptTerms": "پەسند بکە",
"replyBadRequest": "ناتوانرێت ئەم وەڵامە بڵاو بکرێتەوە. ڕەنگە زنجیرەی گفتوگۆکە گۆڕابێت.",
"replyForbidden": "مۆڵەتی وەڵامدانەوەی ئەم داواکارییەی ڕاکێشانت نییە.",
+ "replyForbiddenTerm": "مۆڵەتی وەڵامدانەوەی ئەم {{term}}ەت نییە.",
"moderation": {
"reportContent": {
"terminal": "ئەم بۆچوونە ناتوانرێت ڕاپۆرت بکرێت.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "پێداچوونەوە بە داواکارییەکەی ڕاکێشان بکە",
"headLine": "{{counts}} · دوایین کۆمیت {{sha}}",
"entry": {
- "eyebrow": "داواکارییەکی ڕاکێشان بە URL بکەرەوە.",
- "pastePrLink": "بەستەری PR بلکێنە",
- "noRecentPrs": "هیچ PR ـێک لە دوایینەکاندا نییە",
- "noRecentPrsDescription": "بۆ دەستپێکردنی پێداچوونەوە بەستەری PR لە سەرەوە بلکێنە — جاری داهاتوو لێرە دەردەکەوێت.",
+ "eyebrow": "داواکارییەکی ڕاکێشان یان تێکەڵکردن بە URL بکەرەوە.",
+ "pastePrLink": "بەستەری داواکاری ڕاکێشان یان تێکەڵکردن بلکێنە",
+ "noRecentPrs": "هیچ پێداچوونەوەیەکی دوایین نییە",
+ "noRecentPrsDescription": "بۆ دەستپێکردنی پێداچوونەوە بەستەرێک لە سەرەوە بلکێنە — جاری داهاتوو لێرە دەردەکەوێت.",
"couldNotLoad": "نەتوانرا بار بکرێت.",
"removeFromRecentsTitle": "لە لیستی دوایینەکان لاببرێت؟",
- "removeFromRecentsMessage": "ئەم داواکارییەی ڕاکێشان لە لیستی دوایینەکانت لادەبرێت.",
+ "removeFromRecentsMessage": "ئەم پێداچوونەوەیە لە لیستی دوایینەکانت لادەبرێت.",
"removeRecentAccessibility": "{{repo}} لە لیستی دوایینەکان لاببە",
- "urlAccessibility": "URL ـی داواکاری ڕاکێشانی GitHub",
- "clearLink": "بەستەری داواکارییەکەی ڕاکێشان پاک بکەرەوە",
- "pasteLink": "بەستەری داواکاری ڕاکێشان بلکێنە",
+ "urlAccessibility": "URLی داواکاری ڕاکێشان یان تێکەڵکردن بنووسە",
+ "urlPlaceholder": "URLی داواکاری ڕاکێشان یان داواکاری تێکەڵکردن",
+ "openAccessibility": "کردنەوەی داواکاری ڕاکێشان یان داواکاری تێکەڵکردن",
+ "clearLink": "بەستەر پاک بکەرەوە",
+ "pasteLink": "بەستەری داواکاری ڕاکێشان یان تێکەڵکردن بلکێنە",
"open": "کراوە"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "نەتوانرا پەیوەندی بە GitHub بپشکنرێت.",
"checkFailedMessage": "تا ئەمە بار نەکرێت، دۆخی چوونەژوورەوە بەردەست نییە.",
+ "checkFailedTitleGitLab": "نەتوانرا پەیوەندی بە GitLab بپشکنرێت.",
+ "checkFailedTitleBitbucket": "نەتوانرا پەیوەندی بە Bitbucket بپشکنرێت.",
+ "providerCheckFailedMessage": "دۆخی پەیوەندی تا بارکردن بەردەست نییە.",
"reconnectTitle": "دووبارە بەستنەوەی GitHub",
"reconnectDescription": "مۆڵەتی پەیوەندییەکەت بە GitHub هەڵوەشێنراوەتەوە. بۆ بەردەوامبوون لە پێداچوونەوە بە داواکارییەکانی ڕاکێشان لە مۆبایلدا، دووبارە بیبەستەوە.",
- "description": "بۆ پێداچوونەوە بە داواکارییەکانی ڕاکێشان لە مۆبایلدا، هەژمارەکەت لە GitHub ببەستەوە."
+ "description": "بۆ پێداچوونەوە بە داواکارییەکانی ڕاکێشان لە مۆبایلدا، هەژمارەکەت لە GitHub ببەستەوە.",
+ "gitlabDescription": "هەژمارەی GitLabەکەت بچەلەاندن بۆ پێداچوونەوەی داواکارییەکانی تێکەڵکردن لە مۆبایلدا.",
+ "bitbucketDescription": "Bitbucket بەم ڕێکخراوە بچەلەێنە بۆ پێداچوونەوەی داواکارییەکانی ڕاکێشان لە مۆبایلدا.",
+ "bitbucketOrgOnlyDescription": "ڕێکخراوێک لە پرۆفایلەکەت هەڵبژێرە بۆ پێداچوونەوەی داواکارییەکانی ڕاکێشانی Bitbucketی."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "ماوەی پەیوەندی بە GitHub بەسەرچووە.",
- "message": "پەیوەندییەکەت بە GitHub چیتر کار ناکات. دووبارە پەیوەندییەکەت بپشکنە — ئەگەر پێویست بێت، داوات لێ دەکرێت دووبارە بیبەستیتەوە."
+ "message": "پەیوەندییەکەت بە GitHub چیتر کار ناکات. دووبارە پەیوەندییەکەت بپشکنە — ئەگەر پێویست بێت، داوات لێ دەکرێت دووبارە بیبەستیتەوە.",
+ "gitlabTitle": "ماوەی پەیوەندی بە GitLab بەسەرچووە.",
+ "bitbucketTitle": "ماوەی پەیوەندی بە Bitbucket بەسەرچووە.",
+ "providerMessage": "پەیوەندییەکەت بە {{provider}} چیتر کار ناکات. دووبارە پەیوەندییەکەت بپشکنە — ئەگەر پێویست بێت، داوات لێ دەکرێت دووبارە بیبەستیتەوە."
},
"eventChips": {
"comment": "بۆچوون",
@@ -643,6 +679,21 @@
"files": "پەڕگە",
"discussion": "گفتوگۆ"
},
+ "terms": {
+ "pullRequest": "داواکاری یەکخستن",
+ "mergeRequest": "داواکاری تێکەڵکردن",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "داواکارییەکەی تێکەڵکردن هاوبەش بکە",
+ "viewOnProvider": "بینین لە {{provider}}",
+ "mergeRequestUnavailable": "داواکاری تێکەڵکردن بەردەست نییە",
+ "unavailableDescription": "لەوانەیە سڕابێتەوە، یان لەوانەیە مۆڵەتی بینینت نەبێت.",
+ "accessDeniedMergeRequest": "مۆڵەتی بینینی ئەم داواکاری تێکەڵکردنەت نییە.",
+ "couldNotLoadMergeRequest": "نەتوانرا داواکاری تێکەڵکردن بار بکرێت.",
+ "discussionAccessDenied": "مۆڵەتی بینینی گفتوگۆی ئەم داواکارییەی تێکەڵکردنەت نییە.",
+ "discussionUnavailableMessage": "ڕەنگە ئەم داواکاری تێکەڵکردنە لابرابێت.",
+ "noDiscussionDescription": "لەسەر ئەم داواکارییەی تێکەڵکردن هیچ زنجیرەی پێداچوونەوە یان بۆچوونێکی گفتوگۆ نییە.",
+ "noFilesChangedDescription": "لە ئەم داواکارییەی تێکەڵکردندا هیچ فایلێک نەگۆڕاوە."
+ },
"fileStatus": {
"modified": "گۆڕدراو",
"renamed": "ناوگۆڕدراو",
@@ -659,7 +710,7 @@
"emptyLine": "(بەتاڵ)"
},
"linkPasteClipboardEmpty": "کلیپبۆردەکە بەتاڵە.",
- "linkPasteNotAPullRequest": "ئەمە بەستەری داواکاری ڕاکێشانی GitHub نییە.",
+ "linkPasteNotAPullRequest": "ئەمە بەستەری داواکاری ڕاکێشان یان تێکەڵکردن نییە.",
"announce": {
"commentPosted": "بۆچوون بڵاوکرایەوە",
"reviewSubmitted": "پێداچوونەوە نێردرا",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ئەم بۆچوونە ناتوانرێت بڵاو بکرێتەوە. ڕەنگە هێڵە هەڵبژێردراوەکە گۆڕابێت، یان PR نوێکرابێتەوە.",
"reviewNotSubmitted": "ناتوانرێت ئەم پێداچوونەوەیە بە دۆخی ئێستای بنێردرێت. ڕەنگە PR گۆڕابێت، یان ناتوانیت پێداچوونەوە بە داواکاری ڕاکێشانی خۆت بکەیت.",
+ "reviewNotSubmittedTerm": "ئەم پێداچوونەوەیە بەم شێوەیە ناسپێردرێت. لەوانەیە {{term}} گۆڕابێت، یان ناتوانیت پێداچوونەوەی {{term}}ی خۆت بکەیت.",
"couldNotPostComment": "نەتوانرا بۆچوون بڵاو بکرێتەوە.",
"couldNotSubmitReview": "نەتوانرا پێداچوونەوە بنێردرێت. پەیوەندییەکەت بپشکنە و دووبارە هەوڵ بدەوە."
},
@@ -675,6 +727,7 @@
"couldNotReply": "نەتوانرا وەڵام بدرێتەوە.",
"couldNotCompleteAction": "نەتوانرا ئەم کردارە تەواو بکرێت.",
"mergeResultDefaultError": "GitHub تێکەڵکردنەکەی تەواو نەکرد.",
+ "mergeResultNotCompleted": "{{term}} تێکەڵ نەکرا. دۆخی بپشکنە و دووبارە هەوڵ بدە.",
"ambiguous": "نەتوانرا پشتڕاست بکرێتەوە — پێش هەوڵدانەوە، PR بپشکنە.",
"persistenceFailed": "نەتوانرا ئەم کردارە تۆمار بکرێت. تکایە دواتر هەوڵ بدەوە.",
"forbidden": "ئەم کارە ڕێگەپێدراو نییە."
@@ -1988,11 +2041,31 @@
"retryConnection": "دووبارە هەوڵدان بۆ پەیوەندیکردن"
},
"newSession": {
+ "recentlyUsed": "تازە بەکارهاتووەکان",
+ "couldNotLoadGithubRepositories": "نەتوانرا کۆگاکانی GitHub بار بکرێن.",
+ "couldNotLoadGitlabRepositories": "نەتوانرا کۆگاکانی GitLab بار بکرێن.",
+ "couldNotLoadBitbucketRepositories": "نەتوانرا کۆگاکانی Bitbucket بار بکرێن.",
"connectGithubDescription": "لە وێبگەڕەکەتدا هەژماری GitHub ببەستەرەوە، پاشان بگەڕێوە ئێرە و کۆگایەک هەڵبژێرە.",
+ "connectGitlabDescription": "لە وێبگەڕەکەتدا هەژماری GitLab ببەستەرەوە، پاشان بگەڕێوە ئێرە و کۆگایەک هەڵبژێرە.",
+ "connectBitbucketDescription": "لە وێبگەڕەکەتدا هەژماری Bitbucket ببەستەرەوە، پاشان بگەڕێوە ئێرە و کۆگایەک هەڵبژێرە.",
"openGithub": "کردنەوەی GitHub",
+ "openGitlab": "کردنەوەی GitLab",
+ "openBitbucket": "کردنەوەی Bitbucket",
"refreshRepositories": "نوێکردنەوەی کۆگاکان",
"githubConnected": "GitHub بەستراوەتەوە",
+ "gitlabConnected": "GitLab بەستراوەتەوە",
"noRepositoriesVisible": "هیچ کۆگایەک دیار نییە. مۆڵەتی دەستگەیشتنی ئەپی Kilo لە GitHub بە کۆگاکان بپشکنە، پاشان لیستەکە نوێ بکەرەوە.",
+ "noRepositoriesVisibleGitlab": "هیچ کۆگایەک دیار نییە. مۆڵەتی دەستگەیشتن بە کۆگاکانی GitLab بپشکنە، پاشان لیستەکە نوێ بکەرەوە.",
+ "noRepositoriesVisibleBitbucket": "هیچ کۆگایەک دیار نییە. مۆڵەتی دەستگەیشتن بە کۆگاکانی Bitbucket بپشکنە، پاشان لیستەکە نوێ بکەرەوە.",
+ "bitbucketOrganizationsOnly": "Bitbucket تەنها بۆ ڕێکخراوەکان بەردەستە.",
+ "branchPickerTitle": "هەڵبژاردنی لق",
+ "branchDefault": "بنەڕەتی",
+ "branchAccessibility": "لق: {{label}}",
+ "branchLoading": "لقەکان باردەکرێن",
+ "branchLoadError": "نەتوانرا لقەکان بار بکرێن",
+ "branchUnavailable": "لقەکان بۆ ئەم کۆگایە بەردەست نین. مۆڵەتەکانت لەگەڵ پێشکەشکار بپشکنە، پاشان کۆگایەکی تر هەڵبژێرە.",
+ "branchEmpty": "هیچ لقێک بەردەست نییە",
+ "branchPlaceholder": "لقێک هەڵبژێرە",
"runOnWithTarget": "جێبەجێکردن لەسەر: {{target}}",
"environment": "ژینگە",
"couldNotLoadEnvironment": "نەتوانرا ژینگەکەت بار بکرێت.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "نەتوانرا کۆگاکان نوێ بکرێنەوە. تکایە دووبارە هەوڵ بدەرەوە.",
"discardDraftTitle": "سڕینەوەی ڕەشنووس؟",
"discardDraftMessage": "داواکارییەکەت لەدەست دەچێت.",
+ "discardWithUploadsMessage": "داواکارییەکەت و ئەو پەڕگە بارکراوانەی هاوپێچی پەیامی نێردراو نەکراون دەسڕێنەوە.",
"discardFailed": "نەتوانرا ڕەشنووسەکە بسڕدرێتەوە. تکایە دووبارە هەوڵ بدەرەوە.",
"remoteHint": "بۆ کۆنترۆڵکردنی پرۆسەیەکی ناوخۆیی kilo، لە کۆمپیوتەرەکەتدا `kilo remote` جێبەجێ بکە، یان لە سێشنێکی کارای CLI دا `/remote` جێبەجێ بکە.",
- "connectBitbucketDescription": "لە وێبگەڕەکەتدا هەژماری Bitbucket ببەستەرەوە، پاشان بگەڕێوە ئێرە و کۆگایەک هەڵبژێرە.",
- "connectGitlabDescription": "لە وێبگەڕەکەتدا هەژماری GitLab ببەستەرەوە، پاشان بگەڕێوە ئێرە و کۆگایەک هەڵبژێرە.",
- "couldNotLoadBitbucketRepositories": "نەتوانرا کۆگاکانی Bitbucket بار بکرێن.",
- "couldNotLoadGithubRepositories": "نەتوانرا کۆگاکانی GitHub بار بکرێن.",
- "couldNotLoadGitlabRepositories": "نەتوانرا کۆگاکانی GitLab بار بکرێن.",
- "gitlabConnected": "GitLab بەستراوەتەوە",
- "noRepositoriesVisibleBitbucket": "هیچ کۆگایەک دیار نییە. مۆڵەتی دەستگەیشتن بە کۆگاکانی Bitbucket بپشکنە، پاشان لیستەکە نوێ بکەرەوە.",
- "noRepositoriesVisibleGitlab": "هیچ کۆگایەک دیار نییە. مۆڵەتی دەستگەیشتن بە کۆگاکانی GitLab بپشکنە، پاشان لیستەکە نوێ بکەرەوە.",
- "openBitbucket": "کردنەوەی Bitbucket",
- "openGitlab": "کردنەوەی GitLab",
- "recentlyUsed": "تازە بەکارهاتووەکان",
"continueFrom": "بەردەوام دەبین لە {{title}}.",
"importingSession": "سێشنەکە هاوردە دەکرێت",
"cliCannotContinue": "ئەم CLI ـیە ناتوانێت سێشنێک بەردەوام بکات. Cloud Agent یان CLI ـیەکی تر هەڵبژێرە.",
- "importFailed": "نەتوانرا ئەم سێشنە هاوردە بکرێت.",
- "discardWithUploadsMessage": "داواکارییەکەت و ئەو پەڕگە بارکراوانەی هاوپێچی پەیامی نێردراو نەکراون دەسڕێنەوە."
+ "importFailed": "نەتوانرا ئەم سێشنە هاوردە بکرێت."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} پەڕگە نوێ کرایەوە.",
diff --git a/apps/mobile/src/i18n/locales/cs.json b/apps/mobile/src/i18n/locales/cs.json
index d6704ff3e3..68ddb6c755 100644
--- a/apps/mobile/src/i18n/locales/cs.json
+++ b/apps/mobile/src/i18n/locales/cs.json
@@ -36,6 +36,7 @@
"cost": "Náklady",
"discard": "Zahodit",
"findings": "Zjištění",
+ "mergeRequest": "merge request",
"notConnected": "Nepřipojeno",
"notifications": "Oznámení",
"pullRequest": "pR",
@@ -344,10 +345,17 @@
"emptyDiffRow": "Prázdný řádek přehledu změn"
},
"connectionExpired": "Platnost připojení ke službě GitHub vypršela.",
+ "capabilities": {
+ "banner": {
+ "title": "Není dostupné u tohoto poskytovatele",
+ "accessibility": "Není dostupné u tohoto poskytovatele: {{reason}}"
+ }
+ },
"merge": {
"merge": "Sloučení",
"mergeNow": "Sloučit nyní",
"mergePullRequest": "Sloučení PR",
+ "mergeTermTitle": "Sloučení {{term}}",
"enableAutoMerge": "Zapnout automatické sloučení",
"disableAutoMerge": "Vypnout automatické sloučení",
"autoMergeOn": "Automatické sloučení je zapnuté",
@@ -366,9 +374,12 @@
"deleteBranchAfterMerge": "Smazat větev po sloučení",
"noEnabledMethods": "V tomto repozitáři není povolená žádná metoda sloučení. Požádej správce repozitáře, aby povolil slučovací commit, sjednocení commitů nebo přesazení větve.",
"confirmTitle": "Sloučit PR?",
+ "confirmTitleTerm": "Sloučit {{term}}?",
"confirmMessage": "Tím se tvé změny sloučí do cílové větve.",
"enableAutoMergeConfirmTitle": "Zapnout automatické sloučení?",
"enableAutoMergeConfirmMessage": "GitHub tento PR automaticky sloučí, jakmile úspěšně proběhnou všechny povinné kontroly.",
+ "enableAutoMergeConfirmMessageTerm": "Až pipeline proběhne úspěšně, {{term}} se automaticky sloučí.",
+ "enableAutoMergeDescriptionTerm": "GitLab tento {{term}} sloučí automaticky, jakmile pipeline proběhne úspěšně.",
"forbidden": "Nemáš oprávnění sloučit tento PR.",
"cannotMerge": "Tento PR nelze v aktuálním stavu sloučit.",
"couldNotMerge": "PR se nepodařilo sloučit.",
@@ -379,7 +390,8 @@
},
"terminal": {
"alreadyMerged": "Již sloučeno",
- "closed": "Tento PR je uzavřen"
+ "closed": "Tento PR je uzavřen",
+ "closedMergeRequest": "Tento merge request je uzavřen"
},
"partialSuccessBanner": {
"body": "Větev se nepodařilo smazat: {{reason}}.",
@@ -405,6 +417,20 @@
"notMergeableTitle": "Tento PR zatím nelze sloučit",
"notMergeableDetail": "GitHub nahlásil stav sloučení {{state}}."
},
+ "restrictions": {
+ "title": "Omezení slučování",
+ "approvalsRequired_one": "Vyžaduje se {{displayCount}} schválení",
+ "approvalsRequired_other": "Vyžaduje se {{displayCount}} schválení",
+ "pipelineMustSucceed": "Aby bylo možné slučovat, musí pipeline proběhnout úspěšně.",
+ "approvalsRequired_many": "Vyžaduje se {{displayCount}} schválení",
+ "approvalsRequired_few": "Vyžadují se {{displayCount}} schválení"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline u posledního commitu selhává.",
+ "pendingPipeline": "Pipeline u posledního commitu ještě běží.",
+ "permission": "Nemáš oprávnění sloučit tento {{term}}.",
+ "draft": "Před sloučením označ {{term}} jako připravený k revizi."
+ },
"methodLabels": {
"merge": "Vytvořit slučovací commit",
"squash": "Sjednotit commity a sloučit",
@@ -452,6 +478,7 @@
"acceptTerms": "Přijmout",
"replyBadRequest": "Tuto odpověď nelze odeslat. Vlákno se možná změnilo.",
"replyForbidden": "Nemáš oprávnění odpovídat v tomto PR.",
+ "replyForbiddenTerm": "Nemáš oprávnění odpovídat v tomto {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Tento komentář nelze nahlásit.",
@@ -483,10 +510,6 @@
"termsAcceptRequired": "Před přidáním příspěvku musíš přijmout podmínky používání.",
"termsOutdatedCopy": "Podmínky používání se změnily. Znovu otevři tuto obrazovku a přijmi jejich nejnovější verzi.",
"termsCheckRetryCopy": "Podmínky používání se nepodařilo ověřit. Zkontroluj připojení a zkus to znovu.",
- "comment_few": "{{displayCount}} komentáře",
- "comment_many": "{{displayCount}} komentáře",
- "reaction_few": "reakce",
- "reaction_many": "reakce",
"reactions": {
"thumbsUp": "Palec nahoru",
"thumbsDown": "Palec dolů",
@@ -504,7 +527,11 @@
"outdatedOnLines": "Zastaralé: {{lines}}",
"outdatedOnPath": "Zastaralé: {{path}}"
},
- "deletedUser": "smazaný uživatel"
+ "deletedUser": "smazaný uživatel",
+ "comment_few": "{{displayCount}} komentáře",
+ "comment_many": "{{displayCount}} komentáře",
+ "reaction_few": "reakce",
+ "reaction_many": "reakce"
},
"couldNotOpenGitHubAppSettings": "Nepodařilo se otevřít nastavení aplikace GitHub.",
"installKiloGitHubApp": "Nainstalovat aplikaci Kilo pro GitHub",
@@ -516,17 +543,19 @@
"reviewPullRequest": "Zkontrolovat PR",
"headLine": "{{counts}} · poslední commit {{sha}}",
"entry": {
- "eyebrow": "Otevři PR pomocí URL.",
- "pastePrLink": "Vložit odkaz na PR",
- "noRecentPrs": "Žádné nedávné PR",
- "noRecentPrsDescription": "Vlož odkaz na PR do pole výše a začni revizi. Příště se PR zobrazí tady.",
+ "eyebrow": "Otevři PR nebo merge request pomocí URL",
+ "pastePrLink": "Vložit odkaz na PR nebo merge request",
+ "noRecentPrs": "Žádné nedávné revize",
+ "noRecentPrsDescription": "Pro spuštění revize vlož nahoře odkaz — příště se zobrazí tady.",
"couldNotLoad": "Načítání se nezdařilo.",
"removeFromRecentsTitle": "Odebrat z nedávných PR?",
- "removeFromRecentsMessage": "Tento PR se odebere ze seznamu nedávných PR.",
+ "removeFromRecentsMessage": "Tahle revize se odstraní z nedávných.",
"removeRecentAccessibility": "Odebrat {{repo}} ze seznamu nedávných PR",
- "urlAccessibility": "URL PR na GitHubu",
- "clearLink": "Vymazat odkaz na PR",
- "pasteLink": "Vložit odkaz na PR",
+ "urlAccessibility": "Zadej URL PR nebo merge requestu",
+ "urlPlaceholder": "URL PR nebo merge requestu",
+ "openAccessibility": "Otevřít PR nebo merge request",
+ "clearLink": "Vymazat odkaz",
+ "pasteLink": "Vložit odkaz na PR nebo merge request",
"open": "Otevřít"
},
"checks": {
@@ -575,9 +604,15 @@
"connect": {
"checkFailedTitle": "Připojení ke GitHubu se nepodařilo ověřit.",
"checkFailedMessage": "Stav přihlášení bude dostupný až po načtení údajů o připojení.",
+ "checkFailedTitleGitLab": "Připojení ke GitLabu se nepodařilo ověřit.",
+ "checkFailedTitleBitbucket": "Připojení ke Bitbucketu se nepodařilo ověřit.",
+ "providerCheckFailedMessage": "Stav připojení bude dostupný až po načtení.",
"reconnectTitle": "Znovu připojit GitHub",
"reconnectDescription": "Oprávnění pro připojení ke GitHubu bylo zrušeno. Znovu se připoj a pokračuj v revizích PR na mobilu.",
- "description": "Připoj svůj účet GitHub a kontroluj PR na mobilu."
+ "description": "Připoj svůj účet GitHub a kontroluj PR na mobilu.",
+ "gitlabDescription": "Připoj svůj účet GitLab a kontroluj merge requesty na mobilu.",
+ "bitbucketDescription": "Připoj Bitbucket k této organizaci a kontroluj PR na mobilu.",
+ "bitbucketOrgOnlyDescription": "Vyber organizaci ve svém profilu a kontroluj její Bitbucket PR."
},
"screen": {
"title": "#{{number}}",
@@ -601,7 +636,10 @@
},
"reconnectNotice": {
"title": "Platnost připojení ke službě GitHub vypršela.",
- "message": "Tvé připojení ke GitHubu už není platné. Znovu ho ověř. V případě potřeby tě aplikace vyzve k opětovnému připojení."
+ "message": "Tvé připojení ke GitHubu už není platné. Znovu ho ověř. V případě potřeby tě aplikace vyzve k opětovnému připojení.",
+ "gitlabTitle": "Platnost připojení ke službě GitLab vypršela.",
+ "bitbucketTitle": "Platnost připojení ke službě Bitbucket vypršela.",
+ "providerMessage": "Tvé připojení ke {{provider}}u už není platné. Znovu ho ověř. V případě potřeby tě aplikace vyzve k opětovnému připojení."
},
"eventChips": {
"comment": "Komentovat",
@@ -657,6 +695,21 @@
"files": "Soubory",
"discussion": "Diskuse"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Sdílet merge request",
+ "viewOnProvider": "Zobrazit na {{provider}}",
+ "mergeRequestUnavailable": "Merge request není dostupný",
+ "unavailableDescription": "Byl možná odstraněn, nebo k němu nemáš přístup.",
+ "accessDeniedMergeRequest": "Nemáš oprávnění zobrazit tento merge request.",
+ "couldNotLoadMergeRequest": "Merge request se nepodařilo načíst.",
+ "discussionAccessDenied": "Nemáš oprávnění zobrazit diskusi k tomuto merge request.",
+ "discussionUnavailableMessage": "Tento merge request byl možná smazán.",
+ "noDiscussionDescription": "Tento merge request zatím neobsahuje žádná vlákna revize ani komentáře v diskusi.",
+ "noFilesChangedDescription": "Tento merge request neobsahuje žádné změny souborů."
+ },
"fileStatus": {
"modified": "Upraven",
"renamed": "Přejmenován",
@@ -673,7 +726,7 @@
"emptyLine": "(prázdné)"
},
"linkPasteClipboardEmpty": "Schránka je prázdná.",
- "linkPasteNotAPullRequest": "Toto není odkaz na PR na GitHubu.",
+ "linkPasteNotAPullRequest": "Tohle není odkaz na PR ani merge request",
"announce": {
"commentPosted": "Komentář odeslán",
"reviewSubmitted": "Revize odeslána",
@@ -682,6 +735,7 @@
"mutationError": {
"commentNotPosted": "Tento komentář nelze odeslat. Vybraný řádek se možná změnil nebo byl PR aktualizován.",
"reviewNotSubmitted": "Tuto revizi nelze v aktuálním stavu odeslat. PR se možná změnil nebo se pokoušíš o revizi vlastního PR, což není povolené.",
+ "reviewNotSubmittedTerm": "Tuto revizi nelze v aktuálním stavu odeslat. {{term}} se možná změnil nebo nemůžeš revidovat vlastní {{term}}.",
"couldNotPostComment": "Komentář se nepodařilo odeslat.",
"couldNotSubmitReview": "Revizi se nepodařilo odeslat. Zkontroluj připojení a zkus to znovu."
},
@@ -689,6 +743,7 @@
"couldNotReply": "Odpověď se nepodařilo odeslat.",
"couldNotCompleteAction": "Tuto akci se nepodařilo dokončit.",
"mergeResultDefaultError": "GitHub nedokončil sloučení.",
+ "mergeResultNotCompleted": "{{term}} nebyl sloučen. Zkontroluj jeho stav a zkus to znovu.",
"ambiguous": "Výsledek se nepodařilo potvrdit. Před dalším pokusem zkontroluj PR.",
"persistenceFailed": "Tuto akci se nepodařilo zaznamenat. Zkus to později.",
"forbidden": "K této akci nemáš oprávnění."
@@ -2020,11 +2075,31 @@
"retryConnection": "Znovu se připojit"
},
"newSession": {
+ "recentlyUsed": "Nedávno použité",
+ "couldNotLoadGithubRepositories": "Repozitáře ze služby GitHub se nepodařilo načíst.",
+ "couldNotLoadGitlabRepositories": "Repozitáře ze služby GitLab se nepodařilo načíst.",
+ "couldNotLoadBitbucketRepositories": "Repozitáře ze služby Bitbucket se nepodařilo načíst.",
"connectGithubDescription": "Připojte GitHub v prohlížeči. Pak se sem vraťte a vyberte repozitář.",
+ "connectGitlabDescription": "Připojte GitLab v prohlížeči. Pak se sem vraťte a vyberte repozitář.",
+ "connectBitbucketDescription": "Připojte Bitbucket v prohlížeči. Pak se sem vraťte a vyberte repozitář.",
"openGithub": "Otevřít GitHub",
+ "openGitlab": "Otevřít GitLab",
+ "openBitbucket": "Otevřít Bitbucket",
"refreshRepositories": "Obnovit seznam repozitářů",
"githubConnected": "GitHub připojen",
+ "gitlabConnected": "GitLab připojen",
"noRepositoriesVisible": "Nezobrazují se žádné repozitáře. Zkontrolujte přístup aplikace Kilo k repozitářům ve službě GitHub a obnovte seznam.",
+ "noRepositoriesVisibleGitlab": "Nezobrazují se žádné repozitáře. Zkontrolujte přístup k repozitářům ve službě GitLab a obnovte seznam.",
+ "noRepositoriesVisibleBitbucket": "Nezobrazují se žádné repozitáře. Zkontrolujte přístup k repozitářům ve službě Bitbucket a obnovte seznam.",
+ "bitbucketOrganizationsOnly": "Bitbucket je dostupný jen pro organizace.",
+ "branchPickerTitle": "Vybrat větev",
+ "branchDefault": "Výchozí",
+ "branchAccessibility": "Větev: {{label}}",
+ "branchLoading": "Načítání větví",
+ "branchLoadError": "Větve se nepodařilo načíst",
+ "branchUnavailable": "Pro tento repozitář nejsou větve dostupné. Zkontroluj svůj přístup u poskytovatele a vyber jiný repozitář.",
+ "branchEmpty": "Žádné dostupné větve",
+ "branchPlaceholder": "Vybrat větev",
"runOnWithTarget": "Spustit na: {{target}}",
"environment": "Prostředí",
"couldNotLoadEnvironment": "Vaše prostředí se nepodařilo načíst.",
@@ -2045,24 +2120,13 @@
"couldNotRefreshRepositories": "Seznam repozitářů se nepodařilo obnovit. Zkuste to znovu.",
"discardDraftTitle": "Zahodit koncept?",
"discardDraftMessage": "Vaše zadání se smaže.",
+ "discardWithUploadsMessage": "Vaše zadání a všechny nahrané soubory nepřipojené k odeslaným zprávám se smažou.",
"discardFailed": "Koncept se nepodařilo zahodit. Zkuste to znovu.",
"remoteHint": "Chcete-li ovládat místní proces kilo, spusťte na počítači `kilo remote` nebo v běžící relaci CLI zadejte `/remote`.",
- "connectBitbucketDescription": "Připojte Bitbucket v prohlížeči. Pak se sem vraťte a vyberte repozitář.",
- "connectGitlabDescription": "Připojte GitLab v prohlížeči. Pak se sem vraťte a vyberte repozitář.",
- "couldNotLoadBitbucketRepositories": "Repozitáře ze služby Bitbucket se nepodařilo načíst.",
- "couldNotLoadGithubRepositories": "Repozitáře ze služby GitHub se nepodařilo načíst.",
- "couldNotLoadGitlabRepositories": "Repozitáře ze služby GitLab se nepodařilo načíst.",
- "gitlabConnected": "GitLab připojen",
- "noRepositoriesVisibleBitbucket": "Nezobrazují se žádné repozitáře. Zkontrolujte přístup k repozitářům ve službě Bitbucket a obnovte seznam.",
- "noRepositoriesVisibleGitlab": "Nezobrazují se žádné repozitáře. Zkontrolujte přístup k repozitářům ve službě GitLab a obnovte seznam.",
- "openBitbucket": "Otevřít Bitbucket",
- "openGitlab": "Otevřít GitLab",
- "recentlyUsed": "Nedávno použité",
- "cliCannotContinue": "Toto CLI nepodporuje pokračování v relaci. Vyberte službu Cloud Agent nebo jiné CLI.",
"continueFrom": "Pokračujete v relaci {{title}}.",
- "importFailed": "Tuto relaci se nepodařilo importovat.",
"importingSession": "Import relace",
- "discardWithUploadsMessage": "Vaše zadání a všechny nahrané soubory nepřipojené k odeslaným zprávám se smažou."
+ "cliCannotContinue": "Toto CLI nepodporuje pokračování v relaci. Vyberte službu Cloud Agent nebo jiné CLI.",
+ "importFailed": "Tuto relaci se nepodařilo importovat."
},
"partRenderer": {
"updatedFileCount_one": "Byl aktualizován {{displayCount}} soubor.",
diff --git a/apps/mobile/src/i18n/locales/cy.json b/apps/mobile/src/i18n/locales/cy.json
index 28b62dbbf0..fadbcf926f 100644
--- a/apps/mobile/src/i18n/locales/cy.json
+++ b/apps/mobile/src/i18n/locales/cy.json
@@ -36,6 +36,7 @@
"cost": "Y gost",
"discard": "Gwaredu",
"findings": "Canfyddiadau",
+ "mergeRequest": "cais uno",
"notConnected": "Heb gysylltu",
"notifications": "Hysbysiadau",
"pullRequest": "cais tynnu",
@@ -348,10 +349,17 @@
"emptyDiffRow": "Rhes wag yn y gwahaniaethau"
},
"connectionExpired": "Mae'r cysylltiad â GitHub wedi dod i ben.",
+ "capabilities": {
+ "banner": {
+ "title": "Ddim ar gael ar y darparwr hwn",
+ "accessibility": "Ddim ar gael ar y darparwr hwn: {{reason}}"
+ }
+ },
"merge": {
"merge": "Cyfuno",
"mergeNow": "Cyfuno nawr",
"mergePullRequest": "Cyfuno cais tynnu",
+ "mergeTermTitle": "Cyfuno {{term}}",
"enableAutoMerge": "Galluogi cyfuno awtomatig",
"disableAutoMerge": "Analluogi cyfuno awtomatig",
"autoMergeOn": "Mae cyfuno awtomatig ymlaen",
@@ -370,9 +378,12 @@
"deleteBranchAfterMerge": "Dileu'r gangen ar ôl cyfuno",
"noEnabledMethods": "Nid oes dulliau cyfuno wedi'u galluogi yn yr ystorfa hon. Gofynnwch i weinyddwr yr ystorfa alluogi cyfuno, cywasgu neu ailsylfaenu.",
"confirmTitle": "Cyfuno cais tynnu?",
+ "confirmTitleTerm": "Cyfuno {{term}}?",
"confirmMessage": "Bydd hyn yn cyfuno'ch newidiadau â'r gangen sylfaen.",
"enableAutoMergeConfirmTitle": "Galluogi cyfuno awtomatig?",
"enableAutoMergeConfirmMessage": "Bydd GitHub yn cyfuno'r cais tynnu hwn yn awtomatig pan fydd pob gwiriad gofynnol yn pasio.",
+ "enableAutoMergeConfirmMessageTerm": "Bydd y {{term}} yn uno'n awtomatig pan fydd ei bipline yn llwyddo.",
+ "enableAutoMergeDescriptionTerm": "Mae GitLab yn uno'r {{term}} hwn yn awtomatig pan fydd ei bipline yn llwyddo.",
"forbidden": "Nid oes gennych ganiatâd i gyfuno'r cais tynnu hwn.",
"cannotMerge": "Ni ellir cyfuno'r cais tynnu hwn fel y mae.",
"couldNotMerge": "Ni lwyddwyd i gyfuno'r cais tynnu.",
@@ -383,7 +394,8 @@
},
"terminal": {
"alreadyMerged": "Eisoes wedi'i gyfuno",
- "closed": "Mae'r cais tynnu hwn ar gau"
+ "closed": "Mae'r cais tynnu hwn ar gau",
+ "closedMergeRequest": "Mae'r cais uno hwn ar gau"
},
"partialSuccessBanner": {
"body": "Ni lwyddwyd i ddileu'r gangen: {{reason}}.",
@@ -409,6 +421,22 @@
"notMergeableTitle": "Ni ellir cyfuno'r cais tynnu hwn eto",
"notMergeableDetail": "Yn ôl GitHub, y statws cyfuno yw {{state}}."
},
+ "restrictions": {
+ "title": "Cyfyngiadau uno",
+ "approvalsRequired_one": "Angen {{displayCount}} cymeradwyaeth",
+ "approvalsRequired_other": "Angen {{displayCount}} o gymeradwyaethau",
+ "pipelineMustSucceed": "Rhaid i'r pipline lwyddo cyn uno.",
+ "approvalsRequired_many": "Angen {{displayCount}} o gymeradwyaethau",
+ "approvalsRequired_few": "Angen {{displayCount}} o gymeradwyaethau",
+ "approvalsRequired_two": "Angen {{displayCount}} gymeradwyaeth",
+ "approvalsRequired_zero": "Angen {{displayCount}} o gymeradwyaethau"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Mae'r pipline yn methu ar y cofnod newid diweddaraf.",
+ "pendingPipeline": "Mae'r pipline yn dal i redeg ar y cofnod newid diweddaraf.",
+ "permission": "Nid oes gennych ganiatâd i gyfuno'r {{term}} hwn.",
+ "draft": "Marciwch y {{term}} yn barod i'w adolygu cyn cyfuno."
+ },
"methodLabels": {
"merge": "Creu ymrwymiad cyfuno",
"squash": "Cywasgu a chyfuno",
@@ -456,6 +484,7 @@
"acceptTerms": "Derbyn",
"replyBadRequest": "Ni ellir postio'r ateb hwn. Efallai fod yr edefyn wedi newid.",
"replyForbidden": "Nid oes gennych ganiatâd i ateb y cais tynnu hwn.",
+ "replyForbiddenTerm": "Nid oes gennych ganiatâd i ateb y {{term}} hwn.",
"moderation": {
"reportContent": {
"terminal": "Ni ellir adrodd am y sylw hwn.",
@@ -487,14 +516,6 @@
"termsAcceptRequired": "Rhaid i chi dderbyn y telerau gwasanaeth i bostio.",
"termsOutdatedCopy": "Mae'r telerau gwasanaeth wedi newid. Ailagorwch y sgrin hon i dderbyn y fersiwn ddiweddaraf.",
"termsCheckRetryCopy": "Ni lwyddwyd i wirio'r telerau gwasanaeth. Gwiriwch eich cysylltiad a rhowch gynnig eto.",
- "comment_zero": "{{displayCount}} sylw",
- "comment_two": "{{displayCount}} sylw",
- "comment_few": "{{displayCount}} sylw",
- "comment_many": "{{displayCount}} sylw",
- "reaction_zero": "ymateb",
- "reaction_two": "ymateb",
- "reaction_few": "ymateb",
- "reaction_many": "ymateb",
"reactions": {
"thumbsUp": "Bawd i fyny",
"thumbsDown": "Bawd i lawr",
@@ -512,7 +533,15 @@
"outdatedOnLines": "Wedi dyddio ar {{lines}}",
"outdatedOnPath": "Wedi dyddio ar {{path}}"
},
- "deletedUser": "defnyddiwr wedi'i ddileu"
+ "deletedUser": "defnyddiwr wedi'i ddileu",
+ "comment_zero": "{{displayCount}} sylw",
+ "comment_two": "{{displayCount}} sylw",
+ "comment_few": "{{displayCount}} sylw",
+ "comment_many": "{{displayCount}} sylw",
+ "reaction_zero": "ymateb",
+ "reaction_two": "ymateb",
+ "reaction_few": "ymateb",
+ "reaction_many": "ymateb"
},
"couldNotOpenGitHubAppSettings": "Doedd dim modd agor gosodiadau ap GitHub.",
"installKiloGitHubApp": "Gosod ap GitHub Kilo",
@@ -524,17 +553,19 @@
"reviewPullRequest": "Adolygu cais tynnu",
"headLine": "{{counts}} · ymrwymiad diweddaraf {{sha}}",
"entry": {
- "eyebrow": "Agorwch gais tynnu drwy ei URL.",
- "pastePrLink": "Gludo dolen PR",
- "noRecentPrs": "Dim PR diweddar",
- "noRecentPrsDescription": "Gludwch ddolen PR uchod i ddechrau adolygiad — bydd yn ymddangos yma y tro nesaf.",
+ "eyebrow": "Agorwch gais tynnu neu gais uno drwy URL",
+ "pastePrLink": "Gludo dolen cais tynnu neu gais uno",
+ "noRecentPrs": "Dim adolygiadau diweddar",
+ "noRecentPrsDescription": "Gludwch ddolen uchod i ddechrau adolygiad — bydd yn ymddangos yma y tro nesaf.",
"couldNotLoad": "Ni lwyddwyd i lwytho.",
"removeFromRecentsTitle": "Tynnu o'r rhestr ddiweddar?",
- "removeFromRecentsMessage": "Bydd y cais tynnu hwn yn cael ei dynnu o'ch rhestr ddiweddar.",
+ "removeFromRecentsMessage": "Bydd yr adolygiad hwn yn cael ei dynnu o'ch rhestr ddiweddar.",
"removeRecentAccessibility": "Tynnu {{repo}} o'r rhestr ddiweddar",
- "urlAccessibility": "URL cais tynnu GitHub",
- "clearLink": "Clirio dolen cais tynnu",
- "pasteLink": "Gludo dolen cais tynnu",
+ "urlAccessibility": "Rhowch URL cais tynnu neu gais uno",
+ "urlPlaceholder": "URL cais tynnu neu gais uno",
+ "openAccessibility": "Agor cais tynnu neu gais uno",
+ "clearLink": "Clirio dolen",
+ "pasteLink": "Gludo dolen cais tynnu neu gais uno",
"open": "Agor"
},
"checks": {
@@ -583,9 +614,15 @@
"connect": {
"checkFailedTitle": "Ni lwyddwyd i wirio'r cysylltiad GitHub.",
"checkFailedMessage": "Ni fydd y statws mewngofnodi ar gael nes bod hyn wedi llwytho.",
+ "checkFailedTitleGitLab": "Ni lwyddwyd i wirio'r cysylltiad GitLab.",
+ "checkFailedTitleBitbucket": "Ni lwyddwyd i wirio'r cysylltiad Bitbucket.",
+ "providerCheckFailedMessage": "Nid yw statws y cysylltiad ar gael nes iddo lwytho.",
"reconnectTitle": "Ailgysylltu â GitHub",
"reconnectDescription": "Dirymwyd eich cysylltiad GitHub. Ailgysylltwch i barhau i adolygu ceisiadau tynnu ar eich ffôn.",
- "description": "Cysylltwch eich cyfrif GitHub i adolygu ceisiadau tynnu ar eich ffôn."
+ "description": "Cysylltwch eich cyfrif GitHub i adolygu ceisiadau tynnu ar eich ffôn.",
+ "gitlabDescription": "Cysylltwch eich cyfrif GitLab i adolygu ceisiadau uno ar y dyfais symudol.",
+ "bitbucketDescription": "Cysylltwch Bitbucket â'r sefydliad hwn i adolygu ceisiadau tynnu ar y dyfais symudol.",
+ "bitbucketOrgOnlyDescription": "Dewiswch sefydliad yn eich proffil i adolygu ei geisiadau tynnu Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -611,7 +648,10 @@
},
"reconnectNotice": {
"title": "Mae'r cysylltiad â GitHub wedi dod i ben.",
- "message": "Nid yw'ch cysylltiad GitHub yn ddilys mwyach. Gwiriwch eich cysylltiad eto — gofynnir i chi ailgysylltu os oes angen."
+ "message": "Nid yw'ch cysylltiad GitHub yn ddilys mwyach. Gwiriwch eich cysylltiad eto — gofynnir i chi ailgysylltu os oes angen.",
+ "gitlabTitle": "Mae'r cysylltiad â GitLab wedi dod i ben.",
+ "bitbucketTitle": "Mae'r cysylltiad â Bitbucket wedi dod i ben.",
+ "providerMessage": "Nid yw'ch cysylltiad {{provider}} yn ddilys mwyach. Gwiriwch eich cysylltiad eto — gofynnir i chi ailgysylltu os oes angen."
},
"eventChips": {
"comment": "Sylwadu",
@@ -671,6 +711,21 @@
"files": "Ffeiliau",
"discussion": "Trafodaeth"
},
+ "terms": {
+ "pullRequest": "Cais tynnu",
+ "mergeRequest": "Cais uno",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Rhannu cais uno",
+ "viewOnProvider": "Gweld ar {{provider}}",
+ "mergeRequestUnavailable": "Cais uno ddim ar gael",
+ "unavailableDescription": "Efallai ei fod wedi'i ddileu, neu efallai nad oes gennych fynediad ato.",
+ "accessDeniedMergeRequest": "Nid oes gennych ganiatâd i weld y cais uno hwn.",
+ "couldNotLoadMergeRequest": "Ni lwyddwyd i lwytho'r cais uno.",
+ "discussionAccessDenied": "Nid oes gennych ganiatâd i weld trafodaeth y cais uno hwn.",
+ "discussionUnavailableMessage": "Efallai fod y cais uno hwn wedi'i ddileu.",
+ "noDiscussionDescription": "Nid oes edafedd adolygu na sylwadau trafod ar y cais uno hwn.",
+ "noFilesChangedDescription": "Nid oes unrhyw ffeiliau wedi'u newid yn y cais uno hwn."
+ },
"fileStatus": {
"modified": "Wedi'i addasu",
"renamed": "Wedi'i ailenwi",
@@ -687,7 +742,7 @@
"emptyLine": "(gwag)"
},
"linkPasteClipboardEmpty": "Mae'r clipfwrdd yn wag.",
- "linkPasteNotAPullRequest": "Nid dolen cais tynnu GitHub yw hon.",
+ "linkPasteNotAPullRequest": "Nid dolen cais tynnu neu gais uno yw hon",
"announce": {
"commentPosted": "Sylw wedi'i bostio",
"reviewSubmitted": "Adolygiad wedi'i gyflwyno",
@@ -696,6 +751,7 @@
"mutationError": {
"commentNotPosted": "Ni ellir postio'r sylw hwn. Efallai fod y llinell a ddewiswyd wedi newid, neu fod y PR wedi'i ddiweddaru.",
"reviewNotSubmitted": "Ni ellir cyflwyno'r adolygiad hwn fel y mae. Efallai fod y PR wedi newid, neu mai'ch cais tynnu eich hun ydyw, ac ni allwch ei adolygu.",
+ "reviewNotSubmittedTerm": "Ni ellir cyflwyno'r adolygiad hwn fel y mae. Efallai bod y {{term}} wedi newid, neu ni allwch adolygu eich {{term}} eich hun.",
"couldNotPostComment": "Ni lwyddwyd i bostio'r sylw.",
"couldNotSubmitReview": "Ni lwyddwyd i gyflwyno'r adolygiad. Gwiriwch eich cysylltiad a rhowch gynnig eto."
},
@@ -703,6 +759,7 @@
"couldNotReply": "Doedd dim modd ateb.",
"couldNotCompleteAction": "Ni lwyddwyd i gwblhau'r weithred hon.",
"mergeResultDefaultError": "Ni chwblhaodd GitHub y cyfuno.",
+ "mergeResultNotCompleted": "Ni chafodd y {{term}} ei uno. Gwiriwch ei gyflwr a rhoi cynnig arall arni.",
"ambiguous": "Ni lwyddwyd i gadarnhau'r canlyniad — gwiriwch y PR cyn rhoi cynnig eto.",
"persistenceFailed": "Ni lwyddwyd i gofnodi'r weithred hon. Rhowch gynnig eto yn nes ymlaen.",
"forbidden": "Ni chaniateir hyn."
@@ -2052,11 +2109,31 @@
"retryConnection": "Ceisio cysylltu eto"
},
"newSession": {
+ "recentlyUsed": "Defnyddiwyd yn ddiweddar",
+ "couldNotLoadGithubRepositories": "Methu llwytho ystorfeydd GitHub.",
+ "couldNotLoadGitlabRepositories": "Methu llwytho ystorfeydd GitLab.",
+ "couldNotLoadBitbucketRepositories": "Methu llwytho ystorfeydd Bitbucket.",
"connectGithubDescription": "Cysylltwch â GitHub yn eich porwr, yna dewch yn ôl yma i ddewis ystorfa.",
+ "connectGitlabDescription": "Cysylltwch â GitLab yn eich porwr, yna dewch yn ôl yma i ddewis ystorfa.",
+ "connectBitbucketDescription": "Cysylltwch â Bitbucket yn eich porwr, yna dewch yn ôl yma i ddewis ystorfa.",
"openGithub": "Agor GitHub",
+ "openGitlab": "Agor GitLab",
+ "openBitbucket": "Agor Bitbucket",
"refreshRepositories": "Adnewyddu ystorfeydd",
"githubConnected": "GitHub wedi'i gysylltu",
+ "gitlabConnected": "GitLab wedi'i gysylltu",
"noRepositoriesVisible": "Nid oes ystorfeydd i'w gweld. Gwiriwch fod gan ap GitHub Kilo fynediad i'r ystorfeydd, yna adnewyddwch.",
+ "noRepositoriesVisibleGitlab": "Nid oes ystorfeydd i'w gweld. Gwiriwch y caniatâd i gyrchu ystorfeydd GitLab, yna adnewyddwch.",
+ "noRepositoriesVisibleBitbucket": "Nid oes ystorfeydd i'w gweld. Gwiriwch y caniatâd i gyrchu ystorfeydd Bitbucket, yna adnewyddwch.",
+ "bitbucketOrganizationsOnly": "Mae Bitbucket ar gael i sefydliadau yn unig.",
+ "branchPickerTitle": "Dewis cangen",
+ "branchDefault": "Rhagosodedig",
+ "branchAccessibility": "Cangen: {{label}}",
+ "branchLoading": "Yn llwytho ceangau",
+ "branchLoadError": "Ni lwyddwyd i lwytho ceangau",
+ "branchUnavailable": "Nid yw ceangau ar gael ar gyfer yr ystorfa hon. Gwiriwch eich mynediad gyda'r darparwr, yna dewiswch ystorfa arall.",
+ "branchEmpty": "Dim ceangau ar gael",
+ "branchPlaceholder": "Dewiswch gangen",
"runOnWithTarget": "Rhedeg ar: {{target}}",
"environment": "Amgylchedd",
"couldNotLoadEnvironment": "Methu llwytho'ch amgylchedd.",
@@ -2077,24 +2154,13 @@
"couldNotRefreshRepositories": "Methu adnewyddu'r ystorfeydd. Ceisiwch eto.",
"discardDraftTitle": "Dileu'r drafft?",
"discardDraftMessage": "Byddwch yn colli'ch anogiad.",
+ "discardWithUploadsMessage": "Bydd eich anogiad ac unrhyw ffeiliau a uwchlwythwyd ond sydd heb eu defnyddio yn cael eu dileu.",
"discardFailed": "Methu dileu'r drafft. Ceisiwch eto.",
"remoteHint": "Rhedwch `kilo remote` ar eich cyfrifiadur, neu `/remote` mewn sesiwn CLI sy'n rhedeg, i reoli proses kilo leol.",
- "connectBitbucketDescription": "Cysylltwch â Bitbucket yn eich porwr, yna dewch yn ôl yma i ddewis ystorfa.",
- "connectGitlabDescription": "Cysylltwch â GitLab yn eich porwr, yna dewch yn ôl yma i ddewis ystorfa.",
- "couldNotLoadBitbucketRepositories": "Methu llwytho ystorfeydd Bitbucket.",
- "couldNotLoadGithubRepositories": "Methu llwytho ystorfeydd GitHub.",
- "couldNotLoadGitlabRepositories": "Methu llwytho ystorfeydd GitLab.",
- "gitlabConnected": "GitLab wedi'i gysylltu",
- "noRepositoriesVisibleBitbucket": "Nid oes ystorfeydd i'w gweld. Gwiriwch y caniatâd i gyrchu ystorfeydd Bitbucket, yna adnewyddwch.",
- "noRepositoriesVisibleGitlab": "Nid oes ystorfeydd i'w gweld. Gwiriwch y caniatâd i gyrchu ystorfeydd GitLab, yna adnewyddwch.",
- "openBitbucket": "Agor Bitbucket",
- "openGitlab": "Agor GitLab",
- "recentlyUsed": "Defnyddiwyd yn ddiweddar",
"continueFrom": "Yn parhau â {{title}}.",
"importingSession": "Yn mewnforio sesiwn",
"cliCannotContinue": "Ni all y CLI hwn barhau â sesiwn. Dewiswch Cloud Agent neu CLI arall.",
- "importFailed": "Methu mewnforio'r sesiwn hon.",
- "discardWithUploadsMessage": "Bydd eich anogiad ac unrhyw ffeiliau a uwchlwythwyd ond sydd heb eu defnyddio yn cael eu dileu."
+ "importFailed": "Methu mewnforio'r sesiwn hon."
},
"partRenderer": {
"updatedFileCount_one": "Diweddarwyd {{displayCount}} ffeil.",
diff --git a/apps/mobile/src/i18n/locales/da.json b/apps/mobile/src/i18n/locales/da.json
index cc3ca6a105..4c6d748040 100644
--- a/apps/mobile/src/i18n/locales/da.json
+++ b/apps/mobile/src/i18n/locales/da.json
@@ -36,6 +36,7 @@
"cost": "Pris",
"discard": "Kassér",
"findings": "Fund",
+ "mergeRequest": "merge request",
"notConnected": "Ikke tilknyttet",
"notifications": "Notifikationer",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Tom række i ændringsvisningen"
},
"connectionExpired": "GitHub-forbindelsen er udløbet.",
+ "capabilities": {
+ "banner": {
+ "title": "Ikke tilgængelig hos denne udbyder",
+ "accessibility": "Ikke tilgængelig hos denne udbyder: {{reason}}"
+ }
+ },
"merge": {
"merge": "Fletning",
"mergeNow": "Flet nu",
"mergePullRequest": "Flet pull request",
+ "mergeTermTitle": "Flet {{term}}",
"enableAutoMerge": "Aktivér automatisk fletning",
"disableAutoMerge": "Deaktivér automatisk fletning",
"autoMergeOn": "Automatisk fletning er aktiveret",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Slet gren efter fletning",
"noEnabledMethods": "Ingen flettemetoder er aktiveret for dette kodelager. Bed en administrator om at aktivere fletning, sammenlægning af commits eller flytning af basis.",
"confirmTitle": "Flet pull request?",
+ "confirmTitleTerm": "Flet {{term}}?",
"confirmMessage": "Dine ændringer flettes ind i målgrenen.",
"enableAutoMergeConfirmTitle": "Aktivér automatisk fletning?",
"enableAutoMergeConfirmMessage": "GitHub fletter automatisk denne pull request, når alle påkrævede kontroller er bestået.",
+ "enableAutoMergeConfirmMessageTerm": "Når pipelinen er lykkedes, bliver {{term}} flettet automatisk.",
+ "enableAutoMergeDescriptionTerm": "GitLab fletter automatisk denne {{term}}, når pipelinen er lykkedes.",
"forbidden": "Du har ikke tilladelse til at flette denne pull request.",
"cannotMerge": "Denne pull request kan ikke flettes, som den er.",
"couldNotMerge": "Denne pull request kunne ikke flettes.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Allerede flettet",
- "closed": "Denne pull request er lukket"
+ "closed": "Denne pull request er lukket",
+ "closedMergeRequest": "Denne merge request er lukket"
},
"partialSuccessBanner": {
"body": "Grenen kunne ikke slettes: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Denne pull request kan ikke flettes endnu",
"notMergeableDetail": "GitHub har angivet flettestatussen {{state}}."
},
+ "restrictions": {
+ "title": "Fletterestriktioner",
+ "approvalsRequired_one": "{{displayCount}} godkendelse påkrævet",
+ "approvalsRequired_other": "{{displayCount}} godkendelser påkrævet",
+ "pipelineMustSucceed": "Pipelinen skal gennemføres, før der kan flettes."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipelinen fejler ved seneste commit.",
+ "pendingPipeline": "Pipelinen kører stadig ved seneste commit.",
+ "permission": "Du har ikke tilladelse til at flette denne {{term}}.",
+ "draft": "Markér denne {{term}} som klar til gennemgang, før du fletter."
+ },
"methodLabels": {
"merge": "Opret en flettecommit",
"squash": "Saml commits og flet",
@@ -448,6 +472,7 @@
"acceptTerms": "Acceptér",
"replyBadRequest": "Dette svar kan ikke sendes. Tråden kan have ændret sig.",
"replyForbidden": "Du har ikke tilladelse til at svare på denne pull request.",
+ "replyForbiddenTerm": "Du har ikke tilladelse til at svare på denne {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Denne kommentar kan ikke anmeldes.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Gennemgå pull request",
"headLine": "{{counts}} · seneste commit {{sha}}",
"entry": {
- "eyebrow": "Åbn en pull request via dens URL.",
- "pastePrLink": "Indsæt et PR-link",
- "noRecentPrs": "Ingen seneste PR'er",
- "noRecentPrsDescription": "Indsæt et PR-link ovenfor for at starte en gennemgang. Denne PR vises her næste gang.",
+ "eyebrow": "Åbn en pull request eller merge request via dens URL",
+ "pastePrLink": "Indsæt et pull request- eller merge request-link",
+ "noRecentPrs": "Ingen seneste gennemgange",
+ "noRecentPrsDescription": "Indsæt et link ovenfor for at starte en gennemgang — den vises her næste gang.",
"couldNotLoad": "Indholdet kunne ikke indlæses.",
"removeFromRecentsTitle": "Fjern fra listen over seneste?",
- "removeFromRecentsMessage": "Denne pull request fjernes fra listen over dine seneste pull requests.",
+ "removeFromRecentsMessage": "Denne gennemgang fjernes fra listen over dine seneste.",
"removeRecentAccessibility": "Fjern {{repo}} fra listen over seneste",
- "urlAccessibility": "URL til en pull request på GitHub",
- "clearLink": "Ryd pull request-link",
- "pasteLink": "Indsæt et pull request-link",
+ "urlAccessibility": "Indtast en pull request- eller merge request-URL",
+ "urlPlaceholder": "URL på pull request eller merge request",
+ "openAccessibility": "Åbn pull request eller merge request",
+ "clearLink": "Ryd link",
+ "pasteLink": "Indsæt pull request- eller merge request-link",
"open": "Åbn"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub-forbindelsen kunne ikke kontrolleres.",
"checkFailedMessage": "Din loginstatus kan først vises, når indlæsningen er færdig.",
+ "checkFailedTitleGitLab": "GitLab-forbindelsen kunne ikke kontrolleres.",
+ "checkFailedTitleBitbucket": "Bitbucket-forbindelsen kunne ikke kontrolleres.",
+ "providerCheckFailedMessage": "Din forbindelsesstatus kan først vises, når indlæsningen er færdig.",
"reconnectTitle": "Opret forbindelse til GitHub igen",
"reconnectDescription": "Adgangen til din GitHub-konto er blevet tilbagekaldt. Opret forbindelse igen for at fortsætte med at gennemgå pull requests på mobilen.",
- "description": "Tilslut din GitHub-konto for at gennemgå pull requests på mobilen."
+ "description": "Tilslut din GitHub-konto for at gennemgå pull requests på mobilen.",
+ "gitlabDescription": "Tilslut din GitLab-konto for at gennemgå merge requests på mobilen.",
+ "bitbucketDescription": "Tilslut Bitbucket til denne organisation for at gennemgå pull requests på mobilen.",
+ "bitbucketOrgOnlyDescription": "Vælg en organisation i din profil for at gennemgå dens Bitbucket-pull requests."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub-forbindelsen er udløbet.",
- "message": "Din GitHub-forbindelse er ikke længere gyldig. Tjek forbindelsen igen. Du bliver bedt om at oprette forbindelse igen, hvis det er nødvendigt."
+ "message": "Din GitHub-forbindelse er ikke længere gyldig. Tjek forbindelsen igen. Du bliver bedt om at oprette forbindelse igen, hvis det er nødvendigt.",
+ "gitlabTitle": "GitLab-forbindelsen er udløbet.",
+ "bitbucketTitle": "Bitbucket-forbindelsen er udløbet.",
+ "providerMessage": "Din {{provider}}-forbindelse er ikke længere gyldig. Tjek forbindelsen igen. Du bliver bedt om at oprette forbindelse igen, hvis det er nødvendigt."
},
"eventChips": {
"comment": "Kommentar",
@@ -643,6 +679,21 @@
"files": "Filer",
"discussion": "Diskussion"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Del merge request",
+ "viewOnProvider": "Se på {{provider}}",
+ "mergeRequestUnavailable": "Merge request ikke tilgængelig",
+ "unavailableDescription": "Den er muligvis blevet slettet, eller også har du ikke adgang til den.",
+ "accessDeniedMergeRequest": "Du har ikke tilladelse til at se denne merge request.",
+ "couldNotLoadMergeRequest": "Denne merge request kunne ikke indlæses.",
+ "discussionAccessDenied": "Du har ikke tilladelse til at se diskussionen om denne merge request.",
+ "discussionUnavailableMessage": "Denne merge request kan være fjernet.",
+ "noDiscussionDescription": "Der er endnu ingen tråde med kodegennemgang eller kommentarer i diskussionen om denne merge request.",
+ "noFilesChangedDescription": "Der er ingen filændringer i denne merge request."
+ },
"fileStatus": {
"modified": "Ændret",
"renamed": "Omdøbt",
@@ -659,7 +710,7 @@
"emptyLine": "(tom)"
},
"linkPasteClipboardEmpty": "Udklipsholderen er tom.",
- "linkPasteNotAPullRequest": "Linket fører ikke til en pull request på GitHub.",
+ "linkPasteNotAPullRequest": "Linket fører ikke til en pull request eller merge request",
"announce": {
"commentPosted": "Kommentar sendt",
"reviewSubmitted": "Gennemgang sendt",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Denne kommentar kan ikke sendes. Den valgte linje kan have ændret sig, eller PR'en kan være blevet opdateret.",
"reviewNotSubmitted": "Denne gennemgang kan ikke sendes, som den er. PR'en kan være ændret, eller fejlen skyldes, at du ikke kan gennemgå din egen pull request.",
+ "reviewNotSubmittedTerm": "Denne gennemgang kan ikke sendes, som den er. {{term}} kan være ændret, eller også kan du ikke gennemgå din egen {{term}}.",
"couldNotPostComment": "Kunne ikke sende kommentaren.",
"couldNotSubmitReview": "Gennemgangen kunne ikke sendes. Tjek din forbindelse, og prøv igen."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Svaret kunne ikke sendes.",
"couldNotCompleteAction": "Kunne ikke fuldføre denne handling.",
"mergeResultDefaultError": "GitHub fuldførte ikke fletningen.",
+ "mergeResultNotCompleted": "{{term}} blev ikke flettet. Tjek dens status, og prøv igen.",
"ambiguous": "Handlingen kunne ikke bekræftes. Tjek PR'en, før du prøver igen.",
"persistenceFailed": "Vi kunne ikke registrere denne handling. Prøv igen senere.",
"forbidden": "Du har ikke tilladelse til denne handling."
@@ -1988,11 +2041,31 @@
"retryConnection": "Prøv at oprette forbindelse igen"
},
"newSession": {
+ "recentlyUsed": "Senest brugt",
+ "couldNotLoadGithubRepositories": "Kunne ikke indlæse kodelagre fra GitHub.",
+ "couldNotLoadGitlabRepositories": "Kunne ikke indlæse kodelagre fra GitLab.",
+ "couldNotLoadBitbucketRepositories": "Kunne ikke indlæse kodelagre fra Bitbucket.",
"connectGithubDescription": "Tilknyt GitHub i din browser og vend tilbage hertil for at vælge et kodelager.",
+ "connectGitlabDescription": "Tilknyt GitLab i din browser og vend tilbage hertil for at vælge et kodelager.",
+ "connectBitbucketDescription": "Tilknyt Bitbucket i din browser og vend tilbage hertil for at vælge et kodelager.",
"openGithub": "Åbn GitHub",
+ "openGitlab": "Åbn GitLab",
+ "openBitbucket": "Åbn Bitbucket",
"refreshRepositories": "Opdatér kodelagre",
"githubConnected": "GitHub tilknyttet",
+ "gitlabConnected": "GitLab tilknyttet",
"noRepositoriesVisible": "Der er ingen synlige kodelagre. Kontrollér, at Kilos GitHub-app har adgang til dine kodelagre, og opdatér derefter listen.",
+ "noRepositoriesVisibleGitlab": "Der er ingen synlige kodelagre. Kontrollér adgangen til dine kodelagre på GitLab og opdatér derefter listen.",
+ "noRepositoriesVisibleBitbucket": "Der er ingen synlige kodelagre. Kontrollér adgangen til dine kodelagre på Bitbucket og opdatér derefter listen.",
+ "bitbucketOrganizationsOnly": "Bitbucket er kun tilgængeligt for organisationer.",
+ "branchPickerTitle": "Vælg gren",
+ "branchDefault": "Standard",
+ "branchAccessibility": "Gren: {{label}}",
+ "branchLoading": "Indlæser grene",
+ "branchLoadError": "Grene kunne ikke indlæses",
+ "branchUnavailable": "For dette kodelager er der ingen tilgængelige grene. Tjek din adgang hos udbyderen, og vælg et andet kodelager.",
+ "branchEmpty": "Ingen tilgængelige grene",
+ "branchPlaceholder": "Vælg en gren",
"runOnWithTarget": "Kør på: {{target}}",
"environment": "Miljø",
"couldNotLoadEnvironment": "Kunne ikke indlæse dit miljø.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Kunne ikke opdatere listen over kodelagre. Prøv igen.",
"discardDraftTitle": "Kassér kladde?",
"discardDraftMessage": "Din forespørgsel går tabt.",
+ "discardWithUploadsMessage": "Din forespørgsel og eventuelle uploadede filer, der ikke er vedhæftet sendte beskeder, bliver slettet.",
"discardFailed": "Kunne ikke kassere kladden. Prøv igen.",
"remoteHint": "Kør `kilo remote` på din computer eller `/remote` i en aktiv CLI-session for at styre en lokal kilo-proces.",
- "connectBitbucketDescription": "Tilknyt Bitbucket i din browser og vend tilbage hertil for at vælge et kodelager.",
- "connectGitlabDescription": "Tilknyt GitLab i din browser og vend tilbage hertil for at vælge et kodelager.",
- "couldNotLoadBitbucketRepositories": "Kunne ikke indlæse kodelagre fra Bitbucket.",
- "couldNotLoadGithubRepositories": "Kunne ikke indlæse kodelagre fra GitHub.",
- "couldNotLoadGitlabRepositories": "Kunne ikke indlæse kodelagre fra GitLab.",
- "gitlabConnected": "GitLab tilknyttet",
- "noRepositoriesVisibleBitbucket": "Der er ingen synlige kodelagre. Kontrollér adgangen til dine kodelagre på Bitbucket og opdatér derefter listen.",
- "noRepositoriesVisibleGitlab": "Der er ingen synlige kodelagre. Kontrollér adgangen til dine kodelagre på GitLab og opdatér derefter listen.",
- "openBitbucket": "Åbn Bitbucket",
- "openGitlab": "Åbn GitLab",
- "recentlyUsed": "Senest brugt",
- "cliCannotContinue": "Denne CLI kan ikke fortsætte en session. Vælg Cloud Agent eller en anden CLI.",
"continueFrom": "Sessionen {{title}} fortsættes.",
- "importFailed": "Kunne ikke importere denne session.",
"importingSession": "Importerer session",
- "discardWithUploadsMessage": "Din forespørgsel og eventuelle uploadede filer, der ikke er vedhæftet sendte beskeder, bliver slettet."
+ "cliCannotContinue": "Denne CLI kan ikke fortsætte en session. Vælg Cloud Agent eller en anden CLI.",
+ "importFailed": "Kunne ikke importere denne session."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} fil er opdateret.",
diff --git a/apps/mobile/src/i18n/locales/de.json b/apps/mobile/src/i18n/locales/de.json
index 99666e1455..0037b3c3fd 100644
--- a/apps/mobile/src/i18n/locales/de.json
+++ b/apps/mobile/src/i18n/locales/de.json
@@ -4,6 +4,8 @@
"done": "Fertig",
"retry": "Erneut versuchen",
"tryAgain": "Erneut versuchen",
+ "continue": "Weiter",
+ "notNow": "Nicht jetzt",
"language": "Sprache",
"device": "Gerät",
"share": "{{title}} teilen",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "Der Inhalt konnte nicht in die Zwischenablage kopiert werden.",
"required": "erforderlich",
"error": "fehler: {{error}}",
- "notNow": "Nicht jetzt",
- "continue": "Weiter",
"back": "Zurück",
"somethingWentWrong": "Etwas ist schiefgelaufen.",
"couldNotOpen": "{{label}} konnte nicht geöffnet werden.",
@@ -36,6 +36,7 @@
"cost": "Kosten",
"discard": "Verwerfen",
"findings": "Befunde",
+ "mergeRequest": "Merge-Request",
"notConnected": "Nicht verbunden",
"notifications": "Benachrichtigungen",
"pullRequest": "pull-Request",
@@ -1557,11 +1558,31 @@
"retryConnection": "Erneut verbinden"
},
"newSession": {
+ "recentlyUsed": "Zuletzt verwendet",
+ "couldNotLoadGithubRepositories": "Die GitHub-Repositorys konnten nicht geladen werden.",
+ "couldNotLoadGitlabRepositories": "Die GitLab-Repositorys konnten nicht geladen werden.",
+ "couldNotLoadBitbucketRepositories": "Die Bitbucket-Repositorys konnten nicht geladen werden.",
"connectGithubDescription": "Verbinde GitHub in deinem Browser und kehre dann hierher zurück, um ein Repository auszuwählen.",
+ "connectGitlabDescription": "Verbinde GitLab in deinem Browser und kehre dann hierher zurück, um ein Repository auszuwählen.",
+ "connectBitbucketDescription": "Verbinde Bitbucket in deinem Browser und kehre dann hierher zurück, um ein Repository auszuwählen.",
"openGithub": "GitHub öffnen",
+ "openGitlab": "GitLab öffnen",
+ "openBitbucket": "Bitbucket öffnen",
"refreshRepositories": "Repositorys aktualisieren",
"githubConnected": "GitHub verbunden",
+ "gitlabConnected": "GitLab verbunden",
"noRepositoriesVisible": "Es werden keine Repositorys angezeigt. Prüfe, ob die GitHub-App von Kilo Zugriff auf deine Repositorys hat, und aktualisiere dann die Liste.",
+ "noRepositoriesVisibleGitlab": "Es werden keine Repositorys angezeigt. Prüfe den Zugriff auf deine GitLab-Repositorys und aktualisiere dann die Liste.",
+ "noRepositoriesVisibleBitbucket": "Es werden keine Repositorys angezeigt. Prüfe den Zugriff auf deine Bitbucket-Repositorys und aktualisiere dann die Liste.",
+ "bitbucketOrganizationsOnly": "Bitbucket ist nur für Organisationen verfügbar.",
+ "branchPickerTitle": "Branch auswählen",
+ "branchDefault": "Standard",
+ "branchAccessibility": "Branch: {{label}}",
+ "branchLoading": "Branches werden geladen",
+ "branchLoadError": "Branches konnten nicht geladen werden",
+ "branchUnavailable": "Für dieses Repository sind keine Branches verfügbar. Prüfe deinen Zugriff beim Anbieter und wähle dann ein anderes Repository.",
+ "branchEmpty": "Keine Branches verfügbar",
+ "branchPlaceholder": "Branch auswählen",
"runOnWithTarget": "Ausführen auf: {{target}}",
"environment": "Umgebung",
"couldNotLoadEnvironment": "Deine Umgebung konnte nicht geladen werden.",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "Die ausstehenden Sitzungen konnten nicht geladen werden. Versuche es erneut.",
"failedToCreate": "Die Sitzung konnte nicht erstellt werden.",
"couldNotRefreshRepositories": "Die Repositorys konnten nicht aktualisiert werden. Bitte versuche es erneut.",
- "discardDraftMessage": "Dein Prompt geht verloren.",
"discardDraftTitle": "Entwurf verwerfen?",
+ "discardDraftMessage": "Dein Prompt geht verloren.",
+ "discardWithUploadsMessage": "Dein Prompt und alle hochgeladenen Dateien, die keiner gesendeten Nachricht angehängt sind, werden gelöscht.",
"discardFailed": "Der Entwurf konnte nicht verworfen werden. Bitte versuche es erneut.",
"remoteHint": "Führe `kilo remote` auf deinem Computer aus oder `/remote` in einer laufenden CLI-Sitzung, um einen lokalen kilo-Prozess zu steuern.",
- "connectBitbucketDescription": "Verbinde Bitbucket in deinem Browser und kehre dann hierher zurück, um ein Repository auszuwählen.",
- "connectGitlabDescription": "Verbinde GitLab in deinem Browser und kehre dann hierher zurück, um ein Repository auszuwählen.",
- "couldNotLoadBitbucketRepositories": "Die Bitbucket-Repositorys konnten nicht geladen werden.",
- "couldNotLoadGithubRepositories": "Die GitHub-Repositorys konnten nicht geladen werden.",
- "couldNotLoadGitlabRepositories": "Die GitLab-Repositorys konnten nicht geladen werden.",
- "gitlabConnected": "GitLab verbunden",
- "noRepositoriesVisibleBitbucket": "Es werden keine Repositorys angezeigt. Prüfe den Zugriff auf deine Bitbucket-Repositorys und aktualisiere dann die Liste.",
- "noRepositoriesVisibleGitlab": "Es werden keine Repositorys angezeigt. Prüfe den Zugriff auf deine GitLab-Repositorys und aktualisiere dann die Liste.",
- "openBitbucket": "Bitbucket öffnen",
- "openGitlab": "GitLab öffnen",
- "recentlyUsed": "Zuletzt verwendet",
"continueFrom": "Die Sitzung „{{title}}“ wird fortgesetzt.",
"importingSession": "Sitzung wird importiert",
"cliCannotContinue": "Diese CLI kann keine Sitzung fortsetzen. Wähle Cloud Agent oder eine andere CLI.",
- "importFailed": "Diese Sitzung konnte nicht importiert werden.",
- "discardWithUploadsMessage": "Dein Prompt und alle hochgeladenen Dateien, die keiner gesendeten Nachricht angehängt sind, werden gelöscht."
+ "importFailed": "Diese Sitzung konnte nicht importiert werden."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} Datei wurde aktualisiert.",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "Installationszuordnung erlauben?"
},
"prReview": {
+ "pullRequestUnavailable": "Pull-Request nicht verfügbar",
+ "pullRequestUnavailableDescription": "Dieser PR kann nicht geöffnet werden. Möglicherweise wurde er gelöscht, das Repository ist privat oder die GitHub-App von Kilo ist dort nicht installiert.",
"accessDeniedDescription": "Du hast keine Berechtigung, diesen Pull-Request anzusehen.",
- "checkConnection": "Verbindung prüfen",
- "checks": {
- "checksCount": "{{displayCount}} Prüfungen",
- "couldNotLoad": "Die Prüfungen konnten nicht geladen werden.",
- "failed": "{{displayCount}} fehlgeschlagen",
- "noAccess": "Du hast keinen Zugriff auf die Prüfungen dieses Repositorys.",
- "noChecksReported": "Keine Prüfungen gemeldet",
- "notAvailable": "Die Prüfungen sind noch nicht verfügbar. Möglicherweise wurde der aktuelle Commit noch nicht verarbeitet oder die GitHub-App von Kilo ist im Quell-Repository nicht installiert.",
- "openDetails": "Details zu {{name}} öffnen",
- "passed": "{{displayCount}} bestanden",
- "pending": "{{displayCount}} ausstehend",
- "retryChecks": "Prüfungen erneut laden",
- "skipped": "{{displayCount}} übersprungen",
- "title": "Prüfungen",
- "viewOnGitHub": "PR auf GitHub ansehen",
- "checkDetails": "details zur Prüfung"
- },
- "composer": {
- "addTitle": "Kommentar hinzufügen",
- "addToReview": "Zum Review hinzufügen",
- "comment": "Kommentieren",
- "commentBody": "Kommentartext",
- "commentBodyPlaceholder": "Dein Kommentar",
- "commentNow": "Jetzt kommentieren",
- "discardMessage": "Dein Entwurf geht verloren.",
- "discardTitle": "Kommentar verwerfen?",
- "editTitle": "Kommentar bearbeiten",
- "insertSuggestion": "Vorschlag einfügen",
- "insertSuggestionA11y": "Code-Vorschlag einfügen",
- "loadFailedTitle": "Der Kommentareditor konnte nicht geladen werden.",
- "ok": "OK",
- "unavailableMessage": "Dieser ausstehende Kommentar wurde bereits gelöscht oder gesendet.",
- "unavailableTitle": "Kommentar nicht verfügbar",
- "bodyEmpty": "Der Kommentartext darf nicht leer sein.",
- "suggestionsOnlyAddedLines": "Vorschläge sind nur für hinzugefügte Zeilen möglich.",
- "tapDiffLineToSuggest": "Tippe auf eine Diff-Zeile, um Vorschläge zu aktivieren."
- },
- "connect": {
- "checkFailedMessage": "Der Anmeldestatus ist erst verfügbar, wenn die Prüfung abgeschlossen ist.",
- "checkFailedTitle": "Die GitHub-Verbindung konnte nicht geprüft werden.",
- "description": "Verbinde dein GitHub-Konto, um Pull-Requests in der App zu prüfen.",
- "reconnectDescription": "Deine GitHub-Verbindung wurde widerrufen. Stelle sie erneut her, um Pull-Requests weiterhin in der App zu prüfen.",
- "reconnectTitle": "GitHub erneut verbinden"
- },
- "connectionExpired": "Die GitHub-Verbindung ist abgelaufen.",
- "couldNotLoadPullRequest": "Der Pull-Request konnte nicht geladen werden.",
- "couldNotOpenGitHubAppSettings": "Die Einstellungen der GitHub-App konnten nicht geöffnet werden.",
- "description": "Beschreibung",
- "discussion": {
- "acceptTerms": "Akzeptieren",
- "accessDeniedMessage": "Du hast keine Berechtigung, die Diskussion zu diesem PR anzusehen.",
- "addReaction": "Reaktion hinzufügen",
- "block": "Blockieren",
- "blockedUser": "{{login}} blockiert",
- "collapseThread": "Thread einklappen",
- "commentActions": "Kommentaraktionen",
- "comment": "{{displayCount}} Kommentare",
- "comment_other": "{{displayCount}} Kommentare",
- "couldNotLoad": "Die Diskussion konnte nicht geladen werden.",
- "couldNotLoadMore": "Weitere Kommentare konnten nicht geladen werden.",
- "loadMoreComments": "Weitere Kommentare laden",
- "loading": "Diskussion wird geladen",
- "moderation": {
- "block": {
- "retryable": "Dieser Benutzer konnte nicht blockiert werden. Prüfe deine Verbindung und versuche es erneut.",
- "terminal": "Dieser Benutzer kann nicht blockiert werden."
- },
- "mute": {
- "retryable": "Dieser Benutzer konnte nicht stummgeschaltet werden. Prüfe deine Verbindung und versuche es erneut.",
- "terminal": "Dieser Benutzer kann nicht stummgeschaltet werden."
- },
- "reportContent": {
- "retryable": "Dieser Kommentar konnte nicht gemeldet werden. Prüfe deine Verbindung und versuche es erneut.",
- "terminal": "Dieser Kommentar kann nicht gemeldet werden."
- },
- "reportUser": {
- "retryable": "Dieser Benutzer konnte nicht gemeldet werden. Prüfe deine Verbindung und versuche es erneut.",
- "terminal": "Dieser Benutzer kann nicht gemeldet werden."
- }
- },
- "moreLinesAbove": "… darüber stehen {{displayCount}} weitere Zeilen.",
- "mute": "Stummschalten",
- "mutedUser": "{{login}} stummgeschaltet",
- "noDiscussion": "Noch keine Diskussion",
- "noDiscussionDescription": "Zu diesem Pull-Request gibt es noch keine Review-Threads oder Kommentare.",
- "comment_one": "1 kommentar",
- "outdated": "Veraltet",
- "quotedDiffSnippet": "Zitierter Diff-Ausschnitt",
- "reactionPill": "Reaktion {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "reaktionen",
- "reaction_other": "reaktionen",
- "reaction_one": "reaktion",
- "replyBadRequest": "Diese Antwort kann nicht veröffentlicht werden. Der Thread hat sich möglicherweise geändert.",
- "replyBody": "Antworttext",
- "replyForbidden": "Du hast keine Berechtigung, auf diesen Pull-Request zu antworten.",
- "replyPlaceholder": "Deine Antwort …",
- "reportContent": "Inhalt melden",
- "reportUser": "Benutzer melden",
- "resolveThread": "Thread als erledigt markieren",
- "resolved": "Erledigt",
- "retryLoadingMore": "Weitere Kommentare erneut laden",
- "reviewFiles": "Dateien prüfen",
- "startedRelative": " · {{relative}} begonnen",
- "submitReply": "Antwort senden",
- "termsAcceptRetry": "Die Nutzungsbedingungen konnten nicht akzeptiert werden. Prüfe deine Verbindung und versuche es erneut.",
- "termsCopy": "Du musst mindestens 13 Jahre alt sein, um Beiträge zu veröffentlichen.",
- "termsTitle": "Nutzungsbedingungen",
- "threadAccessibilityLabel": "Diskussionsthread {{anchorLabel}}",
- "unavailable": "Die Diskussion ist nicht verfügbar.",
- "unavailableMessage": "Dieser Pull-Request wurde möglicherweise entfernt.",
- "unresolveThread": "Thread wieder öffnen",
- "viewTerms": "Nutzungsbedingungen ansehen",
- "termsAcceptRequired": "Du musst die Nutzungsbedingungen akzeptieren, um Beiträge zu veröffentlichen.",
- "termsCheckRetryCopy": "Die Nutzungsbedingungen konnten nicht geprüft werden. Prüfe deine Verbindung und versuche es erneut.",
- "termsOutdatedCopy": "Die Nutzungsbedingungen haben sich geändert. Öffne diesen Bildschirm erneut, um die neueste Version zu akzeptieren.",
- "reactions": {
- "thumbsUp": "Daumen hoch",
- "thumbsDown": "Daumen runter",
- "laugh": "Lachen",
- "hooray": "Hurra",
- "confused": "Verwirrt",
- "heart": "Herz",
- "rocket": "Rakete",
- "eyes": "Augen"
- },
- "anchor": {
- "fileCommentOnPath": "Kommentar zur Datei {{path}}",
- "fileComment": "Kommentar zur Datei",
- "outdatedOnPathLines": "Veraltet: {{path}}, {{lines}}",
- "outdatedOnLines": "Veraltet: {{lines}}",
- "outdatedOnPath": "Veraltet: {{path}}"
- },
- "deletedUser": "gelöschter Benutzer"
- },
- "entry": {
- "clearLink": "Pull-Request-Link löschen",
- "couldNotLoad": "Die Daten konnten nicht geladen werden.",
- "eyebrow": "Öffne einen Pull-Request über seine URL.",
- "noRecentPrs": "Noch keine zuletzt geöffneten PRs",
- "noRecentPrsDescription": "Füge oben einen PR-Link ein, um ein Review zu starten. Der PR erscheint beim nächsten Mal hier.",
- "open": "Offen",
- "pasteLink": "Pull-Request-Link einfügen",
- "pastePrLink": "PR-Link einfügen",
- "removeFromRecentsMessage": "Dieser Pull-Request wird aus deinem Verlauf entfernt.",
- "removeFromRecentsTitle": "Aus dem Verlauf entfernen?",
- "removeRecentAccessibility": "{{repo}} aus dem Verlauf entfernen",
- "urlAccessibility": "GitHub-Pull-Request-URL"
- },
- "eventChips": {
- "comment": "Kommentieren",
- "label": "Review-Ereignis",
- "requestChanges": "Änderungen anfordern"
- },
+ "noFilesChanged": "Keine Dateien geändert",
+ "noFilesChangedDescription": "Dieser Pull-Request enthält keine Dateiänderungen.",
"fileList": {
"filesList": "Dateiliste",
"filesViewed": "Dateien · {{viewed}} von {{total}} angesehen",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "Ausgewählte Zeilen kommentieren",
"finishReview": "Review abschließen"
},
- "headLine": "{{counts}} · aktueller Commit: {{sha}}",
"hunkRows": {
"contextUnavailable": "Für diese Referenz ist kein Kontext verfügbar.",
"expandAll": "Alles einblenden",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "Kontext erneut laden",
"retryLoadingNextPage": "Nächste Seite erneut laden"
},
- "inbox": {
- "couldNotLoad": "Der Posteingang konnte nicht geladen werden.",
- "loading": "Posteingang wird geladen",
- "noReviewRequests": "Keine Review-Anfragen",
- "noReviewRequestsDescription": "Hier erscheinen Pull-Requests, die auf dein Review warten. Du kannst oben auch einen beliebigen PR-Link einfügen.",
- "title": "Posteingang"
+ "sideBySide": {
+ "emptyDiffColumn": "leere Diff-Spalte",
+ "emptyDiffRow": "Leere Diff-Zeile",
+ "newOnly": "Nur in der neuen Version: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ kein Zeilenumbruch am Dateiende",
+ "oldNew": "Alt: {{old}} | Neu: {{new}}",
+ "oldOnly": "Nur in der alten Version: {{text}}"
+ },
+ "connectionExpired": "Die GitHub-Verbindung ist abgelaufen.",
+ "capabilities": {
+ "banner": {
+ "title": "Mit diesem Anbieter nicht verfügbar",
+ "accessibility": "Mit diesem Anbieter nicht verfügbar: {{reason}}"
+ }
},
- "installKiloGitHubApp": "GitHub-App von Kilo installieren",
"merge": {
- "autoMergeDescription": "GitHub führt diesen Pull-Request automatisch zusammen, sobald alle erforderlichen Prüfungen bestanden sind (Methode: {{method}}).",
+ "merge": "Zusammenführen",
+ "mergeNow": "Jetzt zusammenführen",
+ "mergePullRequest": "Pull-Request zusammenführen",
+ "mergeTermTitle": "{{term}} zusammenführen",
+ "enableAutoMerge": "Automatisches Zusammenführen aktivieren",
+ "disableAutoMerge": "Automatisches Zusammenführen deaktivieren",
"autoMergeOn": "Automatisches Zusammenführen aktiv",
- "blockedTitle": "Was die Zusammenführung noch verhindert",
- "cannotMerge": "Dieser Pull-Request kann in seinem aktuellen Zustand nicht zusammengeführt werden.",
+ "autoMergeDescription": "GitHub führt diesen Pull-Request automatisch zusammen, sobald alle erforderlichen Prüfungen bestanden sind (Methode: {{method}}).",
"checking": "Zusammenführbarkeit wird geprüft …",
+ "couldNotDetermine": "Es konnte nicht ermittelt werden, ob eine Zusammenführung möglich ist.",
+ "refreshMergeability": "Zusammenführbarkeit erneut prüfen",
+ "blockedTitle": "Was die Zusammenführung noch verhindert",
+ "updateBranch": "Branch aktualisieren",
+ "updateBranchFromBase": "Branch mit Änderungen aus dem Basis-Branch aktualisieren",
+ "methodLabel": "Methode",
+ "commitTitle": "Commit-Titel",
"commitMessage": "Commit-Nachricht",
"commitMessagePlaceholder": "Optionale Beschreibung für den Merge-Commit",
- "commitTitle": "Commit-Titel",
- "confirmMessage": "Deine Änderungen werden in den Basis-Branch übernommen.",
- "confirmTitle": "Pull-Request zusammenführen?",
- "couldNotDetermine": "Es konnte nicht ermittelt werden, ob eine Zusammenführung möglich ist.",
- "couldNotMerge": "Der Pull-Request konnte nicht zusammengeführt werden.",
"deleteBranch": "Branch löschen",
"deleteBranchAfterMerge": "Branch nach dem Zusammenführen löschen",
- "disableAutoMerge": "Automatisches Zusammenführen deaktivieren",
- "enableAutoMerge": "Automatisches Zusammenführen aktivieren",
- "enableAutoMergeConfirmMessage": "GitHub führt diesen Pull-Request automatisch zusammen, sobald alle erforderlichen Prüfungen bestanden sind.",
+ "noEnabledMethods": "Für dieses Repository sind keine Methoden zum Zusammenführen aktiviert. Bitte einen Repository-Administrator, Merge, Squash oder Rebase als Methode zu aktivieren.",
+ "confirmTitle": "Pull-Request zusammenführen?",
+ "confirmTitleTerm": "{{term}} zusammenführen?",
+ "confirmMessage": "Deine Änderungen werden in den Basis-Branch übernommen.",
"enableAutoMergeConfirmTitle": "Automatisches Zusammenführen aktivieren?",
+ "enableAutoMergeConfirmMessage": "GitHub führt diesen Pull-Request automatisch zusammen, sobald alle erforderlichen Prüfungen bestanden sind.",
+ "enableAutoMergeConfirmMessageTerm": "Das {{term}} wird automatisch zusammengeführt, sobald die Pipeline erfolgreich durchläuft.",
+ "enableAutoMergeDescriptionTerm": "GitLab führt dieses {{term}} automatisch zusammen, sobald die Pipeline erfolgreich durchläuft.",
"forbidden": "Du hast keine Berechtigung, diesen Pull-Request zusammenzuführen.",
- "loadFailedTitle": "Die Optionen zum Zusammenführen konnten nicht geladen werden.",
- "merge": "Zusammenführen",
- "mergeNow": "Jetzt zusammenführen",
- "mergePullRequest": "Pull-Request zusammenführen",
- "methodLabel": "Methode",
+ "cannotMerge": "Dieser Pull-Request kann in seinem aktuellen Zustand nicht zusammengeführt werden.",
+ "couldNotMerge": "Der Pull-Request konnte nicht zusammengeführt werden.",
"methods": {
"merge": "Zusammenführen",
"rebase": "Neu aufsetzen",
"squash": "Bündeln"
},
- "noEnabledMethods": "Für dieses Repository sind keine Methoden zum Zusammenführen aktiviert. Bitte einen Repository-Administrator, Merge, Squash oder Rebase als Methode zu aktivieren.",
+ "terminal": {
+ "alreadyMerged": "Bereits zusammengeführt",
+ "closed": "Dieser Pull-Request ist geschlossen",
+ "closedMergeRequest": "Dieser Merge-Request ist geschlossen"
+ },
"partialSuccessBanner": {
"accessibility": "Zusammengeführt. Der Branch konnte nicht gelöscht werden. Grund: {{reason}}",
"body": "Der Branch konnte nicht gelöscht werden. Grund: {{reason}}"
},
- "refreshMergeability": "Zusammenführbarkeit erneut prüfen",
- "terminal": {
- "alreadyMerged": "Bereits zusammengeführt",
- "closed": "Dieser Pull-Request ist geschlossen"
- },
- "updateBranch": "Branch aktualisieren",
- "updateBranchFromBase": "Branch mit Änderungen aus dem Basis-Branch aktualisieren",
+ "loadFailedTitle": "Die Optionen zum Zusammenführen konnten nicht geladen werden.",
"blocked": {
"unknownStateTitle": "GitHub hat die Zusammenführbarkeit noch nicht bestätigt",
"unknownStateDetail": "Aktualisiere die Übersicht in einem Moment erneut.",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "Dieser Pull-Request kann noch nicht zusammengeführt werden",
"notMergeableDetail": "GitHub meldet den Status zur Zusammenführbarkeit: {{state}}."
},
+ "restrictions": {
+ "title": "Merge-Bedingungen",
+ "approvalsRequired_one": "{{displayCount}} Zustimmung erforderlich",
+ "approvalsRequired_other": "{{displayCount}} Zustimmungen erforderlich",
+ "pipelineMustSucceed": "Die Pipeline muss erfolgreich durchlaufen, bevor zusammengeführt werden kann."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Die Pipeline schlägt beim letzten Commit fehl.",
+ "pendingPipeline": "Die Pipeline läuft beim letzten Commit noch.",
+ "permission": "Du hast keine Berechtigung, diesen {{term}} zusammenzuführen.",
+ "draft": "Markiere den {{term}} vor dem Zusammenführen als bereit für das Review."
+ },
"methodLabels": {
"merge": "Merge-Commit erstellen",
"squash": "Commits bündeln und zusammenführen",
@@ -2623,9 +2507,204 @@
"rebase": "Wende alle Commits dieses Branchs nacheinander auf den Basis-Branch an, ohne einen Merge-Commit zu erstellen."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Diskussionsthread {{anchorLabel}}",
+ "collapseThread": "Thread einklappen",
+ "resolveThread": "Thread als erledigt markieren",
+ "unresolveThread": "Thread wieder öffnen",
+ "resolved": "Erledigt",
+ "outdated": "Veraltet",
+ "comment_one": "1 kommentar",
+ "comment": "{{displayCount}} Kommentare",
+ "comment_other": "{{displayCount}} Kommentare",
+ "startedRelative": " · {{relative}} begonnen",
+ "couldNotLoadMore": "Weitere Kommentare konnten nicht geladen werden.",
+ "retryLoadingMore": "Weitere Kommentare erneut laden",
+ "loadMoreComments": "Weitere Kommentare laden",
+ "addReaction": "Reaktion hinzufügen",
+ "reactionPill": "Reaktion {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "reaktion",
+ "reaction": "reaktionen",
+ "reaction_other": "reaktionen",
+ "commentActions": "Kommentaraktionen",
+ "reportContent": "Inhalt melden",
+ "reportUser": "Benutzer melden",
+ "mute": "Stummschalten",
+ "block": "Blockieren",
+ "blockedUser": "{{login}} blockiert",
+ "mutedUser": "{{login}} stummgeschaltet",
+ "replyPlaceholder": "Deine Antwort …",
+ "replyBody": "Antworttext",
+ "submitReply": "Antwort senden",
+ "termsTitle": "Nutzungsbedingungen",
+ "termsCopy": "Du musst mindestens 13 Jahre alt sein, um Beiträge zu veröffentlichen.",
+ "termsAcceptRetry": "Die Nutzungsbedingungen konnten nicht akzeptiert werden. Prüfe deine Verbindung und versuche es erneut.",
+ "viewTerms": "Nutzungsbedingungen ansehen",
+ "acceptTerms": "Akzeptieren",
+ "replyBadRequest": "Diese Antwort kann nicht veröffentlicht werden. Der Thread hat sich möglicherweise geändert.",
+ "replyForbidden": "Du hast keine Berechtigung, auf diesen Pull-Request zu antworten.",
+ "replyForbiddenTerm": "Du hast keine Berechtigung, auf diesen {{term}} zu antworten.",
+ "moderation": {
+ "block": {
+ "retryable": "Dieser Benutzer konnte nicht blockiert werden. Prüfe deine Verbindung und versuche es erneut.",
+ "terminal": "Dieser Benutzer kann nicht blockiert werden."
+ },
+ "mute": {
+ "retryable": "Dieser Benutzer konnte nicht stummgeschaltet werden. Prüfe deine Verbindung und versuche es erneut.",
+ "terminal": "Dieser Benutzer kann nicht stummgeschaltet werden."
+ },
+ "reportContent": {
+ "retryable": "Dieser Kommentar konnte nicht gemeldet werden. Prüfe deine Verbindung und versuche es erneut.",
+ "terminal": "Dieser Kommentar kann nicht gemeldet werden."
+ },
+ "reportUser": {
+ "retryable": "Dieser Benutzer konnte nicht gemeldet werden. Prüfe deine Verbindung und versuche es erneut.",
+ "terminal": "Dieser Benutzer kann nicht gemeldet werden."
+ }
+ },
+ "accessDeniedMessage": "Du hast keine Berechtigung, die Diskussion zu diesem PR anzusehen.",
+ "unavailable": "Die Diskussion ist nicht verfügbar.",
+ "unavailableMessage": "Dieser Pull-Request wurde möglicherweise entfernt.",
+ "couldNotLoad": "Die Diskussion konnte nicht geladen werden.",
+ "loading": "Diskussion wird geladen",
+ "noDiscussion": "Noch keine Diskussion",
+ "noDiscussionDescription": "Zu diesem Pull-Request gibt es noch keine Review-Threads oder Kommentare.",
+ "reviewFiles": "Dateien prüfen",
+ "quotedDiffSnippet": "Zitierter Diff-Ausschnitt",
+ "moreLinesAbove": "… darüber stehen {{displayCount}} weitere Zeilen.",
+ "termsAcceptRequired": "Du musst die Nutzungsbedingungen akzeptieren, um Beiträge zu veröffentlichen.",
+ "termsOutdatedCopy": "Die Nutzungsbedingungen haben sich geändert. Öffne diesen Bildschirm erneut, um die neueste Version zu akzeptieren.",
+ "termsCheckRetryCopy": "Die Nutzungsbedingungen konnten nicht geprüft werden. Prüfe deine Verbindung und versuche es erneut.",
+ "reactions": {
+ "thumbsUp": "Daumen hoch",
+ "thumbsDown": "Daumen runter",
+ "laugh": "Lachen",
+ "hooray": "Hurra",
+ "confused": "Verwirrt",
+ "heart": "Herz",
+ "rocket": "Rakete",
+ "eyes": "Augen"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Kommentar zur Datei {{path}}",
+ "fileComment": "Kommentar zur Datei",
+ "outdatedOnPathLines": "Veraltet: {{path}}, {{lines}}",
+ "outdatedOnLines": "Veraltet: {{lines}}",
+ "outdatedOnPath": "Veraltet: {{path}}"
+ },
+ "deletedUser": "gelöschter Benutzer"
+ },
+ "couldNotOpenGitHubAppSettings": "Die Einstellungen der GitHub-App konnten nicht geöffnet werden.",
+ "installKiloGitHubApp": "GitHub-App von Kilo installieren",
+ "checkConnection": "Verbindung prüfen",
+ "couldNotLoadPullRequest": "Der Pull-Request konnte nicht geladen werden.",
+ "description": "Beschreibung",
"noDescriptionProvided": "Es ist keine Beschreibung vorhanden.",
- "noFilesChanged": "Keine Dateien geändert",
- "noFilesChangedDescription": "Dieser Pull-Request enthält keine Dateiänderungen.",
+ "review": "Prüfung",
+ "reviewPullRequest": "Pull-Request prüfen",
+ "headLine": "{{counts}} · aktueller Commit: {{sha}}",
+ "entry": {
+ "eyebrow": "Öffne einen Pull-Request oder Merge-Request über seine URL",
+ "pastePrLink": "Pull-Request- oder Merge-Request-Link einfügen",
+ "noRecentPrs": "Noch keine aktuellen Reviews",
+ "noRecentPrsDescription": "Füge oben einen Link ein, um ein Review zu starten — es erscheint beim nächsten Mal hier.",
+ "couldNotLoad": "Die Daten konnten nicht geladen werden.",
+ "removeFromRecentsTitle": "Aus dem Verlauf entfernen?",
+ "removeFromRecentsMessage": "Dieses Review wird aus deinem Verlauf entfernt.",
+ "removeRecentAccessibility": "{{repo}} aus dem Verlauf entfernen",
+ "urlAccessibility": "Gib eine Pull-Request- oder Merge-Request-URL ein",
+ "urlPlaceholder": "Pull-Request- oder Merge-Request-URL",
+ "openAccessibility": "Pull-Request oder Merge-Request öffnen",
+ "clearLink": "Link löschen",
+ "pasteLink": "Füge einen Pull-Request- oder Merge-Request-Link ein",
+ "open": "Offen"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} Prüfungen",
+ "couldNotLoad": "Die Prüfungen konnten nicht geladen werden.",
+ "failed": "{{displayCount}} fehlgeschlagen",
+ "noAccess": "Du hast keinen Zugriff auf die Prüfungen dieses Repositorys.",
+ "noChecksReported": "Keine Prüfungen gemeldet",
+ "notAvailable": "Die Prüfungen sind noch nicht verfügbar. Möglicherweise wurde der aktuelle Commit noch nicht verarbeitet oder die GitHub-App von Kilo ist im Quell-Repository nicht installiert.",
+ "openDetails": "Details zu {{name}} öffnen",
+ "passed": "{{displayCount}} bestanden",
+ "pending": "{{displayCount}} ausstehend",
+ "retryChecks": "Prüfungen erneut laden",
+ "skipped": "{{displayCount}} übersprungen",
+ "title": "Prüfungen",
+ "viewOnGitHub": "PR auf GitHub ansehen",
+ "checkDetails": "details zur Prüfung"
+ },
+ "inbox": {
+ "couldNotLoad": "Der Posteingang konnte nicht geladen werden.",
+ "loading": "Posteingang wird geladen",
+ "noReviewRequests": "Keine Review-Anfragen",
+ "noReviewRequestsDescription": "Hier erscheinen Pull-Requests, die auf dein Review warten. Du kannst oben auch einen beliebigen PR-Link einfügen.",
+ "title": "Posteingang"
+ },
+ "composer": {
+ "addTitle": "Kommentar hinzufügen",
+ "addToReview": "Zum Review hinzufügen",
+ "comment": "Kommentieren",
+ "commentBody": "Kommentartext",
+ "commentBodyPlaceholder": "Dein Kommentar",
+ "commentNow": "Jetzt kommentieren",
+ "discardMessage": "Dein Entwurf geht verloren.",
+ "discardTitle": "Kommentar verwerfen?",
+ "editTitle": "Kommentar bearbeiten",
+ "insertSuggestion": "Vorschlag einfügen",
+ "insertSuggestionA11y": "Code-Vorschlag einfügen",
+ "loadFailedTitle": "Der Kommentareditor konnte nicht geladen werden.",
+ "ok": "OK",
+ "unavailableMessage": "Dieser ausstehende Kommentar wurde bereits gelöscht oder gesendet.",
+ "unavailableTitle": "Kommentar nicht verfügbar",
+ "bodyEmpty": "Der Kommentartext darf nicht leer sein.",
+ "suggestionsOnlyAddedLines": "Vorschläge sind nur für hinzugefügte Zeilen möglich.",
+ "tapDiffLineToSuggest": "Tippe auf eine Diff-Zeile, um Vorschläge zu aktivieren."
+ },
+ "connect": {
+ "checkFailedTitle": "Die GitHub-Verbindung konnte nicht geprüft werden.",
+ "checkFailedMessage": "Der Anmeldestatus ist erst verfügbar, wenn die Prüfung abgeschlossen ist.",
+ "checkFailedTitleGitLab": "Die GitLab-Verbindung konnte nicht geprüft werden.",
+ "checkFailedTitleBitbucket": "Die Bitbucket-Verbindung konnte nicht geprüft werden.",
+ "providerCheckFailedMessage": "Der Verbindungsstatus ist erst verfügbar, wenn die Prüfung abgeschlossen ist.",
+ "reconnectTitle": "GitHub erneut verbinden",
+ "reconnectDescription": "Deine GitHub-Verbindung wurde widerrufen. Stelle sie erneut her, um Pull-Requests weiterhin in der App zu prüfen.",
+ "description": "Verbinde dein GitHub-Konto, um Pull-Requests in der App zu prüfen.",
+ "gitlabDescription": "Verbinde dein GitLab-Konto, um Merge-Requests in der App zu prüfen.",
+ "bitbucketDescription": "Verbinde Bitbucket mit dieser Organisation, um Pull-Requests in der App zu prüfen.",
+ "bitbucketOrgOnlyDescription": "Wähle in deinem Profil eine Organisation aus, um deren Bitbucket-Pull-Requests in der App zu prüfen."
+ },
+ "screen": {
+ "shareA11y": "Pull-Request teilen",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Dieser Kommentar wird aus den vorgemerkten Kommentaren für das Review entfernt.",
+ "deletePendingTitle": "Ausstehenden Kommentar löschen?",
+ "loadFailedTitle": "Das Formular zum Senden des Reviews konnte nicht geladen werden.",
+ "pendingComment": "noch nicht gesendete Kommentare",
+ "pendingComment_other": "noch nicht gesendete Kommentare",
+ "pendingComment_one": "ausstehender Kommentar",
+ "summaryOptional": "Zusammenfassung (optional)",
+ "partialPostedMessage": "Veröffentlichte Kommentare: {{displayFreshCount}}. Kommentare zu einem älteren Commit: {{displayStaleCount}}. Diese bleiben vorgemerkt.",
+ "submitCountOfTotal": "{{displayFreshCount}} von {{displayTotalCount}} Kommentaren senden",
+ "submitReview": "Prüfung senden",
+ "blockedRequestChanges": "Füge eine Zusammenfassung oder mindestens einen Kommentar hinzu, um Änderungen anzufordern.",
+ "blockedComment": "Füge eine Zusammenfassung oder mindestens einen Kommentar hinzu, um ein Review mit Kommentaren zu senden."
+ },
+ "reconnectNotice": {
+ "title": "Die GitHub-Verbindung ist abgelaufen.",
+ "message": "Deine GitHub-Verbindung ist nicht mehr gültig. Prüfe sie erneut. Falls nötig, wirst du aufgefordert, sie wiederherzustellen.",
+ "gitlabTitle": "Die GitLab-Verbindung ist abgelaufen.",
+ "bitbucketTitle": "Die Bitbucket-Verbindung ist abgelaufen.",
+ "providerMessage": "Deine {{provider}}-Verbindung ist nicht mehr gültig. Prüfe sie erneut. Falls nötig, wirst du aufgefordert, sie wiederherzustellen."
+ },
+ "eventChips": {
+ "comment": "Kommentieren",
+ "label": "Review-Ereignis",
+ "requestChanges": "Änderungen anfordern"
+ },
"overview": {
"commit": "commits",
"commit_other": "commits",
@@ -2666,39 +2745,25 @@
"summaryA11y": "Review-Zusammenfassung",
"summaryPlaceholder": "Optionale Zusammenfassung für das Review"
},
- "pullRequestUnavailable": "Pull-Request nicht verfügbar",
- "pullRequestUnavailableDescription": "Dieser PR kann nicht geöffnet werden. Möglicherweise wurde er gelöscht, das Repository ist privat oder die GitHub-App von Kilo ist dort nicht installiert.",
- "reconnectNotice": {
- "message": "Deine GitHub-Verbindung ist nicht mehr gültig. Prüfe sie erneut. Falls nötig, wirst du aufgefordert, sie wiederherzustellen.",
- "title": "Die GitHub-Verbindung ist abgelaufen."
- },
- "review": "Prüfung",
- "reviewPullRequest": "Pull-Request prüfen",
- "screen": {
- "shareA11y": "Pull-Request teilen",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "leere Diff-Spalte",
- "emptyDiffRow": "Leere Diff-Zeile",
- "newOnly": "Nur in der neuen Version: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ kein Zeilenumbruch am Dateiende",
- "oldNew": "Alt: {{old}} | Neu: {{new}}",
- "oldOnly": "Nur in der alten Version: {{text}}"
+ "tabs": {
+ "discussion": "Diskussion",
+ "files": "Dateien",
+ "overview": "Übersicht"
},
- "submit": {
- "deletePendingMessage": "Dieser Kommentar wird aus den vorgemerkten Kommentaren für das Review entfernt.",
- "deletePendingTitle": "Ausstehenden Kommentar löschen?",
- "loadFailedTitle": "Das Formular zum Senden des Reviews konnte nicht geladen werden.",
- "pendingComment": "noch nicht gesendete Kommentare",
- "pendingComment_other": "noch nicht gesendete Kommentare",
- "pendingComment_one": "ausstehender Kommentar",
- "summaryOptional": "Zusammenfassung (optional)",
- "partialPostedMessage": "Veröffentlichte Kommentare: {{displayFreshCount}}. Kommentare zu einem älteren Commit: {{displayStaleCount}}. Diese bleiben vorgemerkt.",
- "submitCountOfTotal": "{{displayFreshCount}} von {{displayTotalCount}} Kommentaren senden",
- "submitReview": "Prüfung senden",
- "blockedRequestChanges": "Füge eine Zusammenfassung oder mindestens einen Kommentar hinzu, um Änderungen anzufordern.",
- "blockedComment": "Füge eine Zusammenfassung oder mindestens einen Kommentar hinzu, um ein Review mit Kommentaren zu senden."
+ "terms": {
+ "pullRequest": "Pull-Request",
+ "mergeRequest": "Merge-Request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Merge-Request teilen",
+ "viewOnProvider": "Auf {{provider}} ansehen",
+ "mergeRequestUnavailable": "Merge-Request nicht verfügbar",
+ "unavailableDescription": "Möglicherweise wurde er gelöscht, oder du hast keinen Zugriff darauf.",
+ "accessDeniedMergeRequest": "Du hast keine Berechtigung, diesen Merge-Request anzusehen.",
+ "couldNotLoadMergeRequest": "Der Merge-Request konnte nicht geladen werden.",
+ "discussionAccessDenied": "Du hast keine Berechtigung, die Diskussion zu diesem Merge-Request anzusehen.",
+ "discussionUnavailableMessage": "Dieser Merge-Request wurde möglicherweise entfernt.",
+ "noDiscussionDescription": "Zu diesem Merge-Request gibt es noch keine Review-Threads oder Kommentare.",
+ "noFilesChangedDescription": "Dieser Merge-Request enthält keine Dateiänderungen."
},
"fileStatus": {
"changed": "Geändert",
@@ -2706,11 +2771,6 @@
"modified": "Geändert",
"renamed": "Umbenannt"
},
- "tabs": {
- "discussion": "Diskussion",
- "files": "Dateien",
- "overview": "Übersicht"
- },
"diff": {
"selectedTapToChange": "{{label}} ausgewählt, zum Ändern der Auswahl tippen",
"tapToComment": "{{label}}, zum Kommentieren tippen",
@@ -2721,7 +2781,7 @@
"emptyLine": "(leer)"
},
"linkPasteClipboardEmpty": "Die Zwischenablage ist leer.",
- "linkPasteNotAPullRequest": "Dieser Link führt nicht zu einem Pull-Request auf GitHub.",
+ "linkPasteNotAPullRequest": "Dieser Link führt nicht zu einem Pull-Request oder Merge-Request.",
"announce": {
"commentPosted": "Kommentar veröffentlicht",
"reviewSubmitted": "Review gesendet",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "Dieser Kommentar kann nicht veröffentlicht werden. Möglicherweise hat sich die ausgewählte Zeile geändert oder der PR wurde aktualisiert.",
"reviewNotSubmitted": "Dieses Review kann in seiner aktuellen Form nicht gesendet werden. Möglicherweise hat sich der PR geändert oder du versuchst, deinen eigenen Pull-Request zu prüfen.",
+ "reviewNotSubmittedTerm": "Dieses Review kann in seiner aktuellen Form nicht gesendet werden. Möglicherweise hat sich der {{term}} geändert, oder du kannst deinen eigenen {{term}} nicht prüfen.",
"couldNotPostComment": "Der Kommentar konnte nicht veröffentlicht werden.",
"couldNotSubmitReview": "Das Review konnte nicht gesendet werden. Prüfe deine Verbindung und versuche es erneut."
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "Die Antwort konnte nicht gesendet werden.",
"couldNotCompleteAction": "Diese Aktion konnte nicht abgeschlossen werden.",
"mergeResultDefaultError": "GitHub hat die Zusammenführung nicht abgeschlossen.",
+ "mergeResultNotCompleted": "Der {{term}} wurde nicht zusammengeführt. Prüfe seinen Status und versuche es erneut.",
"ambiguous": "Die Aktion konnte nicht bestätigt werden. Prüfe den PR, bevor du es erneut versuchst.",
"persistenceFailed": "Wir konnten diese Aktion nicht speichern. Bitte versuche es später erneut.",
"forbidden": "Du hast keine Berechtigung für diese Aktion."
diff --git a/apps/mobile/src/i18n/locales/el.json b/apps/mobile/src/i18n/locales/el.json
index 1eed7a9421..0e6d2949e5 100644
--- a/apps/mobile/src/i18n/locales/el.json
+++ b/apps/mobile/src/i18n/locales/el.json
@@ -36,6 +36,7 @@
"cost": "Κόστος",
"discard": "Απόρριψη",
"findings": "Ευρήματα",
+ "mergeRequest": "αίτημα συγχώνευσης",
"notConnected": "Χωρίς σύνδεση",
"notifications": "Ειδοποιήσεις",
"pullRequest": "αίτημα ενσωμάτωσης",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Κενή γραμμή διαφορών"
},
"connectionExpired": "Η σύνδεση με το GitHub έληξε.",
+ "capabilities": {
+ "banner": {
+ "title": "Μη διαθέσιμο σε αυτόν τον πάροχο",
+ "accessibility": "Μη διαθέσιμο σε αυτόν τον πάροχο: {{reason}}"
+ }
+ },
"merge": {
"merge": "Συγχώνευση",
"mergeNow": "Συγχώνευση τώρα",
"mergePullRequest": "Συγχώνευση αιτήματος ενσωμάτωσης",
+ "mergeTermTitle": "Συγχώνευση {{term}}",
"enableAutoMerge": "Ενεργοποίηση αυτόματης συγχώνευσης",
"disableAutoMerge": "Απενεργοποίηση αυτόματης συγχώνευσης",
"autoMergeOn": "Η αυτόματη συγχώνευση είναι ενεργή",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Διαγραφή κλάδου μετά τη συγχώνευση",
"noEnabledMethods": "Δεν υπάρχουν ενεργές μέθοδοι συγχώνευσης σε αυτό το αποθετήριο. Ζήτησε από έναν διαχειριστή του να ενεργοποιήσει τη συγχώνευση, τη σύμπτυξη ή την αλλαγή βάσης.",
"confirmTitle": "Συγχώνευση αιτήματος ενσωμάτωσης;",
+ "confirmTitleTerm": "Συγχώνευση {{term}};",
"confirmMessage": "Οι αλλαγές σου θα συγχωνευτούν στον κλάδο βάσης.",
"enableAutoMergeConfirmTitle": "Ενεργοποίηση αυτόματης συγχώνευσης;",
"enableAutoMergeConfirmMessage": "Το GitHub θα συγχωνεύσει αυτόματα αυτό το αίτημα ενσωμάτωσης όταν ολοκληρωθούν επιτυχώς όλοι οι απαιτούμενοι έλεγχοι.",
+ "enableAutoMergeConfirmMessageTerm": "Το {{term}} θα συγχωνευθεί αυτόματα μόλις ο αγωγός του ολοκληρωθεί με επιτυχία.",
+ "enableAutoMergeDescriptionTerm": "Το GitLab συγχωνεύει αυτόματα αυτό το {{term}} μόλις ο αγωγός του ολοκληρωθεί με επιτυχία.",
"forbidden": "Δεν έχεις δικαίωμα συγχώνευσης αυτού του αιτήματος ενσωμάτωσης.",
"cannotMerge": "Αυτό το αίτημα ενσωμάτωσης δεν μπορεί να συγχωνευτεί στην τρέχουσα μορφή του.",
"couldNotMerge": "Δεν ήταν δυνατή η συγχώνευση του αιτήματος ενσωμάτωσης.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Ήδη συγχωνευμένο",
- "closed": "Αυτό το αίτημα ενσωμάτωσης είναι κλειστό"
+ "closed": "Αυτό το αίτημα ενσωμάτωσης είναι κλειστό",
+ "closedMergeRequest": "Αυτό το αίτημα συγχώνευσης είναι κλειστό"
},
"partialSuccessBanner": {
"body": "Δεν ήταν δυνατή η διαγραφή του κλάδου: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Αυτό το αίτημα ενσωμάτωσης δεν μπορεί ακόμα να συγχωνευτεί",
"notMergeableDetail": "Το GitHub ανέφερε την τιμή {{state}} για τη δυνατότητα συγχώνευσης."
},
+ "restrictions": {
+ "title": "Περιορισμοί συγχώνευσης",
+ "approvalsRequired_one": "Απαιτείται {{displayCount}} έγκριση",
+ "approvalsRequired_other": "Απαιτούνται {{displayCount}} εγκρίσεις",
+ "pipelineMustSucceed": "Ο αγωγός πρέπει να ολοκληρωθεί με επιτυχία πριν από τη συγχώνευση."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Ο αγωγός αποτυγχάνει στην τελευταία καταχώριση.",
+ "pendingPipeline": "Ο αγωγός εκτελείται ακόμα στην τελευταία καταχώριση.",
+ "permission": "Δεν έχεις δικαίωμα συγχώνευσης αυτού του {{term}}.",
+ "draft": "Σήμανε το {{term}} ως έτοιμο για αξιολόγηση πριν από τη συγχώνευση."
+ },
"methodLabels": {
"merge": "Δημιουργία καταχώρισης συγχώνευσης",
"squash": "Σύμπτυξη και συγχώνευση",
@@ -448,6 +472,7 @@
"acceptTerms": "Αποδοχή",
"replyBadRequest": "Αυτή η απάντηση δεν μπορεί να δημοσιευτεί. Το νήμα μπορεί να έχει αλλάξει.",
"replyForbidden": "Δεν έχεις δικαίωμα να απαντήσεις σε αυτό το αίτημα ενσωμάτωσης.",
+ "replyForbiddenTerm": "Δεν έχεις δικαίωμα να απαντήσεις σε αυτό το {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Δεν είναι δυνατή η αναφορά αυτού του σχολίου.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Αξιολόγηση αιτήματος ενσωμάτωσης",
"headLine": "{{counts}} · τελευταία καταχώριση: {{sha}}.",
"entry": {
- "eyebrow": "Άνοιξε ένα αίτημα ενσωμάτωσης μέσω URL.",
- "pastePrLink": "Επικόλληση συνδέσμου PR",
- "noRecentPrs": "Δεν υπάρχουν πρόσφατα PR",
- "noRecentPrsDescription": "Επικόλλησε έναν σύνδεσμο PR παραπάνω για να ξεκινήσεις μια αξιολόγηση — το PR θα εμφανιστεί εδώ την επόμενη φορά.",
+ "eyebrow": "Ανοίξτε ένα αίτημα ενσωμάτωσης ή αίτημα συγχώνευσης μέσω URL",
+ "pastePrLink": "Επικόλληση συνδέσμου αιτήματος ενσωμάτωσης ή συγχώνευσης",
+ "noRecentPrs": "Δεν υπάρχουν πρόσφατες αξιολογήσεις",
+ "noRecentPrsDescription": "Επικολλήστε έναν σύνδεσμο παραπάνω για να ξεκινήσετε μια αξιολόγηση — θα εμφανιστεί εδώ την επόμενη φορά.",
"couldNotLoad": "Δεν ήταν δυνατή η φόρτωση.",
"removeFromRecentsTitle": "Αφαίρεση από τα πρόσφατα;",
- "removeFromRecentsMessage": "Αυτό το αίτημα ενσωμάτωσης θα αφαιρεθεί από τα πρόσφατά σου.",
+ "removeFromRecentsMessage": "Αυτή η αξιολόγηση θα αφαιρεθεί από τις πρόσφατές σας.",
"removeRecentAccessibility": "Αφαίρεση {{repo}} από τα πρόσφατα",
- "urlAccessibility": "URL αιτήματος ενσωμάτωσης στο GitHub",
- "clearLink": "Εκκαθάριση συνδέσμου αιτήματος ενσωμάτωσης",
- "pasteLink": "Επικόλληση συνδέσμου αιτήματος ενσωμάτωσης",
+ "urlAccessibility": "Εισαγάγετε URL αιτήματος ενσωμάτωσης ή συγχώνευσης",
+ "urlPlaceholder": "URL αιτήματος ενσωμάτωσης ή αιτήματος συγχώνευσης",
+ "openAccessibility": "Άνοιγμα αιτήματος ενσωμάτωσης ή αιτήματος συγχώνευσης",
+ "clearLink": "Εκκαθάριση συνδέσμου",
+ "pasteLink": "Επικόλληση συνδέσμου αιτήματος ενσωμάτωσης ή συγχώνευσης",
"open": "Άνοιγμα"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Δεν ήταν δυνατός ο έλεγχος της σύνδεσης με το GitHub.",
"checkFailedMessage": "Η κατάσταση σύνδεσης δεν είναι διαθέσιμη μέχρι να ολοκληρωθεί η φόρτωση.",
+ "checkFailedTitleGitLab": "Δεν ήταν δυνατός ο έλεγχος της σύνδεσης με το GitLab.",
+ "checkFailedTitleBitbucket": "Δεν ήταν δυνατός ο έλεγχος της σύνδεσης με το Bitbucket.",
+ "providerCheckFailedMessage": "Η κατάσταση σύνδεσης δεν είναι διαθέσιμη έως ότου φορτωθεί.",
"reconnectTitle": "Επανασύνδεση με το GitHub",
"reconnectDescription": "Η σύνδεσή σου με το GitHub ανακλήθηκε. Συνδέσου ξανά για να συνεχίσεις να αξιολογείς αιτήματα ενσωμάτωσης στο κινητό.",
- "description": "Σύνδεσε τον λογαριασμό σου στο GitHub για να αξιολογείς αιτήματα ενσωμάτωσης στο κινητό."
+ "description": "Σύνδεσε τον λογαριασμό σου στο GitHub για να αξιολογείς αιτήματα ενσωμάτωσης στο κινητό.",
+ "gitlabDescription": "Συνδέστε τον λογαριασμό σας στο GitLab για να αξιολογείτε αιτήματα συγχώνευσης από το κινητό.",
+ "bitbucketDescription": "Συνδέστε το Bitbucket με αυτόν τον οργανισμό για να αξιολογείτε αιτήματα ενσωμάτωσης από το κινητό.",
+ "bitbucketOrgOnlyDescription": "Επιλέξτε έναν οργανισμό στο προφίλ σας για να αξιολογείτε τα αιτήματα ενσωμάτωσης Bitbucket του."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Η σύνδεση με το GitHub έληξε.",
- "message": "Η σύνδεσή σου με το GitHub δεν ισχύει πλέον. Έλεγξέ την ξανά — αν χρειαστεί, θα σου ζητηθεί να συνδεθείς ξανά."
+ "message": "Η σύνδεσή σου με το GitHub δεν ισχύει πλέον. Έλεγξέ την ξανά — αν χρειαστεί, θα σου ζητηθεί να συνδεθείς ξανά.",
+ "gitlabTitle": "Η σύνδεση με το GitLab έληξε.",
+ "bitbucketTitle": "Η σύνδεση με το Bitbucket έληξε.",
+ "providerMessage": "Η σύνδεσή σου με το {{provider}} δεν ισχύει πλέον. Έλεγξέ την ξανά — αν χρειαστεί, θα σου ζητηθεί να συνδεθείς ξανά."
},
"eventChips": {
"comment": "Σχόλιο",
@@ -643,6 +679,21 @@
"files": "Αρχεία",
"discussion": "Συζήτηση"
},
+ "terms": {
+ "pullRequest": "Αίτημα ενσωμάτωσης",
+ "mergeRequest": "Αίτημα συγχώνευσης",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Κοινοποίηση αιτήματος συγχώνευσης",
+ "viewOnProvider": "Προβολή σε {{provider}}",
+ "mergeRequestUnavailable": "Μη διαθέσιμο αίτημα συγχώνευσης",
+ "unavailableDescription": "Μπορεί να έχει διαγραφεί, ή μπορεί να μην έχετε πρόσβαση σε αυτό.",
+ "accessDeniedMergeRequest": "Δεν έχεις δικαίωμα προβολής αυτού του αιτήματος συγχώνευσης.",
+ "couldNotLoadMergeRequest": "Δεν ήταν δυνατή η φόρτωση του αιτήματος συγχώνευσης.",
+ "discussionAccessDenied": "Δεν έχεις δικαίωμα προβολής της συζήτησης αυτού του αιτήματος συγχώνευσης.",
+ "discussionUnavailableMessage": "Αυτό το αίτημα συγχώνευσης μπορεί να έχει αφαιρεθεί.",
+ "noDiscussionDescription": "Δεν υπάρχουν νήματα αξιολόγησης ή σχόλια συζήτησης σε αυτό το αίτημα συγχώνευσης.",
+ "noFilesChangedDescription": "Αυτό το αίτημα συγχώνευσης δεν περιέχει αλλαγές σε αρχεία."
+ },
"fileStatus": {
"modified": "Τροποποιήθηκε",
"renamed": "Μετονομάστηκε",
@@ -659,7 +710,7 @@
"emptyLine": "(κενό)"
},
"linkPasteClipboardEmpty": "Το πρόχειρο είναι άδειο.",
- "linkPasteNotAPullRequest": "Αυτός δεν είναι σύνδεσμος αιτήματος ενσωμάτωσης στο GitHub.",
+ "linkPasteNotAPullRequest": "Δεν είναι σύνδεσμος αιτήματος ενσωμάτωσης ή συγχώνευσης",
"announce": {
"commentPosted": "Δημοσιεύτηκε το σχόλιο",
"reviewSubmitted": "Υποβλήθηκε η αξιολόγηση",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Αυτό το σχόλιο δεν μπορεί να δημοσιευτεί. Η επιλεγμένη γραμμή μπορεί να έχει αλλάξει ή το PR μπορεί να έχει ενημερωθεί.",
"reviewNotSubmitted": "Αυτή η αξιολόγηση δεν μπορεί να υποβληθεί στην τρέχουσα μορφή της. Ίσως το PR έχει αλλάξει ή προσπαθείς να αξιολογήσεις δικό σου αίτημα ενσωμάτωσης, κάτι που δεν επιτρέπεται.",
+ "reviewNotSubmittedTerm": "Αυτή η αξιολόγηση δεν μπορεί να υποβληθεί ως έχει. Το {{term}} μπορεί να άλλαξε, ή δεν μπορείτε να αξιολογήσετε το δικό σας {{term}}.",
"couldNotPostComment": "Δεν ήταν δυνατή η δημοσίευση του σχολίου.",
"couldNotSubmitReview": "Δεν ήταν δυνατή η υποβολή της αξιολόγησης. Έλεγξε τη σύνδεσή σου και δοκίμασε ξανά."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Δεν ήταν δυνατή η αποστολή της απάντησης.",
"couldNotCompleteAction": "Δεν ήταν δυνατή η ολοκλήρωση αυτής της ενέργειας.",
"mergeResultDefaultError": "Το GitHub δεν ολοκλήρωσε τη συγχώνευση.",
+ "mergeResultNotCompleted": "Το {{term}} δεν συγχωνεύτηκε. Ελέγξτε την κατάστασή του και δοκιμάστε ξανά.",
"ambiguous": "Δεν ήταν δυνατή η επιβεβαίωση — έλεγξε το PR πριν δοκιμάσεις ξανά.",
"persistenceFailed": "Δεν ήταν δυνατή η καταγραφή αυτής της ενέργειας. Δοκίμασε ξανά αργότερα.",
"forbidden": "Δεν επιτρέπεται η πρόσβαση."
@@ -1988,11 +2041,31 @@
"retryConnection": "Επανάληψη σύνδεσης"
},
"newSession": {
+ "recentlyUsed": "Πρόσφατη χρήση",
+ "couldNotLoadGithubRepositories": "Δεν ήταν δυνατή η φόρτωση των αποθετηρίων του GitHub.",
+ "couldNotLoadGitlabRepositories": "Δεν ήταν δυνατή η φόρτωση των αποθετηρίων του GitLab.",
+ "couldNotLoadBitbucketRepositories": "Δεν ήταν δυνατή η φόρτωση των αποθετηρίων του Bitbucket.",
"connectGithubDescription": "Σύνδεσε το GitHub από το πρόγραμμα περιήγησης και μετά επέστρεψε εδώ για να επιλέξεις ένα αποθετήριο.",
+ "connectGitlabDescription": "Σύνδεσε το GitLab από το πρόγραμμα περιήγησης και μετά επέστρεψε εδώ για να επιλέξεις ένα αποθετήριο.",
+ "connectBitbucketDescription": "Σύνδεσε το Bitbucket από το πρόγραμμα περιήγησης και μετά επέστρεψε εδώ για να επιλέξεις ένα αποθετήριο.",
"openGithub": "Άνοιγμα GitHub",
+ "openGitlab": "Άνοιγμα GitLab",
+ "openBitbucket": "Άνοιγμα Bitbucket",
"refreshRepositories": "Ανανέωση αποθετηρίων",
"githubConnected": "Συνδεδεμένο GitHub",
+ "gitlabConnected": "Συνδεδεμένο GitLab",
"noRepositoriesVisible": "Δεν εμφανίζονται αποθετήρια. Έλεγξε αν η εφαρμογή Kilo στο GitHub έχει πρόσβαση στα αποθετήρια και μετά ανανέωσε τη λίστα.",
+ "noRepositoriesVisibleGitlab": "Δεν εμφανίζονται αποθετήρια. Έλεγξε την πρόσβαση στα αποθετήρια του GitLab και μετά ανανέωσε τη λίστα.",
+ "noRepositoriesVisibleBitbucket": "Δεν εμφανίζονται αποθετήρια. Έλεγξε την πρόσβαση στα αποθετήρια του Bitbucket και μετά ανανέωσε τη λίστα.",
+ "bitbucketOrganizationsOnly": "Το Bitbucket είναι διαθέσιμο μόνο για οργανισμούς.",
+ "branchPickerTitle": "Επιλογή κλάδου",
+ "branchDefault": "Προεπιλογή",
+ "branchAccessibility": "Κλάδος: {{label}}",
+ "branchLoading": "Φόρτωση κλάδων",
+ "branchLoadError": "Δεν ήταν δυνατή η φόρτωση των κλάδων",
+ "branchUnavailable": "Δεν υπάρχουν διαθέσιμοι κλάδοι για αυτό το αποθετήριο. Ελέγξτε την πρόσβασή σας στον πάροχο και, στη συνέχεια, επιλέξτε άλλο αποθετήριο.",
+ "branchEmpty": "Δεν υπάρχουν διαθέσιμοι κλάδοι",
+ "branchPlaceholder": "Επιλέξτε κλάδο",
"runOnWithTarget": "Εκτέλεση σε: {{target}}",
"environment": "Περιβάλλον",
"couldNotLoadEnvironment": "Δεν ήταν δυνατή η φόρτωση του περιβάλλοντός σου.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Δεν ήταν δυνατή η ανανέωση των αποθετηρίων. Δοκίμασε ξανά.",
"discardDraftTitle": "Απόρριψη πρόχειρου;",
"discardDraftMessage": "Το μήνυμά σου θα χαθεί.",
+ "discardWithUploadsMessage": "Το μήνυμά σου και όσα αρχεία ανέβασες χωρίς να τα στείλεις θα διαγραφούν.",
"discardFailed": "Δεν ήταν δυνατή η απόρριψη του πρόχειρου. Δοκίμασε ξανά.",
"remoteHint": "Εκτέλεσε το `kilo remote` στον υπολογιστή σου ή το `/remote` σε μια ενεργή συνεδρία CLI, για να ελέγξεις μια τοπική διεργασία kilo.",
- "connectBitbucketDescription": "Σύνδεσε το Bitbucket από το πρόγραμμα περιήγησης και μετά επέστρεψε εδώ για να επιλέξεις ένα αποθετήριο.",
- "connectGitlabDescription": "Σύνδεσε το GitLab από το πρόγραμμα περιήγησης και μετά επέστρεψε εδώ για να επιλέξεις ένα αποθετήριο.",
- "couldNotLoadBitbucketRepositories": "Δεν ήταν δυνατή η φόρτωση των αποθετηρίων του Bitbucket.",
- "couldNotLoadGithubRepositories": "Δεν ήταν δυνατή η φόρτωση των αποθετηρίων του GitHub.",
- "couldNotLoadGitlabRepositories": "Δεν ήταν δυνατή η φόρτωση των αποθετηρίων του GitLab.",
- "gitlabConnected": "Συνδεδεμένο GitLab",
- "noRepositoriesVisibleBitbucket": "Δεν εμφανίζονται αποθετήρια. Έλεγξε την πρόσβαση στα αποθετήρια του Bitbucket και μετά ανανέωσε τη λίστα.",
- "noRepositoriesVisibleGitlab": "Δεν εμφανίζονται αποθετήρια. Έλεγξε την πρόσβαση στα αποθετήρια του GitLab και μετά ανανέωσε τη λίστα.",
- "openBitbucket": "Άνοιγμα Bitbucket",
- "openGitlab": "Άνοιγμα GitLab",
- "recentlyUsed": "Πρόσφατη χρήση",
"continueFrom": "Συνεχίζεται η συνεδρία {{title}}.",
"importingSession": "Εισαγωγή συνεδρίας…",
"cliCannotContinue": "Αυτό το CLI δεν μπορεί να συνεχίσει μια συνεδρία. Επίλεξε τον Cloud Agent ή άλλο CLI.",
- "importFailed": "Δεν ήταν δυνατή η εισαγωγή αυτής της συνεδρίας.",
- "discardWithUploadsMessage": "Το μήνυμά σου και όσα αρχεία ανέβασες χωρίς να τα στείλεις θα διαγραφούν."
+ "importFailed": "Δεν ήταν δυνατή η εισαγωγή αυτής της συνεδρίας."
},
"partRenderer": {
"updatedFileCount_one": "Ενημερώθηκε {{displayCount}} αρχείο.",
diff --git a/apps/mobile/src/i18n/locales/en.json b/apps/mobile/src/i18n/locales/en.json
index 80ec59435b..94cbe96098 100644
--- a/apps/mobile/src/i18n/locales/en.json
+++ b/apps/mobile/src/i18n/locales/en.json
@@ -36,6 +36,7 @@
"cost": "Cost",
"discard": "Discard",
"findings": "Findings",
+ "mergeRequest": "merge request",
"notConnected": "Not connected",
"notifications": "Notifications",
"pullRequest": "pull request",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Empty diff row"
},
"connectionExpired": "GitHub connection expired.",
+ "capabilities": {
+ "banner": {
+ "title": "Not available on this provider",
+ "accessibility": "Not available on this provider: {{reason}}"
+ }
+ },
"merge": {
"merge": "Merge",
"mergeNow": "Merge now",
"mergePullRequest": "Merge pull request",
+ "mergeTermTitle": "Merge {{term}}",
"enableAutoMerge": "Enable auto-merge",
"disableAutoMerge": "Disable auto-merge",
"autoMergeOn": "Auto-merge is on",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Delete branch after merge",
"noEnabledMethods": "This repository has no enabled merge methods. Ask a repository admin to enable merge, squash, or rebase merging.",
"confirmTitle": "Merge pull request?",
+ "confirmTitleTerm": "Merge {{term}}?",
"confirmMessage": "This will merge your changes into the base branch.",
"enableAutoMergeConfirmTitle": "Enable auto-merge?",
"enableAutoMergeConfirmMessage": "GitHub will merge this pull request automatically when all required checks pass.",
+ "enableAutoMergeConfirmMessageTerm": "The {{term}} will merge automatically once its pipeline succeeds.",
+ "enableAutoMergeDescriptionTerm": "GitLab merges this {{term}} automatically once its pipeline succeeds.",
"forbidden": "You don't have permission to merge this pull request.",
"cannotMerge": "This pull request cannot be merged as is.",
"couldNotMerge": "Could not merge pull request.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Already merged",
- "closed": "This pull request is closed"
+ "closed": "This pull request is closed",
+ "closedMergeRequest": "This merge request is closed"
},
"partialSuccessBanner": {
"body": "Couldn't delete the branch: {{reason}}",
@@ -401,6 +413,18 @@
"notMergeableTitle": "This pull request is not mergeable yet",
"notMergeableDetail": "GitHub reported a {{state}} mergeable state."
},
+ "restrictions": {
+ "title": "Merge restrictions",
+ "approvalsRequired_one": "{{displayCount}} approval required",
+ "approvalsRequired_other": "{{displayCount}} approvals required",
+ "pipelineMustSucceed": "The pipeline must succeed before merging."
+ },
+ "providerBlocked": {
+ "failingPipeline": "The pipeline is failing on the latest commit.",
+ "pendingPipeline": "The pipeline is still running on the latest commit.",
+ "permission": "You don't have permission to merge this {{term}}.",
+ "draft": "Mark the {{term}} as ready for review before merging."
+ },
"methodLabels": {
"merge": "Create a merge commit",
"squash": "Squash and merge",
@@ -448,6 +472,7 @@
"acceptTerms": "Accept",
"replyBadRequest": "This reply can't be posted. The thread may have changed.",
"replyForbidden": "You don't have permission to reply to this pull request.",
+ "replyForbiddenTerm": "You don't have permission to reply to this {{term}}.",
"moderation": {
"reportContent": {
"terminal": "This comment can't be reported.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Review pull request",
"headLine": "{{counts}} · head {{sha}}",
"entry": {
- "eyebrow": "Open a pull request by URL",
- "pastePrLink": "Paste a PR link",
- "noRecentPrs": "No recent PRs",
- "noRecentPrsDescription": "Paste a PR link above to start a review — it'll show up here next time.",
+ "eyebrow": "Open a pull request or merge request by URL",
+ "pastePrLink": "Paste a pull request or merge request link",
+ "noRecentPrs": "No recent reviews",
+ "noRecentPrsDescription": "Paste a link above to start a review — it'll show up here next time.",
"couldNotLoad": "Couldn't load",
"removeFromRecentsTitle": "Remove from recents?",
- "removeFromRecentsMessage": "This pull request will be removed from your recents.",
+ "removeFromRecentsMessage": "This review will be removed from your recents.",
"removeRecentAccessibility": "Remove {{repo}} from recents",
- "urlAccessibility": "GitHub pull request URL",
- "clearLink": "Clear pull request link",
- "pasteLink": "Paste pull request link",
+ "urlAccessibility": "Enter a pull request or merge request URL",
+ "urlPlaceholder": "Pull request or merge request URL",
+ "openAccessibility": "Open pull request or merge request",
+ "clearLink": "Clear link",
+ "pasteLink": "Paste pull request or merge request link",
"open": "Open"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Could not check GitHub connection",
"checkFailedMessage": "Sign-in status is unavailable until this loads.",
+ "checkFailedTitleGitLab": "Could not check GitLab connection",
+ "checkFailedTitleBitbucket": "Could not check Bitbucket connection",
+ "providerCheckFailedMessage": "Connection status is unavailable until this loads.",
"reconnectTitle": "Reconnect GitHub",
"reconnectDescription": "Your GitHub connection was revoked. Reconnect to keep reviewing pull requests on mobile.",
- "description": "Connect your GitHub account to review pull requests on mobile."
+ "description": "Connect your GitHub account to review pull requests on mobile.",
+ "gitlabDescription": "Connect your GitLab account to review merge requests on mobile.",
+ "bitbucketDescription": "Connect Bitbucket to this organization to review pull requests on mobile.",
+ "bitbucketOrgOnlyDescription": "Select an organization in your profile to review its Bitbucket pull requests."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub connection expired",
- "message": "Your GitHub connection is no longer valid. Re-check your connection — you'll be prompted to reconnect if needed."
+ "message": "Your GitHub connection is no longer valid. Re-check your connection — you'll be prompted to reconnect if needed.",
+ "gitlabTitle": "GitLab connection expired",
+ "bitbucketTitle": "Bitbucket connection expired",
+ "providerMessage": "Your {{provider}} connection is no longer valid. Re-check your connection — you'll be prompted to reconnect if needed."
},
"eventChips": {
"comment": "Comment",
@@ -643,6 +679,21 @@
"files": "Files",
"discussion": "Discussion"
},
+ "terms": {
+ "pullRequest": "Pull request",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "Merge request !{{number}}",
+ "shareMergeRequest": "Share merge request",
+ "viewOnProvider": "View on {{provider}}",
+ "mergeRequestUnavailable": "Merge request unavailable",
+ "unavailableDescription": "It may have been deleted, or you may not have access to it.",
+ "accessDeniedMergeRequest": "You don't have permission to view this merge request.",
+ "couldNotLoadMergeRequest": "Could not load merge request",
+ "discussionAccessDenied": "You don't have permission to view this merge request's discussion.",
+ "discussionUnavailableMessage": "This merge request may have been removed.",
+ "noDiscussionDescription": "No review threads or conversation comments on this merge request.",
+ "noFilesChangedDescription": "This merge request has no file changes."
+ },
"fileStatus": {
"modified": "Modified",
"renamed": "Renamed",
@@ -659,7 +710,7 @@
"emptyLine": "(empty)"
},
"linkPasteClipboardEmpty": "Clipboard is empty",
- "linkPasteNotAPullRequest": "Not a GitHub pull request link",
+ "linkPasteNotAPullRequest": "Not a pull request or merge request link",
"announce": {
"commentPosted": "Comment posted",
"reviewSubmitted": "Review submitted",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "This comment can't be posted. The selected line may have changed, or the PR may have been updated.",
"reviewNotSubmitted": "This review can't be submitted as is. The PR may have changed, or you can't review your own pull request.",
+ "reviewNotSubmittedTerm": "This review can't be submitted as is. The {{term}} may have changed, or you can't review your own {{term}}.",
"couldNotPostComment": "Could not post comment.",
"couldNotSubmitReview": "Could not submit review. Check your connection and try again."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Could not reply.",
"couldNotCompleteAction": "Could not complete this action.",
"mergeResultDefaultError": "GitHub did not complete the merge.",
+ "mergeResultNotCompleted": "The {{term}} was not merged. Check its state and try again.",
"ambiguous": "Couldn't confirm — check the PR before retrying.",
"persistenceFailed": "We could not record this action. Please try again later.",
"forbidden": "Forbidden"
@@ -2012,6 +2065,15 @@
"noRepositoriesVisible": "No repositories visible. Check repository access for the Kilo GitHub App, then refresh.",
"noRepositoriesVisibleGitlab": "No repositories visible. Check repository access for GitLab, then refresh.",
"noRepositoriesVisibleBitbucket": "No repositories visible. Check repository access for Bitbucket, then refresh.",
+ "bitbucketOrganizationsOnly": "Bitbucket is available for organizations only.",
+ "branchPickerTitle": "Select branch",
+ "branchDefault": "Default",
+ "branchAccessibility": "Branch: {{label}}",
+ "branchLoading": "Loading branches",
+ "branchLoadError": "Couldn't load branches",
+ "branchUnavailable": "Branches aren't available for this repository. Check your access with the provider, then pick another repository.",
+ "branchEmpty": "No branches available",
+ "branchPlaceholder": "Select a branch",
"runOnWithTarget": "Run on: {{target}}",
"environment": "Environment",
"couldNotLoadEnvironment": "Couldn't load your environment",
diff --git a/apps/mobile/src/i18n/locales/es.json b/apps/mobile/src/i18n/locales/es.json
index f556554aad..6a25d70389 100644
--- a/apps/mobile/src/i18n/locales/es.json
+++ b/apps/mobile/src/i18n/locales/es.json
@@ -3,6 +3,9 @@
"cancel": "Cancelar",
"done": "Hecho",
"retry": "Reintentar",
+ "tryAgain": "Volver a intentarlo",
+ "continue": "Continuar",
+ "notNow": "Ahora no",
"language": "Idioma",
"device": "Dispositivo",
"share": "Compartir {{title}}",
@@ -14,15 +17,12 @@
"approve": "Aprobar",
"refresh": "Actualizar",
"couldNotRefresh": "No se pudo actualizar. Desliza hacia abajo para volver a intentarlo.",
- "tryAgain": "Volver a intentarlo",
"openInBrowser": "Abrir en el navegador",
"openSettings": "Abrir ajustes",
"copiedToClipboard": "Copiado al portapapeles",
"couldNotCopyToClipboard": "No se pudo copiar al portapapeles.",
"required": "obligatorio",
"error": "fallo: {{error}}",
- "notNow": "Ahora no",
- "continue": "Continuar",
"back": "Atrás",
"somethingWentWrong": "Se ha producido un error.",
"couldNotOpen": "No se pudo abrir {{label}}.",
@@ -36,6 +36,7 @@
"cost": "Coste",
"discard": "Descartar",
"findings": "Hallazgos",
+ "mergeRequest": "merge request",
"notConnected": "Sin conexión",
"notifications": "Notificaciones",
"pullRequest": "solicitud de cambios",
@@ -1566,11 +1567,31 @@
"retryConnection": "Reintentar la conexión"
},
"newSession": {
+ "recentlyUsed": "Usados recientemente",
+ "couldNotLoadGithubRepositories": "No se pudieron cargar los repositorios de GitHub.",
+ "couldNotLoadGitlabRepositories": "No se pudieron cargar los repositorios de GitLab.",
+ "couldNotLoadBitbucketRepositories": "No se pudieron cargar los repositorios de Bitbucket.",
"connectGithubDescription": "Conecta GitHub en tu navegador y vuelve aquí para elegir un repositorio.",
+ "connectGitlabDescription": "Conecta GitLab en tu navegador y vuelve aquí para elegir un repositorio.",
+ "connectBitbucketDescription": "Conecta Bitbucket en tu navegador y vuelve aquí para elegir un repositorio.",
"openGithub": "Abrir GitHub",
+ "openGitlab": "Abrir GitLab",
+ "openBitbucket": "Abrir Bitbucket",
"refreshRepositories": "Actualizar repositorios",
"githubConnected": "GitHub conectado",
+ "gitlabConnected": "GitLab conectado",
"noRepositoriesVisible": "No se muestra ningún repositorio. Comprueba los permisos de acceso de la aplicación de Kilo para GitHub y actualiza la lista.",
+ "noRepositoriesVisibleGitlab": "No se muestra ningún repositorio. Comprueba los permisos de acceso a los repositorios de GitLab y actualiza la lista.",
+ "noRepositoriesVisibleBitbucket": "No se muestra ningún repositorio. Comprueba los permisos de acceso a los repositorios de Bitbucket y actualiza la lista.",
+ "bitbucketOrganizationsOnly": "Bitbucket solo está disponible para organizaciones.",
+ "branchPickerTitle": "Seleccionar rama",
+ "branchDefault": "Por defecto",
+ "branchAccessibility": "Rama: {{label}}",
+ "branchLoading": "Cargando ramas",
+ "branchLoadError": "No se pudieron cargar las ramas",
+ "branchUnavailable": "No hay ramas disponibles para este repositorio. Comprueba tu acceso con el proveedor y elige otro repositorio.",
+ "branchEmpty": "No hay ramas disponibles",
+ "branchPlaceholder": "Seleccionar una rama",
"runOnWithTarget": "Ejecutar en: {{target}}",
"environment": "Entorno",
"couldNotLoadEnvironment": "No se pudo cargar tu entorno.",
@@ -1589,26 +1610,15 @@
"couldNotReadPendingSessions": "No se pudieron leer las sesiones pendientes. Inténtalo de nuevo.",
"failedToCreate": "No se pudo crear la sesión.",
"couldNotRefreshRepositories": "No se pudieron actualizar los repositorios. Inténtalo de nuevo.",
- "discardDraftMessage": "Se perderán tus instrucciones.",
"discardDraftTitle": "¿Descartar borrador?",
+ "discardDraftMessage": "Se perderán tus instrucciones.",
+ "discardWithUploadsMessage": "Se eliminarán tus instrucciones y los archivos subidos que no estén adjuntos a mensajes enviados.",
"discardFailed": "No se pudo descartar el borrador. Inténtalo de nuevo.",
"remoteHint": "Ejecuta `kilo remote` en tu ordenador o `/remote` en una sesión activa de la CLI para controlar un proceso local de kilo.",
- "connectBitbucketDescription": "Conecta Bitbucket en tu navegador y vuelve aquí para elegir un repositorio.",
- "connectGitlabDescription": "Conecta GitLab en tu navegador y vuelve aquí para elegir un repositorio.",
- "couldNotLoadBitbucketRepositories": "No se pudieron cargar los repositorios de Bitbucket.",
- "couldNotLoadGithubRepositories": "No se pudieron cargar los repositorios de GitHub.",
- "couldNotLoadGitlabRepositories": "No se pudieron cargar los repositorios de GitLab.",
- "gitlabConnected": "GitLab conectado",
- "noRepositoriesVisibleBitbucket": "No se muestra ningún repositorio. Comprueba los permisos de acceso a los repositorios de Bitbucket y actualiza la lista.",
- "noRepositoriesVisibleGitlab": "No se muestra ningún repositorio. Comprueba los permisos de acceso a los repositorios de GitLab y actualiza la lista.",
- "openBitbucket": "Abrir Bitbucket",
- "openGitlab": "Abrir GitLab",
- "recentlyUsed": "Usados recientemente",
"continueFrom": "Se está continuando la sesión {{title}}.",
"importingSession": "Importando sesión",
"cliCannotContinue": "Esta CLI no puede continuar una sesión. Elige Cloud Agent u otra CLI.",
- "importFailed": "No se pudo importar esta sesión.",
- "discardWithUploadsMessage": "Se eliminarán tus instrucciones y los archivos subidos que no estén adjuntos a mensajes enviados."
+ "importFailed": "No se pudo importar esta sesión."
},
"partRenderer": {
"updatedFileCount_one": "Se ha actualizado {{displayCount}} archivo.",
@@ -2326,162 +2336,11 @@
"installAttributionPromptTitle": "¿Permitir que se identifique el origen de la instalación?"
},
"prReview": {
+ "pullRequestUnavailable": "PR no disponible",
+ "pullRequestUnavailableDescription": "No se puede abrir esta PR. Puede que se haya eliminado, que el repositorio sea privado o que la aplicación de Kilo para GitHub no esté instalada en él.",
"accessDeniedDescription": "No tienes permiso para ver esta PR.",
- "checkConnection": "Comprobar conexión",
- "checks": {
- "checksCount": "{{displayCount}} verificaciones",
- "couldNotLoad": "No se pudieron cargar las verificaciones.",
- "failed": "{{displayCount}} fallidas",
- "noAccess": "No tienes acceso a las verificaciones de este repositorio.",
- "noChecksReported": "No se han notificado verificaciones",
- "notAvailable": "Las verificaciones aún no están disponibles. Puede que la última confirmación no se haya procesado o que la aplicación de Kilo para GitHub no esté instalada en el repositorio de origen.",
- "openDetails": "Abrir los detalles de {{name}}",
- "passed": "{{displayCount}} superadas",
- "pending": "{{displayCount}} pendientes",
- "retryChecks": "Reintentar verificaciones",
- "skipped": "{{displayCount}} omitidas",
- "title": "Verificaciones",
- "viewOnGitHub": "Ver PR en GitHub",
- "checkDetails": "detalles de la verificación"
- },
- "composer": {
- "addTitle": "Añadir comentario",
- "addToReview": "Añadir a la revisión",
- "comment": "Comentario",
- "commentBody": "Texto del comentario",
- "commentBodyPlaceholder": "Tu comentario",
- "commentNow": "Comentar ahora",
- "discardMessage": "Se perderá tu borrador.",
- "discardTitle": "¿Descartar comentario?",
- "editTitle": "Editar comentario",
- "insertSuggestion": "Insertar sugerencia",
- "insertSuggestionA11y": "Insertar una sugerencia de código",
- "loadFailedTitle": "No se pudo cargar el editor de comentarios.",
- "ok": "ACEPTAR",
- "unavailableMessage": "Este comentario pendiente ya se eliminó o se envió.",
- "unavailableTitle": "Comentario no disponible",
- "bodyEmpty": "El comentario no puede estar vacío.",
- "suggestionsOnlyAddedLines": "Las sugerencias solo se aplican a las líneas añadidas.",
- "tapDiffLineToSuggest": "Toca una línea de las diferencias para activar las sugerencias."
- },
- "connect": {
- "checkFailedMessage": "No se puede consultar el estado de tu sesión hasta que termine la carga.",
- "checkFailedTitle": "No se pudo comprobar la conexión con GitHub.",
- "description": "Conecta tu cuenta de GitHub para revisar PR en el móvil.",
- "reconnectDescription": "Se revocó tu conexión con GitHub. Vuelve a conectar tu cuenta para seguir revisando PR en el móvil.",
- "reconnectTitle": "Volver a conectar GitHub"
- },
- "connectionExpired": "La conexión con GitHub ha caducado.",
- "couldNotLoadPullRequest": "No se pudo cargar la PR.",
- "couldNotOpenGitHubAppSettings": "No se pudieron abrir los ajustes de la aplicación de GitHub.",
- "description": "Descripción",
- "discussion": {
- "acceptTerms": "Aceptar",
- "accessDeniedMessage": "No tienes permiso para ver la conversación de esta PR.",
- "addReaction": "Añadir reacción",
- "block": "Bloqueo",
- "blockedUser": "{{login}} bloqueado",
- "collapseThread": "Contraer hilo",
- "commentActions": "Acciones del comentario",
- "comment": "{{displayCount}} comentarios",
- "comment_other": "{{displayCount}} comentarios",
- "couldNotLoad": "No se pudo cargar la conversación.",
- "couldNotLoadMore": "No se pudieron cargar más comentarios.",
- "loadMoreComments": "Cargar más comentarios",
- "loading": "Cargando la conversación",
- "moderation": {
- "block": {
- "retryable": "No se pudo bloquear a este usuario. Comprueba tu conexión e inténtalo de nuevo.",
- "terminal": "No se puede bloquear a este usuario."
- },
- "mute": {
- "retryable": "No se pudo silenciar a este usuario. Comprueba tu conexión e inténtalo de nuevo.",
- "terminal": "No se puede silenciar a este usuario."
- },
- "reportContent": {
- "retryable": "No se pudo denunciar este comentario. Comprueba tu conexión e inténtalo de nuevo.",
- "terminal": "No se puede denunciar este comentario."
- },
- "reportUser": {
- "retryable": "No se pudo denunciar a este usuario. Comprueba tu conexión e inténtalo de nuevo.",
- "terminal": "No se puede denunciar a este usuario."
- }
- },
- "moreLinesAbove": "… {{displayCount}} líneas más arriba",
- "mute": "Silenciar",
- "mutedUser": "{{login}} silenciado",
- "noDiscussion": "Aún no hay conversación",
- "noDiscussionDescription": "Esta PR aún no tiene hilos de revisión ni comentarios en la conversación.",
- "comment_one": "1 comentario",
- "outdated": "Desactualizado",
- "quotedDiffSnippet": "Fragmento citado de las diferencias",
- "reactionPill": "reacción {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "reacciones",
- "reaction_other": "reacciones",
- "reaction_one": "reacción",
- "replyBadRequest": "No se puede publicar esta respuesta. Puede que el hilo haya cambiado.",
- "replyBody": "Texto de la respuesta",
- "replyForbidden": "No tienes permiso para responder a esta PR.",
- "replyPlaceholder": "Tu respuesta…",
- "reportContent": "Denunciar contenido",
- "reportUser": "Denunciar al usuario",
- "resolveThread": "Resolver hilo",
- "resolved": "Resuelto",
- "retryLoadingMore": "Volver a cargar más comentarios",
- "reviewFiles": "Revisar archivos",
- "startedRelative": " · iniciado {{relative}}",
- "submitReply": "Enviar respuesta",
- "termsAcceptRetry": "No se pudieron aceptar las condiciones. Comprueba tu conexión e inténtalo de nuevo.",
- "termsCopy": "Debes tener 13 años o más para publicar.",
- "termsTitle": "Condiciones del servicio",
- "threadAccessibilityLabel": "Hilo de conversación {{anchorLabel}}",
- "unavailable": "La conversación no está disponible.",
- "unavailableMessage": "Es posible que esta PR se haya eliminado.",
- "unresolveThread": "Reabrir hilo",
- "viewTerms": "Ver condiciones",
- "termsAcceptRequired": "Debes aceptar las condiciones del servicio para publicar.",
- "termsCheckRetryCopy": "No se pudieron consultar las condiciones del servicio. Comprueba tu conexión e inténtalo de nuevo.",
- "termsOutdatedCopy": "Las condiciones del servicio han cambiado. Vuelve a abrir esta pantalla para aceptar la versión más reciente.",
- "comment_many": "{{displayCount}} comentarios",
- "reaction_many": "reacciones",
- "reactions": {
- "thumbsUp": "Pulgar arriba",
- "thumbsDown": "Pulgar abajo",
- "laugh": "Risa",
- "hooray": "Hurra",
- "confused": "Confundido",
- "heart": "Corazón",
- "rocket": "Cohete",
- "eyes": "Ojos"
- },
- "anchor": {
- "fileCommentOnPath": "Comentario sobre el archivo {{path}}",
- "fileComment": "Comentario sobre el archivo",
- "outdatedOnPathLines": "Desactualizado en {{path}} {{lines}}",
- "outdatedOnLines": "Desactualizado en {{lines}}",
- "outdatedOnPath": "Desactualizado en {{path}}"
- },
- "deletedUser": "usuario eliminado"
- },
- "entry": {
- "clearLink": "Borrar el enlace de la PR",
- "couldNotLoad": "No se pudo cargar.",
- "eyebrow": "Abre una PR mediante su URL.",
- "noRecentPrs": "No hay PR recientes",
- "noRecentPrsDescription": "Pega un enlace de PR arriba para iniciar una revisión. Aparecerá aquí la próxima vez.",
- "open": "Apertura",
- "pasteLink": "Pegar el enlace de la PR",
- "pastePrLink": "Pegar un enlace de PR",
- "removeFromRecentsMessage": "Esta PR se quitará de tu lista de recientes.",
- "removeFromRecentsTitle": "¿Quitar de la lista de recientes?",
- "removeRecentAccessibility": "Quitar {{repo}} de la lista de recientes",
- "urlAccessibility": "URL de la PR de GitHub"
- },
- "eventChips": {
- "comment": "Comentario",
- "label": "Tipo de revisión",
- "requestChanges": "Solicitar cambios"
- },
+ "noFilesChanged": "No hay archivos modificados",
+ "noFilesChangedDescription": "Esta PR no contiene cambios en los archivos.",
"fileList": {
"filesList": "Lista de archivos",
"filesViewed": "Archivos · {{viewed}} de {{total}} vistos",
@@ -2526,7 +2385,6 @@
"commentOnSelectedLines": "Comentar en las líneas seleccionadas",
"finishReview": "Finalizar revisión"
},
- "headLine": "{{counts}} · última confirmación {{sha}}",
"hunkRows": {
"contextUnavailable": "El contexto no está disponible en esta referencia.",
"expandAll": "Expandir todo",
@@ -2561,56 +2419,68 @@
"fileLoadedCount_many": "{{displayCount}} archivos cargados",
"fileLoadedOfTotalCount_many": "{{displayCount}} archivos cargados de {{total}}"
},
- "inbox": {
- "couldNotLoad": "No se pudo cargar la bandeja de entrada.",
- "loading": "Cargando la bandeja de entrada",
- "noReviewRequests": "No hay solicitudes de revisión",
- "noReviewRequestsDescription": "Aquí aparecen las PR pendientes de tu revisión. También puedes pegar cualquier enlace de PR arriba.",
- "title": "Bandeja de entrada"
+ "sideBySide": {
+ "emptyDiffColumn": "columna de diferencias vacía",
+ "emptyDiffRow": "Fila de diferencias vacía",
+ "newOnly": "Solo en la versión nueva: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ sin salto de línea al final del archivo",
+ "oldNew": "Anterior: {{old}} | Nuevo: {{new}}",
+ "oldOnly": "Solo en la versión anterior: {{text}}"
+ },
+ "connectionExpired": "La conexión con GitHub ha caducado.",
+ "capabilities": {
+ "banner": {
+ "title": "No disponible en este proveedor",
+ "accessibility": "No disponible en este proveedor: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Instalar la aplicación de Kilo para GitHub",
"merge": {
- "autoMergeDescription": "GitHub fusionará esta PR automáticamente cuando se superen todas las verificaciones obligatorias (método: {{method}}).",
+ "merge": "Fusión",
+ "mergeNow": "Fusionar ahora",
+ "mergePullRequest": "Fusionar PR",
+ "mergeTermTitle": "Fusionar {{term}}",
+ "enableAutoMerge": "Activar la fusión automática",
+ "disableAutoMerge": "Desactivar la fusión automática",
"autoMergeOn": "Fusión automática activada",
- "blockedTitle": "Por qué aún no se puede fusionar",
- "cannotMerge": "Esta PR no se puede fusionar en su estado actual.",
+ "autoMergeDescription": "GitHub fusionará esta PR automáticamente cuando se superen todas las verificaciones obligatorias (método: {{method}}).",
"checking": "Comprobando si se puede fusionar…",
+ "couldNotDetermine": "No se pudo determinar si se puede fusionar.",
+ "refreshMergeability": "Volver a comprobar si se puede fusionar",
+ "blockedTitle": "Por qué aún no se puede fusionar",
+ "updateBranch": "Actualizar rama",
+ "updateBranchFromBase": "Actualizar la rama con los cambios de la rama base",
+ "methodLabel": "Método",
+ "commitTitle": "Título de la confirmación",
"commitMessage": "Mensaje de la confirmación",
"commitMessagePlaceholder": "Descripción opcional de la confirmación de fusión",
- "commitTitle": "Título de la confirmación",
- "confirmMessage": "Esto fusionará tus cambios en la rama base.",
- "confirmTitle": "¿Fusionar la PR?",
- "couldNotDetermine": "No se pudo determinar si se puede fusionar.",
- "couldNotMerge": "No se pudo fusionar la PR.",
"deleteBranch": "Eliminar rama",
"deleteBranchAfterMerge": "Eliminar la rama después de la fusión",
- "disableAutoMerge": "Desactivar la fusión automática",
- "enableAutoMerge": "Activar la fusión automática",
- "enableAutoMergeConfirmMessage": "GitHub fusionará esta PR automáticamente cuando se superen todas las verificaciones obligatorias.",
+ "noEnabledMethods": "Este repositorio no tiene ningún método de fusión activado. Pide a un administrador del repositorio que active la fusión, la compactación o la reorganización.",
+ "confirmTitle": "¿Fusionar la PR?",
+ "confirmTitleTerm": "¿Fusionar {{term}}?",
+ "confirmMessage": "Esto fusionará tus cambios en la rama base.",
"enableAutoMergeConfirmTitle": "¿Activar la fusión automática?",
+ "enableAutoMergeConfirmMessage": "GitHub fusionará esta PR automáticamente cuando se superen todas las verificaciones obligatorias.",
+ "enableAutoMergeConfirmMessageTerm": "Cuando su pipeline tenga éxito, {{term}} se fusionará automáticamente.",
+ "enableAutoMergeDescriptionTerm": "GitLab fusionará {{term}} automáticamente cuando su pipeline tenga éxito.",
"forbidden": "No tienes permiso para fusionar esta PR.",
- "loadFailedTitle": "No se pudieron cargar las opciones de fusión.",
- "merge": "Fusión",
- "mergeNow": "Fusionar ahora",
- "mergePullRequest": "Fusionar PR",
- "methodLabel": "Método",
+ "cannotMerge": "Esta PR no se puede fusionar en su estado actual.",
+ "couldNotMerge": "No se pudo fusionar la PR.",
"methods": {
"merge": "Fusión",
"rebase": "Reorganización",
"squash": "Compactación"
},
- "noEnabledMethods": "Este repositorio no tiene ningún método de fusión activado. Pide a un administrador del repositorio que active la fusión, la compactación o la reorganización.",
+ "terminal": {
+ "alreadyMerged": "Ya fusionada",
+ "closed": "PR cerrada",
+ "closedMergeRequest": "Este merge request está cerrado"
+ },
"partialSuccessBanner": {
"accessibility": "Fusionada. No se pudo eliminar la rama: {{reason}}",
"body": "No se pudo eliminar la rama. Motivo: {{reason}}"
},
- "refreshMergeability": "Volver a comprobar si se puede fusionar",
- "terminal": {
- "alreadyMerged": "Ya fusionada",
- "closed": "PR cerrada"
- },
- "updateBranch": "Actualizar rama",
- "updateBranchFromBase": "Actualizar la rama con los cambios de la rama base",
+ "loadFailedTitle": "No se pudieron cargar las opciones de fusión.",
"blocked": {
"unknownStateTitle": "GitHub aún no indica que se pueda fusionar",
"unknownStateDetail": "Intenta actualizar el resumen dentro de un momento.",
@@ -2630,6 +2500,19 @@
"notMergeableTitle": "Esta PR aún no se puede fusionar",
"notMergeableDetail": "GitHub indicó el siguiente estado de fusión: {{state}}."
},
+ "restrictions": {
+ "title": "Restricciones de fusión",
+ "approvalsRequired_one": "Se requiere {{displayCount}} aprobación",
+ "approvalsRequired_other": "Se requieren {{displayCount}} aprobaciones",
+ "pipelineMustSucceed": "El pipeline debe tener éxito antes de fusionar.",
+ "approvalsRequired_many": "Se requieren {{displayCount}} aprobaciones"
+ },
+ "providerBlocked": {
+ "failingPipeline": "El pipeline está fallando en el último commit.",
+ "pendingPipeline": "El pipeline sigue en ejecución en el último commit.",
+ "permission": "No tienes permiso para fusionar {{term}}.",
+ "draft": "Cambia el estado de {{term}} a listo para revisión antes de fusionar."
+ },
"methodLabels": {
"merge": "Crear una confirmación de fusión",
"squash": "Compactar y fusionar",
@@ -2641,9 +2524,207 @@
"rebase": "Vuelve a aplicar todas las confirmaciones de esta rama sobre la rama base sin crear una confirmación de fusión."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Hilo de conversación {{anchorLabel}}",
+ "collapseThread": "Contraer hilo",
+ "resolveThread": "Resolver hilo",
+ "unresolveThread": "Reabrir hilo",
+ "resolved": "Resuelto",
+ "outdated": "Desactualizado",
+ "comment_one": "1 comentario",
+ "comment": "{{displayCount}} comentarios",
+ "comment_other": "{{displayCount}} comentarios",
+ "startedRelative": " · iniciado {{relative}}",
+ "couldNotLoadMore": "No se pudieron cargar más comentarios.",
+ "retryLoadingMore": "Volver a cargar más comentarios",
+ "loadMoreComments": "Cargar más comentarios",
+ "addReaction": "Añadir reacción",
+ "reactionPill": "reacción {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "reacción",
+ "reaction": "reacciones",
+ "reaction_other": "reacciones",
+ "commentActions": "Acciones del comentario",
+ "reportContent": "Denunciar contenido",
+ "reportUser": "Denunciar al usuario",
+ "mute": "Silenciar",
+ "block": "Bloqueo",
+ "blockedUser": "{{login}} bloqueado",
+ "mutedUser": "{{login}} silenciado",
+ "replyPlaceholder": "Tu respuesta…",
+ "replyBody": "Texto de la respuesta",
+ "submitReply": "Enviar respuesta",
+ "termsTitle": "Condiciones del servicio",
+ "termsCopy": "Debes tener 13 años o más para publicar.",
+ "termsAcceptRetry": "No se pudieron aceptar las condiciones. Comprueba tu conexión e inténtalo de nuevo.",
+ "viewTerms": "Ver condiciones",
+ "acceptTerms": "Aceptar",
+ "replyBadRequest": "No se puede publicar esta respuesta. Puede que el hilo haya cambiado.",
+ "replyForbidden": "No tienes permiso para responder a esta PR.",
+ "replyForbiddenTerm": "No tienes permiso para responder a {{term}}.",
+ "moderation": {
+ "block": {
+ "retryable": "No se pudo bloquear a este usuario. Comprueba tu conexión e inténtalo de nuevo.",
+ "terminal": "No se puede bloquear a este usuario."
+ },
+ "mute": {
+ "retryable": "No se pudo silenciar a este usuario. Comprueba tu conexión e inténtalo de nuevo.",
+ "terminal": "No se puede silenciar a este usuario."
+ },
+ "reportContent": {
+ "retryable": "No se pudo denunciar este comentario. Comprueba tu conexión e inténtalo de nuevo.",
+ "terminal": "No se puede denunciar este comentario."
+ },
+ "reportUser": {
+ "retryable": "No se pudo denunciar a este usuario. Comprueba tu conexión e inténtalo de nuevo.",
+ "terminal": "No se puede denunciar a este usuario."
+ }
+ },
+ "accessDeniedMessage": "No tienes permiso para ver la conversación de esta PR.",
+ "unavailable": "La conversación no está disponible.",
+ "unavailableMessage": "Es posible que esta PR se haya eliminado.",
+ "couldNotLoad": "No se pudo cargar la conversación.",
+ "loading": "Cargando la conversación",
+ "noDiscussion": "Aún no hay conversación",
+ "noDiscussionDescription": "Esta PR aún no tiene hilos de revisión ni comentarios en la conversación.",
+ "reviewFiles": "Revisar archivos",
+ "quotedDiffSnippet": "Fragmento citado de las diferencias",
+ "moreLinesAbove": "… {{displayCount}} líneas más arriba",
+ "termsAcceptRequired": "Debes aceptar las condiciones del servicio para publicar.",
+ "termsOutdatedCopy": "Las condiciones del servicio han cambiado. Vuelve a abrir esta pantalla para aceptar la versión más reciente.",
+ "termsCheckRetryCopy": "No se pudieron consultar las condiciones del servicio. Comprueba tu conexión e inténtalo de nuevo.",
+ "reactions": {
+ "thumbsUp": "Pulgar arriba",
+ "thumbsDown": "Pulgar abajo",
+ "laugh": "Risa",
+ "hooray": "Hurra",
+ "confused": "Confundido",
+ "heart": "Corazón",
+ "rocket": "Cohete",
+ "eyes": "Ojos"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Comentario sobre el archivo {{path}}",
+ "fileComment": "Comentario sobre el archivo",
+ "outdatedOnPathLines": "Desactualizado en {{path}} {{lines}}",
+ "outdatedOnLines": "Desactualizado en {{lines}}",
+ "outdatedOnPath": "Desactualizado en {{path}}"
+ },
+ "deletedUser": "usuario eliminado",
+ "comment_many": "{{displayCount}} comentarios",
+ "reaction_many": "reacciones"
+ },
+ "couldNotOpenGitHubAppSettings": "No se pudieron abrir los ajustes de la aplicación de GitHub.",
+ "installKiloGitHubApp": "Instalar la aplicación de Kilo para GitHub",
+ "checkConnection": "Comprobar conexión",
+ "couldNotLoadPullRequest": "No se pudo cargar la PR.",
+ "description": "Descripción",
"noDescriptionProvided": "No se ha proporcionado ninguna descripción.",
- "noFilesChanged": "No hay archivos modificados",
- "noFilesChangedDescription": "Esta PR no contiene cambios en los archivos.",
+ "review": "Revisión",
+ "reviewPullRequest": "Revisar PR",
+ "headLine": "{{counts}} · última confirmación {{sha}}",
+ "entry": {
+ "eyebrow": "Abre una PR o una merge request mediante su URL",
+ "pastePrLink": "Pegar un enlace de PR o de merge request",
+ "noRecentPrs": "No hay revisiones recientes",
+ "noRecentPrsDescription": "Pega un enlace arriba para iniciar una revisión — aparecerá aquí la próxima vez.",
+ "couldNotLoad": "No se pudo cargar.",
+ "removeFromRecentsTitle": "¿Quitar de la lista de recientes?",
+ "removeFromRecentsMessage": "Esta revisión se quitará de tu lista de recientes.",
+ "removeRecentAccessibility": "Quitar {{repo}} de la lista de recientes",
+ "urlAccessibility": "Introduce una URL de PR o de merge request",
+ "urlPlaceholder": "URL de PR o de merge request",
+ "openAccessibility": "Abrir una PR o un merge request",
+ "clearLink": "Borrar el enlace",
+ "pasteLink": "Pegar el enlace de PR o de merge request",
+ "open": "Apertura"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} verificaciones",
+ "couldNotLoad": "No se pudieron cargar las verificaciones.",
+ "failed": "{{displayCount}} fallidas",
+ "noAccess": "No tienes acceso a las verificaciones de este repositorio.",
+ "noChecksReported": "No se han notificado verificaciones",
+ "notAvailable": "Las verificaciones aún no están disponibles. Puede que la última confirmación no se haya procesado o que la aplicación de Kilo para GitHub no esté instalada en el repositorio de origen.",
+ "openDetails": "Abrir los detalles de {{name}}",
+ "passed": "{{displayCount}} superadas",
+ "pending": "{{displayCount}} pendientes",
+ "retryChecks": "Reintentar verificaciones",
+ "skipped": "{{displayCount}} omitidas",
+ "title": "Verificaciones",
+ "viewOnGitHub": "Ver PR en GitHub",
+ "checkDetails": "detalles de la verificación"
+ },
+ "inbox": {
+ "couldNotLoad": "No se pudo cargar la bandeja de entrada.",
+ "loading": "Cargando la bandeja de entrada",
+ "noReviewRequests": "No hay solicitudes de revisión",
+ "noReviewRequestsDescription": "Aquí aparecen las PR pendientes de tu revisión. También puedes pegar cualquier enlace de PR arriba.",
+ "title": "Bandeja de entrada"
+ },
+ "composer": {
+ "addTitle": "Añadir comentario",
+ "addToReview": "Añadir a la revisión",
+ "comment": "Comentario",
+ "commentBody": "Texto del comentario",
+ "commentBodyPlaceholder": "Tu comentario",
+ "commentNow": "Comentar ahora",
+ "discardMessage": "Se perderá tu borrador.",
+ "discardTitle": "¿Descartar comentario?",
+ "editTitle": "Editar comentario",
+ "insertSuggestion": "Insertar sugerencia",
+ "insertSuggestionA11y": "Insertar una sugerencia de código",
+ "loadFailedTitle": "No se pudo cargar el editor de comentarios.",
+ "ok": "ACEPTAR",
+ "unavailableMessage": "Este comentario pendiente ya se eliminó o se envió.",
+ "unavailableTitle": "Comentario no disponible",
+ "bodyEmpty": "El comentario no puede estar vacío.",
+ "suggestionsOnlyAddedLines": "Las sugerencias solo se aplican a las líneas añadidas.",
+ "tapDiffLineToSuggest": "Toca una línea de las diferencias para activar las sugerencias."
+ },
+ "connect": {
+ "checkFailedTitle": "No se pudo comprobar la conexión con GitHub.",
+ "checkFailedMessage": "No se puede consultar el estado de tu sesión hasta que termine la carga.",
+ "checkFailedTitleGitLab": "No se pudo comprobar la conexión con GitLab.",
+ "checkFailedTitleBitbucket": "No se pudo comprobar la conexión con Bitbucket.",
+ "providerCheckFailedMessage": "No se puede consultar el estado de la conexión hasta que termine la carga.",
+ "reconnectTitle": "Volver a conectar GitHub",
+ "reconnectDescription": "Se revocó tu conexión con GitHub. Vuelve a conectar tu cuenta para seguir revisando PR en el móvil.",
+ "description": "Conecta tu cuenta de GitHub para revisar PR en el móvil.",
+ "gitlabDescription": "Conecta tu cuenta de GitLab para revisar merge requests en el móvil.",
+ "bitbucketDescription": "Conecta Bitbucket a esta organización para revisar PR en el móvil.",
+ "bitbucketOrgOnlyDescription": "Selecciona una organización en tu perfil para revisar sus PR de Bitbucket."
+ },
+ "screen": {
+ "shareA11y": "Compartir PR",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Este comentario se eliminará de la cola de revisión.",
+ "deletePendingTitle": "¿Eliminar comentario pendiente?",
+ "loadFailedTitle": "No se pudo cargar el formulario de envío de la revisión.",
+ "pendingComment": "comentarios pendientes",
+ "pendingComment_other": "comentarios pendientes",
+ "pendingComment_one": "comentario pendiente",
+ "summaryOptional": "Resumen (opcional)",
+ "partialPostedMessage": "Comentarios publicados: {{displayFreshCount}}. Comentarios sobre una confirmación anterior que siguen pendientes de envío: {{displayStaleCount}}.",
+ "submitCountOfTotal": "Enviar {{displayFreshCount}} de {{displayTotalCount}} comentarios",
+ "submitReview": "Enviar revisión",
+ "pendingComment_many": "comentarios pendientes",
+ "blockedRequestChanges": "Añade un resumen o al menos un comentario para solicitar cambios.",
+ "blockedComment": "Añade un resumen o al menos un comentario para enviar una revisión con comentarios."
+ },
+ "reconnectNotice": {
+ "title": "La conexión con GitHub ha caducado.",
+ "message": "Tu conexión con GitHub ya no es válida. Vuelve a comprobarla. Si es necesario, se te pedirá que conectes tu cuenta de nuevo.",
+ "gitlabTitle": "La conexión con GitLab ha caducado.",
+ "bitbucketTitle": "La conexión con Bitbucket ha caducado.",
+ "providerMessage": "Tu conexión con {{provider}} ya no es válida. Vuelve a comprobarla. Si es necesario, se te pedirá que conectes tu cuenta de nuevo."
+ },
+ "eventChips": {
+ "comment": "Comentario",
+ "label": "Tipo de revisión",
+ "requestChanges": "Solicitar cambios"
+ },
"overview": {
"commit": "confirmaciones",
"commit_other": "confirmaciones",
@@ -2686,40 +2767,25 @@
"summaryA11y": "Resumen de la revisión",
"summaryPlaceholder": "Resumen opcional de la revisión"
},
- "pullRequestUnavailable": "PR no disponible",
- "pullRequestUnavailableDescription": "No se puede abrir esta PR. Puede que se haya eliminado, que el repositorio sea privado o que la aplicación de Kilo para GitHub no esté instalada en él.",
- "reconnectNotice": {
- "message": "Tu conexión con GitHub ya no es válida. Vuelve a comprobarla. Si es necesario, se te pedirá que conectes tu cuenta de nuevo.",
- "title": "La conexión con GitHub ha caducado."
- },
- "review": "Revisión",
- "reviewPullRequest": "Revisar PR",
- "screen": {
- "shareA11y": "Compartir PR",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "columna de diferencias vacía",
- "emptyDiffRow": "Fila de diferencias vacía",
- "newOnly": "Solo en la versión nueva: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ sin salto de línea al final del archivo",
- "oldNew": "Anterior: {{old}} | Nuevo: {{new}}",
- "oldOnly": "Solo en la versión anterior: {{text}}"
+ "tabs": {
+ "discussion": "Conversación",
+ "files": "Archivos",
+ "overview": "Resumen"
},
- "submit": {
- "deletePendingMessage": "Este comentario se eliminará de la cola de revisión.",
- "deletePendingTitle": "¿Eliminar comentario pendiente?",
- "loadFailedTitle": "No se pudo cargar el formulario de envío de la revisión.",
- "pendingComment": "comentarios pendientes",
- "pendingComment_other": "comentarios pendientes",
- "pendingComment_one": "comentario pendiente",
- "summaryOptional": "Resumen (opcional)",
- "partialPostedMessage": "Comentarios publicados: {{displayFreshCount}}. Comentarios sobre una confirmación anterior que siguen pendientes de envío: {{displayStaleCount}}.",
- "submitCountOfTotal": "Enviar {{displayFreshCount}} de {{displayTotalCount}} comentarios",
- "submitReview": "Enviar revisión",
- "pendingComment_many": "comentarios pendientes",
- "blockedRequestChanges": "Añade un resumen o al menos un comentario para solicitar cambios.",
- "blockedComment": "Añade un resumen o al menos un comentario para enviar una revisión con comentarios."
+ "terms": {
+ "pullRequest": "Solicitud de cambios",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Compartir el merge request",
+ "viewOnProvider": "Ver en {{provider}}",
+ "mergeRequestUnavailable": "Merge request no disponible",
+ "unavailableDescription": "Puede que se haya eliminado o que no tengas acceso a él.",
+ "accessDeniedMergeRequest": "No tienes permiso para ver este merge request.",
+ "couldNotLoadMergeRequest": "No se pudo cargar el merge request.",
+ "discussionAccessDenied": "No tienes permiso para ver la conversación de este merge request.",
+ "discussionUnavailableMessage": "Es posible que este merge request se haya eliminado.",
+ "noDiscussionDescription": "Este merge request aún no tiene hilos de revisión ni comentarios en la conversación.",
+ "noFilesChangedDescription": "Este merge request no contiene cambios en los archivos."
},
"fileStatus": {
"changed": "Cambiado",
@@ -2727,11 +2793,6 @@
"modified": "Modificado",
"renamed": "Renombrado"
},
- "tabs": {
- "discussion": "Conversación",
- "files": "Archivos",
- "overview": "Resumen"
- },
"diff": {
"selectedTapToChange": "Selección actual: {{label}}. Toca para cambiarla",
"tapToComment": "{{label}}, toca para comentar",
@@ -2742,7 +2803,7 @@
"emptyLine": "(vacío)"
},
"linkPasteClipboardEmpty": "El portapapeles está vacío.",
- "linkPasteNotAPullRequest": "No es un enlace a una PR de GitHub.",
+ "linkPasteNotAPullRequest": "No es un enlace a una PR o una merge request",
"announce": {
"commentPosted": "Comentario publicado",
"reviewSubmitted": "Revisión enviada",
@@ -2751,6 +2812,7 @@
"mutationError": {
"commentNotPosted": "Este comentario no se puede publicar. Puede que la línea seleccionada haya cambiado o que la PR se haya actualizado.",
"reviewNotSubmitted": "Esta revisión no se puede enviar en su estado actual. Puede que la PR haya cambiado o que no tengas permiso para revisar tu propia PR.",
+ "reviewNotSubmittedTerm": "Esta revisión no se puede enviar en su estado actual. Puede que {{term}} haya cambiado o que no tengas permiso para revisar tu propio {{term}}.",
"couldNotPostComment": "No se pudo publicar el comentario.",
"couldNotSubmitReview": "No se pudo enviar la revisión. Comprueba tu conexión e inténtalo de nuevo."
},
@@ -2758,6 +2820,7 @@
"couldNotReply": "No se pudo responder.",
"couldNotCompleteAction": "No se pudo completar esta acción.",
"mergeResultDefaultError": "GitHub no completó la fusión.",
+ "mergeResultNotCompleted": "No se ha fusionado {{term}}. Comprueba su estado e inténtalo de nuevo.",
"ambiguous": "No se pudo confirmar el resultado. Comprueba la PR antes de volver a intentarlo.",
"persistenceFailed": "No se pudo registrar esta acción. Inténtalo de nuevo más tarde.",
"forbidden": "No tienes permiso para realizar esta acción."
diff --git a/apps/mobile/src/i18n/locales/et.json b/apps/mobile/src/i18n/locales/et.json
index 165895b2d2..037fdca589 100644
--- a/apps/mobile/src/i18n/locales/et.json
+++ b/apps/mobile/src/i18n/locales/et.json
@@ -36,6 +36,7 @@
"cost": "Kulu",
"discard": "Loobu",
"findings": "Leiud",
+ "mergeRequest": "liitmistaotlus",
"notConnected": "Pole ühendatud",
"notifications": "Teavitused",
"pullRequest": "tõmbetaotlus",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Tühi rida muudatuste vaates"
},
"connectionExpired": "GitHubi ühendus aegus.",
+ "capabilities": {
+ "banner": {
+ "title": "Selle pakkuja juures pole saadaval",
+ "accessibility": "Selle pakkuja juures pole saadaval: {{reason}}"
+ }
+ },
"merge": {
"merge": "Mestimine",
"mergeNow": "Ühenda kohe",
"mergePullRequest": "Tõmbetaotluse ühendamine",
+ "mergeTermTitle": "{{term}}e ühendamine",
"enableAutoMerge": "Luba automaatne ühendamine",
"disableAutoMerge": "Keela automaatne ühendamine",
"autoMergeOn": "Automaatne ühendamine on sisse lülitatud",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Kustuta haru pärast ühendamist",
"noEnabledMethods": "Selles hoidlas pole ükski ühendamismeetod lubatud. Palu hoidla administraatoril lubada ühendamine ühendamiskommiti, kommitite koondamise või ümberbaseerimise abil.",
"confirmTitle": "Kas ühendada tõmbetaotlus?",
+ "confirmTitleTerm": "Kas ühendada {{term}}?",
"confirmMessage": "Sinu muudatused ühendatakse alusharuga.",
"enableAutoMergeConfirmTitle": "Kas lubada automaatne ühendamine?",
"enableAutoMergeConfirmMessage": "GitHub ühendab selle tõmbetaotluse automaatselt, kui kõik nõutud kontrollid on edukalt läbitud.",
+ "enableAutoMergeConfirmMessageTerm": "Kui pipeline õnnestub, liidetakse {{term}} automaatselt.",
+ "enableAutoMergeDescriptionTerm": "GitLab liidab {{term}} automaatselt, kui pipeline õnnestub.",
"forbidden": "Sul pole õigust seda tõmbetaotlust ühendada.",
"cannotMerge": "Seda tõmbetaotlust ei saa praegusel kujul ühendada.",
"couldNotMerge": "Tõmbetaotlust ei õnnestunud ühendada.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Juba ühendatud",
- "closed": "See tõmbetaotlus on suletud"
+ "closed": "See tõmbetaotlus on suletud",
+ "closedMergeRequest": "See liitmistaotlus on suletud"
},
"partialSuccessBanner": {
"body": "Haru ei õnnestunud kustutada. Põhjus: {{reason}}",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Seda tõmbetaotlust ei saa veel ühendada",
"notMergeableDetail": "GitHub teatas ühendatavuse olekust {{state}}."
},
+ "restrictions": {
+ "title": "Liitmise tingimused",
+ "approvalsRequired_one": "Vajalik on {{displayCount}} heakskiit",
+ "approvalsRequired_other": "Vajalikud on {{displayCount}} heakskiitu",
+ "pipelineMustSucceed": "Enne liitmist peab pipeline õnnestuma."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline ebaõnnestub viimase commitiga.",
+ "pendingPipeline": "Pipeline on viimase commitiga veel käimas.",
+ "permission": "Sul pole õigust seda {{term}}t ühendada.",
+ "draft": "Märgi {{term}} enne ühendamist ülevaatuseks valmis."
+ },
"methodLabels": {
"merge": "Loo ühendamiskommit",
"squash": "Koonda ja ühenda",
@@ -448,6 +472,7 @@
"acceptTerms": "Nõustu",
"replyBadRequest": "Seda vastust ei saa postitada. Lõim võis muutuda.",
"replyForbidden": "Sul pole õigust sellele tõmbetaotlusele vastata.",
+ "replyForbiddenTerm": "Sul pole õigust sellele {{term}}ele vastata.",
"moderation": {
"reportContent": {
"terminal": "Sellest kommentaarist ei saa teatada.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Vaata tõmbetaotlus üle",
"headLine": "{{counts}} · uusim kommit: {{sha}}",
"entry": {
- "eyebrow": "Ava tõmbetaotlus URL-i kaudu.",
- "pastePrLink": "Kleebi PR-i link",
- "noRecentPrs": "Hiljutisi PR-e pole",
- "noRecentPrsDescription": "Ülevaatuse alustamiseks kleebi PR-i link ülalolevale väljale — järgmisel korral leiad selle siit.",
+ "eyebrow": "Ava tõmbetaotlus või liitmistaotlus URL-i kaudu",
+ "pastePrLink": "Kleebi tõmbetaotluse või liitmistaotluse link",
+ "noRecentPrs": "Hiljutisi ülevaatusi pole",
+ "noRecentPrsDescription": "Ülevaatuse alustamiseks kleebi link ülalpool — järgmisel korral ilmub see siin.",
"couldNotLoad": "Laadimine ebaõnnestus.",
"removeFromRecentsTitle": "Kas eemaldada hiljutiste hulgast?",
- "removeFromRecentsMessage": "See tõmbetaotlus eemaldatakse sinu hiljutiste loendist.",
+ "removeFromRecentsMessage": "See ülevaatus eemaldatakse hiljutiste nimekirjast.",
"removeRecentAccessibility": "Eemalda {{repo}} hiljutiste hulgast",
- "urlAccessibility": "GitHubi tõmbetaotluse URL",
- "clearLink": "Eemalda tõmbetaotluse link",
- "pasteLink": "Kleebi tõmbetaotluse link",
+ "urlAccessibility": "Sisesta tõmbetaotluse või liitmistaotluse URL",
+ "urlPlaceholder": "Tõmbetaotluse või liitmistaotluse URL",
+ "openAccessibility": "Ava tõmbetaotlus või liitmistaotlus",
+ "clearLink": "Eemalda link",
+ "pasteLink": "Kleibi tõmbetaotluse või liitmistaotluse link",
"open": "Ava"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHubi ühendust ei õnnestunud kontrollida.",
"checkFailedMessage": "Sisselogimisolekut saab näha alles pärast laadimise lõppu.",
+ "checkFailedTitleGitLab": "GitLabi ühendust ei õnnestunud kontrollida.",
+ "checkFailedTitleBitbucket": "Bitbucketi ühendust ei õnnestunud kontrollida.",
+ "providerCheckFailedMessage": "Ühenduse olekut saab näha alles pärast laadimise lõppu.",
"reconnectTitle": "Ühenda GitHub uuesti",
"reconnectDescription": "Sinu GitHubi ühendus on tühistatud. Taasta ühendus, et jätkata tõmbetaotluste ülevaatamist mobiilis.",
- "description": "Ühenda oma GitHubi konto, et tõmbetaotlusi mobiilis üle vaadata."
+ "description": "Ühenda oma GitHubi konto, et tõmbetaotlusi mobiilis üle vaadata.",
+ "gitlabDescription": "Ühenda oma GitLab konto, et liitmistaotlusi mobiilis üle vaadata.",
+ "bitbucketDescription": "Ühenda Bitbucket selle organisatsiooniga, et tõmbetaotlusi mobiilis üle vaadata.",
+ "bitbucketOrgOnlyDescription": "Vali oma profiilis organisatsioon, et vaadata selle Bitbucketi tõmbetaotlusi."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHubi ühendus aegus.",
- "message": "Sinu GitHubi ühendus ei kehti enam. Kontrolli ühendust uuesti — vajaduse korral palutakse sul see taastada."
+ "message": "Sinu GitHubi ühendus ei kehti enam. Kontrolli ühendust uuesti — vajaduse korral palutakse sul see taastada.",
+ "gitlabTitle": "GitLabi ühendus aegus.",
+ "bitbucketTitle": "Bitbucketi ühendus aegus.",
+ "providerMessage": "Sinu {{provider}}i ühendus ei kehti enam. Kontrolli ühendust uuesti — vajaduse korral palutakse sul see taastada."
},
"eventChips": {
"comment": "Kommenteeri",
@@ -643,6 +679,21 @@
"files": "Failid",
"discussion": "Arutelu"
},
+ "terms": {
+ "pullRequest": "Tõmbetaotlus",
+ "mergeRequest": "Liitmistaotlus",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Jaga liitmistaotlust",
+ "viewOnProvider": "Kuva {{provider}}",
+ "mergeRequestUnavailable": "Liitmistaotlus pole saadaval",
+ "unavailableDescription": "See võib olla kustutatud või sul puudub ligipääs.",
+ "accessDeniedMergeRequest": "Sul pole õigust seda liitmistaotlust vaadata.",
+ "couldNotLoadMergeRequest": "Liitmistaotlust ei õnnestunud laadida.",
+ "discussionAccessDenied": "Sul puudub õigus selle liitmistaotluse arutelu vaadata.",
+ "discussionUnavailableMessage": "See liitmistaotlus võib olla eemaldatud.",
+ "noDiscussionDescription": "Selle liitmistaotluse juures pole veel ülevaatuslõime ega arutelukommentaare.",
+ "noFilesChangedDescription": "See liitmistaotlus ei sisalda failimuudatusi."
+ },
"fileStatus": {
"modified": "Muudetud",
"renamed": "Ümber nimetatud",
@@ -659,7 +710,7 @@
"emptyLine": "(tühi)"
},
"linkPasteClipboardEmpty": "Lõikelaud on tühi.",
- "linkPasteNotAPullRequest": "See pole GitHubi tõmbetaotluse link.",
+ "linkPasteNotAPullRequest": "See pole tõmbetaotluse ega liitmistaotluse link",
"announce": {
"commentPosted": "Kommentaar on postitatud",
"reviewSubmitted": "Ülevaatus on esitatud",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Seda kommentaari ei saa postitada. Valitud rida võib olla muutunud või PR-i võib olla värskendatud.",
"reviewNotSubmitted": "Seda ülevaatust ei saa praegusel kujul esitada. PR võib olla muutunud või proovid üle vaadata enda tõmbetaotlust, mis pole lubatud.",
+ "reviewNotSubmittedTerm": "Seda ülevaatust ei saa praegusel kujul esitada. {{term}} võib olla muutunud või ei tohi omaenda {{term}} üle vaadata.",
"couldNotPostComment": "Kommentaari ei õnnestunud postitada.",
"couldNotSubmitReview": "Ülevaatuse esitamine ebaõnnestus. Kontrolli ühendust ja proovi uuesti."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Vastamine ebaõnnestus.",
"couldNotCompleteAction": "Seda toimingut ei õnnestunud lõpule viia.",
"mergeResultDefaultError": "GitHub ei lõpetanud ühendamist.",
+ "mergeResultNotCompleted": "{{term}} ei liidetud. Kontrolli olekut ja proovi uuesti.",
"ambiguous": "Toimingu õnnestumist ei õnnestunud kinnitada — kontrolli PR-i enne uuesti proovimist.",
"persistenceFailed": "Seda toimingut ei õnnestunud salvestada. Proovi hiljem uuesti.",
"forbidden": "See toiming pole lubatud."
@@ -1988,11 +2041,31 @@
"retryConnection": "Proovi uuesti ühenduda"
},
"newSession": {
+ "recentlyUsed": "Hiljuti kasutatud",
+ "couldNotLoadGithubRepositories": "GitHubi hoidlate laadimine ebaõnnestus.",
+ "couldNotLoadGitlabRepositories": "GitLabi hoidlate laadimine ebaõnnestus.",
+ "couldNotLoadBitbucketRepositories": "Bitbucketi hoidlate laadimine ebaõnnestus.",
"connectGithubDescription": "Ühenda GitHub brauseris ja naase siia, et valida hoidla.",
+ "connectGitlabDescription": "Ühenda GitLab brauseris ja naase siia, et valida hoidla.",
+ "connectBitbucketDescription": "Ühenda Bitbucket brauseris ja naase siia, et valida hoidla.",
"openGithub": "Ava GitHub",
+ "openGitlab": "Ava GitLab",
+ "openBitbucket": "Ava Bitbucket",
"refreshRepositories": "Värskenda hoidlaid",
"githubConnected": "GitHub on ühendatud",
+ "gitlabConnected": "GitLab on ühendatud",
"noRepositoriesVisible": "Hoidlaid pole näha. Kontrolli, kas Kilo GitHubi rakendusel on hoidlatele juurdepääs, ja värskenda seejärel loendit.",
+ "noRepositoriesVisibleGitlab": "Hoidlaid pole näha. Kontrolli GitLabi hoidlate juurdepääsuõigusi ja värskenda seejärel loendit.",
+ "noRepositoriesVisibleBitbucket": "Hoidlaid pole näha. Kontrolli Bitbucketi hoidlate juurdepääsuõigusi ja värskenda seejärel loendit.",
+ "bitbucketOrganizationsOnly": "Bitbucket on saadaval ainult organisatsioonidele.",
+ "branchPickerTitle": "Vali haru",
+ "branchDefault": "Vaikimisi",
+ "branchAccessibility": "Haru: {{label}}",
+ "branchLoading": "Harude laadimine",
+ "branchLoadError": "Harude laadimine ebaõnnestus",
+ "branchUnavailable": "Selle hoidla harud pole saadaval. Kontrolli oma õigusi pakkujas ja vali mõni teine hoidla.",
+ "branchEmpty": "Ühtegi haru pole saadaval",
+ "branchPlaceholder": "Vali haru",
"runOnWithTarget": "Käivituskoht: {{target}}",
"environment": "Keskkond",
"couldNotLoadEnvironment": "Sinu keskkonna laadimine ebaõnnestus.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Hoidlate värskendamine ebaõnnestus. Proovi uuesti.",
"discardDraftTitle": "Kas loobuda mustandist?",
"discardDraftMessage": "Sinu viip läheb kaotsi.",
+ "discardWithUploadsMessage": "Sinu viip ja üles laaditud failid, mida pole ühegi saadetud sõnumiga seotud, kustutatakse.",
"discardFailed": "Mustandist loobumine ebaõnnestus. Proovi uuesti.",
"remoteHint": "Kohaliku kilo protsessi juhtimiseks käivita arvutis `kilo remote` või töötavas CLI-seansis `/remote`.",
- "connectBitbucketDescription": "Ühenda Bitbucket brauseris ja naase siia, et valida hoidla.",
- "connectGitlabDescription": "Ühenda GitLab brauseris ja naase siia, et valida hoidla.",
- "couldNotLoadBitbucketRepositories": "Bitbucketi hoidlate laadimine ebaõnnestus.",
- "couldNotLoadGithubRepositories": "GitHubi hoidlate laadimine ebaõnnestus.",
- "couldNotLoadGitlabRepositories": "GitLabi hoidlate laadimine ebaõnnestus.",
- "gitlabConnected": "GitLab on ühendatud",
- "noRepositoriesVisibleBitbucket": "Hoidlaid pole näha. Kontrolli Bitbucketi hoidlate juurdepääsuõigusi ja värskenda seejärel loendit.",
- "noRepositoriesVisibleGitlab": "Hoidlaid pole näha. Kontrolli GitLabi hoidlate juurdepääsuõigusi ja värskenda seejärel loendit.",
- "openBitbucket": "Ava Bitbucket",
- "openGitlab": "Ava GitLab",
- "recentlyUsed": "Hiljuti kasutatud",
- "cliCannotContinue": "See CLI ei saa seanssi jätkata. Vali Cloud Agent või mõni muu CLI.",
"continueFrom": "Jätkub seanss „{{title}}“.",
- "importFailed": "Seda seanssi ei õnnestunud importida.",
"importingSession": "Imporditakse seanssi",
- "discardWithUploadsMessage": "Sinu viip ja üles laaditud failid, mida pole ühegi saadetud sõnumiga seotud, kustutatakse."
+ "cliCannotContinue": "See CLI ei saa seanssi jätkata. Vali Cloud Agent või mõni muu CLI.",
+ "importFailed": "Seda seanssi ei õnnestunud importida."
},
"partRenderer": {
"updatedFileCount_one": "Uuendati {{displayCount}} fail.",
diff --git a/apps/mobile/src/i18n/locales/eu.json b/apps/mobile/src/i18n/locales/eu.json
index 25e8c399ab..b47831aaac 100644
--- a/apps/mobile/src/i18n/locales/eu.json
+++ b/apps/mobile/src/i18n/locales/eu.json
@@ -36,6 +36,7 @@
"cost": "Kostua",
"discard": "Baztertu",
"findings": "Antzemandako arazoak",
+ "mergeRequest": "merge-eskaera",
"notConnected": "Konektatu gabe",
"notifications": "Jakinarazpenak",
"pullRequest": "bateratze-eskaera",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Diferentzien lerro hutsa"
},
"connectionExpired": "GitHub-erako konexioa iraungi da.",
+ "capabilities": {
+ "banner": {
+ "title": "Ez dago eskuragarri hornitzaile honetan",
+ "accessibility": "Ez dago eskuragarri hornitzaile honetan: {{reason}}"
+ }
+ },
"merge": {
"merge": "Bateratzea",
"mergeNow": "Bateratu orain",
"mergePullRequest": "Bateratze-eskaera bateratzea",
+ "mergeTermTitle": "{{term}} bateratzea",
"enableAutoMerge": "Gaitu bateratze automatikoa",
"disableAutoMerge": "Desgaitu bateratze automatikoa",
"autoMergeOn": "Bateratze automatikoa gaituta",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Ezabatu adarra bateratu ondoren",
"noEnabledMethods": "Biltegi honek ez du bateratze-metodorik gaituta. Eskatu biltegiko administratzaile bati bateratze arrunta, egikaritzeak trinkotzea edo oinarria aldatzea gaitzeko.",
"confirmTitle": "Bateratze-eskaera bateratu?",
+ "confirmTitleTerm": "{{term}} bateratu?",
"confirmMessage": "Zure aldaketak oinarri-adarrean bateratuko dira.",
"enableAutoMergeConfirmTitle": "Bateratze automatikoa gaitu?",
"enableAutoMergeConfirmMessage": "GitHub-ek automatikoki bateratuko du bateratze-eskaera hau beharrezko egiaztapen guztiak gainditzen direnean.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} automatikoki bateratuko da bere pipeline-a arrakastaz osatu ondoren.",
+ "enableAutoMergeDescriptionTerm": "GitLab-ek automatikoki bateratzen du {{term}} hau, pipeline-a arrakastaz osatu ondoren.",
"forbidden": "Ez duzu baimenik bateratze-eskaera hau bateratzeko.",
"cannotMerge": "Bateratze-eskaera hau ezin da dagoen bezala bateratu.",
"couldNotMerge": "Ezin izan da bateratze-eskaera bateratu.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Dagoeneko bateratuta",
- "closed": "Bateratze-eskaera hau itxita dago"
+ "closed": "Bateratze-eskaera hau itxita dago",
+ "closedMergeRequest": "Merge-eskaera hau itxita dago"
},
"partialSuccessBanner": {
"body": "Ezin izan da adarra ezabatu: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Bateratze-eskaera hau ezin da oraindik bateratu",
"notMergeableDetail": "GitHub-ek bateratzeko egoera hau jakinarazi du: {{state}}."
},
+ "restrictions": {
+ "title": "Bateratze-murrizketak",
+ "approvalsRequired_one": "{{displayCount}} baiespen beharrezkoa",
+ "approvalsRequired_other": "{{displayCount}} baiespen beharrezkoak",
+ "pipelineMustSucceed": "Pipeline-a arrakastaz osatu behar da bateratu aurretik."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline-a huts egiten ari da azken egikaritzean.",
+ "pendingPipeline": "Pipeline-a oraindik martxan dago azken egikaritzean.",
+ "permission": "Ez duzu baimenik {{term}} hau bateratzeko.",
+ "draft": "Markatu {{term}} berrikusteko prest dagoela bateratu aurretik."
+ },
"methodLabels": {
"merge": "Sortu bateratze-egikaritze bat",
"squash": "Trinkotu eta bateratu",
@@ -448,6 +472,7 @@
"acceptTerms": "Onartu",
"replyBadRequest": "Erantzun hau ezin da argitaratu. Baliteke haria aldatu izana.",
"replyForbidden": "Ez duzu baimenik bateratze-eskaera honi erantzuteko.",
+ "replyForbiddenTerm": "Ez duzu baimenik {{term}} honi erantzuteko.",
"moderation": {
"reportContent": {
"terminal": "Iruzkin hau ezin da salatu.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Berrikusi bateratze-eskaera",
"headLine": "{{counts}} · azken egikaritzea: {{sha}}",
"entry": {
- "eyebrow": "Ireki bateratze-eskaera bat URL bidez.",
- "pastePrLink": "Itsatsi PR esteka bat",
- "noRecentPrs": "Ez dago azkenaldiko PRrik",
- "noRecentPrsDescription": "Itsatsi PR esteka bat goian berrikuspena hasteko — hemen agertuko da hurrengoan.",
+ "eyebrow": "Ireki bateratze-eskaera edo merge-eskaera bat URL bidez",
+ "pastePrLink": "Itsatsi bateratze-eskaera edo merge-eskaera baten esteka",
+ "noRecentPrs": "Ez dago azkenaldiko berrikuspenik",
+ "noRecentPrsDescription": "Itsatsi esteka bat goian berrikuspena hasteko — hemen agertuko da hurrengoan.",
"couldNotLoad": "Ezin izan da kargatu.",
"removeFromRecentsTitle": "Azkenaldikoen zerrendatik kendu?",
- "removeFromRecentsMessage": "Bateratze-eskaera hau azkenaldikoen zerrendatik kenduko da.",
+ "removeFromRecentsMessage": "Berrikuspen hau azkenaldikoen zerrendatik kenduko da.",
"removeRecentAccessibility": "Kendu {{repo}} azkenaldikoen zerrendatik",
- "urlAccessibility": "GitHub-eko bateratze-eskaeraren URLa",
- "clearLink": "Garbitu bateratze-eskaeraren esteka",
- "pasteLink": "Itsatsi bateratze-eskaeraren esteka",
+ "urlAccessibility": "Sartu bateratze-eskaera edo merge-eskaera baten URLa",
+ "urlPlaceholder": "Bateratze-eskaeraren edo merge-eskaeraren URLa",
+ "openAccessibility": "Ireki bateratze-eskaera edo merge-eskaera",
+ "clearLink": "Garbitu esteka",
+ "pasteLink": "Itsatsi bateratze-eskaeraren edo merge-eskaeraren esteka",
"open": "Ireki"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Ezin izan da GitHub-ekiko konexioa egiaztatu.",
"checkFailedMessage": "Ezin da jakin saioa hasita dagoen hau kargatu arte.",
+ "checkFailedTitleGitLab": "Ezin izan da GitLab-ekiko konexioa egiaztatu.",
+ "checkFailedTitleBitbucket": "Ezin izan da Bitbucket-ekiko konexioa egiaztatu.",
+ "providerCheckFailedMessage": "Konexio-egoera ez dago eskuragarri kargatu arte.",
"reconnectTitle": "Konektatu GitHub berriro",
"reconnectDescription": "GitHub-ekiko konexioa baliogabetu da. Konektatu berriro bateratze-eskaerak mugikorrean berrikusten jarraitzeko.",
- "description": "Konektatu zure GitHub kontua bateratze-eskaerak mugikorrean berrikusteko."
+ "description": "Konektatu zure GitHub kontua bateratze-eskaerak mugikorrean berrikusteko.",
+ "gitlabDescription": "Konektatu zure GitLab kontua merge-eskaerak mugikorrean berrikusteko.",
+ "bitbucketDescription": "Konektatu Bitbucket erakunde honetara bateratze-eskaerak mugikorrean berrikusteko.",
+ "bitbucketOrgOnlyDescription": "Hautatu erakunde bat zure profilean haren Bitbucket-eko bateratze-eskaerak berrikusteko."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub-erako konexioa iraungi da.",
- "message": "GitHub-ekiko konexioa ez da jada baliozkoa. Egiaztatu konexioa berriro; behar izanez gero, berriro konektatzeko eskatuko zaizu."
+ "message": "GitHub-ekiko konexioa ez da jada baliozkoa. Egiaztatu konexioa berriro; behar izanez gero, berriro konektatzeko eskatuko zaizu.",
+ "gitlabTitle": "GitLab-erako konexioa iraungi da.",
+ "bitbucketTitle": "Bitbucket-erako konexioa iraungi da.",
+ "providerMessage": "{{provider}}-ekiko konexioa ez da jada baliozkoa. Egiaztatu konexioa berriro; behar izanez gero, berriro konektatzeko eskatuko zaizu."
},
"eventChips": {
"comment": "Egin iruzkina",
@@ -643,6 +679,21 @@
"files": "Fitxategi",
"discussion": "Eztabaida"
},
+ "terms": {
+ "pullRequest": "Bateratze-eskaera",
+ "mergeRequest": "Merge-eskaera",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Partekatu merge-eskaera",
+ "viewOnProvider": "Ikusi {{provider}}(e)n",
+ "mergeRequestUnavailable": "Merge-eskaera ez dago eskuragarri",
+ "unavailableDescription": "Baliteke ezabatuta egotea, edo agian ez duzu sarbiderik.",
+ "accessDeniedMergeRequest": "Ez duzu baimenik merge-eskaera hau ikusteko.",
+ "couldNotLoadMergeRequest": "Ezin izan da merge-eskaera kargatu.",
+ "discussionAccessDenied": "Ez duzu baimenik merge-eskaera honen eztabaida ikusteko.",
+ "discussionUnavailableMessage": "Baliteke merge-eskaera hau kendu izana.",
+ "noDiscussionDescription": "Merge-eskaera honetan ez dago berrikuspen-haririk, ezta elkarrizketako iruzkinik ere.",
+ "noFilesChangedDescription": "Merge-eskaera honek ez du fitxategi-aldaketarik."
+ },
"fileStatus": {
"modified": "Aldatuta",
"renamed": "Berrizendatuta",
@@ -659,7 +710,7 @@
"emptyLine": "(hutsik)"
},
"linkPasteClipboardEmpty": "Arbela hutsik dago.",
- "linkPasteNotAPullRequest": "Ez da GitHub-eko bateratze-eskaera baten esteka.",
+ "linkPasteNotAPullRequest": "Ez da bateratze-eskaera edo merge-eskaera baten esteka",
"announce": {
"commentPosted": "Iruzkina argitaratuta",
"reviewSubmitted": "Berrikuspena bidalita",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Iruzkin hau ezin da argitaratu. Baliteke hautatutako lerroa aldatu izana edo PR-a eguneratu izana.",
"reviewNotSubmitted": "Berrikuspen hau ezin da dagoen bezala bidali. Baliteke PRa aldatu izana edo zure bateratze-eskaera berrikusten aritzea, eta hori ez dago baimenduta.",
+ "reviewNotSubmittedTerm": "Berrikuspen hau ezin da oraingo egoeran bidali. Baliteke {{term}} aldatu izana, edo ezin duzu zure {{term}} propioa berrikusi.",
"couldNotPostComment": "Ezin izan da iruzkina argitaratu.",
"couldNotSubmitReview": "Ezin izan da berrikuspena bidali. Egiaztatu konexioa eta saiatu berriro."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Ezin izan da erantzun.",
"couldNotCompleteAction": "Ezin izan da ekintza hau amaitu.",
"mergeResultDefaultError": "GitHub-ek ez du bateratzea amaitu.",
+ "mergeResultNotCompleted": "{{term}} ez da bateratu. Egiaztatu egoera eta saiatu berriro.",
"ambiguous": "Ezin izan da berretsi — egiaztatu PR-a berriro saiatu aurretik.",
"persistenceFailed": "Ezin izan dugu ekintza hau erregistratu. Saiatu berriro geroago.",
"forbidden": "Ez dago baimenduta."
@@ -1988,11 +2041,31 @@
"retryConnection": "Saiatu berriro konektatzen"
},
"newSession": {
+ "recentlyUsed": "Duela gutxi erabiliak",
+ "couldNotLoadGithubRepositories": "Ezin izan dira GitHub-eko biltegiak kargatu.",
+ "couldNotLoadGitlabRepositories": "Ezin izan dira GitLab-eko biltegiak kargatu.",
+ "couldNotLoadBitbucketRepositories": "Ezin izan dira Bitbucket-eko biltegiak kargatu.",
"connectGithubDescription": "Konektatu GitHub zure nabigatzailean, eta gero itzuli hona biltegi bat aukeratzeko.",
+ "connectGitlabDescription": "Konektatu GitLab zure nabigatzailean, eta gero itzuli hona biltegi bat aukeratzeko.",
+ "connectBitbucketDescription": "Konektatu Bitbucket zure nabigatzailean, eta gero itzuli hona biltegi bat aukeratzeko.",
"openGithub": "Ireki GitHub",
+ "openGitlab": "Ireki GitLab",
+ "openBitbucket": "Ireki Bitbucket",
"refreshRepositories": "Freskatu biltegien zerrenda",
"githubConnected": "GitHub konektatuta",
+ "gitlabConnected": "GitLab konektatuta",
"noRepositoriesVisible": "Ez dago biltegirik ikusgai. Egiaztatu Kilo-ren GitHub aplikazioak biltegietarako sarbidea duela, eta gero freskatu zerrenda.",
+ "noRepositoriesVisibleGitlab": "Ez dago biltegirik ikusgai. Egiaztatu GitLab-ek biltegietarako sarbidea duela, eta gero freskatu zerrenda.",
+ "noRepositoriesVisibleBitbucket": "Ez dago biltegirik ikusgai. Egiaztatu Bitbucket-ek biltegietarako sarbidea duela, eta gero freskatu zerrenda.",
+ "bitbucketOrganizationsOnly": "Bitbucket erakundeei bakarrik dago eskuragarri.",
+ "branchPickerTitle": "Hautatu adarra",
+ "branchDefault": "Lehenetsia",
+ "branchAccessibility": "Adarra: {{label}}",
+ "branchLoading": "Adarrak kargatzen",
+ "branchLoadError": "Ezin izan dira adarrak kargatu",
+ "branchUnavailable": "Ez dago adarrik eskuragarri biltegi honetarako. Egiaztatu hornitzailearekin duzun sarbidea eta hautatu beste biltegi bat.",
+ "branchEmpty": "Ez dago adarrik eskuragarri",
+ "branchPlaceholder": "Hautatu adar bat",
"runOnWithTarget": "Exekutatu honetan: {{target}}",
"environment": "Ingurunea",
"couldNotLoadEnvironment": "Ezin izan da zure ingurunea kargatu.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Ezin izan da biltegien zerrenda freskatu. Saiatu berriro.",
"discardDraftTitle": "Baztertu zirriborroa?",
"discardDraftMessage": "Zure eskaera galduko da.",
+ "discardWithUploadsMessage": "Zure eskaera eta igotako fitxategietatik mezuei erantsi gabe geratu direnak ezabatuko dira.",
"discardFailed": "Ezin izan da zirriborroa baztertu. Saiatu berriro.",
"remoteHint": "Exekutatu `kilo remote` zure ordenagailuan, edo `/remote` exekutatzen ari den CLI saio batean, tokiko kilo prozesu bat kontrolatzeko.",
- "connectBitbucketDescription": "Konektatu Bitbucket zure nabigatzailean, eta gero itzuli hona biltegi bat aukeratzeko.",
- "connectGitlabDescription": "Konektatu GitLab zure nabigatzailean, eta gero itzuli hona biltegi bat aukeratzeko.",
- "couldNotLoadBitbucketRepositories": "Ezin izan dira Bitbucket-eko biltegiak kargatu.",
- "couldNotLoadGithubRepositories": "Ezin izan dira GitHub-eko biltegiak kargatu.",
- "couldNotLoadGitlabRepositories": "Ezin izan dira GitLab-eko biltegiak kargatu.",
- "gitlabConnected": "GitLab konektatuta",
- "noRepositoriesVisibleBitbucket": "Ez dago biltegirik ikusgai. Egiaztatu Bitbucket-ek biltegietarako sarbidea duela, eta gero freskatu zerrenda.",
- "noRepositoriesVisibleGitlab": "Ez dago biltegirik ikusgai. Egiaztatu GitLab-ek biltegietarako sarbidea duela, eta gero freskatu zerrenda.",
- "openBitbucket": "Ireki Bitbucket",
- "openGitlab": "Ireki GitLab",
- "recentlyUsed": "Duela gutxi erabiliak",
- "cliCannotContinue": "CLI honek ezin dio saio bati jarraitu. Aukeratu Cloud Agent edo beste CLI bat.",
"continueFrom": "Saio honekin jarraitzen ari zara: {{title}}.",
- "importFailed": "Ezin izan da saio hau inportatu.",
"importingSession": "Saioa inportatzen",
- "discardWithUploadsMessage": "Zure eskaera eta igotako fitxategietatik mezuei erantsi gabe geratu direnak ezabatuko dira."
+ "cliCannotContinue": "CLI honek ezin dio saio bati jarraitu. Aukeratu Cloud Agent edo beste CLI bat.",
+ "importFailed": "Ezin izan da saio hau inportatu."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} fitxategi eguneratu da.",
diff --git a/apps/mobile/src/i18n/locales/fa.json b/apps/mobile/src/i18n/locales/fa.json
index fab53bb195..28a0d11cba 100644
--- a/apps/mobile/src/i18n/locales/fa.json
+++ b/apps/mobile/src/i18n/locales/fa.json
@@ -36,6 +36,7 @@
"cost": "هزینه",
"discard": "کنار گذاشتن",
"findings": "یافتهها",
+ "mergeRequest": "درخواست ادغام",
"notConnected": "متصل نیست",
"notifications": "اعلانها",
"pullRequest": "پول ریکوئست",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ردیف خالی در نمایش تغییرات"
},
"connectionExpired": "اعتبار اتصال به GitHub تمام شده است.",
+ "capabilities": {
+ "banner": {
+ "title": "در این ارائهدهنده در دسترس نیست",
+ "accessibility": "در این ارائهدهنده در دسترس نیست: {{reason}}"
+ }
+ },
"merge": {
"merge": "ادغام",
"mergeNow": "ادغام فوری",
"mergePullRequest": "ادغام درخواست",
+ "mergeTermTitle": "ادغام {{term}}",
"enableAutoMerge": "فعالسازی ادغام خودکار",
"disableAutoMerge": "غیرفعالسازی ادغام خودکار",
"autoMergeOn": "ادغام خودکار فعال است",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "حذف شاخه پس از ادغام",
"noEnabledMethods": "هیچ روش ادغامی برای این مخزن فعال نیست. از مدیر مخزن بخواهید ادغام معمولی، اسکواش یا ریبیس را فعال کند.",
"confirmTitle": "درخواست ادغام شود؟",
+ "confirmTitleTerm": "{{term}} ادغام شود؟",
"confirmMessage": "این کار تغییرات شما را در شاخهٔ پایه ادغام میکند.",
"enableAutoMergeConfirmTitle": "ادغام خودکار فعال شود؟",
"enableAutoMergeConfirmMessage": "پس از موفقیت همهٔ بررسیهای الزامی، GitHub این درخواست ادغام را بهطور خودکار ادغام میکند.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} پس از موفقیت خط لوله بهطور خودکار ادغام میشود.",
+ "enableAutoMergeDescriptionTerm": "GitLab این {{term}} را پس از موفقیت خط لوله بهطور خودکار ادغام میکند.",
"forbidden": "اجازهٔ ادغام این درخواست را ندارید.",
"cannotMerge": "این درخواست در وضعیت فعلی قابل ادغام نیست.",
"couldNotMerge": "ادغام درخواست ممکن نشد.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "قبلاً ادغام شده",
- "closed": "این درخواست ادغام بسته شده است"
+ "closed": "این درخواست ادغام بسته شده است",
+ "closedMergeRequest": "این درخواست ادغام بسته شده است"
},
"partialSuccessBanner": {
"body": "حذف شاخه ممکن نشد: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "این درخواست هنوز قابل ادغام نیست",
"notMergeableDetail": "GitHub وضعیت ادغامپذیری {{state}} را گزارش کرده است."
},
+ "restrictions": {
+ "title": "محدودیتهای ادغام",
+ "approvalsRequired_one": "به {{displayCount}} تأیید نیاز است",
+ "approvalsRequired_other": "به {{displayCount}} تأیید نیاز است",
+ "pipelineMustSucceed": "خط لوله باید پیش از ادغام موفق باشد."
+ },
+ "providerBlocked": {
+ "failingPipeline": "خط لوله در آخرین کامیت ناموفق است.",
+ "pendingPipeline": "خط لوله هنوز در آخرین کامیت در حال اجرا است.",
+ "permission": "اجازهٔ ادغام این {{term}} را ندارید.",
+ "draft": "پیش از ادغام، {{term}} را بهعنوان آمادهٔ بازبینی علامتگذاری کنید."
+ },
"methodLabels": {
"merge": "ایجاد کامیت ادغام",
"squash": "اسکواش و ادغام",
@@ -448,6 +472,7 @@
"acceptTerms": "پذیرش",
"replyBadRequest": "این پاسخ قابل ارسال نیست. ممکن است گفتوگو تغییر کرده باشد.",
"replyForbidden": "اجازهٔ پاسخ دادن در این درخواست ادغام را ندارید.",
+ "replyForbiddenTerm": "اجازهٔ پاسخ دادن در این {{term}} را ندارید.",
"moderation": {
"reportContent": {
"terminal": "این نظر قابل گزارش نیست.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "بازبینی درخواست ادغام",
"headLine": "{{counts}} · آخرین کامیت {{sha}}",
"entry": {
- "eyebrow": "درخواست ادغام را با URL باز کنید.",
- "pastePrLink": "جایگذاری پیوند PR",
- "noRecentPrs": "هنوز PR اخیری وجود ندارد",
- "noRecentPrsDescription": "برای شروع بازبینی، پیوند یک PR را در بالا جایگذاری کنید. دفعهٔ بعد، آن PR اینجا نمایش داده میشود.",
+ "eyebrow": "یک پول ریکوئست یا درخواست ادغام را با URL باز کنید.",
+ "pastePrLink": "پیوند پول ریکوئست یا درخواست ادغام را جایگذاری کنید",
+ "noRecentPrs": "بازبینی اخیری وجود ندارد",
+ "noRecentPrsDescription": "برای شروع بازبینی، پیوندی را در بالا جایگذاری کنید. دفعهٔ بعد، اینجا نمایش داده میشود.",
"couldNotLoad": "بارگذاری ممکن نشد.",
"removeFromRecentsTitle": "از موارد اخیر حذف شود؟",
- "removeFromRecentsMessage": "این درخواست ادغام از فهرست موارد اخیر شما حذف میشود.",
+ "removeFromRecentsMessage": "این بازبینی از فهرست موارد اخیر شما حذف میشود.",
"removeRecentAccessibility": "حذف {{repo}} از موارد اخیر",
- "urlAccessibility": "URL درخواست ادغام در GitHub",
- "clearLink": "پاک کردن پیوند درخواست ادغام",
- "pasteLink": "جایگذاری پیوند درخواست ادغام",
+ "urlAccessibility": "URL پول ریکوئست یا درخواست ادغام را وارد کنید",
+ "urlPlaceholder": "URL پول ریکوئست یا درخواست ادغام",
+ "openAccessibility": "باز کردن پول ریکوئست یا درخواست ادغام",
+ "clearLink": "پاک کردن پیوند",
+ "pasteLink": "پیوند پول ریکوئست یا درخواست ادغام را جایگذاری کنید",
"open": "باز"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "بررسی اتصال به GitHub ممکن نشد.",
"checkFailedMessage": "وضعیت ورود تا بارگذاری این بخش در دسترس نیست.",
+ "checkFailedTitleGitLab": "بررسی اتصال به GitLab ممکن نشد.",
+ "checkFailedTitleBitbucket": "بررسی اتصال به Bitbucket ممکن نشد.",
+ "providerCheckFailedMessage": "وضعیت اتصال تا بارگذاری در دسترس نیست.",
"reconnectTitle": "اتصال مجدد به GitHub",
"reconnectDescription": "مجوز اتصال شما به GitHub لغو شده است. برای ادامهٔ بازبینی درخواستهای ادغام در موبایل، دوباره متصل شوید.",
- "description": "برای بازبینی درخواستهای ادغام در موبایل، حساب GitHub خود را متصل کنید."
+ "description": "برای بازبینی درخواستهای ادغام در موبایل، حساب GitHub خود را متصل کنید.",
+ "gitlabDescription": "حساب GitLab خود را وصل کنید تا درخواستهای ادغام را در موبایل بازبینی کنید.",
+ "bitbucketDescription": "Bitbucket را به این سازمان وصل کنید تا پول ریکوئستها را در موبایل بازبینی کنید.",
+ "bitbucketOrgOnlyDescription": "یک سازمان در نمایه خود انتخاب کنید تا پول ریکوئستهای Bitbucket آن را بازبینی کنید."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "اعتبار اتصال به GitHub تمام شده است.",
- "message": "اتصال شما به GitHub دیگر معتبر نیست. آن را دوباره بررسی کنید. در صورت نیاز، از شما خواسته میشود دوباره متصل شوید."
+ "message": "اتصال شما به GitHub دیگر معتبر نیست. آن را دوباره بررسی کنید. در صورت نیاز، از شما خواسته میشود دوباره متصل شوید.",
+ "gitlabTitle": "اعتبار اتصال به GitLab تمام شده است.",
+ "bitbucketTitle": "اعتبار اتصال به Bitbucket تمام شده است.",
+ "providerMessage": "اتصال شما به {{provider}} دیگر معتبر نیست. آن را دوباره بررسی کنید. در صورت نیاز، از شما خواسته میشود دوباره متصل شوید."
},
"eventChips": {
"comment": "نظر",
@@ -643,6 +679,21 @@
"files": "فایل",
"discussion": "گفتوگو"
},
+ "terms": {
+ "pullRequest": "پول ریکوئست",
+ "mergeRequest": "درخواست ادغام",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "اشتراکگذاری درخواست ادغام",
+ "viewOnProvider": "مشاهده در {{provider}}",
+ "mergeRequestUnavailable": "درخواست ادغام در دسترس نیست",
+ "unavailableDescription": "ممکن است حذف شده باشد، یا شاید دسترسی به آن نداشته باشید.",
+ "accessDeniedMergeRequest": "اجازهٔ مشاهدهٔ این درخواست ادغام را ندارید.",
+ "couldNotLoadMergeRequest": "بارگذاری درخواست ادغام ممکن نشد.",
+ "discussionAccessDenied": "اجازهٔ مشاهدهٔ گفتوگوی این درخواست ادغام را ندارید.",
+ "discussionUnavailableMessage": "ممکن است این درخواست ادغام حذف شده باشد.",
+ "noDiscussionDescription": "هنوز هیچ گفتوگوی بازبینی یا نظری در این درخواست ادغام ثبت نشده است.",
+ "noFilesChangedDescription": "در این درخواست ادغام هیچ فایلی تغییر نکرده است."
+ },
"fileStatus": {
"modified": "تغییریافته",
"renamed": "تغییرنامیافته",
@@ -659,7 +710,7 @@
"emptyLine": "(خالی)"
},
"linkPasteClipboardEmpty": "کلیپبورد خالی است.",
- "linkPasteNotAPullRequest": "این پیوند مربوط به درخواست ادغام در GitHub نیست.",
+ "linkPasteNotAPullRequest": "این پیوند مربوط به پول ریکوئست یا درخواست ادغام نیست.",
"announce": {
"commentPosted": "نظر ارسال شد",
"reviewSubmitted": "بازبینی ارسال شد",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "این نظر قابل ارسال نیست. ممکن است خط انتخابشده تغییر کرده باشد یا PR بهروزرسانی شده باشد.",
"reviewNotSubmitted": "این بازبینی در وضعیت فعلی قابل ارسال نیست. ممکن است PR تغییر کرده باشد یا اجازهٔ بازبینی درخواست ادغام خودتان را نداشته باشید.",
+ "reviewNotSubmittedTerm": "این بازبینی به همین شکل قابل ارسال نیست. ممکن است {{term}} تغییر کرده باشد، یا نتوانید {{term}} خود را بازبینی کنید.",
"couldNotPostComment": "ارسال نظر ممکن نشد.",
"couldNotSubmitReview": "ارسال بازبینی ممکن نشد. اتصال خود را بررسی کنید و دوباره تلاش کنید."
},
@@ -675,6 +727,7 @@
"couldNotReply": "ارسال پاسخ ناموفق بود.",
"couldNotCompleteAction": "انجام این کار ممکن نشد.",
"mergeResultDefaultError": "GitHub ادغام را تکمیل نکرد.",
+ "mergeResultNotCompleted": "{{term}} ادغام نشد. وضعیت آن را بررسی کنید و دوباره تلاش کنید.",
"ambiguous": "تأیید نتیجه ممکن نشد. پیش از تلاش مجدد، PR را بررسی کنید.",
"persistenceFailed": "نتوانستیم این اقدام را ثبت کنیم. لطفاً بعداً دوباره تلاش کنید.",
"forbidden": "اجازهٔ انجام این کار را ندارید."
@@ -1988,11 +2041,31 @@
"retryConnection": "تلاش دوباره برای اتصال"
},
"newSession": {
+ "recentlyUsed": "موارد استفادهشدهٔ اخیر",
+ "couldNotLoadGithubRepositories": "بارگذاری مخزنهای GitHub ممکن نشد.",
+ "couldNotLoadGitlabRepositories": "بارگذاری مخزنهای GitLab ممکن نشد.",
+ "couldNotLoadBitbucketRepositories": "بارگذاری مخزنهای Bitbucket ممکن نشد.",
"connectGithubDescription": "حساب GitHub خود را از طریق مرورگر متصل کنید، سپس برای انتخاب مخزن به اینجا برگردید.",
+ "connectGitlabDescription": "حساب GitLab خود را از طریق مرورگر متصل کنید، سپس برای انتخاب مخزن به اینجا برگردید.",
+ "connectBitbucketDescription": "حساب Bitbucket خود را از طریق مرورگر متصل کنید، سپس برای انتخاب مخزن به اینجا برگردید.",
"openGithub": "باز کردن GitHub",
+ "openGitlab": "باز کردن GitLab",
+ "openBitbucket": "باز کردن Bitbucket",
"refreshRepositories": "تازهسازی مخزنها",
"githubConnected": "اتصال به GitHub برقرار است",
+ "gitlabConnected": "اتصال به GitLab برقرار است",
"noRepositoriesVisible": "هیچ مخزنی نمایش داده نمیشود. دسترسی برنامهٔ Kilo در GitHub به مخزنها را بررسی کنید، سپس فهرست را تازهسازی کنید.",
+ "noRepositoriesVisibleGitlab": "هیچ مخزنی نمایش داده نمیشود. دسترسی به مخزنهای GitLab را بررسی کنید، سپس فهرست را تازهسازی کنید.",
+ "noRepositoriesVisibleBitbucket": "هیچ مخزنی نمایش داده نمیشود. دسترسی به مخزنهای Bitbucket را بررسی کنید، سپس فهرست را تازهسازی کنید.",
+ "bitbucketOrganizationsOnly": "Bitbucket فقط برای سازمانها در دسترس است.",
+ "branchPickerTitle": "انتخاب شاخه",
+ "branchDefault": "پیشفرض",
+ "branchAccessibility": "شاخه: {{label}}",
+ "branchLoading": "در حال بارگذاری شاخهها",
+ "branchLoadError": "شاخهها بارگذاری نشدند",
+ "branchUnavailable": "شاخهها برای این مخزن در دسترس نیستند. دسترسی خود را با ارائهدهنده بررسی کنید، سپس مخزن دیگری را انتخاب کنید.",
+ "branchEmpty": "هیچ شاخهای در دسترس نیست",
+ "branchPlaceholder": "یک شاخه انتخاب کنید",
"runOnWithTarget": "اجرا روی: {{target}}",
"environment": "محیط",
"couldNotLoadEnvironment": "بارگذاری محیط شما ممکن نشد.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "تازهسازی مخزنها ممکن نشد. لطفاً دوباره تلاش کنید.",
"discardDraftTitle": "پیشنویس حذف شود؟",
"discardDraftMessage": "متن پیام شما حذف میشود.",
+ "discardWithUploadsMessage": "متن پیام شما و فایلهای آپلودشدهای که به هیچ پیام ارسالی پیوست نشدهاند، حذف میشوند.",
"discardFailed": "حذف پیشنویس ممکن نشد. لطفاً دوباره تلاش کنید.",
"remoteHint": "برای کنترل یک فرایند محلی kilo، دستور `kilo remote` را روی رایانهٔ خود یا دستور `/remote` را در یک نشست فعال CLI اجرا کنید.",
- "connectBitbucketDescription": "حساب Bitbucket خود را از طریق مرورگر متصل کنید، سپس برای انتخاب مخزن به اینجا برگردید.",
- "connectGitlabDescription": "حساب GitLab خود را از طریق مرورگر متصل کنید، سپس برای انتخاب مخزن به اینجا برگردید.",
- "couldNotLoadBitbucketRepositories": "بارگذاری مخزنهای Bitbucket ممکن نشد.",
- "couldNotLoadGithubRepositories": "بارگذاری مخزنهای GitHub ممکن نشد.",
- "couldNotLoadGitlabRepositories": "بارگذاری مخزنهای GitLab ممکن نشد.",
- "gitlabConnected": "اتصال به GitLab برقرار است",
- "noRepositoriesVisibleBitbucket": "هیچ مخزنی نمایش داده نمیشود. دسترسی به مخزنهای Bitbucket را بررسی کنید، سپس فهرست را تازهسازی کنید.",
- "noRepositoriesVisibleGitlab": "هیچ مخزنی نمایش داده نمیشود. دسترسی به مخزنهای GitLab را بررسی کنید، سپس فهرست را تازهسازی کنید.",
- "openBitbucket": "باز کردن Bitbucket",
- "openGitlab": "باز کردن GitLab",
- "recentlyUsed": "موارد استفادهشدهٔ اخیر",
- "cliCannotContinue": "این CLI نمیتواند یک نشست را ادامه دهد. Cloud Agent یا CLI دیگری را انتخاب کنید.",
"continueFrom": "نشست {{title}} را ادامه میدهید.",
- "importFailed": "وارد کردن این نشست ممکن نشد.",
"importingSession": "در حال وارد کردن نشست",
- "discardWithUploadsMessage": "متن پیام شما و فایلهای آپلودشدهای که به هیچ پیام ارسالی پیوست نشدهاند، حذف میشوند."
+ "cliCannotContinue": "این CLI نمیتواند یک نشست را ادامه دهد. Cloud Agent یا CLI دیگری را انتخاب کنید.",
+ "importFailed": "وارد کردن این نشست ممکن نشد."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} فایل بهروزرسانی شد.",
diff --git a/apps/mobile/src/i18n/locales/fi.json b/apps/mobile/src/i18n/locales/fi.json
index 0ecb4870ee..717abcda99 100644
--- a/apps/mobile/src/i18n/locales/fi.json
+++ b/apps/mobile/src/i18n/locales/fi.json
@@ -36,6 +36,7 @@
"cost": "Kustannus",
"discard": "Hylkää",
"findings": "Havainnot",
+ "mergeRequest": "yhdistämispyyntö",
"notConnected": "Ei yhdistetty",
"notifications": "Ilmoitukset",
"pullRequest": "muutospyyntö",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Tyhjä muutosvertailun rivi"
},
"connectionExpired": "GitHub-yhteys on vanhentunut.",
+ "capabilities": {
+ "banner": {
+ "title": "Ei ole käytettävissä tämän palveluntarjoajan kanssa",
+ "accessibility": "Ei ole käytettävissä tämän palveluntarjoajan kanssa: {{reason}}"
+ }
+ },
"merge": {
"merge": "Yhdistäminen",
"mergeNow": "Yhdistä nyt",
"mergePullRequest": "Muutospyynnön yhdistäminen",
+ "mergeTermTitle": "Yhdistä {{term}}",
"enableAutoMerge": "Ota automaattinen yhdistäminen käyttöön",
"disableAutoMerge": "Poista automaattinen yhdistäminen käytöstä",
"autoMergeOn": "Automaattinen yhdistäminen käytössä",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Poista haara yhdistämisen jälkeen",
"noEnabledMethods": "Tässä tietovarastossa ei ole käytössä yhtään yhdistämismenetelmää. Pyydä tietovaraston ylläpitäjää sallimaan yhdistäminen yhdistämistallennuksella, tiivistämällä tai uudelleenperustamalla.",
"confirmTitle": "Yhdistetäänkö muutospyyntö?",
+ "confirmTitleTerm": "Yhdistetäänkö {{term}}?",
"confirmMessage": "Muutoksesi yhdistetään kohdehaaraan.",
"enableAutoMergeConfirmTitle": "Otetaanko automaattinen yhdistäminen käyttöön?",
"enableAutoMergeConfirmMessage": "GitHub yhdistää tämän muutospyynnön automaattisesti, kun kaikki pakolliset tarkistukset onnistuvat.",
+ "enableAutoMergeConfirmMessageTerm": "Kun pipeline onnistuu, {{term}} yhdistetään automaattisesti.",
+ "enableAutoMergeDescriptionTerm": "GitLab yhdistää {{term}} automaattisesti, kun pipeline onnistuu.",
"forbidden": "Sinulla ei ole oikeutta yhdistää tätä muutospyyntöä.",
"cannotMerge": "Tätä muutospyyntöä ei voi yhdistää sellaisenaan.",
"couldNotMerge": "Muutospyyntöä ei voitu yhdistää.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Jo yhdistetty",
- "closed": "Muutospyyntö suljettu"
+ "closed": "Muutospyyntö suljettu",
+ "closedMergeRequest": "Yhdistämispyyntö suljettu"
},
"partialSuccessBanner": {
"body": "Haaraa ei voitu poistaa: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Tätä muutospyyntöä ei voi vielä yhdistää",
"notMergeableDetail": "GitHub ilmoitti yhdistettävyyden tilaksi {{state}}."
},
+ "restrictions": {
+ "title": "Yhdistämisen ehdot",
+ "approvalsRequired_one": "Vaaditaan {{displayCount}} hyväksyntä",
+ "approvalsRequired_other": "Vaaditaan {{displayCount}} hyväksyntää",
+ "pipelineMustSucceed": "Pipelinen on oltava onnistunut ennen yhdistämistä."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline epäonnistuu viimeisimmässä commitissa.",
+ "pendingPipeline": "Pipeline on vielä käynnissä viimeisimmässä commitissa.",
+ "permission": "Sinulla ei ole oikeutta yhdistää tätä {{term}}ä.",
+ "draft": "Merkitse {{term}} valmiiksi katselmointiin ennen yhdistämistä."
+ },
"methodLabels": {
"merge": "Luo yhdistämistallennus",
"squash": "Tiivistä ja yhdistä",
@@ -448,6 +472,7 @@
"acceptTerms": "Hyväksy",
"replyBadRequest": "Tätä vastausta ei voi julkaista. Ketju on voinut muuttua.",
"replyForbidden": "Sinulla ei ole oikeutta vastata tähän muutospyyntöön.",
+ "replyForbiddenTerm": "Sinulla ei ole oikeutta vastata tähän {{term}}ön.",
"moderation": {
"reportContent": {
"terminal": "Tätä kommenttia ei voi ilmiantaa.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Katselmoi muutospyyntö",
"headLine": "{{counts}} · uusin muutostallennus {{sha}}",
"entry": {
- "eyebrow": "Avaa muutospyyntö URL-osoitteella.",
- "pastePrLink": "Liitä PR-linkki",
- "noRecentPrs": "Ei viimeaikaisia PR:iä",
- "noRecentPrsDescription": "Aloita katselmointi liittämällä PR-linkki yllä olevaan kenttään. PR näkyy tässä seuraavalla kerralla.",
+ "eyebrow": "Avaa muutospyyntö tai yhdistämispyyntö URL-osoitteella",
+ "pastePrLink": "Liitä muutospyynnön tai yhdistämispyynnön linkki",
+ "noRecentPrs": "Ei viimeaikaisia katselmointeja",
+ "noRecentPrsDescription": "Aloita katselmointi liittämällä linkki yllä olevaan kenttään — se näkyy tässä seuraavalla kerralla.",
"couldNotLoad": "Lataus epäonnistui.",
"removeFromRecentsTitle": "Poistetaanko viimeksi avatuista?",
- "removeFromRecentsMessage": "Tämä muutospyyntö poistetaan viimeksi avattujen luettelosta.",
+ "removeFromRecentsMessage": "Tämä katselmointi poistetaan viimeisimmistä.",
"removeRecentAccessibility": "Poista {{repo}} viimeksi avatuista",
- "urlAccessibility": "GitHub-muutospyynnön URL-osoite",
- "clearLink": "Tyhjennä muutospyynnön linkki",
- "pasteLink": "Liitä muutospyynnön linkki",
+ "urlAccessibility": "Anna muutospyynnön tai yhdistämispyynnön URL-osoite",
+ "urlPlaceholder": "Muutospyynnön tai yhdistämispyynnön URL-osoite",
+ "openAccessibility": "Avaa muutospyyntö tai yhdistämispyyntö",
+ "clearLink": "Tyhjennä linkki",
+ "pasteLink": "Liitä muutospyynnön tai yhdistämispyynnön linkki",
"open": "Avaa"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub-yhteyttä ei voitu tarkistaa.",
"checkFailedMessage": "Kirjautumisen tila ei ole saatavilla, ennen kuin lataus valmistuu.",
+ "checkFailedTitleGitLab": "GitLab-yhteyttä ei voitu tarkistaa.",
+ "checkFailedTitleBitbucket": "Bitbucket-yhteyttä ei voitu tarkistaa.",
+ "providerCheckFailedMessage": "Yhteyden tila näkyy vasta latauksen valmistuttua.",
"reconnectTitle": "Yhdistä GitHub uudelleen",
"reconnectDescription": "GitHub-yhteytesi käyttöoikeus on peruttu. Yhdistä uudelleen, jotta voit jatkaa muutospyyntöjen katselmointia mobiililaitteella.",
- "description": "Yhdistä GitHub-tilisi, niin voit katselmoida muutospyyntöjä mobiililaitteella."
+ "description": "Yhdistä GitHub-tilisi, niin voit katselmoida muutospyyntöjä mobiililaitteella.",
+ "gitlabDescription": "Yhdistä GitLab-tilisi, niin voit katselmoida yhdistämispyyntöjä mobiililaitteella.",
+ "bitbucketDescription": "Yhdistä Bitbucket tähän organisaatioon, niin voit katselmoida muutospyyntöjä mobiililaitteella.",
+ "bitbucketOrgOnlyDescription": "Valitse profiilissasi organisaatio, niin voit katselmoida sen Bitbucket-muutospyyntöjä."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub-yhteys on vanhentunut.",
- "message": "GitHub-yhteytesi ei ole enää voimassa. Tarkista yhteys uudelleen. Sinua pyydetään tarvittaessa muodostamaan yhteys uudelleen."
+ "message": "GitHub-yhteytesi ei ole enää voimassa. Tarkista yhteys uudelleen. Sinua pyydetään tarvittaessa muodostamaan yhteys uudelleen.",
+ "gitlabTitle": "GitLab-yhteys on vanhentunut.",
+ "bitbucketTitle": "Bitbucket-yhteys on vanhentunut.",
+ "providerMessage": "{{provider}}-yhteytesi ei ole enää voimassa. Tarkista yhteys uudelleen. Sinua pyydetään tarvittaessa muodostamaan yhteys uudelleen."
},
"eventChips": {
"comment": "Kommentoi",
@@ -643,6 +679,21 @@
"files": "Tiedostot",
"discussion": "Keskustelu"
},
+ "terms": {
+ "pullRequest": "Muutospyyntö",
+ "mergeRequest": "Yhdistämispyyntö",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Jaa yhdistämispyyntö",
+ "viewOnProvider": "Näytä palvelussa {{provider}}",
+ "mergeRequestUnavailable": "Yhdistämispyyntö ei ole käytettävissä",
+ "unavailableDescription": "Se on voitu poistaa, tai sinulla ei ole siihen pääsyä.",
+ "accessDeniedMergeRequest": "Sinulla ei ole oikeutta tarkastella tätä yhdistämispyyntöä.",
+ "couldNotLoadMergeRequest": "Yhdistämispyyntöä ei voitu ladata.",
+ "discussionAccessDenied": "Sinulla ei ole oikeutta tarkastella tämän yhdistämispyynnön keskustelua.",
+ "discussionUnavailableMessage": "Tämä yhdistämispyyntö on voitu poistaa.",
+ "noDiscussionDescription": "Tässä yhdistämispyynnössä ei ole katselmointiketjuja eikä keskustelukommentteja.",
+ "noFilesChangedDescription": "Tässä yhdistämispyynnössä ei ole tiedostomuutoksia."
+ },
"fileStatus": {
"modified": "Muokattu",
"renamed": "Nimetty uudelleen",
@@ -659,7 +710,7 @@
"emptyLine": "(tyhjä)"
},
"linkPasteClipboardEmpty": "Leikepöytä on tyhjä.",
- "linkPasteNotAPullRequest": "Tämä ei ole GitHub-muutospyynnön linkki.",
+ "linkPasteNotAPullRequest": "Tämä ei ole muutospyynnön tai yhdistämispyynnön linkki",
"announce": {
"commentPosted": "Kommentti julkaistu",
"reviewSubmitted": "Katselmointi lähetetty",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Tätä kommenttia ei voi julkaista. Valittu rivi on saattanut muuttua tai PR on saatettu päivittää.",
"reviewNotSubmitted": "Tätä katselmointia ei voi lähettää sellaisenaan. PR on voinut muuttua tai kyseessä on oma muutospyyntösi, jota et voi katselmoida.",
+ "reviewNotSubmittedTerm": "Tätä katselmointia ei voi lähettää sellaisenaan. {{term}} on voinut muuttua, tai kyseessä on oma {{term}}, jota et voi katselmoida.",
"couldNotPostComment": "Kommenttia ei voitu julkaista.",
"couldNotSubmitReview": "Katselmointia ei voitu lähettää. Tarkista yhteys ja yritä uudelleen."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Vastaaminen epäonnistui.",
"couldNotCompleteAction": "Tätä toimintoa ei voitu suorittaa loppuun.",
"mergeResultDefaultError": "GitHub ei saattanut yhdistämistä loppuun.",
+ "mergeResultNotCompleted": "{{term}} ei yhdistynyt. Tarkista sen tila ja yritä uudelleen.",
"ambiguous": "Toiminnon onnistumista ei voitu vahvistaa. Tarkista PR ennen kuin yrität uudelleen.",
"persistenceFailed": "Emme voineet tallentaa tätä toimintoa. Yritä myöhemmin uudelleen.",
"forbidden": "Toiminto ei ole sallittu."
@@ -1988,11 +2041,31 @@
"retryConnection": "Yhdistä uudelleen"
},
"newSession": {
+ "recentlyUsed": "Äskettäin käytetyt",
+ "couldNotLoadGithubRepositories": "GitHub-repositorioiden lataus epäonnistui.",
+ "couldNotLoadGitlabRepositories": "GitLab-repositorioiden lataus epäonnistui.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket-repositorioiden lataus epäonnistui.",
"connectGithubDescription": "Yhdistä GitHub selaimessa ja palaa sitten tänne valitsemaan repositorio.",
+ "connectGitlabDescription": "Yhdistä GitLab selaimessa ja palaa sitten tänne valitsemaan repositorio.",
+ "connectBitbucketDescription": "Yhdistä Bitbucket selaimessa ja palaa sitten tänne valitsemaan repositorio.",
"openGithub": "Avaa GitHub",
+ "openGitlab": "Avaa GitLab",
+ "openBitbucket": "Avaa Bitbucket",
"refreshRepositories": "Päivitä repositoriot",
"githubConnected": "GitHub yhdistetty",
+ "gitlabConnected": "GitLab yhdistetty",
"noRepositoriesVisible": "Repositorioita ei näy. Tarkista Kilon GitHub-sovelluksen käyttöoikeudet repositorioihin ja päivitä sitten luettelo.",
+ "noRepositoriesVisibleGitlab": "Repositorioita ei näy. Tarkista GitLab-repositorioiden käyttöoikeudet ja päivitä sitten luettelo.",
+ "noRepositoriesVisibleBitbucket": "Repositorioita ei näy. Tarkista Bitbucket-repositorioiden käyttöoikeudet ja päivitä sitten luettelo.",
+ "bitbucketOrganizationsOnly": "Bitbucket on käytettävissä vain organisaatioille.",
+ "branchPickerTitle": "Valitse haara",
+ "branchDefault": "Oletus",
+ "branchAccessibility": "Haara: {{label}}",
+ "branchLoading": "Ladataan haaroja",
+ "branchLoadError": "Haarojen lataaminen epäonnistui",
+ "branchUnavailable": "Tämän koodivaraston haarat eivät ole käytettävissä. Tarkista pääsysi palveluntarjoajalta ja valitse toinen koodivarasto.",
+ "branchEmpty": "Haaroja ei ole käytettävissä",
+ "branchPlaceholder": "Valitse haara",
"runOnWithTarget": "Suoritusympäristö: {{target}}",
"environment": "Ympäristö",
"couldNotLoadEnvironment": "Ympäristöäsi ei voitu ladata.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Repositorioita ei voitu päivittää. Yritä uudelleen.",
"discardDraftTitle": "Hylätäänkö luonnos?",
"discardDraftMessage": "Kehotteesi poistetaan.",
+ "discardWithUploadsMessage": "Kehotteesi ja palvelimelle siirretyt tiedostot, joita ei ole liitetty lähetettyihin viesteihin, poistetaan.",
"discardFailed": "Luonnosta ei voitu hylätä. Yritä uudelleen.",
"remoteHint": "Voit hallita paikallista kilo-prosessia suorittamalla `kilo remote` tietokoneellasi tai `/remote` käynnissä olevassa CLI-istunnossa.",
- "connectBitbucketDescription": "Yhdistä Bitbucket selaimessa ja palaa sitten tänne valitsemaan repositorio.",
- "connectGitlabDescription": "Yhdistä GitLab selaimessa ja palaa sitten tänne valitsemaan repositorio.",
- "couldNotLoadBitbucketRepositories": "Bitbucket-repositorioiden lataus epäonnistui.",
- "couldNotLoadGithubRepositories": "GitHub-repositorioiden lataus epäonnistui.",
- "couldNotLoadGitlabRepositories": "GitLab-repositorioiden lataus epäonnistui.",
- "gitlabConnected": "GitLab yhdistetty",
- "noRepositoriesVisibleBitbucket": "Repositorioita ei näy. Tarkista Bitbucket-repositorioiden käyttöoikeudet ja päivitä sitten luettelo.",
- "noRepositoriesVisibleGitlab": "Repositorioita ei näy. Tarkista GitLab-repositorioiden käyttöoikeudet ja päivitä sitten luettelo.",
- "openBitbucket": "Avaa Bitbucket",
- "openGitlab": "Avaa GitLab",
- "recentlyUsed": "Äskettäin käytetyt",
- "cliCannotContinue": "Tämä CLI ei voi jatkaa istuntoa. Valitse Cloud Agent tai toinen CLI.",
"continueFrom": "Jatketaan istuntoa: {{title}}.",
- "importFailed": "Tätä istuntoa ei voitu tuoda.",
"importingSession": "Tuodaan istuntoa",
- "discardWithUploadsMessage": "Kehotteesi ja palvelimelle siirretyt tiedostot, joita ei ole liitetty lähetettyihin viesteihin, poistetaan."
+ "cliCannotContinue": "Tämä CLI ei voi jatkaa istuntoa. Valitse Cloud Agent tai toinen CLI.",
+ "importFailed": "Tätä istuntoa ei voitu tuoda."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} tiedosto päivitettiin.",
diff --git a/apps/mobile/src/i18n/locales/fil.json b/apps/mobile/src/i18n/locales/fil.json
index 3fa39706df..0e3cfd64af 100644
--- a/apps/mobile/src/i18n/locales/fil.json
+++ b/apps/mobile/src/i18n/locales/fil.json
@@ -36,6 +36,7 @@
"cost": "Gastos",
"discard": "Itapon",
"findings": "Mga natukoy na isyu",
+ "mergeRequest": "merge request",
"notConnected": "Hindi nakakonekta",
"notifications": "Mga abiso",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Bakanteng hanay ng pagkakaiba"
},
"connectionExpired": "Nag-expire ang koneksyon sa GitHub.",
+ "capabilities": {
+ "banner": {
+ "title": "Hindi available sa provider na ito",
+ "accessibility": "Hindi available sa provider na ito: {{reason}}"
+ }
+ },
"merge": {
"merge": "Pagsasama",
"mergeNow": "I-merge ngayon",
"mergePullRequest": "Pag-merge ng pull request",
+ "mergeTermTitle": "Pag-merge ng {{term}}",
"enableAutoMerge": "Paganahin ang awtomatikong pag-merge",
"disableAutoMerge": "Huwag paganahin ang awtomatikong pag-merge",
"autoMergeOn": "Aktibo ang awtomatikong pag-merge",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Burahin ang branch pagkatapos i-merge",
"noEnabledMethods": "Walang aktibong paraan ng pag-merge sa repository na ito. Hilingin sa admin ng repository na paganahin ang merge, squash, o rebase.",
"confirmTitle": "I-merge ang pull request?",
+ "confirmTitleTerm": "I-merge ang {{term}}?",
"confirmMessage": "Ime-merge nito ang mga pagbabago mo sa base branch.",
"enableAutoMergeConfirmTitle": "Paganahin ang awtomatikong pag-merge?",
"enableAutoMergeConfirmMessage": "Awtomatikong ime-merge ng GitHub ang pull request na ito kapag pumasa ang lahat ng kinakailangang pagsusuri.",
+ "enableAutoMergeConfirmMessageTerm": "Awtomatikong magme-merge ang {{term}} kapag tagumpay ang pipeline nito.",
+ "enableAutoMergeDescriptionTerm": "Awtomatikong mine-merge ng GitLab ang {{term}} na ito kapag tagumpay ang pipeline nito.",
"forbidden": "Wala kang pahintulot na i-merge ang pull request na ito.",
"cannotMerge": "Hindi ma-merge ang pull request na ito sa kasalukuyang kalagayan nito.",
"couldNotMerge": "Hindi ma-merge ang pull request.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Na-merge na",
- "closed": "Nakasara ang pull request na ito"
+ "closed": "Nakasara ang pull request na ito",
+ "closedMergeRequest": "Nakasara ang merge request na ito"
},
"partialSuccessBanner": {
"body": "Hindi mabura ang branch: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Hindi pa maaaring i-merge ang pull request na ito",
"notMergeableDetail": "Iniulat ng GitHub ang {{state}} bilang status ng pag-merge."
},
+ "restrictions": {
+ "title": "Mga paghihigko sa pag-merge",
+ "approvalsRequired_one": "{{displayCount}} approval ang kailangan",
+ "approvalsRequired_other": "{{displayCount}} approval ang kailangan",
+ "pipelineMustSucceed": "Kailangang maging matagumpay ang pipeline bago mag-merge."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Nabibigo ang pipeline sa pinakabagong commit.",
+ "pendingPipeline": "Tumatakbo pa rin ang pipeline sa pinakabagong commit.",
+ "permission": "Wala kang pahintulot na i-merge ang {{term}} na ito.",
+ "draft": "Markahan ang {{term}} bilang handa nang suriin bago mag-merge."
+ },
"methodLabels": {
"merge": "Gumawa ng merge commit",
"squash": "I-squash at i-merge",
@@ -448,6 +472,7 @@
"acceptTerms": "Tanggapin",
"replyBadRequest": "Hindi ma-post ang sagot na ito. Maaaring nagbago ang talakayan.",
"replyForbidden": "Wala kang pahintulot na sumagot sa pull request na ito.",
+ "replyForbiddenTerm": "Wala kang pahintulot na sumagot sa {{term}} na ito.",
"moderation": {
"reportContent": {
"terminal": "Hindi maiulat ang komentong ito.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Suriin ang pull request",
"headLine": "{{counts}} · kasalukuyang commit {{sha}}",
"entry": {
- "eyebrow": "Buksan ang pull request gamit ang URL nito.",
- "pastePrLink": "I-paste ang link ng PR",
- "noRecentPrs": "Walang kamakailang binuksang PR",
- "noRecentPrsDescription": "I-paste ang link ng PR sa itaas para magsimula ng pagsusuri — lalabas ito rito sa susunod.",
+ "eyebrow": "Buksan ang pull request o merge request gamit ang URL nito",
+ "pastePrLink": "I-paste ang link ng pull request o merge request",
+ "noRecentPrs": "Walang kamakailang pagsusuri",
+ "noRecentPrsDescription": "I-paste ang link sa itaas para magsimula ng pagsusuri — lalabas ito rito sa susunod.",
"couldNotLoad": "Hindi ma-load.",
"removeFromRecentsTitle": "Alisin sa mga kamakailang binuksan?",
- "removeFromRecentsMessage": "Aalisin ang pull request na ito sa listahan ng mga kamakailan mong binuksan.",
+ "removeFromRecentsMessage": "Aalisin ang pagsusuring ito sa listahan ng mga kamakailan.",
"removeRecentAccessibility": "Alisin ang {{repo}} sa mga kamakailang binuksan",
- "urlAccessibility": "URL ng pull request sa GitHub",
- "clearLink": "Alisin ang link ng pull request",
- "pasteLink": "I-paste ang link ng pull request",
+ "urlAccessibility": "Ilagay ang URL ng pull request o merge request",
+ "urlPlaceholder": "URL ng pull request o merge request",
+ "openAccessibility": "Buksan ang pull request o merge request",
+ "clearLink": "Alisin ang link",
+ "pasteLink": "I-paste ang link ng pull request o merge request",
"open": "Bukas"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Hindi masuri ang koneksyon sa GitHub.",
"checkFailedMessage": "Hindi makuha ang status ng pag-sign in hangga't hindi ito tapos mag-load.",
+ "checkFailedTitleGitLab": "Hindi masuri ang koneksyon sa GitLab.",
+ "checkFailedTitleBitbucket": "Hindi masuri ang koneksyon sa Bitbucket.",
+ "providerCheckFailedMessage": "Hindi available ang katayuan ng koneksyon hanggang sa ma-load ito.",
"reconnectTitle": "Kumonekta muli sa GitHub",
"reconnectDescription": "Binawi ang koneksyon mo sa GitHub. Kumonekta muli para patuloy na makapagsuri ng mga pull request sa mobile.",
- "description": "Ikonekta ang GitHub account mo para makapagsuri ng mga pull request sa mobile."
+ "description": "Ikonekta ang GitHub account mo para makapagsuri ng mga pull request sa mobile.",
+ "gitlabDescription": "Ikonekta ang iyong GitLab account para suriin ang mga merge request sa mobile.",
+ "bitbucketDescription": "Ikonekta ang Bitbucket sa organizasyong ito para suriin ang mga pull request sa mobile.",
+ "bitbucketOrgOnlyDescription": "Pumili ng organisasyon sa iyong profile para suriin ang mga pull request nito sa Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Nag-expire ang koneksyon sa GitHub.",
- "message": "Wala nang bisa ang koneksyon mo sa GitHub. Suriin muli ang koneksyon mo — hihilinging kumonekta kang muli kung kailangan."
+ "message": "Wala nang bisa ang koneksyon mo sa GitHub. Suriin muli ang koneksyon mo — hihilinging kumonekta kang muli kung kailangan.",
+ "gitlabTitle": "Nag-expire ang koneksyon sa GitLab.",
+ "bitbucketTitle": "Nag-expire ang koneksyon sa Bitbucket.",
+ "providerMessage": "Wala nang bisa ang koneksyon mo sa {{provider}}. Suriin muli ang koneksyon mo — hihilinging kumonekta kang muli kung kailangan."
},
"eventChips": {
"comment": "Komento",
@@ -643,6 +679,21 @@
"files": "Mga payl",
"discussion": "Talakayan"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Ibahagi ang merge request",
+ "viewOnProvider": "Tingnan sa {{provider}}",
+ "mergeRequestUnavailable": "Hindi mabuksan ang merge request",
+ "unavailableDescription": "Baka tinanggal na ito, o wala kang access dito.",
+ "accessDeniedMergeRequest": "Wala kang pahintulot na tingnan ang merge request na ito.",
+ "couldNotLoadMergeRequest": "Hindi ma-load ang merge request.",
+ "discussionAccessDenied": "Wala kang pahintulot na tingnan ang talakayan ng merge request na ito.",
+ "discussionUnavailableMessage": "Maaaring naalis ang merge request na ito.",
+ "noDiscussionDescription": "Walang talakayan sa pagsusuri o komento sa pag-uusap para sa merge request na ito.",
+ "noFilesChangedDescription": "Walang binagong file sa merge request na ito."
+ },
"fileStatus": {
"modified": "Binago",
"renamed": "Pinalitan ng pangalan",
@@ -659,7 +710,7 @@
"emptyLine": "(walang laman)"
},
"linkPasteClipboardEmpty": "Walang laman ang clipboard.",
- "linkPasteNotAPullRequest": "Hindi ito link ng pull request sa GitHub.",
+ "linkPasteNotAPullRequest": "Hindi ito link ng pull request o merge request",
"announce": {
"commentPosted": "Na-post ang komento",
"reviewSubmitted": "Naisumite ang pagsusuri",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Hindi ma-post ang komentong ito. Maaaring nagbago ang napiling linya, o na-update na ang PR.",
"reviewNotSubmitted": "Hindi maisumite ang pagsusuring ito sa kasalukuyang anyo nito. Maaaring nagbago ang PR, o hindi ka puwedeng magsuri ng sarili mong pull request.",
+ "reviewNotSubmittedTerm": "Hindi maisumite ang pagsusuring ito sa kasalukuyang anyo. Baka nagbago ang {{term}}, o hindi mo masusuri ang sarili mong {{term}}.",
"couldNotPostComment": "Hindi ma-post ang komento.",
"couldNotSubmitReview": "Hindi maisumite ang pagsusuri. Suriin ang koneksyon mo at subukan muli."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Hindi maipadala ang sagot.",
"couldNotCompleteAction": "Hindi makumpleto ang aksiyong ito.",
"mergeResultDefaultError": "Hindi nakumpleto ng GitHub ang pag-merge.",
+ "mergeResultNotCompleted": "Hindi na-merge ang {{term}}. Suriin ang katayuan nito at subukang muli.",
"ambiguous": "Hindi makumpirma — suriin ang PR bago subukan muli.",
"persistenceFailed": "Hindi namin maitala ang aksiyong ito. Pakisubukan muli mamaya.",
"forbidden": "Hindi pinapayagan ang aksiyong ito."
@@ -1988,11 +2041,31 @@
"retryConnection": "Subukang kumonekta muli"
},
"newSession": {
+ "recentlyUsed": "Mga ginamit kamakailan",
+ "couldNotLoadGithubRepositories": "Hindi ma-load ang mga imbakan ng code sa GitHub.",
+ "couldNotLoadGitlabRepositories": "Hindi ma-load ang mga imbakan ng code sa GitLab.",
+ "couldNotLoadBitbucketRepositories": "Hindi ma-load ang mga imbakan ng code sa Bitbucket.",
"connectGithubDescription": "Ikonekta ang GitHub sa iyong browser, saka bumalik dito para pumili ng imbakan ng code.",
+ "connectGitlabDescription": "Ikonekta ang GitLab sa iyong browser, saka bumalik dito para pumili ng imbakan ng code.",
+ "connectBitbucketDescription": "Ikonekta ang Bitbucket sa iyong browser, saka bumalik dito para pumili ng imbakan ng code.",
"openGithub": "Buksan ang GitHub",
+ "openGitlab": "Buksan ang GitLab",
+ "openBitbucket": "Buksan ang Bitbucket",
"refreshRepositories": "I-refresh ang mga imbakan ng code",
"githubConnected": "Konektado ang GitHub",
+ "gitlabConnected": "Konektado ang GitLab",
"noRepositoriesVisible": "Walang nakikitang imbakan ng code. Suriin kung may access ang Kilo GitHub App sa mga imbakan ng code, saka i-refresh.",
+ "noRepositoriesVisibleGitlab": "Walang nakikitang imbakan ng code. Suriin ang access sa mga imbakan ng code sa GitLab, saka i-refresh.",
+ "noRepositoriesVisibleBitbucket": "Walang nakikitang imbakan ng code. Suriin ang access sa mga imbakan ng code sa Bitbucket, saka i-refresh.",
+ "bitbucketOrganizationsOnly": "Available lang ang Bitbucket para sa mga organisasyon.",
+ "branchPickerTitle": "Pumili ng sangay",
+ "branchDefault": "Default",
+ "branchAccessibility": "Sangay: {{label}}",
+ "branchLoading": "Ini-load ang mga sangay",
+ "branchLoadError": "Hindi ma-load ang mga sangay",
+ "branchUnavailable": "Walang available na sangay para sa repositoryong ito. Suriin ang access mo sa provider, tapos pumili ng ibang repositoryo.",
+ "branchEmpty": "Walang available na sangay",
+ "branchPlaceholder": "Pumili ng sangay",
"runOnWithTarget": "Patakbuhin sa: {{target}}",
"environment": "Kapaligiran",
"couldNotLoadEnvironment": "Hindi ma-load ang iyong kapaligiran.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Hindi ma-refresh ang mga imbakan ng code. Subukang muli.",
"discardDraftTitle": "Burahin ang burador?",
"discardDraftMessage": "Mawawala ang iyong prompt.",
+ "discardWithUploadsMessage": "Buburahin ang iyong prompt at mga na-upload na file na hindi pa nagagamit.",
"discardFailed": "Hindi mabura ang burador. Subukang muli.",
"remoteHint": "Patakbuhin ang `kilo remote` sa iyong computer, o ang `/remote` sa isang tumatakbong sesyon ng CLI, para kontrolin ang isang lokal na proseso ng kilo.",
- "connectBitbucketDescription": "Ikonekta ang Bitbucket sa iyong browser, saka bumalik dito para pumili ng imbakan ng code.",
- "connectGitlabDescription": "Ikonekta ang GitLab sa iyong browser, saka bumalik dito para pumili ng imbakan ng code.",
- "couldNotLoadBitbucketRepositories": "Hindi ma-load ang mga imbakan ng code sa Bitbucket.",
- "couldNotLoadGithubRepositories": "Hindi ma-load ang mga imbakan ng code sa GitHub.",
- "couldNotLoadGitlabRepositories": "Hindi ma-load ang mga imbakan ng code sa GitLab.",
- "gitlabConnected": "Konektado ang GitLab",
- "noRepositoriesVisibleBitbucket": "Walang nakikitang imbakan ng code. Suriin ang access sa mga imbakan ng code sa Bitbucket, saka i-refresh.",
- "noRepositoriesVisibleGitlab": "Walang nakikitang imbakan ng code. Suriin ang access sa mga imbakan ng code sa GitLab, saka i-refresh.",
- "openBitbucket": "Buksan ang Bitbucket",
- "openGitlab": "Buksan ang GitLab",
- "recentlyUsed": "Mga ginamit kamakailan",
"continueFrom": "Ipinagpapatuloy ang {{title}}.",
"importingSession": "Ini-import ang sesyon",
"cliCannotContinue": "Hindi kayang magpatuloy ng sesyon ang CLI na ito. Pumili ng Cloud Agent o ibang CLI.",
- "importFailed": "Hindi ma-import ang sesyong ito.",
- "discardWithUploadsMessage": "Buburahin ang iyong prompt at mga na-upload na file na hindi pa nagagamit."
+ "importFailed": "Hindi ma-import ang sesyong ito."
},
"partRenderer": {
"updatedFileCount_one": "Na-update ang {{displayCount}} na file.",
diff --git a/apps/mobile/src/i18n/locales/fr.json b/apps/mobile/src/i18n/locales/fr.json
index 21dcba8565..aaa60d9417 100644
--- a/apps/mobile/src/i18n/locales/fr.json
+++ b/apps/mobile/src/i18n/locales/fr.json
@@ -3,6 +3,9 @@
"cancel": "Annuler",
"done": "Terminé",
"retry": "Réessayer",
+ "tryAgain": "Réessayer",
+ "continue": "Continuer",
+ "notNow": "Pas maintenant",
"language": "Langue",
"device": "Appareil",
"share": "Partager {{title}}",
@@ -14,15 +17,12 @@
"approve": "Approuver",
"refresh": "Actualiser",
"couldNotRefresh": "Impossible d'actualiser. Faites glisser vers le bas pour réessayer.",
- "tryAgain": "Réessayer",
"openInBrowser": "Ouvrir dans le navigateur",
"openSettings": "Ouvrir les paramètres",
"copiedToClipboard": "Copié dans le presse-papiers",
"couldNotCopyToClipboard": "Impossible de copier dans le presse-papiers.",
"required": "obligatoire",
"error": "erreur : {{error}}",
- "notNow": "Pas maintenant",
- "continue": "Continuer",
"back": "Retour",
"somethingWentWrong": "Une erreur s'est produite.",
"couldNotOpen": "Impossible d'ouvrir {{label}}.",
@@ -36,6 +36,7 @@
"cost": "Coût",
"discard": "Abandonner",
"findings": "Problèmes détectés",
+ "mergeRequest": "merge request",
"notConnected": "Non connecté",
"notifications": "Alertes et notifications",
"pullRequest": "pR",
@@ -1478,11 +1479,31 @@
"retryConnection": "Réessayer de se connecter"
},
"newSession": {
+ "recentlyUsed": "Utilisés récemment",
+ "couldNotLoadGithubRepositories": "Impossible de charger les dépôts GitHub.",
+ "couldNotLoadGitlabRepositories": "Impossible de charger les dépôts GitLab.",
+ "couldNotLoadBitbucketRepositories": "Impossible de charger les dépôts Bitbucket.",
"connectGithubDescription": "Connectez votre compte GitHub dans votre navigateur, puis revenez ici pour choisir un dépôt.",
+ "connectGitlabDescription": "Connectez votre compte GitLab dans votre navigateur, puis revenez ici pour choisir un dépôt.",
+ "connectBitbucketDescription": "Connectez votre compte Bitbucket dans votre navigateur, puis revenez ici pour choisir un dépôt.",
"openGithub": "Ouvrir GitHub",
+ "openGitlab": "Ouvrir GitLab",
+ "openBitbucket": "Ouvrir Bitbucket",
"refreshRepositories": "Actualiser les dépôts",
"githubConnected": "GitHub connecté",
+ "gitlabConnected": "GitLab connecté",
"noRepositoriesVisible": "Aucun dépôt visible. Vérifiez les droits d'accès de l'application Kilo aux dépôts GitHub, puis actualisez.",
+ "noRepositoriesVisibleGitlab": "Aucun dépôt visible. Vérifiez les droits d'accès aux dépôts GitLab, puis actualisez.",
+ "noRepositoriesVisibleBitbucket": "Aucun dépôt visible. Vérifiez les droits d'accès aux dépôts Bitbucket, puis actualisez.",
+ "bitbucketOrganizationsOnly": "Bitbucket n'est disponible que pour les organisations.",
+ "branchPickerTitle": "Sélectionner une branche",
+ "branchDefault": "Par défaut",
+ "branchAccessibility": "Branche : {{label}}",
+ "branchLoading": "Chargement des branches",
+ "branchLoadError": "Impossible de charger les branches",
+ "branchUnavailable": "Aucune branche n'est disponible pour ce dépôt. Vérifiez votre accès auprès du fournisseur, puis choisissez un autre dépôt.",
+ "branchEmpty": "Aucune branche disponible",
+ "branchPlaceholder": "Sélectionner une branche",
"runOnWithTarget": "Exécution sur : {{target}}",
"environment": "Environnement",
"couldNotLoadEnvironment": "Impossible de charger votre environnement.",
@@ -1501,26 +1522,15 @@
"couldNotReadPendingSessions": "Impossible de lire les sessions en attente. Réessayez.",
"failedToCreate": "Impossible de créer la session.",
"couldNotRefreshRepositories": "Impossible d'actualiser les dépôts. Réessayez.",
- "discardDraftMessage": "Votre consigne sera perdue.",
"discardDraftTitle": "Supprimer le brouillon ?",
+ "discardDraftMessage": "Votre consigne sera perdue.",
+ "discardWithUploadsMessage": "Votre consigne et les fichiers transférés qui ne sont liés à aucun message envoyé seront supprimés.",
"discardFailed": "Impossible de supprimer le brouillon. Réessayez.",
"remoteHint": "Exécutez `kilo remote` sur votre ordinateur, ou `/remote` dans une session CLI en cours, pour contrôler un processus kilo local.",
- "connectBitbucketDescription": "Connectez votre compte Bitbucket dans votre navigateur, puis revenez ici pour choisir un dépôt.",
- "connectGitlabDescription": "Connectez votre compte GitLab dans votre navigateur, puis revenez ici pour choisir un dépôt.",
- "couldNotLoadBitbucketRepositories": "Impossible de charger les dépôts Bitbucket.",
- "couldNotLoadGithubRepositories": "Impossible de charger les dépôts GitHub.",
- "couldNotLoadGitlabRepositories": "Impossible de charger les dépôts GitLab.",
- "gitlabConnected": "GitLab connecté",
- "noRepositoriesVisibleBitbucket": "Aucun dépôt visible. Vérifiez les droits d'accès aux dépôts Bitbucket, puis actualisez.",
- "noRepositoriesVisibleGitlab": "Aucun dépôt visible. Vérifiez les droits d'accès aux dépôts GitLab, puis actualisez.",
- "openBitbucket": "Ouvrir Bitbucket",
- "openGitlab": "Ouvrir GitLab",
- "recentlyUsed": "Utilisés récemment",
- "cliCannotContinue": "Cette CLI ne permet pas de reprendre une session. Choisissez Cloud Agent ou une autre CLI.",
"continueFrom": "La session {{title}} reprend.",
- "importFailed": "Impossible d'importer cette session.",
"importingSession": "Importation de la session…",
- "discardWithUploadsMessage": "Votre consigne et les fichiers transférés qui ne sont liés à aucun message envoyé seront supprimés."
+ "cliCannotContinue": "Cette CLI ne permet pas de reprendre une session. Choisissez Cloud Agent ou une autre CLI.",
+ "importFailed": "Impossible d'importer cette session."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} fichier mis à jour.",
@@ -2326,162 +2336,11 @@
"scroll": "Défilement"
},
"prReview": {
+ "pullRequestUnavailable": "Demande de fusion indisponible",
+ "pullRequestUnavailableDescription": "Impossible d'ouvrir cette PR. Elle a peut-être été supprimée, le dépôt est privé ou l'application GitHub de Kilo n'y est pas installée.",
"accessDeniedDescription": "Vous n'avez pas l'autorisation de consulter cette demande de fusion.",
- "checkConnection": "Vérifier la connexion",
- "checks": {
- "checksCount": "{{displayCount}} vérifications",
- "couldNotLoad": "Impossible de charger les vérifications.",
- "failed": "{{displayCount}} en échec",
- "noAccess": "Vous n'avez pas accès aux vérifications de ce dépôt.",
- "noChecksReported": "Aucun résultat de vérification",
- "notAvailable": "Les vérifications ne sont pas encore disponibles. Le dernier commit n'a peut-être pas été traité ou l'application GitHub de Kilo n'est pas installée sur le dépôt source.",
- "openDetails": "Afficher les détails de {{name}}",
- "passed": "{{displayCount}} réussies",
- "pending": "{{displayCount}} en attente",
- "retryChecks": "Réessayer de charger les vérifications",
- "skipped": "{{displayCount}} ignorées",
- "title": "Vérifications",
- "viewOnGitHub": "Voir la PR sur GitHub",
- "checkDetails": "détails de la vérification"
- },
- "composer": {
- "addTitle": "Nouveau commentaire",
- "addToReview": "Ajouter à la revue",
- "comment": "Commenter",
- "commentBody": "Texte du commentaire",
- "commentBodyPlaceholder": "Votre commentaire",
- "commentNow": "Commenter maintenant",
- "discardMessage": "Votre brouillon sera perdu.",
- "discardTitle": "Supprimer le brouillon du commentaire ?",
- "editTitle": "Modification du commentaire",
- "insertSuggestion": "Insérer une suggestion",
- "insertSuggestionA11y": "Insérer une suggestion de code",
- "loadFailedTitle": "Impossible de charger l'éditeur de commentaires.",
- "ok": "OK",
- "unavailableMessage": "Ce commentaire en attente a déjà été supprimé ou envoyé.",
- "unavailableTitle": "Commentaire indisponible",
- "bodyEmpty": "Le commentaire ne peut pas être vide.",
- "suggestionsOnlyAddedLines": "Les suggestions ne s'appliquent qu'aux lignes ajoutées.",
- "tapDiffLineToSuggest": "Touchez une ligne dans les différences pour activer les suggestions."
- },
- "connect": {
- "checkFailedMessage": "L'état de la connexion reste indisponible jusqu'à la fin du chargement.",
- "checkFailedTitle": "Impossible de vérifier la connexion GitHub.",
- "description": "Connectez votre compte GitHub pour examiner des demandes de fusion sur mobile.",
- "reconnectDescription": "L'accès à votre compte GitHub a été révoqué. Reconnectez-vous pour continuer à examiner des demandes de fusion sur mobile.",
- "reconnectTitle": "Reconnecter GitHub"
- },
- "connectionExpired": "La connexion à GitHub a expiré.",
- "couldNotLoadPullRequest": "Impossible de charger la demande de fusion.",
- "couldNotOpenGitHubAppSettings": "Impossible d'ouvrir les paramètres de l'application GitHub.",
- "description": "Présentation",
- "discussion": {
- "acceptTerms": "Accepter",
- "accessDeniedMessage": "Vous n'avez pas l'autorisation de consulter les échanges de cette PR.",
- "addReaction": "Ajouter une réaction",
- "block": "Bloquer",
- "blockedUser": "{{login}} bloqué",
- "collapseThread": "Réduire le fil",
- "commentActions": "Actions du commentaire",
- "comment": "{{displayCount}} commentaires",
- "comment_other": "{{displayCount}} commentaires",
- "couldNotLoad": "Impossible de charger les échanges.",
- "couldNotLoadMore": "Impossible de charger d'autres commentaires.",
- "loadMoreComments": "Charger d'autres commentaires",
- "loading": "Chargement des échanges",
- "moderation": {
- "block": {
- "retryable": "Impossible de bloquer cet utilisateur. Vérifiez votre connexion et réessayez.",
- "terminal": "Cet utilisateur ne peut pas être bloqué."
- },
- "mute": {
- "retryable": "Impossible de mettre cet utilisateur en sourdine. Vérifiez votre connexion et réessayez.",
- "terminal": "Cet utilisateur ne peut pas être mis en sourdine."
- },
- "reportContent": {
- "retryable": "Impossible de signaler ce commentaire. Vérifiez votre connexion et réessayez.",
- "terminal": "Ce commentaire ne peut pas être signalé."
- },
- "reportUser": {
- "retryable": "Impossible de signaler cet utilisateur. Vérifiez votre connexion et réessayez.",
- "terminal": "Cet utilisateur ne peut pas être signalé."
- }
- },
- "moreLinesAbove": "… {{displayCount}} lignes supplémentaires se trouvent au-dessus.",
- "mute": "Mettre en sourdine",
- "mutedUser": "{{login}} mis en sourdine",
- "noDiscussion": "Aucun échange pour le moment",
- "noDiscussionDescription": "Cette demande de fusion ne contient encore aucun fil de revue ni commentaire.",
- "comment_one": "1 commentaire",
- "outdated": "Obsolète",
- "quotedDiffSnippet": "Extrait des différences cité",
- "reactionPill": "réaction {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "réactions",
- "reaction_other": "réactions",
- "reaction_one": "réaction",
- "replyBadRequest": "Cette réponse ne peut pas être publiée. Le fil a peut-être changé.",
- "replyBody": "Texte de la réponse",
- "replyForbidden": "Vous n'avez pas l'autorisation de répondre à cette demande de fusion.",
- "replyPlaceholder": "Votre réponse…",
- "reportContent": "Signaler le contenu",
- "reportUser": "Signaler l'utilisateur",
- "resolveThread": "Marquer le fil comme résolu",
- "resolved": "Résolu",
- "retryLoadingMore": "Réessayer de charger d'autres commentaires",
- "reviewFiles": "Examiner les fichiers",
- "startedRelative": " · ouvert {{relative}}",
- "submitReply": "Envoyer la réponse",
- "termsAcceptRetry": "Impossible d'accepter les conditions d'utilisation. Vérifiez votre connexion et réessayez.",
- "termsCopy": "Vous devez avoir au moins 13 ans pour publier.",
- "termsTitle": "Conditions d'utilisation",
- "threadAccessibilityLabel": "Fil de discussion {{anchorLabel}}",
- "unavailable": "Les échanges sont indisponibles.",
- "unavailableMessage": "Cette demande de fusion a peut-être été supprimée.",
- "unresolveThread": "Rouvrir le fil",
- "viewTerms": "Consulter les conditions",
- "termsAcceptRequired": "Vous devez accepter les conditions d'utilisation pour publier.",
- "termsCheckRetryCopy": "Impossible de vérifier les conditions d'utilisation. Vérifiez votre connexion et réessayez.",
- "termsOutdatedCopy": "Les conditions d'utilisation ont été modifiées. Rouvrez cet écran pour accepter la nouvelle version.",
- "comment_many": "{{displayCount}} commentaires",
- "reaction_many": "réactions",
- "reactions": {
- "thumbsUp": "Pouce levé",
- "thumbsDown": "Pouce baissé",
- "laugh": "Rire",
- "hooray": "Hourra",
- "confused": "Perplexe",
- "heart": "Cœur",
- "rocket": "Fusée",
- "eyes": "Yeux"
- },
- "anchor": {
- "fileCommentOnPath": "Commentaire sur le fichier {{path}}",
- "fileComment": "Commentaire sur le fichier",
- "outdatedOnPathLines": "Obsolète : {{path}}, {{lines}}",
- "outdatedOnLines": "Obsolète : {{lines}}",
- "outdatedOnPath": "Obsolète : {{path}}"
- },
- "deletedUser": "utilisateur supprimé"
- },
- "entry": {
- "clearLink": "Effacer le lien de la demande de fusion",
- "couldNotLoad": "Le chargement est impossible.",
- "eyebrow": "Ouvrez une demande de fusion à partir de son URL.",
- "noRecentPrs": "Aucune PR récente",
- "noRecentPrsDescription": "Collez un lien de PR ci-dessus pour commencer une revue. La PR apparaîtra ici la prochaine fois.",
- "open": "Ouverture",
- "pasteLink": "Coller le lien de la demande de fusion",
- "pastePrLink": "Coller un lien de PR",
- "removeFromRecentsMessage": "Cette demande de fusion sera retirée de vos éléments récents.",
- "removeFromRecentsTitle": "Retirer des éléments récents ?",
- "removeRecentAccessibility": "Retirer {{repo}} des éléments récents",
- "urlAccessibility": "URL de la demande de fusion GitHub"
- },
- "eventChips": {
- "comment": "Commenter",
- "label": "Type de revue",
- "requestChanges": "Demander des modifications"
- },
+ "noFilesChanged": "Aucun fichier modifié",
+ "noFilesChangedDescription": "Cette demande de fusion ne modifie aucun fichier.",
"fileList": {
"filesList": "Liste des fichiers",
"filesViewed": "Fichiers · {{viewed}} sur {{total}} consultés",
@@ -2526,7 +2385,6 @@
"commentOnSelectedLines": "Commenter les lignes sélectionnées",
"finishReview": "Terminer la revue"
},
- "headLine": "{{counts}} · dernier commit {{sha}}",
"hunkRows": {
"contextUnavailable": "Le contexte n'est pas disponible pour cette référence.",
"expandAll": "Tout afficher",
@@ -2561,56 +2419,68 @@
"fileLoadedCount_many": "{{displayCount}} fichiers chargés",
"fileLoadedOfTotalCount_many": "{{displayCount}} fichiers chargés sur {{total}}"
},
- "inbox": {
- "couldNotLoad": "Impossible de charger la boîte de réception.",
- "loading": "Chargement de la boîte de réception",
- "noReviewRequests": "Aucune demande de revue",
- "noReviewRequestsDescription": "Les demandes de fusion en attente de votre revue apparaissent ici. Vous pouvez aussi coller n'importe quel lien de PR ci-dessus.",
- "title": "Boîte de réception"
+ "sideBySide": {
+ "emptyDiffColumn": "colonne de différences vide",
+ "emptyDiffRow": "Ligne de différences vide",
+ "newOnly": "Nouvelle version uniquement : {{text}}",
+ "noNewlineAtEndOfFile": "le fichier ne se termine pas par un saut de ligne.",
+ "oldNew": "Avant : {{old}} | Après : {{new}}",
+ "oldOnly": "Ancienne version uniquement : {{text}}"
+ },
+ "connectionExpired": "La connexion à GitHub a expiré.",
+ "capabilities": {
+ "banner": {
+ "title": "Non disponible avec ce fournisseur",
+ "accessibility": "Non disponible avec ce fournisseur : {{reason}}"
+ }
},
- "installKiloGitHubApp": "Installer l'application GitHub de Kilo",
"merge": {
- "autoMergeDescription": "GitHub fusionnera automatiquement cette demande de fusion lorsque toutes les vérifications requises auront réussi (méthode : {{method}}).",
+ "merge": "Fusion",
+ "mergeNow": "Fusionner maintenant",
+ "mergePullRequest": "Fusion de la demande",
+ "mergeTermTitle": "Fusionner {{term}}",
+ "enableAutoMerge": "Activer la fusion automatique",
+ "disableAutoMerge": "Désactiver la fusion automatique",
"autoMergeOn": "Fusion automatique activée",
- "blockedTitle": "Obstacles à la fusion",
- "cannotMerge": "Cette demande de fusion ne peut pas être fusionnée en l'état.",
+ "autoMergeDescription": "GitHub fusionnera automatiquement cette demande de fusion lorsque toutes les vérifications requises auront réussi (méthode : {{method}}).",
"checking": "Vérification de la possibilité de fusion…",
+ "couldNotDetermine": "Impossible de déterminer si la fusion est possible.",
+ "refreshMergeability": "Vérifier à nouveau si la fusion est possible",
+ "blockedTitle": "Obstacles à la fusion",
+ "updateBranch": "Mettre à jour la branche",
+ "updateBranchFromBase": "Mettre à jour la branche à partir de la branche cible",
+ "methodLabel": "Méthode",
+ "commitTitle": "Titre du commit",
"commitMessage": "Message de commit",
"commitMessagePlaceholder": "Description facultative du commit de fusion",
- "commitTitle": "Titre du commit",
- "confirmMessage": "Vos modifications seront fusionnées dans la branche cible.",
- "confirmTitle": "Fusionner la demande de fusion ?",
- "couldNotDetermine": "Impossible de déterminer si la fusion est possible.",
- "couldNotMerge": "Impossible de fusionner la demande de fusion.",
"deleteBranch": "Supprimer la branche",
"deleteBranchAfterMerge": "Supprimer la branche après la fusion",
- "disableAutoMerge": "Désactiver la fusion automatique",
- "enableAutoMerge": "Activer la fusion automatique",
- "enableAutoMergeConfirmMessage": "GitHub fusionnera automatiquement cette demande de fusion lorsque toutes les vérifications requises auront réussi.",
+ "noEnabledMethods": "Aucune méthode de fusion n'est activée pour ce dépôt. Demandez à un administrateur du dépôt d'activer la fusion classique, le regroupement des commits ou le rebasage.",
+ "confirmTitle": "Fusionner la demande de fusion ?",
+ "confirmTitleTerm": "Fusionner {{term}} ?",
+ "confirmMessage": "Vos modifications seront fusionnées dans la branche cible.",
"enableAutoMergeConfirmTitle": "Activer la fusion automatique ?",
+ "enableAutoMergeConfirmMessage": "GitHub fusionnera automatiquement cette demande de fusion lorsque toutes les vérifications requises auront réussi.",
+ "enableAutoMergeConfirmMessageTerm": "Une fois son pipeline réussi, la fusion de {{term}} sera automatique.",
+ "enableAutoMergeDescriptionTerm": "GitLab fusionnera {{term}} automatiquement une fois son pipeline réussi.",
"forbidden": "Vous n'avez pas l'autorisation de fusionner cette demande de fusion.",
- "loadFailedTitle": "Impossible de charger les options de fusion.",
- "merge": "Fusion",
- "mergeNow": "Fusionner maintenant",
- "mergePullRequest": "Fusion de la demande",
- "methodLabel": "Méthode",
+ "cannotMerge": "Cette demande de fusion ne peut pas être fusionnée en l'état.",
+ "couldNotMerge": "Impossible de fusionner la demande de fusion.",
"methods": {
"merge": "Fusion",
"rebase": "Rebasage",
"squash": "Regroupement"
},
- "noEnabledMethods": "Aucune méthode de fusion n'est activée pour ce dépôt. Demandez à un administrateur du dépôt d'activer la fusion classique, le regroupement des commits ou le rebasage.",
+ "terminal": {
+ "alreadyMerged": "Déjà fusionnée",
+ "closed": "Demande de fusion fermée",
+ "closedMergeRequest": "Ce merge request est fermé"
+ },
"partialSuccessBanner": {
"accessibility": "Fusionnée. Impossible de supprimer la branche : {{reason}}",
"body": "Impossible de supprimer la branche : {{reason}}."
},
- "refreshMergeability": "Vérifier à nouveau si la fusion est possible",
- "terminal": {
- "alreadyMerged": "Déjà fusionnée",
- "closed": "Demande de fusion fermée"
- },
- "updateBranch": "Mettre à jour la branche",
- "updateBranchFromBase": "Mettre à jour la branche à partir de la branche cible",
+ "loadFailedTitle": "Impossible de charger les options de fusion.",
"blocked": {
"unknownStateTitle": "GitHub n'a pas confirmé que la fusion est possible",
"unknownStateDetail": "Réactualisez l'aperçu dans un instant.",
@@ -2630,6 +2500,19 @@
"notMergeableTitle": "Cette demande de fusion ne peut pas encore être fusionnée",
"notMergeableDetail": "GitHub a signalé un état de fusion {{state}}."
},
+ "restrictions": {
+ "title": "Restrictions de fusion",
+ "approvalsRequired_one": "{{displayCount}} approbation requise",
+ "approvalsRequired_other": "{{displayCount}} approbations requises",
+ "pipelineMustSucceed": "Le pipeline doit réussir avant la fusion.",
+ "approvalsRequired_many": "{{displayCount}} approbations requises"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Le pipeline est en échec sur le dernier commit.",
+ "pendingPipeline": "Le pipeline est encore en cours sur le dernier commit.",
+ "permission": "Vous n'avez pas l'autorisation de fusionner {{term}}.",
+ "draft": "Indiquez que {{term}} est prêt pour la revue avant de le fusionner."
+ },
"methodLabels": {
"merge": "Créer un commit de fusion",
"squash": "Regrouper les commits et fusionner",
@@ -2641,9 +2524,207 @@
"rebase": "Réappliquez tous les commits de cette branche sur la branche cible, sans créer de commit de fusion."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Fil de discussion {{anchorLabel}}",
+ "collapseThread": "Réduire le fil",
+ "resolveThread": "Marquer le fil comme résolu",
+ "unresolveThread": "Rouvrir le fil",
+ "resolved": "Résolu",
+ "outdated": "Obsolète",
+ "comment_one": "1 commentaire",
+ "comment": "{{displayCount}} commentaires",
+ "comment_other": "{{displayCount}} commentaires",
+ "startedRelative": " · ouvert {{relative}}",
+ "couldNotLoadMore": "Impossible de charger d'autres commentaires.",
+ "retryLoadingMore": "Réessayer de charger d'autres commentaires",
+ "loadMoreComments": "Charger d'autres commentaires",
+ "addReaction": "Ajouter une réaction",
+ "reactionPill": "réaction {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "réaction",
+ "reaction": "réactions",
+ "reaction_other": "réactions",
+ "commentActions": "Actions du commentaire",
+ "reportContent": "Signaler le contenu",
+ "reportUser": "Signaler l'utilisateur",
+ "mute": "Mettre en sourdine",
+ "block": "Bloquer",
+ "blockedUser": "{{login}} bloqué",
+ "mutedUser": "{{login}} mis en sourdine",
+ "replyPlaceholder": "Votre réponse…",
+ "replyBody": "Texte de la réponse",
+ "submitReply": "Envoyer la réponse",
+ "termsTitle": "Conditions d'utilisation",
+ "termsCopy": "Vous devez avoir au moins 13 ans pour publier.",
+ "termsAcceptRetry": "Impossible d'accepter les conditions d'utilisation. Vérifiez votre connexion et réessayez.",
+ "viewTerms": "Consulter les conditions",
+ "acceptTerms": "Accepter",
+ "replyBadRequest": "Cette réponse ne peut pas être publiée. Le fil a peut-être changé.",
+ "replyForbidden": "Vous n'avez pas l'autorisation de répondre à cette demande de fusion.",
+ "replyForbiddenTerm": "Vous n'avez pas l'autorisation de répondre à {{term}}.",
+ "moderation": {
+ "block": {
+ "retryable": "Impossible de bloquer cet utilisateur. Vérifiez votre connexion et réessayez.",
+ "terminal": "Cet utilisateur ne peut pas être bloqué."
+ },
+ "mute": {
+ "retryable": "Impossible de mettre cet utilisateur en sourdine. Vérifiez votre connexion et réessayez.",
+ "terminal": "Cet utilisateur ne peut pas être mis en sourdine."
+ },
+ "reportContent": {
+ "retryable": "Impossible de signaler ce commentaire. Vérifiez votre connexion et réessayez.",
+ "terminal": "Ce commentaire ne peut pas être signalé."
+ },
+ "reportUser": {
+ "retryable": "Impossible de signaler cet utilisateur. Vérifiez votre connexion et réessayez.",
+ "terminal": "Cet utilisateur ne peut pas être signalé."
+ }
+ },
+ "accessDeniedMessage": "Vous n'avez pas l'autorisation de consulter les échanges de cette PR.",
+ "unavailable": "Les échanges sont indisponibles.",
+ "unavailableMessage": "Cette demande de fusion a peut-être été supprimée.",
+ "couldNotLoad": "Impossible de charger les échanges.",
+ "loading": "Chargement des échanges",
+ "noDiscussion": "Aucun échange pour le moment",
+ "noDiscussionDescription": "Cette demande de fusion ne contient encore aucun fil de revue ni commentaire.",
+ "reviewFiles": "Examiner les fichiers",
+ "quotedDiffSnippet": "Extrait des différences cité",
+ "moreLinesAbove": "… {{displayCount}} lignes supplémentaires se trouvent au-dessus.",
+ "termsAcceptRequired": "Vous devez accepter les conditions d'utilisation pour publier.",
+ "termsOutdatedCopy": "Les conditions d'utilisation ont été modifiées. Rouvrez cet écran pour accepter la nouvelle version.",
+ "termsCheckRetryCopy": "Impossible de vérifier les conditions d'utilisation. Vérifiez votre connexion et réessayez.",
+ "reactions": {
+ "thumbsUp": "Pouce levé",
+ "thumbsDown": "Pouce baissé",
+ "laugh": "Rire",
+ "hooray": "Hourra",
+ "confused": "Perplexe",
+ "heart": "Cœur",
+ "rocket": "Fusée",
+ "eyes": "Yeux"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Commentaire sur le fichier {{path}}",
+ "fileComment": "Commentaire sur le fichier",
+ "outdatedOnPathLines": "Obsolète : {{path}}, {{lines}}",
+ "outdatedOnLines": "Obsolète : {{lines}}",
+ "outdatedOnPath": "Obsolète : {{path}}"
+ },
+ "deletedUser": "utilisateur supprimé",
+ "comment_many": "{{displayCount}} commentaires",
+ "reaction_many": "réactions"
+ },
+ "couldNotOpenGitHubAppSettings": "Impossible d'ouvrir les paramètres de l'application GitHub.",
+ "installKiloGitHubApp": "Installer l'application GitHub de Kilo",
+ "checkConnection": "Vérifier la connexion",
+ "couldNotLoadPullRequest": "Impossible de charger la demande de fusion.",
+ "description": "Présentation",
"noDescriptionProvided": "Aucune description n'a été fournie.",
- "noFilesChanged": "Aucun fichier modifié",
- "noFilesChangedDescription": "Cette demande de fusion ne modifie aucun fichier.",
+ "review": "Revue",
+ "reviewPullRequest": "Examiner la demande de fusion",
+ "headLine": "{{counts}} · dernier commit {{sha}}",
+ "entry": {
+ "eyebrow": "Ouvrez une PR ou une merge request à partir de son URL",
+ "pastePrLink": "Coller un lien de PR ou de merge request",
+ "noRecentPrs": "Aucune revue récente",
+ "noRecentPrsDescription": "Collez un lien ci-dessus pour démarrer une revue — elle apparaîtra ici la prochaine fois.",
+ "couldNotLoad": "Le chargement est impossible.",
+ "removeFromRecentsTitle": "Retirer des éléments récents ?",
+ "removeFromRecentsMessage": "Cette revue sera retirée de vos éléments récents.",
+ "removeRecentAccessibility": "Retirer {{repo}} des éléments récents",
+ "urlAccessibility": "Saisissez une URL de PR ou de merge request",
+ "urlPlaceholder": "URL de PR ou de merge request",
+ "openAccessibility": "Ouvrir une PR ou un merge request",
+ "clearLink": "Effacer le lien",
+ "pasteLink": "Coller le lien de PR ou de merge request",
+ "open": "Ouverture"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} vérifications",
+ "couldNotLoad": "Impossible de charger les vérifications.",
+ "failed": "{{displayCount}} en échec",
+ "noAccess": "Vous n'avez pas accès aux vérifications de ce dépôt.",
+ "noChecksReported": "Aucun résultat de vérification",
+ "notAvailable": "Les vérifications ne sont pas encore disponibles. Le dernier commit n'a peut-être pas été traité ou l'application GitHub de Kilo n'est pas installée sur le dépôt source.",
+ "openDetails": "Afficher les détails de {{name}}",
+ "passed": "{{displayCount}} réussies",
+ "pending": "{{displayCount}} en attente",
+ "retryChecks": "Réessayer de charger les vérifications",
+ "skipped": "{{displayCount}} ignorées",
+ "title": "Vérifications",
+ "viewOnGitHub": "Voir la PR sur GitHub",
+ "checkDetails": "détails de la vérification"
+ },
+ "inbox": {
+ "couldNotLoad": "Impossible de charger la boîte de réception.",
+ "loading": "Chargement de la boîte de réception",
+ "noReviewRequests": "Aucune demande de revue",
+ "noReviewRequestsDescription": "Les demandes de fusion en attente de votre revue apparaissent ici. Vous pouvez aussi coller n'importe quel lien de PR ci-dessus.",
+ "title": "Boîte de réception"
+ },
+ "composer": {
+ "addTitle": "Nouveau commentaire",
+ "addToReview": "Ajouter à la revue",
+ "comment": "Commenter",
+ "commentBody": "Texte du commentaire",
+ "commentBodyPlaceholder": "Votre commentaire",
+ "commentNow": "Commenter maintenant",
+ "discardMessage": "Votre brouillon sera perdu.",
+ "discardTitle": "Supprimer le brouillon du commentaire ?",
+ "editTitle": "Modification du commentaire",
+ "insertSuggestion": "Insérer une suggestion",
+ "insertSuggestionA11y": "Insérer une suggestion de code",
+ "loadFailedTitle": "Impossible de charger l'éditeur de commentaires.",
+ "ok": "OK",
+ "unavailableMessage": "Ce commentaire en attente a déjà été supprimé ou envoyé.",
+ "unavailableTitle": "Commentaire indisponible",
+ "bodyEmpty": "Le commentaire ne peut pas être vide.",
+ "suggestionsOnlyAddedLines": "Les suggestions ne s'appliquent qu'aux lignes ajoutées.",
+ "tapDiffLineToSuggest": "Touchez une ligne dans les différences pour activer les suggestions."
+ },
+ "connect": {
+ "checkFailedTitle": "Impossible de vérifier la connexion GitHub.",
+ "checkFailedMessage": "L'état de la connexion reste indisponible jusqu'à la fin du chargement.",
+ "checkFailedTitleGitLab": "Impossible de vérifier la connexion GitLab.",
+ "checkFailedTitleBitbucket": "Impossible de vérifier la connexion Bitbucket.",
+ "providerCheckFailedMessage": "L'état de la connexion reste indisponible jusqu'à la fin du chargement.",
+ "reconnectTitle": "Reconnecter GitHub",
+ "reconnectDescription": "L'accès à votre compte GitHub a été révoqué. Reconnectez-vous pour continuer à examiner des demandes de fusion sur mobile.",
+ "description": "Connectez votre compte GitHub pour examiner des demandes de fusion sur mobile.",
+ "gitlabDescription": "Connectez votre compte GitLab pour examiner des merge requests sur mobile.",
+ "bitbucketDescription": "Connectez Bitbucket à cette organisation pour examiner des PR sur mobile.",
+ "bitbucketOrgOnlyDescription": "Sélectionnez une organisation dans votre profil pour examiner ses PR Bitbucket sur mobile."
+ },
+ "screen": {
+ "shareA11y": "Partager la demande de fusion",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Ce commentaire sera retiré des commentaires en attente de la revue.",
+ "deletePendingTitle": "Supprimer le commentaire en attente ?",
+ "loadFailedTitle": "Impossible de charger le formulaire d'envoi de la revue.",
+ "pendingComment": "commentaires en attente",
+ "pendingComment_other": "commentaires en attente",
+ "pendingComment_one": "commentaire en attente",
+ "summaryOptional": "Résumé (facultatif)",
+ "partialPostedMessage": "Commentaires publiés : {{displayFreshCount}}. Commentaires conservés en attente car ils concernent un commit plus ancien : {{displayStaleCount}}.",
+ "submitCountOfTotal": "Envoyer {{displayFreshCount}} commentaires sur {{displayTotalCount}}",
+ "submitReview": "Envoyer la revue",
+ "pendingComment_many": "commentaires en attente",
+ "blockedRequestChanges": "Ajoutez un résumé ou au moins un commentaire pour demander des modifications.",
+ "blockedComment": "Ajoutez un résumé ou au moins un commentaire pour publier une revue avec des commentaires."
+ },
+ "reconnectNotice": {
+ "title": "La connexion à GitHub a expiré.",
+ "message": "Votre connexion GitHub n'est plus valide. Vérifiez-la à nouveau. Si nécessaire, vous devrez vous reconnecter.",
+ "gitlabTitle": "La connexion à GitLab a expiré.",
+ "bitbucketTitle": "La connexion à Bitbucket a expiré.",
+ "providerMessage": "Votre connexion {{provider}} n'est plus valide. Vérifiez-la à nouveau. Si nécessaire, vous devrez vous reconnecter."
+ },
+ "eventChips": {
+ "comment": "Commenter",
+ "label": "Type de revue",
+ "requestChanges": "Demander des modifications"
+ },
"overview": {
"commit": "validations",
"commit_other": "validations",
@@ -2686,40 +2767,25 @@
"summaryA11y": "Résumé de la revue",
"summaryPlaceholder": "Résumé de la revue (facultatif)"
},
- "pullRequestUnavailable": "Demande de fusion indisponible",
- "pullRequestUnavailableDescription": "Impossible d'ouvrir cette PR. Elle a peut-être été supprimée, le dépôt est privé ou l'application GitHub de Kilo n'y est pas installée.",
- "reconnectNotice": {
- "message": "Votre connexion GitHub n'est plus valide. Vérifiez-la à nouveau. Si nécessaire, vous devrez vous reconnecter.",
- "title": "La connexion à GitHub a expiré."
- },
- "review": "Revue",
- "reviewPullRequest": "Examiner la demande de fusion",
- "screen": {
- "shareA11y": "Partager la demande de fusion",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "colonne de différences vide",
- "emptyDiffRow": "Ligne de différences vide",
- "newOnly": "Nouvelle version uniquement : {{text}}",
- "noNewlineAtEndOfFile": "le fichier ne se termine pas par un saut de ligne.",
- "oldNew": "Avant : {{old}} | Après : {{new}}",
- "oldOnly": "Ancienne version uniquement : {{text}}"
+ "tabs": {
+ "discussion": "Échanges",
+ "files": "Fichiers",
+ "overview": "Aperçu"
},
- "submit": {
- "deletePendingMessage": "Ce commentaire sera retiré des commentaires en attente de la revue.",
- "deletePendingTitle": "Supprimer le commentaire en attente ?",
- "loadFailedTitle": "Impossible de charger le formulaire d'envoi de la revue.",
- "pendingComment": "commentaires en attente",
- "pendingComment_other": "commentaires en attente",
- "pendingComment_one": "commentaire en attente",
- "summaryOptional": "Résumé (facultatif)",
- "partialPostedMessage": "Commentaires publiés : {{displayFreshCount}}. Commentaires conservés en attente car ils concernent un commit plus ancien : {{displayStaleCount}}.",
- "submitCountOfTotal": "Envoyer {{displayFreshCount}} commentaires sur {{displayTotalCount}}",
- "submitReview": "Envoyer la revue",
- "pendingComment_many": "commentaires en attente",
- "blockedRequestChanges": "Ajoutez un résumé ou au moins un commentaire pour demander des modifications.",
- "blockedComment": "Ajoutez un résumé ou au moins un commentaire pour publier une revue avec des commentaires."
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Partager le merge request",
+ "viewOnProvider": "Voir sur {{provider}}",
+ "mergeRequestUnavailable": "Merge request indisponible",
+ "unavailableDescription": "Il a peut-être été supprimé, ou vous n'y avez pas accès.",
+ "accessDeniedMergeRequest": "Vous n'avez pas l'autorisation de consulter ce merge request.",
+ "couldNotLoadMergeRequest": "Impossible de charger le merge request.",
+ "discussionAccessDenied": "Vous n'avez pas l'autorisation de consulter les échanges de ce merge request.",
+ "discussionUnavailableMessage": "Ce merge request a peut-être été supprimé.",
+ "noDiscussionDescription": "Ce merge request ne contient encore aucun fil de revue ni commentaire.",
+ "noFilesChangedDescription": "Ce merge request ne modifie aucun fichier."
},
"fileStatus": {
"changed": "Modifié",
@@ -2727,11 +2793,6 @@
"modified": "Modifié",
"renamed": "Renommé"
},
- "tabs": {
- "discussion": "Échanges",
- "files": "Fichiers",
- "overview": "Aperçu"
- },
"diff": {
"selectedTapToChange": "Sélection : {{label}}, touchez pour modifier la sélection",
"tapToComment": "{{label}}, touchez pour commenter",
@@ -2742,7 +2803,7 @@
"emptyLine": "(vide)"
},
"linkPasteClipboardEmpty": "Le presse-papiers est vide.",
- "linkPasteNotAPullRequest": "Ce lien ne correspond pas à une demande de fusion GitHub.",
+ "linkPasteNotAPullRequest": "Ce n'est pas un lien de PR ou de merge request",
"announce": {
"commentPosted": "Commentaire publié",
"reviewSubmitted": "Revue envoyée",
@@ -2751,6 +2812,7 @@
"mutationError": {
"commentNotPosted": "Impossible de publier ce commentaire. La ligne sélectionnée a peut-être changé ou la PR a été mise à jour.",
"reviewNotSubmitted": "Impossible d'envoyer cette revue en l'état. La PR a peut-être changé ou vous tentez d'examiner votre propre demande de fusion, ce qui n'est pas autorisé.",
+ "reviewNotSubmittedTerm": "Impossible d'envoyer cette revue en l'état. Il se peut que {{term}} ait changé, ou que vous ne puissiez pas examiner votre propre {{term}}.",
"couldNotPostComment": "Impossible de publier le commentaire.",
"couldNotSubmitReview": "Impossible d'envoyer la revue. Vérifiez votre connexion et réessayez."
},
@@ -2758,6 +2820,7 @@
"couldNotReply": "Impossible de répondre.",
"couldNotCompleteAction": "Impossible d'effectuer cette action.",
"mergeResultDefaultError": "GitHub n'a pas terminé la fusion.",
+ "mergeResultNotCompleted": "La fusion de {{term}} n'a pas abouti. Vérifiez son état et réessayez.",
"ambiguous": "Impossible de confirmer le résultat. Vérifiez la PR avant de réessayer.",
"persistenceFailed": "Nous n'avons pas pu enregistrer cette action. Veuillez réessayer plus tard.",
"forbidden": "Cette action n'est pas autorisée."
diff --git a/apps/mobile/src/i18n/locales/ga.json b/apps/mobile/src/i18n/locales/ga.json
index 90d46a4f63..81c3beeba7 100644
--- a/apps/mobile/src/i18n/locales/ga.json
+++ b/apps/mobile/src/i18n/locales/ga.json
@@ -36,6 +36,7 @@
"cost": "Costas",
"discard": "Caith uait",
"findings": "Torthaí",
+ "mergeRequest": "iarratas cumaisc",
"notConnected": "Gan nasc",
"notifications": "Fógraí",
"pullRequest": "iarratas tarraingthe",
@@ -346,10 +347,17 @@
"emptyDiffRow": "Ró folamh sa chomparáid athruithe"
},
"connectionExpired": "Tá an nasc GitHub imithe in éag.",
+ "capabilities": {
+ "banner": {
+ "title": "Níl ar fáil leis an soláthraí seo",
+ "accessibility": "Níl ar fáil leis an soláthraí seo: {{reason}}"
+ }
+ },
"merge": {
"merge": "Cumasc",
"mergeNow": "Cumasc anois",
"mergePullRequest": "Cumasc iarratais tarraingthe",
+ "mergeTermTitle": "Cumasc {{term}}",
"enableAutoMerge": "Cumasaigh cumasc uathoibríoch",
"disableAutoMerge": "Díchumasaigh cumasc uathoibríoch",
"autoMergeOn": "Cumasc uathoibríoch ar siúl",
@@ -368,9 +376,12 @@
"deleteBranchAfterMerge": "Scrios an brainse tar éis an chumaisc",
"noEnabledMethods": "Níl aon mhodh cumaisc cumasaithe sa stór seo. Iarr ar riarthóir an stóir cumasc, comhdhlúthú nó athbhunú a chumasú.",
"confirmTitle": "An gcumascfar an t-iarratas tarraingthe?",
+ "confirmTitleTerm": "An gcumascfar an t-{{term}}?",
"confirmMessage": "Cumascfar do chuid athruithe isteach sa bhunbrainse.",
"enableAutoMergeConfirmTitle": "An gcumasófar cumasc uathoibríoch?",
"enableAutoMergeConfirmMessage": "Cumascfaidh GitHub an t-iarratas tarraingthe seo go huathoibríoch nuair a éireoidh leis na seiceálacha riachtanacha go léir.",
+ "enableAutoMergeConfirmMessageTerm": "Cumar an {{term}} go huathoibríoch nuair a éireoidh leis an bpíblíne.",
+ "enableAutoMergeDescriptionTerm": "Cumann GitLab an {{term}} seo go huathoibríoch nuair a éireoidh leis an bpíblíne.",
"forbidden": "Níl cead agat an t-iarratas tarraingthe seo a chumasc.",
"cannotMerge": "Ní féidir an t-iarratas tarraingthe seo a chumasc mar atá sé.",
"couldNotMerge": "Níorbh fhéidir an t-iarratas tarraingthe a chumasc.",
@@ -381,7 +392,8 @@
},
"terminal": {
"alreadyMerged": "Cumaiscthe cheana",
- "closed": "Tá an t-iarratas tarraingthe seo dúnta"
+ "closed": "Tá an t-iarratas tarraingthe seo dúnta",
+ "closedMergeRequest": "Tá an t-iarratas cumaisc seo dúnta"
},
"partialSuccessBanner": {
"body": "Níorbh fhéidir an brainse a scriosadh: {{reason}}.",
@@ -407,6 +419,21 @@
"notMergeableTitle": "Ní féidir an t-iarratas tarraingthe seo a chumasc go fóill",
"notMergeableDetail": "Thuairiscigh GitHub an stádas cumaisc seo: {{state}}."
},
+ "restrictions": {
+ "title": "Srianta cumaisc",
+ "approvalsRequired_one": "Tá {{displayCount}} ceadú de dhíth",
+ "approvalsRequired_other": "Tá {{displayCount}} ceadú de dhíth",
+ "pipelineMustSucceed": "Ní mór don bpíblíne éireacht sula ndéanfar an cumasc.",
+ "approvalsRequired_many": "Tá {{displayCount}} ceadú de dhíth",
+ "approvalsRequired_few": "Tá {{displayCount}} ceadú de dhíth",
+ "approvalsRequired_two": "Tá {{displayCount}} ceadú de dhíth"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Tá an bpíblíne ag teip ar an tiomnú is déanaí.",
+ "pendingPipeline": "Tá an bpíblíne fós ag rith ar an tiomnú is déanaí.",
+ "permission": "Níl cead agat an t-{{term}} seo a chumasc.",
+ "draft": "Marcáil an t-{{term}} mar réidh le hathbhreithniú sula ndéanfaidh tú an cumasc."
+ },
"methodLabels": {
"merge": "Cruthaigh taifead athruithe don chumasc",
"squash": "Comhdhlúthaigh agus cumasc",
@@ -454,6 +481,7 @@
"acceptTerms": "Glac",
"replyBadRequest": "Ní féidir an freagra seo a phostáil. Seans gur athraíodh an snáithe.",
"replyForbidden": "Níl cead agat freagra a thabhairt ar an iarratas tarraingthe seo.",
+ "replyForbiddenTerm": "Níl cead agat freagra a thabhairt ar an {{term}} seo.",
"moderation": {
"reportContent": {
"terminal": "Ní féidir an trácht seo a thuairisciú.",
@@ -485,12 +513,6 @@
"termsAcceptRequired": "Caithfidh tú glacadh leis na téarmaí seirbhíse chun postáil.",
"termsOutdatedCopy": "Athraíodh na téarmaí seirbhíse. Oscail an scáileán seo arís chun glacadh leis an leagan is déanaí.",
"termsCheckRetryCopy": "Níorbh fhéidir na téarmaí seirbhíse a sheiceáil. Seiceáil do nasc agus bain triail as arís.",
- "comment_two": "{{displayCount}} thrácht",
- "comment_few": "{{displayCount}} thrácht",
- "comment_many": "{{displayCount}} dtrácht",
- "reaction_two": "imoibriúchán",
- "reaction_few": "imoibriúchán",
- "reaction_many": "n-imoibriúchán",
"reactions": {
"thumbsUp": "Ordóg suas",
"thumbsDown": "Ordóg síos",
@@ -508,7 +530,13 @@
"outdatedOnLines": "As dáta ar {{lines}}",
"outdatedOnPath": "As dáta ar {{path}}"
},
- "deletedUser": "úsáideoir scriosta"
+ "deletedUser": "úsáideoir scriosta",
+ "comment_two": "{{displayCount}} thrácht",
+ "comment_few": "{{displayCount}} thrácht",
+ "comment_many": "{{displayCount}} dtrácht",
+ "reaction_two": "imoibriúchán",
+ "reaction_few": "imoibriúchán",
+ "reaction_many": "n-imoibriúchán"
},
"couldNotOpenGitHubAppSettings": "Níorbh fhéidir socruithe na haipe GitHub a oscailt.",
"installKiloGitHubApp": "Suiteáil aip GitHub Kilo",
@@ -520,17 +548,19 @@
"reviewPullRequest": "Athbhreithnigh an t-iarratas tarraingthe",
"headLine": "{{counts}} · taifead athruithe reatha {{sha}}",
"entry": {
- "eyebrow": "Oscail iarratas tarraingthe trí URL.",
- "pastePrLink": "Greamaigh nasc PR",
- "noRecentPrs": "Gan aon PR le déanaí",
- "noRecentPrsDescription": "Greamaigh nasc PR thuas chun athbhreithniú a thosú — taispeánfar é anseo an chéad uair eile.",
+ "eyebrow": "Oscail iarratas tarraingthe nó iarratas cumaisc trí URL",
+ "pastePrLink": "Greamaigh nasc d’iarratas tarraingthe nó d’iarratas cumaisc",
+ "noRecentPrs": "Gan aon athbhreithniú le déanaí",
+ "noRecentPrsDescription": "Greamaigh nasc thuas chun athbhreithniú a thosú — taispeánfar é anseo an chéad uair eile.",
"couldNotLoad": "Níorbh fhéidir an t-ábhar a lódáil.",
"removeFromRecentsTitle": "An mbainfear den liosta le déanaí é?",
- "removeFromRecentsMessage": "Bainfear an t-iarratas tarraingthe seo den liosta le déanaí.",
+ "removeFromRecentsMessage": "Bainfear an t-athbhreithniú seo den liosta le déanaí.",
"removeRecentAccessibility": "Bain {{repo}} den liosta le déanaí",
- "urlAccessibility": "URL iarratais tarraingthe GitHub",
- "clearLink": "Glan nasc iarratais tarraingthe",
- "pasteLink": "Greamaigh nasc iarratais tarraingthe",
+ "urlAccessibility": "Cuir isteach URL d’iarratas tarraingthe nó d’iarratas cumaisc",
+ "urlPlaceholder": "URL d’iarratas tarraingthe nó d’iarratas cumaisc",
+ "openAccessibility": "Oscail iarratas tarraingthe nó iarratas cumaisc",
+ "clearLink": "Glan an nasc",
+ "pasteLink": "Greamaigh nasc d’iarratas tarraingthe nó d’iarratas cumaisc",
"open": "Oscailte"
},
"checks": {
@@ -579,9 +609,15 @@
"connect": {
"checkFailedTitle": "Níorbh fhéidir an nasc GitHub a sheiceáil.",
"checkFailedMessage": "Níl stádas an tsínithe isteach ar fáil go dtí go lódáiltear é seo.",
+ "checkFailedTitleGitLab": "Níorbh fhéidir an nasc GitLab a sheiceáil.",
+ "checkFailedTitleBitbucket": "Níorbh fhéidir an nasc Bitbucket a sheiceáil.",
+ "providerCheckFailedMessage": "Níl stádas an naisc ar fáil go dtí go mbeidh sé lódáilte.",
"reconnectTitle": "Athnasc GitHub",
"reconnectDescription": "Cúlghaireadh do nasc GitHub. Athnasc chun leanúint d'athbhreithniú a dhéanamh ar iarratais tarraingthe ar do ghuthán.",
- "description": "Nasc do chuntas GitHub chun iarratais tarraingthe a athbhreithniú ar do ghuthán."
+ "description": "Nasc do chuntas GitHub chun iarratais tarraingthe a athbhreithniú ar do ghuthán.",
+ "gitlabDescription": "Ceangail do chuntas GitLab chun iarratais chumaisc a athbhreithniú ar an ngléas soghluaiste.",
+ "bitbucketDescription": "Ceangail Bitbucket leis an eagraíocht seo chun iarratais tharraingthe a athbhreithniú ar an ngléas soghluaiste.",
+ "bitbucketOrgOnlyDescription": "Roghnaigh eagraíocht i do phróifíl chun a hiarratais tharraingthe Bitbucket a athbhreithniú."
},
"screen": {
"title": "#{{number}}",
@@ -606,7 +642,10 @@
},
"reconnectNotice": {
"title": "Tá an nasc GitHub imithe in éag.",
- "message": "Níl do nasc GitHub bailí a thuilleadh. Seiceáil do nasc arís — iarrfar ort athnascadh más gá."
+ "message": "Níl do nasc GitHub bailí a thuilleadh. Seiceáil do nasc arís — iarrfar ort athnascadh más gá.",
+ "gitlabTitle": "Tá an nasc GitLab imithe in éag.",
+ "bitbucketTitle": "Tá an nasc Bitbucket imithe in éag.",
+ "providerMessage": "Níl do nasc {{provider}} bailí a thuilleadh. Seiceáil do nasc arís — iarrfar ort athnascadh más gá."
},
"eventChips": {
"comment": "Trácht",
@@ -664,6 +703,21 @@
"files": "Comhaid",
"discussion": "Plé"
},
+ "terms": {
+ "pullRequest": "Iarratas tarraingthe",
+ "mergeRequest": "Iarratas cumaisc",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Comhroinn iarratas cumaisc",
+ "viewOnProvider": "Amharc ar {{provider}}",
+ "mergeRequestUnavailable": "Iarratas cumaisc gan fáil",
+ "unavailableDescription": "B’fhéidir gur scriosadh é, nó b’fhéidir nach bhfuil rochtain agat air.",
+ "accessDeniedMergeRequest": "Níl cead agat an t-iarratas cumaisc seo a fheiceáil.",
+ "couldNotLoadMergeRequest": "Níorbh fhéidir an t-iarratas cumaisc a lódáil.",
+ "discussionAccessDenied": "Níl cead agat plé an iarratais chumaisc seo a fheiceáil.",
+ "discussionUnavailableMessage": "Seans gur baineadh an t-iarratas cumaisc seo.",
+ "noDiscussionDescription": "Níl aon snáithe athbhreithnithe ná trácht comhrá ar an iarratas cumaisc seo.",
+ "noFilesChangedDescription": "Níl aon athrú ar chomhaid san iarratas cumaisc seo."
+ },
"fileStatus": {
"modified": "Modhnaithe",
"renamed": "Athainmnithe",
@@ -680,7 +734,7 @@
"emptyLine": "(folamh)"
},
"linkPasteClipboardEmpty": "Tá an ghearrthaisce folamh.",
- "linkPasteNotAPullRequest": "Ní nasc chuig iarratas tarraingthe GitHub é seo.",
+ "linkPasteNotAPullRequest": "Ní nasc d’iarratas tarraingthe ná d’iarratas cumaisc é seo",
"announce": {
"commentPosted": "Trácht postáilte",
"reviewSubmitted": "Athbhreithniú seolta",
@@ -689,6 +743,7 @@
"mutationError": {
"commentNotPosted": "Ní féidir an trácht seo a phostáil. B'fhéidir gur athraíodh an líne roghnaithe, nó b'fhéidir gur nuashonraíodh an PR.",
"reviewNotSubmitted": "Ní féidir an t-athbhreithniú seo a sheoladh mar atá sé. Seans gur athraíodh an PR, nó gur iarratas tarraingthe de do chuid féin é nach féidir leat a athbhreithniú.",
+ "reviewNotSubmittedTerm": "Ní féidir an t-athbhreithniú seo a chur isteach mar atá. B’fhéidir gur athraíodh an {{term}}, nó ní féidir leat do {{term}} féin a athbhreithniú.",
"couldNotPostComment": "Níorbh fhéidir an trácht a phostáil.",
"couldNotSubmitReview": "Níorbh fhéidir an t-athbhreithniú a sheoladh. Seiceáil do nasc agus bain triail as arís."
},
@@ -696,6 +751,7 @@
"couldNotReply": "Níorbh fhéidir freagra a thabhairt.",
"couldNotCompleteAction": "Níorbh fhéidir an gníomh seo a chríochnú.",
"mergeResultDefaultError": "Níor chríochnaigh GitHub an cumasc.",
+ "mergeResultNotCompleted": "Níor cumascadh an {{term}}. Seiceáil a stádas agus bain triail eile as.",
"ambiguous": "Níorbh fhéidir an toradh a dheimhniú — seiceáil an PR sula mbainfidh tú triail as arís.",
"persistenceFailed": "Níorbh fhéidir linn an gníomh seo a thaifeadadh. Bain triail as arís níos déanaí.",
"forbidden": "Tá an gníomh seo toirmiscthe."
@@ -2036,11 +2092,31 @@
"retryConnection": "Bain triail eile as nascadh"
},
"newSession": {
+ "recentlyUsed": "A úsáideadh le déanaí",
+ "couldNotLoadGithubRepositories": "Níorbh fhéidir stórtha GitHub a lódáil.",
+ "couldNotLoadGitlabRepositories": "Níorbh fhéidir stórtha GitLab a lódáil.",
+ "couldNotLoadBitbucketRepositories": "Níorbh fhéidir stórtha Bitbucket a lódáil.",
"connectGithubDescription": "Ceangail GitHub i do bhrabhsálaí, ansin fill anseo chun stór a roghnú.",
+ "connectGitlabDescription": "Ceangail GitLab i do bhrabhsálaí, ansin fill anseo chun stór a roghnú.",
+ "connectBitbucketDescription": "Ceangail Bitbucket i do bhrabhsálaí, ansin fill anseo chun stór a roghnú.",
"openGithub": "Oscail GitHub",
+ "openGitlab": "Oscail GitLab",
+ "openBitbucket": "Oscail Bitbucket",
"refreshRepositories": "Athnuaigh stórtha",
"githubConnected": "GitHub ceangailte",
+ "gitlabConnected": "GitLab ceangailte",
"noRepositoriesVisible": "Níl aon stór le feiceáil. Seiceáil an rochtain atá ag aip GitHub Kilo ar na stórtha, ansin athnuaigh an liosta.",
+ "noRepositoriesVisibleGitlab": "Níl aon stór le feiceáil. Seiceáil an rochtain ar stórtha GitLab, ansin athnuaigh an liosta.",
+ "noRepositoriesVisibleBitbucket": "Níl aon stór le feiceáil. Seiceáil an rochtain ar stórtha Bitbucket, ansin athnuaigh an liosta.",
+ "bitbucketOrganizationsOnly": "Tá Bitbucket ar fáil d’eagraíochtaí amháin.",
+ "branchPickerTitle": "Roghnaigh brainse",
+ "branchDefault": "Réamhshocraithe",
+ "branchAccessibility": "Brainse: {{label}}",
+ "branchLoading": "Ag lódáil brainsí",
+ "branchLoadError": "Níorbh fhéidir na brainsí a lódáil",
+ "branchUnavailable": "Níl brainsí ar fáil don stór seo. Seiceáil do rochtain leis an soláthraí, ansin roghnaigh stór eile.",
+ "branchEmpty": "Níl aon bhrainse ar fáil",
+ "branchPlaceholder": "Roghnaigh brainse",
"runOnWithTarget": "Rith ar: {{target}}",
"environment": "Timpeallacht",
"couldNotLoadEnvironment": "Níorbh fhéidir do thimpeallacht a lódáil.",
@@ -2061,24 +2137,13 @@
"couldNotRefreshRepositories": "Níorbh fhéidir stórtha a athnuachan. Bain triail as arís le do thoil.",
"discardDraftTitle": "An gcaithfear an dréacht ar lár?",
"discardDraftMessage": "Caillfear do leid.",
+ "discardWithUploadsMessage": "Scriosfar do leid agus aon chomhad uaslódáilte nach bhfuil ceangailte le teachtaireacht sheolta.",
"discardFailed": "Níorbh fhéidir an dréacht a chaitheamh ar lár. Bain triail as arís le do thoil.",
"remoteHint": "Rith `kilo remote` ar do ríomhaire, nó `/remote` i seisiún CLI atá ar siúl, chun próiseas áitiúil kilo a rialú.",
- "connectBitbucketDescription": "Ceangail Bitbucket i do bhrabhsálaí, ansin fill anseo chun stór a roghnú.",
- "connectGitlabDescription": "Ceangail GitLab i do bhrabhsálaí, ansin fill anseo chun stór a roghnú.",
- "couldNotLoadBitbucketRepositories": "Níorbh fhéidir stórtha Bitbucket a lódáil.",
- "couldNotLoadGithubRepositories": "Níorbh fhéidir stórtha GitHub a lódáil.",
- "couldNotLoadGitlabRepositories": "Níorbh fhéidir stórtha GitLab a lódáil.",
- "gitlabConnected": "GitLab ceangailte",
- "noRepositoriesVisibleBitbucket": "Níl aon stór le feiceáil. Seiceáil an rochtain ar stórtha Bitbucket, ansin athnuaigh an liosta.",
- "noRepositoriesVisibleGitlab": "Níl aon stór le feiceáil. Seiceáil an rochtain ar stórtha GitLab, ansin athnuaigh an liosta.",
- "openBitbucket": "Oscail Bitbucket",
- "openGitlab": "Oscail GitLab",
- "recentlyUsed": "A úsáideadh le déanaí",
- "cliCannotContinue": "Ní féidir leis an CLI seo leanúint ar aghaidh le seisiún. Roghnaigh Cloud Agent nó CLI eile.",
"continueFrom": "Táthar ag leanúint ar aghaidh le {{title}}.",
- "importFailed": "Níorbh fhéidir an seisiún seo a iompórtáil.",
"importingSession": "Ag iompórtáil an tseisiúin",
- "discardWithUploadsMessage": "Scriosfar do leid agus aon chomhad uaslódáilte nach bhfuil ceangailte le teachtaireacht sheolta."
+ "cliCannotContinue": "Ní féidir leis an CLI seo leanúint ar aghaidh le seisiún. Roghnaigh Cloud Agent nó CLI eile.",
+ "importFailed": "Níorbh fhéidir an seisiún seo a iompórtáil."
},
"partRenderer": {
"updatedFileCount_one": "Nuashonraíodh {{displayCount}} chomhad.",
diff --git a/apps/mobile/src/i18n/locales/gl.json b/apps/mobile/src/i18n/locales/gl.json
index 9cfe739f96..87e71fc8b7 100644
--- a/apps/mobile/src/i18n/locales/gl.json
+++ b/apps/mobile/src/i18n/locales/gl.json
@@ -36,6 +36,7 @@
"cost": "Custo",
"discard": "Descartar",
"findings": "Problemas detectados",
+ "mergeRequest": "solicitude de fusión",
"notConnected": "Sen conexión",
"notifications": "Notificacións",
"pullRequest": "solicitude de cambios",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Fila de diferenzas baleira"
},
"connectionExpired": "A conexión con GitHub caducou.",
+ "capabilities": {
+ "banner": {
+ "title": "Non está dispoñible neste provedor",
+ "accessibility": "Non está dispoñible neste provedor: {{reason}}"
+ }
+ },
"merge": {
"merge": "Fusión",
"mergeNow": "Fusionar agora",
"mergePullRequest": "Fusionar a solicitude de integración",
+ "mergeTermTitle": "Fusionar a {{term}}",
"enableAutoMerge": "Activar a fusión automática",
"disableAutoMerge": "Desactivar a fusión automática",
"autoMergeOn": "Fusión automática activada",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Eliminar a rama tras a fusión",
"noEnabledMethods": "Este repositorio non ten ningún método de fusión activado. Pídelle a un administrador do repositorio que active a fusión, a compactación ou o cambio de base.",
"confirmTitle": "Fusionar a solicitude de integración?",
+ "confirmTitleTerm": "Fusionar a {{term}}?",
"confirmMessage": "Isto fusionará os teus cambios na rama base.",
"enableAutoMergeConfirmTitle": "Activar a fusión automática?",
"enableAutoMergeConfirmMessage": "GitHub fusionará esta solicitude de integración automaticamente cando se superen todas as comprobacións obrigatorias.",
+ "enableAutoMergeConfirmMessageTerm": "A {{term}} fusionarase automaticamente cando a súa pipeline teña éxito.",
+ "enableAutoMergeDescriptionTerm": "GitLab fusiona automaticamente esta {{term}} cando a súa pipeline ten éxito.",
"forbidden": "Non tes permiso para fusionar esta solicitude de integración.",
"cannotMerge": "Esta solicitude de integración non se pode fusionar tal e como está.",
"couldNotMerge": "Non se puido fusionar a solicitude de integración.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Xa fusionada",
- "closed": "Solicitude de integración pechada"
+ "closed": "Solicitude de integración pechada",
+ "closedMergeRequest": "Solicitude de fusión pechada"
},
"partialSuccessBanner": {
"body": "Non se puido eliminar a rama: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Esta solicitude de integración aínda non se pode fusionar",
"notMergeableDetail": "GitHub indicou o estado {{state}} para a fusión."
},
+ "restrictions": {
+ "title": "Restricións de fusión",
+ "approvalsRequired_one": "{{displayCount}} aprobación necesaria",
+ "approvalsRequired_other": "{{displayCount}} aprobacións necesarias",
+ "pipelineMustSucceed": "A pipeline debe ter éxito antes de fusionar."
+ },
+ "providerBlocked": {
+ "failingPipeline": "A pipeline está a fallar na última remisión.",
+ "pendingPipeline": "A pipeline aínda se está a executar na última remisión.",
+ "permission": "Non tes permiso para fusionar esta {{term}}.",
+ "draft": "Marca a {{term}} como lista para revisar antes de fusionala."
+ },
"methodLabels": {
"merge": "Crear unha remisión de fusión",
"squash": "Compactar e fusionar",
@@ -448,6 +472,7 @@
"acceptTerms": "Aceptar",
"replyBadRequest": "Non se pode publicar esta resposta. Pode que o fío cambiase.",
"replyForbidden": "Non tes permiso para responder a esta solicitude de integración.",
+ "replyForbiddenTerm": "Non tes permiso para responder a esta {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Este comentario non se pode denunciar.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Revisar a solicitude de integración",
"headLine": "{{counts}} · última remisión {{sha}}",
"entry": {
- "eyebrow": "Abre unha solicitude de integración mediante o seu URL.",
- "pastePrLink": "Pegar unha ligazón a unha PR",
- "noRecentPrs": "Non hai PR recentes",
- "noRecentPrsDescription": "Pega arriba unha ligazón a unha PR para comezar a revisión. A próxima vez aparecerá aquí.",
+ "eyebrow": "Abre unha solicitude de integración ou de fusión mediante o seu URL",
+ "pastePrLink": "Pegar unha ligazón a unha solicitude de integración ou de fusión",
+ "noRecentPrs": "Non hai revisións recentes",
+ "noRecentPrsDescription": "Pega arriba unha ligazón para comezar a revisión — aparecerá aquí a próxima vez.",
"couldNotLoad": "Non se puido cargar.",
"removeFromRecentsTitle": "Eliminar da lista de recentes?",
- "removeFromRecentsMessage": "Esta solicitude de integración eliminarase da túa lista de recentes.",
+ "removeFromRecentsMessage": "Esta revisión eliminarase da túa lista de recentes.",
"removeRecentAccessibility": "Eliminar {{repo}} da lista de recentes",
- "urlAccessibility": "URL da solicitude de integración de GitHub",
- "clearLink": "Limpar a ligazón á solicitude de integración",
- "pasteLink": "Pegar a ligazón á solicitude de integración",
+ "urlAccessibility": "Introduce o URL dunha solicitude de integración ou de fusión",
+ "urlPlaceholder": "URL de solicitude de integración ou de fusión",
+ "openAccessibility": "Abrir solicitude de integración ou de fusión",
+ "clearLink": "Limpar a ligazón",
+ "pasteLink": "Pegar a ligazón á solicitude de integración ou de fusión",
"open": "Apertura"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Non se puido comprobar a conexión con GitHub.",
"checkFailedMessage": "O estado da sesión non estará dispoñible ata que remate a carga.",
+ "checkFailedTitleGitLab": "Non se puido comprobar a conexión con GitLab.",
+ "checkFailedTitleBitbucket": "Non se puido comprobar a conexión con Bitbucket.",
+ "providerCheckFailedMessage": "O estado da conexión non está dispoñible ata que cargue.",
"reconnectTitle": "Volver conectar con GitHub",
"reconnectDescription": "Revogouse a túa conexión con GitHub. Volve conectarte para seguir revisando solicitudes de integración no móbil.",
- "description": "Conecta a túa conta de GitHub para revisar solicitudes de integración no móbil."
+ "description": "Conecta a túa conta de GitHub para revisar solicitudes de integración no móbil.",
+ "gitlabDescription": "Conecta a túa conta de GitLab para revisar solicitudes de fusión no móbil.",
+ "bitbucketDescription": "Conecta Bitbucket a esta organización para revisar solicitudes de integración no móbil.",
+ "bitbucketOrgOnlyDescription": "Selecciona unha organización no teu perfil para revisar as súas solicitudes de integración de Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "A conexión con GitHub caducou.",
- "message": "A túa conexión con GitHub xa non é válida. Volve comprobala. Se é necesario, pedirémosche que te conectes de novo."
+ "message": "A túa conexión con GitHub xa non é válida. Volve comprobala. Se é necesario, pedirémosche que te conectes de novo.",
+ "gitlabTitle": "A conexión con GitLab caducou.",
+ "bitbucketTitle": "A conexión con Bitbucket caducou.",
+ "providerMessage": "A túa conexión con {{provider}} xa non é válida. Volve comprobala. Se é necesario, pedirémosche que te conectes de novo."
},
"eventChips": {
"comment": "Comentar",
@@ -643,6 +679,21 @@
"files": "Ficheiros",
"discussion": "Conversa"
},
+ "terms": {
+ "pullRequest": "Solicitude de cambios",
+ "mergeRequest": "Solicitude de fusión",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Compartir a solicitude de fusión",
+ "viewOnProvider": "Ver en {{provider}}",
+ "mergeRequestUnavailable": "Solicitude de fusión non dispoñible",
+ "unavailableDescription": "Pode que fose eliminada ou que non teñas acceso a ela.",
+ "accessDeniedMergeRequest": "Non tes permiso para ver esta solicitude de fusión.",
+ "couldNotLoadMergeRequest": "Non se puido cargar a solicitude de fusión.",
+ "discussionAccessDenied": "Non tes permiso para ver a conversa desta solicitude de fusión.",
+ "discussionUnavailableMessage": "Pode que esta solicitude de fusión se eliminase.",
+ "noDiscussionDescription": "Esta solicitude de fusión non ten fíos de revisión nin comentarios na conversa.",
+ "noFilesChangedDescription": "Esta solicitude de fusión non contén cambios nos ficheiros."
+ },
"fileStatus": {
"modified": "Modificado",
"renamed": "Renomeado",
@@ -659,7 +710,7 @@
"emptyLine": "(baleiro)"
},
"linkPasteClipboardEmpty": "O portapapeis está baleiro.",
- "linkPasteNotAPullRequest": "Non é unha ligazón a unha solicitude de integración de GitHub.",
+ "linkPasteNotAPullRequest": "Non é unha ligazón a unha solicitude de integración ou de fusión",
"announce": {
"commentPosted": "Comentario publicado",
"reviewSubmitted": "Revisión enviada",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Non se pode publicar este comentario. Pode que a liña seleccionada cambiase ou que a PR se actualizase.",
"reviewNotSubmitted": "Esta revisión non se pode enviar tal e como está. Pode que a PR cambiase ou que esteas a revisar a túa propia solicitude de integración, o que non está permitido.",
+ "reviewNotSubmittedTerm": "Esta revisión non se pode enviar tal como está. Pode que a {{term}} cambiase ou que non poidas revisar a túa propia {{term}}.",
"couldNotPostComment": "Non se puido publicar o comentario.",
"couldNotSubmitReview": "Non se puido enviar a revisión. Comproba a conexión e téntao de novo."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Non se puido responder.",
"couldNotCompleteAction": "Non se puido completar esta acción.",
"mergeResultDefaultError": "GitHub non completou a fusión.",
+ "mergeResultNotCompleted": "A {{term}} non se fusionou. Comproba o seu estado e inténtao de novo.",
"ambiguous": "Non se puido confirmar. Comproba a PR antes de tentalo de novo.",
"persistenceFailed": "Non puidemos rexistrar esta acción. Téntao de novo máis tarde.",
"forbidden": "Non tes permiso para realizar esta acción."
@@ -1988,11 +2041,31 @@
"retryConnection": "Volver tentar a conexión"
},
"newSession": {
+ "recentlyUsed": "Usados recentemente",
+ "couldNotLoadGithubRepositories": "Non se puideron cargar os repositorios de GitHub.",
+ "couldNotLoadGitlabRepositories": "Non se puideron cargar os repositorios de GitLab.",
+ "couldNotLoadBitbucketRepositories": "Non se puideron cargar os repositorios de Bitbucket.",
"connectGithubDescription": "Conecta GitHub no teu navegador e despois volve aquí para escoller un repositorio.",
+ "connectGitlabDescription": "Conecta GitLab no teu navegador e despois volve aquí para escoller un repositorio.",
+ "connectBitbucketDescription": "Conecta Bitbucket no teu navegador e despois volve aquí para escoller un repositorio.",
"openGithub": "Abrir GitHub",
+ "openGitlab": "Abrir GitLab",
+ "openBitbucket": "Abrir Bitbucket",
"refreshRepositories": "Actualizar repositorios",
"githubConnected": "GitHub conectado",
+ "gitlabConnected": "GitLab conectado",
"noRepositoriesVisible": "Non se ve ningún repositorio. Comproba o acceso aos repositorios da aplicación de Kilo en GitHub e despois actualiza a lista.",
+ "noRepositoriesVisibleGitlab": "Non se ve ningún repositorio. Comproba o acceso aos repositorios de GitLab e despois actualiza a lista.",
+ "noRepositoriesVisibleBitbucket": "Non se ve ningún repositorio. Comproba o acceso aos repositorios de Bitbucket e despois actualiza a lista.",
+ "bitbucketOrganizationsOnly": "Bitbucket só está dispoñible para organizacións.",
+ "branchPickerTitle": "Seleccionar rama",
+ "branchDefault": "Predeterminada",
+ "branchAccessibility": "Rama: {{label}}",
+ "branchLoading": "Cargando ramas",
+ "branchLoadError": "Non se puideron cargar as ramas",
+ "branchUnavailable": "Non hai ramas dispoñibles para este repositorio. Comproba o teu acceso co provedor e escolle outro repositorio.",
+ "branchEmpty": "Non hai ramas dispoñibles",
+ "branchPlaceholder": "Selecciona unha rama",
"runOnWithTarget": "Executar en: {{target}}",
"environment": "Contorno",
"couldNotLoadEnvironment": "Non se puido cargar o teu contorno.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Non se puideron actualizar os repositorios. Téntao de novo.",
"discardDraftTitle": "Descartar o borrador?",
"discardDraftMessage": "Perderase a túa instrución.",
+ "discardWithUploadsMessage": "Eliminaranse a túa instrución e os ficheiros subidos que aínda non se enviaron nunha mensaxe.",
"discardFailed": "Non se puido descartar o borrador. Téntao de novo.",
"remoteHint": "Executa `kilo remote` no teu computador, ou `/remote` nunha sesión CLI activa, para controlar un proceso kilo local.",
- "connectBitbucketDescription": "Conecta Bitbucket no teu navegador e despois volve aquí para escoller un repositorio.",
- "connectGitlabDescription": "Conecta GitLab no teu navegador e despois volve aquí para escoller un repositorio.",
- "couldNotLoadBitbucketRepositories": "Non se puideron cargar os repositorios de Bitbucket.",
- "couldNotLoadGithubRepositories": "Non se puideron cargar os repositorios de GitHub.",
- "couldNotLoadGitlabRepositories": "Non se puideron cargar os repositorios de GitLab.",
- "gitlabConnected": "GitLab conectado",
- "noRepositoriesVisibleBitbucket": "Non se ve ningún repositorio. Comproba o acceso aos repositorios de Bitbucket e despois actualiza a lista.",
- "noRepositoriesVisibleGitlab": "Non se ve ningún repositorio. Comproba o acceso aos repositorios de GitLab e despois actualiza a lista.",
- "openBitbucket": "Abrir Bitbucket",
- "openGitlab": "Abrir GitLab",
- "recentlyUsed": "Usados recentemente",
"continueFrom": "Continúas a sesión {{title}}.",
"importingSession": "Importando a sesión",
"cliCannotContinue": "Este CLI non pode continuar unha sesión. Escolle Cloud Agent ou outro CLI.",
- "importFailed": "Non se puido importar esta sesión.",
- "discardWithUploadsMessage": "Eliminaranse a túa instrución e os ficheiros subidos que aínda non se enviaron nunha mensaxe."
+ "importFailed": "Non se puido importar esta sesión."
},
"partRenderer": {
"updatedFileCount_one": "Actualizouse {{displayCount}} ficheiro.",
diff --git a/apps/mobile/src/i18n/locales/gu.json b/apps/mobile/src/i18n/locales/gu.json
index 59735b7e2e..f788d157f6 100644
--- a/apps/mobile/src/i18n/locales/gu.json
+++ b/apps/mobile/src/i18n/locales/gu.json
@@ -36,6 +36,7 @@
"cost": "ખર્ચ",
"discard": "કાઢી નાખો",
"findings": "તારણો",
+ "mergeRequest": "મર્જ રિક્વેસ્ટ",
"notConnected": "જોડાયેલું નથી",
"notifications": "સૂચનાઓ",
"pullRequest": "પુલ રિક્વેસ્ટ",
@@ -340,10 +341,17 @@
"emptyDiffRow": "તફાવતની ખાલી પંક્તિ"
},
"connectionExpired": "GitHub સાથેના જોડાણની મુદત પૂરી થઈ ગઈ છે.",
+ "capabilities": {
+ "banner": {
+ "title": "આ પ્રદાતા પર ઉપલબ્ધ નથી",
+ "accessibility": "આ પ્રદાતા પર ઉપલબ્ધ નથી: {{reason}}"
+ }
+ },
"merge": {
"merge": "મર્જ",
"mergeNow": "હવે મર્જ કરો",
"mergePullRequest": "પુલ રિક્વેસ્ટ મર્જ",
+ "mergeTermTitle": "{{term}} મર્જ",
"enableAutoMerge": "ઓટો-મર્જ ચાલુ કરો",
"disableAutoMerge": "ઓટો-મર્જ બંધ કરો",
"autoMergeOn": "ઓટો-મર્જ ચાલુ છે",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "મર્જ પછી બ્રાન્ચ કાઢી નાખો",
"noEnabledMethods": "આ રિપોઝિટરીમાં મર્જ કરવાની કોઈ પદ્ધતિ ચાલુ નથી. રિપોઝિટરીના એડમિનને મર્જ, સ્ક્વોશ અથવા રીબેઝ પદ્ધતિ ચાલુ કરવા કહો.",
"confirmTitle": "પુલ રિક્વેસ્ટ મર્જ કરવી છે?",
+ "confirmTitleTerm": "{{term}} મર્જ કરવી છે?",
"confirmMessage": "તમારા ફેરફારો બેઝ બ્રાન્ચમાં મર્જ થશે.",
"enableAutoMergeConfirmTitle": "ઓટો-મર્જ ચાલુ કરવું છે?",
"enableAutoMergeConfirmMessage": "બધી જરૂરી તપાસો સફળ થયા પછી GitHub આ પુલ રિક્વેસ્ટ આપમેળે મર્જ કરશે.",
+ "enableAutoMergeConfirmMessageTerm": "પાઇપલાઇન સફળ થતાં {{term}} આપોઆપ મર્જ થઈ જશે.",
+ "enableAutoMergeDescriptionTerm": "પાઇપલાઇન સફળ થતાં GitLab આ {{term}} આપોઆપ મર્જ કરે છે.",
"forbidden": "તમને આ પુલ રિક્વેસ્ટ મર્જ કરવાની પરવાનગી નથી.",
"cannotMerge": "આ પુલ રિક્વેસ્ટ હાલની સ્થિતિમાં મર્જ કરી શકાતી નથી.",
"couldNotMerge": "પુલ રિક્વેસ્ટ મર્જ કરી શકાઈ નહીં.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "પહેલેથી મર્જ થયેલી",
- "closed": "આ પુલ રિક્વેસ્ટ બંધ છે"
+ "closed": "આ પુલ રિક્વેસ્ટ બંધ છે",
+ "closedMergeRequest": "આ મર્જ રિક્વેસ્ટ બંધ છે"
},
"partialSuccessBanner": {
"body": "બ્રાન્ચ કાઢી નાખી શકાઈ નહીં: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "આ પુલ રિક્વેસ્ટ હજુ મર્જ કરી શકાતી નથી",
"notMergeableDetail": "GitHubએ મર્જ કરવાની સ્થિતિ {{state}} દર્શાવી છે."
},
+ "restrictions": {
+ "title": "મર્જ મર્યાદાઓ",
+ "approvalsRequired_one": "{{displayCount}} મંજૂરી જરૂરી",
+ "approvalsRequired_other": "{{displayCount}} મંજૂરીઓ જરૂરી",
+ "pipelineMustSucceed": "મર્જ કરતાં પહેલાં પાઇપલાઇન સફળ થવી જરૂરી છે."
+ },
+ "providerBlocked": {
+ "failingPipeline": "તાજેતરની કમિટ પર પાઇપલાઇન નિષ્ફળ થઈ રહી છે.",
+ "pendingPipeline": "તાજેતરની કમિટ પર પાઇપલાઇન હજી ચાલી રહી છે.",
+ "permission": "તમને આ {{term}} મર્જ કરવાની પરવાનગી નથી.",
+ "draft": "મર્જ કરતાં પહેલાં {{term}}ને સમીક્ષા માટે તૈયાર તરીકે ચિહ્નિત કરો."
+ },
"methodLabels": {
"merge": "મર્જ કમિટ બનાવો",
"squash": "સ્ક્વોશ કરીને મર્જ કરો",
@@ -448,6 +472,7 @@
"acceptTerms": "સ્વીકારો",
"replyBadRequest": "આ જવાબ પોસ્ટ કરી શકાતો નથી. થ્રેડ બદલાયો હોઈ શકે છે.",
"replyForbidden": "તમને આ પુલ રિક્વેસ્ટ પર જવાબ આપવાની પરવાનગી નથી.",
+ "replyForbiddenTerm": "તમને આ {{term}} પર જવાબ આપવાની પરવાનગી નથી.",
"moderation": {
"reportContent": {
"terminal": "આ ટિપ્પણી વિશે ફરિયાદ કરી શકાતી નથી.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "પુલ રિક્વેસ્ટની સમીક્ષા કરો",
"headLine": "{{counts}} · હેડ {{sha}}",
"entry": {
- "eyebrow": "URL પરથી પુલ રિક્વેસ્ટ ખોલો.",
- "pastePrLink": "PR લિંક પેસ્ટ કરો",
- "noRecentPrs": "તાજેતરમાં કોઈ PR નથી",
- "noRecentPrsDescription": "સમીક્ષા શરૂ કરવા ઉપર PR લિંક પેસ્ટ કરો — તે આગલી વખતે અહીં દેખાશે.",
+ "eyebrow": "URL દ્વારા પુલ રિક્વેસ્ટ કે મર્જ રિક્વેસ્ટ ખોલો",
+ "pastePrLink": "પુલ રિક્વેસ્ટ કે મર્જ રિક્વેસ્ટનો લિંક પેસ્ટ કરો",
+ "noRecentPrs": "કોઈ તાજેતરની સમીક્ષા નથી",
+ "noRecentPrsDescription": "સમીક્ષા શરૂ કરવા ઉપર લિંક પેસ્ટ કરો — આગલી વારે તે અહીં દેખાશે.",
"couldNotLoad": "લોડ કરી શકાયું નહીં.",
"removeFromRecentsTitle": "તાજેતરની યાદીમાંથી દૂર કરવી છે?",
- "removeFromRecentsMessage": "આ પુલ રિક્વેસ્ટ તમારી તાજેતરની યાદીમાંથી દૂર થશે.",
+ "removeFromRecentsMessage": "આ સમીક્ષા તમારી તાજેતરની યાદીમાંથી દૂર કરવામાં આવશે.",
"removeRecentAccessibility": "{{repo}}ને તાજેતરની યાદીમાંથી દૂર કરો",
- "urlAccessibility": "GitHub પુલ રિક્વેસ્ટનું URL",
- "clearLink": "પુલ રિક્વેસ્ટની લિંક દૂર કરો",
- "pasteLink": "પુલ રિક્વેસ્ટની લિંક પેસ્ટ કરો",
+ "urlAccessibility": "પુલ રિક્વેસ્ટ કે મર્જ રિક્વેસ્ટનો URL દાખલ કરો",
+ "urlPlaceholder": "પુલ રિક્વેસ્ટ કે મર્જ રિક્વેસ્ટ URL",
+ "openAccessibility": "પુલ રિક્વેસ્ટ કે મર્જ રિક્વેસ્ટ ખોલો",
+ "clearLink": "લિંક સાફ કરો",
+ "pasteLink": "પુલ રિક્વેસ્ટ કે મર્જ રિક્વેસ્ટનો લિંક પેસ્ટ કરો",
"open": "ખોલો"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub કનેક્શન તપાસી શકાયું નહીં.",
"checkFailedMessage": "આ લોડ ન થાય ત્યાં સુધી સાઇન ઇનની સ્થિતિ જાણી શકાતી નથી.",
+ "checkFailedTitleGitLab": "GitLab કનેક્શન તપાસી શકાયું નહીં.",
+ "checkFailedTitleBitbucket": "Bitbucket કનેક્શન તપાસી શકાયું નહીં.",
+ "providerCheckFailedMessage": "આ લોડ થાય ત્યાં સુધી કનેક્શનની સ્થિતિ ઉપલબ્ધ નથી.",
"reconnectTitle": "GitHub સાથે ફરી કનેક્ટ કરો",
"reconnectDescription": "તમારું GitHub કનેક્શન રદ થયું છે. મોબાઇલ પર પુલ રિક્વેસ્ટની સમીક્ષા ચાલુ રાખવા ફરી કનેક્ટ કરો.",
- "description": "મોબાઇલ પર પુલ રિક્વેસ્ટની સમીક્ષા કરવા તમારું GitHub એકાઉન્ટ કનેક્ટ કરો."
+ "description": "મોબાઇલ પર પુલ રિક્વેસ્ટની સમીક્ષા કરવા તમારું GitHub એકાઉન્ટ કનેક્ટ કરો.",
+ "gitlabDescription": "મોબાઇલ પર મર્જ રિક્વેસ્ટની સમીક્ષા કરવા માટે તમારું GitLab ખાતું કનેક્ટ કરો.",
+ "bitbucketDescription": "મોબાઇલ પર પુલ રિક્વેસ્ટની સમીક્ષા કરવા માટે આ સંસ્થાને Bitbucket સાથે કનેક્ટ કરો.",
+ "bitbucketOrgOnlyDescription": "તેની Bitbucket પુલ રિક્વેસ્ટની સમીક્ષા કરવા માટે તમારી પ્રોફાઇલમાં એક સંસ્થા પસંદ કરો."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub સાથેના જોડાણની મુદત પૂરી થઈ ગઈ છે.",
- "message": "તમારું GitHub કનેક્શન હવે માન્ય નથી. તમારું કનેક્શન ફરી તપાસો — જરૂર પડે તો તમને ફરી કનેક્ટ થવા કહેવામાં આવશે."
+ "message": "તમારું GitHub કનેક્શન હવે માન્ય નથી. તમારું કનેક્શન ફરી તપાસો — જરૂર પડે તો તમને ફરી કનેક્ટ થવા કહેવામાં આવશે.",
+ "gitlabTitle": "GitLab સાથેના જોડાણની મુદત પૂરી થઈ ગઈ છે.",
+ "bitbucketTitle": "Bitbucket સાથેના જોડાણની મુદત પૂરી થઈ ગઈ છે.",
+ "providerMessage": "તમારું {{provider}} કનેક્શન હવે માન્ય નથી. તમારું કનેક્શન ફરી તપાસો — જરૂર પડે તો તમને ફરી કનેક્ટ થવા કહેવામાં આવશે."
},
"eventChips": {
"comment": "ટિપ્પણી",
@@ -643,6 +679,21 @@
"files": "ફાઇલો",
"discussion": "ચર્ચા"
},
+ "terms": {
+ "pullRequest": "પુલ રિક્વેસ્ટ",
+ "mergeRequest": "મર્જ રિક્વેસ્ટ",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "મર્જ રિક્વેસ્ટ શેર કરો",
+ "viewOnProvider": "{{provider}} પર જુઓ",
+ "mergeRequestUnavailable": "મર્જ રિક્વેસ્ટ ઉપલબ્ધ નથી",
+ "unavailableDescription": "કદાચ તે કાઢી નાખવામાં આવી હોય, અથવા તમારી પાસે તેની એક્સેસ ન હોય.",
+ "accessDeniedMergeRequest": "તમને આ મર્જ રિક્વેસ્ટ જોવાની પરવાનગી નથી.",
+ "couldNotLoadMergeRequest": "મર્જ રિક્વેસ્ટ લોડ કરી શકાઈ નહીં.",
+ "discussionAccessDenied": "તમને આ મર્જ રિક્વેસ્ટની ચર્ચા જોવાની પરવાનગી નથી.",
+ "discussionUnavailableMessage": "આ મર્જ રિક્વેસ્ટ કાઢી નાખવામાં આવી હોઈ શકે છે.",
+ "noDiscussionDescription": "આ મર્જ રિક્વેસ્ટ પર હજી સમીક્ષાનો કોઈ થ્રેડ કે ચર્ચાની કોઈ ટિપ્પણી નથી.",
+ "noFilesChangedDescription": "આ મર્જ રિક્વેસ્ટમાં કોઈ ફાઇલમાં ફેરફાર નથી."
+ },
"fileStatus": {
"modified": "ફેરફાર કરેલી",
"renamed": "નામ બદલેલી",
@@ -659,7 +710,7 @@
"emptyLine": "(ખાલી)"
},
"linkPasteClipboardEmpty": "ક્લિપબોર્ડ ખાલી છે.",
- "linkPasteNotAPullRequest": "આ GitHub પુલ રિક્વેસ્ટની લિંક નથી.",
+ "linkPasteNotAPullRequest": "આ પુલ રિક્વેસ્ટ કે મર્જ રિક્વેસ્ટનો લિંક નથી",
"announce": {
"commentPosted": "ટિપ્પણી પોસ્ટ થઈ",
"reviewSubmitted": "સમીક્ષા મોકલાઈ",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "આ ટિપ્પણી પોસ્ટ કરી શકાતી નથી. કદાચ પસંદ કરેલી લીટી બદલાઈ છે અથવા PR અપડેટ થઈ છે.",
"reviewNotSubmitted": "આ સમીક્ષા હાલની સ્થિતિમાં મોકલી શકાતી નથી. કદાચ PR બદલાઈ છે અથવા આ તમારી પોતાની પુલ રિક્વેસ્ટ છે, જેની તમે સમીક્ષા કરી શકતા નથી.",
+ "reviewNotSubmittedTerm": "આ સમીક્ષા એવીની એવી સબમિટ થઈ શકે નહીં. કદાચ {{term}} બદલાઈ ગઈ હોય, અથવા તમે તમારી પોતાની {{term}}ની સમીક્ષા કરી શકો નહીં.",
"couldNotPostComment": "ટિપ્પણી પોસ્ટ કરી શકાઈ નહીં.",
"couldNotSubmitReview": "સમીક્ષા મોકલી શકાઈ નહીં. તમારું કનેક્શન ચકાસો અને ફરી પ્રયત્ન કરો."
},
@@ -675,6 +727,7 @@
"couldNotReply": "જવાબ આપી શકાયો નહીં.",
"couldNotCompleteAction": "આ ક્રિયા પૂર્ણ કરી શકાઈ નહીં.",
"mergeResultDefaultError": "GitHubએ મર્જ પૂર્ણ કર્યું નથી.",
+ "mergeResultNotCompleted": "{{term}} મર્જ થઈ નથી. તેની સ્થિતિ તપાસો અને ફરી પ્રયાસ કરો.",
"ambiguous": "પુષ્ટિ કરી શકાઈ નહીં — ફરી પ્રયત્ન કરતાં પહેલાં PR તપાસો.",
"persistenceFailed": "આ ક્રિયાની નોંધ કરી શકાઈ નહીં. કૃપા કરીને પછીથી ફરી પ્રયત્ન કરો.",
"forbidden": "આ માટે પરવાનગી નથી."
@@ -1988,11 +2041,31 @@
"retryConnection": "કનેક્ટ કરવા ફરી પ્રયાસ કરો"
},
"newSession": {
+ "recentlyUsed": "તાજેતરમાં ઉપયોગમાં લેવાયેલું",
+ "couldNotLoadGithubRepositories": "GitHub રિપોઝિટરીઓ લોડ કરી શકાઈ નહીં.",
+ "couldNotLoadGitlabRepositories": "GitLab રિપોઝિટરીઓ લોડ કરી શકાઈ નહીં.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket રિપોઝિટરીઓ લોડ કરી શકાઈ નહીં.",
"connectGithubDescription": "તમારા બ્રાઉઝરમાં GitHub કનેક્ટ કરો, પછી રિપોઝિટરી પસંદ કરવા અહીં પાછા આવો.",
+ "connectGitlabDescription": "તમારા બ્રાઉઝરમાં GitLab કનેક્ટ કરો, પછી રિપોઝિટરી પસંદ કરવા અહીં પાછા આવો.",
+ "connectBitbucketDescription": "તમારા બ્રાઉઝરમાં Bitbucket કનેક્ટ કરો, પછી રિપોઝિટરી પસંદ કરવા અહીં પાછા આવો.",
"openGithub": "GitHub ખોલો",
+ "openGitlab": "GitLab ખોલો",
+ "openBitbucket": "Bitbucket ખોલો",
"refreshRepositories": "રિપોઝિટરીઓ રિફ્રેશ કરો",
"githubConnected": "GitHub કનેક્ટ થયું",
+ "gitlabConnected": "GitLab કનેક્ટ થયું",
"noRepositoriesVisible": "કોઈ રિપોઝિટરી દેખાતી નથી. Kilo GitHub એપને રિપોઝિટરીનો ઍક્સેસ છે કે નહીં તે તપાસો, પછી રિફ્રેશ કરો.",
+ "noRepositoriesVisibleGitlab": "કોઈ રિપોઝિટરી દેખાતી નથી. GitLab માટે રિપોઝિટરીનો ઍક્સેસ તપાસો, પછી રિફ્રેશ કરો.",
+ "noRepositoriesVisibleBitbucket": "કોઈ રિપોઝિટરી દેખાતી નથી. Bitbucket માટે રિપોઝિટરીનો ઍક્સેસ તપાસો, પછી રિફ્રેશ કરો.",
+ "bitbucketOrganizationsOnly": "Bitbucket ફક્ત સંસ્થાઓ માટે ઉપલબ્ધ છે.",
+ "branchPickerTitle": "બ્રાંચ પસંદ કરો",
+ "branchDefault": "ડિફૉલ્ટ",
+ "branchAccessibility": "બ્રાંચ: {{label}}",
+ "branchLoading": "બ્રાંચ લોડ થાય છે",
+ "branchLoadError": "બ્રાંચ લોડ થઈ શક્યાં નહીં",
+ "branchUnavailable": "આ રિપોઝિટરી માટે બ્રાંચ ઉપલબ્ધ નથી. પ્રદાતા પાસે તમારી એક્સેસ તપાસો, પછી બીજી રિપોઝિટરી પસંદ કરો.",
+ "branchEmpty": "કોઈ બ્રાંચ ઉપલબ્ધ નથી",
+ "branchPlaceholder": "એક બ્રાંચ પસંદ કરો",
"runOnWithTarget": "{{target}} પર ચલાવો",
"environment": "કાર્યપરિસર",
"couldNotLoadEnvironment": "તમારું કાર્યપરિસર લોડ કરી શકાયું નહીં.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "રિપોઝિટરીઓ રિફ્રેશ કરી શકાઈ નહીં. ફરી પ્રયાસ કરો.",
"discardDraftTitle": "ડ્રાફ્ટ કાઢી નાખવો?",
"discardDraftMessage": "તમારો પ્રોમ્પ્ટ કાઢી નાખવામાં આવશે.",
+ "discardWithUploadsMessage": "તમારો પ્રોમ્પ્ટ અને હજી કોઈ સંદેશમાં જોડાઈ ન હોય તેવી અપલોડ કરેલી ફાઇલો કાઢી નાખવામાં આવશે.",
"discardFailed": "ડ્રાફ્ટ કાઢી શકાયો નહીં. ફરી પ્રયાસ કરો.",
"remoteHint": "સ્થાનિક kilo પ્રક્રિયાને નિયંત્રિત કરવા તમારા કમ્પ્યુટર પર `kilo remote` ચલાવો, અથવા ચાલુ CLI સત્રમાં `/remote` વાપરો.",
- "connectBitbucketDescription": "તમારા બ્રાઉઝરમાં Bitbucket કનેક્ટ કરો, પછી રિપોઝિટરી પસંદ કરવા અહીં પાછા આવો.",
- "connectGitlabDescription": "તમારા બ્રાઉઝરમાં GitLab કનેક્ટ કરો, પછી રિપોઝિટરી પસંદ કરવા અહીં પાછા આવો.",
- "couldNotLoadBitbucketRepositories": "Bitbucket રિપોઝિટરીઓ લોડ કરી શકાઈ નહીં.",
- "couldNotLoadGithubRepositories": "GitHub રિપોઝિટરીઓ લોડ કરી શકાઈ નહીં.",
- "couldNotLoadGitlabRepositories": "GitLab રિપોઝિટરીઓ લોડ કરી શકાઈ નહીં.",
- "gitlabConnected": "GitLab કનેક્ટ થયું",
- "noRepositoriesVisibleBitbucket": "કોઈ રિપોઝિટરી દેખાતી નથી. Bitbucket માટે રિપોઝિટરીનો ઍક્સેસ તપાસો, પછી રિફ્રેશ કરો.",
- "noRepositoriesVisibleGitlab": "કોઈ રિપોઝિટરી દેખાતી નથી. GitLab માટે રિપોઝિટરીનો ઍક્સેસ તપાસો, પછી રિફ્રેશ કરો.",
- "openBitbucket": "Bitbucket ખોલો",
- "openGitlab": "GitLab ખોલો",
- "recentlyUsed": "તાજેતરમાં ઉપયોગમાં લેવાયેલું",
"continueFrom": "{{title}} સત્ર આગળ ચાલુ થઈ રહ્યું છે.",
"importingSession": "સત્ર આયાત થઈ રહ્યું છે",
"cliCannotContinue": "આ CLI સત્ર ચાલુ રાખી શકતું નથી. Cloud Agent અથવા બીજું CLI પસંદ કરો.",
- "importFailed": "આ સત્ર આયાત કરી શકાયું નહીં.",
- "discardWithUploadsMessage": "તમારો પ્રોમ્પ્ટ અને હજી કોઈ સંદેશમાં જોડાઈ ન હોય તેવી અપલોડ કરેલી ફાઇલો કાઢી નાખવામાં આવશે."
+ "importFailed": "આ સત્ર આયાત કરી શકાયું નહીં."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} ફાઇલ અપડેટ થઈ.",
diff --git a/apps/mobile/src/i18n/locales/ha.json b/apps/mobile/src/i18n/locales/ha.json
index 5979dae811..b365dcc5fc 100644
--- a/apps/mobile/src/i18n/locales/ha.json
+++ b/apps/mobile/src/i18n/locales/ha.json
@@ -36,6 +36,7 @@
"cost": "Farashi",
"discard": "Yi watsi",
"findings": "Sakamakon bincike",
+ "mergeRequest": "buƙatar haɗawa",
"notConnected": "Ba a haɗa ba",
"notifications": "Sanarwa",
"pullRequest": "buƙatar haɗa canje-canje",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Layin bambancin fayil marar komai"
},
"connectionExpired": "Wa'adin haɗin GitHub ya ƙare.",
+ "capabilities": {
+ "banner": {
+ "title": "Ba ya samuwa ga wannan mai ba da sabis",
+ "accessibility": "Ba ya samuwa ga wannan mai ba da sabis: {{reason}}"
+ }
+ },
"merge": {
"merge": "Haɗawa",
"mergeNow": "Haɗa yanzu",
"mergePullRequest": "Haɗa buƙatar haɗawa",
+ "mergeTermTitle": "Haɗa {{term}}",
"enableAutoMerge": "Kunna haɗawa ta atomatik",
"disableAutoMerge": "Kashe haɗawa ta atomatik",
"autoMergeOn": "Haɗawa ta atomatik tana aiki",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Share reshe bayan haɗawa",
"noEnabledMethods": "Ba a kunna wata hanyar haɗawa a wannan ma'ajiyar lamba ba. Nemi mai kula da ita ya kunna haɗawa, dunƙulewa ko sake kafa tushe.",
"confirmTitle": "A haɗa buƙatar haɗawa?",
+ "confirmTitleTerm": "A haɗa {{term}}?",
"confirmMessage": "Wannan zai haɗa canje-canjenka cikin reshen tushe.",
"enableAutoMergeConfirmTitle": "A kunna haɗawa ta atomatik?",
"enableAutoMergeConfirmMessage": "GitHub zai haɗa wannan buƙatar haɗawa ta atomatik idan duk gwaje-gwajen da ake buƙata sun yi nasara.",
+ "enableAutoMergeConfirmMessageTerm": "Za a haɗa {{term}} ta atomatik da zarar pipeline ɗinta ya yi nasara.",
+ "enableAutoMergeDescriptionTerm": "GitLab zai haɗa wannan {{term}} ta atomatik da zarar pipeline ɗinta ya yi nasara.",
"forbidden": "Ba ka da izinin haɗa wannan buƙatar haɗawa.",
"cannotMerge": "Ba za a iya haɗa wannan buƙatar haɗawa yadda take ba.",
"couldNotMerge": "An kasa haɗa buƙatar haɗawa.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "An riga an haɗa",
- "closed": "An rufe wannan buƙatar haɗawa"
+ "closed": "An rufe wannan buƙatar haɗawa",
+ "closedMergeRequest": "An rufe wannan buƙatar haɗawa"
},
"partialSuccessBanner": {
"body": "Ba a iya share reshen ba: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Ba za a iya haɗa wannan buƙatar haɗawa ba tukuna",
"notMergeableDetail": "GitHub ya ba da rahoton matsayin haɗawa: {{state}}."
},
+ "restrictions": {
+ "title": "Ƙuntatawan haɗawa",
+ "approvalsRequired_one": "Ana buƙatar amincewa {{displayCount}}",
+ "approvalsRequired_other": "Ana buƙatar amincewa {{displayCount}}",
+ "pipelineMustSucceed": "Dole ne pipeline ya yi nasara kafin haɗawa."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline yana gazaawa a kan rikodin canje-canje na baya-bayan nan.",
+ "pendingPipeline": "Pipeline har yanzu yana aiki a kan rikodin canje-canje na baya-bayan nan.",
+ "permission": "Ba ka da izinin haɗa wannan {{term}}.",
+ "draft": "Sa alamar cewa {{term}} ta shirya don bita kafin haɗawa."
+ },
"methodLabels": {
"merge": "Ƙirƙiri rikodin haɗawa",
"squash": "Dunƙule sannan ka haɗa",
@@ -448,6 +472,7 @@
"acceptTerms": "Amince",
"replyBadRequest": "Ba za a iya wallafa wannan amsar ba. Wataƙila silsilar tattaunawar ta canza.",
"replyForbidden": "Ba ka da izinin amsa wannan buƙatar haɗawa.",
+ "replyForbiddenTerm": "Ba ka da izinin amsa wannan {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Ba za a iya kai rahoton wannan tsokacin ba.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Yi bitar buƙatar haɗawa",
"headLine": "{{counts}} · rikodin ƙarshe {{sha}}",
"entry": {
- "eyebrow": "Buɗe buƙatar haɗawa ta URL.",
- "pastePrLink": "Manna mahaɗin PR",
- "noRecentPrs": "Babu PR na kwanan nan",
- "noRecentPrsDescription": "Manna mahaɗin PR a sama don fara bita — zai bayyana a nan a gaba.",
+ "eyebrow": "Buɗe buƙatar haɗa canje-canje ko buƙatar haɗawa ta URL",
+ "pastePrLink": "Manna mahaɗin buƙatar haɗa canje-canje ko buƙatar haɗawa",
+ "noRecentPrs": "Babu bitutu na baya-bayan nan",
+ "noRecentPrsDescription": "Manna mahaɗi a sama don fara bita — zai bayyana a nan a karo na gaba.",
"couldNotLoad": "Ba a iya lodawa ba.",
"removeFromRecentsTitle": "A cire daga jerin na kwanan nan?",
- "removeFromRecentsMessage": "Za a cire wannan buƙatar haɗawa daga jerin waɗanda ka buɗe kwanan nan.",
+ "removeFromRecentsMessage": "Za a cire wannan bita daga na baya-bayan nan.",
"removeRecentAccessibility": "Cire {{repo}} daga jerin na kwanan nan",
- "urlAccessibility": "URL na buƙatar haɗawa a GitHub",
- "clearLink": "Share mahaɗin buƙatar haɗawa",
- "pasteLink": "Manna mahaɗin buƙatar haɗawa",
+ "urlAccessibility": "Shigar da URL na buƙatar haɗa canje-canje ko buƙatar haɗawa",
+ "urlPlaceholder": "URL na buƙatar haɗa canje-canje ko buƙatar haɗawa",
+ "openAccessibility": "Buɗe buƙatar haɗa canje-canje ko buƙatar haɗawa",
+ "clearLink": "Share mahaɗi",
+ "pasteLink": "Manna mahaɗin buƙatar haɗa canje-canje ko buƙatar haɗawa",
"open": "Buɗe"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Ba a iya duba haɗin GitHub ba.",
"checkFailedMessage": "Ba za a iya sanin matsayin shiga ba har sai an loda wannan.",
+ "checkFailedTitleGitLab": "Ba a iya duba haɗin GitLab ba.",
+ "checkFailedTitleBitbucket": "Ba a iya duba haɗin Bitbucket ba.",
+ "providerCheckFailedMessage": "Ba a samun yanayin haɗi har sai wannan ya lodu.",
"reconnectTitle": "Sake haɗa GitHub",
"reconnectDescription": "An soke haɗinka na GitHub. Sake haɗawa don ci gaba da bitar buƙatun haɗawa a waya.",
- "description": "Haɗa asusunka na GitHub don yin bitar buƙatun haɗawa a waya."
+ "description": "Haɗa asusunka na GitHub don yin bitar buƙatun haɗawa a waya.",
+ "gitlabDescription": "Haɗa asusun GitLab ɗinka don bita buƙatun haɗawa a wayar hannu.",
+ "bitbucketDescription": "Haɗa Bitbucket da wannan ƙungiya don bita buƙatun haɗa canje-canje a wayar hannu.",
+ "bitbucketOrgOnlyDescription": "Zaɓi ƙungiya a cikin bayanan martabarka don bita buƙatun haɗa canje-canje na Bitbucket na ƙungiyar."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Wa'adin haɗin GitHub ya ƙare.",
- "message": "Haɗinka na GitHub ya daina aiki. Sake duba haɗin — za a nemi ka sake haɗawa idan ana buƙata."
+ "message": "Haɗinka na GitHub ya daina aiki. Sake duba haɗin — za a nemi ka sake haɗawa idan ana buƙata.",
+ "gitlabTitle": "Wa'adin haɗin GitLab ya ƙare.",
+ "bitbucketTitle": "Wa'adin haɗin Bitbucket ya ƙare.",
+ "providerMessage": "Haɗinka na {{provider}} ya daina aiki. Sake duba haɗin — za a nemi ka sake haɗawa idan ana buƙata."
},
"eventChips": {
"comment": "Yi tsokaci",
@@ -643,6 +679,21 @@
"files": "Fayiloli",
"discussion": "Tattaunawa"
},
+ "terms": {
+ "pullRequest": "Buƙatar haɗa canje-canje",
+ "mergeRequest": "Buƙatar haɗawa",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Raba buƙatar haɗawa",
+ "viewOnProvider": "Duba a {{provider}}",
+ "mergeRequestUnavailable": "Buƙatar haɗawa ba ta samuwa",
+ "unavailableDescription": "Wataƙila an share shi, ko kuma ba ka da damar shiga.",
+ "accessDeniedMergeRequest": "Ba ka da izinin duba wannan buƙatar haɗawa.",
+ "couldNotLoadMergeRequest": "Ba a iya loda buƙatar haɗawa ba.",
+ "discussionAccessDenied": "Ba ka da izinin duba tattaunawar wannan buƙatar haɗawa.",
+ "discussionUnavailableMessage": "Wataƙila an cire wannan buƙatar haɗawa.",
+ "noDiscussionDescription": "Babu silsilar bita ko tsokacin tattaunawa a wannan buƙatar haɗawa.",
+ "noFilesChangedDescription": "Babu canje-canje ga fayiloli a wannan buƙatar haɗawa."
+ },
"fileStatus": {
"modified": "An gyara",
"renamed": "An canza suna",
@@ -659,7 +710,7 @@
"emptyLine": "(marar komai)"
},
"linkPasteClipboardEmpty": "Babu komai a allon kwafi.",
- "linkPasteNotAPullRequest": "Wannan ba mahaɗin buƙatar haɗawa ta GitHub ba ne.",
+ "linkPasteNotAPullRequest": "Ba mahaɗin buƙatar haɗa canje-canje ko buƙatar haɗawa ba ne",
"announce": {
"commentPosted": "An wallafa tsokaci",
"reviewSubmitted": "An aika bita",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Ba za a iya wallafa wannan tsokacin ba. Wataƙila layin da aka zaɓa ya canza, ko an sabunta PR.",
"reviewNotSubmitted": "Ba za a iya aika wannan bitar yadda take ba. Wataƙila PR ya canza, ko kuma ba za ka iya yin bitar buƙatar haɗawa da ka buɗe da kanka ba.",
+ "reviewNotSubmittedTerm": "Ba a iya aika wannan bita yadda yake ba. Wataƙila {{term}} ya canza, ko ba za ka iya bita {{term}} ɗinka ba.",
"couldNotPostComment": "Ba a iya wallafa tsokaci ba.",
"couldNotSubmitReview": "Ba a iya aika bita ba. Duba haɗinka na intanet ka sake gwadawa."
},
@@ -675,6 +727,7 @@
"couldNotReply": "An kasa amsawa.",
"couldNotCompleteAction": "Ba a iya kammala wannan aikin ba.",
"mergeResultDefaultError": "GitHub bai kammala haɗawa ba.",
+ "mergeResultNotCompleted": "Ba a haɗa {{term}} ba. Duba yanayinsa ka sake gwadawa.",
"ambiguous": "Ba a iya tabbatarwa ba — duba PR kafin ka sake gwadawa.",
"persistenceFailed": "Ba mu iya adana wannan aikin ba. Sake gwadawa daga baya.",
"forbidden": "Ba a ba da izini ba."
@@ -1988,11 +2041,31 @@
"retryConnection": "Sake gwada haɗi"
},
"newSession": {
+ "recentlyUsed": "An yi amfani da su kwanan nan",
+ "couldNotLoadGithubRepositories": "An kasa loda ma'ajiyoyin GitHub.",
+ "couldNotLoadGitlabRepositories": "An kasa loda ma'ajiyoyin GitLab.",
+ "couldNotLoadBitbucketRepositories": "An kasa loda ma'ajiyoyin Bitbucket.",
"connectGithubDescription": "Haɗa GitHub a burauzarka, sannan ka dawo nan don zaɓar ma'ajiya.",
+ "connectGitlabDescription": "Haɗa GitLab a burauzarka, sannan ka dawo nan don zaɓar ma'ajiya.",
+ "connectBitbucketDescription": "Haɗa Bitbucket a burauzarka, sannan ka dawo nan don zaɓar ma'ajiya.",
"openGithub": "Buɗe GitHub",
+ "openGitlab": "Buɗe GitLab",
+ "openBitbucket": "Buɗe Bitbucket",
"refreshRepositories": "Sabunta ma'ajiyoyi",
"githubConnected": "An haɗa GitHub",
+ "gitlabConnected": "An haɗa GitLab",
"noRepositoriesVisible": "Babu ma'ajiyoyi da ake gani. Duba izinin shiga ma'ajiyoyi na manhajar Kilo ta GitHub, sannan ka sabunta.",
+ "noRepositoriesVisibleGitlab": "Babu ma'ajiyoyi da ake gani. Duba izinin shiga ma'ajiyoyi na GitLab, sannan ka sabunta.",
+ "noRepositoriesVisibleBitbucket": "Babu ma'ajiyoyi da ake gani. Duba izinin shiga ma'ajiyoyi na Bitbucket, sannan ka sabunta.",
+ "bitbucketOrganizationsOnly": "Bitbucket yana samuwa ga ƙungiyoyi kawai.",
+ "branchPickerTitle": "Zaɓi reshe",
+ "branchDefault": "Na al'ada",
+ "branchAccessibility": "Reshe: {{label}}",
+ "branchLoading": "Ana loda rasshe",
+ "branchLoadError": "Ba a iya loda rasshe ba",
+ "branchUnavailable": "Rasshe ba su samuwa ga wannan ma'ajiya ba. Duba damar shigarka tare da mai ba da sabis, sannan ka zaɓi wata ma'ajiya.",
+ "branchEmpty": "Babu reshe da ya samu",
+ "branchPlaceholder": "Zaɓi reshe",
"runOnWithTarget": "Gudanar da aiki a: {{target}}",
"environment": "Muhallin aiki",
"couldNotLoadEnvironment": "An kasa loda muhallin aikinka.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "An kasa sabunta ma'ajiyoyi. Sake gwadawa.",
"discardDraftTitle": "Watsar da daftari?",
"discardDraftMessage": "Za a rasa umarnin aikinka.",
+ "discardWithUploadsMessage": "Za a share umarnin aikinka da duk fayilolin da aka ɗora amma ba a haɗa su da saƙonnin da aka aika ba.",
"discardFailed": "An kasa watsar da daftarin. Sake gwadawa.",
"remoteHint": "Gudanar da `kilo remote` a kwamfutarka, ko `/remote` a zaman CLI da ke gudana, don sarrafa aikin kilo a kwamfutarka.",
- "connectBitbucketDescription": "Haɗa Bitbucket a burauzarka, sannan ka dawo nan don zaɓar ma'ajiya.",
- "connectGitlabDescription": "Haɗa GitLab a burauzarka, sannan ka dawo nan don zaɓar ma'ajiya.",
- "couldNotLoadBitbucketRepositories": "An kasa loda ma'ajiyoyin Bitbucket.",
- "couldNotLoadGithubRepositories": "An kasa loda ma'ajiyoyin GitHub.",
- "couldNotLoadGitlabRepositories": "An kasa loda ma'ajiyoyin GitLab.",
- "gitlabConnected": "An haɗa GitLab",
- "noRepositoriesVisibleBitbucket": "Babu ma'ajiyoyi da ake gani. Duba izinin shiga ma'ajiyoyi na Bitbucket, sannan ka sabunta.",
- "noRepositoriesVisibleGitlab": "Babu ma'ajiyoyi da ake gani. Duba izinin shiga ma'ajiyoyi na GitLab, sannan ka sabunta.",
- "openBitbucket": "Buɗe Bitbucket",
- "openGitlab": "Buɗe GitLab",
- "recentlyUsed": "An yi amfani da su kwanan nan",
- "cliCannotContinue": "Wannan CLI ba zai iya ci gaba da zaman ba. Zaɓi Cloud Agent ko wani CLI.",
"continueFrom": "Ana ci gaba da {{title}}.",
- "importFailed": "An kasa shigo da wannan zaman.",
"importingSession": "Ana shigo da zaman",
- "discardWithUploadsMessage": "Za a share umarnin aikinka da duk fayilolin da aka ɗora amma ba a haɗa su da saƙonnin da aka aika ba."
+ "cliCannotContinue": "Wannan CLI ba zai iya ci gaba da zaman ba. Zaɓi Cloud Agent ko wani CLI.",
+ "importFailed": "An kasa shigo da wannan zaman."
},
"partRenderer": {
"updatedFileCount_one": "An sabunta fayil {{displayCount}}.",
diff --git a/apps/mobile/src/i18n/locales/he.json b/apps/mobile/src/i18n/locales/he.json
index cfe8e909d4..89d477378f 100644
--- a/apps/mobile/src/i18n/locales/he.json
+++ b/apps/mobile/src/i18n/locales/he.json
@@ -4,6 +4,8 @@
"done": "סיום",
"retry": "ניסיון חוזר",
"tryAgain": "ניסיון נוסף",
+ "continue": "המשך",
+ "notNow": "לא עכשיו",
"language": "שפה",
"device": "מכשיר",
"share": "שיתוף {{title}}",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "לא ניתן היה להעתיק ללוח ההעתקה.",
"required": "חובה",
"error": "שגיאה: {{error}}",
- "notNow": "לא עכשיו",
- "continue": "המשך",
"back": "חזרה",
"somethingWentWrong": "משהו השתבש.",
"couldNotOpen": "לא ניתן היה לפתוח את {{label}}.",
@@ -36,6 +36,7 @@
"cost": "עלות",
"discard": "ויתור על השינויים",
"findings": "ממצאים",
+ "mergeRequest": "בקשת מיזוג",
"notConnected": "לא מחובר",
"notifications": "התראות",
"pullRequest": "pR",
@@ -1566,11 +1567,31 @@
"retryConnection": "ניסיון התחברות נוסף"
},
"newSession": {
+ "recentlyUsed": "בשימוש לאחרונה",
+ "couldNotLoadGithubRepositories": "לא ניתן היה לטעון את המאגרים מ-GitHub.",
+ "couldNotLoadGitlabRepositories": "לא ניתן היה לטעון את המאגרים מ-GitLab.",
+ "couldNotLoadBitbucketRepositories": "לא ניתן היה לטעון את המאגרים מ-Bitbucket.",
"connectGithubDescription": "חבר את חשבון GitHub דרך הדפדפן, ואז חזור לכאן כדי לבחור מאגר.",
+ "connectGitlabDescription": "חבר את חשבון GitLab דרך הדפדפן, ואז חזור לכאן כדי לבחור מאגר.",
+ "connectBitbucketDescription": "חבר את חשבון Bitbucket דרך הדפדפן, ואז חזור לכאן כדי לבחור מאגר.",
"openGithub": "פתיחת GitHub",
+ "openGitlab": "פתיחת GitLab",
+ "openBitbucket": "פתיחת Bitbucket",
"refreshRepositories": "רענון המאגרים",
"githubConnected": "GitHub מחובר",
+ "gitlabConnected": "GitLab מחובר",
"noRepositoriesVisible": "לא מוצגים מאגרים. בדוק את הרשאות הגישה למאגרים של אפליקציית Kilo ב-GitHub, ואז רענן את הרשימה.",
+ "noRepositoriesVisibleGitlab": "לא מוצגים מאגרים. בדוק את הרשאות הגישה למאגרים ב-GitLab, ואז רענן את הרשימה.",
+ "noRepositoriesVisibleBitbucket": "לא מוצגים מאגרים. בדוק את הרשאות הגישה למאגרים ב-Bitbucket, ואז רענן את הרשימה.",
+ "bitbucketOrganizationsOnly": "Bitbucket זמין לארגונים בלבד.",
+ "branchPickerTitle": "בחירת ענף",
+ "branchDefault": "ברירת מחדל",
+ "branchAccessibility": "ענף: {{label}}",
+ "branchLoading": "טוען ענפים",
+ "branchLoadError": "לא ניתן היה לטעון את הענפים",
+ "branchUnavailable": "הענפים אינם זמינים למאגר הזה. בדקו את הגישה שלך מול הספק, ואז בחרו מאגר אחר.",
+ "branchEmpty": "אין ענפים זמינים",
+ "branchPlaceholder": "בחרו ענף",
"runOnWithTarget": "יעד ההרצה: {{target}}",
"environment": "סביבה",
"couldNotLoadEnvironment": "לא ניתן היה לטעון את הסביבה שלך.",
@@ -1589,26 +1610,15 @@
"couldNotReadPendingSessions": "לא ניתן היה לקרוא את הסשנים הממתינים. נסה שוב.",
"failedToCreate": "לא ניתן היה ליצור סשן.",
"couldNotRefreshRepositories": "לא ניתן היה לרענן מאגרים. נסה שוב.",
- "discardDraftMessage": "ההנחיה שלך תימחק.",
"discardDraftTitle": "למחוק את הטיוטה?",
+ "discardDraftMessage": "ההנחיה שלך תימחק.",
+ "discardWithUploadsMessage": "ההנחיה שלך וכל הקבצים שהועלו ולא צורפו להודעות שנשלחו יימחקו.",
"discardFailed": "לא ניתן היה למחוק את הטיוטה. נסה שוב.",
"remoteHint": "הרץ `kilo remote` במחשב שלך, או `/remote` בסשן CLI פעיל, כדי לשלוט בתהליך kilo מקומי.",
- "connectBitbucketDescription": "חבר את חשבון Bitbucket דרך הדפדפן, ואז חזור לכאן כדי לבחור מאגר.",
- "connectGitlabDescription": "חבר את חשבון GitLab דרך הדפדפן, ואז חזור לכאן כדי לבחור מאגר.",
- "couldNotLoadBitbucketRepositories": "לא ניתן היה לטעון את המאגרים מ-Bitbucket.",
- "couldNotLoadGithubRepositories": "לא ניתן היה לטעון את המאגרים מ-GitHub.",
- "couldNotLoadGitlabRepositories": "לא ניתן היה לטעון את המאגרים מ-GitLab.",
- "gitlabConnected": "GitLab מחובר",
- "noRepositoriesVisibleBitbucket": "לא מוצגים מאגרים. בדוק את הרשאות הגישה למאגרים ב-Bitbucket, ואז רענן את הרשימה.",
- "noRepositoriesVisibleGitlab": "לא מוצגים מאגרים. בדוק את הרשאות הגישה למאגרים ב-GitLab, ואז רענן את הרשימה.",
- "openBitbucket": "פתיחת Bitbucket",
- "openGitlab": "פתיחת GitLab",
- "recentlyUsed": "בשימוש לאחרונה",
- "cliCannotContinue": "ה-CLI הזה אינו יכול להמשיך סשן. בחר ב-Cloud Agent או ב-CLI אחר.",
"continueFrom": "ממשיך את הסשן {{title}}.",
- "importFailed": "לא ניתן היה לייבא את הסשן הזה.",
"importingSession": "מייבא סשן…",
- "discardWithUploadsMessage": "ההנחיה שלך וכל הקבצים שהועלו ולא צורפו להודעות שנשלחו יימחקו."
+ "cliCannotContinue": "ה-CLI הזה אינו יכול להמשיך סשן. בחר ב-Cloud Agent או ב-CLI אחר.",
+ "importFailed": "לא ניתן היה לייבא את הסשן הזה."
},
"partRenderer": {
"updatedFileCount_one": "מספר הקבצים שעודכנו הוא {{displayCount}}.",
@@ -2326,162 +2336,11 @@
"installAttributionPromptTitle": "לאפשר זיהוי של מקור ההתקנה?"
},
"prReview": {
+ "pullRequestUnavailable": "בקשת המשיכה אינה זמינה",
+ "pullRequestUnavailableDescription": "לא ניתן לפתוח את ה-PR הזה. ייתכן שהוא נמחק, שהמאגר פרטי או שאפליקציית Kilo ל-GitHub אינה מותקנת במאגר.",
"accessDeniedDescription": "אין לך הרשאה לצפות בבקשת המשיכה הזו.",
- "checkConnection": "בדיקת החיבור",
- "checks": {
- "checksCount": "{{displayCount}} בדיקות",
- "couldNotLoad": "לא ניתן היה לטעון את הבדיקות.",
- "failed": "{{displayCount}} נכשלו",
- "noAccess": "אין לך גישה לבדיקות של המאגר הזה.",
- "noChecksReported": "לא דווחו בדיקות",
- "notAvailable": "הבדיקות עדיין אינן זמינות. ייתכן שהקומיט האחרון בענף המקור עדיין לא עובד, או שאפליקציית Kilo ל-GitHub אינה מותקנת במאגר המקור.",
- "openDetails": "פתיחת הפרטים של {{name}}",
- "passed": "{{displayCount}} עברו",
- "pending": "{{displayCount}} ממתינות",
- "retryChecks": "ניסיון נוסף לטעינת הבדיקות",
- "skipped": "דילוג על {{displayCount}}",
- "title": "בדיקות",
- "viewOnGitHub": "הצגת ה-PR ב-GitHub",
- "checkDetails": "פרטי בדיקה"
- },
- "composer": {
- "addTitle": "הוספת תגובה",
- "addToReview": "הוספה לסקירה",
- "comment": "תגובה",
- "commentBody": "תוכן התגובה",
- "commentBodyPlaceholder": "כתיבת תגובה",
- "commentNow": "פרסום תגובה עכשיו",
- "discardMessage": "הטיוטה שלך תימחק.",
- "discardTitle": "למחוק את טיוטת התגובה?",
- "editTitle": "עריכת תגובה",
- "insertSuggestion": "הוספת הצעה",
- "insertSuggestionA11y": "הוספת הצעת קוד",
- "loadFailedTitle": "לא ניתן היה לטעון את עורך התגובות.",
- "ok": "אישור",
- "unavailableMessage": "התגובה הממתינה הזו כבר נמחקה או נשלחה.",
- "unavailableTitle": "התגובה אינה זמינה",
- "bodyEmpty": "לא ניתן לשלוח תגובה ריקה.",
- "suggestionsOnlyAddedLines": "אפשר להציע שינויים רק בשורות שנוספו.",
- "tapDiffLineToSuggest": "הקש על שורה בהשוואת השינויים כדי להוסיף הצעה."
- },
- "connect": {
- "checkFailedMessage": "מצב ההתחברות אינו זמין עד לסיום הטעינה.",
- "checkFailedTitle": "לא ניתן היה לבדוק את החיבור ל-GitHub.",
- "description": "חבר את חשבון ה-GitHub שלך כדי לסקור בקשות משיכה בנייד.",
- "reconnectDescription": "החיבור שלך ל-GitHub בוטל. התחבר מחדש כדי להמשיך לסקור בקשות משיכה בנייד.",
- "reconnectTitle": "חיבור מחדש ל-GitHub"
- },
- "connectionExpired": "פג תוקף החיבור ל-GitHub.",
- "couldNotLoadPullRequest": "לא ניתן היה לטעון את בקשת המשיכה.",
- "couldNotOpenGitHubAppSettings": "לא הצלחנו לפתוח את הגדרות האפליקציה ב-GitHub.",
- "description": "תיאור",
- "discussion": {
- "acceptTerms": "אישור",
- "accessDeniedMessage": "אין לך הרשאה לצפות בדיון של ה-PR הזה.",
- "addReaction": "הוספת תגובת אימוג׳י",
- "block": "חסימה",
- "blockedUser": "{{login}} נחסם",
- "collapseThread": "כיווץ השרשור",
- "commentActions": "פעולות בתגובה",
- "comment": "{{displayCount}} תגובות",
- "comment_other": "{{displayCount}} תגובות",
- "couldNotLoad": "לא ניתן היה לטעון את הדיון.",
- "couldNotLoadMore": "לא ניתן היה לטעון עוד תגובות.",
- "loadMoreComments": "טעינת תגובות נוספות",
- "loading": "הדיון נטען",
- "moderation": {
- "block": {
- "retryable": "לא ניתן היה לחסום את המשתמש הזה. בדוק את החיבור ונסה שוב.",
- "terminal": "לא ניתן לחסום את המשתמש הזה."
- },
- "mute": {
- "retryable": "לא ניתן היה להשתיק את המשתמש הזה. בדוק את החיבור ונסה שוב.",
- "terminal": "לא ניתן להשתיק את המשתמש הזה."
- },
- "reportContent": {
- "retryable": "לא ניתן היה לדווח על התגובה הזו. בדוק את החיבור ונסה שוב.",
- "terminal": "לא ניתן לדווח על התגובה הזו."
- },
- "reportUser": {
- "retryable": "לא ניתן היה לדווח על המשתמש הזה. בדוק את החיבור ונסה שוב.",
- "terminal": "לא ניתן לדווח על המשתמש הזה."
- }
- },
- "moreLinesAbove": "… עוד {{displayCount}} שורות למעלה.",
- "mute": "השתקה",
- "mutedUser": "{{login}} הושתק",
- "noDiscussion": "אין עדיין דיון",
- "noDiscussionDescription": "אין שרשורי סקירה או תגובות בדיון של בקשת המשיכה הזו.",
- "comment_one": "תגובה אחת",
- "outdated": "לא עדכני",
- "quotedDiffSnippet": "קטע מצוטט מהשוואת השינויים",
- "reactionPill": "תגובת אימוג׳י {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "תגובות אמוג׳י",
- "reaction_other": "תגובות אמוג׳י",
- "reaction_one": "תגובת אימוג׳י",
- "replyBadRequest": "לא ניתן לפרסם את התשובה הזו. ייתכן שהשרשור השתנה.",
- "replyBody": "תוכן התשובה",
- "replyForbidden": "אין לך הרשאה להשיב לבקשת המשיכה הזו.",
- "replyPlaceholder": "תשובה…",
- "reportContent": "דיווח על תוכן",
- "reportUser": "דיווח על משתמש",
- "resolveThread": "סימון השרשור כטופל",
- "resolved": "טופל",
- "retryLoadingMore": "ניסיון נוסף לטעינת תגובות נוספות",
- "reviewFiles": "סקירת הקבצים",
- "startedRelative": " · התחיל {{relative}}",
- "submitReply": "שליחת תשובה",
- "termsAcceptRetry": "לא ניתן היה לאשר את תנאי השירות. בדוק את החיבור ונסה שוב.",
- "termsCopy": "הפרסום מותר מגיל 13 ומעלה.",
- "termsTitle": "תנאי השירות",
- "threadAccessibilityLabel": "שרשור דיון {{anchorLabel}}",
- "unavailable": "הדיון אינו זמין.",
- "unavailableMessage": "ייתכן שבקשת המשיכה הזו הוסרה.",
- "unresolveThread": "ביטול סימון השרשור כטופל",
- "viewTerms": "הצגת התנאים",
- "termsAcceptRequired": "עליך לאשר את תנאי השירות כדי לפרסם.",
- "termsCheckRetryCopy": "לא ניתן היה לבדוק את תנאי השירות. בדוק את החיבור ונסה שוב.",
- "termsOutdatedCopy": "תנאי השירות השתנו. פתח מחדש את המסך הזה כדי לאשר את הגרסה האחרונה.",
- "comment_two": "{{displayCount}} תגובות",
- "reaction_two": "תגובות אימוג׳י",
- "reactions": {
- "thumbsUp": "אגודל למעלה",
- "thumbsDown": "אגודל למטה",
- "laugh": "צחוק",
- "hooray": "הידד",
- "confused": "מבולבל",
- "heart": "לב",
- "rocket": "טיל",
- "eyes": "עיניים"
- },
- "anchor": {
- "fileCommentOnPath": "תגובה על הקובץ {{path}}",
- "fileComment": "תגובה על הקובץ",
- "outdatedOnPathLines": "לא עדכני: {{path}} {{lines}}",
- "outdatedOnLines": "לא עדכני: {{lines}}",
- "outdatedOnPath": "לא עדכני: {{path}}"
- },
- "deletedUser": "משתמש שנמחק"
- },
- "entry": {
- "clearLink": "ניקוי הקישור לבקשת המשיכה",
- "couldNotLoad": "לא ניתן היה לטעון את הנתונים.",
- "eyebrow": "אפשר לפתוח בקשת משיכה באמצעות כתובת URL.",
- "noRecentPrs": "אין פריטי PR אחרונים",
- "noRecentPrsDescription": "הדבק למעלה קישור ל-PR כדי להתחיל סקירה — הוא יופיע כאן בפעם הבאה.",
- "open": "פתוח",
- "pasteLink": "הדבקת קישור לבקשת משיכה",
- "pastePrLink": "הדבקת קישור ל-PR",
- "removeFromRecentsMessage": "בקשת המשיכה הזו תוסר מרשימת הבקשות האחרונות שלך.",
- "removeFromRecentsTitle": "להסיר מהבקשות האחרונות?",
- "removeRecentAccessibility": "הסרת {{repo}} מרשימת הבקשות האחרונות",
- "urlAccessibility": "כתובת URL של בקשת משיכה ב-GitHub"
- },
- "eventChips": {
- "comment": "תגובה",
- "label": "סוג הסקירה",
- "requestChanges": "בקשת שינויים"
- },
+ "noFilesChanged": "אין שינויים בקבצים",
+ "noFilesChangedDescription": "אין שינויים בקבצים בבקשת המשיכה הזו.",
"fileList": {
"filesList": "רשימת קבצים",
"filesViewed": "קבצים · נצפו {{viewed}} מתוך {{total}}",
@@ -2526,7 +2385,6 @@
"commentOnSelectedLines": "הוספת תגובה לשורות שנבחרו",
"finishReview": "סיום הסקירה"
},
- "headLine": "{{counts}} · קצה הענף: {{sha}}",
"hunkRows": {
"contextUnavailable": "שורות ההקשר אינן זמינות בגרסה הזו.",
"expandAll": "הרחבת הכול",
@@ -2561,56 +2419,68 @@
"fileLoadedCount_two": "נטענו {{displayCount}} קבצים",
"fileLoadedOfTotalCount_two": "נטענו {{displayCount}} קבצים מתוך {{total}}"
},
- "inbox": {
- "couldNotLoad": "לא ניתן היה לטעון את הבקשות הנכנסות.",
- "loading": "הבקשות הנכנסות נטענות",
- "noReviewRequests": "אין בקשות לסקירה",
- "noReviewRequestsDescription": "כאן יופיעו בקשות משיכה שממתינות לסקירה שלך. אפשר גם להדביק למעלה קישור לכל PR.",
- "title": "בקשות נכנסות"
+ "sideBySide": {
+ "emptyDiffColumn": "עמודה ריקה בהשוואת השינויים",
+ "emptyDiffRow": "שורה ריקה בהשוואת השינויים",
+ "newOnly": "רק בגרסה החדשה: {{text}}",
+ "noNewlineAtEndOfFile": "אין תו שורה חדשה בסוף הקובץ.",
+ "oldNew": "לפני: {{old}} | אחרי: {{new}}",
+ "oldOnly": "רק בגרסה הישנה: {{text}}"
+ },
+ "connectionExpired": "פג תוקף החיבור ל-GitHub.",
+ "capabilities": {
+ "banner": {
+ "title": "לא זמין אצל הספק הזה",
+ "accessibility": "לא זמין אצל הספק הזה: {{reason}}"
+ }
},
- "installKiloGitHubApp": "התקנת אפליקציית Kilo ל-GitHub",
"merge": {
- "autoMergeDescription": "GitHub ימזג את בקשת המשיכה הזו אוטומטית כשכל הבדיקות הנדרשות יעברו (שיטה: {{method}}).",
+ "merge": "מיזוג",
+ "mergeNow": "מיזוג עכשיו",
+ "mergePullRequest": "מיזוג בקשת משיכה",
+ "mergeTermTitle": "מיזוג {{term}}",
+ "enableAutoMerge": "הפעלת מיזוג אוטומטי",
+ "disableAutoMerge": "השבתת מיזוג אוטומטי",
"autoMergeOn": "מיזוג אוטומטי מופעל",
- "blockedTitle": "למה עדיין אי אפשר למזג",
- "cannotMerge": "לא ניתן למזג את בקשת המשיכה הזו כפי שהיא.",
+ "autoMergeDescription": "GitHub ימזג את בקשת המשיכה הזו אוטומטית כשכל הבדיקות הנדרשות יעברו (שיטה: {{method}}).",
"checking": "בודקים אם אפשר למזג…",
+ "couldNotDetermine": "לא ניתן היה לקבוע אם אפשר למזג.",
+ "refreshMergeability": "בדיקה חוזרת אם אפשר למזג",
+ "blockedTitle": "למה עדיין אי אפשר למזג",
+ "updateBranch": "עדכון הענף",
+ "updateBranchFromBase": "עדכון הענף מענף הבסיס",
+ "methodLabel": "שיטה",
+ "commitTitle": "כותרת הקומיט",
"commitMessage": "הודעת הקומיט",
"commitMessagePlaceholder": "תיאור לקומיט המיזוג (לא חובה)",
- "commitTitle": "כותרת הקומיט",
- "confirmMessage": "פעולה זו תמזג את השינויים שלך לענף הבסיס.",
- "confirmTitle": "למזג את בקשת המשיכה?",
- "couldNotDetermine": "לא ניתן היה לקבוע אם אפשר למזג.",
- "couldNotMerge": "לא ניתן היה למזג את בקשת המשיכה.",
"deleteBranch": "מחיקת הענף",
"deleteBranchAfterMerge": "מחיקת הענף לאחר המיזוג",
- "disableAutoMerge": "השבתת מיזוג אוטומטי",
- "enableAutoMerge": "הפעלת מיזוג אוטומטי",
- "enableAutoMergeConfirmMessage": "GitHub ימזג את בקשת המשיכה הזו אוטומטית כשכל הבדיקות הנדרשות יעברו.",
+ "noEnabledMethods": "אין שיטות מיזוג פעילות במאגר הזה. בקש ממנהל המאגר להפעיל מיזוג רגיל, מיזוג עם איחוד קומיטים או מיזוג עם ריבייס.",
+ "confirmTitle": "למזג את בקשת המשיכה?",
+ "confirmTitleTerm": "למזג את ה-{{term}}?",
+ "confirmMessage": "פעולה זו תמזג את השינויים שלך לענף הבסיס.",
"enableAutoMergeConfirmTitle": "להפעיל מיזוג אוטומטי?",
+ "enableAutoMergeConfirmMessage": "GitHub ימזג את בקשת המשיכה הזו אוטומטית כשכל הבדיקות הנדרשות יעברו.",
+ "enableAutoMergeConfirmMessageTerm": "ה-{{term}} ימוזג אוטומטית לאחר שהצנרת תעבור בהצלחה.",
+ "enableAutoMergeDescriptionTerm": "GitLab ימזג את ה-{{term}} הזה אוטומטית לאחר שהצנרת תעבור בהצלחה.",
"forbidden": "אין לך הרשאה למזג את בקשת המשיכה הזו.",
- "loadFailedTitle": "לא ניתן היה לטעון את אפשרויות המיזוג.",
- "merge": "מיזוג",
- "mergeNow": "מיזוג עכשיו",
- "mergePullRequest": "מיזוג בקשת משיכה",
- "methodLabel": "שיטה",
+ "cannotMerge": "לא ניתן למזג את בקשת המשיכה הזו כפי שהיא.",
+ "couldNotMerge": "לא ניתן היה למזג את בקשת המשיכה.",
"methods": {
"merge": "מיזוג",
"rebase": "ריבייס",
"squash": "איחוד קומיטים"
},
- "noEnabledMethods": "אין שיטות מיזוג פעילות במאגר הזה. בקש ממנהל המאגר להפעיל מיזוג רגיל, מיזוג עם איחוד קומיטים או מיזוג עם ריבייס.",
+ "terminal": {
+ "alreadyMerged": "כבר מוזגה",
+ "closed": "בקשת המשיכה הזו סגורה",
+ "closedMergeRequest": "בקשת המיזוג הזו סגורה"
+ },
"partialSuccessBanner": {
"accessibility": "המיזוג הושלם. לא ניתן היה למחוק את הענף: {{reason}}",
"body": "לא ניתן היה למחוק את הענף: {{reason}}."
},
- "refreshMergeability": "בדיקה חוזרת אם אפשר למזג",
- "terminal": {
- "alreadyMerged": "כבר מוזגה",
- "closed": "בקשת המשיכה הזו סגורה"
- },
- "updateBranch": "עדכון הענף",
- "updateBranchFromBase": "עדכון הענף מענף הבסיס",
+ "loadFailedTitle": "לא ניתן היה לטעון את אפשרויות המיזוג.",
"blocked": {
"unknownStateTitle": "GitHub עדיין לא דיווח שאפשר למזג",
"unknownStateDetail": "נסה לרענן את הסקירה הכללית בעוד רגע.",
@@ -2630,6 +2500,19 @@
"notMergeableTitle": "עדיין לא ניתן למזג את בקשת המשיכה הזו",
"notMergeableDetail": "מצב אפשרות המיזוג שדווח על ידי GitHub: {{state}}."
},
+ "restrictions": {
+ "title": "הגבלות מיזוג",
+ "approvalsRequired_one": "נדרש אישור {{displayCount}}",
+ "approvalsRequired_other": "נדרשים {{displayCount}} אישורים",
+ "pipelineMustSucceed": "יש צורך שהצנרת תעבור בהצלחה לפני המיזוג.",
+ "approvalsRequired_two": "נדרשים {{displayCount}} אישורים"
+ },
+ "providerBlocked": {
+ "failingPipeline": "הצנרת נכשלת בקומיט האחרון.",
+ "pendingPipeline": "הצנרת עדיין פועלת בקומיט האחרון.",
+ "permission": "אין לך הרשאה למזג את ה-{{term}} הזה.",
+ "draft": "סמן את ה-{{term}} כמוכן לסקירה לפני המיזוג."
+ },
"methodLabels": {
"merge": "יצירת קומיט מיזוג",
"squash": "איחוד קומיטים ומיזוג",
@@ -2641,9 +2524,207 @@
"rebase": "כל הקומיטים מהענף הזה יוחלו מחדש על ענף הבסיס ללא קומיט מיזוג."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "שרשור דיון {{anchorLabel}}",
+ "collapseThread": "כיווץ השרשור",
+ "resolveThread": "סימון השרשור כטופל",
+ "unresolveThread": "ביטול סימון השרשור כטופל",
+ "resolved": "טופל",
+ "outdated": "לא עדכני",
+ "comment_one": "תגובה אחת",
+ "comment": "{{displayCount}} תגובות",
+ "comment_other": "{{displayCount}} תגובות",
+ "startedRelative": " · התחיל {{relative}}",
+ "couldNotLoadMore": "לא ניתן היה לטעון עוד תגובות.",
+ "retryLoadingMore": "ניסיון נוסף לטעינת תגובות נוספות",
+ "loadMoreComments": "טעינת תגובות נוספות",
+ "addReaction": "הוספת תגובת אימוג׳י",
+ "reactionPill": "תגובת אימוג׳י {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "תגובת אימוג׳י",
+ "reaction": "תגובות אמוג׳י",
+ "reaction_other": "תגובות אמוג׳י",
+ "commentActions": "פעולות בתגובה",
+ "reportContent": "דיווח על תוכן",
+ "reportUser": "דיווח על משתמש",
+ "mute": "השתקה",
+ "block": "חסימה",
+ "blockedUser": "{{login}} נחסם",
+ "mutedUser": "{{login}} הושתק",
+ "replyPlaceholder": "תשובה…",
+ "replyBody": "תוכן התשובה",
+ "submitReply": "שליחת תשובה",
+ "termsTitle": "תנאי השירות",
+ "termsCopy": "הפרסום מותר מגיל 13 ומעלה.",
+ "termsAcceptRetry": "לא ניתן היה לאשר את תנאי השירות. בדוק את החיבור ונסה שוב.",
+ "viewTerms": "הצגת התנאים",
+ "acceptTerms": "אישור",
+ "replyBadRequest": "לא ניתן לפרסם את התשובה הזו. ייתכן שהשרשור השתנה.",
+ "replyForbidden": "אין לך הרשאה להשיב לבקשת המשיכה הזו.",
+ "replyForbiddenTerm": "אין לך הרשאה להשיב ל-{{term}} הזה.",
+ "moderation": {
+ "block": {
+ "retryable": "לא ניתן היה לחסום את המשתמש הזה. בדוק את החיבור ונסה שוב.",
+ "terminal": "לא ניתן לחסום את המשתמש הזה."
+ },
+ "mute": {
+ "retryable": "לא ניתן היה להשתיק את המשתמש הזה. בדוק את החיבור ונסה שוב.",
+ "terminal": "לא ניתן להשתיק את המשתמש הזה."
+ },
+ "reportContent": {
+ "retryable": "לא ניתן היה לדווח על התגובה הזו. בדוק את החיבור ונסה שוב.",
+ "terminal": "לא ניתן לדווח על התגובה הזו."
+ },
+ "reportUser": {
+ "retryable": "לא ניתן היה לדווח על המשתמש הזה. בדוק את החיבור ונסה שוב.",
+ "terminal": "לא ניתן לדווח על המשתמש הזה."
+ }
+ },
+ "accessDeniedMessage": "אין לך הרשאה לצפות בדיון של ה-PR הזה.",
+ "unavailable": "הדיון אינו זמין.",
+ "unavailableMessage": "ייתכן שבקשת המשיכה הזו הוסרה.",
+ "couldNotLoad": "לא ניתן היה לטעון את הדיון.",
+ "loading": "הדיון נטען",
+ "noDiscussion": "אין עדיין דיון",
+ "noDiscussionDescription": "אין שרשורי סקירה או תגובות בדיון של בקשת המשיכה הזו.",
+ "reviewFiles": "סקירת הקבצים",
+ "quotedDiffSnippet": "קטע מצוטט מהשוואת השינויים",
+ "moreLinesAbove": "… עוד {{displayCount}} שורות למעלה.",
+ "termsAcceptRequired": "עליך לאשר את תנאי השירות כדי לפרסם.",
+ "termsOutdatedCopy": "תנאי השירות השתנו. פתח מחדש את המסך הזה כדי לאשר את הגרסה האחרונה.",
+ "termsCheckRetryCopy": "לא ניתן היה לבדוק את תנאי השירות. בדוק את החיבור ונסה שוב.",
+ "reactions": {
+ "thumbsUp": "אגודל למעלה",
+ "thumbsDown": "אגודל למטה",
+ "laugh": "צחוק",
+ "hooray": "הידד",
+ "confused": "מבולבל",
+ "heart": "לב",
+ "rocket": "טיל",
+ "eyes": "עיניים"
+ },
+ "anchor": {
+ "fileCommentOnPath": "תגובה על הקובץ {{path}}",
+ "fileComment": "תגובה על הקובץ",
+ "outdatedOnPathLines": "לא עדכני: {{path}} {{lines}}",
+ "outdatedOnLines": "לא עדכני: {{lines}}",
+ "outdatedOnPath": "לא עדכני: {{path}}"
+ },
+ "deletedUser": "משתמש שנמחק",
+ "comment_two": "{{displayCount}} תגובות",
+ "reaction_two": "תגובות אימוג׳י"
+ },
+ "couldNotOpenGitHubAppSettings": "לא הצלחנו לפתוח את הגדרות האפליקציה ב-GitHub.",
+ "installKiloGitHubApp": "התקנת אפליקציית Kilo ל-GitHub",
+ "checkConnection": "בדיקת החיבור",
+ "couldNotLoadPullRequest": "לא ניתן היה לטעון את בקשת המשיכה.",
+ "description": "תיאור",
"noDescriptionProvided": "לא נוסף תיאור.",
- "noFilesChanged": "אין שינויים בקבצים",
- "noFilesChangedDescription": "אין שינויים בקבצים בבקשת המשיכה הזו.",
+ "review": "סקירה",
+ "reviewPullRequest": "סקירת בקשת המשיכה",
+ "headLine": "{{counts}} · קצה הענף: {{sha}}",
+ "entry": {
+ "eyebrow": "אפשר לפתוח בקשת משיכה או בקשת מיזוג באמצעות כתובת URL.",
+ "pastePrLink": "הדבקת קישור לבקשת משיכה או מיזוג",
+ "noRecentPrs": "אין סקירות לאחרונה",
+ "noRecentPrsDescription": "הדבקו קישור למעלה כדי להתחיל סקירה — הוא יופיע כאן בפעם הבאה.",
+ "couldNotLoad": "לא ניתן היה לטעון את הנתונים.",
+ "removeFromRecentsTitle": "להסיר מהבקשות האחרונות?",
+ "removeFromRecentsMessage": "הסקירה הזו תוסר מרשימת האחרונות שלך.",
+ "removeRecentAccessibility": "הסרת {{repo}} מרשימת הבקשות האחרונות",
+ "urlAccessibility": "הזנת כתובת URL של בקשת משיכה או מיזוג",
+ "urlPlaceholder": "כתובת URL של בקשת משיכה או בקשת מיזוג",
+ "openAccessibility": "פתיחת בקשת משיכה או בקשת מיזוג",
+ "clearLink": "ניקוי הקישור",
+ "pasteLink": "הדבקת קישור לבקשת משיכה או מיזוג",
+ "open": "פתוח"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} בדיקות",
+ "couldNotLoad": "לא ניתן היה לטעון את הבדיקות.",
+ "failed": "{{displayCount}} נכשלו",
+ "noAccess": "אין לך גישה לבדיקות של המאגר הזה.",
+ "noChecksReported": "לא דווחו בדיקות",
+ "notAvailable": "הבדיקות עדיין אינן זמינות. ייתכן שהקומיט האחרון בענף המקור עדיין לא עובד, או שאפליקציית Kilo ל-GitHub אינה מותקנת במאגר המקור.",
+ "openDetails": "פתיחת הפרטים של {{name}}",
+ "passed": "{{displayCount}} עברו",
+ "pending": "{{displayCount}} ממתינות",
+ "retryChecks": "ניסיון נוסף לטעינת הבדיקות",
+ "skipped": "דילוג על {{displayCount}}",
+ "title": "בדיקות",
+ "viewOnGitHub": "הצגת ה-PR ב-GitHub",
+ "checkDetails": "פרטי בדיקה"
+ },
+ "inbox": {
+ "couldNotLoad": "לא ניתן היה לטעון את הבקשות הנכנסות.",
+ "loading": "הבקשות הנכנסות נטענות",
+ "noReviewRequests": "אין בקשות לסקירה",
+ "noReviewRequestsDescription": "כאן יופיעו בקשות משיכה שממתינות לסקירה שלך. אפשר גם להדביק למעלה קישור לכל PR.",
+ "title": "בקשות נכנסות"
+ },
+ "composer": {
+ "addTitle": "הוספת תגובה",
+ "addToReview": "הוספה לסקירה",
+ "comment": "תגובה",
+ "commentBody": "תוכן התגובה",
+ "commentBodyPlaceholder": "כתיבת תגובה",
+ "commentNow": "פרסום תגובה עכשיו",
+ "discardMessage": "הטיוטה שלך תימחק.",
+ "discardTitle": "למחוק את טיוטת התגובה?",
+ "editTitle": "עריכת תגובה",
+ "insertSuggestion": "הוספת הצעה",
+ "insertSuggestionA11y": "הוספת הצעת קוד",
+ "loadFailedTitle": "לא ניתן היה לטעון את עורך התגובות.",
+ "ok": "אישור",
+ "unavailableMessage": "התגובה הממתינה הזו כבר נמחקה או נשלחה.",
+ "unavailableTitle": "התגובה אינה זמינה",
+ "bodyEmpty": "לא ניתן לשלוח תגובה ריקה.",
+ "suggestionsOnlyAddedLines": "אפשר להציע שינויים רק בשורות שנוספו.",
+ "tapDiffLineToSuggest": "הקש על שורה בהשוואת השינויים כדי להוסיף הצעה."
+ },
+ "connect": {
+ "checkFailedTitle": "לא ניתן היה לבדוק את החיבור ל-GitHub.",
+ "checkFailedMessage": "מצב ההתחברות אינו זמין עד לסיום הטעינה.",
+ "checkFailedTitleGitLab": "לא ניתן היה לבדוק את החיבור ל-GitLab.",
+ "checkFailedTitleBitbucket": "לא ניתן היה לבדוק את החיבור ל-Bitbucket.",
+ "providerCheckFailedMessage": "מצב החיבור אינו זמין עד לסיום הטעימה.",
+ "reconnectTitle": "חיבור מחדש ל-GitHub",
+ "reconnectDescription": "החיבור שלך ל-GitHub בוטל. התחבר מחדש כדי להמשיך לסקור בקשות משיכה בנייד.",
+ "description": "חבר את חשבון ה-GitHub שלך כדי לסקור בקשות משיכה בנייד.",
+ "gitlabDescription": "חברו את חשבון GitLab שלכם כדי לסקור בקשות מיזוג בנייד.",
+ "bitbucketDescription": "חברו את Bitbucket לארגון הזה כדי לסקור בקשות משיכה בנייד.",
+ "bitbucketOrgOnlyDescription": "בחרו ארגון בפרופיל שלכם כדי לסקור את בקשות המשיכה של Bitbucket שלו."
+ },
+ "screen": {
+ "shareA11y": "שיתוף בקשת המשיכה",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "התגובה הזו תוסר מהתגובות שממתינות לשליחה בסקירה.",
+ "deletePendingTitle": "למחוק תגובה ממתינה?",
+ "loadFailedTitle": "לא ניתן היה לטעון את מסך שליחת הסקירה.",
+ "pendingComment": "תגובות ממתינות",
+ "pendingComment_other": "תגובות ממתינות",
+ "pendingComment_one": "תגובה ממתינה",
+ "summaryOptional": "סיכום (לא חובה)",
+ "partialPostedMessage": "פורסמו {{displayFreshCount}} תגובות. {{displayStaleCount}} תגובות מתייחסות לקומיט ישן יותר ועדיין ממתינות לשליחה.",
+ "submitCountOfTotal": "שליחת {{displayFreshCount}} מתוך {{displayTotalCount}} תגובות",
+ "submitReview": "שליחת סקירה",
+ "pendingComment_two": "תגובות ממתינות",
+ "blockedRequestChanges": "הוסף סיכום או לפחות תגובה אחת כדי לבקש שינויים.",
+ "blockedComment": "הוסף סיכום או לפחות תגובה אחת כדי לשלוח סקירה מסוג תגובה."
+ },
+ "reconnectNotice": {
+ "title": "פג תוקף החיבור ל-GitHub.",
+ "message": "החיבור שלך ל-GitHub אינו תקף עוד. בדוק שוב את החיבור — תתבקש להתחבר מחדש במידת הצורך.",
+ "gitlabTitle": "פג תוקף החיבור ל-GitLab.",
+ "bitbucketTitle": "פג תוקף החיבור ל-Bitbucket.",
+ "providerMessage": "החיבור שלך ל-{{provider}} אינו תקף עוד. בדוק שוב את החיבור — תתבקש להתחבר מחדש במידת הצורך."
+ },
+ "eventChips": {
+ "comment": "תגובה",
+ "label": "סוג הסקירה",
+ "requestChanges": "בקשת שינויים"
+ },
"overview": {
"commit": "קומיטים",
"commit_other": "קומיטים",
@@ -2686,40 +2767,25 @@
"summaryA11y": "סיכום הסקירה",
"summaryPlaceholder": "סיכום הסקירה (לא חובה)"
},
- "pullRequestUnavailable": "בקשת המשיכה אינה זמינה",
- "pullRequestUnavailableDescription": "לא ניתן לפתוח את ה-PR הזה. ייתכן שהוא נמחק, שהמאגר פרטי או שאפליקציית Kilo ל-GitHub אינה מותקנת במאגר.",
- "reconnectNotice": {
- "message": "החיבור שלך ל-GitHub אינו תקף עוד. בדוק שוב את החיבור — תתבקש להתחבר מחדש במידת הצורך.",
- "title": "פג תוקף החיבור ל-GitHub."
- },
- "review": "סקירה",
- "reviewPullRequest": "סקירת בקשת המשיכה",
- "screen": {
- "shareA11y": "שיתוף בקשת המשיכה",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "עמודה ריקה בהשוואת השינויים",
- "emptyDiffRow": "שורה ריקה בהשוואת השינויים",
- "newOnly": "רק בגרסה החדשה: {{text}}",
- "noNewlineAtEndOfFile": "אין תו שורה חדשה בסוף הקובץ.",
- "oldNew": "לפני: {{old}} | אחרי: {{new}}",
- "oldOnly": "רק בגרסה הישנה: {{text}}"
+ "tabs": {
+ "discussion": "דיון",
+ "files": "קבצים",
+ "overview": "סקירה כללית"
},
- "submit": {
- "deletePendingMessage": "התגובה הזו תוסר מהתגובות שממתינות לשליחה בסקירה.",
- "deletePendingTitle": "למחוק תגובה ממתינה?",
- "loadFailedTitle": "לא ניתן היה לטעון את מסך שליחת הסקירה.",
- "pendingComment": "תגובות ממתינות",
- "pendingComment_other": "תגובות ממתינות",
- "pendingComment_one": "תגובה ממתינה",
- "summaryOptional": "סיכום (לא חובה)",
- "partialPostedMessage": "פורסמו {{displayFreshCount}} תגובות. {{displayStaleCount}} תגובות מתייחסות לקומיט ישן יותר ועדיין ממתינות לשליחה.",
- "submitCountOfTotal": "שליחת {{displayFreshCount}} מתוך {{displayTotalCount}} תגובות",
- "submitReview": "שליחת סקירה",
- "pendingComment_two": "תגובות ממתינות",
- "blockedRequestChanges": "הוסף סיכום או לפחות תגובה אחת כדי לבקש שינויים.",
- "blockedComment": "הוסף סיכום או לפחות תגובה אחת כדי לשלוח סקירה מסוג תגובה."
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "בקשת מיזוג",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "שיתוף בקשת המיזוג",
+ "viewOnProvider": "הצגה ב-{{provider}}",
+ "mergeRequestUnavailable": "בקשת המיזוג אינה זמינה",
+ "unavailableDescription": "ייתכן שנמחק, או שייתכן שאין לך גישה אליו.",
+ "accessDeniedMergeRequest": "אין לך הרשאה לצפות בבקשת המיזוג הזו.",
+ "couldNotLoadMergeRequest": "לא ניתן היה לטעון את בקשת המיזוג.",
+ "discussionAccessDenied": "אין לך הרשאה לצפות בדיון של בקשת המיזוג הזו.",
+ "discussionUnavailableMessage": "ייתכן שבקשת המיזוג הזו הוסרה.",
+ "noDiscussionDescription": "אין שרשורי סקירה או תגובות בדיון של בקשת המיזוג הזו.",
+ "noFilesChangedDescription": "אין שינויים בקבצים בבקשת המיזוג הזו."
},
"fileStatus": {
"changed": "השתנה",
@@ -2727,11 +2793,6 @@
"modified": "שונה",
"renamed": "השם שונה"
},
- "tabs": {
- "discussion": "דיון",
- "files": "קבצים",
- "overview": "סקירה כללית"
- },
"diff": {
"selectedTapToChange": "נבחר: {{label}}, הקשה לשינוי הבחירה",
"tapToComment": "{{label}}, הקשה להוספת תגובה",
@@ -2742,7 +2803,7 @@
"emptyLine": "(ריק)"
},
"linkPasteClipboardEmpty": "לוח ההעתקה ריק.",
- "linkPasteNotAPullRequest": "זה לא קישור לבקשת משיכה ב-GitHub.",
+ "linkPasteNotAPullRequest": "זה לא קישור לבקשת משיכה או מיזוג",
"announce": {
"commentPosted": "התגובה פורסמה",
"reviewSubmitted": "הסקירה נשלחה",
@@ -2751,6 +2812,7 @@
"mutationError": {
"commentNotPosted": "לא ניתן לפרסם את התגובה הזו. ייתכן שהשורה שנבחרה השתנתה או שה-PR עודכן.",
"reviewNotSubmitted": "לא ניתן לשלוח את הסקירה הזו כפי שהיא. ייתכן שה-PR השתנה, או שזו בקשת משיכה שלך ואינך יכול לסקור אותה.",
+ "reviewNotSubmittedTerm": "לא ניתן לשלוח את הסקירה הזו כמות שהיא. ייתכן שה-{{term}} השתנה, או שלא ניתן לסקור את ה-{{term}} שלך בעצמך.",
"couldNotPostComment": "לא ניתן היה לפרסם תגובה.",
"couldNotSubmitReview": "לא ניתן היה לשלוח את הסקירה. בדוק את החיבור ונסה שוב."
},
@@ -2758,6 +2820,7 @@
"couldNotReply": "לא הצלחנו לשלוח את התשובה.",
"couldNotCompleteAction": "לא ניתן היה להשלים פעולה זו.",
"mergeResultDefaultError": "GitHub לא השלים את המיזוג.",
+ "mergeResultNotCompleted": "ה-{{term}} לא מוזג. בדקו את המצב שלו ונסו שוב.",
"ambiguous": "לא ניתן היה לוודא שהפעולה הושלמה — בדוק את ה-PR לפני שתנסה שוב.",
"persistenceFailed": "לא הצלחנו לתעד את הפעולה הזו. נסה שוב מאוחר יותר.",
"forbidden": "אין הרשאה לפעולה הזו."
diff --git a/apps/mobile/src/i18n/locales/hi.json b/apps/mobile/src/i18n/locales/hi.json
index 9cf7789685..b2d7d1ff18 100644
--- a/apps/mobile/src/i18n/locales/hi.json
+++ b/apps/mobile/src/i18n/locales/hi.json
@@ -4,6 +4,8 @@
"done": "हो गया",
"retry": "फिर से कोशिश करें",
"tryAgain": "फिर से कोशिश करें",
+ "continue": "जारी रखें",
+ "notNow": "अभी नहीं",
"language": "भाषा",
"device": "डिवाइस",
"share": "{{title}} साझा करें",
@@ -18,11 +20,9 @@
"openInBrowser": "ब्राउज़र में खोलें",
"openSettings": "सेटिंग खोलें",
"copiedToClipboard": "क्लिपबोर्ड पर कॉपी किया गया",
+ "couldNotCopyToClipboard": "क्लिपबोर्ड पर कॉपी नहीं हो सका।",
"required": "आवश्यक",
"error": "त्रुटि: {{error}}",
- "couldNotCopyToClipboard": "क्लिपबोर्ड पर कॉपी नहीं हो सका।",
- "notNow": "अभी नहीं",
- "continue": "जारी रखें",
"back": "वापस",
"somethingWentWrong": "कुछ गड़बड़ हो गई।",
"couldNotOpen": "{{label}} खोला नहीं जा सका।",
@@ -36,6 +36,7 @@
"cost": "लागत",
"discard": "छोड़ दें",
"findings": "मिली समस्याएँ",
+ "mergeRequest": "मर्ज रिक्वेस्ट",
"notConnected": "जुड़ा नहीं",
"notifications": "सूचनाएँ",
"pullRequest": "पुल रिक्वेस्ट",
@@ -1557,11 +1558,31 @@
"exitNeedsNewerCli": "रिमोट स्लैश कमांड के लिए Kilo CLI का नया संस्करण चाहिए। Kilo CLI अपडेट करें और फिर से कनेक्ट करें।"
},
"newSession": {
+ "recentlyUsed": "हाल ही में इस्तेमाल की गईं",
+ "couldNotLoadGithubRepositories": "GitHub रिपॉज़िटरी लोड नहीं हो सकीं।",
+ "couldNotLoadGitlabRepositories": "GitLab रिपॉज़िटरी लोड नहीं हो सकीं।",
+ "couldNotLoadBitbucketRepositories": "Bitbucket रिपॉज़िटरी लोड नहीं हो सकीं।",
"connectGithubDescription": "अपने ब्राउज़र में GitHub कनेक्ट करें, फिर रिपॉज़िटरी चुनने के लिए यहाँ वापस आएँ।",
+ "connectGitlabDescription": "अपने ब्राउज़र में GitLab कनेक्ट करें, फिर रिपॉज़िटरी चुनने के लिए यहाँ वापस आएँ।",
+ "connectBitbucketDescription": "अपने ब्राउज़र में Bitbucket कनेक्ट करें, फिर रिपॉज़िटरी चुनने के लिए यहाँ वापस आएँ।",
"openGithub": "GitHub खोलें",
+ "openGitlab": "GitLab खोलें",
+ "openBitbucket": "Bitbucket खोलें",
"refreshRepositories": "रिपॉज़िटरी रीफ़्रेश करें",
"githubConnected": "GitHub कनेक्ट है",
+ "gitlabConnected": "GitLab कनेक्ट है",
"noRepositoriesVisible": "कोई रिपॉज़िटरी दिखाई नहीं दे रही है। जाँचें कि Kilo GitHub ऐप को रिपॉज़िटरी का ऐक्सेस मिला है, फिर रीफ़्रेश करें।",
+ "noRepositoriesVisibleGitlab": "कोई रिपॉज़िटरी दिखाई नहीं दे रही है। GitLab के लिए रिपॉज़िटरी का ऐक्सेस जाँचें, फिर रीफ़्रेश करें।",
+ "noRepositoriesVisibleBitbucket": "कोई रिपॉज़िटरी दिखाई नहीं दे रही है। Bitbucket के लिए रिपॉज़िटरी का ऐक्सेस जाँचें, फिर रीफ़्रेश करें।",
+ "bitbucketOrganizationsOnly": "Bitbucket केवल संगठनों के लिए उपलब्ध है।",
+ "branchPickerTitle": "ब्रांच चुनें",
+ "branchDefault": "डिफ़ॉल्ट",
+ "branchAccessibility": "ब्रांच: {{label}}",
+ "branchLoading": "ब्रांच लोड हो रही हैं",
+ "branchLoadError": "ब्रांच लोड नहीं हो सकीं",
+ "branchUnavailable": "इस रिपॉज़िटरी के लिए ब्रांच उपलब्ध नहीं हैं। प्रदाता के साथ अपनी पहुँच जाँचें, फिर कोई दूसरी रिपॉज़िटरी चुनें।",
+ "branchEmpty": "कोई ब्रांच उपलब्ध नहीं",
+ "branchPlaceholder": "एक ब्रांच चुनें",
"runOnWithTarget": "इस पर चलाएँ: {{target}}",
"environment": "एनवायरनमेंट",
"couldNotLoadEnvironment": "आपका एनवायरनमेंट लोड नहीं हो सका।",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "लंबित सत्र पढ़े नहीं जा सके। फिर से कोशिश करें।",
"failedToCreate": "सत्र नहीं बन सका।",
"couldNotRefreshRepositories": "रिपॉज़िटरी रीफ़्रेश नहीं हो सकीं। कृपया फिर से कोशिश करें।",
- "discardDraftMessage": "आपका प्रॉम्प्ट हट जाएगा।",
"discardDraftTitle": "ड्राफ़्ट हटाएँ?",
+ "discardDraftMessage": "आपका प्रॉम्प्ट हट जाएगा।",
+ "discardWithUploadsMessage": "आपका प्रॉम्प्ट और अपलोड की गई ऐसी फ़ाइलें हटा दी जाएँगी जो किसी भेजे गए संदेश से जुड़ी नहीं हैं।",
"discardFailed": "ड्राफ़्ट हटाया नहीं जा सका। कृपया फिर से कोशिश करें।",
"remoteHint": "अपने कंप्यूटर पर चल रहे स्थानीय kilo प्रोसेस को नियंत्रित करने के लिए `kilo remote` चलाएँ या चल रहे CLI सत्र में `/remote` चलाएँ।",
- "connectBitbucketDescription": "अपने ब्राउज़र में Bitbucket कनेक्ट करें, फिर रिपॉज़िटरी चुनने के लिए यहाँ वापस आएँ।",
- "connectGitlabDescription": "अपने ब्राउज़र में GitLab कनेक्ट करें, फिर रिपॉज़िटरी चुनने के लिए यहाँ वापस आएँ।",
- "couldNotLoadBitbucketRepositories": "Bitbucket रिपॉज़िटरी लोड नहीं हो सकीं।",
- "couldNotLoadGithubRepositories": "GitHub रिपॉज़िटरी लोड नहीं हो सकीं।",
- "couldNotLoadGitlabRepositories": "GitLab रिपॉज़िटरी लोड नहीं हो सकीं।",
- "gitlabConnected": "GitLab कनेक्ट है",
- "noRepositoriesVisibleBitbucket": "कोई रिपॉज़िटरी दिखाई नहीं दे रही है। Bitbucket के लिए रिपॉज़िटरी का ऐक्सेस जाँचें, फिर रीफ़्रेश करें।",
- "noRepositoriesVisibleGitlab": "कोई रिपॉज़िटरी दिखाई नहीं दे रही है। GitLab के लिए रिपॉज़िटरी का ऐक्सेस जाँचें, फिर रीफ़्रेश करें।",
- "openBitbucket": "Bitbucket खोलें",
- "openGitlab": "GitLab खोलें",
- "recentlyUsed": "हाल ही में इस्तेमाल की गईं",
- "cliCannotContinue": "यह CLI सत्र जारी नहीं रख सकता। Cloud Agent या कोई अन्य CLI चुनें।",
"continueFrom": "{{title}} जारी रखा जा रहा है।",
- "importFailed": "यह सत्र आयात नहीं हो सका।",
"importingSession": "सत्र आयात किया जा रहा है",
- "discardWithUploadsMessage": "आपका प्रॉम्प्ट और अपलोड की गई ऐसी फ़ाइलें हटा दी जाएँगी जो किसी भेजे गए संदेश से जुड़ी नहीं हैं।"
+ "cliCannotContinue": "यह CLI सत्र जारी नहीं रख सकता। Cloud Agent या कोई अन्य CLI चुनें।",
+ "importFailed": "यह सत्र आयात नहीं हो सका।"
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} फ़ाइल अपडेट की गई।",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "इंस्टॉल के स्रोत की पहचान करने की अनुमति दें?"
},
"prReview": {
+ "pullRequestUnavailable": "पुल रिक्वेस्ट अनुपलब्ध",
+ "pullRequestUnavailableDescription": "यह PR नहीं खोला जा सकता। हो सकता है कि इसे हटा दिया गया हो, रिपॉज़िटरी निजी हो या उसमें Kilo GitHub ऐप इंस्टॉल न हो।",
"accessDeniedDescription": "आपको इस पुल रिक्वेस्ट को देखने की अनुमति नहीं है।",
- "checkConnection": "कनेक्शन जाँचें",
- "checks": {
- "checksCount": "{{displayCount}} जाँचें",
- "couldNotLoad": "जाँचें लोड नहीं हो सकीं।",
- "failed": "{{displayCount}} विफल",
- "noAccess": "आपको इस रिपॉज़िटरी की जाँचें देखने की अनुमति नहीं है।",
- "noChecksReported": "किसी जाँच की जानकारी नहीं मिली",
- "notAvailable": "जाँचें अभी उपलब्ध नहीं हैं। हो सकता है कि हेड कमिट प्रोसेस न हुआ हो, या Kilo GitHub ऐप हेड रिपॉज़िटरी पर इंस्टॉल न हो।",
- "openDetails": "{{name}} का विवरण खोलें",
- "passed": "{{displayCount}} सफल",
- "pending": "{{displayCount}} लंबित",
- "retryChecks": "जाँचें फिर से करें",
- "skipped": "{{displayCount}} छोड़ी गईं",
- "title": "जाँचें",
- "viewOnGitHub": "GitHub पर PR देखें",
- "checkDetails": "जाँच का विवरण"
- },
- "composer": {
- "addTitle": "टिप्पणी जोड़ें",
- "addToReview": "समीक्षा में जोड़ें",
- "comment": "टिप्पणी करें",
- "commentBody": "टिप्पणी का टेक्स्ट",
- "commentBodyPlaceholder": "आपकी टिप्पणी",
- "commentNow": "अभी टिप्पणी करें",
- "discardMessage": "आपका ड्राफ़्ट मिट जाएगा।",
- "discardTitle": "टिप्पणी छोड़ दें?",
- "editTitle": "टिप्पणी संपादित करें",
- "insertSuggestion": "सुझाव जोड़ें",
- "insertSuggestionA11y": "कोड का सुझाव जोड़ें",
- "loadFailedTitle": "टिप्पणी लिखने की स्क्रीन लोड नहीं हो सकी।",
- "ok": "ठीक है",
- "unavailableMessage": "यह लंबित टिप्पणी पहले ही हटा दी गई है या भेजी जा चुकी है।",
- "unavailableTitle": "टिप्पणी अनुपलब्ध",
- "bodyEmpty": "टिप्पणी खाली नहीं हो सकती।",
- "suggestionsOnlyAddedLines": "सुझाव केवल जोड़ी गई पंक्तियों पर लागू होते हैं।",
- "tapDiffLineToSuggest": "सुझाव देने के लिए डिफ़ की किसी पंक्ति पर टैप करें।"
- },
- "connect": {
- "checkFailedMessage": "यह लोड होने तक साइन-इन की स्थिति उपलब्ध नहीं होगी।",
- "checkFailedTitle": "GitHub कनेक्शन की जाँच नहीं हो सकी।",
- "description": "मोबाइल पर पुल रिक्वेस्ट की समीक्षा करने के लिए अपना GitHub खाता कनेक्ट करें।",
- "reconnectDescription": "आपका GitHub कनेक्शन रद्द कर दिया गया। मोबाइल पर पुल रिक्वेस्ट की समीक्षा जारी रखने के लिए फिर से कनेक्ट करें।",
- "reconnectTitle": "GitHub को फिर से कनेक्ट करें"
- },
- "connectionExpired": "GitHub कनेक्शन की अवधि समाप्त हो गई।",
- "couldNotLoadPullRequest": "पुल रिक्वेस्ट लोड नहीं हो सकी।",
- "couldNotOpenGitHubAppSettings": "GitHub ऐप की सेटिंग नहीं खुल सकीं।",
- "description": "विवरण",
- "discussion": {
- "acceptTerms": "स्वीकार करें",
- "accessDeniedMessage": "आपको इस PR की चर्चा देखने की अनुमति नहीं है।",
- "addReaction": "प्रतिक्रिया जोड़ें",
- "block": "ब्लॉक करें",
- "blockedUser": "{{login}} को ब्लॉक किया गया",
- "collapseThread": "थ्रेड समेटें",
- "commentActions": "टिप्पणी के विकल्प",
- "comment": "{{displayCount}} टिप्पणियाँ",
- "comment_other": "{{displayCount}} टिप्पणियाँ",
- "couldNotLoad": "चर्चा लोड नहीं हो सकी।",
- "couldNotLoadMore": "और टिप्पणियाँ लोड नहीं हो सकीं।",
- "loadMoreComments": "और टिप्पणियाँ लोड करें",
- "loading": "चर्चा लोड हो रही है",
- "moderation": {
- "block": {
- "retryable": "इस उपयोगकर्ता को ब्लॉक नहीं किया जा सका। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
- "terminal": "इस उपयोगकर्ता को ब्लॉक नहीं किया जा सकता।"
- },
- "mute": {
- "retryable": "इस उपयोगकर्ता को म्यूट नहीं किया जा सका। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
- "terminal": "इस उपयोगकर्ता को म्यूट नहीं किया जा सकता।"
- },
- "reportContent": {
- "retryable": "इस टिप्पणी की शिकायत नहीं की जा सकी। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
- "terminal": "इस टिप्पणी की शिकायत नहीं की जा सकती।"
- },
- "reportUser": {
- "retryable": "इस उपयोगकर्ता की शिकायत नहीं की जा सकी। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
- "terminal": "इस उपयोगकर्ता की शिकायत नहीं की जा सकती।"
- }
- },
- "moreLinesAbove": "… ऊपर {{displayCount}} और पंक्तियाँ हैं।",
- "mute": "म्यूट करें",
- "mutedUser": "{{login}} को म्यूट किया गया",
- "noDiscussion": "अभी कोई चर्चा नहीं",
- "noDiscussionDescription": "इस पुल रिक्वेस्ट पर अभी समीक्षा का कोई थ्रेड नहीं है और बातचीत में भी कोई टिप्पणी नहीं है।",
- "comment_one": "1 टिप्पणी",
- "outdated": "पुराना",
- "quotedDiffSnippet": "डिफ़ से लिया गया अंश",
- "reactionPill": "{{emoji}} प्रतिक्रिया, {{displayCount}} {{countLabel}}",
- "reaction": "प्रतिक्रियाएँ",
- "reaction_other": "प्रतिक्रियाएँ",
- "reaction_one": "प्रतिक्रिया",
- "replyBadRequest": "यह उत्तर पोस्ट नहीं किया जा सकता। हो सकता है कि थ्रेड बदल गया हो।",
- "replyBody": "उत्तर का टेक्स्ट",
- "replyForbidden": "आपको इस पुल रिक्वेस्ट पर उत्तर देने की अनुमति नहीं है।",
- "replyPlaceholder": "आपका उत्तर…",
- "reportContent": "सामग्री की शिकायत करें",
- "reportUser": "उपयोगकर्ता की शिकायत करें",
- "resolveThread": "थ्रेड हल करें",
- "resolved": "हल किया गया",
- "retryLoadingMore": "और टिप्पणियाँ लोड करने की फिर से कोशिश करें",
- "reviewFiles": "फ़ाइलों की समीक्षा करें",
- "startedRelative": " · {{relative}} शुरू हुआ",
- "submitReply": "उत्तर भेजें",
- "termsAcceptRetry": "शर्तें स्वीकार नहीं हो सकीं। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
- "termsCopy": "पोस्ट करने के लिए आपकी उम्र कम से कम 13 वर्ष होनी चाहिए।",
- "termsTitle": "सेवा की शर्तें",
- "threadAccessibilityLabel": "चर्चा का थ्रेड {{anchorLabel}}",
- "unavailable": "चर्चा उपलब्ध नहीं है।",
- "unavailableMessage": "हो सकता है कि यह पुल रिक्वेस्ट हटा दी गई हो।",
- "unresolveThread": "थ्रेड फिर से खोलें",
- "viewTerms": "शर्तें देखें",
- "termsAcceptRequired": "पोस्ट करने के लिए आपको सेवा की शर्तें स्वीकार करनी होंगी।",
- "termsCheckRetryCopy": "सेवा की शर्तें जाँची नहीं जा सकीं। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
- "termsOutdatedCopy": "सेवा की शर्तें बदल गई हैं। नवीनतम संस्करण स्वीकार करने के लिए यह स्क्रीन फिर से खोलें।",
- "reactions": {
- "thumbsUp": "अंगूठा ऊपर",
- "thumbsDown": "अंगूठा नीचे",
- "laugh": "हँसी",
- "hooray": "वाह",
- "confused": "उलझन में",
- "heart": "दिल",
- "rocket": "रॉकेट",
- "eyes": "आँखें"
- },
- "anchor": {
- "fileCommentOnPath": "{{path}} फ़ाइल पर टिप्पणी",
- "fileComment": "फ़ाइल पर टिप्पणी",
- "outdatedOnPathLines": "पुराने कोड पर: {{path}} {{lines}}",
- "outdatedOnLines": "पुराने कोड पर: {{lines}}",
- "outdatedOnPath": "पुराने कोड पर: {{path}}"
- },
- "deletedUser": "हटाया गया उपयोगकर्ता"
- },
- "entry": {
- "clearLink": "पुल रिक्वेस्ट का लिंक हटाएँ",
- "couldNotLoad": "लोड नहीं हो सका।",
- "eyebrow": "URL से पुल रिक्वेस्ट खोलें।",
- "noRecentPrs": "कोई हालिया PR नहीं",
- "noRecentPrsDescription": "समीक्षा शुरू करने के लिए ऊपर PR लिंक पेस्ट करें — यह अगली बार यहाँ दिखाई देगा।",
- "open": "ओपन",
- "pasteLink": "पुल रिक्वेस्ट का लिंक पेस्ट करें",
- "pastePrLink": "PR लिंक पेस्ट करें",
- "removeFromRecentsMessage": "यह पुल रिक्वेस्ट आपकी हालिया सूची से हटा दी जाएगी।",
- "removeFromRecentsTitle": "हालिया सूची से हटाएँ?",
- "removeRecentAccessibility": "{{repo}} को हालिया सूची से हटाएँ",
- "urlAccessibility": "GitHub पुल रिक्वेस्ट का URL"
- },
- "eventChips": {
- "comment": "टिप्पणी करें",
- "label": "समीक्षा का प्रकार",
- "requestChanges": "बदलाव माँगें"
- },
+ "noFilesChanged": "कोई फ़ाइल नहीं बदली",
+ "noFilesChangedDescription": "इस पुल रिक्वेस्ट में किसी फ़ाइल में बदलाव नहीं है।",
"fileList": {
"filesList": "फ़ाइलों की सूची",
"filesViewed": "फ़ाइलें · {{viewed}}/{{total}} देखी गईं",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "चयनित पंक्तियों पर टिप्पणी करें",
"finishReview": "समीक्षा पूरी करें"
},
- "headLine": "{{counts}} · हेड {{sha}}",
"hunkRows": {
"contextUnavailable": "इस रेफ़रेंस पर संदर्भ उपलब्ध नहीं है।",
"expandAll": "सभी दिखाएँ",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "संदर्भ फिर से लोड करें",
"retryLoadingNextPage": "अगला पेज फिर से लोड करें"
},
- "inbox": {
- "couldNotLoad": "इनबॉक्स लोड नहीं हो सका।",
- "loading": "इनबॉक्स लोड हो रहा है",
- "noReviewRequests": "कोई समीक्षा अनुरोध नहीं",
- "noReviewRequestsDescription": "जिन पुल रिक्वेस्ट की समीक्षा आपको करनी है, वे यहाँ दिखाई देती हैं। आप ऊपर कोई भी PR लिंक पेस्ट कर सकते हैं।",
- "title": "इनबॉक्स"
+ "sideBySide": {
+ "emptyDiffColumn": "खाली डिफ़ कॉलम",
+ "emptyDiffRow": "खाली डिफ़ पंक्ति",
+ "newOnly": "केवल नया: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ फ़ाइल के अंत में नई पंक्ति नहीं है।",
+ "oldNew": "पुराना: {{old}} | नया: {{new}}",
+ "oldOnly": "केवल पुराना: {{text}}"
+ },
+ "connectionExpired": "GitHub कनेक्शन की अवधि समाप्त हो गई।",
+ "capabilities": {
+ "banner": {
+ "title": "इस प्रदाता पर उपलब्ध नहीं",
+ "accessibility": "इस प्रदाता पर उपलब्ध नहीं: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Kilo GitHub ऐप इंस्टॉल करें",
"merge": {
- "autoMergeDescription": "सभी आवश्यक जाँचें सफल होने पर GitHub इस पुल रिक्वेस्ट को अपने-आप मर्ज करेगा (विधि: {{method}})।",
+ "merge": "मर्ज",
+ "mergeNow": "अभी मर्ज करें",
+ "mergePullRequest": "पुल रिक्वेस्ट मर्ज करें",
+ "mergeTermTitle": "{{term}} मर्ज करें",
+ "enableAutoMerge": "ऑटो-मर्ज चालू करें",
+ "disableAutoMerge": "ऑटो-मर्ज बंद करें",
"autoMergeOn": "ऑटो-मर्ज चालू है",
- "blockedTitle": "अभी मर्ज न होने के कारण",
- "cannotMerge": "इस पुल रिक्वेस्ट को मौजूदा स्थिति में मर्ज नहीं किया जा सकता।",
+ "autoMergeDescription": "सभी आवश्यक जाँचें सफल होने पर GitHub इस पुल रिक्वेस्ट को अपने-आप मर्ज करेगा (विधि: {{method}})।",
"checking": "मर्ज की स्थिति जाँची जा रही है…",
+ "couldNotDetermine": "यह पता नहीं चल सका कि मर्ज किया जा सकता है या नहीं।",
+ "refreshMergeability": "मर्ज की स्थिति फिर से जाँचें",
+ "blockedTitle": "अभी मर्ज न होने के कारण",
+ "updateBranch": "ब्रांच अपडेट करें",
+ "updateBranchFromBase": "बेस ब्रांच से ब्रांच अपडेट करें",
+ "methodLabel": "विधि",
+ "commitTitle": "कमिट का शीर्षक",
"commitMessage": "कमिट का संदेश",
"commitMessagePlaceholder": "मर्ज कमिट के लिए वैकल्पिक विवरण",
- "commitTitle": "कमिट का शीर्षक",
- "confirmMessage": "इससे आपके बदलाव बेस ब्रांच में मर्ज हो जाएँगे।",
- "confirmTitle": "पुल रिक्वेस्ट मर्ज करें?",
- "couldNotDetermine": "यह पता नहीं चल सका कि मर्ज किया जा सकता है या नहीं।",
- "couldNotMerge": "पुल रिक्वेस्ट मर्ज नहीं हो सकी।",
"deleteBranch": "ब्रांच हटाएँ",
"deleteBranchAfterMerge": "मर्ज के बाद ब्रांच हटाएँ",
- "disableAutoMerge": "ऑटो-मर्ज बंद करें",
- "enableAutoMerge": "ऑटो-मर्ज चालू करें",
- "enableAutoMergeConfirmMessage": "सभी आवश्यक जाँचें सफल होने पर GitHub इस पुल रिक्वेस्ट को अपने-आप मर्ज करेगा।",
+ "noEnabledMethods": "इस रिपॉज़िटरी में मर्ज की कोई विधि चालू नहीं है। रिपॉज़िटरी के एडमिन से मर्ज, स्क्वैश या रीबेस से मर्ज करने की सुविधा चालू करने को कहें।",
+ "confirmTitle": "पुल रिक्वेस्ट मर्ज करें?",
+ "confirmTitleTerm": "{{term}} मर्ज करें?",
+ "confirmMessage": "इससे आपके बदलाव बेस ब्रांच में मर्ज हो जाएँगे।",
"enableAutoMergeConfirmTitle": "ऑटो-मर्ज चालू करें?",
+ "enableAutoMergeConfirmMessage": "सभी आवश्यक जाँचें सफल होने पर GitHub इस पुल रिक्वेस्ट को अपने-आप मर्ज करेगा।",
+ "enableAutoMergeConfirmMessageTerm": "पाइपलाइन सफल होते ही {{term}} स्वतः मर्ज हो जाएगी।",
+ "enableAutoMergeDescriptionTerm": "GitLab पाइपलाइन सफल होते ही इस {{term}} को स्वतः मर्ज कर देता है।",
"forbidden": "आपको इस पुल रिक्वेस्ट को मर्ज करने की अनुमति नहीं है।",
- "loadFailedTitle": "मर्ज के विकल्प लोड नहीं हो सके।",
- "merge": "मर्ज",
- "mergeNow": "अभी मर्ज करें",
- "mergePullRequest": "पुल रिक्वेस्ट मर्ज करें",
- "methodLabel": "विधि",
+ "cannotMerge": "इस पुल रिक्वेस्ट को मौजूदा स्थिति में मर्ज नहीं किया जा सकता।",
+ "couldNotMerge": "पुल रिक्वेस्ट मर्ज नहीं हो सकी।",
"methods": {
"merge": "मर्ज",
"rebase": "रीबेस",
"squash": "स्क्वैश"
},
- "noEnabledMethods": "इस रिपॉज़िटरी में मर्ज की कोई विधि चालू नहीं है। रिपॉज़िटरी के एडमिन से मर्ज, स्क्वैश या रीबेस से मर्ज करने की सुविधा चालू करने को कहें।",
+ "terminal": {
+ "alreadyMerged": "पहले से मर्ज",
+ "closed": "यह पुल रिक्वेस्ट बंद है",
+ "closedMergeRequest": "यह मर्ज रिक्वेस्ट बंद है"
+ },
"partialSuccessBanner": {
"accessibility": "मर्ज हो गया। ब्रांच नहीं हटाई जा सकी: {{reason}}",
"body": "ब्रांच नहीं हटाई जा सकी: {{reason}}।"
},
- "refreshMergeability": "मर्ज की स्थिति फिर से जाँचें",
- "terminal": {
- "alreadyMerged": "पहले से मर्ज",
- "closed": "यह पुल रिक्वेस्ट बंद है"
- },
- "updateBranch": "ब्रांच अपडेट करें",
- "updateBranchFromBase": "बेस ब्रांच से ब्रांच अपडेट करें",
+ "loadFailedTitle": "मर्ज के विकल्प लोड नहीं हो सके।",
"blocked": {
"unknownStateTitle": "GitHub ने अभी तक मर्ज की अनुमति वाली स्थिति नहीं बताई है",
"unknownStateDetail": "थोड़ी देर बाद अवलोकन रीफ़्रेश करने की कोशिश करें।",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "यह पुल रिक्वेस्ट अभी मर्ज नहीं की जा सकती",
"notMergeableDetail": "GitHub ने मर्ज की स्थिति {{state}} बताई है।"
},
+ "restrictions": {
+ "title": "मर्ज प्रतिबंध",
+ "approvalsRequired_one": "{{displayCount}} मंज़ूरी ज़रूरी",
+ "approvalsRequired_other": "{{displayCount}} मंज़ूरियाँ ज़रूरी",
+ "pipelineMustSucceed": "मर्ज करने से पहले पाइपलाइन का सफल होना ज़रूरी है।"
+ },
+ "providerBlocked": {
+ "failingPipeline": "नवीनतम कमिट पर पाइपलाइन विफल हो रही है।",
+ "pendingPipeline": "नवीनतम कमिट पर पाइपलाइन अभी भी चल रही है।",
+ "permission": "आपको इस {{term}} को मर्ज करने की अनुमति नहीं है।",
+ "draft": "मर्ज करने से पहले {{term}} को समीक्षा के लिए तैयार के रूप में चिह्नित करें।"
+ },
"methodLabels": {
"merge": "मर्ज कमिट बनाएँ",
"squash": "स्क्वैश करके मर्ज करें",
@@ -2623,9 +2507,204 @@
"rebase": "मर्ज कमिट बनाए बिना इस ब्रांच के सभी कमिट बेस ब्रांच पर फिर से लागू करें।"
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "चर्चा का थ्रेड {{anchorLabel}}",
+ "collapseThread": "थ्रेड समेटें",
+ "resolveThread": "थ्रेड हल करें",
+ "unresolveThread": "थ्रेड फिर से खोलें",
+ "resolved": "हल किया गया",
+ "outdated": "पुराना",
+ "comment_one": "1 टिप्पणी",
+ "comment": "{{displayCount}} टिप्पणियाँ",
+ "comment_other": "{{displayCount}} टिप्पणियाँ",
+ "startedRelative": " · {{relative}} शुरू हुआ",
+ "couldNotLoadMore": "और टिप्पणियाँ लोड नहीं हो सकीं।",
+ "retryLoadingMore": "और टिप्पणियाँ लोड करने की फिर से कोशिश करें",
+ "loadMoreComments": "और टिप्पणियाँ लोड करें",
+ "addReaction": "प्रतिक्रिया जोड़ें",
+ "reactionPill": "{{emoji}} प्रतिक्रिया, {{displayCount}} {{countLabel}}",
+ "reaction_one": "प्रतिक्रिया",
+ "reaction": "प्रतिक्रियाएँ",
+ "reaction_other": "प्रतिक्रियाएँ",
+ "commentActions": "टिप्पणी के विकल्प",
+ "reportContent": "सामग्री की शिकायत करें",
+ "reportUser": "उपयोगकर्ता की शिकायत करें",
+ "mute": "म्यूट करें",
+ "block": "ब्लॉक करें",
+ "blockedUser": "{{login}} को ब्लॉक किया गया",
+ "mutedUser": "{{login}} को म्यूट किया गया",
+ "replyPlaceholder": "आपका उत्तर…",
+ "replyBody": "उत्तर का टेक्स्ट",
+ "submitReply": "उत्तर भेजें",
+ "termsTitle": "सेवा की शर्तें",
+ "termsCopy": "पोस्ट करने के लिए आपकी उम्र कम से कम 13 वर्ष होनी चाहिए।",
+ "termsAcceptRetry": "शर्तें स्वीकार नहीं हो सकीं। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
+ "viewTerms": "शर्तें देखें",
+ "acceptTerms": "स्वीकार करें",
+ "replyBadRequest": "यह उत्तर पोस्ट नहीं किया जा सकता। हो सकता है कि थ्रेड बदल गया हो।",
+ "replyForbidden": "आपको इस पुल रिक्वेस्ट पर उत्तर देने की अनुमति नहीं है।",
+ "replyForbiddenTerm": "आपको इस {{term}} पर उत्तर देने की अनुमति नहीं है।",
+ "moderation": {
+ "block": {
+ "retryable": "इस उपयोगकर्ता को ब्लॉक नहीं किया जा सका। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
+ "terminal": "इस उपयोगकर्ता को ब्लॉक नहीं किया जा सकता।"
+ },
+ "mute": {
+ "retryable": "इस उपयोगकर्ता को म्यूट नहीं किया जा सका। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
+ "terminal": "इस उपयोगकर्ता को म्यूट नहीं किया जा सकता।"
+ },
+ "reportContent": {
+ "retryable": "इस टिप्पणी की शिकायत नहीं की जा सकी। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
+ "terminal": "इस टिप्पणी की शिकायत नहीं की जा सकती।"
+ },
+ "reportUser": {
+ "retryable": "इस उपयोगकर्ता की शिकायत नहीं की जा सकी। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
+ "terminal": "इस उपयोगकर्ता की शिकायत नहीं की जा सकती।"
+ }
+ },
+ "accessDeniedMessage": "आपको इस PR की चर्चा देखने की अनुमति नहीं है।",
+ "unavailable": "चर्चा उपलब्ध नहीं है।",
+ "unavailableMessage": "हो सकता है कि यह पुल रिक्वेस्ट हटा दी गई हो।",
+ "couldNotLoad": "चर्चा लोड नहीं हो सकी।",
+ "loading": "चर्चा लोड हो रही है",
+ "noDiscussion": "अभी कोई चर्चा नहीं",
+ "noDiscussionDescription": "इस पुल रिक्वेस्ट पर अभी समीक्षा का कोई थ्रेड नहीं है और बातचीत में भी कोई टिप्पणी नहीं है।",
+ "reviewFiles": "फ़ाइलों की समीक्षा करें",
+ "quotedDiffSnippet": "डिफ़ से लिया गया अंश",
+ "moreLinesAbove": "… ऊपर {{displayCount}} और पंक्तियाँ हैं।",
+ "termsAcceptRequired": "पोस्ट करने के लिए आपको सेवा की शर्तें स्वीकार करनी होंगी।",
+ "termsOutdatedCopy": "सेवा की शर्तें बदल गई हैं। नवीनतम संस्करण स्वीकार करने के लिए यह स्क्रीन फिर से खोलें।",
+ "termsCheckRetryCopy": "सेवा की शर्तें जाँची नहीं जा सकीं। अपना कनेक्शन जाँचें और फिर से कोशिश करें।",
+ "reactions": {
+ "thumbsUp": "अंगूठा ऊपर",
+ "thumbsDown": "अंगूठा नीचे",
+ "laugh": "हँसी",
+ "hooray": "वाह",
+ "confused": "उलझन में",
+ "heart": "दिल",
+ "rocket": "रॉकेट",
+ "eyes": "आँखें"
+ },
+ "anchor": {
+ "fileCommentOnPath": "{{path}} फ़ाइल पर टिप्पणी",
+ "fileComment": "फ़ाइल पर टिप्पणी",
+ "outdatedOnPathLines": "पुराने कोड पर: {{path}} {{lines}}",
+ "outdatedOnLines": "पुराने कोड पर: {{lines}}",
+ "outdatedOnPath": "पुराने कोड पर: {{path}}"
+ },
+ "deletedUser": "हटाया गया उपयोगकर्ता"
+ },
+ "couldNotOpenGitHubAppSettings": "GitHub ऐप की सेटिंग नहीं खुल सकीं।",
+ "installKiloGitHubApp": "Kilo GitHub ऐप इंस्टॉल करें",
+ "checkConnection": "कनेक्शन जाँचें",
+ "couldNotLoadPullRequest": "पुल रिक्वेस्ट लोड नहीं हो सकी।",
+ "description": "विवरण",
"noDescriptionProvided": "कोई विवरण नहीं दिया गया।",
- "noFilesChanged": "कोई फ़ाइल नहीं बदली",
- "noFilesChangedDescription": "इस पुल रिक्वेस्ट में किसी फ़ाइल में बदलाव नहीं है।",
+ "review": "समीक्षा",
+ "reviewPullRequest": "पुल रिक्वेस्ट की समीक्षा करें",
+ "headLine": "{{counts}} · हेड {{sha}}",
+ "entry": {
+ "eyebrow": "URL से पुल रिक्वेस्ट या मर्ज रिक्वेस्ट खोलें",
+ "pastePrLink": "पुल रिक्वेस्ट या मर्ज रिक्वेस्ट का लिंक पेस्ट करें",
+ "noRecentPrs": "कोई हालिया समीक्षा नहीं",
+ "noRecentPrsDescription": "समीक्षा शुरू करने के लिए ऊपर लिंक पेस्ट करें — यह अगली बार यहाँ दिखाई देगा।",
+ "couldNotLoad": "लोड नहीं हो सका।",
+ "removeFromRecentsTitle": "हालिया सूची से हटाएँ?",
+ "removeFromRecentsMessage": "यह समीक्षा आपकी हालिया सूची से हटा दी जाएगी।",
+ "removeRecentAccessibility": "{{repo}} को हालिया सूची से हटाएँ",
+ "urlAccessibility": "पुल रिक्वेस्ट या मर्ज रिक्वेस्ट का URL दर्ज करें",
+ "urlPlaceholder": "पुल रिक्वेस्ट या मर्ज रिक्वेस्ट URL",
+ "openAccessibility": "पुल रिक्वेस्ट या मर्ज रिक्वेस्ट खोलें",
+ "clearLink": "लिंक हटाएँ",
+ "pasteLink": "पुल रिक्वेस्ट या मर्ज रिक्वेस्ट का लिंक पेस्ट करें",
+ "open": "ओपन"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} जाँचें",
+ "couldNotLoad": "जाँचें लोड नहीं हो सकीं।",
+ "failed": "{{displayCount}} विफल",
+ "noAccess": "आपको इस रिपॉज़िटरी की जाँचें देखने की अनुमति नहीं है।",
+ "noChecksReported": "किसी जाँच की जानकारी नहीं मिली",
+ "notAvailable": "जाँचें अभी उपलब्ध नहीं हैं। हो सकता है कि हेड कमिट प्रोसेस न हुआ हो, या Kilo GitHub ऐप हेड रिपॉज़िटरी पर इंस्टॉल न हो।",
+ "openDetails": "{{name}} का विवरण खोलें",
+ "passed": "{{displayCount}} सफल",
+ "pending": "{{displayCount}} लंबित",
+ "retryChecks": "जाँचें फिर से करें",
+ "skipped": "{{displayCount}} छोड़ी गईं",
+ "title": "जाँचें",
+ "viewOnGitHub": "GitHub पर PR देखें",
+ "checkDetails": "जाँच का विवरण"
+ },
+ "inbox": {
+ "couldNotLoad": "इनबॉक्स लोड नहीं हो सका।",
+ "loading": "इनबॉक्स लोड हो रहा है",
+ "noReviewRequests": "कोई समीक्षा अनुरोध नहीं",
+ "noReviewRequestsDescription": "जिन पुल रिक्वेस्ट की समीक्षा आपको करनी है, वे यहाँ दिखाई देती हैं। आप ऊपर कोई भी PR लिंक पेस्ट कर सकते हैं।",
+ "title": "इनबॉक्स"
+ },
+ "composer": {
+ "addTitle": "टिप्पणी जोड़ें",
+ "addToReview": "समीक्षा में जोड़ें",
+ "comment": "टिप्पणी करें",
+ "commentBody": "टिप्पणी का टेक्स्ट",
+ "commentBodyPlaceholder": "आपकी टिप्पणी",
+ "commentNow": "अभी टिप्पणी करें",
+ "discardMessage": "आपका ड्राफ़्ट मिट जाएगा।",
+ "discardTitle": "टिप्पणी छोड़ दें?",
+ "editTitle": "टिप्पणी संपादित करें",
+ "insertSuggestion": "सुझाव जोड़ें",
+ "insertSuggestionA11y": "कोड का सुझाव जोड़ें",
+ "loadFailedTitle": "टिप्पणी लिखने की स्क्रीन लोड नहीं हो सकी।",
+ "ok": "ठीक है",
+ "unavailableMessage": "यह लंबित टिप्पणी पहले ही हटा दी गई है या भेजी जा चुकी है।",
+ "unavailableTitle": "टिप्पणी अनुपलब्ध",
+ "bodyEmpty": "टिप्पणी खाली नहीं हो सकती।",
+ "suggestionsOnlyAddedLines": "सुझाव केवल जोड़ी गई पंक्तियों पर लागू होते हैं।",
+ "tapDiffLineToSuggest": "सुझाव देने के लिए डिफ़ की किसी पंक्ति पर टैप करें।"
+ },
+ "connect": {
+ "checkFailedTitle": "GitHub कनेक्शन की जाँच नहीं हो सकी।",
+ "checkFailedMessage": "यह लोड होने तक साइन-इन की स्थिति उपलब्ध नहीं होगी।",
+ "checkFailedTitleGitLab": "GitLab कनेक्शन की जाँच नहीं हो सकी।",
+ "checkFailedTitleBitbucket": "Bitbucket कनेक्शन की जाँच नहीं हो सकी।",
+ "providerCheckFailedMessage": "लोड होने तक कनेक्शन की स्थिति उपलब्ध नहीं है।",
+ "reconnectTitle": "GitHub को फिर से कनेक्ट करें",
+ "reconnectDescription": "आपका GitHub कनेक्शन रद्द कर दिया गया। मोबाइल पर पुल रिक्वेस्ट की समीक्षा जारी रखने के लिए फिर से कनेक्ट करें।",
+ "description": "मोबाइल पर पुल रिक्वेस्ट की समीक्षा करने के लिए अपना GitHub खाता कनेक्ट करें।",
+ "gitlabDescription": "मोबाइल पर मर्ज रिक्वेस्ट समीक्षित करने के लिए अपना GitLab खाता कनेक्ट करें।",
+ "bitbucketDescription": "मोबाइल पर पुल रिक्वेस्ट समीक्षित करने के लिए इस संगठन को Bitbucket से कनेक्ट करें।",
+ "bitbucketOrgOnlyDescription": "अपनी प्रोफ़ाइल में कोई संगठन चुनें ताकि उसकी Bitbucket पुल रिक्वेस्ट समीक्षित की जा सकें।"
+ },
+ "screen": {
+ "shareA11y": "पुल रिक्वेस्ट साझा करें",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "यह टिप्पणी समीक्षा की कतार से हटा दी जाएगी।",
+ "deletePendingTitle": "लंबित टिप्पणी हटाएँ?",
+ "loadFailedTitle": "समीक्षा भेजने की स्क्रीन लोड नहीं हो सकी।",
+ "pendingComment": "लंबित टिप्पणियाँ",
+ "pendingComment_other": "लंबित टिप्पणियाँ",
+ "pendingComment_one": "लंबित टिप्पणी",
+ "summaryOptional": "सारांश (वैकल्पिक)",
+ "partialPostedMessage": "{{displayFreshCount}} टिप्पणियाँ पोस्ट की गईं। {{displayStaleCount}} टिप्पणियाँ पुराने कमिट से जुड़ी हैं, इसलिए वे आपकी कतार में ही हैं।",
+ "submitCountOfTotal": "{{displayTotalCount}} में से {{displayFreshCount}} टिप्पणियाँ भेजें",
+ "submitReview": "समीक्षा भेजें",
+ "blockedRequestChanges": "बदलाव का अनुरोध करने के लिए सारांश या कम से कम एक टिप्पणी जोड़ें।",
+ "blockedComment": "टिप्पणी वाली समीक्षा पोस्ट करने के लिए सारांश या कम से कम एक टिप्पणी जोड़ें।"
+ },
+ "reconnectNotice": {
+ "title": "GitHub कनेक्शन की अवधि समाप्त हो गई।",
+ "message": "आपका GitHub कनेक्शन अब मान्य नहीं है। अपना कनेक्शन फिर से जाँचें — ज़रूरत होने पर आपको फिर से कनेक्ट करने के लिए कहा जाएगा।",
+ "gitlabTitle": "GitLab कनेक्शन की अवधि समाप्त हो गई।",
+ "bitbucketTitle": "Bitbucket कनेक्शन की अवधि समाप्त हो गई।",
+ "providerMessage": "आपका {{provider}} कनेक्शन अब मान्य नहीं है। अपना कनेक्शन फिर से जाँचें — ज़रूरत होने पर आपको फिर से कनेक्ट करने के लिए कहा जाएगा।"
+ },
+ "eventChips": {
+ "comment": "टिप्पणी करें",
+ "label": "समीक्षा का प्रकार",
+ "requestChanges": "बदलाव माँगें"
+ },
"overview": {
"commit": "कमिट",
"commit_other": "कमिट",
@@ -2666,39 +2745,25 @@
"summaryA11y": "समीक्षा का सारांश",
"summaryPlaceholder": "समीक्षा के लिए वैकल्पिक सारांश"
},
- "pullRequestUnavailable": "पुल रिक्वेस्ट अनुपलब्ध",
- "pullRequestUnavailableDescription": "यह PR नहीं खोला जा सकता। हो सकता है कि इसे हटा दिया गया हो, रिपॉज़िटरी निजी हो या उसमें Kilo GitHub ऐप इंस्टॉल न हो।",
- "reconnectNotice": {
- "message": "आपका GitHub कनेक्शन अब मान्य नहीं है। अपना कनेक्शन फिर से जाँचें — ज़रूरत होने पर आपको फिर से कनेक्ट करने के लिए कहा जाएगा।",
- "title": "GitHub कनेक्शन की अवधि समाप्त हो गई।"
- },
- "review": "समीक्षा",
- "reviewPullRequest": "पुल रिक्वेस्ट की समीक्षा करें",
- "screen": {
- "shareA11y": "पुल रिक्वेस्ट साझा करें",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "खाली डिफ़ कॉलम",
- "emptyDiffRow": "खाली डिफ़ पंक्ति",
- "newOnly": "केवल नया: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ फ़ाइल के अंत में नई पंक्ति नहीं है।",
- "oldNew": "पुराना: {{old}} | नया: {{new}}",
- "oldOnly": "केवल पुराना: {{text}}"
+ "tabs": {
+ "discussion": "चर्चा",
+ "files": "फ़ाइलें",
+ "overview": "अवलोकन"
},
- "submit": {
- "deletePendingMessage": "यह टिप्पणी समीक्षा की कतार से हटा दी जाएगी।",
- "deletePendingTitle": "लंबित टिप्पणी हटाएँ?",
- "loadFailedTitle": "समीक्षा भेजने की स्क्रीन लोड नहीं हो सकी।",
- "pendingComment": "लंबित टिप्पणियाँ",
- "pendingComment_other": "लंबित टिप्पणियाँ",
- "pendingComment_one": "लंबित टिप्पणी",
- "summaryOptional": "सारांश (वैकल्पिक)",
- "partialPostedMessage": "{{displayFreshCount}} टिप्पणियाँ पोस्ट की गईं। {{displayStaleCount}} टिप्पणियाँ पुराने कमिट से जुड़ी हैं, इसलिए वे आपकी कतार में ही हैं।",
- "submitCountOfTotal": "{{displayTotalCount}} में से {{displayFreshCount}} टिप्पणियाँ भेजें",
- "submitReview": "समीक्षा भेजें",
- "blockedRequestChanges": "बदलाव का अनुरोध करने के लिए सारांश या कम से कम एक टिप्पणी जोड़ें।",
- "blockedComment": "टिप्पणी वाली समीक्षा पोस्ट करने के लिए सारांश या कम से कम एक टिप्पणी जोड़ें।"
+ "terms": {
+ "pullRequest": "पुल रिक्वेस्ट",
+ "mergeRequest": "मर्ज रिक्वेस्ट",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "मर्ज रिक्वेस्ट साझा करें",
+ "viewOnProvider": "{{provider}} पर देखें",
+ "mergeRequestUnavailable": "मर्ज रिक्वेस्ट अनुपलब्ध",
+ "unavailableDescription": "हो सकता है कि यह हटा दी गई हो, या आपके पास उसकी पहुँच न हो।",
+ "accessDeniedMergeRequest": "आपको इस मर्ज रिक्वेस्ट को देखने की अनुमति नहीं है।",
+ "couldNotLoadMergeRequest": "मर्ज रिक्वेस्ट लोड नहीं हो सकी।",
+ "discussionAccessDenied": "आपको इस मर्ज रिक्वेस्ट की चर्चा देखने की अनुमति नहीं है।",
+ "discussionUnavailableMessage": "हो सकता है कि यह मर्ज रिक्वेस्ट हटा दी गई हो।",
+ "noDiscussionDescription": "इस मर्ज रिक्वेस्ट पर अभी समीक्षा का कोई थ्रेड नहीं है और बातचीत में भी कोई टिप्पणी नहीं है।",
+ "noFilesChangedDescription": "इस मर्ज रिक्वेस्ट में किसी फ़ाइल में बदलाव नहीं है।"
},
"fileStatus": {
"changed": "बदला गया",
@@ -2706,11 +2771,6 @@
"modified": "संशोधित",
"renamed": "नाम बदला गया"
},
- "tabs": {
- "discussion": "चर्चा",
- "files": "फ़ाइलें",
- "overview": "अवलोकन"
- },
"diff": {
"selectedTapToChange": "{{label}} चुना गया, चयन बदलने के लिए टैप करें",
"tapToComment": "{{label}}, टिप्पणी करने के लिए टैप करें",
@@ -2721,7 +2781,7 @@
"emptyLine": "(खाली)"
},
"linkPasteClipboardEmpty": "क्लिपबोर्ड खाली है।",
- "linkPasteNotAPullRequest": "यह GitHub पुल रिक्वेस्ट का लिंक नहीं है।",
+ "linkPasteNotAPullRequest": "यह पुल रिक्वेस्ट या मर्ज रिक्वेस्ट का लिंक नहीं है",
"announce": {
"commentPosted": "टिप्पणी पोस्ट हुई",
"reviewSubmitted": "समीक्षा भेजी गई",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "यह टिप्पणी पोस्ट नहीं की जा सकती। हो सकता है कि चुनी गई पंक्ति बदल गई हो या PR अपडेट हो गया हो।",
"reviewNotSubmitted": "यह समीक्षा मौजूदा रूप में नहीं भेजी जा सकती। हो सकता है कि PR बदल गया हो या यह आपकी अपनी पुल रिक्वेस्ट हो, जिसकी समीक्षा आप नहीं कर सकते।",
+ "reviewNotSubmittedTerm": "यह समीक्षा जैसी है वैसी सबमिट नहीं की जा सकती। हो सकता है {{term}} बदल गई हो, या आप अपनी खुद की {{term}} की समीक्षा नहीं कर सकते।",
"couldNotPostComment": "टिप्पणी पोस्ट नहीं की जा सकी।",
"couldNotSubmitReview": "समीक्षा नहीं भेजी जा सकी। अपना कनेक्शन जाँचें और फिर से कोशिश करें।"
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "जवाब नहीं भेजा जा सका।",
"couldNotCompleteAction": "यह कार्रवाई पूरी नहीं हो सकी।",
"mergeResultDefaultError": "GitHub ने मर्ज पूरा नहीं किया।",
+ "mergeResultNotCompleted": "{{term}} मर्ज नहीं हुई। इसकी स्थिति जाँचें और फिर से कोशिश करें।",
"ambiguous": "पुष्टि नहीं हो सकी — फिर से कोशिश करने से पहले PR जाँचें।",
"persistenceFailed": "हम इस कार्रवाई को दर्ज नहीं कर सके। कृपया बाद में फिर से कोशिश करें।",
"forbidden": "इसकी अनुमति नहीं है।"
diff --git a/apps/mobile/src/i18n/locales/hr.json b/apps/mobile/src/i18n/locales/hr.json
index 9c5af2ba6a..cbb02dfd6a 100644
--- a/apps/mobile/src/i18n/locales/hr.json
+++ b/apps/mobile/src/i18n/locales/hr.json
@@ -36,6 +36,7 @@
"cost": "Trošak",
"discard": "Odbaci",
"findings": "Nalazi",
+ "mergeRequest": "merge request",
"notConnected": "Nije povezano",
"notifications": "Obavijesti",
"pullRequest": "zahtjev za spajanje",
@@ -342,10 +343,17 @@
"emptyDiffRow": "Prazan redak prikaza razlika"
},
"connectionExpired": "Veza s GitHubom je istekla.",
+ "capabilities": {
+ "banner": {
+ "title": "Nije dostupno kod ovog pružatelja usluge",
+ "accessibility": "Nije dostupno kod ovog pružatelja usluge: {{reason}}"
+ }
+ },
"merge": {
"merge": "Spajanje",
"mergeNow": "Spoji sada",
"mergePullRequest": "Spajanje zahtjeva",
+ "mergeTermTitle": "Spoji {{term}}",
"enableAutoMerge": "Uključi automatsko spajanje",
"disableAutoMerge": "Isključi automatsko spajanje",
"autoMergeOn": "Automatsko spajanje je uključeno",
@@ -364,9 +372,12 @@
"deleteBranchAfterMerge": "Izbriši granu nakon spajanja",
"noEnabledMethods": "U ovom repozitoriju nije omogućena nijedna metoda spajanja. Zatraži od administratora repozitorija da omogući spajanje, sažimanje revizija ili promjenu osnove.",
"confirmTitle": "Spojiti zahtjev?",
+ "confirmTitleTerm": "Spojiti {{term}}?",
"confirmMessage": "Tvoje će se izmjene spojiti u osnovnu granu.",
"enableAutoMergeConfirmTitle": "Uključiti automatsko spajanje?",
"enableAutoMergeConfirmMessage": "GitHub će automatski spojiti ovaj zahtjev za spajanje kada sve obavezne provjere uspiju.",
+ "enableAutoMergeConfirmMessageTerm": "Kad pipeline uspije, {{term}} će se automatski spojiti.",
+ "enableAutoMergeDescriptionTerm": "GitLab automatski spaja ovaj {{term}} kad pipeline uspije.",
"forbidden": "Nemaš dopuštenje za spajanje ovog zahtjeva za spajanje.",
"cannotMerge": "Ovaj zahtjev za spajanje nije moguće spojiti u trenutačnom stanju.",
"couldNotMerge": "Nije moguće spojiti zahtjev za spajanje.",
@@ -377,7 +388,8 @@
},
"terminal": {
"alreadyMerged": "Već spojeno",
- "closed": "Ovaj zahtjev za spajanje je zatvoren"
+ "closed": "Ovaj zahtjev za spajanje je zatvoren",
+ "closedMergeRequest": "Ovaj merge request je zatvoren"
},
"partialSuccessBanner": {
"body": "Nije moguće izbrisati granu: {{reason}}.",
@@ -403,6 +415,19 @@
"notMergeableTitle": "Ovaj zahtjev za spajanje još nije moguće spojiti",
"notMergeableDetail": "GitHub je prijavio sljedeće stanje mogućnosti spajanja: {{state}}."
},
+ "restrictions": {
+ "title": "Ograničenja spajanja",
+ "approvalsRequired_one": "Potrebno je {{displayCount}} odobrenje",
+ "approvalsRequired_other": "Potrebno je {{displayCount}} odobrenja",
+ "pipelineMustSucceed": "Prije spajanja pipeline mora uspjeti.",
+ "approvalsRequired_few": "Potrebna su {{displayCount}} odobrenja"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline ne uspijeva na zadnjem commitu.",
+ "pendingPipeline": "Pipeline je još u tijeku na zadnjem commitu.",
+ "permission": "Nemaš dopuštenje za spajanje ovog {{term}}.",
+ "draft": "Prije spajanja označi {{term}} kao spreman za pregled koda."
+ },
"methodLabels": {
"merge": "Stvori reviziju spajanja",
"squash": "Sažmi revizije i spoji",
@@ -450,6 +475,7 @@
"acceptTerms": "Prihvati",
"replyBadRequest": "Ovaj odgovor nije moguće objaviti. Nit se možda promijenila.",
"replyForbidden": "Nemaš dopuštenje za odgovaranje u ovom zahtjevu za spajanje.",
+ "replyForbiddenTerm": "Nemaš dopuštenje za odgovaranje u ovom {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Ovaj komentar nije moguće prijaviti.",
@@ -481,8 +507,6 @@
"termsAcceptRequired": "Za objavljivanje moraš prihvatiti uvjete korištenja.",
"termsOutdatedCopy": "Uvjeti korištenja su se promijenili. Ponovno otvori ovaj zaslon i prihvati najnoviju verziju.",
"termsCheckRetryCopy": "Nije moguće provjeriti uvjete korištenja. Provjeri vezu i pokušaj ponovno.",
- "comment_few": "{{displayCount}} komentara",
- "reaction_few": "reakcije",
"reactions": {
"thumbsUp": "Palac gore",
"thumbsDown": "Palac dolje",
@@ -500,7 +524,9 @@
"outdatedOnLines": "Zastarjelo na {{lines}}",
"outdatedOnPath": "Zastarjelo na {{path}}"
},
- "deletedUser": "izbrisani korisnik"
+ "deletedUser": "izbrisani korisnik",
+ "comment_few": "{{displayCount}} komentara",
+ "reaction_few": "reakcije"
},
"couldNotOpenGitHubAppSettings": "Nije moguće otvoriti postavke aplikacije GitHub.",
"installKiloGitHubApp": "Instaliraj aplikaciju Kilo za GitHub",
@@ -512,17 +538,19 @@
"reviewPullRequest": "Pregledaj zahtjev za spajanje",
"headLine": "{{counts}} · najnovija revizija {{sha}}",
"entry": {
- "eyebrow": "Otvori zahtjev za spajanje putem URL-a.",
- "pastePrLink": "Zalijepi poveznicu na PR",
- "noRecentPrs": "Nema nedavnih PR-ova",
- "noRecentPrsDescription": "Zalijepi poveznicu na PR iznad za početak pregleda koda — sljedeći će se put prikazati ovdje.",
+ "eyebrow": "Otvori zahtjev za spajanje ili merge request putem URL-a",
+ "pastePrLink": "Zalijepi poveznicu na zahtjev za spajanje ili merge request",
+ "noRecentPrs": "Nema nedavnih pregleda",
+ "noRecentPrsDescription": "Za početak pregleda zalijepite poveznicu gore — sljedeći put će se pojaviti ovdje.",
"couldNotLoad": "Učitavanje nije uspjelo.",
"removeFromRecentsTitle": "Ukloniti s popisa nedavnih?",
- "removeFromRecentsMessage": "Ovaj će zahtjev za spajanje biti uklonjen s tvog popisa nedavnih zahtjeva.",
+ "removeFromRecentsMessage": "Ovaj pregled bit će uklonjen iz nedavnih.",
"removeRecentAccessibility": "Ukloni {{repo}} s popisa nedavnih",
- "urlAccessibility": "URL zahtjeva za spajanje na GitHubu",
- "clearLink": "Izbriši poveznicu na zahtjev za spajanje",
- "pasteLink": "Zalijepi poveznicu na zahtjev za spajanje",
+ "urlAccessibility": "Unesite URL zahtjeva za spajanje ili merge requesta",
+ "urlPlaceholder": "URL zahtjeva za spajanje ili merge requesta",
+ "openAccessibility": "Otvori zahtjev za spajanje ili merge request",
+ "clearLink": "Izbriši poveznicu",
+ "pasteLink": "Zalijepi poveznicu na zahtjev za spajanje ili merge request",
"open": "Otvori"
},
"checks": {
@@ -571,9 +599,15 @@
"connect": {
"checkFailedTitle": "Nije moguće provjeriti vezu s GitHubom.",
"checkFailedMessage": "Status prijave nije dostupan dok učitavanje ne završi.",
+ "checkFailedTitleGitLab": "Nije moguće provjeriti vezu s GitLabom.",
+ "checkFailedTitleBitbucket": "Nije moguće provjeriti vezu s Bitbucketom.",
+ "providerCheckFailedMessage": "Status povezavanja dostupan je nakon učitavanja.",
"reconnectTitle": "Ponovno poveži GitHub",
"reconnectDescription": "Tvoja veza s GitHubom je opozvana. Ponovno se poveži za nastavak pregleda zahtjeva za spajanje na mobitelu.",
- "description": "Poveži svoj račun za GitHub za pregled zahtjeva za spajanje na mobitelu."
+ "description": "Poveži svoj račun za GitHub za pregled zahtjeva za spajanje na mobitelu.",
+ "gitlabDescription": "Poveži svoj GitLab račun za pregled merge requesta na mobitelu.",
+ "bitbucketDescription": "Poveži Bitbucket s ovom organizacijom za pregled zahtjeva za spajanje na mobitelu.",
+ "bitbucketOrgOnlyDescription": "Odaberi organizaciju u svom profilu za pregled njezinih zahtjeva za spajanje na Bitbucketu."
},
"screen": {
"title": "#{{number}}",
@@ -596,7 +630,10 @@
},
"reconnectNotice": {
"title": "Veza s GitHubom je istekla.",
- "message": "Tvoja veza s GitHubom više nije valjana. Ponovno provjeri vezu — po potrebi će se zatražiti ponovno povezivanje."
+ "message": "Tvoja veza s GitHubom više nije valjana. Ponovno provjeri vezu — po potrebi će se zatražiti ponovno povezivanje.",
+ "gitlabTitle": "Veza s GitLabom je istekla.",
+ "bitbucketTitle": "Veza s Bitbucketom je istekla.",
+ "providerMessage": "Tvoja veza s {{provider}}om više nije valjana. Ponovno provjeri vezu — po potrebi će se zatražiti ponovno povezivanje."
},
"eventChips": {
"comment": "Komentiraj",
@@ -650,6 +687,21 @@
"files": "Datoteke",
"discussion": "Rasprava"
},
+ "terms": {
+ "pullRequest": "Zahtjev za spajanje",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Podijeli merge request",
+ "viewOnProvider": "Pogledaj na {{provider}}",
+ "mergeRequestUnavailable": "Merge request nije dostupan",
+ "unavailableDescription": "Možda je uklonjen ili nemaš pristup njemu.",
+ "accessDeniedMergeRequest": "Nemaš dopuštenje za prikaz ovog merge requesta.",
+ "couldNotLoadMergeRequest": "Nije moguće učitati merge request.",
+ "discussionAccessDenied": "Nemaš dopuštenje za prikaz rasprave o ovom merge requestu.",
+ "discussionUnavailableMessage": "Ovaj merge request možda je uklonjen.",
+ "noDiscussionDescription": "U ovom merge requestu još nema niti iz pregleda koda ni komentara u razgovoru.",
+ "noFilesChangedDescription": "U ovom merge requestu nema izmjena datoteka."
+ },
"fileStatus": {
"modified": "Izmijenjeno",
"renamed": "Preimenovano",
@@ -666,7 +718,7 @@
"emptyLine": "(prazno)"
},
"linkPasteClipboardEmpty": "Međuspremnik je prazan.",
- "linkPasteNotAPullRequest": "Ovo nije poveznica na zahtjev za spajanje na GitHubu.",
+ "linkPasteNotAPullRequest": "Ovo nije poveznica na zahtjev za spajanje ni merge request",
"announce": {
"commentPosted": "Komentar objavljen",
"reviewSubmitted": "Pregled koda je poslan",
@@ -675,6 +727,7 @@
"mutationError": {
"commentNotPosted": "Ovaj komentar ne može se objaviti. Odabrani redak možda se promijenio ili je PR ažuriran.",
"reviewNotSubmitted": "Ovaj pregled koda nije moguće poslati u trenutačnom obliku. PR se možda promijenio ili pokušavaš pregledati vlastiti zahtjev za spajanje.",
+ "reviewNotSubmittedTerm": "Ovaj pregled koda nije moguće poslati u trenutačnom obliku. {{term}} se možda promijenio ili ne možeš pregledati vlastiti {{term}}.",
"couldNotPostComment": "Nije moguće objaviti komentar.",
"couldNotSubmitReview": "Nije moguće poslati pregled koda. Provjeri vezu i pokušaj ponovno."
},
@@ -682,6 +735,7 @@
"couldNotReply": "Nije moguće odgovoriti.",
"couldNotCompleteAction": "Nije moguće dovršiti ovu radnju.",
"mergeResultDefaultError": "GitHub nije dovršio spajanje.",
+ "mergeResultNotCompleted": "{{term}} nije spojen. Provjeri njegovo stanje i pokuši ponovno.",
"ambiguous": "Nije moguće potvrditi ishod — provjeri PR prije ponovnog pokušaja.",
"persistenceFailed": "Nismo mogli zabilježiti ovu radnju. Pokušaj ponovno kasnije.",
"forbidden": "Ova radnja nije dopuštena."
@@ -2004,11 +2058,31 @@
"retryConnection": "Pokušaj se ponovno povezati"
},
"newSession": {
+ "recentlyUsed": "Nedavno korišteno",
+ "couldNotLoadGithubRepositories": "Učitavanje GitHub repozitorija nije uspjelo.",
+ "couldNotLoadGitlabRepositories": "Učitavanje GitLab repozitorija nije uspjelo.",
+ "couldNotLoadBitbucketRepositories": "Učitavanje Bitbucket repozitorija nije uspjelo.",
"connectGithubDescription": "Poveži GitHub u pregledniku, a zatim se vrati ovdje da odabereš repozitorij.",
+ "connectGitlabDescription": "Poveži GitLab u pregledniku, a zatim se vrati ovdje da odabereš repozitorij.",
+ "connectBitbucketDescription": "Poveži Bitbucket u pregledniku, a zatim se vrati ovdje da odabereš repozitorij.",
"openGithub": "Otvori GitHub",
+ "openGitlab": "Otvori GitLab",
+ "openBitbucket": "Otvori Bitbucket",
"refreshRepositories": "Osvježi repozitorije",
"githubConnected": "GitHub povezan",
+ "gitlabConnected": "GitLab povezan",
"noRepositoriesVisible": "Nema vidljivih repozitorija. Provjeri ima li aplikacija Kilo za GitHub pristup repozitorijima, a zatim osvježi popis.",
+ "noRepositoriesVisibleGitlab": "Nema vidljivih repozitorija. Provjeri pristup repozitorijima na GitLabu, a zatim osvježi popis.",
+ "noRepositoriesVisibleBitbucket": "Nema vidljivih repozitorija. Provjeri pristup repozitorijima na Bitbucketu, a zatim osvježi popis.",
+ "bitbucketOrganizationsOnly": "Bitbucket je dostupan samo za organizacije.",
+ "branchPickerTitle": "Odaberi granu",
+ "branchDefault": "Zadano",
+ "branchAccessibility": "Grana: {{label}}",
+ "branchLoading": "Učitavanje grana",
+ "branchLoadError": "Nije moguće učitati grane",
+ "branchUnavailable": "Grene nisu dostupne za ovaj repozitorij. Provjeri svoj pristup kod pružatelja usluge, pa odaberi drugi repozitorij.",
+ "branchEmpty": "Nema dostupnih grana",
+ "branchPlaceholder": "Odaberi granu",
"runOnWithTarget": "Mjesto pokretanja: {{target}}",
"environment": "Okruženje",
"couldNotLoadEnvironment": "Nije moguće učitati tvoje okruženje.",
@@ -2029,24 +2103,13 @@
"couldNotRefreshRepositories": "Nije moguće osvježiti repozitorije. Pokušaj ponovno.",
"discardDraftTitle": "Odbaciti nacrt?",
"discardDraftMessage": "Tvoj će se upit izgubiti.",
+ "discardWithUploadsMessage": "Tvoj upit i sve prenesene datoteke koje nisu priložene poslanim porukama bit će izbrisani.",
"discardFailed": "Nije moguće odbaciti nacrt. Pokušaj ponovno.",
"remoteHint": "Pokreni `kilo remote` na svom računalu ili `/remote` u aktivnoj CLI sesiji da upravljaš lokalnim procesom kilo.",
- "connectBitbucketDescription": "Poveži Bitbucket u pregledniku, a zatim se vrati ovdje da odabereš repozitorij.",
- "connectGitlabDescription": "Poveži GitLab u pregledniku, a zatim se vrati ovdje da odabereš repozitorij.",
- "couldNotLoadBitbucketRepositories": "Učitavanje Bitbucket repozitorija nije uspjelo.",
- "couldNotLoadGithubRepositories": "Učitavanje GitHub repozitorija nije uspjelo.",
- "couldNotLoadGitlabRepositories": "Učitavanje GitLab repozitorija nije uspjelo.",
- "gitlabConnected": "GitLab povezan",
- "noRepositoriesVisibleBitbucket": "Nema vidljivih repozitorija. Provjeri pristup repozitorijima na Bitbucketu, a zatim osvježi popis.",
- "noRepositoriesVisibleGitlab": "Nema vidljivih repozitorija. Provjeri pristup repozitorijima na GitLabu, a zatim osvježi popis.",
- "openBitbucket": "Otvori Bitbucket",
- "openGitlab": "Otvori GitLab",
- "recentlyUsed": "Nedavno korišteno",
"continueFrom": "Nastavlja se sesija {{title}}.",
"importingSession": "Uvoz sesije",
"cliCannotContinue": "Ovaj CLI ne može nastaviti sesiju. Odaberi Cloud Agent ili drugi CLI.",
- "importFailed": "Uvoz ove sesije nije uspio.",
- "discardWithUploadsMessage": "Tvoj upit i sve prenesene datoteke koje nisu priložene poslanim porukama bit će izbrisani."
+ "importFailed": "Uvoz ove sesije nije uspio."
},
"partRenderer": {
"updatedFileCount_one": "Ažurirana je {{displayCount}} datoteka.",
diff --git a/apps/mobile/src/i18n/locales/ht.json b/apps/mobile/src/i18n/locales/ht.json
index bfcac2b355..e170d4a6df 100644
--- a/apps/mobile/src/i18n/locales/ht.json
+++ b/apps/mobile/src/i18n/locales/ht.json
@@ -36,6 +36,7 @@
"cost": "Pri",
"discard": "Jete",
"findings": "Pwoblèm detekte",
+ "mergeRequest": "merge request",
"notConnected": "Pa konekte",
"notifications": "Notifikasyon",
"pullRequest": "demann fizyon",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Ranje vid nan diferans kòd yo"
},
"connectionExpired": "Koneksyon ak GitHub la ekspire.",
+ "capabilities": {
+ "banner": {
+ "title": "Pa disponib pou founisè sa a",
+ "accessibility": "Pa disponib pou founisè sa a: {{reason}}"
+ }
+ },
"merge": {
"merge": "Fizyon",
"mergeNow": "Fizyonnen kounye a",
"mergePullRequest": "Fizyon demann lan",
+ "mergeTermTitle": "Fizyon {{term}}",
"enableAutoMerge": "Aktive fizyon otomatik",
"disableAutoMerge": "Dezaktive fizyon otomatik",
"autoMergeOn": "Fizyon otomatik aktive",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Efase branch lan apre fizyon an",
"noEnabledMethods": "Pa gen metòd fizyon ki aktive nan depo sa a. Mande yon administratè depo a pou aktive fizyon nòmal, fizyon ak gwoupman komit oswa fizyon ak chanjman baz.",
"confirmTitle": "Fizyonnen demann lan?",
+ "confirmTitleTerm": "Fizyonnen {{term}} lan?",
"confirmMessage": "Sa ap fizyonnen chanjman ou yo nan branch baz la.",
"enableAutoMergeConfirmTitle": "Aktive fizyon otomatik?",
"enableAutoMergeConfirmMessage": "GitHub ap fizyonnen demann sa a otomatikman lè tout verifikasyon obligatwa yo reyisi.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} lan ap fizyone otomatikman lè pipeline li a reyisi.",
+ "enableAutoMergeDescriptionTerm": "GitLab ap fizyone {{term}} sa a otomatikman lè pipeline li a reyisi.",
"forbidden": "Ou pa gen pèmisyon pou fizyonnen demann sa a.",
"cannotMerge": "Pa ka fizyonnen demann sa a jan li ye a.",
"couldNotMerge": "Pa t ka fizyonnen demann lan.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Deja fizyonnen",
- "closed": "Demann fizyon sa a fèmen"
+ "closed": "Demann fizyon sa a fèmen",
+ "closedMergeRequest": "Merge request sa a fèmen"
},
"partialSuccessBanner": {
"body": "Pa t ka efase branch lan: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Demann sa a poko ka fizyonnen",
"notMergeableDetail": "GitHub endike eta {{state}} pou posiblite fizyon an."
},
+ "restrictions": {
+ "title": "Restriksyon fizyon",
+ "approvalsRequired_one": "{{displayCount}} apwobasyon obligatwa",
+ "approvalsRequired_other": "{{displayCount}} apwobasyon obligatwa",
+ "pipelineMustSucceed": "Pipeline la dwe reyisi anvan fizyon."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline la ap echwe sou dènye komit la.",
+ "pendingPipeline": "Pipeline la toujou ap kouri sou dènye komit la.",
+ "permission": "Ou pa gen pèmisyon pou fizyonnen {{term}} sa a.",
+ "draft": "Make {{term}} lan kòm pare pou revizyon anvan ou fizyonnen li."
+ },
"methodLabels": {
"merge": "Kreye yon komit fizyon",
"squash": "Gwoupe komit yo epi fizyonnen",
@@ -448,6 +472,7 @@
"acceptTerms": "Aksepte",
"replyBadRequest": "Pa ka pibliye repons sa a. Petèt fil diskisyon an chanje.",
"replyForbidden": "Ou pa gen pèmisyon pou reponn demann fizyon sa a.",
+ "replyForbiddenTerm": "Ou pa gen pèmisyon pou reponn {{term}} sa a.",
"moderation": {
"reportContent": {
"terminal": "Pa ka rapòte kòmantè sa a.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Revize demann fizyon an",
"headLine": "{{counts}} · dènye komit {{sha}}",
"entry": {
- "eyebrow": "Louvri yon demann fizyon ak URL li.",
- "pastePrLink": "Kole yon lyen PR",
- "noRecentPrs": "Pa gen PR resan",
- "noRecentPrsDescription": "Kole yon lyen PR pi wo a pou kòmanse yon revizyon — l ap parèt isit la pwochen fwa a.",
+ "eyebrow": "Louvri yon demann fizyon oswa yon merge request ak URL li",
+ "pastePrLink": "Kole yon lyen demann fizyon oswa merge request",
+ "noRecentPrs": "Pa gen revizyon resan",
+ "noRecentPrsDescription": "Kole yon lyen pi wo a pou kòmanse yon revizyon — l ap parèt isit la pwochen fwa a.",
"couldNotLoad": "Pa t ka chaje.",
"removeFromRecentsTitle": "Retire nan lis PR resan yo?",
- "removeFromRecentsMessage": "Demann fizyon sa a ap retire nan lis PR resan ou yo.",
+ "removeFromRecentsMessage": "Revizyon sa a ap retire nan lis resan ou yo.",
"removeRecentAccessibility": "Retire {{repo}} nan lis PR resan yo",
- "urlAccessibility": "URL demann fizyon GitHub la",
- "clearLink": "Efase lyen demann fizyon an",
- "pasteLink": "Kole lyen demann fizyon an",
+ "urlAccessibility": "Antre yon URL demann fizyon oswa merge request",
+ "urlPlaceholder": "URL demann fizyon oswa merge request",
+ "openAccessibility": "Louvri yon demann fizyon oswa yon merge request",
+ "clearLink": "Efase lyen an",
+ "pasteLink": "Kole lyen demann fizyon oswa merge request",
"open": "Louvri"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Pa t ka tcheke koneksyon GitHub la.",
"checkFailedMessage": "Estati koneksyon an pa disponib toutotan done sa yo pa chaje.",
+ "checkFailedTitleGitLab": "Pa t ka tcheke koneksyon GitLab la.",
+ "checkFailedTitleBitbucket": "Pa t ka tcheke koneksyon Bitbucket la.",
+ "providerCheckFailedMessage": "Estati koneksyon an pa disponib jiskaske li chaje.",
"reconnectTitle": "Rekonekte GitHub",
"reconnectDescription": "Yo revoke koneksyon GitHub ou a. Rekonekte pou kontinye revize demann fizyon sou mobil.",
- "description": "Konekte kont GitHub ou a pou revize demann fizyon sou mobil."
+ "description": "Konekte kont GitHub ou a pou revize demann fizyon sou mobil.",
+ "gitlabDescription": "Konekte kont GitLab ou pou w revize merge request sou mobil ou.",
+ "bitbucketDescription": "Konekte Bitbucket ak òganizasyon sa a pou w revize demann fizyon sou mobil ou.",
+ "bitbucketOrgOnlyDescription": "Chwazi yon òganizasyon nan pwofil ou pou w revize demann fizyon Bitbucket li yo."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Koneksyon ak GitHub la ekspire.",
- "message": "Koneksyon GitHub ou a pa valab ankò. Tcheke koneksyon an ankò — n ap mande ou rekonekte si sa nesesè."
+ "message": "Koneksyon GitHub ou a pa valab ankò. Tcheke koneksyon an ankò — n ap mande ou rekonekte si sa nesesè.",
+ "gitlabTitle": "Koneksyon ak GitLab la ekspire.",
+ "bitbucketTitle": "Koneksyon ak Bitbucket la ekspire.",
+ "providerMessage": "Koneksyon {{provider}} ou a pa valab ankò. Tcheke koneksyon an ankò — n ap mande ou rekonekte si sa nesesè."
},
"eventChips": {
"comment": "Kòmantè",
@@ -643,6 +679,21 @@
"files": "Fichye",
"discussion": "Diskisyon"
},
+ "terms": {
+ "pullRequest": "Demann fizyon",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Pataje merge request la",
+ "viewOnProvider": "Gade sou {{provider}}",
+ "mergeRequestUnavailable": "Merge request la pa disponib",
+ "unavailableDescription": "Petèt yo te efase l, oswa ou pa gen aksè a li.",
+ "accessDeniedMergeRequest": "Ou pa gen pèmisyon pou wè merge request sa a.",
+ "couldNotLoadMergeRequest": "Pa t ka chaje merge request la.",
+ "discussionAccessDenied": "Ou pa gen pèmisyon pou wè diskisyon merge request sa a.",
+ "discussionUnavailableMessage": "Petèt yo te retire merge request sa a.",
+ "noDiscussionDescription": "Pa gen fil diskisyon pou revizyon ni kòmantè nan konvèsasyon merge request sa a.",
+ "noFilesChangedDescription": "Pa gen chanjman nan fichye yo nan merge request sa a."
+ },
"fileStatus": {
"modified": "Modifye",
"renamed": "Non chanje",
@@ -659,7 +710,7 @@
"emptyLine": "(vid)"
},
"linkPasteClipboardEmpty": "Près-papye a vid.",
- "linkPasteNotAPullRequest": "Sa a pa yon lyen demann fizyon GitHub.",
+ "linkPasteNotAPullRequest": "Sa a pa yon lyen demann fizyon ni merge request",
"announce": {
"commentPosted": "Kòmantè pibliye",
"reviewSubmitted": "Revizyon soumèt",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Pa ka pibliye kòmantè sa a. Petèt liy ou chwazi a chanje, oswa PR a te mete ajou.",
"reviewNotSubmitted": "Pa ka soumèt revizyon sa a jan li ye a. Petèt PR a chanje, oswa ou pa ka revize pwòp demann fizyon ou a.",
+ "reviewNotSubmittedTerm": "Yo pa ka voye revizyon sa a jan l ye a. Petèt {{term}} lan chanje, oswa ou pa ka revize pwòp {{term}} ou.",
"couldNotPostComment": "Pa t ka pibliye kòmantè a.",
"couldNotSubmitReview": "Pa t ka soumèt revizyon an. Tcheke koneksyon ou epi eseye ankò."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Nou pa t kapab voye repons lan.",
"couldNotCompleteAction": "Pa t ka fini aksyon sa a.",
"mergeResultDefaultError": "GitHub pa t fini fizyon an.",
+ "mergeResultNotCompleted": "Yo pa t fizyone {{term}} lan. Tcheke estati li epi eseye ankò.",
"ambiguous": "Pa t ka konfime — tcheke PR a anvan ou eseye ankò.",
"persistenceFailed": "Nou pa t ka anrejistre aksyon sa a. Tanpri eseye ankò pita.",
"forbidden": "Aksyon sa a entèdi."
@@ -1988,11 +2041,31 @@
"retryConnection": "Rekonekte"
},
"newSession": {
+ "recentlyUsed": "Itilize dènyèman",
+ "couldNotLoadGithubRepositories": "Nou pa t ka chaje depo GitHub yo.",
+ "couldNotLoadGitlabRepositories": "Nou pa t ka chaje depo GitLab yo.",
+ "couldNotLoadBitbucketRepositories": "Nou pa t ka chaje depo Bitbucket yo.",
"connectGithubDescription": "Konekte GitHub nan navigatè ou a, epi tounen isit la pou chwazi yon depo.",
+ "connectGitlabDescription": "Konekte GitLab nan navigatè ou a, epi tounen isit la pou chwazi yon depo.",
+ "connectBitbucketDescription": "Konekte Bitbucket nan navigatè ou a, epi tounen isit la pou chwazi yon depo.",
"openGithub": "Louvri GitHub",
+ "openGitlab": "Louvri GitLab",
+ "openBitbucket": "Louvri Bitbucket",
"refreshRepositories": "Rafrechi depo yo",
"githubConnected": "GitHub konekte",
+ "gitlabConnected": "GitLab konekte",
"noRepositoriesVisible": "Pa gen depo ki parèt. Tcheke si aplikasyon Kilo pou GitHub la gen aksè nan depo yo, epi rafrechi lis la.",
+ "noRepositoriesVisibleGitlab": "Pa gen depo ki parèt. Tcheke aksè nan depo yo pou GitLab, epi rafrechi lis la.",
+ "noRepositoriesVisibleBitbucket": "Pa gen depo ki parèt. Tcheke aksè nan depo yo pou Bitbucket, epi rafrechi lis la.",
+ "bitbucketOrganizationsOnly": "Bitbucket disponib sèlman pou òganizasyon.",
+ "branchPickerTitle": "Chwazi branch",
+ "branchDefault": "Pa defo",
+ "branchAccessibility": "Branch: {{label}}",
+ "branchLoading": "Ap chaje branch yo",
+ "branchLoadError": "Pa t ka chaje branch yo",
+ "branchUnavailable": "Pa gen branch disponib pou depo sa a. Tcheke aksè ou ak founisè a, epi chwazi yon lòt depo.",
+ "branchEmpty": "Pa gen branch disponib",
+ "branchPlaceholder": "Chwazi yon branch",
"runOnWithTarget": "Egzekite sou: {{target}}",
"environment": "Anviwònman",
"couldNotLoadEnvironment": "Nou pa t ka chaje anviwònman ou an.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Nou pa t ka rafrechi depo yo. Tanpri eseye ankò.",
"discardDraftTitle": "Jete bouyon an?",
"discardDraftMessage": "Ou ap pèdi enstriksyon ou yo.",
+ "discardWithUploadsMessage": "Enstriksyon ou yo ak tout fichye ou voye ki poko atache ak yon mesaj ap efase.",
"discardFailed": "Nou pa t ka jete bouyon an. Tanpri eseye ankò.",
"remoteHint": "Egzekite `kilo remote` sou òdinatè ou a, oswa `/remote` nan yon sesyon CLI ki aktif, pou kontwole yon pwosesis kilo lokal.",
- "connectBitbucketDescription": "Konekte Bitbucket nan navigatè ou a, epi tounen isit la pou chwazi yon depo.",
- "connectGitlabDescription": "Konekte GitLab nan navigatè ou a, epi tounen isit la pou chwazi yon depo.",
- "couldNotLoadBitbucketRepositories": "Nou pa t ka chaje depo Bitbucket yo.",
- "couldNotLoadGithubRepositories": "Nou pa t ka chaje depo GitHub yo.",
- "couldNotLoadGitlabRepositories": "Nou pa t ka chaje depo GitLab yo.",
- "gitlabConnected": "GitLab konekte",
- "noRepositoriesVisibleBitbucket": "Pa gen depo ki parèt. Tcheke aksè nan depo yo pou Bitbucket, epi rafrechi lis la.",
- "noRepositoriesVisibleGitlab": "Pa gen depo ki parèt. Tcheke aksè nan depo yo pou GitLab, epi rafrechi lis la.",
- "openBitbucket": "Louvri Bitbucket",
- "openGitlab": "Louvri GitLab",
- "recentlyUsed": "Itilize dènyèman",
"continueFrom": "Nou ap kontinye {{title}}.",
"importingSession": "Ap enpòte sesyon an",
"cliCannotContinue": "CLI sa a pa ka kontinye yon sesyon. Chwazi Cloud Agent oswa yon lòt CLI.",
- "importFailed": "Nou pa t ka enpòte sesyon sa a.",
- "discardWithUploadsMessage": "Enstriksyon ou yo ak tout fichye ou voye ki poko atache ak yon mesaj ap efase."
+ "importFailed": "Nou pa t ka enpòte sesyon sa a."
},
"partRenderer": {
"updatedFileCount_one": "Nou mete {{displayCount}} fichye ajou.",
diff --git a/apps/mobile/src/i18n/locales/hu.json b/apps/mobile/src/i18n/locales/hu.json
index f35b75a638..36d578e945 100644
--- a/apps/mobile/src/i18n/locales/hu.json
+++ b/apps/mobile/src/i18n/locales/hu.json
@@ -36,6 +36,7 @@
"cost": "Költség",
"discard": "Elvetés",
"findings": "Találatok",
+ "mergeRequest": "merge request",
"notConnected": "Nincs csatlakoztatva",
"notifications": "Értesítések",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Üres sor a különbségnézetben"
},
"connectionExpired": "A GitHub-kapcsolat lejárt.",
+ "capabilities": {
+ "banner": {
+ "title": "Nem érhető el ennél a szolgáltatónál",
+ "accessibility": "Nem érhető el ennél a szolgáltatónál: {{reason}}"
+ }
+ },
"merge": {
"merge": "Összevonás",
"mergeNow": "Összevonás most",
"mergePullRequest": "Módosítási kérelem összevonása",
+ "mergeTermTitle": "{{term}} összevonása",
"enableAutoMerge": "Automatikus összevonás engedélyezése",
"disableAutoMerge": "Automatikus összevonás letiltása",
"autoMergeOn": "Automatikus összevonás bekapcsolva",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Ág törlése az összevonás után",
"noEnabledMethods": "Ebben a tárolóban nincs engedélyezett összevonási módszer. Kérd meg a tároló egyik adminisztrátorát, hogy engedélyezze az összevonást, az egyesítést vagy az újraalapozást.",
"confirmTitle": "Összevonod a módosítási kérelmet?",
+ "confirmTitleTerm": "{{term}} összevonása?",
"confirmMessage": "Ezzel a módosításaid bekerülnek az alapágba.",
"enableAutoMergeConfirmTitle": "Engedélyezed az automatikus összevonást?",
"enableAutoMergeConfirmMessage": "A GitHub automatikusan összevonja ezt a módosítási kérelmet, amint minden kötelező ellenőrzés sikeres.",
+ "enableAutoMergeConfirmMessageTerm": "A pipeline sikeres lefutása után a {{term}} automatikusan összevonásra kerül.",
+ "enableAutoMergeDescriptionTerm": "A GitLab automatikusan elvégzi a {{term}} összevonását, amint a pipeline sikeres.",
"forbidden": "Nincs jogosultságod a módosítási kérelem összevonásához.",
"cannotMerge": "Ez a módosítási kérelem a jelenlegi formájában nem vonható össze.",
"couldNotMerge": "Nem sikerült összevonni a módosítási kérelmet.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Már összevonva",
- "closed": "A módosítási kérelem lezárva"
+ "closed": "A módosítási kérelem lezárva",
+ "closedMergeRequest": "Ez a merge request le van zárva"
},
"partialSuccessBanner": {
"body": "Nem sikerült törölni az ágat. Az ok: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Ez a módosítási kérelem még nem vonható össze",
"notMergeableDetail": "A GitHub által jelzett összevonhatósági állapot: {{state}}."
},
+ "restrictions": {
+ "title": "Egyesítési korlátozások",
+ "approvalsRequired_one": "{{displayCount}} jóváhagyás szükséges",
+ "approvalsRequired_other": "{{displayCount}} jóváhagyás szükséges",
+ "pipelineMustSucceed": "A pipeline-nak sikeresnek kell lennie az egyesítés előtt."
+ },
+ "providerBlocked": {
+ "failingPipeline": "A pipeline hibázik a legutóbbi commiton.",
+ "pendingPipeline": "A pipeline még fut a legutóbbi committal.",
+ "permission": "Nincs jogosultságod a {{term}} összevonásához.",
+ "draft": "Az összevonás előtt jelöld a {{term}} kódellenőrzésre késznek."
+ },
"methodLabels": {
"merge": "Összevonási véglegesítés létrehozása",
"squash": "Egyesítés és összevonás",
@@ -448,6 +472,7 @@
"acceptTerms": "Elfogadás",
"replyBadRequest": "Ez a válasz nem küldhető el. Lehet, hogy a szál megváltozott.",
"replyForbidden": "Nincs jogosultságod válaszolni erre a módosítási kérelemre.",
+ "replyForbiddenTerm": "Nincs jogosultságod a {{term}} megválaszolására.",
"moderation": {
"reportContent": {
"terminal": "Ez a hozzászólás nem jelenthető.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Módosítási kérelem kódellenőrzése",
"headLine": "{{counts}} · legutóbbi véglegesítés: {{sha}}",
"entry": {
- "eyebrow": "Nyiss meg egy módosítási kérelmet az URL megadásával.",
- "pastePrLink": "PR-hivatkozás beillesztése",
- "noRecentPrs": "Nincs nemrég megnyitott PR",
- "noRecentPrsDescription": "Illessz be fent egy PR-hivatkozást a kódellenőrzés indításához. Legközelebb itt is megtalálod.",
+ "eyebrow": "Nyiss meg egy PR-t vagy merge requestet az URL megadásával",
+ "pastePrLink": "PR- vagy merge request-hivatkozás beillesztése",
+ "noRecentPrs": "Nincs közelmúltbeli kódellenőrzés",
+ "noRecentPrsDescription": "Illessz be fent egy hivatkozást a kódellenőrzés indításához — legközelebb itt fog megjelenni.",
"couldNotLoad": "Nem sikerült a betöltés.",
"removeFromRecentsTitle": "Eltávolítod az előzményekből?",
- "removeFromRecentsMessage": "Ez a módosítási kérelem eltűnik az előzményeidből.",
+ "removeFromRecentsMessage": "Ez a kódellenőrzés eltűnik az előzményeidből.",
"removeRecentAccessibility": "{{repo}} eltávolítása az előzményekből",
- "urlAccessibility": "GitHub-módosítási kérelem URL-címe",
- "clearLink": "Módosítási kérelem hivatkozásának törlése",
- "pasteLink": "Módosítási kérelem hivatkozásának beillesztése",
+ "urlAccessibility": "Add meg egy PR vagy merge request URL-címét",
+ "urlPlaceholder": "Módosítási kérelem vagy merge request URL",
+ "openAccessibility": "Módosítási kérelem vagy merge request megnyitása",
+ "clearLink": "Hivatkozás törlése",
+ "pasteLink": "PR- vagy merge request-hivatkozás beillesztése",
"open": "Megnyitás"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Nem sikerült ellenőrizni a GitHub-kapcsolatot.",
"checkFailedMessage": "A bejelentkezési állapot csak a betöltés után érhető el.",
+ "checkFailedTitleGitLab": "Nem sikerült ellenőrizni a GitLab-kapcsolatot.",
+ "checkFailedTitleBitbucket": "Nem sikerült ellenőrizni a Bitbucket-kapcsolatot.",
+ "providerCheckFailedMessage": "A kapcsolódási állapot csak a betöltés után érhető el.",
"reconnectTitle": "Újracsatlakozás a GitHubhoz",
"reconnectDescription": "Visszavonták a GitHub-kapcsolatod engedélyét. Csatlakozz újra, hogy mobilon is folytathasd a módosítási kérelmek kódellenőrzését.",
- "description": "Csatlakoztasd a GitHub-fiókodat a módosítási kérelmek mobilos kódellenőrzéséhez."
+ "description": "Csatlakoztasd a GitHub-fiókodat a módosítási kérelmek mobilos kódellenőrzéséhez.",
+ "gitlabDescription": "Csatlakoztasd a GitLab-fiókodat a merge requests kódellenőrzéséhez mobilon.",
+ "bitbucketDescription": "Csatlakoztasd a Bitbucketot ehhez a szervezethez a módosítási kérelmek mobilos kódellenőrzéséhez.",
+ "bitbucketOrgOnlyDescription": "Válassz szervezetet a profilodban, hogy átnézd annak Bitbucket-módosítási kérelmeit."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "A GitHub-kapcsolat lejárt.",
- "message": "A GitHub-kapcsolatod már nem érvényes. Ellenőrizd újra a kapcsolatot. Ha szükséges, az alkalmazás kérni fogja az újracsatlakozást."
+ "message": "A GitHub-kapcsolatod már nem érvényes. Ellenőrizd újra a kapcsolatot. Ha szükséges, az alkalmazás kérni fogja az újracsatlakozást.",
+ "gitlabTitle": "A GitLab-kapcsolat lejárt.",
+ "bitbucketTitle": "A Bitbucket-kapcsolat lejárt.",
+ "providerMessage": "A {{provider}}-kapcsolatod már nem érvényes. Ellenőrizd újra a kapcsolatot. Ha szükséges, az alkalmazás kérni fogja az újracsatlakozást."
},
"eventChips": {
"comment": "Hozzászólás",
@@ -643,6 +679,21 @@
"files": "Fájl",
"discussion": "Beszélgetés"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Merge request megosztása",
+ "viewOnProvider": "Megtekintés itt: {{provider}}",
+ "mergeRequestUnavailable": "A merge request nem érhető el",
+ "unavailableDescription": "Lehet, hogy törölték, vagy nincs hozzáférésed.",
+ "accessDeniedMergeRequest": "Nincs jogosultságod a merge request megtekintéséhez.",
+ "couldNotLoadMergeRequest": "Nem sikerült betölteni a merge request.",
+ "discussionAccessDenied": "Nincs jogosultságod a merge request-hez tartozó beszélgetés megtekintéséhez.",
+ "discussionUnavailableMessage": "Lehet, hogy ezt a merge request eltávolították.",
+ "noDiscussionDescription": "Ehhez a merge request nem tartozik kódellenőrzési beszélgetés vagy hozzászólás.",
+ "noFilesChangedDescription": "Ez a merge request nem tartalmaz fájlmódosításokat."
+ },
"fileStatus": {
"modified": "Módosítva",
"renamed": "Átnevezve",
@@ -659,7 +710,7 @@
"emptyLine": "(üres)"
},
"linkPasteClipboardEmpty": "A vágólap üres.",
- "linkPasteNotAPullRequest": "Ez nem egy GitHub-módosítási kérelem hivatkozása.",
+ "linkPasteNotAPullRequest": "Ez nem egy PR vagy merge request hivatkozása",
"announce": {
"commentPosted": "Hozzászólás közzétéve",
"reviewSubmitted": "Kódellenőrzés elküldve",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Ez a hozzászólás nem küldhető el. Lehet, hogy a kijelölt sor megváltozott, vagy a PR frissült.",
"reviewNotSubmitted": "Ez a kódellenőrzés a jelenlegi formájában nem küldhető el. Lehet, hogy a PR megváltozott, vagy a saját módosítási kérelmedet próbálod ellenőrizni, ami nem engedélyezett.",
+ "reviewNotSubmittedTerm": "Ez a kódellenőrzés a jelenlegi formájában nem küldhető el. Lehet, hogy a {{term}} megváltozott, vagy nem ellenőrizheted a saját {{term}}.",
"couldNotPostComment": "Nem sikerült közzétenni a hozzászólást.",
"couldNotSubmitReview": "Nem sikerült elküldeni a kódellenőrzést. Ellenőrizd az internetkapcsolatot, és próbáld újra."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Nem sikerült válaszolni.",
"couldNotCompleteAction": "Nem sikerült végrehajtani ezt a műveletet.",
"mergeResultDefaultError": "A GitHub nem fejezte be az összevonást.",
+ "mergeResultNotCompleted": "A {{term}} nem lett összevonva. Ellenőrizd az állapotát, és próbáld újra.",
"ambiguous": "Nem sikerült megerősíteni a művelet eredményét. Újrapróbálkozás előtt ellenőrizd a PR-t.",
"persistenceFailed": "Nem sikerült rögzíteni ezt a műveletet. Próbáld újra később.",
"forbidden": "Nincs jogosultságod ehhez a művelethez."
@@ -1988,11 +2041,31 @@
"retryConnection": "Csatlakozás újrapróbálása"
},
"newSession": {
+ "recentlyUsed": "Legutóbb használt",
+ "couldNotLoadGithubRepositories": "Nem sikerült betölteni a GitHub-tárolókat.",
+ "couldNotLoadGitlabRepositories": "Nem sikerült betölteni a GitLab-tárolókat.",
+ "couldNotLoadBitbucketRepositories": "Nem sikerült betölteni a Bitbucket-tárolókat.",
"connectGithubDescription": "Kapcsold össze a GitHub-fiókodat a böngészőben, majd térj vissza ide, és válassz egy tárolót.",
+ "connectGitlabDescription": "Kapcsold össze a GitLab-fiókodat a böngészőben, majd térj vissza ide, és válassz egy tárolót.",
+ "connectBitbucketDescription": "Kapcsold össze a Bitbucket-fiókodat a böngészőben, majd térj vissza ide, és válassz egy tárolót.",
"openGithub": "GitHub megnyitása",
+ "openGitlab": "GitLab megnyitása",
+ "openBitbucket": "Bitbucket megnyitása",
"refreshRepositories": "Tárolók frissítése",
"githubConnected": "GitHub csatlakoztatva",
+ "gitlabConnected": "GitLab csatlakoztatva",
"noRepositoriesVisible": "Egyetlen tároló sem látható. Ellenőrizd, hogy a Kilo GitHub-alkalmazás hozzáfér-e a tárolókhoz, majd frissítsd a listát.",
+ "noRepositoriesVisibleGitlab": "Egyetlen tároló sem látható. Ellenőrizd a GitLab-tárolókhoz való hozzáférést, majd frissítsd a listát.",
+ "noRepositoriesVisibleBitbucket": "Egyetlen tároló sem látható. Ellenőrizd a Bitbucket-tárolókhoz való hozzáférést, majd frissítsd a listát.",
+ "bitbucketOrganizationsOnly": "A Bitbucket csak szervezetek számára érhető el.",
+ "branchPickerTitle": "Ág kiválasztása",
+ "branchDefault": "Alapértelmezett",
+ "branchAccessibility": "Ág: {{label}}",
+ "branchLoading": "Ágak betöltése",
+ "branchLoadError": "Nem sikerült betölteni az ágakat",
+ "branchUnavailable": "Ehhez a tárolóhoz nem érhetők el ágak. Ellenőrizd a jogosultságodat a szolgáltatónál, majd válassz másik tárolót.",
+ "branchEmpty": "Nincs elérhető ág",
+ "branchPlaceholder": "Válassz ágat",
"runOnWithTarget": "Futtatás helye: {{target}}",
"environment": "Környezet",
"couldNotLoadEnvironment": "Nem sikerült betölteni a környezetedet.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Nem sikerült frissíteni a tárolókat. Próbáld újra.",
"discardDraftTitle": "Piszkozat elvetése?",
"discardDraftMessage": "Az utasításod elvész.",
+ "discardWithUploadsMessage": "Az utasításod és az elküldött üzenetekhez nem csatolt feltöltések törlődnek.",
"discardFailed": "Nem sikerült elvetni a piszkozatot. Próbáld újra.",
"remoteHint": "A helyi kilo folyamat vezérléséhez futtasd a `kilo remote` parancsot a számítógépeden, vagy a `/remote` parancsot egy futó CLI-munkamenetben.",
- "connectBitbucketDescription": "Kapcsold össze a Bitbucket-fiókodat a böngészőben, majd térj vissza ide, és válassz egy tárolót.",
- "connectGitlabDescription": "Kapcsold össze a GitLab-fiókodat a böngészőben, majd térj vissza ide, és válassz egy tárolót.",
- "couldNotLoadBitbucketRepositories": "Nem sikerült betölteni a Bitbucket-tárolókat.",
- "couldNotLoadGithubRepositories": "Nem sikerült betölteni a GitHub-tárolókat.",
- "couldNotLoadGitlabRepositories": "Nem sikerült betölteni a GitLab-tárolókat.",
- "gitlabConnected": "GitLab csatlakoztatva",
- "noRepositoriesVisibleBitbucket": "Egyetlen tároló sem látható. Ellenőrizd a Bitbucket-tárolókhoz való hozzáférést, majd frissítsd a listát.",
- "noRepositoriesVisibleGitlab": "Egyetlen tároló sem látható. Ellenőrizd a GitLab-tárolókhoz való hozzáférést, majd frissítsd a listát.",
- "openBitbucket": "Bitbucket megnyitása",
- "openGitlab": "GitLab megnyitása",
- "recentlyUsed": "Legutóbb használt",
"continueFrom": "Ezt a munkamenetet folytatod: {{title}}.",
"importingSession": "Munkamenet importálása…",
"cliCannotContinue": "Ez a CLI nem támogatja a munkamenetek folytatását. Válaszd a Cloud Agentet vagy egy másik CLI-t.",
- "importFailed": "Nem sikerült importálni ezt a munkamenetet.",
- "discardWithUploadsMessage": "Az utasításod és az elküldött üzenetekhez nem csatolt feltöltések törlődnek."
+ "importFailed": "Nem sikerült importálni ezt a munkamenetet."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} fájl frissült.",
diff --git a/apps/mobile/src/i18n/locales/hy.json b/apps/mobile/src/i18n/locales/hy.json
index 6eb8dc289b..e1ed43a866 100644
--- a/apps/mobile/src/i18n/locales/hy.json
+++ b/apps/mobile/src/i18n/locales/hy.json
@@ -36,6 +36,7 @@
"cost": "Արժեք",
"discard": "Հրաժարվել",
"findings": "Հայտնաբերված խնդիրներ",
+ "mergeRequest": "միաձուլման հարցում",
"notConnected": "Միացված չէ",
"notifications": "Ծանուցումներ",
"pullRequest": "միավորման հարցում",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Փոփոխությունների դատարկ տող"
},
"connectionExpired": "GitHub-ի հետ կապի ժամկետը լրացել է։",
+ "capabilities": {
+ "banner": {
+ "title": "Հասանելի չէ այս մատակարարի մոտ",
+ "accessibility": "Հասանելի չէ այս մատակարարի մոտ՝ {{reason}}"
+ }
+ },
"merge": {
"merge": "Միավորում",
"mergeNow": "Միավորել հիմա",
"mergePullRequest": "Միավորման հարցման միավորում",
+ "mergeTermTitle": "Միավորել {{term}}-ը",
"enableAutoMerge": "Միացնել ավտոմատ միավորումը",
"disableAutoMerge": "Անջատել ավտոմատ միավորումը",
"autoMergeOn": "Ավտոմատ միավորումը միացված է",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Ջնջել ճյուղը միավորումից հետո",
"noEnabledMethods": "Այս պահոցում միավորման ոչ մի մեթոդ միացված չէ։ Խնդրիր պահոցի ադմինիստրատորին միացնել սովորական միավորումը, կոմիտների համախմբումը կամ վերաբազավորումը։",
"confirmTitle": "Միավորե՞լ միավորման հարցումը",
+ "confirmTitleTerm": "Միավորե՞լ {{term}}ը",
"confirmMessage": "Քո փոփոխությունները կմիավորվեն բազային ճյուղին։",
"enableAutoMergeConfirmTitle": "Միացնե՞լ ավտոմատ միավորումը",
"enableAutoMergeConfirmMessage": "GitHub-ն ավտոմատ կմիավորի այս միավորման հարցումը, երբ բոլոր պարտադիր ստուգումները հաջողությամբ ավարտվեն։",
+ "enableAutoMergeConfirmMessageTerm": "{{term}}-ը կմիավորվի ավտոմատ, երբ դրա կոնվեյերը հաջողությամբ ավարտվի։",
+ "enableAutoMergeDescriptionTerm": "GitLab-ը ավտոմատ կմիավորի այս {{term}}-ը, երբ դրա կոնվեյերը հաջողությամբ ավարտվի։",
"forbidden": "Այս միավորման հարցումը միավորելու թույլտվություն չունես։",
"cannotMerge": "Այս միավորման հարցումը հնարավոր չէ միավորել ներկայիս տեսքով։",
"couldNotMerge": "Չհաջողվեց միավորել միավորման հարցումը։",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Արդեն միավորված է",
- "closed": "Այս միավորման հարցումը փակ է"
+ "closed": "Այս միավորման հարցումը փակ է",
+ "closedMergeRequest": "Այս միաձուլման հարցումը փակ է"
},
"partialSuccessBanner": {
"body": "Չհաջողվեց ջնջել ճյուղը՝ {{reason}}։",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Այս միավորման հարցումը դեռ հնարավոր չէ միավորել",
"notMergeableDetail": "GitHub-ը հայտնել է միավորման հետևյալ կարգավիճակը՝ {{state}}։"
},
+ "restrictions": {
+ "title": "Միավորման սահմանափակումներ",
+ "approvalsRequired_one": "Պահանջվում է {{displayCount}} հավանություն",
+ "approvalsRequired_other": "Պահանջվում է {{displayCount}} հավանություն",
+ "pipelineMustSucceed": "Միավորելուց առաջ կոնվեյերը պետք է հաջողությամբ ավարտվի։"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Կոնվեյերը ձախողվում է վերջին կոմիտում։",
+ "pendingPipeline": "Կոնվեյերը դեռ աշխատում է վերջին կոմիտում։",
+ "permission": "Այս {{term}}ը միավորելու թույլտվություն չունես։",
+ "draft": "Միավորելուց առաջ նշիր {{term}}ը որպես վերանայման պատրաստ։"
+ },
"methodLabels": {
"merge": "Ստեղծել միավորման կոմիտ",
"squash": "Համախմբել և միավորել",
@@ -448,6 +472,7 @@
"acceptTerms": "Ընդունել",
"replyBadRequest": "Այս պատասխանը հնարավոր չէ հրապարակել։ Հնարավոր է՝ քննարկման շղթան փոխվել է։",
"replyForbidden": "Այս միավորման հարցմանը պատասխանելու թույլտվություն չունես։",
+ "replyForbiddenTerm": "Այս {{term}}-ին պատասխանելու թույլտվություն չունես։",
"moderation": {
"reportContent": {
"terminal": "Այս մեկնաբանությունից հնարավոր չէ բողոքել։",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Վերանայել միավորման հարցումը",
"headLine": "{{counts}} · վերջին կոմիտ՝ {{sha}}",
"entry": {
- "eyebrow": "Բացիր միավորման հարցումը URL-ով։",
- "pastePrLink": "Տեղադրել PR-ի հղումը",
- "noRecentPrs": "Վերջերս բացված PR-եր չկան",
- "noRecentPrsDescription": "Վերևում տեղադրիր PR-ի հղումը՝ վերանայում սկսելու համար։ Հաջորդ անգամ այն կհայտնվի այստեղ։",
+ "eyebrow": "Բացեք միավորման կամ միաձուլման հարցում URL-ով",
+ "pastePrLink": "Տեղադրեք միավորման կամ միաձուլման հարցման հղում",
+ "noRecentPrs": "Վերջերս վերանայումներ չկան",
+ "noRecentPrsDescription": "Վերանայում սկսելու համար վերևում տեղադրեք հղում — հաջորդ անգամ այն կհայտնվի այստեղ։",
"couldNotLoad": "Չհաջողվեց բեռնել։",
"removeFromRecentsTitle": "Հեռացնե՞լ վերջերս բացվածների ցանկից",
- "removeFromRecentsMessage": "Այս միավորման հարցումը կհեռացվի վերջերս բացվածների քո ցանկից։",
+ "removeFromRecentsMessage": "Այս վերանայումը կհեռացվի Ձեր վերջերսի ցանկից։",
"removeRecentAccessibility": "Հեռացնել {{repo}}-ն վերջերս բացվածների ցանկից",
- "urlAccessibility": "GitHub-ի միավորման հարցման URL",
- "clearLink": "Մաքրել միավորման հարցման հղումը",
- "pasteLink": "Տեղադրել միավորման հարցման հղումը",
+ "urlAccessibility": "Մուտքագրեք միավորման կամ միաձուլման հարցման URL",
+ "urlPlaceholder": "Միավորման կամ միաձուլման հարցման URL",
+ "openAccessibility": "Բացել միավորման կամ միաձուլման հարցումը",
+ "clearLink": "Մաքրել հղումը",
+ "pasteLink": "Տեղադրեք միավորման կամ միաձուլման հարցման հղում",
"open": "Բաց"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Չհաջողվեց ստուգել GitHub-ի հետ կապը։",
"checkFailedMessage": "Մուտքի կարգավիճակը հասանելի կլինի բեռնումն ավարտվելուց հետո։",
+ "checkFailedTitleGitLab": "Չհաջողվեց ստուգել GitLab-ի հետ կապը։",
+ "checkFailedTitleBitbucket": "Չհաջողվեց ստուգել Bitbucket-ի հետ կապը։",
+ "providerCheckFailedMessage": "Միացման կարգավիճակը հասանելի չէ մինչև բեռնվելը։",
"reconnectTitle": "Կրկին միացում GitHub-ին",
"reconnectDescription": "GitHub-ի հետ կապիդ թույլտվությունը չեղարկվել է։ Կրկին միացիր՝ հեռախոսով միավորման հարցումների վերանայումը շարունակելու համար։",
- "description": "Միացրու GitHub-ի քո հաշիվը՝ հեռախոսով միավորման հարցումներ վերանայելու համար։"
+ "description": "Միացրու GitHub-ի քո հաշիվը՝ հեռախոսով միավորման հարցումներ վերանայելու համար։",
+ "gitlabDescription": "Միացրեք Ձեր GitLab հաշիվը՝ միաձուլման հարցումները բջջայինում վերանայելու համար։",
+ "bitbucketDescription": "Միացրեք Bitbucket-ը այս կազմակերպությանը՝ միավորման հարցումները բջջայինում վերանայելու համար։",
+ "bitbucketOrgOnlyDescription": "Ընտրեք կազմակերպություն Ձեր պրոֆիլում՝ դրա Bitbucket միավորման հարցումները վերանայելու համար։"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub-ի հետ կապի ժամկետը լրացել է։",
- "message": "GitHub-ի հետ կապդ այլևս վավեր չէ։ Կրկին ստուգիր կապը։ Անհրաժեշտության դեպքում քեզ կառաջարկվի նորից միանալ։"
+ "message": "GitHub-ի հետ կապդ այլևս վավեր չէ։ Կրկին ստուգիր կապը։ Անհրաժեշտության դեպքում քեզ կառաջարկվի նորից միանալ։",
+ "gitlabTitle": "GitLab-ի հետ կապի ժամկետը լրացել է։",
+ "bitbucketTitle": "Bitbucket-ի հետ կապի ժամկետը լրացել է։",
+ "providerMessage": "{{provider}}-ի հետ կապդ այլևս վավեր չէ։ Կրկին ստուգիր կապը։ Անհրաժեշտության դեպքում քեզ կառաջարկվի նորից միանալ։"
},
"eventChips": {
"comment": "Մեկնաբանություն",
@@ -643,6 +679,21 @@
"files": "Ֆայլեր",
"discussion": "Քննարկում"
},
+ "terms": {
+ "pullRequest": "Միավորման հարցում",
+ "mergeRequest": "Միաձուլման հարցում",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Կիսվել միաձուլման հարցմամբ",
+ "viewOnProvider": "Դիտել {{provider}}-ում",
+ "mergeRequestUnavailable": "Միաձուլման հարցումը հասանելի չէ",
+ "unavailableDescription": "Հնարավոր է՝ այն ջնջվել է, կամ դուք հասանելիություն չունեք դրան։",
+ "accessDeniedMergeRequest": "Այս միաձուլման հարցումը դիտելու թույլտվություն չունես։",
+ "couldNotLoadMergeRequest": "Չհաջողվեց բեռնել միաձուլման հարցումը։",
+ "discussionAccessDenied": "Այս միաձուլման հարցման քննարկումը դիտելու թույլտվություն չունես։",
+ "discussionUnavailableMessage": "Հնարավոր է՝ այս միաձուլման հարցումը հեռացվել է։",
+ "noDiscussionDescription": "Այս միաձուլման հարցման մեջ դեռ չկան վերանայման քննարկումներ կամ ընդհանուր մեկնաբանություններ։",
+ "noFilesChangedDescription": "Այս միաձուլման հարցման մեջ ֆայլերի փոփոխություններ չկան։"
+ },
"fileStatus": {
"modified": "Փոփոխված",
"renamed": "Վերանվանված",
@@ -659,7 +710,7 @@
"emptyLine": "(դատարկ)"
},
"linkPasteClipboardEmpty": "Սեղմատախտակը դատարկ է։",
- "linkPasteNotAPullRequest": "Սա GitHub-ի միավորման հարցման հղում չէ։",
+ "linkPasteNotAPullRequest": "Սա միավորման կամ միաձուլման հարցման հղում չէ",
"announce": {
"commentPosted": "Մեկնաբանությունը հրապարակվել է",
"reviewSubmitted": "Վերանայումն ուղարկվել է",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Այս մեկնաբանությունը հնարավոր չէ հրապարակել։ Հնարավոր է՝ ընտրված տողը փոխվել է, կամ PR-ը թարմացվել է։",
"reviewNotSubmitted": "Այս վերանայումը հնարավոր չէ ուղարկել ներկայիս տեսքով։ Հնարավոր է՝ PR-ը փոխվել է, կամ փորձում ես վերանայել սեփական միավորման հարցումդ։",
+ "reviewNotSubmittedTerm": "Այս վերանայումը հնարավոր չէ ուղարկել ինչպես կա։ Հնարավոր է՝ {{term}}-ը փոխվել է, կամ դուք չեք կարող վերանայել Ձեր սեփական {{term}}-ը։",
"couldNotPostComment": "Չհաջողվեց հրապարակել մեկնաբանությունը։",
"couldNotSubmitReview": "Չհաջողվեց ուղարկել վերանայումը։ Ստուգիր կապդ և կրկին փորձիր։"
},
@@ -675,6 +727,7 @@
"couldNotReply": "Չհաջողվեց պատասխանել։",
"couldNotCompleteAction": "Չհաջողվեց կատարել այս գործողությունը։",
"mergeResultDefaultError": "GitHub-ը չավարտեց միավորումը։",
+ "mergeResultNotCompleted": "{{term}}-ը չմիավորվեց։ Ստուգեք դրա վիճակը և փորձեք կրկին։",
"ambiguous": "Չհաջողվեց հաստատել արդյունքը։ Կրկին փորձելուց առաջ ստուգիր PR-ը։",
"persistenceFailed": "Չհաջողվեց գրանցել այս գործողությունը։ Կրկին փորձիր ավելի ուշ։",
"forbidden": "Այս գործողությունն արգելված է։"
@@ -1988,11 +2041,31 @@
"retryConnection": "Կրկին փորձել միանալ"
},
"newSession": {
+ "recentlyUsed": "Վերջերս օգտագործված",
+ "couldNotLoadGithubRepositories": "Չհաջողվեց բեռնել GitHub-ի պահոցները։",
+ "couldNotLoadGitlabRepositories": "Չհաջողվեց բեռնել GitLab-ի պահոցները։",
+ "couldNotLoadBitbucketRepositories": "Չհաջողվեց բեռնել Bitbucket-ի պահոցները։",
"connectGithubDescription": "Միացրեք GitHub-ը ձեր զննարկչում, ապա վերադարձեք այստեղ՝ պահոց ընտրելու համար։",
+ "connectGitlabDescription": "Միացրեք GitLab-ը ձեր զննարկչում, ապա վերադարձեք այստեղ՝ պահոց ընտրելու համար։",
+ "connectBitbucketDescription": "Միացրեք Bitbucket-ը ձեր զննարկչում, ապա վերադարձեք այստեղ՝ պահոց ընտրելու համար։",
"openGithub": "Բացել GitHub-ը",
+ "openGitlab": "Բացել GitLab-ը",
+ "openBitbucket": "Բացել Bitbucket-ը",
"refreshRepositories": "Թարմացնել պահոցները",
"githubConnected": "GitHub-ը միացված է",
+ "gitlabConnected": "GitLab-ը միացված է",
"noRepositoriesVisible": "Պահոցներ չեն երևում։ Ստուգեք Kilo-ի GitHub հավելվածի՝ պահոցների մուտքի թույլտվությունները, ապա թարմացրեք ցանկը։",
+ "noRepositoriesVisibleGitlab": "Պահոցներ չեն երևում։ Ստուգեք GitLab-ի պահոցների մուտքի թույլտվությունները, ապա թարմացրեք ցանկը։",
+ "noRepositoriesVisibleBitbucket": "Պահոցներ չեն երևում։ Ստուգեք Bitbucket-ի պահոցների մուտքի թույլտվությունները, ապա թարմացրեք ցանկը։",
+ "bitbucketOrganizationsOnly": "Bitbucket-ը հասանելի է միայն կազմակերպությունների համար։",
+ "branchPickerTitle": "Ընտրել ճյուղը",
+ "branchDefault": "Կանխադրված",
+ "branchAccessibility": "Ճյուղ՝ {{label}}",
+ "branchLoading": "Բեռնվում են ճյուղերը",
+ "branchLoadError": "Չհաջողվեց բեռնել ճյուղերը",
+ "branchUnavailable": "Այս պահոցի համար ճյուղեր հասանելի չեն։ Ստուգեք Ձեր հասանելիությունը մատակարարի մոտ, ապա ընտրեք այլ պահոց։",
+ "branchEmpty": "Ճյուղեր հասանելի չեն",
+ "branchPlaceholder": "Ընտրեք ճյուղ",
"runOnWithTarget": "Գործարկման միջավայր՝ {{target}}",
"environment": "Միջավայր",
"couldNotLoadEnvironment": "Չհաջողվեց բեռնել ձեր միջավայրը։",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Չհաջողվեց թարմացնել պահոցները։ Կրկին փորձեք։",
"discardDraftTitle": "Ջնջե՞լ սևագիրը",
"discardDraftMessage": "Ձեր հուշումը կկորչի։",
+ "discardWithUploadsMessage": "Ձեր հուշումը և ուղարկված հաղորդագրություններին չկցված վերբեռնված բոլոր ֆայլերը կջնջվեն։",
"discardFailed": "Չհաջողվեց ջնջել սևագիրը։ Կրկին փորձեք։",
"remoteHint": "Տեղական kilo գործընթացը կառավարելու համար ձեր համակարգչում գործարկեք `kilo remote` կամ գործող CLI նիստում՝ `/remote`։",
- "connectBitbucketDescription": "Միացրեք Bitbucket-ը ձեր զննարկչում, ապա վերադարձեք այստեղ՝ պահոց ընտրելու համար։",
- "connectGitlabDescription": "Միացրեք GitLab-ը ձեր զննարկչում, ապա վերադարձեք այստեղ՝ պահոց ընտրելու համար։",
- "couldNotLoadBitbucketRepositories": "Չհաջողվեց բեռնել Bitbucket-ի պահոցները։",
- "couldNotLoadGithubRepositories": "Չհաջողվեց բեռնել GitHub-ի պահոցները։",
- "couldNotLoadGitlabRepositories": "Չհաջողվեց բեռնել GitLab-ի պահոցները։",
- "gitlabConnected": "GitLab-ը միացված է",
- "noRepositoriesVisibleBitbucket": "Պահոցներ չեն երևում։ Ստուգեք Bitbucket-ի պահոցների մուտքի թույլտվությունները, ապա թարմացրեք ցանկը։",
- "noRepositoriesVisibleGitlab": "Պահոցներ չեն երևում։ Ստուգեք GitLab-ի պահոցների մուտքի թույլտվությունները, ապա թարմացրեք ցանկը։",
- "openBitbucket": "Բացել Bitbucket-ը",
- "openGitlab": "Բացել GitLab-ը",
- "recentlyUsed": "Վերջերս օգտագործված",
"continueFrom": "Շարունակվում է «{{title}}» նիստը։",
"importingSession": "Նիստը ներմուծվում է",
"cliCannotContinue": "Այս CLI-ն չի կարող շարունակել նիստը։ Ընտրեք Cloud Agent-ը կամ մեկ այլ CLI։",
- "importFailed": "Չհաջողվեց ներմուծել այս նիստը։",
- "discardWithUploadsMessage": "Ձեր հուշումը և ուղարկված հաղորդագրություններին չկցված վերբեռնված բոլոր ֆայլերը կջնջվեն։"
+ "importFailed": "Չհաջողվեց ներմուծել այս նիստը։"
},
"partRenderer": {
"updatedFileCount_one": "Թարմացվել է {{displayCount}} ֆայլ։",
diff --git a/apps/mobile/src/i18n/locales/id.json b/apps/mobile/src/i18n/locales/id.json
index 0de111f4b5..ec787e7e8a 100644
--- a/apps/mobile/src/i18n/locales/id.json
+++ b/apps/mobile/src/i18n/locales/id.json
@@ -4,6 +4,8 @@
"done": "Selesai",
"retry": "Coba lagi",
"tryAgain": "Coba lagi",
+ "continue": "Lanjutkan",
+ "notNow": "Nanti saja",
"language": "Bahasa",
"device": "Perangkat",
"share": "Bagikan {{title}}",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "Tidak dapat menyalin ke papan klip.",
"required": "wajib diisi",
"error": "kesalahan: {{error}}",
- "notNow": "Nanti saja",
- "continue": "Lanjutkan",
"back": "Kembali",
"somethingWentWrong": "Terjadi kesalahan.",
"couldNotOpen": "Tidak dapat membuka {{label}}.",
@@ -36,6 +36,7 @@
"cost": "Biaya",
"discard": "Buang",
"findings": "Temuan",
+ "mergeRequest": "merge request",
"notConnected": "Tidak terhubung",
"notifications": "Notifikasi",
"pullRequest": "pR",
@@ -1557,11 +1558,31 @@
"retryConnection": "Coba sambungkan kembali"
},
"newSession": {
+ "recentlyUsed": "Terakhir digunakan",
+ "couldNotLoadGithubRepositories": "Tidak dapat memuat repositori GitHub.",
+ "couldNotLoadGitlabRepositories": "Tidak dapat memuat repositori GitLab.",
+ "couldNotLoadBitbucketRepositories": "Tidak dapat memuat repositori Bitbucket.",
"connectGithubDescription": "Hubungkan GitHub melalui peramban, lalu kembali ke sini untuk memilih repositori.",
+ "connectGitlabDescription": "Hubungkan GitLab melalui peramban, lalu kembali ke sini untuk memilih repositori.",
+ "connectBitbucketDescription": "Hubungkan Bitbucket melalui peramban, lalu kembali ke sini untuk memilih repositori.",
"openGithub": "Buka GitHub",
+ "openGitlab": "Buka GitLab",
+ "openBitbucket": "Buka Bitbucket",
"refreshRepositories": "Muat ulang repositori",
"githubConnected": "GitHub terhubung",
+ "gitlabConnected": "GitLab terhubung",
"noRepositoriesVisible": "Tidak ada repositori yang ditampilkan. Periksa akses repositori untuk aplikasi Kilo di GitHub, lalu muat ulang.",
+ "noRepositoriesVisibleGitlab": "Tidak ada repositori yang ditampilkan. Periksa akses repositori untuk GitLab, lalu muat ulang.",
+ "noRepositoriesVisibleBitbucket": "Tidak ada repositori yang ditampilkan. Periksa akses repositori untuk Bitbucket, lalu muat ulang.",
+ "bitbucketOrganizationsOnly": "Bitbucket hanya tersedia untuk organisasi.",
+ "branchPickerTitle": "Pilih cabang",
+ "branchDefault": "Bawaan",
+ "branchAccessibility": "Cabang: {{label}}",
+ "branchLoading": "Memuat cabang",
+ "branchLoadError": "Tidak dapat memuat cabang",
+ "branchUnavailable": "Cabang tidak tersedia untuk repositori ini. Periksa aksesmu ke penyedia, lalu pilih repositori lain.",
+ "branchEmpty": "Tidak ada cabang yang tersedia",
+ "branchPlaceholder": "Pilih cabang",
"runOnWithTarget": "Jalankan di: {{target}}",
"environment": "Lingkungan",
"couldNotLoadEnvironment": "Tidak dapat memuat lingkunganmu.",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "Tidak dapat membaca sesi yang menunggu diproses. Coba lagi.",
"failedToCreate": "Gagal membuat sesi.",
"couldNotRefreshRepositories": "Tidak dapat memuat ulang repositori. Coba lagi.",
- "discardDraftMessage": "Instruksimu akan hilang.",
"discardDraftTitle": "Buang draf?",
+ "discardDraftMessage": "Instruksimu akan hilang.",
+ "discardWithUploadsMessage": "Instruksimu dan unggahan yang belum dilampirkan ke pesan terkirim akan dihapus.",
"discardFailed": "Tidak dapat membuang draf. Coba lagi.",
"remoteHint": "Jalankan `kilo remote` di komputermu, atau `/remote` dalam sesi CLI yang sedang berjalan, untuk mengendalikan proses kilo lokal.",
- "connectBitbucketDescription": "Hubungkan Bitbucket melalui peramban, lalu kembali ke sini untuk memilih repositori.",
- "connectGitlabDescription": "Hubungkan GitLab melalui peramban, lalu kembali ke sini untuk memilih repositori.",
- "couldNotLoadBitbucketRepositories": "Tidak dapat memuat repositori Bitbucket.",
- "couldNotLoadGithubRepositories": "Tidak dapat memuat repositori GitHub.",
- "couldNotLoadGitlabRepositories": "Tidak dapat memuat repositori GitLab.",
- "gitlabConnected": "GitLab terhubung",
- "noRepositoriesVisibleBitbucket": "Tidak ada repositori yang ditampilkan. Periksa akses repositori untuk Bitbucket, lalu muat ulang.",
- "noRepositoriesVisibleGitlab": "Tidak ada repositori yang ditampilkan. Periksa akses repositori untuk GitLab, lalu muat ulang.",
- "openBitbucket": "Buka Bitbucket",
- "openGitlab": "Buka GitLab",
- "recentlyUsed": "Terakhir digunakan",
"continueFrom": "Melanjutkan sesi {{title}}.",
"importingSession": "Mengimpor sesi",
"cliCannotContinue": "CLI ini tidak dapat melanjutkan sesi. Pilih Cloud Agent atau CLI lain.",
- "importFailed": "Tidak dapat mengimpor sesi ini.",
- "discardWithUploadsMessage": "Instruksimu dan unggahan yang belum dilampirkan ke pesan terkirim akan dihapus."
+ "importFailed": "Tidak dapat mengimpor sesi ini."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} berkas telah diperbarui.",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "Izinkan pelacakan sumber pemasangan?"
},
"prReview": {
+ "pullRequestUnavailable": "PR tidak tersedia",
+ "pullRequestUnavailableDescription": "PR ini tidak dapat dibuka. PR ini mungkin sudah dihapus, repositorinya bersifat privat, atau aplikasi Kilo untuk GitHub belum dipasang di repositori tersebut.",
"accessDeniedDescription": "Kamu tidak memiliki izin untuk melihat PR ini.",
- "checkConnection": "Periksa koneksi",
- "checks": {
- "checksCount": "{{displayCount}} pemeriksaan",
- "couldNotLoad": "Tidak dapat memuat pemeriksaan.",
- "failed": "{{displayCount}} gagal",
- "noAccess": "Kamu tidak memiliki akses ke pemeriksaan repositori ini.",
- "noChecksReported": "Belum ada hasil pemeriksaan",
- "notAvailable": "Pemeriksaan belum tersedia. Commit terkini mungkin belum diproses, atau aplikasi Kilo untuk GitHub belum dipasang di repositori sumber.",
- "openDetails": "Buka detail {{name}}",
- "passed": "{{displayCount}} lulus",
- "pending": "{{displayCount}} menunggu",
- "retryChecks": "Coba pemeriksaan lagi",
- "skipped": "{{displayCount}} dilewati",
- "title": "Pemeriksaan",
- "viewOnGitHub": "Lihat PR di GitHub",
- "checkDetails": "detail pemeriksaan"
- },
- "composer": {
- "addTitle": "Tambah komentar",
- "addToReview": "Tambahkan ke tinjauan",
- "comment": "Komentar",
- "commentBody": "Isi komentar",
- "commentBodyPlaceholder": "Komentar…",
- "commentNow": "Kirim komentar sekarang",
- "discardMessage": "Drafmu akan hilang.",
- "discardTitle": "Buang komentar?",
- "editTitle": "Ubah komentar",
- "insertSuggestion": "Sisipkan saran",
- "insertSuggestionA11y": "Sisipkan saran kode",
- "loadFailedTitle": "Tidak dapat memuat editor komentar.",
- "ok": "OK",
- "unavailableMessage": "Komentar dalam antrean ini sudah dihapus atau dikirim.",
- "unavailableTitle": "Komentar tidak tersedia",
- "bodyEmpty": "Isi komentar tidak boleh kosong.",
- "suggestionsOnlyAddedLines": "Saran hanya berlaku pada baris yang ditambahkan.",
- "tapDiffLineToSuggest": "Ketuk baris perbedaan kode untuk mengaktifkan saran."
- },
- "connect": {
- "checkFailedMessage": "Status masuk belum tersedia sampai data ini selesai dimuat.",
- "checkFailedTitle": "Tidak dapat memeriksa koneksi GitHub.",
- "description": "Hubungkan akun GitHub kamu untuk meninjau PR di ponsel.",
- "reconnectDescription": "Akses ke akun GitHub kamu telah dicabut. Hubungkan ulang untuk terus meninjau PR di ponsel.",
- "reconnectTitle": "Hubungkan ulang GitHub"
- },
- "connectionExpired": "Koneksi GitHub kedaluwarsa.",
- "couldNotLoadPullRequest": "Tidak dapat memuat PR.",
- "couldNotOpenGitHubAppSettings": "Tidak dapat membuka pengaturan aplikasi GitHub.",
- "description": "Deskripsi",
- "discussion": {
- "acceptTerms": "Setuju",
- "accessDeniedMessage": "Kamu tidak memiliki izin untuk melihat diskusi PR ini.",
- "addReaction": "Tambah reaksi",
- "block": "Blokir",
- "blockedUser": "{{login}} diblokir",
- "collapseThread": "Ciutkan utas",
- "commentActions": "Tindakan pada komentar",
- "comment": "{{displayCount}} komentar",
- "comment_other": "{{displayCount}} komentar",
- "couldNotLoad": "Tidak dapat memuat diskusi.",
- "couldNotLoadMore": "Tidak dapat memuat komentar lainnya.",
- "loadMoreComments": "Muat komentar lainnya",
- "loading": "Memuat diskusi",
- "moderation": {
- "block": {
- "retryable": "Tidak dapat memblokir pengguna ini. Periksa koneksimu dan coba lagi.",
- "terminal": "Pengguna ini tidak dapat diblokir."
- },
- "mute": {
- "retryable": "Tidak dapat membisukan pengguna ini. Periksa koneksimu dan coba lagi.",
- "terminal": "Pengguna ini tidak dapat dibisukan."
- },
- "reportContent": {
- "retryable": "Tidak dapat melaporkan komentar ini. Periksa koneksimu dan coba lagi.",
- "terminal": "Komentar ini tidak dapat dilaporkan."
- },
- "reportUser": {
- "retryable": "Tidak dapat melaporkan pengguna ini. Periksa koneksimu dan coba lagi.",
- "terminal": "Pengguna ini tidak dapat dilaporkan."
- }
- },
- "moreLinesAbove": "… {{displayCount}} baris lagi di atas",
- "mute": "Bisukan",
- "mutedUser": "{{login}} dibisukan",
- "noDiscussion": "Belum ada diskusi",
- "noDiscussionDescription": "Belum ada utas tinjauan atau komentar diskusi pada PR ini.",
- "comment_one": "1 komentar",
- "outdated": "Usang",
- "quotedDiffSnippet": "Cuplikan perbedaan kode yang dikutip",
- "reactionPill": "reaksi {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "reaksi",
- "reaction_other": "reaksi",
- "reaction_one": "reaksi",
- "replyBadRequest": "Balasan ini tidak dapat dikirim. Utasnya mungkin sudah berubah.",
- "replyBody": "Isi balasan",
- "replyForbidden": "Kamu tidak memiliki izin untuk membalas PR ini.",
- "replyPlaceholder": "Balasan…",
- "reportContent": "Laporkan konten",
- "reportUser": "Laporkan pengguna",
- "resolveThread": "Selesaikan utas",
- "resolved": "Selesai",
- "retryLoadingMore": "Coba muat komentar lainnya lagi",
- "reviewFiles": "Tinjau file",
- "startedRelative": " · dimulai {{relative}}",
- "submitReply": "Kirim balasan",
- "termsAcceptRetry": "Tidak dapat menyimpan persetujuan atas ketentuan layanan. Periksa koneksimu dan coba lagi.",
- "termsCopy": "Kamu harus berusia minimal 13 tahun untuk mengirim komentar.",
- "termsTitle": "Ketentuan layanan",
- "threadAccessibilityLabel": "Utas diskusi {{anchorLabel}}",
- "unavailable": "Diskusi tidak tersedia.",
- "unavailableMessage": "PR ini mungkin sudah dihapus.",
- "unresolveThread": "Batalkan status selesai pada utas",
- "viewTerms": "Lihat ketentuan",
- "termsAcceptRequired": "Kamu harus menyetujui ketentuan layanan untuk mengirim komentar.",
- "termsCheckRetryCopy": "Tidak dapat memeriksa ketentuan layanan. Periksa koneksimu dan coba lagi.",
- "termsOutdatedCopy": "Ketentuan layanan telah berubah. Buka kembali layar ini untuk menyetujui versi terbaru.",
- "reactions": {
- "thumbsUp": "Jempol ke atas",
- "thumbsDown": "Jempol ke bawah",
- "laugh": "Tertawa",
- "hooray": "Hore",
- "confused": "Bingung",
- "heart": "Hati",
- "rocket": "Roket",
- "eyes": "Mata"
- },
- "anchor": {
- "fileCommentOnPath": "Komentar pada file {{path}}",
- "fileComment": "Komentar file",
- "outdatedOnPathLines": "Sudah tidak sesuai di {{path}} {{lines}}",
- "outdatedOnLines": "Sudah tidak sesuai di {{lines}}",
- "outdatedOnPath": "Sudah tidak sesuai di {{path}}"
- },
- "deletedUser": "pengguna yang dihapus"
- },
- "entry": {
- "clearLink": "Hapus tautan PR",
- "couldNotLoad": "Tidak dapat memuat data.",
- "eyebrow": "Buka PR melalui URL.",
- "noRecentPrs": "Belum ada riwayat PR",
- "noRecentPrsDescription": "Tempel tautan PR di atas untuk mulai meninjau. PR tersebut akan muncul di sini saat kamu kembali.",
- "open": "Buka",
- "pasteLink": "Tempel tautan PR",
- "pastePrLink": "Tempel tautan PR",
- "removeFromRecentsMessage": "PR ini akan dihapus dari riwayatmu.",
- "removeFromRecentsTitle": "Hapus dari riwayat?",
- "removeRecentAccessibility": "Hapus {{repo}} dari riwayat",
- "urlAccessibility": "URL PR GitHub"
- },
- "eventChips": {
- "comment": "Komentar",
- "label": "Jenis tinjauan",
- "requestChanges": "Minta perubahan"
- },
+ "noFilesChanged": "Tidak ada file yang diubah",
+ "noFilesChangedDescription": "Tidak ada perubahan file dalam PR ini.",
"fileList": {
"filesList": "Daftar file",
"filesViewed": "File · {{viewed}} dari {{total}} sudah dilihat",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "Komentari baris yang dipilih",
"finishReview": "Selesaikan tinjauan"
},
- "headLine": "{{counts}} · commit terkini {{sha}}",
"hunkRows": {
"contextUnavailable": "Konteks tidak tersedia pada referensi ini.",
"expandAll": "Tampilkan semua",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "Coba muat konteks lagi",
"retryLoadingNextPage": "Coba muat halaman berikutnya lagi"
},
- "inbox": {
- "couldNotLoad": "Tidak dapat memuat kotak masuk.",
- "loading": "Memuat kotak masuk",
- "noReviewRequests": "Tidak ada permintaan tinjauan",
- "noReviewRequestsDescription": "PR yang menunggu tinjauanmu muncul di sini. Kamu tetap dapat menempelkan tautan PR apa pun di atas.",
- "title": "Kotak masuk"
+ "sideBySide": {
+ "emptyDiffColumn": "kolom perbedaan kode kosong",
+ "emptyDiffRow": "Baris perbedaan kode kosong",
+ "newOnly": "Hanya versi baru: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ tidak ada baris baru di akhir file",
+ "oldNew": "Lama: {{old}} | Baru: {{new}}",
+ "oldOnly": "Hanya versi lama: {{text}}"
+ },
+ "connectionExpired": "Koneksi GitHub kedaluwarsa.",
+ "capabilities": {
+ "banner": {
+ "title": "Tidak tersedia di penyedia ini",
+ "accessibility": "Tidak tersedia di penyedia ini: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Pasang aplikasi Kilo untuk GitHub",
"merge": {
- "autoMergeDescription": "GitHub akan menggabungkan PR ini secara otomatis setelah semua pemeriksaan wajib lulus (metode: {{method}}).",
+ "merge": "Penggabungan",
+ "mergeNow": "Gabungkan sekarang",
+ "mergePullRequest": "Gabungkan PR",
+ "mergeTermTitle": "Gabungkan {{term}}",
+ "enableAutoMerge": "Aktifkan penggabungan otomatis",
+ "disableAutoMerge": "Nonaktifkan penggabungan otomatis",
"autoMergeOn": "Penggabungan otomatis aktif",
- "blockedTitle": "Alasan PR belum dapat digabungkan",
- "cannotMerge": "PR ini tidak dapat digabungkan dalam kondisi saat ini.",
+ "autoMergeDescription": "GitHub akan menggabungkan PR ini secara otomatis setelah semua pemeriksaan wajib lulus (metode: {{method}}).",
"checking": "Memeriksa apakah PR dapat digabungkan…",
+ "couldNotDetermine": "Tidak dapat menentukan apakah PR dapat digabungkan.",
+ "refreshMergeability": "Periksa ulang apakah PR dapat digabungkan",
+ "blockedTitle": "Alasan PR belum dapat digabungkan",
+ "updateBranch": "Perbarui cabang",
+ "updateBranchFromBase": "Perbarui cabang dari cabang tujuan",
+ "methodLabel": "Metode",
+ "commitTitle": "Judul commit",
"commitMessage": "Pesan commit",
"commitMessagePlaceholder": "Deskripsi opsional untuk commit penggabungan",
- "commitTitle": "Judul commit",
- "confirmMessage": "Perubahanmu akan digabungkan ke cabang tujuan.",
- "confirmTitle": "Gabungkan PR?",
- "couldNotDetermine": "Tidak dapat menentukan apakah PR dapat digabungkan.",
- "couldNotMerge": "Tidak dapat menggabungkan PR.",
"deleteBranch": "Hapus cabang",
"deleteBranchAfterMerge": "Hapus cabang setelah digabungkan",
- "disableAutoMerge": "Nonaktifkan penggabungan otomatis",
- "enableAutoMerge": "Aktifkan penggabungan otomatis",
- "enableAutoMergeConfirmMessage": "GitHub akan menggabungkan PR ini secara otomatis setelah semua pemeriksaan wajib lulus.",
+ "noEnabledMethods": "Belum ada metode penggabungan yang aktif di repositori ini. Minta admin repositori mengaktifkan penggabungan dengan commit penggabungan, peringkasan commit, atau perubahan basis.",
+ "confirmTitle": "Gabungkan PR?",
+ "confirmTitleTerm": "Gabungkan {{term}}?",
+ "confirmMessage": "Perubahanmu akan digabungkan ke cabang tujuan.",
"enableAutoMergeConfirmTitle": "Aktifkan penggabungan otomatis?",
+ "enableAutoMergeConfirmMessage": "GitHub akan menggabungkan PR ini secara otomatis setelah semua pemeriksaan wajib lulus.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} akan digabungkan secara otomatis setelah pipeline berhasil.",
+ "enableAutoMergeDescriptionTerm": "GitLab menggabungkan {{term}} ini secara otomatis setelah pipeline berhasil.",
"forbidden": "Kamu tidak memiliki izin untuk menggabungkan PR ini.",
- "loadFailedTitle": "Tidak dapat memuat opsi penggabungan.",
- "merge": "Penggabungan",
- "mergeNow": "Gabungkan sekarang",
- "mergePullRequest": "Gabungkan PR",
- "methodLabel": "Metode",
+ "cannotMerge": "PR ini tidak dapat digabungkan dalam kondisi saat ini.",
+ "couldNotMerge": "Tidak dapat menggabungkan PR.",
"methods": {
"merge": "Penggabungan",
"rebase": "Ubah basis",
"squash": "Ringkas"
},
- "noEnabledMethods": "Belum ada metode penggabungan yang aktif di repositori ini. Minta admin repositori mengaktifkan penggabungan dengan commit penggabungan, peringkasan commit, atau perubahan basis.",
+ "terminal": {
+ "alreadyMerged": "Sudah digabungkan",
+ "closed": "PR ini sudah ditutup",
+ "closedMergeRequest": "Merge request ini sudah ditutup"
+ },
"partialSuccessBanner": {
"accessibility": "Sudah digabungkan. Tidak dapat menghapus cabang: {{reason}}",
"body": "Tidak dapat menghapus cabang: {{reason}}."
},
- "refreshMergeability": "Periksa ulang apakah PR dapat digabungkan",
- "terminal": {
- "alreadyMerged": "Sudah digabungkan",
- "closed": "PR ini sudah ditutup"
- },
- "updateBranch": "Perbarui cabang",
- "updateBranchFromBase": "Perbarui cabang dari cabang tujuan",
+ "loadFailedTitle": "Tidak dapat memuat opsi penggabungan.",
"blocked": {
"unknownStateTitle": "GitHub belum menyatakan bahwa PR dapat digabungkan",
"unknownStateDetail": "Coba muat ulang ringkasan sebentar lagi.",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "PR ini belum dapat digabungkan",
"notMergeableDetail": "GitHub melaporkan status penggabungan: {{state}}."
},
+ "restrictions": {
+ "title": "Pembatasan penggabungan",
+ "approvalsRequired_one": "{{displayCount}} persetujuan diperlukan",
+ "approvalsRequired_other": "{{displayCount}} persetujuan diperlukan",
+ "pipelineMustSucceed": "Pipeline harus berhasil sebelum penggabungan."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline gagal pada commit terbaru.",
+ "pendingPipeline": "Pipeline masih berjalan pada commit terbaru.",
+ "permission": "Kamu tidak memiliki izin untuk menggabungkan {{term}} ini.",
+ "draft": "Tandai {{term}} sebagai siap ditinjau sebelum menggabungkannya."
+ },
"methodLabels": {
"merge": "Buat commit penggabungan",
"squash": "Ringkas commit dan gabungkan",
@@ -2623,9 +2507,204 @@
"rebase": "Terapkan kembali semua commit dari cabang ini di atas cabang tujuan tanpa membuat commit penggabungan."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Utas diskusi {{anchorLabel}}",
+ "collapseThread": "Ciutkan utas",
+ "resolveThread": "Selesaikan utas",
+ "unresolveThread": "Batalkan status selesai pada utas",
+ "resolved": "Selesai",
+ "outdated": "Usang",
+ "comment_one": "1 komentar",
+ "comment": "{{displayCount}} komentar",
+ "comment_other": "{{displayCount}} komentar",
+ "startedRelative": " · dimulai {{relative}}",
+ "couldNotLoadMore": "Tidak dapat memuat komentar lainnya.",
+ "retryLoadingMore": "Coba muat komentar lainnya lagi",
+ "loadMoreComments": "Muat komentar lainnya",
+ "addReaction": "Tambah reaksi",
+ "reactionPill": "reaksi {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "reaksi",
+ "reaction": "reaksi",
+ "reaction_other": "reaksi",
+ "commentActions": "Tindakan pada komentar",
+ "reportContent": "Laporkan konten",
+ "reportUser": "Laporkan pengguna",
+ "mute": "Bisukan",
+ "block": "Blokir",
+ "blockedUser": "{{login}} diblokir",
+ "mutedUser": "{{login}} dibisukan",
+ "replyPlaceholder": "Balasan…",
+ "replyBody": "Isi balasan",
+ "submitReply": "Kirim balasan",
+ "termsTitle": "Ketentuan layanan",
+ "termsCopy": "Kamu harus berusia minimal 13 tahun untuk mengirim komentar.",
+ "termsAcceptRetry": "Tidak dapat menyimpan persetujuan atas ketentuan layanan. Periksa koneksimu dan coba lagi.",
+ "viewTerms": "Lihat ketentuan",
+ "acceptTerms": "Setuju",
+ "replyBadRequest": "Balasan ini tidak dapat dikirim. Utasnya mungkin sudah berubah.",
+ "replyForbidden": "Kamu tidak memiliki izin untuk membalas PR ini.",
+ "replyForbiddenTerm": "Kamu tidak memiliki izin untuk membalas {{term}} ini.",
+ "moderation": {
+ "block": {
+ "retryable": "Tidak dapat memblokir pengguna ini. Periksa koneksimu dan coba lagi.",
+ "terminal": "Pengguna ini tidak dapat diblokir."
+ },
+ "mute": {
+ "retryable": "Tidak dapat membisukan pengguna ini. Periksa koneksimu dan coba lagi.",
+ "terminal": "Pengguna ini tidak dapat dibisukan."
+ },
+ "reportContent": {
+ "retryable": "Tidak dapat melaporkan komentar ini. Periksa koneksimu dan coba lagi.",
+ "terminal": "Komentar ini tidak dapat dilaporkan."
+ },
+ "reportUser": {
+ "retryable": "Tidak dapat melaporkan pengguna ini. Periksa koneksimu dan coba lagi.",
+ "terminal": "Pengguna ini tidak dapat dilaporkan."
+ }
+ },
+ "accessDeniedMessage": "Kamu tidak memiliki izin untuk melihat diskusi PR ini.",
+ "unavailable": "Diskusi tidak tersedia.",
+ "unavailableMessage": "PR ini mungkin sudah dihapus.",
+ "couldNotLoad": "Tidak dapat memuat diskusi.",
+ "loading": "Memuat diskusi",
+ "noDiscussion": "Belum ada diskusi",
+ "noDiscussionDescription": "Belum ada utas tinjauan atau komentar diskusi pada PR ini.",
+ "reviewFiles": "Tinjau file",
+ "quotedDiffSnippet": "Cuplikan perbedaan kode yang dikutip",
+ "moreLinesAbove": "… {{displayCount}} baris lagi di atas",
+ "termsAcceptRequired": "Kamu harus menyetujui ketentuan layanan untuk mengirim komentar.",
+ "termsOutdatedCopy": "Ketentuan layanan telah berubah. Buka kembali layar ini untuk menyetujui versi terbaru.",
+ "termsCheckRetryCopy": "Tidak dapat memeriksa ketentuan layanan. Periksa koneksimu dan coba lagi.",
+ "reactions": {
+ "thumbsUp": "Jempol ke atas",
+ "thumbsDown": "Jempol ke bawah",
+ "laugh": "Tertawa",
+ "hooray": "Hore",
+ "confused": "Bingung",
+ "heart": "Hati",
+ "rocket": "Roket",
+ "eyes": "Mata"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Komentar pada file {{path}}",
+ "fileComment": "Komentar file",
+ "outdatedOnPathLines": "Sudah tidak sesuai di {{path}} {{lines}}",
+ "outdatedOnLines": "Sudah tidak sesuai di {{lines}}",
+ "outdatedOnPath": "Sudah tidak sesuai di {{path}}"
+ },
+ "deletedUser": "pengguna yang dihapus"
+ },
+ "couldNotOpenGitHubAppSettings": "Tidak dapat membuka pengaturan aplikasi GitHub.",
+ "installKiloGitHubApp": "Pasang aplikasi Kilo untuk GitHub",
+ "checkConnection": "Periksa koneksi",
+ "couldNotLoadPullRequest": "Tidak dapat memuat PR.",
+ "description": "Deskripsi",
"noDescriptionProvided": "Belum ada deskripsi.",
- "noFilesChanged": "Tidak ada file yang diubah",
- "noFilesChangedDescription": "Tidak ada perubahan file dalam PR ini.",
+ "review": "Tinjauan",
+ "reviewPullRequest": "Tinjau PR",
+ "headLine": "{{counts}} · commit terkini {{sha}}",
+ "entry": {
+ "eyebrow": "Buka PR atau merge request melalui URL",
+ "pastePrLink": "Tempel tautan PR atau merge request",
+ "noRecentPrs": "Belum ada riwayat tinjauan",
+ "noRecentPrsDescription": "Tempel tautan di atas untuk mulai meninjau — akan muncul di sini saat kamu kembali.",
+ "couldNotLoad": "Tidak dapat memuat data.",
+ "removeFromRecentsTitle": "Hapus dari riwayat?",
+ "removeFromRecentsMessage": "Tinjauan ini akan dihapus dari riwayatmu.",
+ "removeRecentAccessibility": "Hapus {{repo}} dari riwayat",
+ "urlAccessibility": "Masukkan URL PR atau merge request",
+ "urlPlaceholder": "URL PR atau merge request",
+ "openAccessibility": "Buka PR atau merge request",
+ "clearLink": "Hapus tautan",
+ "pasteLink": "Tempel tautan PR atau merge request",
+ "open": "Buka"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} pemeriksaan",
+ "couldNotLoad": "Tidak dapat memuat pemeriksaan.",
+ "failed": "{{displayCount}} gagal",
+ "noAccess": "Kamu tidak memiliki akses ke pemeriksaan repositori ini.",
+ "noChecksReported": "Belum ada hasil pemeriksaan",
+ "notAvailable": "Pemeriksaan belum tersedia. Commit terkini mungkin belum diproses, atau aplikasi Kilo untuk GitHub belum dipasang di repositori sumber.",
+ "openDetails": "Buka detail {{name}}",
+ "passed": "{{displayCount}} lulus",
+ "pending": "{{displayCount}} menunggu",
+ "retryChecks": "Coba pemeriksaan lagi",
+ "skipped": "{{displayCount}} dilewati",
+ "title": "Pemeriksaan",
+ "viewOnGitHub": "Lihat PR di GitHub",
+ "checkDetails": "detail pemeriksaan"
+ },
+ "inbox": {
+ "couldNotLoad": "Tidak dapat memuat kotak masuk.",
+ "loading": "Memuat kotak masuk",
+ "noReviewRequests": "Tidak ada permintaan tinjauan",
+ "noReviewRequestsDescription": "PR yang menunggu tinjauanmu muncul di sini. Kamu tetap dapat menempelkan tautan PR apa pun di atas.",
+ "title": "Kotak masuk"
+ },
+ "composer": {
+ "addTitle": "Tambah komentar",
+ "addToReview": "Tambahkan ke tinjauan",
+ "comment": "Komentar",
+ "commentBody": "Isi komentar",
+ "commentBodyPlaceholder": "Komentar…",
+ "commentNow": "Kirim komentar sekarang",
+ "discardMessage": "Drafmu akan hilang.",
+ "discardTitle": "Buang komentar?",
+ "editTitle": "Ubah komentar",
+ "insertSuggestion": "Sisipkan saran",
+ "insertSuggestionA11y": "Sisipkan saran kode",
+ "loadFailedTitle": "Tidak dapat memuat editor komentar.",
+ "ok": "OK",
+ "unavailableMessage": "Komentar dalam antrean ini sudah dihapus atau dikirim.",
+ "unavailableTitle": "Komentar tidak tersedia",
+ "bodyEmpty": "Isi komentar tidak boleh kosong.",
+ "suggestionsOnlyAddedLines": "Saran hanya berlaku pada baris yang ditambahkan.",
+ "tapDiffLineToSuggest": "Ketuk baris perbedaan kode untuk mengaktifkan saran."
+ },
+ "connect": {
+ "checkFailedTitle": "Tidak dapat memeriksa koneksi GitHub.",
+ "checkFailedMessage": "Status masuk belum tersedia sampai data ini selesai dimuat.",
+ "checkFailedTitleGitLab": "Tidak dapat memeriksa koneksi GitLab.",
+ "checkFailedTitleBitbucket": "Tidak dapat memeriksa koneksi Bitbucket.",
+ "providerCheckFailedMessage": "Status koneksi tidak tersedia hingga bagian ini termuat.",
+ "reconnectTitle": "Hubungkan ulang GitHub",
+ "reconnectDescription": "Akses ke akun GitHub kamu telah dicabut. Hubungkan ulang untuk terus meninjau PR di ponsel.",
+ "description": "Hubungkan akun GitHub kamu untuk meninjau PR di ponsel.",
+ "gitlabDescription": "Hubungkan akun GitLab kamu untuk meninjau merge request di ponsel.",
+ "bitbucketDescription": "Hubungkan Bitbucket ke organisasi ini untuk meninjau PR di ponsel.",
+ "bitbucketOrgOnlyDescription": "Pilih organisasi di profilmu untuk meninjau PR Bitbucket-nya."
+ },
+ "screen": {
+ "shareA11y": "Bagikan PR",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Komentar ini akan dihapus dari antrean tinjauan.",
+ "deletePendingTitle": "Hapus komentar dalam antrean?",
+ "loadFailedTitle": "Tidak dapat memuat formulir pengiriman tinjauan.",
+ "pendingComment": "komentar belum dikirim",
+ "pendingComment_other": "komentar belum dikirim",
+ "pendingComment_one": "komentar dalam antrean",
+ "summaryOptional": "Ringkasan (opsional)",
+ "partialPostedMessage": "{{displayFreshCount}} komentar terkirim. {{displayStaleCount}} komentar merujuk ke commit lama dan tetap berada di antreanmu.",
+ "submitCountOfTotal": "Kirim {{displayFreshCount}} dari {{displayTotalCount}} komentar",
+ "submitReview": "Kirim tinjauan",
+ "blockedRequestChanges": "Tambahkan ringkasan atau setidaknya satu komentar untuk meminta perubahan.",
+ "blockedComment": "Tambahkan ringkasan atau setidaknya satu komentar untuk mengirim tinjauan berupa komentar."
+ },
+ "reconnectNotice": {
+ "title": "Koneksi GitHub kedaluwarsa.",
+ "message": "Koneksi GitHub kamu sudah tidak valid. Periksa ulang koneksimu. Kamu akan diminta menghubungkan ulang jika perlu.",
+ "gitlabTitle": "Koneksi GitLab kedaluwarsa.",
+ "bitbucketTitle": "Koneksi Bitbucket kedaluwarsa.",
+ "providerMessage": "Koneksi {{provider}} kamu sudah tidak valid. Periksa ulang koneksimu. Kamu akan diminta menghubungkan ulang jika perlu."
+ },
+ "eventChips": {
+ "comment": "Komentar",
+ "label": "Jenis tinjauan",
+ "requestChanges": "Minta perubahan"
+ },
"overview": {
"commit": "commit",
"commit_other": "commit",
@@ -2666,39 +2745,25 @@
"summaryA11y": "Ringkasan tinjauan",
"summaryPlaceholder": "Ringkasan opsional untuk tinjauan"
},
- "pullRequestUnavailable": "PR tidak tersedia",
- "pullRequestUnavailableDescription": "PR ini tidak dapat dibuka. PR ini mungkin sudah dihapus, repositorinya bersifat privat, atau aplikasi Kilo untuk GitHub belum dipasang di repositori tersebut.",
- "reconnectNotice": {
- "message": "Koneksi GitHub kamu sudah tidak valid. Periksa ulang koneksimu. Kamu akan diminta menghubungkan ulang jika perlu.",
- "title": "Koneksi GitHub kedaluwarsa."
- },
- "review": "Tinjauan",
- "reviewPullRequest": "Tinjau PR",
- "screen": {
- "shareA11y": "Bagikan PR",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "kolom perbedaan kode kosong",
- "emptyDiffRow": "Baris perbedaan kode kosong",
- "newOnly": "Hanya versi baru: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ tidak ada baris baru di akhir file",
- "oldNew": "Lama: {{old}} | Baru: {{new}}",
- "oldOnly": "Hanya versi lama: {{text}}"
+ "tabs": {
+ "discussion": "Diskusi",
+ "files": "Berkas",
+ "overview": "Ringkasan"
},
- "submit": {
- "deletePendingMessage": "Komentar ini akan dihapus dari antrean tinjauan.",
- "deletePendingTitle": "Hapus komentar dalam antrean?",
- "loadFailedTitle": "Tidak dapat memuat formulir pengiriman tinjauan.",
- "pendingComment": "komentar belum dikirim",
- "pendingComment_other": "komentar belum dikirim",
- "pendingComment_one": "komentar dalam antrean",
- "summaryOptional": "Ringkasan (opsional)",
- "partialPostedMessage": "{{displayFreshCount}} komentar terkirim. {{displayStaleCount}} komentar merujuk ke commit lama dan tetap berada di antreanmu.",
- "submitCountOfTotal": "Kirim {{displayFreshCount}} dari {{displayTotalCount}} komentar",
- "submitReview": "Kirim tinjauan",
- "blockedRequestChanges": "Tambahkan ringkasan atau setidaknya satu komentar untuk meminta perubahan.",
- "blockedComment": "Tambahkan ringkasan atau setidaknya satu komentar untuk mengirim tinjauan berupa komentar."
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Bagikan merge request",
+ "viewOnProvider": "Lihat di {{provider}}",
+ "mergeRequestUnavailable": "Merge request tidak tersedia",
+ "unavailableDescription": "Mungkin sudah dihapus, atau kamu tidak punya akses ke sana.",
+ "accessDeniedMergeRequest": "Kamu tidak memiliki izin untuk melihat merge request ini.",
+ "couldNotLoadMergeRequest": "Tidak dapat memuat merge request.",
+ "discussionAccessDenied": "Kamu tidak memiliki izin untuk melihat diskusi merge request ini.",
+ "discussionUnavailableMessage": "Merge request ini mungkin sudah dihapus.",
+ "noDiscussionDescription": "Belum ada utas tinjauan atau komentar diskusi pada merge request ini.",
+ "noFilesChangedDescription": "Tidak ada perubahan file dalam merge request ini."
},
"fileStatus": {
"changed": "Diubah",
@@ -2706,11 +2771,6 @@
"modified": "Diubah",
"renamed": "Nama diubah"
},
- "tabs": {
- "discussion": "Diskusi",
- "files": "Berkas",
- "overview": "Ringkasan"
- },
"diff": {
"selectedTapToChange": "{{label}} dipilih, ketuk untuk mengubah pilihan",
"tapToComment": "{{label}}, ketuk untuk berkomentar",
@@ -2721,7 +2781,7 @@
"emptyLine": "(kosong)"
},
"linkPasteClipboardEmpty": "Papan klip kosong.",
- "linkPasteNotAPullRequest": "Ini bukan tautan PR GitHub.",
+ "linkPasteNotAPullRequest": "Ini bukan tautan PR atau merge request",
"announce": {
"commentPosted": "Komentar terkirim",
"reviewSubmitted": "Tinjauan terkirim",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "Komentar ini tidak dapat dikirim. Baris yang dipilih mungkin telah berubah, atau PR mungkin telah diperbarui.",
"reviewNotSubmitted": "Tinjauan ini tidak dapat dikirim dalam kondisi saat ini. PR mungkin sudah berubah, atau kamu mencoba meninjau PR milikmu sendiri.",
+ "reviewNotSubmittedTerm": "Tinjauan ini tidak dapat dikirim seperti adanya. {{term}} mungkin telah berubah, atau kamu tidak dapat meninjau {{term}} milikmu sendiri.",
"couldNotPostComment": "Tidak dapat mengirim komentar.",
"couldNotSubmitReview": "Tidak dapat mengirim tinjauan. Periksa koneksimu dan coba lagi."
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "Tidak dapat membalas.",
"couldNotCompleteAction": "Tidak dapat menyelesaikan tindakan ini.",
"mergeResultDefaultError": "GitHub tidak menyelesaikan penggabungan.",
+ "mergeResultNotCompleted": "{{term}} tidak digabungkan. Periksa statusnya lalu coba lagi.",
"ambiguous": "Hasil tindakan belum dapat dipastikan. Periksa PR sebelum mencoba lagi.",
"persistenceFailed": "Kami tidak dapat mencatat tindakan ini. Silakan coba lagi nanti.",
"forbidden": "Akses tidak diizinkan."
diff --git a/apps/mobile/src/i18n/locales/ig.json b/apps/mobile/src/i18n/locales/ig.json
index e3c301ce29..7752e5dc29 100644
--- a/apps/mobile/src/i18n/locales/ig.json
+++ b/apps/mobile/src/i18n/locales/ig.json
@@ -36,6 +36,7 @@
"cost": "Ọnụ ahịa",
"discard": "Tụfuo",
"findings": "Ihe achọpụtara",
+ "mergeRequest": "arịrịọ njikọta",
"notConnected": "Ejikọghị",
"notifications": "Ọkwa",
"pullRequest": "arịrịọ ijikọ koodu",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Ahịrị ọdịiche tọgbọ chakoo"
},
"connectionExpired": "Oge njikọ GitHub agwụla.",
+ "capabilities": {
+ "banner": {
+ "title": "Ọ naghị adị n'aka onye na-enye ọrụ a",
+ "accessibility": "Ọ naghị adị n'aka onye na-enye ọrụ a: {{reason}}"
+ }
+ },
"merge": {
"merge": "Njikọta",
"mergeNow": "Jikọta ugbu a",
"mergePullRequest": "Njikọta arịrịọ",
+ "mergeTermTitle": "Jikọta {{term}}",
"enableAutoMerge": "Gbanye njikọta akpaghị aka",
"disableAutoMerge": "Gbanyụọ njikọta akpaghị aka",
"autoMergeOn": "Njikọta akpaghị aka na-arụ ọrụ",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Hichapụ alaka mgbe ejikọtachara",
"noEnabledMethods": "Enweghị usoro njikọta agbanyere na ebe nchekwa a. Rịọ onye nchịkwa ebe nchekwa ka ọ gbanye njikọta, nchịkọta ndekọ mgbanwe, ma ọ bụ mgbanwe ntọala.",
"confirmTitle": "Jikọta arịrịọ njikọta?",
+ "confirmTitleTerm": "Jikọta {{term}}?",
"confirmMessage": "Nke a ga-ejikọta mgbanwe gị n'ime alaka isi.",
"enableAutoMergeConfirmTitle": "Gbanye njikọta akpaghị aka?",
"enableAutoMergeConfirmMessage": "GitHub ga-ejikọta arịrịọ njikọta a akpaghị aka mgbe nnwale niile achọrọ gafere.",
+ "enableAutoMergeConfirmMessageTerm": "A ga-ejikọta {{term}} na-akpaghị aka mgbe pipeline ya gara nke ọma.",
+ "enableAutoMergeDescriptionTerm": "GitLab ga-ejikọta {{term}} a na-akpaghị aka mgbe pipeline ya gara nke ọma.",
"forbidden": "Ị nweghị ikike ijikọta arịrịọ njikọta a.",
"cannotMerge": "Enweghị ike ijikọta arịrịọ njikọta a otú ọ dị ugbu a.",
"couldNotMerge": "Enweghị ike ijikọta arịrịọ njikọta.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Ejikọtala ya",
- "closed": "Emechiela arịrịọ njikọta a"
+ "closed": "Emechiela arịrịọ njikọta a",
+ "closedMergeRequest": "Emechiela arịrịọ njikọta a"
},
"partialSuccessBanner": {
"body": "Enweghị ike ihichapụ alaka ahụ: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Enweghị ike ijikọta arịrịọ njikọta a ugbu a",
"notMergeableDetail": "GitHub gosiri {{state}} dị ka ọnọdụ ikike njikọta."
},
+ "restrictions": {
+ "title": "Ihe mgbochi njikọta",
+ "approvalsRequired_one": "Achọrọ nkwenye {{displayCount}}",
+ "approvalsRequired_other": "Achọrọ nkwenye {{displayCount}}",
+ "pipelineMustSucceed": "Pipeline ga-aga nke ọma tupu ijikọta."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline na-ada ada na ndekọ mgbanwe ikpeazụ.",
+ "pendingPipeline": "Pipeline ka na-arụ ọrụ na ndekọ mgbanwe ikpeazụ.",
+ "permission": "Ị nweghị ikike ijikọta {{term}} a.",
+ "draft": "Kaa {{term}} ahụ ka nke dị njikere maka nyocha tupu ijikọta."
+ },
"methodLabels": {
"merge": "Mepụta ndekọ njikọta",
"squash": "Chịkọta ndekọ mgbanwe ma jikọta",
@@ -448,6 +472,7 @@
"acceptTerms": "Nakwere",
"replyBadRequest": "Enweghị ike ibipụta azịza a. O nwere ike ịbụ na usoro mkparịta ụka ahụ agbanweela.",
"replyForbidden": "Ị nweghị ikike ịzaghachi arịrịọ njikọta a.",
+ "replyForbiddenTerm": "Ị nweghị ikike ịzaghachi {{term}} a.",
"moderation": {
"reportContent": {
"terminal": "Enweghị ike ikpesa okwu a.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Nyochaa arịrịọ njikọta",
"headLine": "{{counts}} · ndekọ mgbanwe kacha ọhụrụ {{sha}}",
"entry": {
- "eyebrow": "Mepee arịrịọ njikọta site na URL.",
- "pastePrLink": "Mado njikọ PR",
- "noRecentPrs": "Enweghị PR elelere n'oge na-adịbeghị anya",
- "noRecentPrsDescription": "Mado njikọ PR n'elu ka ị malite nyocha — ọ ga-apụta ebe a n'oge ọzọ.",
+ "eyebrow": "Meghe arịrịọ ijikọ koodu ma ọ bụ arịrịọ njikọta site na URL",
+ "pastePrLink": "Mado njikọ arịrịọ ijikọ koodu ma ọ bụ arịrịọ njikọta",
+ "noRecentPrs": "Enweghị nyocha ọhụrụ",
+ "noRecentPrsDescription": "Mado njikọ n'elu iji malite nyocha — ọ ga-apụta ebe a oge ọzọ.",
"couldNotLoad": "Enweghị ike ibudata.",
"removeFromRecentsTitle": "Wepụ na ndepụta ndị elelere nso nso a?",
- "removeFromRecentsMessage": "A ga-ewepụ arịrịọ njikọta a na ndepụta ndị ị lere nso nso a.",
+ "removeFromRecentsMessage": "A ga-ewepụ nyocha a na nyocha ndị ị rụrụ n'oge na-adịbeghị anya.",
"removeRecentAccessibility": "Wepụ {{repo}} na ndepụta ndị elelere nso nso a",
- "urlAccessibility": "URL arịrịọ njikọta GitHub",
- "clearLink": "Hichapụ njikọ arịrịọ njikọta",
- "pasteLink": "Mado njikọ arịrịọ njikọta",
+ "urlAccessibility": "Nye URL arịrịọ ijikọ koodu ma ọ bụ arịrịọ njikọta",
+ "urlPlaceholder": "URL arịrịọ ijikọ koodu ma ọ bụ arịrịọ njikọta",
+ "openAccessibility": "Meghe arịrịọ ijikọ koodu ma ọ bụ arịrịọ njikọta",
+ "clearLink": "Hichapụ njikọ",
+ "pasteLink": "Mado njikọ arịrịọ ijikọ koodu ma ọ bụ arịrịọ njikọta",
"open": "Meghe"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Enweghị ike ịlele njikọ GitHub.",
"checkFailedMessage": "Enweghị ike ịmata ọnọdụ nbanye ruo mgbe ebudatara nke a.",
+ "checkFailedTitleGitLab": "Enweghị ike ịlele njikọ GitLab.",
+ "checkFailedTitleBitbucket": "Enweghị ike ịlele njikọ Bitbucket.",
+ "providerCheckFailedMessage": "Ọnọdụ njikọ agaghị adị ruo mgbe nke a budatara.",
"reconnectTitle": "Jikọtaghachi GitHub",
"reconnectDescription": "Akagbuola njikọ GitHub gị. Jikọtaghachi ka ị gaa n'ihu na-enyocha arịrịọ njikọta na ekwentị.",
- "description": "Jikọọ akaụntụ GitHub gị ka ị nyochaa arịrịọ njikọta na ekwentị."
+ "description": "Jikọọ akaụntụ GitHub gị ka ị nyochaa arịrịọ njikọta na ekwentị.",
+ "gitlabDescription": "Jikọọ akaụntụ GitLab gị iji nyochaa arịrịọ njikọta na ekwentị.",
+ "bitbucketDescription": "Jikọọ Bitbucket na òtù a iji nyochaa arịrịọ ijikọ koodu na ekwentị.",
+ "bitbucketOrgOnlyDescription": "Họrọ òtù na profaịlụ gị iji nyochaa arịrịọ ijikọ koodu Bitbucket ya."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Oge njikọ GitHub agwụla.",
- "message": "Njikọ GitHub gị adịkwaghị irè. Lelee njikọ gị ọzọ — a ga-agwa gị ka ị jikọtaghachi ma ọ bụrụ na ọ dị mkpa."
+ "message": "Njikọ GitHub gị adịkwaghị irè. Lelee njikọ gị ọzọ — a ga-agwa gị ka ị jikọtaghachi ma ọ bụrụ na ọ dị mkpa.",
+ "gitlabTitle": "Oge njikọ GitLab agwụla.",
+ "bitbucketTitle": "Oge njikọ Bitbucket agwụla.",
+ "providerMessage": "Njikọ {{provider}} gị adịkwaghị irè. Lelee njikọ gị ọzọ — a ga-agwa gị ka ị jikọtaghachi ma ọ bụrụ na ọ dị mkpa."
},
"eventChips": {
"comment": "Nkwupụta",
@@ -643,6 +679,21 @@
"files": "Faịlụ",
"discussion": "Mkparịta ụka"
},
+ "terms": {
+ "pullRequest": "Arịrịọ ijikọ koodu",
+ "mergeRequest": "Arịrịọ njikọta",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Kekọrịta arịrịọ njikọta",
+ "viewOnProvider": "Lelee na {{provider}}",
+ "mergeRequestUnavailable": "Arịrịọ njikọta adịghị",
+ "unavailableDescription": "Ọ nwere ike ịbụ na ehichapụrụ ya, ma ọ bụ ị nweghị ikike ịbanye ya.",
+ "accessDeniedMergeRequest": "Ị nweghị ikike ilele arịrịọ njikọta a.",
+ "couldNotLoadMergeRequest": "Enweghị ike ibudata arịrịọ njikọta.",
+ "discussionAccessDenied": "Ị nweghị ikike ilele mkparịta ụka arịrịọ njikọta a.",
+ "discussionUnavailableMessage": "O nwere ike ịbụ na ewepụla arịrịọ njikọta a.",
+ "noDiscussionDescription": "Enweghị usoro mkparịta ụka nyocha ma ọ bụ okwu mkparịta ụka na arịrịọ njikọta a.",
+ "noFilesChangedDescription": "Enweghị mgbanwe faịlụ na arịrịọ njikọta a."
+ },
"fileStatus": {
"modified": "Agbanwere",
"renamed": "Agbanwere aha",
@@ -659,7 +710,7 @@
"emptyLine": "(efu)"
},
"linkPasteClipboardEmpty": "Ebe nchekwa nwa oge tọgbọ chakoo.",
- "linkPasteNotAPullRequest": "Nke a abụghị njikọ arịrịọ njikọta GitHub.",
+ "linkPasteNotAPullRequest": "Ọ bụghị njikọ arịrịọ ijikọ koodu ma ọ bụ arịrịọ njikọta",
"announce": {
"commentPosted": "Ebipụtala okwu",
"reviewSubmitted": "Ezigala nyocha",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Enweghị ike ibipụta okwu a. O nwere ike ịbụ na ahịrị ahọpụtara agbanweela ma ọ bụ na emelitere PR ahụ.",
"reviewNotSubmitted": "Enweghị ike iziga nyocha a otú ọ dị ugbu a. O nwere ike ịbụ na PR ahụ agbanweela, ma ọ bụ na ị nweghị ike inyocha arịrịọ njikọta nke gị.",
+ "reviewNotSubmittedTerm": "Enweghị ike izipu nyocha a ka ọ dị. Ọ nwere ike ịbụ na {{term}} agbanweela, ma ọ bụ ị gaghị enyocha {{term}} nke gị.",
"couldNotPostComment": "Enweghị ike ibipụta okwu.",
"couldNotSubmitReview": "Enweghị ike iziga nyocha. Lelee njikọ gị ma nwaa ọzọ."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Enweghị ike ịzaghachi.",
"couldNotCompleteAction": "Enweghị ike imecha omume a.",
"mergeResultDefaultError": "GitHub emechaghị njikọta ahụ.",
+ "mergeResultNotCompleted": "Ejighị {{term}} ọnụ. Lelee ọnọdụ ya ma gbalịa ọzọ.",
"ambiguous": "Enweghị ike ịchọpụta ma emechara ya — lelee PR ahụ tupu ị nwaa ọzọ.",
"persistenceFailed": "Anyị enweghị ike ịdekọ omume a. Biko nwaa ọzọ ma emechaa.",
"forbidden": "A machibidoro nke a."
@@ -1988,11 +2041,31 @@
"retryConnection": "Nwaa njikọ ọzọ"
},
"newSession": {
+ "recentlyUsed": "Ndị e ji mee ihe nso nso a",
+ "couldNotLoadGithubRepositories": "Enweghị ike ibudata ebe nchekwa koodu GitHub.",
+ "couldNotLoadGitlabRepositories": "Enweghị ike ibudata ebe nchekwa koodu GitLab.",
+ "couldNotLoadBitbucketRepositories": "Enweghị ike ibudata ebe nchekwa koodu Bitbucket.",
"connectGithubDescription": "Jikọọ GitHub n'ihe nchọgharị gị, wee laghachi ebe a ịhọrọ ebe nchekwa koodu.",
+ "connectGitlabDescription": "Jikọọ GitLab n'ihe nchọgharị gị, wee laghachi ebe a ịhọrọ ebe nchekwa koodu.",
+ "connectBitbucketDescription": "Jikọọ Bitbucket n'ihe nchọgharị gị, wee laghachi ebe a ịhọrọ ebe nchekwa koodu.",
"openGithub": "Mepee GitHub",
+ "openGitlab": "Mepee GitLab",
+ "openBitbucket": "Mepee Bitbucket",
"refreshRepositories": "Budata ebe nchekwa koodu ọzọ",
"githubConnected": "Ejikọrọ GitHub",
+ "gitlabConnected": "Ejikọrọ GitLab",
"noRepositoriesVisible": "Enweghị ebe nchekwa koodu a na-ahụ. Lelee ikike ngwa Kilo GitHub nwere ịbanye na ha, wee budata ọzọ.",
+ "noRepositoriesVisibleGitlab": "Enweghị ebe nchekwa koodu a na-ahụ. Lelee ikike ịbanye na ha na GitLab, wee budata ọzọ.",
+ "noRepositoriesVisibleBitbucket": "Enweghị ebe nchekwa koodu a na-ahụ. Lelee ikike ịbanye na ha na Bitbucket, wee budata ọzọ.",
+ "bitbucketOrganizationsOnly": "A na-enweta Bitbucket maka òtù naanị.",
+ "branchPickerTitle": "Họrọ alaka",
+ "branchDefault": "Ndabere",
+ "branchAccessibility": "Alaka: {{label}}",
+ "branchLoading": "Na-ebudata alaka",
+ "branchLoadError": "Enweghị ike ibudata alaka",
+ "branchUnavailable": "Alaka adịghị maka ebe nchekwa koodu a. Lelee ikike gị n'aka onye na-enye ọrụ, ma họrọ ebe nchekwa koodu ọzọ.",
+ "branchEmpty": "Enweghị alaka dị",
+ "branchPlaceholder": "Họrọ otu alaka",
"runOnWithTarget": "Rụọ ọrụ na: {{target}}",
"environment": "Ebe ọrụ",
"couldNotLoadEnvironment": "Enweghị ike ibudata ebe ọrụ gị.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Enweghị ike ibudata ebe nchekwa koodu ọzọ. Biko nwaa ọzọ.",
"discardDraftTitle": "Tụfuo ozi a na-ede?",
"discardDraftMessage": "Ihe ị dere ga-efu.",
+ "discardWithUploadsMessage": "A ga-ehichapụ ihe ị dere na faịlụ ọ bụla ebugotere nke a na-ejikọtaghị na ozi ezigara.",
"discardFailed": "Enweghị ike ịtụfu ozi a na-ede. Biko nwaa ọzọ.",
"remoteHint": "Gbaa `kilo remote` na kọmputa gị, ma ọ bụ `/remote` n'ime nnọkọ CLI na-arụ ọrụ, iji chịkwaa usoro kilo dị na kọmputa gị.",
- "connectBitbucketDescription": "Jikọọ Bitbucket n'ihe nchọgharị gị, wee laghachi ebe a ịhọrọ ebe nchekwa koodu.",
- "connectGitlabDescription": "Jikọọ GitLab n'ihe nchọgharị gị, wee laghachi ebe a ịhọrọ ebe nchekwa koodu.",
- "couldNotLoadBitbucketRepositories": "Enweghị ike ibudata ebe nchekwa koodu Bitbucket.",
- "couldNotLoadGithubRepositories": "Enweghị ike ibudata ebe nchekwa koodu GitHub.",
- "couldNotLoadGitlabRepositories": "Enweghị ike ibudata ebe nchekwa koodu GitLab.",
- "gitlabConnected": "Ejikọrọ GitLab",
- "noRepositoriesVisibleBitbucket": "Enweghị ebe nchekwa koodu a na-ahụ. Lelee ikike ịbanye na ha na Bitbucket, wee budata ọzọ.",
- "noRepositoriesVisibleGitlab": "Enweghị ebe nchekwa koodu a na-ahụ. Lelee ikike ịbanye na ha na GitLab, wee budata ọzọ.",
- "openBitbucket": "Mepee Bitbucket",
- "openGitlab": "Mepee GitLab",
- "recentlyUsed": "Ndị e ji mee ihe nso nso a",
- "cliCannotContinue": "CLI a enweghị ike ịga n'ihu na nnọkọ. Họrọ Cloud Agent ma ọ bụ CLI ọzọ.",
"continueFrom": "A na-aga n'ihu na {{title}}.",
- "importFailed": "Enweghị ike ibubata nnọkọ a.",
"importingSession": "Na-ebubata nnọkọ",
- "discardWithUploadsMessage": "A ga-ehichapụ ihe ị dere na faịlụ ọ bụla ebugotere nke a na-ejikọtaghị na ozi ezigara."
+ "cliCannotContinue": "CLI a enweghị ike ịga n'ihu na nnọkọ. Họrọ Cloud Agent ma ọ bụ CLI ọzọ.",
+ "importFailed": "Enweghị ike ibubata nnọkọ a."
},
"partRenderer": {
"updatedFileCount_one": "Emelitere faịlụ {{displayCount}}.",
diff --git a/apps/mobile/src/i18n/locales/is.json b/apps/mobile/src/i18n/locales/is.json
index 23e32fa717..350fb38541 100644
--- a/apps/mobile/src/i18n/locales/is.json
+++ b/apps/mobile/src/i18n/locales/is.json
@@ -36,6 +36,7 @@
"cost": "Kostnaður",
"discard": "Farga",
"findings": "Niðurstöður",
+ "mergeRequest": "merge request",
"notConnected": "Ekki tengt",
"notifications": "Tilkynningar",
"pullRequest": "samrunabeiðni",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Tóm röð í breytingasamanburði"
},
"connectionExpired": "Tengingin við GitHub er útrunnin.",
+ "capabilities": {
+ "banner": {
+ "title": "Ekki í boði hjá þessari þjónustu",
+ "accessibility": "Ekki í boði hjá þessari þjónustu: {{reason}}"
+ }
+ },
"merge": {
"merge": "Sameining",
"mergeNow": "Sameina núna",
"mergePullRequest": "Sameining beiðnar",
+ "mergeTermTitle": "Sameina {{term}}",
"enableAutoMerge": "Virkja sjálfvirka sameiningu",
"disableAutoMerge": "Gera sjálfvirka sameiningu óvirka",
"autoMergeOn": "Sjálfvirk sameining virk",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Eyða grein eftir sameiningu",
"noEnabledMethods": "Engar sameiningaraðferðir eru virkar í þessari kóðageymslu. Biddu stjórnanda kóðageymslunnar um að virkja sameiningu, samþjöppun eða endurgrunnun.",
"confirmTitle": "Sameina sameiningarbeiðni?",
+ "confirmTitleTerm": "Sameina {{term}}?",
"confirmMessage": "Breytingarnar þínar verða sameinaðar grunngreininni.",
"enableAutoMergeConfirmTitle": "Virkja sjálfvirka sameiningu?",
"enableAutoMergeConfirmMessage": "GitHub sameinar þessa sameiningarbeiðni sjálfkrafa þegar allar áskildar athuganir standast.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} sameinast sjálfkrafa þegar pipeline tekst.",
+ "enableAutoMergeDescriptionTerm": "GitLab sameinar {{term}} sjálfkrafa þegar pipeline tekst.",
"forbidden": "Þú hefur ekki heimild til að sameina þessa sameiningarbeiðni.",
"cannotMerge": "Ekki er hægt að sameina þessa sameiningarbeiðni í núverandi mynd.",
"couldNotMerge": "Ekki tókst að sameina sameiningarbeiðnina.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Þegar sameinað",
- "closed": "Þessi sameiningarbeiðni er lokuð"
+ "closed": "Þessi sameiningarbeiðni er lokuð",
+ "closedMergeRequest": "Þessi merge request er lokuð"
},
"partialSuccessBanner": {
"body": "Ekki tókst að eyða greininni: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Ekki er enn hægt að sameina þessa sameiningarbeiðni",
"notMergeableDetail": "GitHub tilkynnti eftirfarandi sameiningarstöðu: {{state}}."
},
+ "restrictions": {
+ "title": "Takmarkanir við sameiningu",
+ "approvalsRequired_one": "Þarf {{displayCount}} samþykki",
+ "approvalsRequired_other": "Þarf {{displayCount}} samþykki",
+ "pipelineMustSucceed": "Pipeline verður að takast áður en sameinað er."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline tekst ekki á síðasta commit.",
+ "pendingPipeline": "Pipeline er enn í gangi á síðasta commit.",
+ "permission": "Þú hefur ekki heimild til að sameina {{term}}.",
+ "draft": "Merktu {{term}} sem tilbúna til yfirferðar áður en þú sameinar."
+ },
"methodLabels": {
"merge": "Búa til sameiningarinnsendingu",
"squash": "Samþjappa og sameina",
@@ -448,6 +472,7 @@
"acceptTerms": "Samþykkja",
"replyBadRequest": "Ekki er hægt að birta þetta svar. Þráðurinn gæti hafa breyst.",
"replyForbidden": "Þú hefur ekki heimild til að svara þessari sameiningarbeiðni.",
+ "replyForbiddenTerm": "Þú hefur ekki heimild til að svara við {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Ekki er hægt að tilkynna þessa athugasemd.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Yfirfara sameiningarbeiðni",
"headLine": "{{counts}} · nýjasta innsending: {{sha}}.",
"entry": {
- "eyebrow": "Opnaðu sameiningarbeiðni með URL-slóð.",
- "pastePrLink": "Líma PR-tengil",
- "noRecentPrs": "Engar nýlegar PR-beiðnir",
- "noRecentPrsDescription": "Límdu PR-tengil hér að ofan til að hefja yfirferð — beiðnin birtist hér næst.",
+ "eyebrow": "Opnaðu samrunabeiðni eða merge request með URL-slóð",
+ "pastePrLink": "Líma tengil á samrunabeiðni eða merge request",
+ "noRecentPrs": "Engar nýlegar yfirferðir",
+ "noRecentPrsDescription": "Límdu tengil hér að ofan til að hefja yfirferð — hún birtist hér næst.",
"couldNotLoad": "Ekki tókst að hlaða efni.",
"removeFromRecentsTitle": "Fjarlægja úr nýlegum beiðnum?",
- "removeFromRecentsMessage": "Þessi sameiningarbeiðni verður fjarlægð af listanum yfir nýlegar beiðnir.",
+ "removeFromRecentsMessage": "Þessi yfirferð verður fjarlægð af listanum yfir nýlegar.",
"removeRecentAccessibility": "Fjarlægja {{repo}} úr nýlegum beiðnum",
- "urlAccessibility": "URL-slóð á sameiningarbeiðni á GitHub",
- "clearLink": "Hreinsa tengil á sameiningarbeiðni",
- "pasteLink": "Líma tengil á sameiningarbeiðni",
+ "urlAccessibility": "Settu inn URL á samrunabeiðni eða merge request",
+ "urlPlaceholder": "Veffang á sameiningarbeiðni eða merge request",
+ "openAccessibility": "Opna sameiningarbeiðni eða merge request",
+ "clearLink": "Hreinsa tengil",
+ "pasteLink": "Líma tengil á samrunabeiðni eða merge request",
"open": "Opna"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Ekki tókst að athuga GitHub-tenginguna.",
"checkFailedMessage": "Ekki er hægt að sýna innskráningarstöðu fyrr en hleðslu lýkur.",
+ "checkFailedTitleGitLab": "Ekki tókst að athuga GitLab-tenginguna.",
+ "checkFailedTitleBitbucket": "Ekki tókst að athuga Bitbucket-tenginguna.",
+ "providerCheckFailedMessage": "Ekki er hægt að sýna tengistöðu fyrr en hleðslu lýkur.",
"reconnectTitle": "Tengja GitHub aftur",
"reconnectDescription": "Heimild fyrir GitHub-tengingunni þinni var afturkölluð. Tengdu aftur til að halda áfram að yfirfara sameiningarbeiðnir í símanum.",
- "description": "Tengdu GitHub-reikninginn þinn til að yfirfara sameiningarbeiðnir í símanum."
+ "description": "Tengdu GitHub-reikninginn þinn til að yfirfara sameiningarbeiðnir í símanum.",
+ "gitlabDescription": "Tengdu GitLab-reikninginn þinn til að yfirfara merge requests í símanum.",
+ "bitbucketDescription": "Tengdu Bitbucket við þessa stofnun til að yfirfara sameiningarbeiðnir í símanum.",
+ "bitbucketOrgOnlyDescription": "Veldu stofnun í notandasniðinu þínu til að yfirfara sameiningarbeiðnir hennar á Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Tengingin við GitHub er útrunnin.",
- "message": "GitHub-tengingin þín er ekki lengur gild. Athugaðu tenginguna aftur — þú færð beiðni um að tengjast aftur ef þörf er á."
+ "message": "GitHub-tengingin þín er ekki lengur gild. Athugaðu tenginguna aftur — þú færð beiðni um að tengjast aftur ef þörf er á.",
+ "gitlabTitle": "Tengingin við GitLab er útrunnin.",
+ "bitbucketTitle": "Tengingin við Bitbucket er útrunnin.",
+ "providerMessage": "{{provider}}-tengingin þín er ekki lengur gild. Athugaðu tenginguna aftur — þú færð beiðni um að tengjast aftur ef þörf er á."
},
"eventChips": {
"comment": "Gera athugasemd",
@@ -643,6 +679,21 @@
"files": "Skrár",
"discussion": "Umræða"
},
+ "terms": {
+ "pullRequest": "Samrunabeiðni",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Deila merge request",
+ "viewOnProvider": "Skoða á {{provider}}",
+ "mergeRequestUnavailable": "Merge request ekki tiltæk",
+ "unavailableDescription": "Hún gæti hafa verið fjarlægð, eða þú hefur ekki aðgang að henni.",
+ "accessDeniedMergeRequest": "Þú hefur ekki heimild til að skoða þessa merge request.",
+ "couldNotLoadMergeRequest": "Ekki tókst að hlaða merge request.",
+ "discussionAccessDenied": "Þú hefur ekki heimild til að skoða umræðuna um þessa merge request.",
+ "discussionUnavailableMessage": "Þessi merge request gæti hafa verið fjarlægð.",
+ "noDiscussionDescription": "Engir yfirferðarþræðir eða almennar athugasemdir eru við þessa merge request.",
+ "noFilesChangedDescription": "Engar skrár hafa breyst í þessari merge request."
+ },
"fileStatus": {
"modified": "Breytt",
"renamed": "Endurnefnd",
@@ -659,7 +710,7 @@
"emptyLine": "(tómt)"
},
"linkPasteClipboardEmpty": "Klippiborðið er tómt.",
- "linkPasteNotAPullRequest": "Þetta er ekki tengill á sameiningarbeiðni á GitHub.",
+ "linkPasteNotAPullRequest": "Þetta er ekki tengill á samrunabeiðni eða merge request",
"announce": {
"commentPosted": "Athugasemd birt",
"reviewSubmitted": "Yfirferð send",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Ekki er hægt að birta þessa athugasemd. Valda línan gæti hafa breyst eða PR-beiðnin verið uppfærð.",
"reviewNotSubmitted": "Ekki er hægt að senda þessa yfirferð í núverandi mynd. PR-beiðnin gæti hafa breyst eða þú ert að yfirfara eigin sameiningarbeiðni, sem er ekki leyfilegt.",
+ "reviewNotSubmittedTerm": "Ekki er hægt að senda þessa yfirferð í núverandi mynd. {{term}} gæti hafa breyst, eða þú mátt ekki yfirfara þína eigin {{term}}.",
"couldNotPostComment": "Ekki tókst að birta athugasemd.",
"couldNotSubmitReview": "Ekki tókst að senda yfirferð. Athugaðu tenginguna og reyndu aftur."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Tókst ekki að svara.",
"couldNotCompleteAction": "Ekki tókst að ljúka þessari aðgerð.",
"mergeResultDefaultError": "GitHub lauk ekki sameiningunni.",
+ "mergeResultNotCompleted": "{{term}} var ekki sameinuð. Athugaðu stöðuna og reyndu aftur.",
"ambiguous": "Ekki tókst að staðfesta niðurstöðuna — athugaðu PR-beiðnina áður en þú reynir aftur.",
"persistenceFailed": "Ekki tókst að skrá þessa aðgerð. Reyndu aftur síðar.",
"forbidden": "Þú hefur ekki heimild til þessarar aðgerðar."
@@ -1988,11 +2041,31 @@
"retryConnection": "Reyna að tengjast aftur"
},
"newSession": {
+ "recentlyUsed": "Nýlega notað",
+ "couldNotLoadGithubRepositories": "Ekki tókst að hlaða kóðasöfnum frá GitHub.",
+ "couldNotLoadGitlabRepositories": "Ekki tókst að hlaða kóðasöfnum frá GitLab.",
+ "couldNotLoadBitbucketRepositories": "Ekki tókst að hlaða kóðasöfnum frá Bitbucket.",
"connectGithubDescription": "Tengdu GitHub í vafranum þínum og komdu svo aftur hingað til að velja kóðasafn.",
+ "connectGitlabDescription": "Tengdu GitLab í vafranum þínum og komdu svo aftur hingað til að velja kóðasafn.",
+ "connectBitbucketDescription": "Tengdu Bitbucket í vafranum þínum og komdu svo aftur hingað til að velja kóðasafn.",
"openGithub": "Opna GitHub",
+ "openGitlab": "Opna GitLab",
+ "openBitbucket": "Opna Bitbucket",
"refreshRepositories": "Endurnýja kóðasöfn",
"githubConnected": "GitHub tengt",
+ "gitlabConnected": "GitLab tengt",
"noRepositoriesVisible": "Engin kóðasöfn sjást. Athugaðu aðgang GitHub-forritsins frá Kilo að kóðasöfnum og endurnýjaðu svo.",
+ "noRepositoriesVisibleGitlab": "Engin kóðasöfn sjást. Athugaðu aðgang að kóðasöfnum í GitLab og endurnýjaðu svo.",
+ "noRepositoriesVisibleBitbucket": "Engin kóðasöfn sjást. Athugaðu aðgang að kóðasöfnum í Bitbucket og endurnýjaðu svo.",
+ "bitbucketOrganizationsOnly": "Bitbucket er aðeins í boði fyrir stofnanir.",
+ "branchPickerTitle": "Velja kvist",
+ "branchDefault": "Sjálfgefið",
+ "branchAccessibility": "Kvistur: {{label}}",
+ "branchLoading": "Hleður kvista",
+ "branchLoadError": "Ekki tókst að hlaða kvistum",
+ "branchUnavailable": "Engir kvistar eru tiltækir fyrir þetta kóðasafn. Athugaðu aðganginn þinn hjá veitunni og veldu annað kóðasafn.",
+ "branchEmpty": "Engir kvistar tiltækir",
+ "branchPlaceholder": "Veldu kvist",
"runOnWithTarget": "Keyra á: {{target}}",
"environment": "Umhverfi",
"couldNotLoadEnvironment": "Ekki tókst að hlaða umhverfinu þínu.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Ekki tókst að endurnýja kóðasöfnin. Reyndu aftur.",
"discardDraftTitle": "Farga drögum?",
"discardDraftMessage": "Skilaboðin þín glatast.",
+ "discardWithUploadsMessage": "Skilaboðunum þínum og upphlöðnum skrám sem ekki fylgja sendum skilaboðum verður eytt.",
"discardFailed": "Ekki tókst að farga drögunum. Reyndu aftur.",
"remoteHint": "Keyrðu `kilo remote` á tölvunni þinni eða `/remote` í CLI-lotu sem er í gangi til að stjórna staðbundnu kilo-ferli.",
- "connectBitbucketDescription": "Tengdu Bitbucket í vafranum þínum og komdu svo aftur hingað til að velja kóðasafn.",
- "connectGitlabDescription": "Tengdu GitLab í vafranum þínum og komdu svo aftur hingað til að velja kóðasafn.",
- "couldNotLoadBitbucketRepositories": "Ekki tókst að hlaða kóðasöfnum frá Bitbucket.",
- "couldNotLoadGithubRepositories": "Ekki tókst að hlaða kóðasöfnum frá GitHub.",
- "couldNotLoadGitlabRepositories": "Ekki tókst að hlaða kóðasöfnum frá GitLab.",
- "gitlabConnected": "GitLab tengt",
- "noRepositoriesVisibleBitbucket": "Engin kóðasöfn sjást. Athugaðu aðgang að kóðasöfnum í Bitbucket og endurnýjaðu svo.",
- "noRepositoriesVisibleGitlab": "Engin kóðasöfn sjást. Athugaðu aðgang að kóðasöfnum í GitLab og endurnýjaðu svo.",
- "openBitbucket": "Opna Bitbucket",
- "openGitlab": "Opna GitLab",
- "recentlyUsed": "Nýlega notað",
"continueFrom": "Haldið er áfram með {{title}}.",
"importingSession": "Flytur lotuna inn",
"cliCannotContinue": "Þetta CLI getur ekki haldið áfram með lotu. Veldu Cloud Agent eða annað CLI.",
- "importFailed": "Ekki tókst að flytja inn þessa lotu.",
- "discardWithUploadsMessage": "Skilaboðunum þínum og upphlöðnum skrám sem ekki fylgja sendum skilaboðum verður eytt."
+ "importFailed": "Ekki tókst að flytja inn þessa lotu."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} skrá var uppfærð.",
diff --git a/apps/mobile/src/i18n/locales/it.json b/apps/mobile/src/i18n/locales/it.json
index 94567943a2..072eb015bf 100644
--- a/apps/mobile/src/i18n/locales/it.json
+++ b/apps/mobile/src/i18n/locales/it.json
@@ -3,6 +3,9 @@
"cancel": "Annulla",
"done": "Fatto",
"retry": "Riprova",
+ "tryAgain": "Riprova",
+ "continue": "Continua",
+ "notNow": "Non ora",
"language": "Lingua",
"device": "Dispositivo",
"share": "Condividi {{title}}",
@@ -14,15 +17,12 @@
"approve": "Approva",
"refresh": "Aggiorna",
"couldNotRefresh": "Impossibile aggiornare. Trascina verso il basso per riprovare.",
- "tryAgain": "Riprova",
"openInBrowser": "Apri nel browser",
"openSettings": "Apri le impostazioni",
"copiedToClipboard": "Copiato negli appunti",
"couldNotCopyToClipboard": "Impossibile copiare negli appunti.",
"required": "obbligatorio",
"error": "errore: {{error}}",
- "notNow": "Non ora",
- "continue": "Continua",
"back": "Indietro",
"somethingWentWrong": "Si è verificato un errore.",
"couldNotOpen": "Impossibile aprire {{label}}.",
@@ -36,6 +36,7 @@
"cost": "Costo",
"discard": "Scarta",
"findings": "Problemi rilevati",
+ "mergeRequest": "merge request",
"notConnected": "Non collegato",
"notifications": "Notifiche",
"pullRequest": "pR",
@@ -1543,11 +1544,31 @@
"retryConnection": "Riprova a connetterti"
},
"newSession": {
+ "recentlyUsed": "Usati di recente",
+ "couldNotLoadGithubRepositories": "Impossibile caricare i repository GitHub.",
+ "couldNotLoadGitlabRepositories": "Impossibile caricare i repository GitLab.",
+ "couldNotLoadBitbucketRepositories": "Impossibile caricare i repository Bitbucket.",
"connectGithubDescription": "Collega GitHub nel browser, poi torna qui per scegliere un repository.",
+ "connectGitlabDescription": "Collega GitLab nel browser, poi torna qui per scegliere un repository.",
+ "connectBitbucketDescription": "Collega Bitbucket nel browser, poi torna qui per scegliere un repository.",
"openGithub": "Apri GitHub",
+ "openGitlab": "Apri GitLab",
+ "openBitbucket": "Apri Bitbucket",
"refreshRepositories": "Aggiorna i repository",
"githubConnected": "GitHub collegato",
+ "gitlabConnected": "GitLab collegato",
"noRepositoriesVisible": "Nessun repository visibile. Controlla le autorizzazioni di accesso ai repository dell'app Kilo per GitHub, poi aggiorna l'elenco.",
+ "noRepositoriesVisibleGitlab": "Nessun repository visibile. Controlla le autorizzazioni di accesso ai repository su GitLab, poi aggiorna l'elenco.",
+ "noRepositoriesVisibleBitbucket": "Nessun repository visibile. Controlla le autorizzazioni di accesso ai repository su Bitbucket, poi aggiorna l'elenco.",
+ "bitbucketOrganizationsOnly": "Bitbucket è disponibile solo per le organizzazioni.",
+ "branchPickerTitle": "Seleziona branch",
+ "branchDefault": "Predefinito",
+ "branchAccessibility": "Branch: {{label}}",
+ "branchLoading": "Caricamento dei branch",
+ "branchLoadError": "Impossibile caricare i branch",
+ "branchUnavailable": "Nessun branch disponibile per questo repository. Verifica i tuoi accessi con il provider, poi scegli un altro repository.",
+ "branchEmpty": "Nessun branch disponibile",
+ "branchPlaceholder": "Seleziona un branch",
"runOnWithTarget": "Esegui su: {{target}}",
"environment": "Ambiente",
"couldNotLoadEnvironment": "Impossibile caricare il tuo ambiente.",
@@ -1566,26 +1587,15 @@
"couldNotReadPendingSessions": "Impossibile leggere le sessioni in sospeso. Riprova.",
"failedToCreate": "Impossibile creare la sessione.",
"couldNotRefreshRepositories": "Impossibile aggiornare i repository. Riprova.",
- "discardDraftMessage": "Il tuo prompt andrà perso.",
"discardDraftTitle": "Eliminare la bozza?",
+ "discardDraftMessage": "Il tuo prompt andrà perso.",
+ "discardWithUploadsMessage": "Il tuo prompt e i file caricati non allegati a messaggi inviati verranno eliminati.",
"discardFailed": "Impossibile eliminare la bozza. Riprova.",
"remoteHint": "Esegui `kilo remote` sul tuo computer, oppure `/remote` in una sessione CLI attiva, per controllare un processo kilo locale.",
- "connectBitbucketDescription": "Collega Bitbucket nel browser, poi torna qui per scegliere un repository.",
- "connectGitlabDescription": "Collega GitLab nel browser, poi torna qui per scegliere un repository.",
- "couldNotLoadBitbucketRepositories": "Impossibile caricare i repository Bitbucket.",
- "couldNotLoadGithubRepositories": "Impossibile caricare i repository GitHub.",
- "couldNotLoadGitlabRepositories": "Impossibile caricare i repository GitLab.",
- "gitlabConnected": "GitLab collegato",
- "noRepositoriesVisibleBitbucket": "Nessun repository visibile. Controlla le autorizzazioni di accesso ai repository su Bitbucket, poi aggiorna l'elenco.",
- "noRepositoriesVisibleGitlab": "Nessun repository visibile. Controlla le autorizzazioni di accesso ai repository su GitLab, poi aggiorna l'elenco.",
- "openBitbucket": "Apri Bitbucket",
- "openGitlab": "Apri GitLab",
- "recentlyUsed": "Usati di recente",
"continueFrom": "Stai continuando la sessione {{title}}.",
"importingSession": "Importazione in corso…",
"cliCannotContinue": "Questa CLI non può continuare una sessione. Scegli Cloud Agent o un'altra CLI.",
- "importFailed": "Impossibile importare questa sessione.",
- "discardWithUploadsMessage": "Il tuo prompt e i file caricati non allegati a messaggi inviati verranno eliminati."
+ "importFailed": "Impossibile importare questa sessione."
},
"partRenderer": {
"updatedFileCount_one": "È stato aggiornato {{displayCount}} file.",
@@ -2326,162 +2336,11 @@
"installAttributionPromptTitle": "Consentire l'attribuzione dell'installazione?"
},
"prReview": {
+ "pullRequestUnavailable": "Pull request non disponibile",
+ "pullRequestUnavailableDescription": "Impossibile aprire questa PR. Potrebbe essere stata eliminata, il repository potrebbe essere privato oppure l'app Kilo per GitHub potrebbe non essere installata nel repository.",
"accessDeniedDescription": "Non hai il permesso di visualizzare questa pull request.",
- "checkConnection": "Verifica la connessione",
- "checks": {
- "checksCount": "{{displayCount}} controlli",
- "couldNotLoad": "Impossibile caricare i controlli.",
- "failed": "{{displayCount}} non superati",
- "noAccess": "Non hai accesso ai controlli di questo repository.",
- "noChecksReported": "Nessun controllo segnalato",
- "notAvailable": "I controlli non sono ancora disponibili. L'ultimo commit potrebbe non essere stato elaborato oppure l'app Kilo per GitHub potrebbe non essere installata nel repository di origine.",
- "openDetails": "Apri i dettagli di {{name}}",
- "passed": "{{displayCount}} superati",
- "pending": "{{displayCount}} in attesa",
- "retryChecks": "Riprova a caricare i controlli",
- "skipped": "{{displayCount}} saltati",
- "title": "Controlli",
- "viewOnGitHub": "Visualizza la PR su GitHub",
- "checkDetails": "dettagli del controllo"
- },
- "composer": {
- "addTitle": "Nuovo commento",
- "addToReview": "Aggiungi alla revisione",
- "comment": "Commenta",
- "commentBody": "Testo del commento",
- "commentBodyPlaceholder": "Il tuo commento",
- "commentNow": "Commenta ora",
- "discardMessage": "La tua bozza andrà persa.",
- "discardTitle": "Scartare il commento?",
- "editTitle": "Modifica del commento",
- "insertSuggestion": "Inserisci un suggerimento",
- "insertSuggestionA11y": "Inserisci una modifica suggerita al codice",
- "loadFailedTitle": "Impossibile caricare l'editor dei commenti.",
- "ok": "OK",
- "unavailableMessage": "Questo commento in attesa di invio è già stato eliminato o inviato.",
- "unavailableTitle": "Commento non disponibile",
- "bodyEmpty": "Il testo del commento non può essere vuoto.",
- "suggestionsOnlyAddedLines": "I suggerimenti si applicano solo alle righe aggiunte.",
- "tapDiffLineToSuggest": "Tocca una riga del confronto per attivare i suggerimenti."
- },
- "connect": {
- "checkFailedMessage": "Lo stato di accesso sarà disponibile al termine del caricamento.",
- "checkFailedTitle": "Impossibile verificare la connessione a GitHub.",
- "description": "Connetti il tuo account GitHub per revisionare le pull request dall'app.",
- "reconnectDescription": "L'autorizzazione a connetterti a GitHub è stata revocata. Riconnettiti per continuare a revisionare le pull request dall'app.",
- "reconnectTitle": "Riconnetti GitHub"
- },
- "connectionExpired": "La connessione a GitHub è scaduta.",
- "couldNotLoadPullRequest": "Impossibile caricare la pull request.",
- "couldNotOpenGitHubAppSettings": "Impossibile aprire le impostazioni dell'app GitHub.",
- "description": "Descrizione",
- "discussion": {
- "acceptTerms": "Accetta",
- "accessDeniedMessage": "Non hai il permesso di visualizzare la discussione di questa PR.",
- "addReaction": "Aggiungi una reazione",
- "block": "Blocca",
- "blockedUser": "{{login}} bloccato",
- "collapseThread": "Comprimi la discussione",
- "commentActions": "Azioni sul commento",
- "comment": "{{displayCount}} commenti",
- "comment_other": "{{displayCount}} commenti",
- "couldNotLoad": "Impossibile caricare la discussione.",
- "couldNotLoadMore": "Impossibile caricare altri commenti.",
- "loadMoreComments": "Carica altri commenti",
- "loading": "Caricamento della discussione",
- "moderation": {
- "block": {
- "retryable": "Impossibile bloccare questo utente. Controlla la connessione e riprova.",
- "terminal": "Questo utente non può essere bloccato."
- },
- "mute": {
- "retryable": "Impossibile silenziare questo utente. Controlla la connessione e riprova.",
- "terminal": "Questo utente non può essere silenziato."
- },
- "reportContent": {
- "retryable": "Impossibile segnalare questo commento. Controlla la connessione e riprova.",
- "terminal": "Questo commento non può essere segnalato."
- },
- "reportUser": {
- "retryable": "Impossibile segnalare questo utente. Controlla la connessione e riprova.",
- "terminal": "Questo utente non può essere segnalato."
- }
- },
- "moreLinesAbove": "… altre {{displayCount}} righe sopra.",
- "mute": "Silenzia",
- "mutedUser": "{{login}} silenziato",
- "noDiscussion": "Ancora nessuna discussione",
- "noDiscussionDescription": "Questa pull request non ha ancora discussioni di revisione né commenti generali.",
- "comment_one": "1 commento",
- "outdated": "Obsoleto",
- "quotedDiffSnippet": "Estratto del confronto citato",
- "reactionPill": "reazione {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "reazioni",
- "reaction_other": "reazioni",
- "reaction_one": "reazione",
- "replyBadRequest": "Impossibile pubblicare questa risposta. La discussione potrebbe essere stata modificata.",
- "replyBody": "Testo della risposta",
- "replyForbidden": "Non hai il permesso di rispondere a questa pull request.",
- "replyPlaceholder": "La tua risposta…",
- "reportContent": "Segnala il contenuto",
- "reportUser": "Segnala l'utente",
- "resolveThread": "Segna la discussione come risolta",
- "resolved": "Risolta",
- "retryLoadingMore": "Riprova a caricare altri commenti",
- "reviewFiles": "Revisiona i file",
- "startedRelative": " · iniziata {{relative}}",
- "submitReply": "Invia la risposta",
- "termsAcceptRetry": "Impossibile accettare i termini di servizio. Controlla la connessione e riprova.",
- "termsCopy": "Devi avere almeno 13 anni per pubblicare.",
- "termsTitle": "Termini di servizio",
- "threadAccessibilityLabel": "Discussione {{anchorLabel}}",
- "unavailable": "La discussione non è disponibile.",
- "unavailableMessage": "Questa pull request potrebbe essere stata rimossa.",
- "unresolveThread": "Riapri la discussione",
- "viewTerms": "Visualizza i termini",
- "termsAcceptRequired": "Devi accettare i termini di servizio per pubblicare.",
- "termsCheckRetryCopy": "Impossibile verificare i termini di servizio. Controlla la connessione e riprova.",
- "termsOutdatedCopy": "I termini di servizio sono stati aggiornati. Riapri questa schermata per accettare la versione più recente.",
- "comment_many": "{{displayCount}} commenti",
- "reaction_many": "reazioni",
- "reactions": {
- "thumbsUp": "Pollice in su",
- "thumbsDown": "Pollice in giù",
- "laugh": "Risata",
- "hooray": "Evviva",
- "confused": "Confuso",
- "heart": "Cuore",
- "rocket": "Razzo",
- "eyes": "Occhi"
- },
- "anchor": {
- "fileCommentOnPath": "Commento sul file {{path}}",
- "fileComment": "Commento sul file",
- "outdatedOnPathLines": "Non più attuale: {{path}} {{lines}}",
- "outdatedOnLines": "Non più attuale: {{lines}}",
- "outdatedOnPath": "Non più attuale: {{path}}"
- },
- "deletedUser": "utente eliminato"
- },
- "entry": {
- "clearLink": "Cancella il collegamento alla pull request",
- "couldNotLoad": "Impossibile caricare i dati.",
- "eyebrow": "Apri una pull request tramite URL.",
- "noRecentPrs": "Nessuna PR recente",
- "noRecentPrsDescription": "Incolla qui sopra il collegamento a una PR per iniziare una revisione. La PR comparirà qui la prossima volta.",
- "open": "Apri",
- "pasteLink": "Incolla il collegamento alla pull request",
- "pastePrLink": "Incolla il collegamento a una PR",
- "removeFromRecentsMessage": "Questa pull request verrà rimossa dall'elenco delle PR recenti.",
- "removeFromRecentsTitle": "Rimuovere dall'elenco delle PR recenti?",
- "removeRecentAccessibility": "Rimuovi {{repo}} dall'elenco delle PR recenti",
- "urlAccessibility": "URL della pull request su GitHub"
- },
- "eventChips": {
- "comment": "Commenta",
- "label": "Tipo di revisione",
- "requestChanges": "Richiedi modifiche"
- },
+ "noFilesChanged": "Nessun file modificato",
+ "noFilesChangedDescription": "Questa pull request non contiene modifiche ai file.",
"fileList": {
"filesList": "Elenco file",
"filesViewed": "File · {{viewed}} su {{total}} visualizzati",
@@ -2526,7 +2385,6 @@
"commentOnSelectedLines": "Commenta le righe selezionate",
"finishReview": "Concludi la revisione"
},
- "headLine": "{{counts}} · ultimo commit {{sha}}",
"hunkRows": {
"contextUnavailable": "Il contesto non è disponibile per questo riferimento.",
"expandAll": "Mostra tutto",
@@ -2561,56 +2419,68 @@
"fileLoadedCount_many": "{{displayCount}} file caricati",
"fileLoadedOfTotalCount_many": "{{displayCount}} file caricati su {{total}}"
},
- "inbox": {
- "couldNotLoad": "Impossibile caricare la posta in arrivo.",
- "loading": "Caricamento della posta in arrivo",
- "noReviewRequests": "Nessuna richiesta di revisione",
- "noReviewRequestsDescription": "Qui trovi le pull request in attesa della tua revisione. Puoi comunque incollare qui sopra il collegamento a qualsiasi PR.",
- "title": "Posta in arrivo"
+ "sideBySide": {
+ "emptyDiffColumn": "colonna del confronto vuota",
+ "emptyDiffRow": "Riga del confronto vuota",
+ "newOnly": "Solo nella nuova versione: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ nessun ritorno a capo alla fine del file",
+ "oldNew": "Prima: {{old}} | Dopo: {{new}}",
+ "oldOnly": "Solo nella versione precedente: {{text}}"
+ },
+ "connectionExpired": "La connessione a GitHub è scaduta.",
+ "capabilities": {
+ "banner": {
+ "title": "Non disponibile su questo provider",
+ "accessibility": "Non disponibile su questo provider: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Installa l'app Kilo per GitHub",
"merge": {
- "autoMergeDescription": "GitHub unirà automaticamente questa pull request quando tutti i controlli obbligatori saranno superati (metodo: {{method}}).",
+ "merge": "Unione",
+ "mergeNow": "Unisci ora",
+ "mergePullRequest": "Unione della pull request",
+ "mergeTermTitle": "Unisci {{term}}",
+ "enableAutoMerge": "Attiva l'unione automatica",
+ "disableAutoMerge": "Disattiva l'unione automatica",
"autoMergeOn": "Unione automatica attiva",
- "blockedTitle": "Motivi che impediscono l'unione",
- "cannotMerge": "Questa pull request non può essere unita così com'è.",
+ "autoMergeDescription": "GitHub unirà automaticamente questa pull request quando tutti i controlli obbligatori saranno superati (metodo: {{method}}).",
"checking": "Verifica dei requisiti per l'unione…",
+ "couldNotDetermine": "Impossibile verificare se la pull request può essere unita.",
+ "refreshMergeability": "Verifica di nuovo i requisiti per l'unione",
+ "blockedTitle": "Motivi che impediscono l'unione",
+ "updateBranch": "Aggiorna il branch",
+ "updateBranchFromBase": "Aggiorna il branch con le modifiche del branch di base",
+ "methodLabel": "Metodo",
+ "commitTitle": "Titolo del commit",
"commitMessage": "Messaggio di commit",
"commitMessagePlaceholder": "Descrizione facoltativa del commit di unione",
- "commitTitle": "Titolo del commit",
- "confirmMessage": "Le tue modifiche verranno unite al branch di base.",
- "confirmTitle": "Unire la pull request?",
- "couldNotDetermine": "Impossibile verificare se la pull request può essere unita.",
- "couldNotMerge": "Impossibile unire la pull request.",
"deleteBranch": "Elimina il branch",
"deleteBranchAfterMerge": "Elimina il branch dopo l'unione",
- "disableAutoMerge": "Disattiva l'unione automatica",
- "enableAutoMerge": "Attiva l'unione automatica",
- "enableAutoMergeConfirmMessage": "GitHub unirà automaticamente questa pull request quando tutti i controlli obbligatori saranno superati.",
+ "noEnabledMethods": "Nessun metodo di unione è attivo in questo repository. Chiedi a un amministratore del repository di attivare l'unione con commit, l'accorpamento o il riallineamento dei commit.",
+ "confirmTitle": "Unire la pull request?",
+ "confirmTitleTerm": "Unire {{term}}?",
+ "confirmMessage": "Le tue modifiche verranno unite al branch di base.",
"enableAutoMergeConfirmTitle": "Attivare l'unione automatica?",
+ "enableAutoMergeConfirmMessage": "GitHub unirà automaticamente questa pull request quando tutti i controlli obbligatori saranno superati.",
+ "enableAutoMergeConfirmMessageTerm": "Una volta completata la pipeline, {{term}} si unirà automaticamente.",
+ "enableAutoMergeDescriptionTerm": "GitLab unirà {{term}} automaticamente una volta completata la pipeline.",
"forbidden": "Non hai il permesso di unire questa pull request.",
- "loadFailedTitle": "Impossibile caricare le opzioni di unione.",
- "merge": "Unione",
- "mergeNow": "Unisci ora",
- "mergePullRequest": "Unione della pull request",
- "methodLabel": "Metodo",
+ "cannotMerge": "Questa pull request non può essere unita così com'è.",
+ "couldNotMerge": "Impossibile unire la pull request.",
"methods": {
"merge": "Unione",
"rebase": "Riallineamento",
"squash": "Accorpamento"
},
- "noEnabledMethods": "Nessun metodo di unione è attivo in questo repository. Chiedi a un amministratore del repository di attivare l'unione con commit, l'accorpamento o il riallineamento dei commit.",
+ "terminal": {
+ "alreadyMerged": "Già unita",
+ "closed": "Questa pull request è chiusa",
+ "closedMergeRequest": "Questo merge request è chiuso"
+ },
"partialSuccessBanner": {
"accessibility": "Pull request unita. Impossibile eliminare il branch: {{reason}}",
"body": "Impossibile eliminare il branch: {{reason}}."
},
- "refreshMergeability": "Verifica di nuovo i requisiti per l'unione",
- "terminal": {
- "alreadyMerged": "Già unita",
- "closed": "Questa pull request è chiusa"
- },
- "updateBranch": "Aggiorna il branch",
- "updateBranchFromBase": "Aggiorna il branch con le modifiche del branch di base",
+ "loadFailedTitle": "Impossibile caricare le opzioni di unione.",
"blocked": {
"unknownStateTitle": "GitHub non ha confermato che l'unione è possibile",
"unknownStateDetail": "Riprova ad aggiornare la panoramica tra poco.",
@@ -2630,6 +2500,19 @@
"notMergeableTitle": "Questa pull request non può ancora essere unita",
"notMergeableDetail": "GitHub ha segnalato questo stato per l'unione: {{state}}."
},
+ "restrictions": {
+ "title": "Restrizioni di unione",
+ "approvalsRequired_one": "È richiesta {{displayCount}} approvazione",
+ "approvalsRequired_other": "Sono richieste {{displayCount}} approvazioni",
+ "pipelineMustSucceed": "La pipeline deve concludersi con successo prima dell'unione.",
+ "approvalsRequired_many": "Sono richieste {{displayCount}} approvazioni"
+ },
+ "providerBlocked": {
+ "failingPipeline": "La pipeline è in errore sull'ultimo commit.",
+ "pendingPipeline": "La pipeline è ancora in esecuzione sull'ultimo commit.",
+ "permission": "Non hai il permesso di unire {{term}}.",
+ "draft": "Cambia lo stato di {{term}} in pronto per la revisione prima di unire."
+ },
"methodLabels": {
"merge": "Crea un commit di unione",
"squash": "Accorpa e unisci",
@@ -2641,9 +2524,207 @@
"rebase": "Riapplica tutti i commit di questo branch sul branch di base senza creare un commit di unione."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Discussione {{anchorLabel}}",
+ "collapseThread": "Comprimi la discussione",
+ "resolveThread": "Segna la discussione come risolta",
+ "unresolveThread": "Riapri la discussione",
+ "resolved": "Risolta",
+ "outdated": "Obsoleto",
+ "comment_one": "1 commento",
+ "comment": "{{displayCount}} commenti",
+ "comment_other": "{{displayCount}} commenti",
+ "startedRelative": " · iniziata {{relative}}",
+ "couldNotLoadMore": "Impossibile caricare altri commenti.",
+ "retryLoadingMore": "Riprova a caricare altri commenti",
+ "loadMoreComments": "Carica altri commenti",
+ "addReaction": "Aggiungi una reazione",
+ "reactionPill": "reazione {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "reazione",
+ "reaction": "reazioni",
+ "reaction_other": "reazioni",
+ "commentActions": "Azioni sul commento",
+ "reportContent": "Segnala il contenuto",
+ "reportUser": "Segnala l'utente",
+ "mute": "Silenzia",
+ "block": "Blocca",
+ "blockedUser": "{{login}} bloccato",
+ "mutedUser": "{{login}} silenziato",
+ "replyPlaceholder": "La tua risposta…",
+ "replyBody": "Testo della risposta",
+ "submitReply": "Invia la risposta",
+ "termsTitle": "Termini di servizio",
+ "termsCopy": "Devi avere almeno 13 anni per pubblicare.",
+ "termsAcceptRetry": "Impossibile accettare i termini di servizio. Controlla la connessione e riprova.",
+ "viewTerms": "Visualizza i termini",
+ "acceptTerms": "Accetta",
+ "replyBadRequest": "Impossibile pubblicare questa risposta. La discussione potrebbe essere stata modificata.",
+ "replyForbidden": "Non hai il permesso di rispondere a questa pull request.",
+ "replyForbiddenTerm": "Non hai il permesso di rispondere a {{term}}.",
+ "moderation": {
+ "block": {
+ "retryable": "Impossibile bloccare questo utente. Controlla la connessione e riprova.",
+ "terminal": "Questo utente non può essere bloccato."
+ },
+ "mute": {
+ "retryable": "Impossibile silenziare questo utente. Controlla la connessione e riprova.",
+ "terminal": "Questo utente non può essere silenziato."
+ },
+ "reportContent": {
+ "retryable": "Impossibile segnalare questo commento. Controlla la connessione e riprova.",
+ "terminal": "Questo commento non può essere segnalato."
+ },
+ "reportUser": {
+ "retryable": "Impossibile segnalare questo utente. Controlla la connessione e riprova.",
+ "terminal": "Questo utente non può essere segnalato."
+ }
+ },
+ "accessDeniedMessage": "Non hai il permesso di visualizzare la discussione di questa PR.",
+ "unavailable": "La discussione non è disponibile.",
+ "unavailableMessage": "Questa pull request potrebbe essere stata rimossa.",
+ "couldNotLoad": "Impossibile caricare la discussione.",
+ "loading": "Caricamento della discussione",
+ "noDiscussion": "Ancora nessuna discussione",
+ "noDiscussionDescription": "Questa pull request non ha ancora discussioni di revisione né commenti generali.",
+ "reviewFiles": "Revisiona i file",
+ "quotedDiffSnippet": "Estratto del confronto citato",
+ "moreLinesAbove": "… altre {{displayCount}} righe sopra.",
+ "termsAcceptRequired": "Devi accettare i termini di servizio per pubblicare.",
+ "termsOutdatedCopy": "I termini di servizio sono stati aggiornati. Riapri questa schermata per accettare la versione più recente.",
+ "termsCheckRetryCopy": "Impossibile verificare i termini di servizio. Controlla la connessione e riprova.",
+ "reactions": {
+ "thumbsUp": "Pollice in su",
+ "thumbsDown": "Pollice in giù",
+ "laugh": "Risata",
+ "hooray": "Evviva",
+ "confused": "Confuso",
+ "heart": "Cuore",
+ "rocket": "Razzo",
+ "eyes": "Occhi"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Commento sul file {{path}}",
+ "fileComment": "Commento sul file",
+ "outdatedOnPathLines": "Non più attuale: {{path}} {{lines}}",
+ "outdatedOnLines": "Non più attuale: {{lines}}",
+ "outdatedOnPath": "Non più attuale: {{path}}"
+ },
+ "deletedUser": "utente eliminato",
+ "comment_many": "{{displayCount}} commenti",
+ "reaction_many": "reazioni"
+ },
+ "couldNotOpenGitHubAppSettings": "Impossibile aprire le impostazioni dell'app GitHub.",
+ "installKiloGitHubApp": "Installa l'app Kilo per GitHub",
+ "checkConnection": "Verifica la connessione",
+ "couldNotLoadPullRequest": "Impossibile caricare la pull request.",
+ "description": "Descrizione",
"noDescriptionProvided": "Non è stata fornita alcuna descrizione.",
- "noFilesChanged": "Nessun file modificato",
- "noFilesChangedDescription": "Questa pull request non contiene modifiche ai file.",
+ "review": "Revisione",
+ "reviewPullRequest": "Revisiona la pull request",
+ "headLine": "{{counts}} · ultimo commit {{sha}}",
+ "entry": {
+ "eyebrow": "Apri una pull request o una merge request tramite URL",
+ "pastePrLink": "Incolla il collegamento a una pull request o merge request",
+ "noRecentPrs": "Nessuna revisione recente",
+ "noRecentPrsDescription": "Incolla qui sopra un collegamento per iniziare una revisione — la prossima volta comparirà qui.",
+ "couldNotLoad": "Impossibile caricare i dati.",
+ "removeFromRecentsTitle": "Rimuovere dall'elenco delle PR recenti?",
+ "removeFromRecentsMessage": "Questa revisione verrà rimossa dall'elenco delle recenti.",
+ "removeRecentAccessibility": "Rimuovi {{repo}} dall'elenco delle PR recenti",
+ "urlAccessibility": "Inserisci l'URL di una pull request o merge request",
+ "urlPlaceholder": "URL di pull request o merge request",
+ "openAccessibility": "Apri una pull request o un merge request",
+ "clearLink": "Cancella il collegamento",
+ "pasteLink": "Incolla il collegamento alla pull request o merge request",
+ "open": "Apri"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} controlli",
+ "couldNotLoad": "Impossibile caricare i controlli.",
+ "failed": "{{displayCount}} non superati",
+ "noAccess": "Non hai accesso ai controlli di questo repository.",
+ "noChecksReported": "Nessun controllo segnalato",
+ "notAvailable": "I controlli non sono ancora disponibili. L'ultimo commit potrebbe non essere stato elaborato oppure l'app Kilo per GitHub potrebbe non essere installata nel repository di origine.",
+ "openDetails": "Apri i dettagli di {{name}}",
+ "passed": "{{displayCount}} superati",
+ "pending": "{{displayCount}} in attesa",
+ "retryChecks": "Riprova a caricare i controlli",
+ "skipped": "{{displayCount}} saltati",
+ "title": "Controlli",
+ "viewOnGitHub": "Visualizza la PR su GitHub",
+ "checkDetails": "dettagli del controllo"
+ },
+ "inbox": {
+ "couldNotLoad": "Impossibile caricare la posta in arrivo.",
+ "loading": "Caricamento della posta in arrivo",
+ "noReviewRequests": "Nessuna richiesta di revisione",
+ "noReviewRequestsDescription": "Qui trovi le pull request in attesa della tua revisione. Puoi comunque incollare qui sopra il collegamento a qualsiasi PR.",
+ "title": "Posta in arrivo"
+ },
+ "composer": {
+ "addTitle": "Nuovo commento",
+ "addToReview": "Aggiungi alla revisione",
+ "comment": "Commenta",
+ "commentBody": "Testo del commento",
+ "commentBodyPlaceholder": "Il tuo commento",
+ "commentNow": "Commenta ora",
+ "discardMessage": "La tua bozza andrà persa.",
+ "discardTitle": "Scartare il commento?",
+ "editTitle": "Modifica del commento",
+ "insertSuggestion": "Inserisci un suggerimento",
+ "insertSuggestionA11y": "Inserisci una modifica suggerita al codice",
+ "loadFailedTitle": "Impossibile caricare l'editor dei commenti.",
+ "ok": "OK",
+ "unavailableMessage": "Questo commento in attesa di invio è già stato eliminato o inviato.",
+ "unavailableTitle": "Commento non disponibile",
+ "bodyEmpty": "Il testo del commento non può essere vuoto.",
+ "suggestionsOnlyAddedLines": "I suggerimenti si applicano solo alle righe aggiunte.",
+ "tapDiffLineToSuggest": "Tocca una riga del confronto per attivare i suggerimenti."
+ },
+ "connect": {
+ "checkFailedTitle": "Impossibile verificare la connessione a GitHub.",
+ "checkFailedMessage": "Lo stato di accesso sarà disponibile al termine del caricamento.",
+ "checkFailedTitleGitLab": "Impossibile verificare la connessione a GitLab.",
+ "checkFailedTitleBitbucket": "Impossibile verificare la connessione a Bitbucket.",
+ "providerCheckFailedMessage": "Lo stato della connessione sarà disponibile al termine del caricamento.",
+ "reconnectTitle": "Riconnetti GitHub",
+ "reconnectDescription": "L'autorizzazione a connetterti a GitHub è stata revocata. Riconnettiti per continuare a revisionare le pull request dall'app.",
+ "description": "Connetti il tuo account GitHub per revisionare le pull request dall'app.",
+ "gitlabDescription": "Connetti il tuo account GitLab per revisionare le merge request dall'app.",
+ "bitbucketDescription": "Connetti Bitbucket a questa organizzazione per revisionare le pull request dall'app.",
+ "bitbucketOrgOnlyDescription": "Seleziona un'organizzazione nel tuo profilo per revisionarne le pull request di Bitbucket."
+ },
+ "screen": {
+ "shareA11y": "Condividi la pull request",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Questo commento verrà rimosso dai commenti in attesa di invio della revisione.",
+ "deletePendingTitle": "Eliminare il commento in attesa di invio?",
+ "loadFailedTitle": "Impossibile caricare la schermata di invio della revisione.",
+ "pendingComment": "commenti da inviare",
+ "pendingComment_other": "commenti da inviare",
+ "pendingComment_one": "commento in attesa di invio",
+ "summaryOptional": "Riepilogo (facoltativo)",
+ "partialPostedMessage": "Commenti pubblicati: {{displayFreshCount}}. I commenti riferiti a un commit precedente restano in attesa di invio: {{displayStaleCount}}.",
+ "submitCountOfTotal": "Invia {{displayFreshCount}} commenti su {{displayTotalCount}}",
+ "submitReview": "Invia revisione",
+ "pendingComment_many": "commenti in sospeso",
+ "blockedRequestChanges": "Aggiungi un riepilogo o almeno un commento per richiedere modifiche.",
+ "blockedComment": "Aggiungi un riepilogo o almeno un commento per inviare una revisione con commenti."
+ },
+ "reconnectNotice": {
+ "title": "La connessione a GitHub è scaduta.",
+ "message": "La tua connessione a GitHub non è più valida. Ricontrolla la connessione: ti verrà chiesto di riconnetterti se necessario.",
+ "gitlabTitle": "La connessione a GitLab è scaduta.",
+ "bitbucketTitle": "La connessione a Bitbucket è scaduta.",
+ "providerMessage": "La tua connessione a {{provider}} non è più valida. Ricontrolla la connessione: ti verrà chiesto di riconnetterti se necessario."
+ },
+ "eventChips": {
+ "comment": "Commenta",
+ "label": "Tipo di revisione",
+ "requestChanges": "Richiedi modifiche"
+ },
"overview": {
"commit": "commit",
"commit_other": "commit",
@@ -2686,40 +2767,25 @@
"summaryA11y": "Riepilogo della revisione",
"summaryPlaceholder": "Riepilogo facoltativo della revisione"
},
- "pullRequestUnavailable": "Pull request non disponibile",
- "pullRequestUnavailableDescription": "Impossibile aprire questa PR. Potrebbe essere stata eliminata, il repository potrebbe essere privato oppure l'app Kilo per GitHub potrebbe non essere installata nel repository.",
- "reconnectNotice": {
- "message": "La tua connessione a GitHub non è più valida. Ricontrolla la connessione: ti verrà chiesto di riconnetterti se necessario.",
- "title": "La connessione a GitHub è scaduta."
- },
- "review": "Revisione",
- "reviewPullRequest": "Revisiona la pull request",
- "screen": {
- "shareA11y": "Condividi la pull request",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "colonna del confronto vuota",
- "emptyDiffRow": "Riga del confronto vuota",
- "newOnly": "Solo nella nuova versione: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ nessun ritorno a capo alla fine del file",
- "oldNew": "Prima: {{old}} | Dopo: {{new}}",
- "oldOnly": "Solo nella versione precedente: {{text}}"
+ "tabs": {
+ "discussion": "Discussione",
+ "files": "Documenti",
+ "overview": "Panoramica"
},
- "submit": {
- "deletePendingMessage": "Questo commento verrà rimosso dai commenti in attesa di invio della revisione.",
- "deletePendingTitle": "Eliminare il commento in attesa di invio?",
- "loadFailedTitle": "Impossibile caricare la schermata di invio della revisione.",
- "pendingComment": "commenti da inviare",
- "pendingComment_other": "commenti da inviare",
- "pendingComment_one": "commento in attesa di invio",
- "summaryOptional": "Riepilogo (facoltativo)",
- "partialPostedMessage": "Commenti pubblicati: {{displayFreshCount}}. I commenti riferiti a un commit precedente restano in attesa di invio: {{displayStaleCount}}.",
- "submitCountOfTotal": "Invia {{displayFreshCount}} commenti su {{displayTotalCount}}",
- "submitReview": "Invia revisione",
- "pendingComment_many": "commenti in sospeso",
- "blockedRequestChanges": "Aggiungi un riepilogo o almeno un commento per richiedere modifiche.",
- "blockedComment": "Aggiungi un riepilogo o almeno un commento per inviare una revisione con commenti."
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Condividi il merge request",
+ "viewOnProvider": "Visualizza su {{provider}}",
+ "mergeRequestUnavailable": "Merge request non disponibile",
+ "unavailableDescription": "Potrebbe essere stato eliminato, oppure non hai accesso.",
+ "accessDeniedMergeRequest": "Non hai il permesso di visualizzare questo merge request.",
+ "couldNotLoadMergeRequest": "Impossibile caricare il merge request.",
+ "discussionAccessDenied": "Non hai il permesso di visualizzare la discussione di questo merge request.",
+ "discussionUnavailableMessage": "Questo merge request potrebbe essere stato rimosso.",
+ "noDiscussionDescription": "Questo merge request non ha ancora discussioni di revisione né commenti generali.",
+ "noFilesChangedDescription": "Questo merge request non contiene modifiche ai file."
},
"fileStatus": {
"changed": "Modificato",
@@ -2727,11 +2793,6 @@
"modified": "Modificato",
"renamed": "Rinominato"
},
- "tabs": {
- "discussion": "Discussione",
- "files": "Documenti",
- "overview": "Panoramica"
- },
"diff": {
"selectedTapToChange": "Selezione: {{label}}, tocca per modificarla",
"tapToComment": "{{label}}, tocca per commentare",
@@ -2742,7 +2803,7 @@
"emptyLine": "(vuoto)"
},
"linkPasteClipboardEmpty": "Gli appunti sono vuoti.",
- "linkPasteNotAPullRequest": "Questo non è un collegamento a una pull request di GitHub.",
+ "linkPasteNotAPullRequest": "Non è un collegamento a una pull request o merge request",
"announce": {
"commentPosted": "Commento pubblicato",
"reviewSubmitted": "Revisione inviata",
@@ -2751,6 +2812,7 @@
"mutationError": {
"commentNotPosted": "Questo commento non può essere pubblicato. La riga selezionata potrebbe essere cambiata oppure la PR potrebbe essere stata aggiornata.",
"reviewNotSubmitted": "Impossibile inviare questa revisione così com'è. La PR potrebbe essere stata modificata oppure potresti esserne l'autore: non puoi revisionare le tue pull request.",
+ "reviewNotSubmittedTerm": "Impossibile inviare questa revisione così com'è. {{term}} potrebbe essere cambiato, oppure non puoi revisionare il tuo {{term}}.",
"couldNotPostComment": "Impossibile pubblicare il commento.",
"couldNotSubmitReview": "Impossibile inviare la revisione. Controlla la connessione e riprova."
},
@@ -2758,6 +2820,7 @@
"couldNotReply": "Non è stato possibile inviare la risposta.",
"couldNotCompleteAction": "Impossibile completare questa azione.",
"mergeResultDefaultError": "GitHub non ha completato l'unione.",
+ "mergeResultNotCompleted": "Unione di {{term}} non completata. Verifica lo stato e riprova.",
"ambiguous": "Impossibile confermare l'esito dell'operazione. Controlla la PR prima di riprovare.",
"persistenceFailed": "Impossibile registrare questa azione. Riprova più tardi.",
"forbidden": "Non hai l'autorizzazione per questa operazione."
diff --git a/apps/mobile/src/i18n/locales/ja.json b/apps/mobile/src/i18n/locales/ja.json
index c868fefbcf..cfde8481e2 100644
--- a/apps/mobile/src/i18n/locales/ja.json
+++ b/apps/mobile/src/i18n/locales/ja.json
@@ -4,6 +4,8 @@
"done": "完了",
"retry": "再試行",
"tryAgain": "再試行",
+ "continue": "続行",
+ "notNow": "後で",
"language": "言語",
"device": "デバイス",
"share": "{{title}}を共有",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "クリップボードにコピーできませんでした。",
"required": "必須",
"error": "エラー: {{error}}",
- "notNow": "後で",
- "continue": "続行",
"back": "戻る",
"somethingWentWrong": "問題が発生しました。",
"couldNotOpen": "{{label}}を開けませんでした。",
@@ -36,6 +36,7 @@
"cost": "コスト",
"discard": "破棄",
"findings": "検出事項",
+ "mergeRequest": "マージリクエスト",
"notConnected": "未連携",
"notifications": "通知",
"pullRequest": "プルリクエスト",
@@ -1557,11 +1558,31 @@
"retryConnection": "接続を再試行"
},
"newSession": {
+ "recentlyUsed": "最近使用した項目",
+ "couldNotLoadGithubRepositories": "GitHubのリポジトリを読み込めませんでした。",
+ "couldNotLoadGitlabRepositories": "GitLabのリポジトリを読み込めませんでした。",
+ "couldNotLoadBitbucketRepositories": "Bitbucketのリポジトリを読み込めませんでした。",
"connectGithubDescription": "ブラウザーでGitHubと連携し、この画面に戻ってリポジトリを選択してください。",
+ "connectGitlabDescription": "ブラウザーでGitLabと連携し、この画面に戻ってリポジトリを選択してください。",
+ "connectBitbucketDescription": "ブラウザーでBitbucketと連携し、この画面に戻ってリポジトリを選択してください。",
"openGithub": "GitHubを開く",
+ "openGitlab": "GitLabを開く",
+ "openBitbucket": "Bitbucketを開く",
"refreshRepositories": "リポジトリを更新",
"githubConnected": "GitHubと連携済み",
+ "gitlabConnected": "GitLabと連携済み",
"noRepositoriesVisible": "表示できるリポジトリがありません。KiloのGitHubアプリがリポジトリにアクセスできるか確認してから、一覧を更新してください。",
+ "noRepositoriesVisibleGitlab": "表示できるリポジトリがありません。GitLabのリポジトリへのアクセス権を確認してから、一覧を更新してください。",
+ "noRepositoriesVisibleBitbucket": "表示できるリポジトリがありません。Bitbucketのリポジトリへのアクセス権を確認してから、一覧を更新してください。",
+ "bitbucketOrganizationsOnly": "Bitbucketは組織でのみ利用できます。",
+ "branchPickerTitle": "ブランチを選択",
+ "branchDefault": "デフォルト",
+ "branchAccessibility": "ブランチ: {{label}}",
+ "branchLoading": "ブランチを読み込み中",
+ "branchLoadError": "ブランチを読み込めませんでした",
+ "branchUnavailable": "このリポジトリではブランチが利用できません。プロバイダーでのアクセスを確認し、別のリポジトリを選択してください。",
+ "branchEmpty": "利用可能なブランチがありません",
+ "branchPlaceholder": "ブランチを選択",
"runOnWithTarget": "実行先:{{target}}",
"environment": "環境",
"couldNotLoadEnvironment": "環境を読み込めませんでした。",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "保留中のセッションを読み取れませんでした。もう一度お試しください。",
"failedToCreate": "セッションを作成できませんでした。",
"couldNotRefreshRepositories": "リポジトリを更新できませんでした。もう一度お試しください。",
- "discardDraftMessage": "入力したプロンプトが削除されます。",
"discardDraftTitle": "下書きを破棄しますか?",
+ "discardDraftMessage": "入力したプロンプトが削除されます。",
+ "discardWithUploadsMessage": "プロンプトと、送信済みメッセージに添付されていないアップロード済みファイルは削除されます。",
"discardFailed": "下書きを破棄できませんでした。もう一度お試しください。",
"remoteHint": "ローカルのkiloプロセスを操作するには、コンピューターで`kilo remote`を実行するか、実行中のCLIセッションで`/remote`を実行してください。",
- "connectBitbucketDescription": "ブラウザーでBitbucketと連携し、この画面に戻ってリポジトリを選択してください。",
- "connectGitlabDescription": "ブラウザーでGitLabと連携し、この画面に戻ってリポジトリを選択してください。",
- "couldNotLoadBitbucketRepositories": "Bitbucketのリポジトリを読み込めませんでした。",
- "couldNotLoadGithubRepositories": "GitHubのリポジトリを読み込めませんでした。",
- "couldNotLoadGitlabRepositories": "GitLabのリポジトリを読み込めませんでした。",
- "gitlabConnected": "GitLabと連携済み",
- "noRepositoriesVisibleBitbucket": "表示できるリポジトリがありません。Bitbucketのリポジトリへのアクセス権を確認してから、一覧を更新してください。",
- "noRepositoriesVisibleGitlab": "表示できるリポジトリがありません。GitLabのリポジトリへのアクセス権を確認してから、一覧を更新してください。",
- "openBitbucket": "Bitbucketを開く",
- "openGitlab": "GitLabを開く",
- "recentlyUsed": "最近使用した項目",
- "cliCannotContinue": "このCLIではセッションを続行できません。Cloud Agentまたは別のCLIを選択してください。",
"continueFrom": "{{title}}を続行しています。",
- "importFailed": "このセッションをインポートできませんでした。",
"importingSession": "セッションをインポート中",
- "discardWithUploadsMessage": "プロンプトと、送信済みメッセージに添付されていないアップロード済みファイルは削除されます。"
+ "cliCannotContinue": "このCLIではセッションを続行できません。Cloud Agentまたは別のCLIを選択してください。",
+ "importFailed": "このセッションをインポートできませんでした。"
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}}件のファイルを更新しました。",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "インストール元の特定を許可しますか?"
},
"prReview": {
+ "pullRequestUnavailable": "プルリクエストを開けません",
+ "pullRequestUnavailableDescription": "このPRを開けません。PRが削除されたか、リポジトリが非公開になっているか、リポジトリにKilo GitHub Appがインストールされていない可能性があります。",
"accessDeniedDescription": "このプルリクエストを表示する権限がありません。",
- "checkConnection": "接続を確認",
- "checks": {
- "checksCount": "{{displayCount}}件のチェック",
- "couldNotLoad": "チェックを読み込めませんでした。",
- "failed": "{{displayCount}}件失敗",
- "noAccess": "このリポジトリのチェックにアクセスできません。",
- "noChecksReported": "チェックは報告されていません",
- "notAvailable": "チェックの情報はまだ表示できません。マージ元ブランチの先頭コミットが未処理か、マージ元リポジトリにKilo GitHub Appがインストールされていない可能性があります。",
- "openDetails": "{{name}}の詳細を開く",
- "passed": "{{displayCount}}件成功",
- "pending": "{{displayCount}}件待機中",
- "retryChecks": "チェックを再試行",
- "skipped": "{{displayCount}}件スキップ",
- "title": "チェック",
- "viewOnGitHub": "GitHubでPRを表示",
- "checkDetails": "チェックの詳細"
- },
- "composer": {
- "addTitle": "コメントの追加",
- "addToReview": "レビューに追加",
- "comment": "コメント",
- "commentBody": "コメントの本文",
- "commentBodyPlaceholder": "コメントを入力",
- "commentNow": "今すぐコメント",
- "discardMessage": "下書きは保存されません。",
- "discardTitle": "コメントを破棄しますか?",
- "editTitle": "コメントの編集",
- "insertSuggestion": "修正提案を挿入",
- "insertSuggestionA11y": "コードの修正提案を挿入",
- "loadFailedTitle": "コメントの入力画面を読み込めませんでした。",
- "ok": "OK",
- "unavailableMessage": "この未送信のコメントは、すでに削除または送信されています。",
- "unavailableTitle": "コメントが見つかりません",
- "bodyEmpty": "コメントの本文を入力してください。",
- "suggestionsOnlyAddedLines": "修正提案は追加された行にのみ適用できます。",
- "tapDiffLineToSuggest": "修正提案を入力するには、差分の行をタップしてください。"
- },
- "connect": {
- "checkFailedMessage": "読み込みが完了するまで、サインイン状態を確認できません。",
- "checkFailedTitle": "GitHubとの接続を確認できませんでした。",
- "description": "モバイルでプルリクエストをレビューするには、GitHubアカウントを接続してください。",
- "reconnectDescription": "GitHubとの接続が解除されました。モバイルでプルリクエストのレビューを続けるには、再接続してください。",
- "reconnectTitle": "GitHubに再接続"
- },
- "connectionExpired": "GitHubとの連携が期限切れになりました。",
- "couldNotLoadPullRequest": "プルリクエストを読み込めませんでした。",
- "couldNotOpenGitHubAppSettings": "GitHub Appの設定を開けませんでした。",
- "description": "説明",
- "discussion": {
- "acceptTerms": "同意",
- "accessDeniedMessage": "このPRのディスカッションを表示する権限がありません。",
- "addReaction": "リアクションを追加",
- "block": "ブロック",
- "blockedUser": "{{login}}をブロックしました",
- "collapseThread": "スレッドを折りたたむ",
- "commentActions": "コメントの操作",
- "comment": "{{displayCount}}件のコメント",
- "comment_other": "{{displayCount}}件のコメント",
- "couldNotLoad": "ディスカッションを読み込めませんでした。",
- "couldNotLoadMore": "追加のコメントを読み込めませんでした。",
- "loadMoreComments": "さらにコメントを読み込む",
- "loading": "ディスカッションを読み込み中",
- "moderation": {
- "block": {
- "retryable": "このユーザーをブロックできませんでした。接続を確認して、もう一度お試しください。",
- "terminal": "このユーザーはブロックできません。"
- },
- "mute": {
- "retryable": "このユーザーをミュートできませんでした。接続を確認して、もう一度お試しください。",
- "terminal": "このユーザーはミュートできません。"
- },
- "reportContent": {
- "retryable": "このコメントを報告できませんでした。接続を確認して、もう一度お試しください。",
- "terminal": "このコメントは報告できません。"
- },
- "reportUser": {
- "retryable": "このユーザーを報告できませんでした。接続を確認して、もう一度お試しください。",
- "terminal": "このユーザーは報告できません。"
- }
- },
- "moreLinesAbove": "… この上にさらに{{displayCount}}行あります。",
- "mute": "ミュート",
- "mutedUser": "{{login}}をミュートしました",
- "noDiscussion": "まだディスカッションはありません",
- "noDiscussionDescription": "このプルリクエストには、レビュースレッドもコメントもまだありません。",
- "comment_one": "1件のコメント",
- "outdated": "古い内容",
- "quotedDiffSnippet": "引用した差分の一部",
- "reactionPill": "{{emoji}}のリアクション、{{displayCount}}{{countLabel}}",
- "reaction": "リアクション",
- "reaction_other": "リアクション",
- "reaction_one": "件",
- "replyBadRequest": "この返信は投稿できません。スレッドが変更された可能性があります。",
- "replyBody": "返信の本文",
- "replyForbidden": "このプルリクエストに返信する権限がありません。",
- "replyPlaceholder": "返信…",
- "reportContent": "コンテンツを報告",
- "reportUser": "ユーザーを報告",
- "resolveThread": "スレッドを解決",
- "resolved": "解決済み",
- "retryLoadingMore": "追加のコメントの読み込みを再試行",
- "reviewFiles": "ファイルをレビュー",
- "startedRelative": " · {{relative}}に開始",
- "submitReply": "返信を送信",
- "termsAcceptRetry": "利用規約に同意できませんでした。接続を確認して、もう一度お試しください。",
- "termsCopy": "投稿できるのは13歳以上の方です。",
- "termsTitle": "利用規約",
- "threadAccessibilityLabel": "ディスカッションスレッド {{anchorLabel}}",
- "unavailable": "ディスカッションを表示できません。",
- "unavailableMessage": "このプルリクエストは削除された可能性があります。",
- "unresolveThread": "スレッドを未解決に戻す",
- "viewTerms": "利用規約を表示",
- "termsAcceptRequired": "投稿するには利用規約に同意する必要があります。",
- "termsCheckRetryCopy": "利用規約を確認できませんでした。接続を確認して、もう一度お試しください。",
- "termsOutdatedCopy": "利用規約が変更されました。最新版に同意するにはこの画面を開き直してください。",
- "reactions": {
- "thumbsUp": "いいね",
- "thumbsDown": "よくないね",
- "laugh": "笑い",
- "hooray": "お祝い",
- "confused": "困惑",
- "heart": "ハート",
- "rocket": "ロケット",
- "eyes": "目"
- },
- "anchor": {
- "fileCommentOnPath": "{{path}}全体へのコメント",
- "fileComment": "ファイル全体へのコメント",
- "outdatedOnPathLines": "{{path}} {{lines}}(変更前のコードへのコメント)",
- "outdatedOnLines": "{{lines}}(変更前のコードへのコメント)",
- "outdatedOnPath": "{{path}}(変更前のコードへのコメント)"
- },
- "deletedUser": "削除されたユーザー"
- },
- "entry": {
- "clearLink": "プルリクエストのリンクをクリア",
- "couldNotLoad": "読み込めませんでした。",
- "eyebrow": "URLからプルリクエストを開けます。",
- "noRecentPrs": "最近のPRはありません",
- "noRecentPrsDescription": "上の欄にPRのリンクを貼り付けてレビューを始めてください。次回からはここに表示されます。",
- "open": "オープン",
- "pasteLink": "プルリクエストのリンクを貼り付け",
- "pastePrLink": "PRのリンクを貼り付け",
- "removeFromRecentsMessage": "このプルリクエストは最近の履歴から削除されます。",
- "removeFromRecentsTitle": "最近の履歴から削除しますか?",
- "removeRecentAccessibility": "{{repo}}を最近の履歴から削除",
- "urlAccessibility": "GitHubのプルリクエストのURL"
- },
- "eventChips": {
- "comment": "コメント",
- "label": "レビューの種類",
- "requestChanges": "変更を要求"
- },
+ "noFilesChanged": "変更されたファイルはありません",
+ "noFilesChangedDescription": "このプルリクエストにはファイルの変更がありません。",
"fileList": {
"filesList": "ファイル一覧",
"filesViewed": "ファイル · {{total}}件中{{viewed}}件を確認済み",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "選択した行にコメント",
"finishReview": "レビューを完了"
},
- "headLine": "{{counts}} · 先頭コミット {{sha}}",
"hunkRows": {
"contextUnavailable": "この参照では前後の行を表示できません。",
"expandAll": "すべて展開",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "前後の行の読み込みを再試行",
"retryLoadingNextPage": "次のページの読み込みを再試行"
},
- "inbox": {
- "couldNotLoad": "受信トレイを読み込めませんでした。",
- "loading": "受信トレイを読み込み中",
- "noReviewRequests": "レビュー依頼はありません",
- "noReviewRequestsDescription": "レビューを依頼されたプルリクエストがここに表示されます。上の欄に任意のPRのリンクを貼り付けることもできます。",
- "title": "受信トレイ"
+ "sideBySide": {
+ "emptyDiffColumn": "空の差分列",
+ "emptyDiffRow": "空の差分行",
+ "newOnly": "変更後のみ:{{text}}",
+ "noNewlineAtEndOfFile": "⚠️ ファイル末尾に改行がありません",
+ "oldNew": "変更前:{{old}}、変更後:{{new}}",
+ "oldOnly": "変更前のみ:{{text}}"
+ },
+ "connectionExpired": "GitHubとの連携が期限切れになりました。",
+ "capabilities": {
+ "banner": {
+ "title": "このプロバイダーでは利用できません",
+ "accessibility": "このプロバイダーでは利用できません: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Kilo GitHub Appをインストール",
"merge": {
- "autoMergeDescription": "必須チェックがすべて成功すると、GitHubがこのプルリクエストを自動でマージします(方法:{{method}})。",
+ "merge": "マージ",
+ "mergeNow": "今すぐマージ",
+ "mergePullRequest": "プルリクエストのマージ",
+ "mergeTermTitle": "{{term}}のマージ",
+ "enableAutoMerge": "自動マージを有効にする",
+ "disableAutoMerge": "自動マージを無効にする",
"autoMergeOn": "自動マージ有効",
- "blockedTitle": "まだマージできない理由",
- "cannotMerge": "このプルリクエストは現状ではマージできません。",
+ "autoMergeDescription": "必須チェックがすべて成功すると、GitHubがこのプルリクエストを自動でマージします(方法:{{method}})。",
"checking": "マージできるか確認中…",
+ "couldNotDetermine": "マージできるか確認できませんでした。",
+ "refreshMergeability": "マージできるか再確認",
+ "blockedTitle": "まだマージできない理由",
+ "updateBranch": "ブランチを更新",
+ "updateBranchFromBase": "ベースブランチの変更を取り込んで更新",
+ "methodLabel": "マージ方法",
+ "commitTitle": "コミットのタイトル",
"commitMessage": "コミットメッセージ",
"commitMessagePlaceholder": "マージコミットの説明(任意)",
- "commitTitle": "コミットのタイトル",
- "confirmMessage": "変更をベースブランチにマージします。",
- "confirmTitle": "プルリクエストをマージしますか?",
- "couldNotDetermine": "マージできるか確認できませんでした。",
- "couldNotMerge": "プルリクエストをマージできませんでした。",
"deleteBranch": "ブランチを削除",
"deleteBranchAfterMerge": "マージ後にブランチを削除",
- "disableAutoMerge": "自動マージを無効にする",
- "enableAutoMerge": "自動マージを有効にする",
- "enableAutoMergeConfirmMessage": "必須チェックがすべて成功すると、GitHubがこのプルリクエストを自動でマージします。",
+ "noEnabledMethods": "このリポジトリではマージ方法が有効になっていません。リポジトリの管理者に、通常のマージ、スカッシュマージ、リベースマージのいずれかを有効にするよう依頼してください。",
+ "confirmTitle": "プルリクエストをマージしますか?",
+ "confirmTitleTerm": "{{term}}をマージしますか?",
+ "confirmMessage": "変更をベースブランチにマージします。",
"enableAutoMergeConfirmTitle": "自動マージを有効にしますか?",
+ "enableAutoMergeConfirmMessage": "必須チェックがすべて成功すると、GitHubがこのプルリクエストを自動でマージします。",
+ "enableAutoMergeConfirmMessageTerm": "パイプラインが成功すると、{{term}}は自動的にマージされます。",
+ "enableAutoMergeDescriptionTerm": "パイプラインが成功すると、GitLabはこの{{term}}を自動的にマージします。",
"forbidden": "このプルリクエストをマージする権限がありません。",
- "loadFailedTitle": "マージの設定を読み込めませんでした。",
- "merge": "マージ",
- "mergeNow": "今すぐマージ",
- "mergePullRequest": "プルリクエストのマージ",
- "methodLabel": "マージ方法",
+ "cannotMerge": "このプルリクエストは現状ではマージできません。",
+ "couldNotMerge": "プルリクエストをマージできませんでした。",
"methods": {
"merge": "マージ",
"rebase": "リベース",
"squash": "スカッシュ"
},
- "noEnabledMethods": "このリポジトリではマージ方法が有効になっていません。リポジトリの管理者に、通常のマージ、スカッシュマージ、リベースマージのいずれかを有効にするよう依頼してください。",
+ "terminal": {
+ "alreadyMerged": "マージ済み",
+ "closed": "プルリクエストはクローズ済み",
+ "closedMergeRequest": "マージリクエストはクローズ済み"
+ },
"partialSuccessBanner": {
"accessibility": "マージしました。ブランチを削除できませんでした。理由:{{reason}}",
"body": "ブランチを削除できませんでした。理由:{{reason}}"
},
- "refreshMergeability": "マージできるか再確認",
- "terminal": {
- "alreadyMerged": "マージ済み",
- "closed": "プルリクエストはクローズ済み"
- },
- "updateBranch": "ブランチを更新",
- "updateBranchFromBase": "ベースブランチの変更を取り込んで更新",
+ "loadFailedTitle": "マージの設定を読み込めませんでした。",
"blocked": {
"unknownStateTitle": "GitHubからマージ可能との情報が届いていません",
"unknownStateDetail": "しばらくしてから概要を更新してください。",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "このプルリクエストはまだマージできません",
"notMergeableDetail": "GitHubから報告されたマージの状態は「{{state}}」です。"
},
+ "restrictions": {
+ "title": "マージの制限",
+ "approvalsRequired_one": "{{displayCount}}件の承認が必要",
+ "approvalsRequired_other": "{{displayCount}}件の承認が必要",
+ "pipelineMustSucceed": "マージする前にパイプラインが成功する必要があります。"
+ },
+ "providerBlocked": {
+ "failingPipeline": "最新コミットでパイプラインが失敗しています。",
+ "pendingPipeline": "最新コミットでパイプラインはまだ実行中です。",
+ "permission": "この{{term}}をマージする権限がありません。",
+ "draft": "マージする前に、{{term}}をレビュー可能な状態に変更してください。"
+ },
"methodLabels": {
"merge": "マージコミットを作成",
"squash": "スカッシュしてマージ",
@@ -2623,9 +2507,204 @@
"rebase": "このブランチのすべてのコミットを、マージコミットなしでベースブランチに適用し直します。"
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "ディスカッションスレッド {{anchorLabel}}",
+ "collapseThread": "スレッドを折りたたむ",
+ "resolveThread": "スレッドを解決",
+ "unresolveThread": "スレッドを未解決に戻す",
+ "resolved": "解決済み",
+ "outdated": "古い内容",
+ "comment_one": "1件のコメント",
+ "comment": "{{displayCount}}件のコメント",
+ "comment_other": "{{displayCount}}件のコメント",
+ "startedRelative": " · {{relative}}に開始",
+ "couldNotLoadMore": "追加のコメントを読み込めませんでした。",
+ "retryLoadingMore": "追加のコメントの読み込みを再試行",
+ "loadMoreComments": "さらにコメントを読み込む",
+ "addReaction": "リアクションを追加",
+ "reactionPill": "{{emoji}}のリアクション、{{displayCount}}{{countLabel}}",
+ "reaction_one": "件",
+ "reaction": "リアクション",
+ "reaction_other": "リアクション",
+ "commentActions": "コメントの操作",
+ "reportContent": "コンテンツを報告",
+ "reportUser": "ユーザーを報告",
+ "mute": "ミュート",
+ "block": "ブロック",
+ "blockedUser": "{{login}}をブロックしました",
+ "mutedUser": "{{login}}をミュートしました",
+ "replyPlaceholder": "返信…",
+ "replyBody": "返信の本文",
+ "submitReply": "返信を送信",
+ "termsTitle": "利用規約",
+ "termsCopy": "投稿できるのは13歳以上の方です。",
+ "termsAcceptRetry": "利用規約に同意できませんでした。接続を確認して、もう一度お試しください。",
+ "viewTerms": "利用規約を表示",
+ "acceptTerms": "同意",
+ "replyBadRequest": "この返信は投稿できません。スレッドが変更された可能性があります。",
+ "replyForbidden": "このプルリクエストに返信する権限がありません。",
+ "replyForbiddenTerm": "この{{term}}に返信する権限がありません。",
+ "moderation": {
+ "block": {
+ "retryable": "このユーザーをブロックできませんでした。接続を確認して、もう一度お試しください。",
+ "terminal": "このユーザーはブロックできません。"
+ },
+ "mute": {
+ "retryable": "このユーザーをミュートできませんでした。接続を確認して、もう一度お試しください。",
+ "terminal": "このユーザーはミュートできません。"
+ },
+ "reportContent": {
+ "retryable": "このコメントを報告できませんでした。接続を確認して、もう一度お試しください。",
+ "terminal": "このコメントは報告できません。"
+ },
+ "reportUser": {
+ "retryable": "このユーザーを報告できませんでした。接続を確認して、もう一度お試しください。",
+ "terminal": "このユーザーは報告できません。"
+ }
+ },
+ "accessDeniedMessage": "このPRのディスカッションを表示する権限がありません。",
+ "unavailable": "ディスカッションを表示できません。",
+ "unavailableMessage": "このプルリクエストは削除された可能性があります。",
+ "couldNotLoad": "ディスカッションを読み込めませんでした。",
+ "loading": "ディスカッションを読み込み中",
+ "noDiscussion": "まだディスカッションはありません",
+ "noDiscussionDescription": "このプルリクエストには、レビュースレッドもコメントもまだありません。",
+ "reviewFiles": "ファイルをレビュー",
+ "quotedDiffSnippet": "引用した差分の一部",
+ "moreLinesAbove": "… この上にさらに{{displayCount}}行あります。",
+ "termsAcceptRequired": "投稿するには利用規約に同意する必要があります。",
+ "termsOutdatedCopy": "利用規約が変更されました。最新版に同意するにはこの画面を開き直してください。",
+ "termsCheckRetryCopy": "利用規約を確認できませんでした。接続を確認して、もう一度お試しください。",
+ "reactions": {
+ "thumbsUp": "いいね",
+ "thumbsDown": "よくないね",
+ "laugh": "笑い",
+ "hooray": "お祝い",
+ "confused": "困惑",
+ "heart": "ハート",
+ "rocket": "ロケット",
+ "eyes": "目"
+ },
+ "anchor": {
+ "fileCommentOnPath": "{{path}}全体へのコメント",
+ "fileComment": "ファイル全体へのコメント",
+ "outdatedOnPathLines": "{{path}} {{lines}}(変更前のコードへのコメント)",
+ "outdatedOnLines": "{{lines}}(変更前のコードへのコメント)",
+ "outdatedOnPath": "{{path}}(変更前のコードへのコメント)"
+ },
+ "deletedUser": "削除されたユーザー"
+ },
+ "couldNotOpenGitHubAppSettings": "GitHub Appの設定を開けませんでした。",
+ "installKiloGitHubApp": "Kilo GitHub Appをインストール",
+ "checkConnection": "接続を確認",
+ "couldNotLoadPullRequest": "プルリクエストを読み込めませんでした。",
+ "description": "説明",
"noDescriptionProvided": "説明はありません。",
- "noFilesChanged": "変更されたファイルはありません",
- "noFilesChangedDescription": "このプルリクエストにはファイルの変更がありません。",
+ "review": "レビュー",
+ "reviewPullRequest": "プルリクエストをレビュー",
+ "headLine": "{{counts}} · 先頭コミット {{sha}}",
+ "entry": {
+ "eyebrow": "URLからプルリクエストまたはマージリクエストを開く",
+ "pastePrLink": "プルリクエストまたはマージリクエストのリンクを貼り付け",
+ "noRecentPrs": "最近のレビューはありません",
+ "noRecentPrsDescription": "上にリンクを貼り付けてレビューを始めると、次からはここに表示されます。",
+ "couldNotLoad": "読み込めませんでした。",
+ "removeFromRecentsTitle": "最近の履歴から削除しますか?",
+ "removeFromRecentsMessage": "このレビューは最近の履歴から削除されます。",
+ "removeRecentAccessibility": "{{repo}}を最近の履歴から削除",
+ "urlAccessibility": "プルリクエストまたはマージリクエストのURLを入力",
+ "urlPlaceholder": "プルリクエストまたはマージリクエストのURL",
+ "openAccessibility": "プルリクエストまたはマージリクエストを開く",
+ "clearLink": "リンクをクリア",
+ "pasteLink": "プルリクエストまたはマージリクエストのリンクを貼り付け",
+ "open": "オープン"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}}件のチェック",
+ "couldNotLoad": "チェックを読み込めませんでした。",
+ "failed": "{{displayCount}}件失敗",
+ "noAccess": "このリポジトリのチェックにアクセスできません。",
+ "noChecksReported": "チェックは報告されていません",
+ "notAvailable": "チェックの情報はまだ表示できません。マージ元ブランチの先頭コミットが未処理か、マージ元リポジトリにKilo GitHub Appがインストールされていない可能性があります。",
+ "openDetails": "{{name}}の詳細を開く",
+ "passed": "{{displayCount}}件成功",
+ "pending": "{{displayCount}}件待機中",
+ "retryChecks": "チェックを再試行",
+ "skipped": "{{displayCount}}件スキップ",
+ "title": "チェック",
+ "viewOnGitHub": "GitHubでPRを表示",
+ "checkDetails": "チェックの詳細"
+ },
+ "inbox": {
+ "couldNotLoad": "受信トレイを読み込めませんでした。",
+ "loading": "受信トレイを読み込み中",
+ "noReviewRequests": "レビュー依頼はありません",
+ "noReviewRequestsDescription": "レビューを依頼されたプルリクエストがここに表示されます。上の欄に任意のPRのリンクを貼り付けることもできます。",
+ "title": "受信トレイ"
+ },
+ "composer": {
+ "addTitle": "コメントの追加",
+ "addToReview": "レビューに追加",
+ "comment": "コメント",
+ "commentBody": "コメントの本文",
+ "commentBodyPlaceholder": "コメントを入力",
+ "commentNow": "今すぐコメント",
+ "discardMessage": "下書きは保存されません。",
+ "discardTitle": "コメントを破棄しますか?",
+ "editTitle": "コメントの編集",
+ "insertSuggestion": "修正提案を挿入",
+ "insertSuggestionA11y": "コードの修正提案を挿入",
+ "loadFailedTitle": "コメントの入力画面を読み込めませんでした。",
+ "ok": "OK",
+ "unavailableMessage": "この未送信のコメントは、すでに削除または送信されています。",
+ "unavailableTitle": "コメントが見つかりません",
+ "bodyEmpty": "コメントの本文を入力してください。",
+ "suggestionsOnlyAddedLines": "修正提案は追加された行にのみ適用できます。",
+ "tapDiffLineToSuggest": "修正提案を入力するには、差分の行をタップしてください。"
+ },
+ "connect": {
+ "checkFailedTitle": "GitHubとの接続を確認できませんでした。",
+ "checkFailedMessage": "読み込みが完了するまで、サインイン状態を確認できません。",
+ "checkFailedTitleGitLab": "GitLabとの接続を確認できませんでした。",
+ "checkFailedTitleBitbucket": "Bitbucketとの接続を確認できませんでした。",
+ "providerCheckFailedMessage": "読み込みが完了するまで接続状態は利用できません。",
+ "reconnectTitle": "GitHubに再接続",
+ "reconnectDescription": "GitHubとの接続が解除されました。モバイルでプルリクエストのレビューを続けるには、再接続してください。",
+ "description": "モバイルでプルリクエストをレビューするには、GitHubアカウントを接続してください。",
+ "gitlabDescription": "モバイルでマージリクエストをレビューするには、GitLabアカウントを接続してください。",
+ "bitbucketDescription": "モバイルでプルリクエストをレビューするには、この組織をBitbucketに接続してください。",
+ "bitbucketOrgOnlyDescription": "プロフィールで組織を選択すると、そのBitbucketプルリクエストをレビューできます。"
+ },
+ "screen": {
+ "shareA11y": "プルリクエストを共有",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "このコメントを未送信のレビューから削除します。",
+ "deletePendingTitle": "未送信のコメントを削除しますか?",
+ "loadFailedTitle": "レビューの送信画面を読み込めませんでした。",
+ "pendingComment": "未送信のコメント",
+ "pendingComment_other": "未送信のコメント",
+ "pendingComment_one": "未送信のコメント",
+ "summaryOptional": "総評(任意)",
+ "partialPostedMessage": "{{displayFreshCount}}件のコメントを投稿しました。{{displayStaleCount}}件のコメントは古いコミットに対するもののため、未送信の一覧に残っています。",
+ "submitCountOfTotal": "{{displayTotalCount}}件中{{displayFreshCount}}件のコメントを送信",
+ "submitReview": "レビューを送信",
+ "blockedRequestChanges": "変更を要求するには、総評を入力するか、コメントを1件以上追加してください。",
+ "blockedComment": "コメントとしてレビューを投稿するには、総評を入力するか、コメントを1件以上追加してください。"
+ },
+ "reconnectNotice": {
+ "title": "GitHubとの連携が期限切れになりました。",
+ "message": "GitHubとの接続が無効になりました。接続を再確認してください。再接続が必要な場合は、案内が表示されます。",
+ "gitlabTitle": "GitLabとの連携が期限切れになりました。",
+ "bitbucketTitle": "Bitbucketとの連携が期限切れになりました。",
+ "providerMessage": "{{provider}}との接続が無効になりました。接続を再確認してください。再接続が必要な場合は、案内が表示されます。"
+ },
+ "eventChips": {
+ "comment": "コメント",
+ "label": "レビューの種類",
+ "requestChanges": "変更を要求"
+ },
"overview": {
"commit": "コミット",
"commit_other": "コミット",
@@ -2666,39 +2745,25 @@
"summaryA11y": "レビューの総評",
"summaryPlaceholder": "レビューの総評(任意)"
},
- "pullRequestUnavailable": "プルリクエストを開けません",
- "pullRequestUnavailableDescription": "このPRを開けません。PRが削除されたか、リポジトリが非公開になっているか、リポジトリにKilo GitHub Appがインストールされていない可能性があります。",
- "reconnectNotice": {
- "message": "GitHubとの接続が無効になりました。接続を再確認してください。再接続が必要な場合は、案内が表示されます。",
- "title": "GitHubとの連携が期限切れになりました。"
- },
- "review": "レビュー",
- "reviewPullRequest": "プルリクエストをレビュー",
- "screen": {
- "shareA11y": "プルリクエストを共有",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "空の差分列",
- "emptyDiffRow": "空の差分行",
- "newOnly": "変更後のみ:{{text}}",
- "noNewlineAtEndOfFile": "⚠️ ファイル末尾に改行がありません",
- "oldNew": "変更前:{{old}}、変更後:{{new}}",
- "oldOnly": "変更前のみ:{{text}}"
+ "tabs": {
+ "discussion": "ディスカッション",
+ "files": "ファイル",
+ "overview": "概要"
},
- "submit": {
- "deletePendingMessage": "このコメントを未送信のレビューから削除します。",
- "deletePendingTitle": "未送信のコメントを削除しますか?",
- "loadFailedTitle": "レビューの送信画面を読み込めませんでした。",
- "pendingComment": "未送信のコメント",
- "pendingComment_other": "未送信のコメント",
- "pendingComment_one": "未送信のコメント",
- "summaryOptional": "総評(任意)",
- "partialPostedMessage": "{{displayFreshCount}}件のコメントを投稿しました。{{displayStaleCount}}件のコメントは古いコミットに対するもののため、未送信の一覧に残っています。",
- "submitCountOfTotal": "{{displayTotalCount}}件中{{displayFreshCount}}件のコメントを送信",
- "submitReview": "レビューを送信",
- "blockedRequestChanges": "変更を要求するには、総評を入力するか、コメントを1件以上追加してください。",
- "blockedComment": "コメントとしてレビューを投稿するには、総評を入力するか、コメントを1件以上追加してください。"
+ "terms": {
+ "pullRequest": "プルリクエスト",
+ "mergeRequest": "マージリクエスト",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "マージリクエストを共有",
+ "viewOnProvider": "{{provider}}で表示",
+ "mergeRequestUnavailable": "マージリクエストを開けません",
+ "unavailableDescription": "削除されたか、アクセス権がない可能性があります。",
+ "accessDeniedMergeRequest": "このマージリクエストを表示する権限がありません。",
+ "couldNotLoadMergeRequest": "マージリクエストを読み込めませんでした。",
+ "discussionAccessDenied": "このマージリクエストのディスカッションを表示する権限がありません。",
+ "discussionUnavailableMessage": "このマージリクエストは削除された可能性があります。",
+ "noDiscussionDescription": "このマージリクエストには、レビュースレッドもコメントもまだありません。",
+ "noFilesChangedDescription": "このマージリクエストにはファイルの変更がありません。"
},
"fileStatus": {
"changed": "変更",
@@ -2706,11 +2771,6 @@
"modified": "変更",
"renamed": "名前変更"
},
- "tabs": {
- "discussion": "ディスカッション",
- "files": "ファイル",
- "overview": "概要"
- },
"diff": {
"selectedTapToChange": "{{label}}を選択中。タップして選択を変更",
"tapToComment": "{{label}}をタップしてコメント",
@@ -2721,7 +2781,7 @@
"emptyLine": "(空)"
},
"linkPasteClipboardEmpty": "クリップボードが空です。",
- "linkPasteNotAPullRequest": "GitHubのプルリクエストのリンクではありません。",
+ "linkPasteNotAPullRequest": "プルリクエストまたはマージリクエストのリンクではありません",
"announce": {
"commentPosted": "コメントを投稿しました",
"reviewSubmitted": "レビューを送信しました",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "このコメントは投稿できません。選択した行が変更されたか、PRが更新された可能性があります。",
"reviewNotSubmitted": "このレビューはこのままでは送信できません。PRが更新されていないか、自分が作成したプルリクエストではないか確認してください。",
+ "reviewNotSubmittedTerm": "このレビューはそのまま送信できません。{{term}}が変更されたか、自分の{{term}}はレビューできません。",
"couldNotPostComment": "コメントを投稿できませんでした。",
"couldNotSubmitReview": "レビューを送信できませんでした。接続を確認して、もう一度お試しください。"
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "返信できませんでした。",
"couldNotCompleteAction": "この操作を完了できませんでした。",
"mergeResultDefaultError": "GitHubでマージが完了しませんでした。",
+ "mergeResultNotCompleted": "{{term}}はマージされませんでした。状態を確認して再試行してください。",
"ambiguous": "操作の結果を確認できませんでした。再試行する前にPRを確認してください。",
"persistenceFailed": "この操作を記録できませんでした。しばらくしてからもう一度お試しください。",
"forbidden": "この操作を行う権限がありません。"
diff --git a/apps/mobile/src/i18n/locales/ka.json b/apps/mobile/src/i18n/locales/ka.json
index c6679bf6c6..a66349b6e9 100644
--- a/apps/mobile/src/i18n/locales/ka.json
+++ b/apps/mobile/src/i18n/locales/ka.json
@@ -36,6 +36,7 @@
"cost": "ღირებულება",
"discard": "გაუქმება",
"findings": "გამოვლენილი პრობლემები",
+ "mergeRequest": "შერწყმის მოთხოვნა",
"notConnected": "არ არის დაკავშირებული",
"notifications": "შეტყობინებები",
"pullRequest": "PR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ცვლილებების ცარიელი სტრიქონი"
},
"connectionExpired": "GitHub-თან კავშირს ვადა გაუვიდა.",
+ "capabilities": {
+ "banner": {
+ "title": "ამ პროვაიდერისთვის მიუწვდომელია",
+ "accessibility": "ამ პროვაიდერისთვის მიუწვდომელია: {{reason}}"
+ }
+ },
"merge": {
"merge": "შერწყმა",
"mergeNow": "ახლავე შერწყმა",
"mergePullRequest": "შერწყმის მოთხოვნის შერწყმა",
+ "mergeTermTitle": "{{term}}-ის შერწყმა",
"enableAutoMerge": "ავტომატური შერწყმის ჩართვა",
"disableAutoMerge": "ავტომატური შერწყმის გამორთვა",
"autoMergeOn": "ავტომატური შერწყმა ჩართულია",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "განშტოების წაშლა შერწყმის შემდეგ",
"noEnabledMethods": "ამ საცავში შერწყმის არცერთი მეთოდი არ არის ჩართული. სთხოვე საცავის ადმინისტრატორს, ჩართოს ჩვეულებრივი შერწყმა, შეკუმშვით შერწყმა ან ბაზის შეცვლით შერწყმა.",
"confirmTitle": "შერწყმის მოთხოვნა შეირწყას?",
+ "confirmTitleTerm": "{{term}} შეირწყას?",
"confirmMessage": "შენი ცვლილებები საბაზო განშტოებაში შეირწყმება.",
"enableAutoMergeConfirmTitle": "ჩაირთოს ავტომატური შერწყმა?",
"enableAutoMergeConfirmMessage": "GitHub ამ შერწყმის მოთხოვნას ავტომატურად შეარწყამს, როცა ყველა სავალდებულო შემოწმება წარმატებით დასრულდება.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} ავტომატურად გაერთიანდება, როდესაც მისი მილი წარმატებით დასრულდება.",
+ "enableAutoMergeDescriptionTerm": "GitLab ავტომატურად გააერთიანებს ამ {{term}}-ს, როდესაც მისი მილი წარმატებით დასრულდება.",
"forbidden": "ამ შერწყმის მოთხოვნის შერწყმის უფლება არ გაქვს.",
"cannotMerge": "ამ შერწყმის მოთხოვნის არსებული სახით შერწყმა შეუძლებელია.",
"couldNotMerge": "შერწყმის მოთხოვნის შერწყმა ვერ მოხერხდა.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "უკვე შერწყმულია",
- "closed": "ეს შერწყმის მოთხოვნა დახურულია"
+ "closed": "ეს შერწყმის მოთხოვნა დახურულია",
+ "closedMergeRequest": "ეს შერწყმის მოთხოვნა დახურულია"
},
"partialSuccessBanner": {
"body": "განშტოების წაშლა ვერ მოხერხდა: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ამ შერწყმის მოთხოვნის შერწყმა ჯერ შეუძლებელია",
"notMergeableDetail": "GitHub-ის თანახმად, შერწყმის მდგომარეობაა: {{state}}."
},
+ "restrictions": {
+ "title": "შერწყმის შეზღუდვები",
+ "approvalsRequired_one": "საჭიროა {{displayCount}} დადასტურება",
+ "approvalsRequired_other": "საჭიროა {{displayCount}} დადასტურება",
+ "pipelineMustSucceed": "შერწყმამდე მილი წარმატებით უნდა დასრულდეს."
+ },
+ "providerBlocked": {
+ "failingPipeline": "მილი ვერ ასრულდება ბოლო კომიტზე.",
+ "pendingPipeline": "მილი ჯერ კიდევ მუშაობს ბოლო კომიტზე.",
+ "permission": "ამ {{term}}-ის შერწყმის უფლება არ გაქვს.",
+ "draft": "შერწყმამდე მონიშნე {{term}} განსახილველად მზადყოფნაში."
+ },
"methodLabels": {
"merge": "შერწყმის კომიტის შექმნა",
"squash": "შეკუმშვა და შერწყმა",
@@ -448,6 +472,7 @@
"acceptTerms": "თანხმობა",
"replyBadRequest": "ამ პასუხის გამოქვეყნება შეუძლებელია. შესაძლოა, თემა შეიცვალა.",
"replyForbidden": "ამ შერწყმის მოთხოვნაზე პასუხის გაცემის უფლება არ გაქვს.",
+ "replyForbiddenTerm": "ამ {{term}}-ზე პასუხის გაცემის უფლება არ გაქვს.",
"moderation": {
"reportContent": {
"terminal": "ამ კომენტარის გასაჩივრება შეუძლებელია.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "შერწყმის მოთხოვნის განხილვა",
"headLine": "{{counts}} · ბოლო კომიტი {{sha}}",
"entry": {
- "eyebrow": "გახსენი შერწყმის მოთხოვნა URL-ით.",
- "pastePrLink": "PR-ის ბმულის ჩასმა",
- "noRecentPrs": "ბოლოს ნანახი PR-ები არ არის",
- "noRecentPrsDescription": "განხილვის დასაწყებად ზემოთ ჩასვი PR-ის ბმული — შემდეგ ჯერზე ის აქ გამოჩნდება.",
+ "eyebrow": "გახსენით PR ან შერწყმის მოთხოვნა URL-ით",
+ "pastePrLink": "ჩასვით PR-ის ან შერწყმის მოთხოვნის ბმული",
+ "noRecentPrs": "ბოლოს განხილული არ არის",
+ "noRecentPrsDescription": "განხილვის დასაწყებად ზემოთ ჩასვით ბმული — შემდეგ ჯერზე ის აქ გამოჩნდება.",
"couldNotLoad": "ჩატვირთვა ვერ მოხერხდა.",
"removeFromRecentsTitle": "წაიშალოს ბოლოს ნანახების სიიდან?",
- "removeFromRecentsMessage": "ეს შერწყმის მოთხოვნა ბოლოს ნანახების სიიდან წაიშლება.",
+ "removeFromRecentsMessage": "ეს მიმოხილვა ბოლო ნანახების სიიდან წაიშლება.",
"removeRecentAccessibility": "{{repo}}-ის წაშლა ბოლოს ნანახების სიიდან",
- "urlAccessibility": "GitHub-ის შერწყმის მოთხოვნის URL",
- "clearLink": "შერწყმის მოთხოვნის ბმულის გასუფთავება",
- "pasteLink": "შერწყმის მოთხოვნის ბმულის ჩასმა",
+ "urlAccessibility": "ჩაწერეთ PR-ის ან შერწყმის მოთხოვნის URL",
+ "urlPlaceholder": "PR-ის ან შერწყმის მოთხოვნის URL",
+ "openAccessibility": "PR-ის ან შერწყმის მოთხოვნის გახსნა",
+ "clearLink": "ბმულის გასუფთავება",
+ "pasteLink": "ჩასვით PR-ის ან შერწყმის მოთხოვნის ბმული",
"open": "ღია"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub-თან კავშირის შემოწმება ვერ მოხერხდა.",
"checkFailedMessage": "ჩატვირთვის დასრულებამდე შესვლის სტატუსი მიუწვდომელია.",
+ "checkFailedTitleGitLab": "GitLab-თან კავშირის შემოწმება ვერ მოხერხდა.",
+ "checkFailedTitleBitbucket": "Bitbucket-თან კავშირის შემოწმება ვერ მოხერხდა.",
+ "providerCheckFailedMessage": "კავშირის სტატუსი მიუწვდომელია ჩატვირთვამდე.",
"reconnectTitle": "GitHub-თან ხელახლა დაკავშირება",
"reconnectDescription": "GitHub-თან კავშირი გაუქმდა. მობილურზე შერწყმის მოთხოვნების განხილვის გასაგრძელებლად ხელახლა დაუკავშირდი.",
- "description": "მობილურზე შერწყმის მოთხოვნების განსახილველად დააკავშირე შენი GitHub ანგარიში."
+ "description": "მობილურზე შერწყმის მოთხოვნების განსახილველად დააკავშირე შენი GitHub ანგარიში.",
+ "gitlabDescription": "დააკავშირეთ თქვენი GitLab ანგარიში, შერწყმის მოთხოვნების მობილურში განსახილველად.",
+ "bitbucketDescription": "დააკავშირეთ Bitbucket ამ ორგანიზაციას, PR-ების მობილურში განსახილველად.",
+ "bitbucketOrgOnlyDescription": "აირჩიეთ ორგანიზაცია თქვენს პროფილში, მისი Bitbucket PR-ების განსახილველად."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub-თან კავშირს ვადა გაუვიდა.",
- "message": "GitHub-თან კავშირი აღარ მოქმედებს. ხელახლა შეამოწმე კავშირი — საჭიროების შემთხვევაში აპი ხელახლა დაკავშირებას მოგთხოვს."
+ "message": "GitHub-თან კავშირი აღარ მოქმედებს. ხელახლა შეამოწმე კავშირი — საჭიროების შემთხვევაში აპი ხელახლა დაკავშირებას მოგთხოვს.",
+ "gitlabTitle": "GitLab-თან კავშირს ვადა გაუვიდა.",
+ "bitbucketTitle": "Bitbucket-თან კავშირს ვადა გაუვიდა.",
+ "providerMessage": "{{provider}}-თან კავშირი აღარ მოქმედებს. ხელახლა შეამოწმე კავშირი — საჭიროების შემთხვევაში აპი ხელახლა დაკავშირებას მოგთხოვს."
},
"eventChips": {
"comment": "კომენტარი",
@@ -643,6 +679,21 @@
"files": "ფაილი",
"discussion": "დისკუსია"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Შერწყმის მოთხოვნა",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "შერწყმის მოთხოვნის გაზიარება",
+ "viewOnProvider": "ნახვა {{provider}}-ში",
+ "mergeRequestUnavailable": "შერწყმის მოთხოვნა მიუწვდომელია",
+ "unavailableDescription": "შესაძლოა წაიშალა, ან შესაძლოა მასზე წვდომა არ გაქვთ.",
+ "accessDeniedMergeRequest": "ამ შერწყმის მოთხოვნის ნახვის უფლება არ გაქვს.",
+ "couldNotLoadMergeRequest": "შერწყმის მოთხოვნის ჩატვირთვა ვერ მოხერხდა.",
+ "discussionAccessDenied": "ამ შერწყმის მოთხოვნის დისკუსიის ნახვის უფლება არ გაქვს.",
+ "discussionUnavailableMessage": "შესაძლოა, ეს შერწყმის მოთხოვნა წაიშალა.",
+ "noDiscussionDescription": "ამ შერწყმის მოთხოვნაში ჯერ არც განხილვის თემებია და არც ზოგადი კომენტარები.",
+ "noFilesChangedDescription": "ამ შერწყმის მოთხოვნაში ფაილები არ შეცვლილა."
+ },
"fileStatus": {
"modified": "შეცვლილია",
"renamed": "სახელი შეცვლილია",
@@ -659,7 +710,7 @@
"emptyLine": "(ცარიელი)"
},
"linkPasteClipboardEmpty": "გაცვლის ბუფერი ცარიელია.",
- "linkPasteNotAPullRequest": "ეს GitHub-ის შერწყმის მოთხოვნის ბმული არ არის.",
+ "linkPasteNotAPullRequest": "ეს PR-ის ან შერწყმის მოთხოვნის ბმული არ არის",
"announce": {
"commentPosted": "კომენტარი გამოქვეყნდა",
"reviewSubmitted": "განხილვა გაიგზავნა",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ამ კომენტარის გამოქვეყნება შეუძლებელია. შესაძლოა, მონიშნული სტრიქონი შეიცვალა ან PR განახლდა.",
"reviewNotSubmitted": "ამ განხილვის არსებული სახით გაგზავნა შეუძლებელია. შესაძლოა, PR შეიცვალა ან საკუთარ შერწყმის მოთხოვნას განიხილავ, რაც დაუშვებელია.",
+ "reviewNotSubmittedTerm": "ეს მიმოხილვა უცვლელად ვერ გაიგზავნება. შესაძლოა {{term}} შეიცვალა, ან საკუთარ {{term}}-ს ვერ მიმოახილეთ.",
"couldNotPostComment": "კომენტარის გამოქვეყნება ვერ მოხერხდა.",
"couldNotSubmitReview": "განხილვის გაგზავნა ვერ მოხერხდა. შეამოწმე კავშირი და ხელახლა სცადე."
},
@@ -675,6 +727,7 @@
"couldNotReply": "პასუხის გაგზავნა ვერ მოხერხდა.",
"couldNotCompleteAction": "ამ მოქმედების დასრულება ვერ მოხერხდა.",
"mergeResultDefaultError": "GitHub-მა შერწყმა ვერ დაასრულა.",
+ "mergeResultNotCompleted": "{{term}} არ გაერთიანდა. შეამოწმეთ მისი მდგომარეობა და სცადეთ თავიდან.",
"ambiguous": "დადასტურება ვერ მოხერხდა — ხელახლა ცდამდე შეამოწმე PR.",
"persistenceFailed": "ამ მოქმედების დაფიქსირება ვერ მოხერხდა. მოგვიანებით სცადე.",
"forbidden": "ეს მოქმედება აკრძალულია."
@@ -1988,11 +2041,31 @@
"retryConnection": "ხელახლა დაკავშირება"
},
"newSession": {
+ "recentlyUsed": "ბოლოს გამოყენებული",
+ "couldNotLoadGithubRepositories": "GitHub-ის რეპოზიტორიების ჩატვირთვა ვერ მოხერხდა.",
+ "couldNotLoadGitlabRepositories": "GitLab-ის რეპოზიტორიების ჩატვირთვა ვერ მოხერხდა.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket-ის რეპოზიტორიების ჩატვირთვა ვერ მოხერხდა.",
"connectGithubDescription": "ბრაუზერში დააკავშირეთ GitHub-ის ანგარიში, შემდეგ აქ დაბრუნდით რეპოზიტორიის ასარჩევად.",
+ "connectGitlabDescription": "ბრაუზერში დააკავშირეთ GitLab-ის ანგარიში, შემდეგ აქ დაბრუნდით რეპოზიტორიის ასარჩევად.",
+ "connectBitbucketDescription": "ბრაუზერში დააკავშირეთ Bitbucket-ის ანგარიში, შემდეგ აქ დაბრუნდით რეპოზიტორიის ასარჩევად.",
"openGithub": "GitHub-ის გახსნა",
+ "openGitlab": "GitLab-ის გახსნა",
+ "openBitbucket": "Bitbucket-ის გახსნა",
"refreshRepositories": "რეპოზიტორიების განახლება",
"githubConnected": "GitHub დაკავშირებულია",
+ "gitlabConnected": "GitLab დაკავშირებულია",
"noRepositoriesVisible": "რეპოზიტორიები არ ჩანს. შეამოწმეთ, აქვს თუ არა Kilo-ს GitHub აპს რეპოზიტორიებზე წვდომა, შემდეგ განაახლეთ სია.",
+ "noRepositoriesVisibleGitlab": "რეპოზიტორიები არ ჩანს. შეამოწმეთ GitLab-ის რეპოზიტორიებზე წვდომა, შემდეგ განაახლეთ სია.",
+ "noRepositoriesVisibleBitbucket": "რეპოზიტორიები არ ჩანს. შეამოწმეთ Bitbucket-ის რეპოზიტორიებზე წვდომა, შემდეგ განაახლეთ სია.",
+ "bitbucketOrganizationsOnly": "Bitbucket მხოლოდ ორგანიზაციებისთვისაა ხელმისაწვდომი.",
+ "branchPickerTitle": "განშტოების არჩევა",
+ "branchDefault": "ნაგულისხმები",
+ "branchAccessibility": "განშტოება: {{label}}",
+ "branchLoading": "განშტოებების ჩატვირთვა",
+ "branchLoadError": "განშტოებების ჩატვირთვა ვერ მოხერხდა",
+ "branchUnavailable": "ამ რეპოზიტორიისთვის განშტოებები მიუწვდომელია. შეამოწმეთ წვდომა პროვაიდერთან, შემდეგ აირჩიეთ სხვა რეპოზიტორია.",
+ "branchEmpty": "განშტოებები მიუწვდომელია",
+ "branchPlaceholder": "აირჩიეთ განშტოება",
"runOnWithTarget": "გაშვების გარემო: {{target}}",
"environment": "გარემო",
"couldNotLoadEnvironment": "თქვენი გარემოს ჩატვირთვა ვერ მოხერხდა.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "რეპოზიტორიების განახლება ვერ მოხერხდა. სცადეთ ხელახლა.",
"discardDraftTitle": "წაიშალოს მონახაზი?",
"discardDraftMessage": "თქვენი მოთხოვნა დაიკარგება.",
+ "discardWithUploadsMessage": "თქვენი მოთხოვნა და ატვირთული ფაილები, რომლებიც გაგზავნილ შეტყობინებებს არ ერთვის, წაიშლება.",
"discardFailed": "მონახაზის წაშლა ვერ მოხერხდა. სცადეთ ხელახლა.",
"remoteHint": "ლოკალური kilo პროცესის სამართავად კომპიუტერზე გაუშვით `kilo remote`, ან მიმდინარე CLI სესიაში — `/remote`.",
- "connectBitbucketDescription": "ბრაუზერში დააკავშირეთ Bitbucket-ის ანგარიში, შემდეგ აქ დაბრუნდით რეპოზიტორიის ასარჩევად.",
- "connectGitlabDescription": "ბრაუზერში დააკავშირეთ GitLab-ის ანგარიში, შემდეგ აქ დაბრუნდით რეპოზიტორიის ასარჩევად.",
- "couldNotLoadBitbucketRepositories": "Bitbucket-ის რეპოზიტორიების ჩატვირთვა ვერ მოხერხდა.",
- "couldNotLoadGithubRepositories": "GitHub-ის რეპოზიტორიების ჩატვირთვა ვერ მოხერხდა.",
- "couldNotLoadGitlabRepositories": "GitLab-ის რეპოზიტორიების ჩატვირთვა ვერ მოხერხდა.",
- "gitlabConnected": "GitLab დაკავშირებულია",
- "noRepositoriesVisibleBitbucket": "რეპოზიტორიები არ ჩანს. შეამოწმეთ Bitbucket-ის რეპოზიტორიებზე წვდომა, შემდეგ განაახლეთ სია.",
- "noRepositoriesVisibleGitlab": "რეპოზიტორიები არ ჩანს. შეამოწმეთ GitLab-ის რეპოზიტორიებზე წვდომა, შემდეგ განაახლეთ სია.",
- "openBitbucket": "Bitbucket-ის გახსნა",
- "openGitlab": "GitLab-ის გახსნა",
- "recentlyUsed": "ბოლოს გამოყენებული",
- "cliCannotContinue": "ამ CLI-ს სესიის გაგრძელება არ შეუძლია. აირჩიეთ Cloud Agent ან სხვა CLI.",
"continueFrom": "გრძელდება სესია: {{title}}.",
- "importFailed": "ამ სესიის იმპორტირება ვერ მოხერხდა.",
"importingSession": "სესიის იმპორტი მიმდინარეობს…",
- "discardWithUploadsMessage": "თქვენი მოთხოვნა და ატვირთული ფაილები, რომლებიც გაგზავნილ შეტყობინებებს არ ერთვის, წაიშლება."
+ "cliCannotContinue": "ამ CLI-ს სესიის გაგრძელება არ შეუძლია. აირჩიეთ Cloud Agent ან სხვა CLI.",
+ "importFailed": "ამ სესიის იმპორტირება ვერ მოხერხდა."
},
"partRenderer": {
"updatedFileCount_one": "განახლდა {{displayCount}} ფაილი.",
diff --git a/apps/mobile/src/i18n/locales/kk.json b/apps/mobile/src/i18n/locales/kk.json
index 09b2afc422..50f7b10b45 100644
--- a/apps/mobile/src/i18n/locales/kk.json
+++ b/apps/mobile/src/i18n/locales/kk.json
@@ -36,6 +36,7 @@
"cost": "Құны",
"discard": "Бас тарту",
"findings": "Анықталған мәселелер",
+ "mergeRequest": "біріктіру сұрауы",
"notConnected": "Қосылмаған",
"notifications": "Хабарландырулар",
"pullRequest": "біріктіру сұрауы",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Өзгерістердің бос жолы"
},
"connectionExpired": "GitHub қосылымының мерзімі аяқталды.",
+ "capabilities": {
+ "banner": {
+ "title": "Бұл провайдерде қолжетімсіз",
+ "accessibility": "Бұл провайдерде қолжетімсіз: {{reason}}"
+ }
+ },
"merge": {
"merge": "Біріктіру",
"mergeNow": "Қазір біріктіру",
"mergePullRequest": "Біріктіру сұрауын біріктіру",
+ "mergeTermTitle": "{{term}}н біріктіру",
"enableAutoMerge": "Автоматты біріктіруді қосу",
"disableAutoMerge": "Автоматты біріктіруді өшіру",
"autoMergeOn": "Автоматты біріктіру қосулы",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Біріктіргеннен кейін тармақты жою",
"noEnabledMethods": "Бұл репозиторийде біріктіру әдістері қосылмаған. Репозиторий әкімшісінен біріктіру коммитін жасау, коммиттерді біріктіру немесе негізін ауыстыру әдісін қосуды сұраңыз.",
"confirmTitle": "Біріктіру сұрауын біріктіру керек пе?",
+ "confirmTitleTerm": "{{term}}н біріктіру керек пе?",
"confirmMessage": "Өзгерістеріңіз негізгі тармаққа біріктіріледі.",
"enableAutoMergeConfirmTitle": "Автоматты біріктіруді қосу керек пе?",
"enableAutoMergeConfirmMessage": "Барлық міндетті тексерулер сәтті аяқталғанда, GitHub бұл біріктіру сұрауын автоматты түрде біріктіреді.",
+ "enableAutoMergeConfirmMessageTerm": "Пайплайн сәтті аяқталған соң, {{term}} автоматты түрде біріктіріледі.",
+ "enableAutoMergeDescriptionTerm": "Пайплайн сәтті аяқталған соң, бұл {{term}} GitLab-та автоматты түрде біріктіріледі.",
"forbidden": "Бұл біріктіру сұрауын біріктіруге рұқсатыңыз жоқ.",
"cannotMerge": "Бұл біріктіру сұрауын қазіргі күйінде біріктіру мүмкін емес.",
"couldNotMerge": "Біріктіру сұрауын біріктіру мүмкін болмады.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Бұрын біріктірілген",
- "closed": "Бұл біріктіру сұрауы жабылған"
+ "closed": "Бұл біріктіру сұрауы жабылған",
+ "closedMergeRequest": "Бұл біріктіру сұрауы жабылған"
},
"partialSuccessBanner": {
"body": "Тармақты жою мүмкін болмады: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Бұл біріктіру сұрауын әзірге біріктіру мүмкін емес",
"notMergeableDetail": "GitHub хабарлаған біріктіру күйі: {{state}}."
},
+ "restrictions": {
+ "title": "Біріктіру шектеулері",
+ "approvalsRequired_one": "{{displayCount}} мақұлдау қажет",
+ "approvalsRequired_other": "{{displayCount}} мақұлдау қажет",
+ "pipelineMustSucceed": "Біріктіру алдында пайплайн сәтті аяқталуы керек."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Пайплайн соңғы коммитте сәтсіз аяқталды.",
+ "pendingPipeline": "Пайплайн соңғы коммитте әлі жұмыс істеп тұр.",
+ "permission": "Бұл {{term}}н біріктіруге рұқсатыңыз жоқ.",
+ "draft": "Біріктіру алдында {{term}}н кодты тексеруге дайын деп белгілеңіз."
+ },
"methodLabels": {
"merge": "Біріктіру коммитін жасау",
"squash": "Бір коммитке жинап біріктіру",
@@ -448,6 +472,7 @@
"acceptTerms": "Қабылдау",
"replyBadRequest": "Бұл жауапты жариялау мүмкін емес. Талқылау тармағы өзгерген болуы мүмкін.",
"replyForbidden": "Бұл біріктіру сұрауына жауап беруге рұқсатыңыз жоқ.",
+ "replyForbiddenTerm": "Бұл {{term}}на жауап беруге рұқсатыңыз жоқ.",
"moderation": {
"reportContent": {
"terminal": "Бұл пікірге шағымдану мүмкін емес.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Біріктіру сұрауындағы кодты тексеру",
"headLine": "{{counts}} · соңғы коммит: {{sha}}",
"entry": {
- "eyebrow": "Біріктіру сұрауын URL арқылы ашыңыз.",
- "pastePrLink": "PR сілтемесін қою",
- "noRecentPrs": "Жақында ашылған PR жоқ",
- "noRecentPrsDescription": "Кодты тексеруді бастау үшін жоғарыдағы өріске PR сілтемесін қойыңыз — келесі жолы ол осында көрсетіледі.",
+ "eyebrow": "Тарту немесе біріктіру сұрауын URL арқылы ашыңыз.",
+ "pastePrLink": "Тарту немесе біріктіру сұрауының сілтемесін қою",
+ "noRecentPrs": "Жақында қаралғандар жоқ",
+ "noRecentPrsDescription": "Тексеруді бастау үшін жоғарыға сілтеме қойыңыз — келесі жолы ол осында көрсетіледі.",
"couldNotLoad": "Жүктеу мүмкін болмады.",
"removeFromRecentsTitle": "Соңғы ашылғандар тізімінен жою керек пе?",
- "removeFromRecentsMessage": "Бұл біріктіру сұрауы соңғы ашылғандар тізімінен жойылады.",
+ "removeFromRecentsMessage": "Бұл тексеру соңғы қаралғандар тізімінен жойылады.",
"removeRecentAccessibility": "Соңғы ашылғандар тізімінен жою: {{repo}}",
- "urlAccessibility": "GitHub-тағы біріктіру сұрауының URL мекенжайы",
- "clearLink": "Біріктіру сұрауының сілтемесін тазалау",
- "pasteLink": "Біріктіру сұрауының сілтемесін қою",
+ "urlAccessibility": "Тарту немесе біріктіру сұрауының URL мекенжайын енгізіңіз",
+ "urlPlaceholder": "Тарту немесе біріктіру сұрауының URL мекенжайы",
+ "openAccessibility": "Тарту немесе біріктіру сұрауын ашу",
+ "clearLink": "Сілтемені тазалау",
+ "pasteLink": "Тарту немесе біріктіру сұрауының сілтемесін қою",
"open": "Ашу"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub қосылымын тексеру мүмкін болмады.",
"checkFailedMessage": "Бұл деректер жүктелмейінше, жүйеге кіру күйін анықтау мүмкін емес.",
+ "checkFailedTitleGitLab": "GitLab қосылымын тексеру мүмкін болмады.",
+ "checkFailedTitleBitbucket": "Bitbucket қосылымын тексеру мүмкін болмады.",
+ "providerCheckFailedMessage": "Жүктелгенше қосылым күйі қолжетімсіз.",
"reconnectTitle": "GitHub-қа қайта қосылу",
"reconnectDescription": "GitHub қосылымына берілген рұқсат қайтарып алынды. Телефонда біріктіру сұрауларындағы кодты тексеруді жалғастыру үшін қайта қосылыңыз.",
- "description": "Телефонда біріктіру сұрауларындағы кодты тексеру үшін GitHub тіркелгіңізді қосыңыз."
+ "description": "Телефонда біріктіру сұрауларындағы кодты тексеру үшін GitHub тіркелгіңізді қосыңыз.",
+ "gitlabDescription": "Мобильдіде біріктіру сұрауларын қарау үшін GitLab тіркелгіңізді қосыңыз.",
+ "bitbucketDescription": "Мобильдіде тарту сұрауларын қарау үшін Bitbucket-ты осы ұйымға қосыңыз.",
+ "bitbucketOrgOnlyDescription": "Осы ұйымның Bitbucket тарту сұрауларын қарау үшін профиліңізден ұйымды таңдаңыз."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub қосылымының мерзімі аяқталды.",
- "message": "GitHub қосылымыңыз енді жарамсыз. Қосылымды қайта тексеріңіз — қажет болса, қайта қосылу ұсынылады."
+ "message": "GitHub қосылымыңыз енді жарамсыз. Қосылымды қайта тексеріңіз — қажет болса, қайта қосылу ұсынылады.",
+ "gitlabTitle": "GitLab қосылымының мерзімі аяқталды.",
+ "bitbucketTitle": "Bitbucket қосылымының мерзімі аяқталды.",
+ "providerMessage": "{{provider}} қосылымыңыз енді жарамсыз. Қосылымды қайта тексеріңіз — қажет болса, қайта қосылу ұсынылады."
},
"eventChips": {
"comment": "Пікір жазу",
@@ -643,6 +679,21 @@
"files": "Файл",
"discussion": "Талқылау"
},
+ "terms": {
+ "pullRequest": "Біріктіру сұрауы",
+ "mergeRequest": "Біріктіру сұрауы",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Біріктіру сұрауымен бөлісу",
+ "viewOnProvider": "{{provider}}-да қарау",
+ "mergeRequestUnavailable": "Біріктіру сұрауы қолжетімсіз",
+ "unavailableDescription": "Ол жойылған болуы мүмкін, немесе оған рұқсатыңыз жоқ.",
+ "accessDeniedMergeRequest": "Бұл біріктіру сұрауын көруге рұқсатыңыз жоқ.",
+ "couldNotLoadMergeRequest": "Біріктіру сұрауын жүктеу мүмкін болмады.",
+ "discussionAccessDenied": "Бұл біріктіру сұрауының талқылауын қарауға рұқсатыңыз жоқ.",
+ "discussionUnavailableMessage": "Бұл біріктіру сұрауы жойылған болуы мүмкін.",
+ "noDiscussionDescription": "Бұл біріктіру сұрауында кодты тексеру талқылаулары да, жалпы пікірлер де жоқ.",
+ "noFilesChangedDescription": "Бұл біріктіру сұрауында файлдарға өзгеріс енгізілмеген."
+ },
"fileStatus": {
"modified": "Өзгертілді",
"renamed": "Атауы өзгертілді",
@@ -659,7 +710,7 @@
"emptyLine": "(бос)"
},
"linkPasteClipboardEmpty": "Алмасу буфері бос.",
- "linkPasteNotAPullRequest": "Бұл GitHub-тағы біріктіру сұрауының сілтемесі емес.",
+ "linkPasteNotAPullRequest": "Бұл тарту немесе біріктіру сұрауының сілтемесі емес.",
"announce": {
"commentPosted": "Пікір жарияланды",
"reviewSubmitted": "Кодты тексеру нәтижесі жіберілді",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Бұл пікірді жариялау мүмкін емес. Таңдалған жол өзгерген немесе PR жаңартылған болуы мүмкін.",
"reviewNotSubmitted": "Кодты тексеру нәтижесін осы күйінде жіберу мүмкін емес. PR өзгерген болуы мүмкін немесе өз біріктіру сұрауыңыздағы кодты тексеруге рұқсат жоқ.",
+ "reviewNotSubmittedTerm": "Бұл тексеруді осы күйінде жіберу мүмкін емес. {{term}} өзгерген болуы мүмкін, немесе сіз өз {{term}} бойынша тексере алмайсыз.",
"couldNotPostComment": "Пікірді жариялау мүмкін болмады.",
"couldNotSubmitReview": "Кодты тексеру нәтижесін жіберу мүмкін болмады. Байланысты тексеріп, қайталап көріңіз."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Жауап беру мүмкін болмады.",
"couldNotCompleteAction": "Бұл әрекетті аяқтау мүмкін болмады.",
"mergeResultDefaultError": "GitHub біріктіруді аяқтамады.",
+ "mergeResultNotCompleted": "{{term}} біріктірілмеді. Күйін тексеріп, қайталап көріңіз.",
"ambiguous": "Әрекеттің орындалғанын растау мүмкін болмады — қайталау алдында PR-ді тексеріңіз.",
"persistenceFailed": "Бұл әрекетті тіркей алмадық. Кейінірек қайталап көріңіз.",
"forbidden": "Рұқсат жоқ."
@@ -1988,11 +2041,31 @@
"retryConnection": "Қайта қосылу"
},
"newSession": {
+ "recentlyUsed": "Жақында қолданылған",
+ "couldNotLoadGithubRepositories": "GitHub репозиторийлерін жүктеу мүмкін болмады.",
+ "couldNotLoadGitlabRepositories": "GitLab репозиторийлерін жүктеу мүмкін болмады.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket репозиторийлерін жүктеу мүмкін болмады.",
"connectGithubDescription": "Браузерде GitHub тіркелгісін байланыстырып, репозиторий таңдау үшін осында оралыңыз.",
+ "connectGitlabDescription": "Браузерде GitLab тіркелгісін байланыстырып, репозиторий таңдау үшін осында оралыңыз.",
+ "connectBitbucketDescription": "Браузерде Bitbucket тіркелгісін байланыстырып, репозиторий таңдау үшін осында оралыңыз.",
"openGithub": "GitHub-ты ашу",
+ "openGitlab": "GitLab-ты ашу",
+ "openBitbucket": "Bitbucket-ті ашу",
"refreshRepositories": "Репозиторийлерді жаңарту",
"githubConnected": "GitHub қосылды",
+ "gitlabConnected": "GitLab қосылды",
"noRepositoriesVisible": "Репозиторийлер көрінбейді. Kilo GitHub қолданбасының репозиторийлерге кіру рұқсатын тексеріп, тізімді жаңартыңыз.",
+ "noRepositoriesVisibleGitlab": "Репозиторийлер көрінбейді. GitLab репозиторийлеріне кіру рұқсатын тексеріп, тізімді жаңартыңыз.",
+ "noRepositoriesVisibleBitbucket": "Репозиторийлер көрінбейді. Bitbucket репозиторийлеріне кіру рұқсатын тексеріп, тізімді жаңартыңыз.",
+ "bitbucketOrganizationsOnly": "Bitbucket тек ұйымдарға қолжетімді.",
+ "branchPickerTitle": "Тармақты таңдау",
+ "branchDefault": "Әдепкі",
+ "branchAccessibility": "Тармақ: {{label}}",
+ "branchLoading": "Тармақтар жүктелуде",
+ "branchLoadError": "Тармақтарды жүктеу мүмкін болмады",
+ "branchUnavailable": "Бұл репозиторий үшін тармақтар қолжетімсіз. Провайдердегі рұқсатыңызды тексеріңіз, содан кейін басқа репозиторийді таңдаңыз.",
+ "branchEmpty": "Тармақтар жоқ",
+ "branchPlaceholder": "Тармақты таңдаңыз",
"runOnWithTarget": "Іске қосу орны: {{target}}",
"environment": "Орта",
"couldNotLoadEnvironment": "Ортаңызды жүктеу мүмкін болмады.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Репозиторийлерді жаңарту мүмкін болмады. Қайталап көріңіз.",
"discardDraftTitle": "Нобайды жою керек пе?",
"discardDraftMessage": "Сұрауыңыз жойылады.",
+ "discardWithUploadsMessage": "Сұрауыңыз бен ешбір хабарламаға тіркелмеген жүктелген файлдар жойылады.",
"discardFailed": "Нобайды жою мүмкін болмады. Қайталап көріңіз.",
"remoteHint": "Жергілікті kilo процесін басқару үшін компьютеріңізде `kilo remote` пәрменін немесе іске қосылған CLI сессиясында `/remote` пәрменін орындаңыз.",
- "connectBitbucketDescription": "Браузерде Bitbucket тіркелгісін байланыстырып, репозиторий таңдау үшін осында оралыңыз.",
- "connectGitlabDescription": "Браузерде GitLab тіркелгісін байланыстырып, репозиторий таңдау үшін осында оралыңыз.",
- "couldNotLoadBitbucketRepositories": "Bitbucket репозиторийлерін жүктеу мүмкін болмады.",
- "couldNotLoadGithubRepositories": "GitHub репозиторийлерін жүктеу мүмкін болмады.",
- "couldNotLoadGitlabRepositories": "GitLab репозиторийлерін жүктеу мүмкін болмады.",
- "gitlabConnected": "GitLab қосылды",
- "noRepositoriesVisibleBitbucket": "Репозиторийлер көрінбейді. Bitbucket репозиторийлеріне кіру рұқсатын тексеріп, тізімді жаңартыңыз.",
- "noRepositoriesVisibleGitlab": "Репозиторийлер көрінбейді. GitLab репозиторийлеріне кіру рұқсатын тексеріп, тізімді жаңартыңыз.",
- "openBitbucket": "Bitbucket-ті ашу",
- "openGitlab": "GitLab-ты ашу",
- "recentlyUsed": "Жақында қолданылған",
"continueFrom": "«{{title}}» сессиясы жалғасуда.",
"importingSession": "Сессия импортталуда",
"cliCannotContinue": "Бұл CLI сессияны жалғастыра алмайды. Cloud Agent қызметін немесе басқа CLI құралын таңдаңыз.",
- "importFailed": "Бұл сессияны импорттау мүмкін болмады.",
- "discardWithUploadsMessage": "Сұрауыңыз бен ешбір хабарламаға тіркелмеген жүктелген файлдар жойылады."
+ "importFailed": "Бұл сессияны импорттау мүмкін болмады."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} файл жаңартылды.",
diff --git a/apps/mobile/src/i18n/locales/km.json b/apps/mobile/src/i18n/locales/km.json
index 25a37c293e..7d9a51db24 100644
--- a/apps/mobile/src/i18n/locales/km.json
+++ b/apps/mobile/src/i18n/locales/km.json
@@ -36,6 +36,7 @@
"cost": "ចំណាយ",
"discard": "បោះបង់",
"findings": "បញ្ហាដែលរកឃើញ",
+ "mergeRequest": "សំណើបញ្ចូល",
"notConnected": "មិនទាន់ភ្ជាប់",
"notifications": "ការជូនដំណឹង",
"pullRequest": "សំណើបញ្ចូលកូដ",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ជួរដេកទទេក្នុងការប្រៀបធៀបកូដ"
},
"connectionExpired": "ការតភ្ជាប់ទៅ GitHub បានផុតកំណត់ហើយ។",
+ "capabilities": {
+ "banner": {
+ "title": "មិនអាចប្រើបានលើអ្នកផ្តល់សេវានេះទេ",
+ "accessibility": "មិនអាចប្រើបានលើអ្នកផ្តល់សេវានេះទេ: {{reason}}"
+ }
+ },
"merge": {
"merge": "បញ្ចូលគ្នា",
"mergeNow": "បញ្ចូលឥឡូវនេះ",
"mergePullRequest": "បញ្ចូលសំណើបញ្ចូលកូដ",
+ "mergeTermTitle": "បញ្ចូល{{term}}",
"enableAutoMerge": "បើកការបញ្ចូលដោយស្វ័យប្រវត្តិ",
"disableAutoMerge": "បិទការបញ្ចូលដោយស្វ័យប្រវត្តិ",
"autoMergeOn": "ការបញ្ចូលដោយស្វ័យប្រវត្តិបានបើក",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "លុបសាខាបន្ទាប់ពីបញ្ចូល",
"noEnabledMethods": "ឃ្លាំងកូដនេះមិនបានបើកវិធីសាស្ត្របញ្ចូលណាមួយទេ។ ស្នើឱ្យអ្នកគ្រប់គ្រងឃ្លាំងកូដបើកការបញ្ចូលធម្មតា ការបង្រួមកំណត់ត្រាកែប្រែ ឬការប្តូរមូលដ្ឋាន។",
"confirmTitle": "បញ្ចូលសំណើបញ្ចូលកូដនេះ?",
+ "confirmTitleTerm": "បញ្ចូល{{term}}ទេ?",
"confirmMessage": "សកម្មភាពនេះនឹងបញ្ចូលការកែប្រែរបស់អ្នកទៅក្នុងសាខាគោល។",
"enableAutoMergeConfirmTitle": "បើកការបញ្ចូលដោយស្វ័យប្រវត្តិ?",
"enableAutoMergeConfirmMessage": "GitHub នឹងបញ្ចូលសំណើបញ្ចូលកូដនេះដោយស្វ័យប្រវត្តិ នៅពេលការត្រួតពិនិត្យចាំបាច់ទាំងអស់ជោគជ័យ។",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} នឹងត្រូវបានបញ្ចូលដោយស្វ័យប្រវត្តិនៅពេលបំពង់ផ្សែងជោគជ័យ។",
+ "enableAutoMergeDescriptionTerm": "GitLab នឹងបញ្ចូល{{term}}នេះដោយស្វ័យប្រវត្តិនៅពេលបំពង់ផ្សែងជោគជ័យ។",
"forbidden": "អ្នកគ្មានសិទ្ធិបញ្ចូលសំណើបញ្ចូលកូដនេះទេ។",
"cannotMerge": "មិនអាចបញ្ចូលសំណើបញ្ចូលកូដនេះក្នុងស្ថានភាពបច្ចុប្បន្នបានទេ។",
"couldNotMerge": "មិនអាចបញ្ចូលសំណើបញ្ចូលកូដបានទេ។",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "បានបញ្ចូលរួច",
- "closed": "សំណើបញ្ចូលកូដនេះបានបិទ"
+ "closed": "សំណើបញ្ចូលកូដនេះបានបិទ",
+ "closedMergeRequest": "សំណើបញ្ចូលនេះបានបិទ"
},
"partialSuccessBanner": {
"body": "មិនអាចលុបសាខាបានទេ៖ {{reason}}",
@@ -401,6 +413,18 @@
"notMergeableTitle": "មិនទាន់អាចបញ្ចូលសំណើបញ្ចូលកូដនេះបានទេ",
"notMergeableDetail": "GitHub បានរាយការណ៍ថា ស្ថានភាពលទ្ធភាពបញ្ចូលគឺ {{state}}។"
},
+ "restrictions": {
+ "title": "ការកំណត់បញ្ចូល",
+ "approvalsRequired_one": "ត្រូវការការអនុម័ត {{displayCount}}",
+ "approvalsRequired_other": "ត្រូវការការអនុម័ត {{displayCount}}",
+ "pipelineMustSucceed": "បំពង់ផ្សែងត្រូវតែជោគជ័យមុនពេលបញ្ចូល។"
+ },
+ "providerBlocked": {
+ "failingPipeline": "បំពង់ផ្សែងកំពុងបរាជ័យលើកូមីតចុងក្រោយ។",
+ "pendingPipeline": "បំពង់ផ្សែងកំពុងដំណើរការនៅឡើយលើកូមីតចុងក្រោយ។",
+ "permission": "អ្នកគ្មានសិទ្ធិបញ្ចូល{{term}}នេះទេ។",
+ "draft": "សម្គាល់{{term}}ថារួចរាល់សម្រាប់ការពិនិត្យ មុនពេលបញ្ចូល។"
+ },
"methodLabels": {
"merge": "បង្កើតកំណត់ត្រាកែប្រែសម្រាប់ការបញ្ចូល",
"squash": "បង្រួមកំណត់ត្រាកែប្រែ រួចបញ្ចូល",
@@ -448,6 +472,7 @@
"acceptTerms": "ទទួលយក",
"replyBadRequest": "មិនអាចបង្ហោះការឆ្លើយតបនេះបានទេ។ ការពិភាក្សាអាចបានផ្លាស់ប្តូរ។",
"replyForbidden": "អ្នកគ្មានសិទ្ធិឆ្លើយតបលើសំណើបញ្ចូលកូដនេះទេ។",
+ "replyForbiddenTerm": "អ្នកគ្មានសិទ្ធិឆ្លើយតបលើ{{term}}នេះទេ។",
"moderation": {
"reportContent": {
"terminal": "មិនអាចរាយការណ៍មតិយោបល់នេះបានទេ។",
@@ -508,17 +533,19 @@
"reviewPullRequest": "ពិនិត្យសំណើបញ្ចូលកូដ",
"headLine": "{{counts}} · កំណត់ត្រាកែប្រែចុងក្រោយ {{sha}}",
"entry": {
- "eyebrow": "បើកសំណើបញ្ចូលកូដតាម URL។",
- "pastePrLink": "បិទភ្ជាប់តំណ PR",
- "noRecentPrs": "គ្មាន PR ថ្មីៗទេ",
- "noRecentPrsDescription": "បិទភ្ជាប់តំណ PR ខាងលើដើម្បីចាប់ផ្តើមការពិនិត្យ — វានឹងបង្ហាញនៅទីនេះលើកក្រោយ។",
+ "eyebrow": "បើកសំណើបញ្ចូលកូដ ឬ សំណើបញ្ចូលតាម URL",
+ "pastePrLink": "បិទភ្ជាប់តំណសំណើបញ្ចូលកូដ ឬ សំណើបញ្ចូល",
+ "noRecentPrs": "គ្មានការពិនិត្យថ្មីៗទេ",
+ "noRecentPrsDescription": "បិទភ្ជាប់តំណខាងលើដើម្បីចាប់ផ្តើមការពិនិត្យ — វានឹងបង្ហាញនៅទីនេះលើកក្រោយ។",
"couldNotLoad": "មិនអាចផ្ទុកបានទេ។",
"removeFromRecentsTitle": "ដកចេញពីបញ្ជីថ្មីៗ?",
- "removeFromRecentsMessage": "សំណើបញ្ចូលកូដនេះនឹងត្រូវដកចេញពីបញ្ជីថ្មីៗរបស់អ្នក។",
+ "removeFromRecentsMessage": "ការពិនិត្យនេះនឹងត្រូវបានដកចេញពីបញ្ជីថ្មីៗរបស់អ្នក។",
"removeRecentAccessibility": "ដក {{repo}} ចេញពីបញ្ជីថ្មីៗ",
- "urlAccessibility": "URL សំណើបញ្ចូលកូដនៅលើ GitHub",
- "clearLink": "លុបតំណសំណើបញ្ចូលកូដ",
- "pasteLink": "បិទភ្ជាប់តំណសំណើបញ្ចូលកូដ",
+ "urlAccessibility": "បញ្ចូល URL សំណើបញ្ចូលកូដ ឬ សំណើបញ្ចូល",
+ "urlPlaceholder": "URL សំណើបញ្ចូលកូដ ឬ សំណើបញ្ចូល",
+ "openAccessibility": "បើកសំណើបញ្ចូលកូដ ឬ សំណើបញ្ចូល",
+ "clearLink": "លុបតំណ",
+ "pasteLink": "បិទភ្ជាប់តំណសំណើបញ្ចូលកូដ ឬ សំណើបញ្ចូល",
"open": "បើក"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "មិនអាចពិនិត្យការតភ្ជាប់ GitHub បានទេ។",
"checkFailedMessage": "មិនអាចបង្ហាញស្ថានភាពចូលគណនីបានទេ រហូតដល់ផ្ទុកទិន្នន័យនេះរួច។",
+ "checkFailedTitleGitLab": "មិនអាចពិនិត្យការតភ្ជាប់ GitLab បានទេ។",
+ "checkFailedTitleBitbucket": "មិនអាចពិនិត្យការតភ្ជាប់ Bitbucket បានទេ។",
+ "providerCheckFailedMessage": "ស្ថានភាពការតភ្ជាប់មិនអាចប្រើបានទេរហូតដល់បានផ្ទុករួច។",
"reconnectTitle": "ភ្ជាប់ GitHub ឡើងវិញ",
"reconnectDescription": "ការអនុញ្ញាតឱ្យភ្ជាប់ GitHub របស់អ្នកត្រូវបានដកហូត។ ភ្ជាប់ឡើងវិញ ដើម្បីបន្តពិនិត្យសំណើបញ្ចូលកូដនៅលើទូរស័ព្ទ។",
- "description": "ភ្ជាប់គណនី GitHub របស់អ្នក ដើម្បីពិនិត្យសំណើបញ្ចូលកូដនៅលើទូរស័ព្ទ។"
+ "description": "ភ្ជាប់គណនី GitHub របស់អ្នក ដើម្បីពិនិត្យសំណើបញ្ចូលកូដនៅលើទូរស័ព្ទ។",
+ "gitlabDescription": "ភ្ជាប់គណនី GitLab របស់អ្នកដើម្បីពិនិត្យសំណើបញ្ចូលលើទូរស័ព្ទ។",
+ "bitbucketDescription": "ភ្ជាប់ Bitbucket ទៅអង្គភាពនេះដើម្បីពិនិត្យសំណើបញ្ចូលកូដលើទូរស័ព្ទ។",
+ "bitbucketOrgOnlyDescription": "ជ្រើសរើសអង្គភាពមួយក្នុងប្រវត្តិរូបរបស់អ្នកដើម្បីពិនិត្យសំណើបញ្ចូលកូដ Bitbucket របស់វា។"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "ការតភ្ជាប់ទៅ GitHub បានផុតកំណត់ហើយ។",
- "message": "ការតភ្ជាប់ GitHub របស់អ្នកលែងមានសុពលភាពហើយ។ ពិនិត្យការតភ្ជាប់ម្តងទៀត។ ប្រសិនបើចាំបាច់ កម្មវិធីនឹងស្នើឱ្យអ្នកភ្ជាប់ឡើងវិញ។"
+ "message": "ការតភ្ជាប់ GitHub របស់អ្នកលែងមានសុពលភាពហើយ។ ពិនិត្យការតភ្ជាប់ម្តងទៀត។ ប្រសិនបើចាំបាច់ កម្មវិធីនឹងស្នើឱ្យអ្នកភ្ជាប់ឡើងវិញ។",
+ "gitlabTitle": "ការតភ្ជាប់ទៅ GitLab បានផុតកំណត់ហើយ។",
+ "bitbucketTitle": "ការតភ្ជាប់ទៅ Bitbucket បានផុតកំណត់ហើយ។",
+ "providerMessage": "ការតភ្ជាប់ {{provider}} របស់អ្នកលែងមានសុពលភាពហើយ។ ពិនិត្យការតភ្ជាប់ម្តងទៀត។ ប្រសិនបើចាំបាច់ កម្មវិធីនឹងស្នើឱ្យអ្នកភ្ជាប់ឡើងវិញ។"
},
"eventChips": {
"comment": "អត្ថាធិប្បាយ",
@@ -643,6 +679,21 @@
"files": "ឯកសារ",
"discussion": "ការពិភាក្សា"
},
+ "terms": {
+ "pullRequest": "សំណើបញ្ចូលកូដ",
+ "mergeRequest": "សំណើបញ្ចូល",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "ចែករំលែកសំណើបញ្ចូល",
+ "viewOnProvider": "មើលលើ {{provider}}",
+ "mergeRequestUnavailable": "មិនអាចបើកសំណើបញ្ចូលបាន",
+ "unavailableDescription": "វាអាចត្រូវបានលុបចោល ឬអ្នកអាចគ្មានសិទ្ធិចូលប្រើទេ។",
+ "accessDeniedMergeRequest": "អ្នកគ្មានសិទ្ធិមើលសំណើបញ្ចូលនេះទេ។",
+ "couldNotLoadMergeRequest": "មិនអាចផ្ទុកសំណើបញ្ចូលបានទេ។",
+ "discussionAccessDenied": "អ្នកគ្មានសិទ្ធិមើលការពិភាក្សារបស់ សំណើបញ្ចូល នេះទេ។",
+ "discussionUnavailableMessage": "សំណើបញ្ចូលនេះអាចត្រូវបានដកចេញ។",
+ "noDiscussionDescription": "មិនទាន់មានការពិភាក្សាពិនិត្យកូដ ឬមតិយោបល់លើសំណើបញ្ចូលនេះទេ។",
+ "noFilesChangedDescription": "សំណើបញ្ចូលនេះមិនមានការកែប្រែឯកសារទេ។"
+ },
"fileStatus": {
"modified": "បានកែប្រែ",
"renamed": "បានប្តូរឈ្មោះ",
@@ -659,7 +710,7 @@
"emptyLine": "(ទទេ)"
},
"linkPasteClipboardEmpty": "ក្ដារតម្បៀតខ្ទាស់ទទេ។",
- "linkPasteNotAPullRequest": "នេះមិនមែនជាតំណសំណើបញ្ចូលកូដនៅលើ GitHub ទេ។",
+ "linkPasteNotAPullRequest": "មិនមែនជាតំណសំណើបញ្ចូលកូដ ឬ សំណើបញ្ចូលទេ",
"announce": {
"commentPosted": "បានបង្ហោះមតិយោបល់",
"reviewSubmitted": "បានដាក់ស្នើការពិនិត្យ",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "មិនអាចបង្ហោះមតិយោបល់នេះបានទេ។ បន្ទាត់ដែលបានជ្រើសរើសអាចបានផ្លាស់ប្តូរ ឬ PR អាចបានធ្វើបច្ចុប្បន្នភាព។",
"reviewNotSubmitted": "មិនអាចដាក់ស្នើការពិនិត្យនេះក្នុងស្ថានភាពបច្ចុប្បន្នបានទេ។ PR អាចបានផ្លាស់ប្តូរ ឬអ្នកកំពុងពិនិត្យសំណើបញ្ចូលកូដរបស់ខ្លួនឯង ដែលមិនត្រូវបានអនុញ្ញាត។",
+ "reviewNotSubmittedTerm": "មិនអាចដាក់សំណើការពិនិត្យនេះតាមរូបភាពបច្ចុប្បន្នបានទេ។ {{term}} អាចបានផ្លាស់ប្តូរ ឬអ្នកមិនអាចពិនិត្យ{{term}}របស់ខ្លួនឯងបានទេ។",
"couldNotPostComment": "មិនអាចបង្ហោះមតិយោបល់បានទេ។",
"couldNotSubmitReview": "មិនអាចដាក់ស្នើការពិនិត្យបានទេ។ ពិនិត្យការតភ្ជាប់របស់អ្នក ហើយព្យាយាមម្តងទៀត។"
},
@@ -675,6 +727,7 @@
"couldNotReply": "មិនអាចឆ្លើយតបបានទេ។",
"couldNotCompleteAction": "មិនអាចបញ្ចប់សកម្មភាពនេះបានទេ។",
"mergeResultDefaultError": "GitHub មិនបានបញ្ចប់ការបញ្ចូលទេ។",
+ "mergeResultNotCompleted": "{{term}} មិនបានបញ្ចូលទេ។ ពិនិត្យស្ថានភាពរបស់វាហើយព្យាយាមម្តងទៀត។",
"ambiguous": "មិនអាចបញ្ជាក់បានទេ — សូមពិនិត្យ PR មុនពេលព្យាយាមម្តងទៀត។",
"persistenceFailed": "យើងមិនអាចកត់ត្រាសកម្មភាពនេះបានទេ។ សូមព្យាយាមម្តងទៀតនៅពេលក្រោយ។",
"forbidden": "អ្នកគ្មានសិទ្ធិធ្វើសកម្មភាពនេះទេ។"
@@ -1988,11 +2041,31 @@
"retryConnection": "ព្យាយាមភ្ជាប់ម្តងទៀត"
},
"newSession": {
+ "recentlyUsed": "បានប្រើថ្មីៗនេះ",
+ "couldNotLoadGithubRepositories": "មិនអាចផ្ទុកឃ្លាំងកូដពី GitHub បានទេ។",
+ "couldNotLoadGitlabRepositories": "មិនអាចផ្ទុកឃ្លាំងកូដពី GitLab បានទេ។",
+ "couldNotLoadBitbucketRepositories": "មិនអាចផ្ទុកឃ្លាំងកូដពី Bitbucket បានទេ។",
"connectGithubDescription": "ភ្ជាប់ GitHub ក្នុងកម្មវិធីរុករករបស់អ្នក បន្ទាប់មកត្រឡប់មកទីនេះ ដើម្បីជ្រើសរើសឃ្លាំងកូដ។",
+ "connectGitlabDescription": "ភ្ជាប់ GitLab ក្នុងកម្មវិធីរុករករបស់អ្នក បន្ទាប់មកត្រឡប់មកទីនេះ ដើម្បីជ្រើសរើសឃ្លាំងកូដ។",
+ "connectBitbucketDescription": "ភ្ជាប់ Bitbucket ក្នុងកម្មវិធីរុករករបស់អ្នក បន្ទាប់មកត្រឡប់មកទីនេះ ដើម្បីជ្រើសរើសឃ្លាំងកូដ។",
"openGithub": "បើក GitHub",
+ "openGitlab": "បើក GitLab",
+ "openBitbucket": "បើក Bitbucket",
"refreshRepositories": "ផ្ទុកបញ្ជីឃ្លាំងកូដឡើងវិញ",
"githubConnected": "បានភ្ជាប់ GitHub",
+ "gitlabConnected": "បានភ្ជាប់ GitLab",
"noRepositoriesVisible": "មិនឃើញឃ្លាំងកូដទេ។ ពិនិត្យសិទ្ធិចូលប្រើឃ្លាំងកូដរបស់កម្មវិធី Kilo សម្រាប់ GitHub រួចផ្ទុកបញ្ជីឡើងវិញ។",
+ "noRepositoriesVisibleGitlab": "មិនឃើញឃ្លាំងកូដទេ។ ពិនិត្យសិទ្ធិចូលប្រើឃ្លាំងកូដសម្រាប់ GitLab រួចផ្ទុកបញ្ជីឡើងវិញ។",
+ "noRepositoriesVisibleBitbucket": "មិនឃើញឃ្លាំងកូដទេ។ ពិនិត្យសិទ្ធិចូលប្រើឃ្លាំងកូដសម្រាប់ Bitbucket រួចផ្ទុកបញ្ជីឡើងវិញ។",
+ "bitbucketOrganizationsOnly": "Bitbucket អាចប្រើបានសម្រាប់តែអង្គភាពប៉ុណ្ណោះ។",
+ "branchPickerTitle": "ជ្រើសរើសសាខា",
+ "branchDefault": "លំនាំដើម",
+ "branchAccessibility": "សាខា: {{label}}",
+ "branchLoading": "កំពុងផ្ទុកសាខា",
+ "branchLoadError": "មិនអាចផ្ទុកសាខាបានទេ",
+ "branchUnavailable": "សាខាមិនអាចប្រើបានសម្រាប់ឃ្លាំងកូដនេះទេ។ ពិនិត្យសិទ្ធិចូលប្រើរបស់អ្នកជាមួយអ្នកផ្តល់សេវា បន្ទាប់មកជ្រើសរើសឃ្លាំងកូដផ្សេង។",
+ "branchEmpty": "គ្មានសាខាអាចប្រើបាន",
+ "branchPlaceholder": "ជ្រើសរើសសាខាមួយ",
"runOnWithTarget": "ដំណើរការលើ: {{target}}",
"environment": "បរិស្ថានដំណើរការ",
"couldNotLoadEnvironment": "មិនអាចផ្ទុកបរិស្ថានដំណើរការរបស់អ្នកបានទេ។",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "មិនអាចផ្ទុកបញ្ជីឃ្លាំងកូដឡើងវិញបានទេ។ សូមព្យាយាមម្តងទៀត។",
"discardDraftTitle": "បោះបង់សេចក្តីព្រាង?",
"discardDraftMessage": "សេចក្តីណែនាំដែលអ្នកបានសរសេរនឹងបាត់បង់។",
+ "discardWithUploadsMessage": "សេចក្តីណែនាំរបស់អ្នក និងឯកសារដែលបានផ្ទុកឡើង តែមិនទាន់ភ្ជាប់ទៅសារដែលបានផ្ញើ នឹងត្រូវលុប។",
"discardFailed": "មិនអាចបោះបង់សេចក្តីព្រាងបានទេ។ សូមព្យាយាមម្តងទៀត។",
"remoteHint": "ដំណើរការ `kilo remote` នៅលើកុំព្យូទ័ររបស់អ្នក ឬ `/remote` នៅក្នុងវគ្គ CLI ដែលកំពុងដំណើរការ ដើម្បីគ្រប់គ្រងដំណើរការ kilo ក្នុងមូលដ្ឋាន។",
- "connectBitbucketDescription": "ភ្ជាប់ Bitbucket ក្នុងកម្មវិធីរុករករបស់អ្នក បន្ទាប់មកត្រឡប់មកទីនេះ ដើម្បីជ្រើសរើសឃ្លាំងកូដ។",
- "connectGitlabDescription": "ភ្ជាប់ GitLab ក្នុងកម្មវិធីរុករករបស់អ្នក បន្ទាប់មកត្រឡប់មកទីនេះ ដើម្បីជ្រើសរើសឃ្លាំងកូដ។",
- "couldNotLoadBitbucketRepositories": "មិនអាចផ្ទុកឃ្លាំងកូដពី Bitbucket បានទេ។",
- "couldNotLoadGithubRepositories": "មិនអាចផ្ទុកឃ្លាំងកូដពី GitHub បានទេ។",
- "couldNotLoadGitlabRepositories": "មិនអាចផ្ទុកឃ្លាំងកូដពី GitLab បានទេ។",
- "gitlabConnected": "បានភ្ជាប់ GitLab",
- "noRepositoriesVisibleBitbucket": "មិនឃើញឃ្លាំងកូដទេ។ ពិនិត្យសិទ្ធិចូលប្រើឃ្លាំងកូដសម្រាប់ Bitbucket រួចផ្ទុកបញ្ជីឡើងវិញ។",
- "noRepositoriesVisibleGitlab": "មិនឃើញឃ្លាំងកូដទេ។ ពិនិត្យសិទ្ធិចូលប្រើឃ្លាំងកូដសម្រាប់ GitLab រួចផ្ទុកបញ្ជីឡើងវិញ។",
- "openBitbucket": "បើក Bitbucket",
- "openGitlab": "បើក GitLab",
- "recentlyUsed": "បានប្រើថ្មីៗនេះ",
"continueFrom": "កំពុងបន្តវគ្គ {{title}}។",
"importingSession": "កំពុងនាំចូលវគ្គ",
"cliCannotContinue": "CLI នេះមិនអាចបន្តវគ្គបានទេ។ ជ្រើសរើស Cloud Agent ឬ CLI ផ្សេងទៀត។",
- "importFailed": "មិនអាចនាំចូលវគ្គនេះបានទេ។",
- "discardWithUploadsMessage": "សេចក្តីណែនាំរបស់អ្នក និងឯកសារដែលបានផ្ទុកឡើង តែមិនទាន់ភ្ជាប់ទៅសារដែលបានផ្ញើ នឹងត្រូវលុប។"
+ "importFailed": "មិនអាចនាំចូលវគ្គនេះបានទេ។"
},
"partRenderer": {
"updatedFileCount_one": "បានធ្វើបច្ចុប្បន្នភាពឯកសារចំនួន {{displayCount}}។",
diff --git a/apps/mobile/src/i18n/locales/kn.json b/apps/mobile/src/i18n/locales/kn.json
index 0a5af43a41..fd84f0499b 100644
--- a/apps/mobile/src/i18n/locales/kn.json
+++ b/apps/mobile/src/i18n/locales/kn.json
@@ -36,6 +36,7 @@
"cost": "ವೆಚ್ಚ",
"discard": "ತ್ಯಜಿಸಿ",
"findings": "ಪತ್ತೆಯಾದ ಸಮಸ್ಯೆಗಳು",
+ "mergeRequest": "ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್",
"notConnected": "ಸಂಪರ್ಕಗೊಂಡಿಲ್ಲ",
"notifications": "ಅಧಿಸೂಚನೆಗಳು",
"pullRequest": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ಬದಲಾವಣೆಗಳ ಹೋಲಿಕೆಯಲ್ಲಿ ಖಾಲಿ ಸಾಲು"
},
"connectionExpired": "GitHub ಸಂಪರ್ಕದ ಅವಧಿ ಮುಗಿದಿದೆ.",
+ "capabilities": {
+ "banner": {
+ "title": "ಈ ಪ್ರೊವೈಡರ್ನಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ",
+ "accessibility": "ಈ ಪ್ರೊವೈಡರ್ನಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ: {{reason}}"
+ }
+ },
"merge": {
"merge": "ವಿಲೀನ",
"mergeNow": "ಈಗ ವಿಲೀನಗೊಳಿಸಿ",
"mergePullRequest": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ವಿಲೀನ",
+ "mergeTermTitle": "{{term}} ವಿಲೀನ",
"enableAutoMerge": "ಸ್ವಯಂ-ವಿಲೀನವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ",
"disableAutoMerge": "ಸ್ವಯಂ-ವಿಲೀನವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ",
"autoMergeOn": "ಸ್ವಯಂ-ವಿಲೀನ ಸಕ್ರಿಯವಾಗಿದೆ",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "ವಿಲೀನದ ನಂತರ ಶಾಖೆ ಅಳಿಸಿ",
"noEnabledMethods": "ಈ ರೆಪೊಸಿಟರಿಯಲ್ಲಿ ಯಾವುದೇ ವಿಲೀನ ವಿಧಾನವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿಲ್ಲ. ವಿಲೀನ, ಸ್ಕ್ವಾಶ್ ಅಥವಾ ರೀಬೇಸ್ ವಿಧಾನವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ರೆಪೊಸಿಟರಿ ನಿರ್ವಾಹಕರನ್ನು ಕೇಳಿ.",
"confirmTitle": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ವಿಲೀನಗೊಳಿಸುವುದೇ?",
+ "confirmTitleTerm": "{{term}} ವಿಲೀನಗೊಳಿಸುವುದೇ?",
"confirmMessage": "ಇದು ನಿಮ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ಮೂಲ ಶಾಖೆಗೆ ವಿಲೀನಗೊಳಿಸುತ್ತದೆ.",
"enableAutoMergeConfirmTitle": "ಸ್ವಯಂ-ವಿಲೀನ ಸಕ್ರಿಯಗೊಳಿಸುವುದೇ?",
"enableAutoMergeConfirmMessage": "ಅಗತ್ಯವಿರುವ ಎಲ್ಲಾ ತಪಾಸಣೆಗಳು ಯಶಸ್ವಿಯಾದಾಗ GitHub ಈ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವಿಲೀನಗೊಳಿಸುತ್ತದೆ.",
+ "enableAutoMergeConfirmMessageTerm": "ಪೈಪ್ಲೈನ್ ಯಶಸ್ವಿಯಾದ ಕೂಡಲೇ {{term}} ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವಿಲೀನಗೊಳ್ಳುತ್ತದೆ.",
+ "enableAutoMergeDescriptionTerm": "ಪೈಪ್ಲೈನ್ ಯಶಸ್ವಿಯಾದ ಕೂಡಲೇ GitLab ಈ {{term}}ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವಿಲೀನಗೊಳಿಸುತ್ತದೆ.",
"forbidden": "ಈ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ವಿಲೀನಗೊಳಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
"cannotMerge": "ಈ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅನ್ನು ಈಗಿರುವ ಸ್ಥಿತಿಯಲ್ಲಿ ವಿಲೀನಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.",
"couldNotMerge": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ವಿಲೀನಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "ಈಗಾಗಲೇ ವಿಲೀನಗೊಳಿಸಲಾಗಿದೆ",
- "closed": "ಈ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಮುಚ್ಚಲಾಗಿದೆ"
+ "closed": "ಈ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಮುಚ್ಚಲಾಗಿದೆ",
+ "closedMergeRequest": "ಈ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ಮುಚ್ಚಲಾಗಿದೆ"
},
"partialSuccessBanner": {
"body": "ಶಾಖೆಯನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ಈ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅನ್ನು ಇನ್ನೂ ವಿಲೀನಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
"notMergeableDetail": "GitHub ವಿಲೀನದ ಸ್ಥಿತಿಯನ್ನು {{state}} ಎಂದು ವರದಿ ಮಾಡಿದೆ."
},
+ "restrictions": {
+ "title": "ವಿಲೀನ ನಿರ್ಬಂಧಗಳು",
+ "approvalsRequired_one": "{{displayCount}} ಅನುಮೋದನೆ ಅಗತ್ಯ",
+ "approvalsRequired_other": "{{displayCount}} ಅನುಮೋದನೆಗಳು ಅಗತ್ಯ",
+ "pipelineMustSucceed": "ವಿಲೀನಗೊಳಿಸುವ ಮೊದಲು ಪೈಪ್ಲೈನ್ ಯಶಸ್ವಿಯಾಗಬೇಕು."
+ },
+ "providerBlocked": {
+ "failingPipeline": "ಕೊನೆಯ ಕಮಿಟ್ನಲ್ಲಿ ಪೈಪ್ಲೈನ್ ವಿಫಲವಾಗುತ್ತಿದೆ.",
+ "pendingPipeline": "ಕೊನೆಯ ಕಮಿಟ್ನಲ್ಲಿ ಪೈಪ್ಲೈನ್ ಇನ್ನೂ ನಡೆಯುತ್ತಿದೆ.",
+ "permission": "ಈ {{term}} ವಿಲೀನಗೊಳಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
+ "draft": "ವಿಲೀನಗೊಳಿಸುವ ಮೊದಲು {{term}} ಅನ್ನು ಪರಿಶೀಲನೆಗೆ ಸಿದ್ಧವಾಗಿದೆ ಎಂದು ಗುರುತಿಸಿ."
+ },
"methodLabels": {
"merge": "ವಿಲೀನ ಕಮಿಟ್ ರಚಿಸಿ",
"squash": "ಸ್ಕ್ವಾಶ್ ಮಾಡಿ ವಿಲೀನಗೊಳಿಸಿ",
@@ -448,6 +472,7 @@
"acceptTerms": "ಒಪ್ಪಿಕೊಳ್ಳಿ",
"replyBadRequest": "ಈ ಉತ್ತರವನ್ನು ಪೋಸ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಚರ್ಚಾ ಸರಣಿ ಬದಲಾಗಿರಬಹುದು.",
"replyForbidden": "ಈ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ಗೆ ಉತ್ತರಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
+ "replyForbiddenTerm": "ಈ {{term}}ಗೆ ಉತ್ತರಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
"moderation": {
"reportContent": {
"terminal": "ಈ ಕಾಮೆಂಟ್ ಬಗ್ಗೆ ವರದಿ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಪರಿಶೀಲಿಸಿ",
"headLine": "{{counts}} · ಹೆಡ್ {{sha}}",
"entry": {
- "eyebrow": "URL ಮೂಲಕ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ತೆರೆಯಿರಿ.",
- "pastePrLink": "PR ಲಿಂಕ್ ಅಂಟಿಸಿ",
- "noRecentPrs": "ಇತ್ತೀಚಿನ PRಗಳಿಲ್ಲ",
- "noRecentPrsDescription": "ಪರಿಶೀಲನೆ ಪ್ರಾರಂಭಿಸಲು ಮೇಲೆ PR ಲಿಂಕ್ ಅಂಟಿಸಿ — ಮುಂದಿನ ಬಾರಿ ಅದು ಇಲ್ಲಿ ಕಾಣಿಸುತ್ತದೆ.",
+ "eyebrow": "URL ಬಳಸಿ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅಥವಾ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ತೆರೆಯಿರಿ",
+ "pastePrLink": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅಥವಾ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ಲಿಂಕ್ ಅನ್ನು ಅಂಟಿಸಿ",
+ "noRecentPrs": "ಇತ್ತೀಚಿನ ಪರಿಶೀಲನೆಗಳಿಲ್ಲ",
+ "noRecentPrsDescription": "ಪರಿಶೀಲನೆ ಪ್ರಾರಂಭಿಸಲು ಮೇಲೆ ಲಿಂಕ್ ಅಂಟಿಸಿ — ಮುಂದಿನ ಸಲ ಅದು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ.",
"couldNotLoad": "ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
"removeFromRecentsTitle": "ಇತ್ತೀಚಿನ ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕುವುದೇ?",
- "removeFromRecentsMessage": "ಈ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅನ್ನು ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.",
+ "removeFromRecentsMessage": "ಈ ಪರಿಶೀಲನೆಯನ್ನು ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ.",
"removeRecentAccessibility": "{{repo}} ಅನ್ನು ಇತ್ತೀಚಿನ ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕಿ",
- "urlAccessibility": "GitHub ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ URL",
- "clearLink": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಲಿಂಕ್ ತೆರವುಗೊಳಿಸಿ",
- "pasteLink": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಲಿಂಕ್ ಅಂಟಿಸಿ",
+ "urlAccessibility": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅಥವಾ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ URL ನಮೂದಿಸಿ",
+ "urlPlaceholder": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅಥವಾ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ URL",
+ "openAccessibility": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅಥವಾ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ತೆರೆಯಿರಿ",
+ "clearLink": "ಲಿಂಕ್ ತೆಗೆದುಹಾಕಿ",
+ "pasteLink": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅಥವಾ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ಲಿಂಕ್ ಅನ್ನು ಅಂಟಿಸಿ",
"open": "ಓಪನ್"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
"checkFailedMessage": "ಇದು ಲೋಡ್ ಆಗುವವರೆಗೆ ಸೈನ್ ಇನ್ ಸ್ಥಿತಿ ಲಭ್ಯವಿಲ್ಲ.",
+ "checkFailedTitleGitLab": "GitLab ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
+ "checkFailedTitleBitbucket": "Bitbucket ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
+ "providerCheckFailedMessage": "ಇದು ಲೋಡ್ ಆಗುವವರೆಗೆ ಸಂಪರ್ಕ ಸ್ಥಿತಿ ಲಭ್ಯವಿಲ್ಲ.",
"reconnectTitle": "GitHubಗೆ ಮತ್ತೆ ಸಂಪರ್ಕಿಸಿ",
"reconnectDescription": "ನಿಮ್ಮ GitHub ಸಂಪರ್ಕವನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ. ಮೊಬೈಲ್ನಲ್ಲಿ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ಗಳ ಪರಿಶೀಲನೆ ಮುಂದುವರಿಸಲು ಮತ್ತೆ ಸಂಪರ್ಕಿಸಿ.",
- "description": "ಮೊಬೈಲ್ನಲ್ಲಿ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ನಿಮ್ಮ GitHub ಖಾತೆಯನ್ನು ಸಂಪರ್ಕಿಸಿ."
+ "description": "ಮೊಬೈಲ್ನಲ್ಲಿ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ನಿಮ್ಮ GitHub ಖಾತೆಯನ್ನು ಸಂಪರ್ಕಿಸಿ.",
+ "gitlabDescription": "ಮೊಬೈಲ್ನಲ್ಲಿ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ನಿಮ್ಮ GitLab ಖಾತೆಯನ್ನು ಸಂಪರ್ಕಿಸಿ.",
+ "bitbucketDescription": "ಮೊಬೈಲ್ನಲ್ಲಿ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಈ ಸಂಸ್ಥೆಯನ್ನು Bitbucketಗೆ ಸಂಪರ್ಕಿಸಿ.",
+ "bitbucketOrgOnlyDescription": "ಅದರ Bitbucket ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ನಲ್ಲಿ ಸಂಸ್ಥೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub ಸಂಪರ್ಕದ ಅವಧಿ ಮುಗಿದಿದೆ.",
- "message": "ನಿಮ್ಮ GitHub ಸಂಪರ್ಕ ಈಗ ಮಾನ್ಯವಾಗಿಲ್ಲ. ಸಂಪರ್ಕವನ್ನು ಮತ್ತೆ ಪರಿಶೀಲಿಸಿ — ಅಗತ್ಯವಿದ್ದರೆ ಮತ್ತೆ ಸಂಪರ್ಕಿಸಲು ಸೂಚಿಸಲಾಗುತ್ತದೆ."
+ "message": "ನಿಮ್ಮ GitHub ಸಂಪರ್ಕ ಈಗ ಮಾನ್ಯವಾಗಿಲ್ಲ. ಸಂಪರ್ಕವನ್ನು ಮತ್ತೆ ಪರಿಶೀಲಿಸಿ — ಅಗತ್ಯವಿದ್ದರೆ ಮತ್ತೆ ಸಂಪರ್ಕಿಸಲು ಸೂಚಿಸಲಾಗುತ್ತದೆ.",
+ "gitlabTitle": "GitLab ಸಂಪರ್ಕದ ಅವಧಿ ಮುಗಿದಿದೆ.",
+ "bitbucketTitle": "Bitbucket ಸಂಪರ್ಕದ ಅವಧಿ ಮುಗಿದಿದೆ.",
+ "providerMessage": "ನಿಮ್ಮ {{provider}} ಸಂಪರ್ಕ ಈಗ ಮಾನ್ಯವಾಗಿಲ್ಲ. ಸಂಪರ್ಕವನ್ನು ಮತ್ತೆ ಪರಿಶೀಲಿಸಿ — ಅಗತ್ಯವಿದ್ದರೆ ಮತ್ತೆ ಸಂಪರ್ಕಿಸಲು ಸೂಚಿಸಲಾಗುತ್ತದೆ."
},
"eventChips": {
"comment": "ಟಿಪ್ಪಣಿ",
@@ -643,6 +679,21 @@
"files": "ಫೈಲ್ಗಳು",
"discussion": "ಚರ್ಚೆ"
},
+ "terms": {
+ "pullRequest": "ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್",
+ "mergeRequest": "ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ಹಂಚಿ",
+ "viewOnProvider": "{{provider}}ನಲ್ಲಿ ವೀಕ್ಷಿಸಿ",
+ "mergeRequestUnavailable": "ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ಲಭ್ಯವಿಲ್ಲ",
+ "unavailableDescription": "ಅದು ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು, ಅಥವಾ ನಿಮಗೆ ಅದಕ್ಕೆ ಪ್ರವೇಶವಿರದಿರಬಹುದು.",
+ "accessDeniedMergeRequest": "ಈ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ವೀಕ್ಷಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
+ "couldNotLoadMergeRequest": "ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
+ "discussionAccessDenied": "ಈ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ನ ಚರ್ಚೆಯನ್ನು ವೀಕ್ಷಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
+ "discussionUnavailableMessage": "ಈ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿರಬಹುದು.",
+ "noDiscussionDescription": "ಈ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ನಲ್ಲಿ ಪರಿಶೀಲನೆಗೆ ಸಂಬಂಧಿಸಿದ ಚರ್ಚಾ ಸರಣಿಗಳಾಗಲಿ, ಸಾಮಾನ್ಯ ಕಾಮೆಂಟ್ಗಳಾಗಲಿ ಇಲ್ಲ.",
+ "noFilesChangedDescription": "ಈ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ನಲ್ಲಿ ಯಾವುದೇ ಫೈಲ್ ಬದಲಾವಣೆಗಳಿಲ್ಲ."
+ },
"fileStatus": {
"modified": "ಮಾರ್ಪಡಿಸಲಾಗಿದೆ",
"renamed": "ಮರುಹೆಸರಿಸಲಾಗಿದೆ",
@@ -659,7 +710,7 @@
"emptyLine": "(ಖಾಲಿ)"
},
"linkPasteClipboardEmpty": "ಕ್ಲಿಪ್ಬೋರ್ಡ್ ಖಾಲಿಯಾಗಿದೆ.",
- "linkPasteNotAPullRequest": "ಇದು GitHub ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಲಿಂಕ್ ಅಲ್ಲ.",
+ "linkPasteNotAPullRequest": "ಇದು ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅಥವಾ ಮರ್ಜ್ ರಿಕ್ವೆಸ್ಟ್ ಲಿಂಕ್ ಅಲ್ಲ",
"announce": {
"commentPosted": "ಕಾಮೆಂಟ್ ಪೋಸ್ಟ್ ಮಾಡಲಾಗಿದೆ",
"reviewSubmitted": "ಪರಿಶೀಲನೆ ಸಲ್ಲಿಸಲಾಗಿದೆ",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ಈ ಕಾಮೆಂಟ್ ಪೋಸ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಆಯ್ಕೆಮಾಡಿದ ಸಾಲು ಬದಲಾಗಿರಬಹುದು ಅಥವಾ PR ನವೀಕೃತವಾಗಿರಬಹುದು.",
"reviewNotSubmitted": "ಈ ಪರಿಶೀಲನೆಯನ್ನು ಈಗಿರುವ ಸ್ಥಿತಿಯಲ್ಲಿ ಸಲ್ಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. PR ಬದಲಾಗಿರಬಹುದು ಅಥವಾ ನಿಮ್ಮದೇ ಪುಲ್ ರಿಕ್ವೆಸ್ಟ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರಬಹುದು.",
+ "reviewNotSubmittedTerm": "ಈ ಪರಿಶೀಲನೆಯನ್ನು ಹಾಗೆಯೇ ಸಲ್ಲಿಸಲಾಗುವುದಿಲ್ಲ. {{term}} ಬದಲಾಗಿರಬಹುದು, ಅಥವಾ ನಿಮ್ಮ ಸ್ವಂತ {{term}}ಅನ್ನು ನೀವು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.",
"couldNotPostComment": "ಕಾಮೆಂಟ್ ಪೋಸ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
"couldNotSubmitReview": "ಪರಿಶೀಲನೆ ಸಲ್ಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."
},
@@ -675,6 +727,7 @@
"couldNotReply": "ಉತ್ತರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
"couldNotCompleteAction": "ಈ ಕ್ರಿಯೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
"mergeResultDefaultError": "GitHub ವಿಲೀನವನ್ನು ಪೂರ್ಣಗೊಳಿಸಲಿಲ್ಲ.",
+ "mergeResultNotCompleted": "{{term}} ವಿಲೀನಗೊಂಡಿಲ್ಲ. ಅದರ ಸ್ಥಿತಿಯನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.",
"ambiguous": "ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ — ಮತ್ತೆ ಪ್ರಯತ್ನಿಸುವ ಮೊದಲು PR ಪರಿಶೀಲಿಸಿ.",
"persistenceFailed": "ಈ ಕ್ರಿಯೆಯನ್ನು ದಾಖಲಿಸಲು ನಮಗೆ ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.",
"forbidden": "ಇದಕ್ಕೆ ಅನುಮತಿ ಇಲ್ಲ."
@@ -1988,11 +2041,31 @@
"retryConnection": "ಮತ್ತೆ ಸಂಪರ್ಕಿಸಲು ಪ್ರಯತ್ನಿಸಿ"
},
"newSession": {
+ "recentlyUsed": "ಇತ್ತೀಚೆಗೆ ಬಳಸಿದವು",
+ "couldNotLoadGithubRepositories": "GitHub ರೆಪೊಸಿಟರಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
+ "couldNotLoadGitlabRepositories": "GitLab ರೆಪೊಸಿಟರಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket ರೆಪೊಸಿಟರಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
"connectGithubDescription": "ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ GitHub ಸಂಪರ್ಕಿಸಿ. ನಂತರ ರೆಪೊಸಿಟರಿಯನ್ನು ಆಯ್ಕೆಮಾಡಲು ಇಲ್ಲಿಗೆ ಹಿಂತಿರುಗಿ.",
+ "connectGitlabDescription": "ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ GitLab ಸಂಪರ್ಕಿಸಿ. ನಂತರ ರೆಪೊಸಿಟರಿಯನ್ನು ಆಯ್ಕೆಮಾಡಲು ಇಲ್ಲಿಗೆ ಹಿಂತಿರುಗಿ.",
+ "connectBitbucketDescription": "ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ Bitbucket ಸಂಪರ್ಕಿಸಿ. ನಂತರ ರೆಪೊಸಿಟರಿಯನ್ನು ಆಯ್ಕೆಮಾಡಲು ಇಲ್ಲಿಗೆ ಹಿಂತಿರುಗಿ.",
"openGithub": "GitHub ತೆರೆಯಿರಿ",
+ "openGitlab": "GitLab ತೆರೆಯಿರಿ",
+ "openBitbucket": "Bitbucket ತೆರೆಯಿರಿ",
"refreshRepositories": "ರೆಪೊಸಿಟರಿಗಳ ಪಟ್ಟಿಯನ್ನು ನವೀಕರಿಸಿ",
"githubConnected": "GitHub ಸಂಪರ್ಕಗೊಂಡಿದೆ",
+ "gitlabConnected": "GitLab ಸಂಪರ್ಕಗೊಂಡಿದೆ",
"noRepositoriesVisible": "ಯಾವುದೇ ರೆಪೊಸಿಟರಿಗಳು ಕಾಣಿಸುತ್ತಿಲ್ಲ. Kilo GitHub ಅಪ್ಲಿಕೇಶನ್ಗೆ ರೆಪೊಸಿಟರಿಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿ ಇದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ. ನಂತರ ಪಟ್ಟಿಯನ್ನು ನವೀಕರಿಸಿ.",
+ "noRepositoriesVisibleGitlab": "ಯಾವುದೇ ರೆಪೊಸಿಟರಿಗಳು ಕಾಣಿಸುತ್ತಿಲ್ಲ. GitLab ಗೆ ರೆಪೊಸಿಟರಿಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿ ಇದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ. ನಂತರ ಪಟ್ಟಿಯನ್ನು ನವೀಕರಿಸಿ.",
+ "noRepositoriesVisibleBitbucket": "ಯಾವುದೇ ರೆಪೊಸಿಟರಿಗಳು ಕಾಣಿಸುತ್ತಿಲ್ಲ. Bitbucket ಗೆ ರೆಪೊಸಿಟರಿಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿ ಇದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ. ನಂತರ ಪಟ್ಟಿಯನ್ನು ನವೀಕರಿಸಿ.",
+ "bitbucketOrganizationsOnly": "Bitbucket ಸಂಸ್ಥೆಗಳಿಗೆ ಮಾತ್ರ ಲಭ್ಯ.",
+ "branchPickerTitle": "ಶಾಖೆ ಆಯ್ಕೆಮಾಡಿ",
+ "branchDefault": "ಡೀಫಾಲ್ಟ್",
+ "branchAccessibility": "ಶಾಖೆ: {{label}}",
+ "branchLoading": "ಶಾಖೆಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ",
+ "branchLoadError": "ಶಾಖೆಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗಲಿಲ್ಲ",
+ "branchUnavailable": "ಈ ರಿಪೋಜಿಟರಿಗೆ ಶಾಖೆಗಳು ಲಭ್ಯವಿಲ್ಲ. ಪ್ರೊವೈಡರ್ ಬಳಿ ನಿಮ್ಮ ಪ್ರವೇಶವನ್ನು ಪರಿಶೀಲಿಸಿ, ನಂತರ ಬೇರೆ ರಿಪೋಜಿಟರಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿ.",
+ "branchEmpty": "ಯಾವುದೇ ಶಾಖೆಗಳು ಲಭ್ಯವಿಲ್ಲ",
+ "branchPlaceholder": "ಶಾಖೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ",
"runOnWithTarget": "{{target}} ನಲ್ಲಿ ಚಲಾಯಿಸಿ",
"environment": "ಪರಿಸರ",
"couldNotLoadEnvironment": "ನಿಮ್ಮ ಪರಿಸರವನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "ರೆಪೊಸಿಟರಿಗಳ ಪಟ್ಟಿಯನ್ನು ನವೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.",
"discardDraftTitle": "ಕರಡನ್ನು ಅಳಿಸಬೇಕೆ?",
"discardDraftMessage": "ನಿಮ್ಮ ಪ್ರಾಂಪ್ಟ್ ಕಳೆದುಹೋಗುತ್ತದೆ.",
+ "discardWithUploadsMessage": "ನಿಮ್ಮ ಪ್ರಾಂಪ್ಟ್ ಮತ್ತು ಕಳುಹಿಸಿದ ಸಂದೇಶಗಳಿಗೆ ಲಗತ್ತಿಸದ ಯಾವುದೇ ಅಪ್ಲೋಡ್ಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.",
"discardFailed": "ಕರಡನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.",
"remoteHint": "ಸ್ಥಳೀಯ kilo ಪ್ರಕ್ರಿಯೆಯನ್ನು ನಿಯಂತ್ರಿಸಲು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ `kilo remote` ಚಲಾಯಿಸಿ ಅಥವಾ ಚಾಲನೆಯಲ್ಲಿರುವ CLI ಸೆಶನ್ನಲ್ಲಿ `/remote` ಬಳಸಿ.",
- "connectBitbucketDescription": "ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ Bitbucket ಸಂಪರ್ಕಿಸಿ. ನಂತರ ರೆಪೊಸಿಟರಿಯನ್ನು ಆಯ್ಕೆಮಾಡಲು ಇಲ್ಲಿಗೆ ಹಿಂತಿರುಗಿ.",
- "connectGitlabDescription": "ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ GitLab ಸಂಪರ್ಕಿಸಿ. ನಂತರ ರೆಪೊಸಿಟರಿಯನ್ನು ಆಯ್ಕೆಮಾಡಲು ಇಲ್ಲಿಗೆ ಹಿಂತಿರುಗಿ.",
- "couldNotLoadBitbucketRepositories": "Bitbucket ರೆಪೊಸಿಟರಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
- "couldNotLoadGithubRepositories": "GitHub ರೆಪೊಸಿಟರಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
- "couldNotLoadGitlabRepositories": "GitLab ರೆಪೊಸಿಟರಿಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
- "gitlabConnected": "GitLab ಸಂಪರ್ಕಗೊಂಡಿದೆ",
- "noRepositoriesVisibleBitbucket": "ಯಾವುದೇ ರೆಪೊಸಿಟರಿಗಳು ಕಾಣಿಸುತ್ತಿಲ್ಲ. Bitbucket ಗೆ ರೆಪೊಸಿಟರಿಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿ ಇದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ. ನಂತರ ಪಟ್ಟಿಯನ್ನು ನವೀಕರಿಸಿ.",
- "noRepositoriesVisibleGitlab": "ಯಾವುದೇ ರೆಪೊಸಿಟರಿಗಳು ಕಾಣಿಸುತ್ತಿಲ್ಲ. GitLab ಗೆ ರೆಪೊಸಿಟರಿಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿ ಇದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ. ನಂತರ ಪಟ್ಟಿಯನ್ನು ನವೀಕರಿಸಿ.",
- "openBitbucket": "Bitbucket ತೆರೆಯಿರಿ",
- "openGitlab": "GitLab ತೆರೆಯಿರಿ",
- "recentlyUsed": "ಇತ್ತೀಚೆಗೆ ಬಳಸಿದವು",
"continueFrom": "{{title}} ಅನ್ನು ಮುಂದುವರಿಸಲಾಗುತ್ತಿದೆ.",
"importingSession": "ಸೆಶನ್ ಆಮದು ಆಗುತ್ತಿದೆ",
"cliCannotContinue": "ಈ CLI ಮೂಲಕ ಸೆಶನ್ ಅನ್ನು ಮುಂದುವರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. Cloud Agent ಅಥವಾ ಇನ್ನೊಂದು CLI ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ.",
- "importFailed": "ಈ ಸೆಶನ್ ಅನ್ನು ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.",
- "discardWithUploadsMessage": "ನಿಮ್ಮ ಪ್ರಾಂಪ್ಟ್ ಮತ್ತು ಕಳುಹಿಸಿದ ಸಂದೇಶಗಳಿಗೆ ಲಗತ್ತಿಸದ ಯಾವುದೇ ಅಪ್ಲೋಡ್ಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."
+ "importFailed": "ಈ ಸೆಶನ್ ಅನ್ನು ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} ಫೈಲ್ ಅನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ.",
diff --git a/apps/mobile/src/i18n/locales/ko.json b/apps/mobile/src/i18n/locales/ko.json
index 5dab46198a..9cf4582d9c 100644
--- a/apps/mobile/src/i18n/locales/ko.json
+++ b/apps/mobile/src/i18n/locales/ko.json
@@ -4,6 +4,8 @@
"done": "완료",
"retry": "다시 시도",
"tryAgain": "다시 시도",
+ "continue": "계속하기",
+ "notNow": "나중에",
"language": "언어",
"device": "기기",
"share": "{{title}} 공유",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "클립보드에 복사하지 못했습니다.",
"required": "필수",
"error": "오류: {{error}}",
- "notNow": "나중에",
- "continue": "계속하기",
"back": "뒤로",
"somethingWentWrong": "문제가 발생했습니다.",
"couldNotOpen": "{{label}}을(를) 열지 못했습니다.",
@@ -36,6 +36,7 @@
"cost": "비용",
"discard": "버리기",
"findings": "진단 결과",
+ "mergeRequest": "머지 요청",
"notConnected": "연결 안 됨",
"notifications": "알림",
"pullRequest": "풀 리퀘스트",
@@ -1557,11 +1558,31 @@
"retryConnection": "연결 다시 시도"
},
"newSession": {
+ "recentlyUsed": "최근 사용",
+ "couldNotLoadGithubRepositories": "GitHub 저장소를 불러올 수 없습니다.",
+ "couldNotLoadGitlabRepositories": "GitLab 저장소를 불러올 수 없습니다.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket 저장소를 불러올 수 없습니다.",
"connectGithubDescription": "브라우저에서 GitHub를 연결한 후 여기로 돌아와 저장소를 선택하세요.",
+ "connectGitlabDescription": "브라우저에서 GitLab을 연결한 후 여기로 돌아와 저장소를 선택하세요.",
+ "connectBitbucketDescription": "브라우저에서 Bitbucket을 연결한 후 여기로 돌아와 저장소를 선택하세요.",
"openGithub": "GitHub 열기",
+ "openGitlab": "GitLab 열기",
+ "openBitbucket": "Bitbucket 열기",
"refreshRepositories": "저장소 새로고침",
"githubConnected": "GitHub 연결됨",
+ "gitlabConnected": "GitLab 연결됨",
"noRepositoriesVisible": "표시할 저장소가 없습니다. Kilo GitHub 앱의 저장소 접근 권한을 확인한 후 새로고침하세요.",
+ "noRepositoriesVisibleGitlab": "표시할 저장소가 없습니다. GitLab의 저장소 접근 권한을 확인한 후 새로고침하세요.",
+ "noRepositoriesVisibleBitbucket": "표시할 저장소가 없습니다. Bitbucket의 저장소 접근 권한을 확인한 후 새로고침하세요.",
+ "bitbucketOrganizationsOnly": "Bitbucket은 조직에서만 사용할 수 있습니다.",
+ "branchPickerTitle": "브랜치 선택",
+ "branchDefault": "기본값",
+ "branchAccessibility": "브랜치: {{label}}",
+ "branchLoading": "브랜치 불러오는 중",
+ "branchLoadError": "브랜치를 불러오지 못했습니다",
+ "branchUnavailable": "이 저장소에서는 브랜치를 사용할 수 없습니다. 공급업체에서의 접근 권한을 확인한 후 다른 저장소를 선택하세요.",
+ "branchEmpty": "사용 가능한 브랜치가 없습니다",
+ "branchPlaceholder": "브랜치 선택",
"runOnWithTarget": "실행 위치: {{target}}",
"environment": "환경",
"couldNotLoadEnvironment": "환경을 불러올 수 없습니다.",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "대기 중인 세션을 불러올 수 없습니다. 다시 시도하세요.",
"failedToCreate": "세션을 만들지 못했습니다.",
"couldNotRefreshRepositories": "저장소를 새로고침하지 못했습니다. 다시 시도하세요.",
- "discardDraftMessage": "프롬프트가 사라집니다.",
"discardDraftTitle": "초안을 삭제할까요?",
+ "discardDraftMessage": "프롬프트가 사라집니다.",
+ "discardWithUploadsMessage": "프롬프트와 보낸 메시지에 첨부되지 않은 모든 업로드 파일이 삭제됩니다.",
"discardFailed": "초안을 삭제할 수 없습니다. 다시 시도하세요.",
"remoteHint": "컴퓨터에서 `kilo remote`를 실행하거나 실행 중인 CLI 세션에서 `/remote`를 사용하여 로컬 kilo 프로세스를 제어하세요.",
- "connectBitbucketDescription": "브라우저에서 Bitbucket을 연결한 후 여기로 돌아와 저장소를 선택하세요.",
- "connectGitlabDescription": "브라우저에서 GitLab을 연결한 후 여기로 돌아와 저장소를 선택하세요.",
- "couldNotLoadBitbucketRepositories": "Bitbucket 저장소를 불러올 수 없습니다.",
- "couldNotLoadGithubRepositories": "GitHub 저장소를 불러올 수 없습니다.",
- "couldNotLoadGitlabRepositories": "GitLab 저장소를 불러올 수 없습니다.",
- "gitlabConnected": "GitLab 연결됨",
- "noRepositoriesVisibleBitbucket": "표시할 저장소가 없습니다. Bitbucket의 저장소 접근 권한을 확인한 후 새로고침하세요.",
- "noRepositoriesVisibleGitlab": "표시할 저장소가 없습니다. GitLab의 저장소 접근 권한을 확인한 후 새로고침하세요.",
- "openBitbucket": "Bitbucket 열기",
- "openGitlab": "GitLab 열기",
- "recentlyUsed": "최근 사용",
"continueFrom": "{{title}} 세션을 이어서 진행합니다.",
"importingSession": "세션 가져오는 중",
"cliCannotContinue": "이 CLI에서는 세션을 이어서 진행할 수 없습니다. Cloud Agent 또는 다른 CLI를 선택하세요.",
- "importFailed": "이 세션을 가져올 수 없습니다.",
- "discardWithUploadsMessage": "프롬프트와 보낸 메시지에 첨부되지 않은 모든 업로드 파일이 삭제됩니다."
+ "importFailed": "이 세션을 가져올 수 없습니다."
},
"partRenderer": {
"updatedFileCount_one": "파일 {{displayCount}}개를 업데이트했습니다.",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "설치 경로 분석을 허용할까요?"
},
"prReview": {
+ "pullRequestUnavailable": "풀 리퀘스트를 열 수 없음",
+ "pullRequestUnavailableDescription": "이 PR을 열 수 없습니다. PR이 삭제되었거나 저장소가 비공개이거나 해당 저장소에 Kilo GitHub 앱이 설치되지 않았을 수 있습니다.",
"accessDeniedDescription": "이 풀 리퀘스트를 볼 권한이 없습니다.",
- "checkConnection": "연결 확인",
- "checks": {
- "checksCount": "검사 {{displayCount}}개",
- "couldNotLoad": "검사 결과를 불러오지 못했습니다.",
- "failed": "{{displayCount}}개 실패",
- "noAccess": "이 저장소의 검사 결과를 볼 권한이 없습니다.",
- "noChecksReported": "보고된 검사 결과 없음",
- "notAvailable": "아직 검사 결과를 확인할 수 없습니다. 최신 커밋이 처리되지 않았거나 해당 커밋의 저장소에 Kilo GitHub 앱이 설치되지 않았을 수 있습니다.",
- "openDetails": "{{name}} 세부 정보 열기",
- "passed": "{{displayCount}}개 통과",
- "pending": "{{displayCount}}개 대기 중",
- "retryChecks": "검사 다시 시도",
- "skipped": "{{displayCount}}개 건너뜀",
- "title": "검사",
- "viewOnGitHub": "GitHub에서 PR 보기",
- "checkDetails": "검사 세부 정보"
- },
- "composer": {
- "addTitle": "댓글 추가",
- "addToReview": "리뷰에 추가",
- "comment": "댓글",
- "commentBody": "댓글 내용",
- "commentBodyPlaceholder": "댓글 입력",
- "commentNow": "지금 댓글 달기",
- "discardMessage": "작성 중인 내용이 사라집니다.",
- "discardTitle": "작성 중인 댓글을 버릴까요?",
- "editTitle": "댓글 수정",
- "insertSuggestion": "제안 삽입",
- "insertSuggestionA11y": "코드 제안 삽입",
- "loadFailedTitle": "댓글 작성 화면을 불러오지 못했습니다.",
- "ok": "확인",
- "unavailableMessage": "이 제출 대기 중인 댓글은 이미 삭제되었거나 제출되었습니다.",
- "unavailableTitle": "댓글을 열 수 없음",
- "bodyEmpty": "댓글 내용을 입력해야 합니다.",
- "suggestionsOnlyAddedLines": "제안은 추가된 줄에만 적용됩니다.",
- "tapDiffLineToSuggest": "코드 제안을 사용하려면 변경 내용에서 줄을 탭하세요."
- },
- "connect": {
- "checkFailedMessage": "정보를 불러올 때까지 로그인 상태를 확인할 수 없습니다.",
- "checkFailedTitle": "GitHub 연결을 확인하지 못했습니다.",
- "description": "모바일에서 풀 리퀘스트를 리뷰하려면 GitHub 계정을 연결하세요.",
- "reconnectDescription": "GitHub 연결이 해제되었습니다. 모바일에서 풀 리퀘스트를 계속 리뷰하려면 다시 연결하세요.",
- "reconnectTitle": "GitHub 다시 연결"
- },
- "connectionExpired": "GitHub 연결이 만료되었습니다.",
- "couldNotLoadPullRequest": "풀 리퀘스트를 불러오지 못했습니다.",
- "couldNotOpenGitHubAppSettings": "GitHub 앱 설정을 열지 못했습니다.",
- "description": "설명",
- "discussion": {
- "acceptTerms": "동의",
- "accessDeniedMessage": "이 PR의 토론을 볼 권한이 없습니다.",
- "addReaction": "반응 추가",
- "block": "차단",
- "blockedUser": "{{login}} 님을 차단했습니다.",
- "collapseThread": "스레드 접기",
- "commentActions": "댓글 작업",
- "comment": "댓글 {{displayCount}}개",
- "comment_other": "댓글 {{displayCount}}개",
- "couldNotLoad": "토론을 불러오지 못했습니다.",
- "couldNotLoadMore": "댓글을 더 불러오지 못했습니다.",
- "loadMoreComments": "댓글 더 불러오기",
- "loading": "토론 불러오는 중",
- "moderation": {
- "block": {
- "retryable": "이 사용자를 차단하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
- "terminal": "이 사용자는 차단할 수 없습니다."
- },
- "mute": {
- "retryable": "이 사용자를 숨기지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
- "terminal": "이 사용자는 숨길 수 없습니다."
- },
- "reportContent": {
- "retryable": "이 댓글을 신고하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
- "terminal": "이 댓글은 신고할 수 없습니다."
- },
- "reportUser": {
- "retryable": "이 사용자를 신고하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
- "terminal": "이 사용자는 신고할 수 없습니다."
- }
- },
- "moreLinesAbove": "… 위에 {{displayCount}}줄이 더 있습니다.",
- "mute": "숨기기",
- "mutedUser": "{{login}} 님을 숨겼습니다.",
- "noDiscussion": "아직 토론 없음",
- "noDiscussionDescription": "이 풀 리퀘스트에는 아직 리뷰 스레드나 댓글이 없습니다.",
- "comment_one": "댓글 1개",
- "outdated": "이전 버전",
- "quotedDiffSnippet": "인용된 변경 내용 일부",
- "reactionPill": "{{emoji}} {{countLabel}} {{displayCount}}개",
- "reaction": "반응",
- "reaction_other": "반응",
- "reaction_one": "반응",
- "replyBadRequest": "이 답글을 게시할 수 없습니다. 스레드가 변경되었을 수 있습니다.",
- "replyBody": "답글 내용",
- "replyForbidden": "이 풀 리퀘스트에 답글을 달 권한이 없습니다.",
- "replyPlaceholder": "답글…",
- "reportContent": "콘텐츠 신고",
- "reportUser": "사용자 신고",
- "resolveThread": "스레드 해결",
- "resolved": "해결됨",
- "retryLoadingMore": "댓글 더 불러오기 다시 시도",
- "reviewFiles": "파일 리뷰",
- "startedRelative": " · {{relative}} 시작",
- "submitReply": "답글 제출",
- "termsAcceptRetry": "약관 동의를 처리하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
- "termsCopy": "만 13세 이상만 게시할 수 있습니다.",
- "termsTitle": "서비스 약관",
- "threadAccessibilityLabel": "{{anchorLabel}} 토론 스레드",
- "unavailable": "토론을 볼 수 없습니다.",
- "unavailableMessage": "이 풀 리퀘스트가 삭제되었을 수 있습니다.",
- "unresolveThread": "스레드 해결 취소",
- "viewTerms": "약관 보기",
- "termsAcceptRequired": "게시하려면 서비스 약관에 동의해야 합니다.",
- "termsCheckRetryCopy": "서비스 약관을 확인하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
- "termsOutdatedCopy": "서비스 약관이 변경되었습니다. 최신 약관에 동의하려면 이 화면을 다시 여세요.",
- "reactions": {
- "thumbsUp": "좋아요",
- "thumbsDown": "싫어요",
- "laugh": "웃음",
- "hooray": "만세",
- "confused": "혼란스러워요",
- "heart": "하트",
- "rocket": "로켓",
- "eyes": "눈"
- },
- "anchor": {
- "fileCommentOnPath": "{{path}} 파일에 대한 댓글",
- "fileComment": "파일 댓글",
- "outdatedOnPathLines": "{{path}} {{lines}} · 이전 버전",
- "outdatedOnLines": "{{lines}} · 이전 버전",
- "outdatedOnPath": "{{path}} · 이전 버전"
- },
- "deletedUser": "삭제된 사용자"
- },
- "entry": {
- "clearLink": "풀 리퀘스트 링크 지우기",
- "couldNotLoad": "불러오지 못했습니다.",
- "eyebrow": "URL로 풀 리퀘스트를 여세요.",
- "noRecentPrs": "최근 PR 없음",
- "noRecentPrsDescription": "위에 PR 링크를 붙여넣어 리뷰를 시작하세요. 다음부터는 여기에 표시됩니다.",
- "open": "오픈",
- "pasteLink": "풀 리퀘스트 링크 붙여넣기",
- "pastePrLink": "PR 링크 붙여넣기",
- "removeFromRecentsMessage": "이 풀 리퀘스트가 최근 항목에서 제거됩니다.",
- "removeFromRecentsTitle": "최근 항목에서 제거할까요?",
- "removeRecentAccessibility": "최근 항목에서 {{repo}} 제거",
- "urlAccessibility": "GitHub 풀 리퀘스트 URL"
- },
- "eventChips": {
- "comment": "댓글",
- "label": "리뷰 유형",
- "requestChanges": "변경 요청"
- },
+ "noFilesChanged": "변경된 파일 없음",
+ "noFilesChangedDescription": "이 풀 리퀘스트에는 변경된 파일이 없습니다.",
"fileList": {
"filesList": "파일 목록",
"filesViewed": "파일 · {{total}}개 중 {{viewed}}개 확인함",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "선택한 줄에 댓글 달기",
"finishReview": "리뷰 완료"
},
- "headLine": "{{counts}} · 최신 커밋 {{sha}}",
"hunkRows": {
"contextUnavailable": "이 참조에서는 주변 코드를 불러올 수 없습니다.",
"expandAll": "모두 펼치기",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "주변 코드 불러오기 다시 시도",
"retryLoadingNextPage": "다음 페이지 불러오기 다시 시도"
},
- "inbox": {
- "couldNotLoad": "받은 편지함을 불러오지 못했습니다.",
- "loading": "받은 편지함 불러오는 중",
- "noReviewRequests": "리뷰 요청 없음",
- "noReviewRequestsDescription": "리뷰를 요청받은 풀 리퀘스트가 여기에 표시됩니다. 위에 다른 PR 링크를 붙여넣을 수도 있습니다.",
- "title": "받은 편지함"
+ "sideBySide": {
+ "emptyDiffColumn": "변경 내용의 빈 열",
+ "emptyDiffRow": "변경 내용의 빈 행",
+ "newOnly": "변경 후에만 있음: {{text}}",
+ "noNewlineAtEndOfFile": "파일 끝에 줄 바꿈이 없습니다.",
+ "oldNew": "변경 전: {{old}} | 변경 후: {{new}}",
+ "oldOnly": "변경 전에만 있음: {{text}}"
+ },
+ "connectionExpired": "GitHub 연결이 만료되었습니다.",
+ "capabilities": {
+ "banner": {
+ "title": "이 공급업체에서 사용할 수 없음",
+ "accessibility": "이 공급업체에서 사용할 수 없음: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Kilo GitHub 앱 설치",
"merge": {
- "autoMergeDescription": "필수 검사를 모두 통과하면 GitHub에서 이 풀 리퀘스트를 자동으로 병합합니다(방식: {{method}}).",
+ "merge": "병합",
+ "mergeNow": "지금 병합",
+ "mergePullRequest": "풀 리퀘스트 병합",
+ "mergeTermTitle": "{{term}} 병합",
+ "enableAutoMerge": "자동 병합 켜기",
+ "disableAutoMerge": "자동 병합 끄기",
"autoMergeOn": "자동 병합 켜짐",
- "blockedTitle": "아직 병합할 수 없는 이유",
- "cannotMerge": "이 풀 리퀘스트는 현재 상태로 병합할 수 없습니다.",
+ "autoMergeDescription": "필수 검사를 모두 통과하면 GitHub에서 이 풀 리퀘스트를 자동으로 병합합니다(방식: {{method}}).",
"checking": "병합 가능 여부 확인 중…",
+ "couldNotDetermine": "병합 가능 여부를 확인할 수 없습니다.",
+ "refreshMergeability": "병합 가능 여부 새로고침",
+ "blockedTitle": "아직 병합할 수 없는 이유",
+ "updateBranch": "브랜치 업데이트",
+ "updateBranchFromBase": "기준 브랜치의 변경 사항으로 브랜치 업데이트",
+ "methodLabel": "병합 방식",
+ "commitTitle": "커밋 제목",
"commitMessage": "커밋 메시지",
"commitMessagePlaceholder": "병합 커밋 설명(선택 사항)",
- "commitTitle": "커밋 제목",
- "confirmMessage": "변경 사항이 기준 브랜치에 병합됩니다.",
- "confirmTitle": "풀 리퀘스트를 병합할까요?",
- "couldNotDetermine": "병합 가능 여부를 확인할 수 없습니다.",
- "couldNotMerge": "풀 리퀘스트를 병합하지 못했습니다.",
"deleteBranch": "브랜치 삭제",
"deleteBranchAfterMerge": "병합 후 브랜치 삭제",
- "disableAutoMerge": "자동 병합 끄기",
- "enableAutoMerge": "자동 병합 켜기",
- "enableAutoMergeConfirmMessage": "필수 검사를 모두 통과하면 GitHub에서 이 풀 리퀘스트를 자동으로 병합합니다.",
+ "noEnabledMethods": "이 저장소에는 활성화된 병합 방식이 없습니다. 저장소 관리자에게 병합, 스쿼시 또는 리베이스 병합을 활성화해 달라고 요청하세요.",
+ "confirmTitle": "풀 리퀘스트를 병합할까요?",
+ "confirmTitleTerm": "{{term}}를 병합할까요?",
+ "confirmMessage": "변경 사항이 기준 브랜치에 병합됩니다.",
"enableAutoMergeConfirmTitle": "자동 병합을 켤까요?",
+ "enableAutoMergeConfirmMessage": "필수 검사를 모두 통과하면 GitHub에서 이 풀 리퀘스트를 자동으로 병합합니다.",
+ "enableAutoMergeConfirmMessageTerm": "파이프라인이 성공하면 {{term}}이(가) 자동으로 병합됩니다.",
+ "enableAutoMergeDescriptionTerm": "파이프라인이 성공하면 GitLab이 이 {{term}}을(를) 자동으로 병합합니다.",
"forbidden": "이 풀 리퀘스트를 병합할 권한이 없습니다.",
- "loadFailedTitle": "병합 옵션을 불러오지 못했습니다.",
- "merge": "병합",
- "mergeNow": "지금 병합",
- "mergePullRequest": "풀 리퀘스트 병합",
- "methodLabel": "병합 방식",
+ "cannotMerge": "이 풀 리퀘스트는 현재 상태로 병합할 수 없습니다.",
+ "couldNotMerge": "풀 리퀘스트를 병합하지 못했습니다.",
"methods": {
"merge": "병합",
"rebase": "리베이스",
"squash": "스쿼시"
},
- "noEnabledMethods": "이 저장소에는 활성화된 병합 방식이 없습니다. 저장소 관리자에게 병합, 스쿼시 또는 리베이스 병합을 활성화해 달라고 요청하세요.",
+ "terminal": {
+ "alreadyMerged": "이미 병합됨",
+ "closed": "풀 리퀘스트 닫힘",
+ "closedMergeRequest": "머지 요청 닫힘"
+ },
"partialSuccessBanner": {
"accessibility": "병합을 완료했습니다. 브랜치를 삭제하지 못했습니다. 사유: {{reason}}",
"body": "브랜치를 삭제하지 못했습니다. 사유: {{reason}}"
},
- "refreshMergeability": "병합 가능 여부 새로고침",
- "terminal": {
- "alreadyMerged": "이미 병합됨",
- "closed": "풀 리퀘스트 닫힘"
- },
- "updateBranch": "브랜치 업데이트",
- "updateBranchFromBase": "기준 브랜치의 변경 사항으로 브랜치 업데이트",
+ "loadFailedTitle": "병합 옵션을 불러오지 못했습니다.",
"blocked": {
"unknownStateTitle": "GitHub에서 병합 가능 여부를 아직 확인하지 못함",
"unknownStateDetail": "잠시 후 개요를 새로고침해 보세요.",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "아직 병합할 수 없는 풀 리퀘스트",
"notMergeableDetail": "GitHub에서 확인한 병합 가능 상태는 {{state}}입니다."
},
+ "restrictions": {
+ "title": "병합 제한",
+ "approvalsRequired_one": "{{displayCount}}개의 승인 필요",
+ "approvalsRequired_other": "{{displayCount}}개의 승인 필요",
+ "pipelineMustSucceed": "병합하기 전에 파이프라인이 성공해야 합니다."
+ },
+ "providerBlocked": {
+ "failingPipeline": "최신 커밋에서 파이프라인이 실패하고 있습니다.",
+ "pendingPipeline": "최신 커밋에서 파이프라인이 아직 실행 중입니다.",
+ "permission": "이 {{term}}를 병합할 권한이 없습니다.",
+ "draft": "병합 전에 {{term}}를 리뷰 준비 완료로 표시하세요."
+ },
"methodLabels": {
"merge": "병합 커밋 만들기",
"squash": "스쿼시 후 병합",
@@ -2623,9 +2507,204 @@
"rebase": "병합 커밋 없이 이 브랜치의 모든 커밋을 기준 브랜치에 차례로 다시 적용합니다."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "{{anchorLabel}} 토론 스레드",
+ "collapseThread": "스레드 접기",
+ "resolveThread": "스레드 해결",
+ "unresolveThread": "스레드 해결 취소",
+ "resolved": "해결됨",
+ "outdated": "이전 버전",
+ "comment_one": "댓글 1개",
+ "comment": "댓글 {{displayCount}}개",
+ "comment_other": "댓글 {{displayCount}}개",
+ "startedRelative": " · {{relative}} 시작",
+ "couldNotLoadMore": "댓글을 더 불러오지 못했습니다.",
+ "retryLoadingMore": "댓글 더 불러오기 다시 시도",
+ "loadMoreComments": "댓글 더 불러오기",
+ "addReaction": "반응 추가",
+ "reactionPill": "{{emoji}} {{countLabel}} {{displayCount}}개",
+ "reaction_one": "반응",
+ "reaction": "반응",
+ "reaction_other": "반응",
+ "commentActions": "댓글 작업",
+ "reportContent": "콘텐츠 신고",
+ "reportUser": "사용자 신고",
+ "mute": "숨기기",
+ "block": "차단",
+ "blockedUser": "{{login}} 님을 차단했습니다.",
+ "mutedUser": "{{login}} 님을 숨겼습니다.",
+ "replyPlaceholder": "답글…",
+ "replyBody": "답글 내용",
+ "submitReply": "답글 제출",
+ "termsTitle": "서비스 약관",
+ "termsCopy": "만 13세 이상만 게시할 수 있습니다.",
+ "termsAcceptRetry": "약관 동의를 처리하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
+ "viewTerms": "약관 보기",
+ "acceptTerms": "동의",
+ "replyBadRequest": "이 답글을 게시할 수 없습니다. 스레드가 변경되었을 수 있습니다.",
+ "replyForbidden": "이 풀 리퀘스트에 답글을 달 권한이 없습니다.",
+ "replyForbiddenTerm": "이 {{term}}에 답글을 달 권한이 없습니다.",
+ "moderation": {
+ "block": {
+ "retryable": "이 사용자를 차단하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
+ "terminal": "이 사용자는 차단할 수 없습니다."
+ },
+ "mute": {
+ "retryable": "이 사용자를 숨기지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
+ "terminal": "이 사용자는 숨길 수 없습니다."
+ },
+ "reportContent": {
+ "retryable": "이 댓글을 신고하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
+ "terminal": "이 댓글은 신고할 수 없습니다."
+ },
+ "reportUser": {
+ "retryable": "이 사용자를 신고하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
+ "terminal": "이 사용자는 신고할 수 없습니다."
+ }
+ },
+ "accessDeniedMessage": "이 PR의 토론을 볼 권한이 없습니다.",
+ "unavailable": "토론을 볼 수 없습니다.",
+ "unavailableMessage": "이 풀 리퀘스트가 삭제되었을 수 있습니다.",
+ "couldNotLoad": "토론을 불러오지 못했습니다.",
+ "loading": "토론 불러오는 중",
+ "noDiscussion": "아직 토론 없음",
+ "noDiscussionDescription": "이 풀 리퀘스트에는 아직 리뷰 스레드나 댓글이 없습니다.",
+ "reviewFiles": "파일 리뷰",
+ "quotedDiffSnippet": "인용된 변경 내용 일부",
+ "moreLinesAbove": "… 위에 {{displayCount}}줄이 더 있습니다.",
+ "termsAcceptRequired": "게시하려면 서비스 약관에 동의해야 합니다.",
+ "termsOutdatedCopy": "서비스 약관이 변경되었습니다. 최신 약관에 동의하려면 이 화면을 다시 여세요.",
+ "termsCheckRetryCopy": "서비스 약관을 확인하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요.",
+ "reactions": {
+ "thumbsUp": "좋아요",
+ "thumbsDown": "싫어요",
+ "laugh": "웃음",
+ "hooray": "만세",
+ "confused": "혼란스러워요",
+ "heart": "하트",
+ "rocket": "로켓",
+ "eyes": "눈"
+ },
+ "anchor": {
+ "fileCommentOnPath": "{{path}} 파일에 대한 댓글",
+ "fileComment": "파일 댓글",
+ "outdatedOnPathLines": "{{path}} {{lines}} · 이전 버전",
+ "outdatedOnLines": "{{lines}} · 이전 버전",
+ "outdatedOnPath": "{{path}} · 이전 버전"
+ },
+ "deletedUser": "삭제된 사용자"
+ },
+ "couldNotOpenGitHubAppSettings": "GitHub 앱 설정을 열지 못했습니다.",
+ "installKiloGitHubApp": "Kilo GitHub 앱 설치",
+ "checkConnection": "연결 확인",
+ "couldNotLoadPullRequest": "풀 리퀘스트를 불러오지 못했습니다.",
+ "description": "설명",
"noDescriptionProvided": "설명이 없습니다.",
- "noFilesChanged": "변경된 파일 없음",
- "noFilesChangedDescription": "이 풀 리퀘스트에는 변경된 파일이 없습니다.",
+ "review": "리뷰",
+ "reviewPullRequest": "풀 리퀘스트 리뷰",
+ "headLine": "{{counts}} · 최신 커밋 {{sha}}",
+ "entry": {
+ "eyebrow": "URL로 풀 리퀘스트 또는 머지 요청 열기",
+ "pastePrLink": "풀 리퀘스트 또는 머지 요청 링크 붙여넣기",
+ "noRecentPrs": "최근 리뷰 없음",
+ "noRecentPrsDescription": "위에 링크를 붙여넣어 리뷰를 시작하세요. 다음부터는 여기에 표시됩니다.",
+ "couldNotLoad": "불러오지 못했습니다.",
+ "removeFromRecentsTitle": "최근 항목에서 제거할까요?",
+ "removeFromRecentsMessage": "이 리뷰는 최근 항목에서 제거됩니다.",
+ "removeRecentAccessibility": "최근 항목에서 {{repo}} 제거",
+ "urlAccessibility": "풀 리퀘스트 또는 머지 요청 URL 입력",
+ "urlPlaceholder": "풀 리퀘스트 또는 머지 요청 URL",
+ "openAccessibility": "풀 리퀘스트 또는 머지 요청 열기",
+ "clearLink": "링크 지우기",
+ "pasteLink": "풀 리퀘스트 또는 머지 요청 링크 붙여넣기",
+ "open": "오픈"
+ },
+ "checks": {
+ "checksCount": "검사 {{displayCount}}개",
+ "couldNotLoad": "검사 결과를 불러오지 못했습니다.",
+ "failed": "{{displayCount}}개 실패",
+ "noAccess": "이 저장소의 검사 결과를 볼 권한이 없습니다.",
+ "noChecksReported": "보고된 검사 결과 없음",
+ "notAvailable": "아직 검사 결과를 확인할 수 없습니다. 최신 커밋이 처리되지 않았거나 해당 커밋의 저장소에 Kilo GitHub 앱이 설치되지 않았을 수 있습니다.",
+ "openDetails": "{{name}} 세부 정보 열기",
+ "passed": "{{displayCount}}개 통과",
+ "pending": "{{displayCount}}개 대기 중",
+ "retryChecks": "검사 다시 시도",
+ "skipped": "{{displayCount}}개 건너뜀",
+ "title": "검사",
+ "viewOnGitHub": "GitHub에서 PR 보기",
+ "checkDetails": "검사 세부 정보"
+ },
+ "inbox": {
+ "couldNotLoad": "받은 편지함을 불러오지 못했습니다.",
+ "loading": "받은 편지함 불러오는 중",
+ "noReviewRequests": "리뷰 요청 없음",
+ "noReviewRequestsDescription": "리뷰를 요청받은 풀 리퀘스트가 여기에 표시됩니다. 위에 다른 PR 링크를 붙여넣을 수도 있습니다.",
+ "title": "받은 편지함"
+ },
+ "composer": {
+ "addTitle": "댓글 추가",
+ "addToReview": "리뷰에 추가",
+ "comment": "댓글",
+ "commentBody": "댓글 내용",
+ "commentBodyPlaceholder": "댓글 입력",
+ "commentNow": "지금 댓글 달기",
+ "discardMessage": "작성 중인 내용이 사라집니다.",
+ "discardTitle": "작성 중인 댓글을 버릴까요?",
+ "editTitle": "댓글 수정",
+ "insertSuggestion": "제안 삽입",
+ "insertSuggestionA11y": "코드 제안 삽입",
+ "loadFailedTitle": "댓글 작성 화면을 불러오지 못했습니다.",
+ "ok": "확인",
+ "unavailableMessage": "이 제출 대기 중인 댓글은 이미 삭제되었거나 제출되었습니다.",
+ "unavailableTitle": "댓글을 열 수 없음",
+ "bodyEmpty": "댓글 내용을 입력해야 합니다.",
+ "suggestionsOnlyAddedLines": "제안은 추가된 줄에만 적용됩니다.",
+ "tapDiffLineToSuggest": "코드 제안을 사용하려면 변경 내용에서 줄을 탭하세요."
+ },
+ "connect": {
+ "checkFailedTitle": "GitHub 연결을 확인하지 못했습니다.",
+ "checkFailedMessage": "정보를 불러올 때까지 로그인 상태를 확인할 수 없습니다.",
+ "checkFailedTitleGitLab": "GitLab 연결을 확인하지 못했습니다.",
+ "checkFailedTitleBitbucket": "Bitbucket 연결을 확인하지 못했습니다.",
+ "providerCheckFailedMessage": "로드될 때까지 연결 상태를 사용할 수 없습니다.",
+ "reconnectTitle": "GitHub 다시 연결",
+ "reconnectDescription": "GitHub 연결이 해제되었습니다. 모바일에서 풀 리퀘스트를 계속 리뷰하려면 다시 연결하세요.",
+ "description": "모바일에서 풀 리퀘스트를 리뷰하려면 GitHub 계정을 연결하세요.",
+ "gitlabDescription": "모바일에서 머지 요청을 검토하려면 GitLab 계정을 연결하세요.",
+ "bitbucketDescription": "모바일에서 풀 리퀘스트를 검토하려면 이 조직을 Bitbucket에 연결하세요.",
+ "bitbucketOrgOnlyDescription": "프로필에서 조직을 선택하면 해당 조직의 Bitbucket 풀 리퀘스트를 검토할 수 있습니다."
+ },
+ "screen": {
+ "shareA11y": "풀 리퀘스트 공유",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "이 댓글이 리뷰 대기열에서 제거됩니다.",
+ "deletePendingTitle": "제출 대기 중인 댓글을 삭제할까요?",
+ "loadFailedTitle": "리뷰 제출 화면을 불러오지 못했습니다.",
+ "pendingComment": "제출 대기 중인 댓글",
+ "pendingComment_other": "제출 대기 중인 댓글",
+ "pendingComment_one": "제출 대기 중인 댓글",
+ "summaryOptional": "요약(선택 사항)",
+ "partialPostedMessage": "댓글 {{displayFreshCount}}개를 게시했습니다. 이전 커밋을 가리키는 댓글 {{displayStaleCount}}개는 대기열에 남았습니다.",
+ "submitCountOfTotal": "댓글 {{displayTotalCount}}개 중 {{displayFreshCount}}개 제출",
+ "submitReview": "리뷰 제출",
+ "blockedRequestChanges": "변경을 요청하려면 요약을 작성하거나 댓글을 하나 이상 추가하세요.",
+ "blockedComment": "댓글 리뷰를 게시하려면 요약을 작성하거나 댓글을 하나 이상 추가하세요."
+ },
+ "reconnectNotice": {
+ "title": "GitHub 연결이 만료되었습니다.",
+ "message": "GitHub 연결이 더 이상 유효하지 않습니다. 연결을 다시 확인하세요. 필요한 경우 다시 연결하라는 안내가 표시됩니다.",
+ "gitlabTitle": "GitLab 연결이 만료되었습니다.",
+ "bitbucketTitle": "Bitbucket 연결이 만료되었습니다.",
+ "providerMessage": "{{provider}} 연결이 더 이상 유효하지 않습니다. 연결을 다시 확인하세요. 필요한 경우 다시 연결하라는 안내가 표시됩니다."
+ },
+ "eventChips": {
+ "comment": "댓글",
+ "label": "리뷰 유형",
+ "requestChanges": "변경 요청"
+ },
"overview": {
"commit": "커밋",
"commit_other": "커밋",
@@ -2666,39 +2745,25 @@
"summaryA11y": "리뷰 요약",
"summaryPlaceholder": "리뷰 요약(선택 사항)"
},
- "pullRequestUnavailable": "풀 리퀘스트를 열 수 없음",
- "pullRequestUnavailableDescription": "이 PR을 열 수 없습니다. PR이 삭제되었거나 저장소가 비공개이거나 해당 저장소에 Kilo GitHub 앱이 설치되지 않았을 수 있습니다.",
- "reconnectNotice": {
- "message": "GitHub 연결이 더 이상 유효하지 않습니다. 연결을 다시 확인하세요. 필요한 경우 다시 연결하라는 안내가 표시됩니다.",
- "title": "GitHub 연결이 만료되었습니다."
- },
- "review": "리뷰",
- "reviewPullRequest": "풀 리퀘스트 리뷰",
- "screen": {
- "shareA11y": "풀 리퀘스트 공유",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "변경 내용의 빈 열",
- "emptyDiffRow": "변경 내용의 빈 행",
- "newOnly": "변경 후에만 있음: {{text}}",
- "noNewlineAtEndOfFile": "파일 끝에 줄 바꿈이 없습니다.",
- "oldNew": "변경 전: {{old}} | 변경 후: {{new}}",
- "oldOnly": "변경 전에만 있음: {{text}}"
+ "tabs": {
+ "discussion": "토론",
+ "files": "파일",
+ "overview": "개요"
},
- "submit": {
- "deletePendingMessage": "이 댓글이 리뷰 대기열에서 제거됩니다.",
- "deletePendingTitle": "제출 대기 중인 댓글을 삭제할까요?",
- "loadFailedTitle": "리뷰 제출 화면을 불러오지 못했습니다.",
- "pendingComment": "제출 대기 중인 댓글",
- "pendingComment_other": "제출 대기 중인 댓글",
- "pendingComment_one": "제출 대기 중인 댓글",
- "summaryOptional": "요약(선택 사항)",
- "partialPostedMessage": "댓글 {{displayFreshCount}}개를 게시했습니다. 이전 커밋을 가리키는 댓글 {{displayStaleCount}}개는 대기열에 남았습니다.",
- "submitCountOfTotal": "댓글 {{displayTotalCount}}개 중 {{displayFreshCount}}개 제출",
- "submitReview": "리뷰 제출",
- "blockedRequestChanges": "변경을 요청하려면 요약을 작성하거나 댓글을 하나 이상 추가하세요.",
- "blockedComment": "댓글 리뷰를 게시하려면 요약을 작성하거나 댓글을 하나 이상 추가하세요."
+ "terms": {
+ "pullRequest": "풀 리퀘스트",
+ "mergeRequest": "머지 요청",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "머지 요청 공유",
+ "viewOnProvider": "{{provider}}에서 보기",
+ "mergeRequestUnavailable": "머지 요청를 열 수 없음",
+ "unavailableDescription": "삭제되었거나 접근 권한이 없을 수 있습니다.",
+ "accessDeniedMergeRequest": "이 머지 요청를 볼 권한이 없습니다.",
+ "couldNotLoadMergeRequest": "머지 요청를 불러오지 못했습니다.",
+ "discussionAccessDenied": "이 머지 요청의 토론을 볼 권한이 없습니다.",
+ "discussionUnavailableMessage": "이 머지 요청가 삭제되었을 수 있습니다.",
+ "noDiscussionDescription": "이 머지 요청에는 아직 리뷰 스레드나 댓글이 없습니다.",
+ "noFilesChangedDescription": "이 머지 요청에는 변경된 파일이 없습니다."
},
"fileStatus": {
"changed": "변경됨",
@@ -2706,11 +2771,6 @@
"modified": "수정됨",
"renamed": "이름 변경됨"
},
- "tabs": {
- "discussion": "토론",
- "files": "파일",
- "overview": "개요"
- },
"diff": {
"selectedTapToChange": "{{label}} 선택됨, 탭하여 선택 변경",
"tapToComment": "{{label}}, 탭하여 댓글 달기",
@@ -2721,7 +2781,7 @@
"emptyLine": "(비어 있음)"
},
"linkPasteClipboardEmpty": "클립보드가 비어 있습니다.",
- "linkPasteNotAPullRequest": "GitHub 풀 리퀘스트 링크가 아닙니다.",
+ "linkPasteNotAPullRequest": "풀 리퀘스트 또는 머지 요청 링크가 아닙니다",
"announce": {
"commentPosted": "댓글이 게시되었습니다",
"reviewSubmitted": "리뷰가 제출되었습니다",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "이 댓글은 게시할 수 없습니다. 선택한 줄이 변경되었거나 PR이 업데이트되었을 수 있습니다.",
"reviewNotSubmitted": "이 리뷰는 현재 상태로 제출할 수 없습니다. PR이 변경되었거나 본인이 작성한 풀 리퀘스트여서 리뷰할 수 없는 경우일 수 있습니다.",
+ "reviewNotSubmittedTerm": "이 리뷰는 그대로 제출할 수 없습니다. {{term}}이(가) 변경되었거나, 자신의 {{term}}은(는) 검토할 수 없습니다.",
"couldNotPostComment": "댓글을 게시하지 못했습니다.",
"couldNotSubmitReview": "리뷰를 제출하지 못했습니다. 인터넷 연결을 확인하고 다시 시도하세요."
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "답글을 달 수 없습니다.",
"couldNotCompleteAction": "이 작업을 완료하지 못했습니다.",
"mergeResultDefaultError": "GitHub가 병합을 완료하지 않았습니다.",
+ "mergeResultNotCompleted": "{{term}}이(가) 병합되지 않았습니다. 상태를 확인하고 다시 시도하세요.",
"ambiguous": "작업 결과를 확인하지 못했습니다. 다시 시도하기 전에 PR을 확인하세요.",
"persistenceFailed": "이 작업을 기록하지 못했습니다. 나중에 다시 시도하세요.",
"forbidden": "이 작업을 수행할 권한이 없습니다."
diff --git a/apps/mobile/src/i18n/locales/lo.json b/apps/mobile/src/i18n/locales/lo.json
index 0d904ba6ba..e1657cf4f9 100644
--- a/apps/mobile/src/i18n/locales/lo.json
+++ b/apps/mobile/src/i18n/locales/lo.json
@@ -36,6 +36,7 @@
"cost": "ຄ່າໃຊ້ຈ່າຍ",
"discard": "ຖິ້ມ",
"findings": "ບັນຫາທີ່ກວດພົບ",
+ "mergeRequest": "merge request",
"notConnected": "ຍັງບໍ່ເຊື່ອມຕໍ່",
"notifications": "ການແຈ້ງເຕືອນ",
"pullRequest": "ຄຳຂໍລວມໂຄ້ດ",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ແຖວຄວາມແຕກຕ່າງທີ່ວ່າງ"
},
"connectionExpired": "ການເຊື່ອມຕໍ່ GitHub ໝົດອາຍຸແລ້ວ.",
+ "capabilities": {
+ "banner": {
+ "title": "ບໍ່ພ້ອມໃຊ້ໃນຜູ້ໃຫ້ບໍລິການນີ້",
+ "accessibility": "ບໍ່ພ້ອມໃຊ້ໃນຜູ້ໃຫ້ບໍລິການນີ້: {{reason}}"
+ }
+ },
"merge": {
"merge": "ລວມໂຄ້ດ",
"mergeNow": "ລວມດຽວນີ້",
"mergePullRequest": "ລວມຄຳຂໍລວມໂຄດ",
+ "mergeTermTitle": "ລວມ{{term}}",
"enableAutoMerge": "ເປີດການລວມອັດຕະໂນມັດ",
"disableAutoMerge": "ປິດການລວມອັດຕະໂນມັດ",
"autoMergeOn": "ເປີດການລວມອັດຕະໂນມັດຢູ່",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "ລຶບສາຂາຫຼັງຈາກລວມ",
"noEnabledMethods": "ຄັງໂຄດນີ້ຍັງບໍ່ໄດ້ເປີດໃຊ້ວິທີລວມໃດໆ. ຂໍໃຫ້ຜູ້ດູແລຄັງໂຄດເປີດໃຊ້ການລວມແບບສ້າງຄອມມິດການລວມ, ຍຸບຄອມມິດເປັນໜຶ່ງ ຫຼື ປ່ຽນຖານ.",
"confirmTitle": "ລວມຄຳຂໍລວມໂຄດບໍ?",
+ "confirmTitleTerm": "ລວມ{{term}}ນີ້ບໍ?",
"confirmMessage": "ການດຳເນີນການນີ້ຈະລວມການປ່ຽນແປງຂອງທ່ານເຂົ້າໃນສາຂາຖານ.",
"enableAutoMergeConfirmTitle": "ເປີດການລວມອັດຕະໂນມັດບໍ?",
"enableAutoMergeConfirmMessage": "GitHub ຈະລວມຄຳຂໍລວມໂຄດນີ້ອັດຕະໂນມັດ ເມື່ອຜ່ານການກວດສອບທີ່ບັງຄັບທັງໝົດ.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} ຈະລວມໂດຍອັດຕະໂນມັດເມື່ອໄປບລາຍນ໌ສຳເລັດ",
+ "enableAutoMergeDescriptionTerm": "GitLab ຈະລວມ {{term}} ນີ້ໂດຍອັດຕະໂນມັດເມື່ອໄປບລາຍນ໌ສຳເລັດ",
"forbidden": "ທ່ານບໍ່ມີສິດລວມຄຳຂໍລວມໂຄດນີ້.",
"cannotMerge": "ຍັງບໍ່ສາມາດລວມຄຳຂໍລວມໂຄດນີ້ໃນສະພາບປັດຈຸບັນໄດ້.",
"couldNotMerge": "ບໍ່ສາມາດລວມຄຳຂໍລວມໂຄດໄດ້.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "ລວມແລ້ວ",
- "closed": "ປິດຄຳຂໍລວມໂຄດນີ້ແລ້ວ"
+ "closed": "ປິດຄຳຂໍລວມໂຄດນີ້ແລ້ວ",
+ "closedMergeRequest": "ປິດ merge request ນີ້ແລ້ວ"
},
"partialSuccessBanner": {
"body": "ບໍ່ສາມາດລຶບສາຂາໄດ້: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ຍັງລວມຄຳຂໍລວມໂຄດນີ້ບໍ່ໄດ້",
"notMergeableDetail": "GitHub ລາຍງານສະຖານະຄວາມພ້ອມໃນການລວມເປັນ {{state}}."
},
+ "restrictions": {
+ "title": "ຂໍ້ຈຳກັດການລວມ",
+ "approvalsRequired_one": "ຕ້ອງການການອະນຸມັດ {{displayCount}} ຄັ້ງ",
+ "approvalsRequired_other": "ຕ້ອງການການອະນຸມັດ {{displayCount}} ຄັ້ງ",
+ "pipelineMustSucceed": "ໄປບລາຍນ໌ຕ້ອງສຳເລັດກ່ອນການລວມ"
+ },
+ "providerBlocked": {
+ "failingPipeline": "ໄປບລາຍນ໌ລົ້ມເຫຼວໃນຄອມມິດຫຼ້າສຸດ",
+ "pendingPipeline": "ໄປບລາຍນ໌ຍັງກຳລັງເຮັດວຽກຢູ່ໃນຄອມມິດຫຼ້າສຸດ",
+ "permission": "ທ່ານບໍ່ມີສິດລວມ{{term}}ນີ້.",
+ "draft": "ໝາຍ{{term}}ວ່າພ້ອມໃຫ້ກວດທານກ່ອນລວມ."
+ },
"methodLabels": {
"merge": "ສ້າງຄອມມິດການລວມ",
"squash": "ຍຸບຄອມມິດເປັນໜຶ່ງແລ້ວລວມ",
@@ -448,6 +472,7 @@
"acceptTerms": "ຍອມຮັບ",
"replyBadRequest": "ບໍ່ສາມາດໂພດຄຳຕອບນີ້ໄດ້. ກະທູ້ອາດມີການປ່ຽນແປງແລ້ວ.",
"replyForbidden": "ທ່ານບໍ່ມີສິດຕອບໃນຄຳຂໍລວມໂຄດນີ້.",
+ "replyForbiddenTerm": "ທ່ານບໍ່ມີສິດຕອບໃນ{{term}}ນີ້.",
"moderation": {
"reportContent": {
"terminal": "ບໍ່ສາມາດລາຍງານຄຳເຫັນນີ້ໄດ້.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "ກວດທານຄຳຂໍລວມໂຄດ",
"headLine": "{{counts}} · ຄອມມິດຫຼ້າສຸດ {{sha}}",
"entry": {
- "eyebrow": "ເປີດຄຳຂໍລວມໂຄດດ້ວຍ URL.",
- "pastePrLink": "ວາງລິງ PR",
- "noRecentPrs": "ບໍ່ມີ PR ທີ່ເປີດຫຼ້າສຸດ",
- "noRecentPrsDescription": "ວາງລິງ PR ຂ້າງເທິງເພື່ອເລີ່ມກວດທານ — PR ນັ້ນຈະປາກົດຢູ່ທີ່ນີ້ໃນຄັ້ງຕໍ່ໄປ.",
+ "eyebrow": "ເປີດຄຳຂໍລວມໂຄ້ດ ຫຼື merge request ດ້ວຍ URL",
+ "pastePrLink": "ວາງລິ້ງຄຳຂໍລວມໂຄ້ດ ຫຼື merge request",
+ "noRecentPrs": "ຍັງບໍ່ມີການກວດທານຫຼ້າສຸດ",
+ "noRecentPrsDescription": "ວາງລິ້ງຂ້າງເທິງເພື່ອເລີ່ມການກວດທານ — ຄັ້ງໜ້າມັນຈະສະແດງຢູ່ນີ້",
"couldNotLoad": "ບໍ່ສາມາດໂຫຼດໄດ້.",
"removeFromRecentsTitle": "ເອົາອອກຈາກລາຍການທີ່ເປີດຫຼ້າສຸດບໍ?",
- "removeFromRecentsMessage": "ຄຳຂໍລວມໂຄດນີ້ຈະຖືກເອົາອອກຈາກລາຍການທີ່ທ່ານເປີດຫຼ້າສຸດ.",
+ "removeFromRecentsMessage": "ການກວດທານນີ້ຈະຖືກລຶບອອກຈາກລາຍການຫຼ້າສຸດຂອງທ່ານ",
"removeRecentAccessibility": "ເອົາ {{repo}} ອອກຈາກລາຍການທີ່ເປີດຫຼ້າສຸດ",
- "urlAccessibility": "URL ຂອງຄຳຂໍລວມໂຄດໃນ GitHub",
- "clearLink": "ລ້າງລິງຄຳຂໍລວມໂຄດ",
- "pasteLink": "ວາງລິງຄຳຂໍລວມໂຄດ",
+ "urlAccessibility": "ປ້ອນ URL ຂອງຄຳຂໍລວມໂຄ້ດ ຫຼື merge request",
+ "urlPlaceholder": "URL ຂອງຄຳຂໍລວມໂຄ້ດ ຫຼື merge request",
+ "openAccessibility": "ເປີດຄຳຂໍລວມໂຄ້ດ ຫຼື merge request",
+ "clearLink": "ລ້າງລິ້ງ",
+ "pasteLink": "ວາງລິ້ງຄຳຂໍລວມໂຄ້ດ ຫຼື merge request",
"open": "ເປີດ"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "ບໍ່ສາມາດກວດສອບການເຊື່ອມຕໍ່ GitHub ໄດ້.",
"checkFailedMessage": "ຍັງບໍ່ສາມາດສະແດງສະຖານະການເຂົ້າສູ່ລະບົບໄດ້ຈົນກວ່າຈະໂຫຼດຂໍ້ມູນນີ້ສຳເລັດ.",
+ "checkFailedTitleGitLab": "ບໍ່ສາມາດກວດສອບການເຊື່ອມຕໍ່ GitLab ໄດ້.",
+ "checkFailedTitleBitbucket": "ບໍ່ສາມາດກວດສອບການເຊື່ອມຕໍ່ Bitbucket ໄດ້.",
+ "providerCheckFailedMessage": "ສະຖານະການເຊື່ອມຕໍ່ຈະບໍ່ພ້ອມໃຊ້ຈົນກວ່າຈະໂຫຼດເສັຣຈ",
"reconnectTitle": "ເຊື່ອມຕໍ່ GitHub ໃໝ່",
"reconnectDescription": "ສິດການເຊື່ອມຕໍ່ GitHub ຂອງທ່ານຖືກຖອນແລ້ວ. ເຊື່ອມຕໍ່ໃໝ່ເພື່ອກວດທານຄຳຂໍລວມໂຄດໃນມືຖືຕໍ່ໄປ.",
- "description": "ເຊື່ອມຕໍ່ບັນຊີ GitHub ຂອງທ່ານເພື່ອກວດທານຄຳຂໍລວມໂຄດໃນມືຖື."
+ "description": "ເຊື່ອມຕໍ່ບັນຊີ GitHub ຂອງທ່ານເພື່ອກວດທານຄຳຂໍລວມໂຄດໃນມືຖື.",
+ "gitlabDescription": "ເຊື່ອມຕໍ່ບັນຊີ GitLab ຂອງທ່ານເພື່ອກວດທານ merge request ເທິງມືຖື",
+ "bitbucketDescription": "ເຊື່ອມຕໍ່ Bitbucket ກັບອົງກອນນີ້ເພື່ອກວດທານຄຳຂໍລວມໂຄ້ດເທິງມືຖື",
+ "bitbucketOrgOnlyDescription": "ເລືອກອົງກອນໃນໂປຣຟາຍຂອງທ່ານເພື່ອກວດທານຄຳຂໍລວມໂຄ້ດ Bitbucket ຂອງອົງກອນນັ້ນ"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "ການເຊື່ອມຕໍ່ GitHub ໝົດອາຍຸແລ້ວ.",
- "message": "ການເຊື່ອມຕໍ່ GitHub ຂອງທ່ານໃຊ້ບໍ່ໄດ້ແລ້ວ. ກວດສອບການເຊື່ອມຕໍ່ອີກຄັ້ງ — ລະບົບຈະຂໍໃຫ້ເຊື່ອມຕໍ່ໃໝ່ຖ້າຈຳເປັນ."
+ "message": "ການເຊື່ອມຕໍ່ GitHub ຂອງທ່ານໃຊ້ບໍ່ໄດ້ແລ້ວ. ກວດສອບການເຊື່ອມຕໍ່ອີກຄັ້ງ — ລະບົບຈະຂໍໃຫ້ເຊື່ອມຕໍ່ໃໝ່ຖ້າຈຳເປັນ.",
+ "gitlabTitle": "ການເຊື່ອມຕໍ່ GitLab ໝົດອາຍຸແລ້ວ.",
+ "bitbucketTitle": "ການເຊື່ອມຕໍ່ Bitbucket ໝົດອາຍຸແລ້ວ.",
+ "providerMessage": "ການເຊື່ອມຕໍ່ {{provider}} ຂອງທ່ານໃຊ້ບໍ່ໄດ້ແລ້ວ. ກວດສອບການເຊື່ອມຕໍ່ອີກຄັ້ງ — ລະບົບຈະຂໍໃຫ້ເຊື່ອມຕໍ່ໃໝ່ຖ້າຈຳເປັນ."
},
"eventChips": {
"comment": "ສະແດງຄຳເຫັນ",
@@ -643,6 +679,21 @@
"files": "ໄຟລ໌",
"discussion": "ການສົນທະນາ"
},
+ "terms": {
+ "pullRequest": "ຄຳຂໍລວມໂຄ້ດ",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "ແບ່ງປັນ merge request",
+ "viewOnProvider": "ເບິ່ງເທິງ {{provider}}",
+ "mergeRequestUnavailable": "ບໍ່ສາມາດເປີດ merge request",
+ "unavailableDescription": "ມັນອາດຖືກລຶບໄປແລ້ວ ຫຼື ທ່ານອາດບໍ່ມີສິດເຂົ້າເຖິງ",
+ "accessDeniedMergeRequest": "ທ່ານບໍ່ມີສິດເບິ່ງ merge request ນີ້.",
+ "couldNotLoadMergeRequest": "ບໍ່ສາມາດໂຫຼດ merge request ໄດ້.",
+ "discussionAccessDenied": "ທ່ານບໍ່ມີສິດເບິ່ງການສົນທະນາຂອງ merge request ນີ້.",
+ "discussionUnavailableMessage": "merge request ນີ້ອາດຖືກລຶບໄປແລ້ວ.",
+ "noDiscussionDescription": "merge request ນີ້ຍັງບໍ່ມີເທຣດການກວດທານ ຫຼື ຄຳເຫັນການສົນທະນາ.",
+ "noFilesChangedDescription": "merge request ນີ້ບໍ່ມີການປ່ຽນແປງເຟົ້ມ."
+ },
"fileStatus": {
"modified": "ແກ້ໄຂແລ້ວ",
"renamed": "ປ່ຽນຊື່ແລ້ວ",
@@ -659,7 +710,7 @@
"emptyLine": "(ວ່າງເປົ່າ)"
},
"linkPasteClipboardEmpty": "ຄລິບບອດວ່າງເປົ່າ.",
- "linkPasteNotAPullRequest": "ນີ້ບໍ່ແມ່ນລິງຄຳຂໍລວມໂຄດໃນ GitHub.",
+ "linkPasteNotAPullRequest": "ບໍ່ແມ່ນລິ້ງຄຳຂໍລວມໂຄ້ດ ຫຼື merge request",
"announce": {
"commentPosted": "ໂພດຄຳເຫັນແລ້ວ",
"reviewSubmitted": "ສົ່ງຜົນການກວດທານແລ້ວ",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ບໍ່ສາມາດໂພດຄຳເຫັນນີ້ໄດ້. ບັນທັດທີ່ເລືອກອາດມີການປ່ຽນແປງ ຫຼື PR ອາດມີການອັບເດດແລ້ວ.",
"reviewNotSubmitted": "ຍັງບໍ່ສາມາດສົ່ງຜົນການກວດທານນີ້ໄດ້. PR ອາດມີການປ່ຽນແປງ ຫຼື ທ່ານບໍ່ມີສິດກວດທານຄຳຂໍລວມໂຄດຂອງຕົນເອງ.",
+ "reviewNotSubmittedTerm": "ສົ່ງການກວດທານນີ້ຕາມເດີມບໍ່ໄດ້. {{term}} ອາດປ່ຽນແປງໄປແລ້ວ, ຫຼື ທ່ານກວດທານ {{term}} ຂອງຕົນເອງບໍ່ໄດ້.",
"couldNotPostComment": "ບໍ່ສາມາດໂພດຄຳເຫັນໄດ້.",
"couldNotSubmitReview": "ບໍ່ສາມາດສົ່ງຜົນການກວດທານໄດ້. ກວດສອບການເຊື່ອມຕໍ່ ແລ້ວລອງອີກຄັ້ງ."
},
@@ -675,6 +727,7 @@
"couldNotReply": "ບໍ່ສາມາດຕອບໄດ້.",
"couldNotCompleteAction": "ບໍ່ສາມາດດຳເນີນການນີ້ໃຫ້ສຳເລັດໄດ້.",
"mergeResultDefaultError": "GitHub ລວມບໍ່ສຳເລັດ.",
+ "mergeResultNotCompleted": "{{term}} ຍັງບໍ່ຖືກລວມ. ກວດສອບສະຖານະຂອງມັນແລ້ວລອງໃໝ່.",
"ambiguous": "ບໍ່ສາມາດຢືນຢັນໄດ້ — ກວດເບິ່ງ PR ກ່ອນລອງໃໝ່.",
"persistenceFailed": "ບໍ່ສາມາດບັນທຶກການດຳເນີນການນີ້ໄດ້. ກະລຸນາລອງອີກຄັ້ງພາຍຫຼັງ.",
"forbidden": "ບໍ່ມີສິດດຳເນີນການນີ້."
@@ -1988,11 +2041,31 @@
"retryConnection": "ລອງເຊື່ອມຕໍ່ໃໝ່"
},
"newSession": {
+ "recentlyUsed": "ໃຊ້ຫຼ້າສຸດ",
+ "couldNotLoadGithubRepositories": "ບໍ່ສາມາດໂຫຼດຄັງໂຄດຈາກ GitHub ໄດ້.",
+ "couldNotLoadGitlabRepositories": "ບໍ່ສາມາດໂຫຼດຄັງໂຄດຈາກ GitLab ໄດ້.",
+ "couldNotLoadBitbucketRepositories": "ບໍ່ສາມາດໂຫຼດຄັງໂຄດຈາກ Bitbucket ໄດ້.",
"connectGithubDescription": "ເຊື່ອມຕໍ່ GitHub ໃນບຣາວເຊີ ແລ້ວກັບມາທີ່ນີ້ເພື່ອເລືອກຄັງໂຄດ.",
+ "connectGitlabDescription": "ເຊື່ອມຕໍ່ GitLab ໃນບຣາວເຊີ ແລ້ວກັບມາທີ່ນີ້ເພື່ອເລືອກຄັງໂຄດ.",
+ "connectBitbucketDescription": "ເຊື່ອມຕໍ່ Bitbucket ໃນບຣາວເຊີ ແລ້ວກັບມາທີ່ນີ້ເພື່ອເລືອກຄັງໂຄດ.",
"openGithub": "ເປີດ GitHub",
+ "openGitlab": "ເປີດ GitLab",
+ "openBitbucket": "ເປີດ Bitbucket",
"refreshRepositories": "ໂຫຼດລາຍການຄັງໂຄດໃໝ່",
"githubConnected": "ເຊື່ອມຕໍ່ GitHub ແລ້ວ",
+ "gitlabConnected": "ເຊື່ອມຕໍ່ GitLab ແລ້ວ",
"noRepositoriesVisible": "ບໍ່ພົບຄັງໂຄດ. ກວດເບິ່ງສິດເຂົ້າເຖິງຄັງໂຄດຂອງແອັບ Kilo ໃນ GitHub ແລ້ວໂຫຼດໃໝ່.",
+ "noRepositoriesVisibleGitlab": "ບໍ່ພົບຄັງໂຄດ. ກວດເບິ່ງສິດເຂົ້າເຖິງຄັງໂຄດໃນ GitLab ແລ້ວໂຫຼດໃໝ່.",
+ "noRepositoriesVisibleBitbucket": "ບໍ່ພົບຄັງໂຄດ. ກວດເບິ່ງສິດເຂົ້າເຖິງຄັງໂຄດໃນ Bitbucket ແລ້ວໂຫຼດໃໝ່.",
+ "bitbucketOrganizationsOnly": "Bitbucket ພ້ອມໃຊ້ສຳລັບອົງກອນເທົ່ານັ້ນ",
+ "branchPickerTitle": "ເລືອກສາຂາໂຄ້ດ",
+ "branchDefault": "ຄ່າເລີ່ມຕົ້ນ",
+ "branchAccessibility": "ສາຂາໂຄ້ດ: {{label}}",
+ "branchLoading": "ກຳລັງໂຫຼດສາຂາໂຄ້ດ",
+ "branchLoadError": "ໂຫຼດສາຂາໂຄ້ດບໍ່ໄດ້",
+ "branchUnavailable": "ບໍ່ມີສາຂາໂຄ້ດພ້ອມໃຊ້ສຳລັບຄັງໂຄ້ດນີ້. ກວດສອບສິດເຂົ້າເຖິງຂອງທ່ານກັບຜູ້ໃຫ້ບໍລິການ, ແລ້ວເລືອກຄັງໂຄ້ດອື່ນ.",
+ "branchEmpty": "ບໍ່ມີສາຂາໂຄ້ດພ້ອມໃຊ້",
+ "branchPlaceholder": "ເລືອກສາຂາໂຄ້ດໜຶ່ງ",
"runOnWithTarget": "ເຮັດວຽກເທິງ: {{target}}",
"environment": "ສະພາບແວດລ້ອມ",
"couldNotLoadEnvironment": "ບໍ່ສາມາດໂຫຼດສະພາບແວດລ້ອມຂອງເຈົ້າໄດ້.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "ບໍ່ສາມາດໂຫຼດລາຍການຄັງໂຄດໃໝ່ໄດ້. ກະລຸນາລອງໃໝ່.",
"discardDraftTitle": "ລຶບຂໍ້ຄວາມຮ່າງບໍ?",
"discardDraftMessage": "ຂໍ້ຄວາມທີ່ເຈົ້າຮ່າງໄວ້ຈະຖືກລຶບ.",
+ "discardWithUploadsMessage": "ຂໍ້ຄວາມທີ່ເຈົ້າຮ່າງໄວ້ ແລະໄຟລ໌ທີ່ອັບໂຫຼດໄວ້ແຕ່ຍັງບໍ່ໄດ້ໃຊ້ຈະຖືກລຶບ.",
"discardFailed": "ບໍ່ສາມາດລຶບຂໍ້ຄວາມຮ່າງໄດ້. ກະລຸນາລອງໃໝ່.",
"remoteHint": "ໃຊ້ຄຳສັ່ງ `kilo remote` ໃນຄອມພິວເຕີຂອງເຈົ້າ ຫຼື `/remote` ໃນເຊດຊັນ CLI ທີ່ກຳລັງເຮັດວຽກຢູ່ ເພື່ອຄວບຄຸມ kilo ທີ່ເຮັດວຽກຢູ່ໃນເຄື່ອງ.",
- "connectBitbucketDescription": "ເຊື່ອມຕໍ່ Bitbucket ໃນບຣາວເຊີ ແລ້ວກັບມາທີ່ນີ້ເພື່ອເລືອກຄັງໂຄດ.",
- "connectGitlabDescription": "ເຊື່ອມຕໍ່ GitLab ໃນບຣາວເຊີ ແລ້ວກັບມາທີ່ນີ້ເພື່ອເລືອກຄັງໂຄດ.",
- "couldNotLoadBitbucketRepositories": "ບໍ່ສາມາດໂຫຼດຄັງໂຄດຈາກ Bitbucket ໄດ້.",
- "couldNotLoadGithubRepositories": "ບໍ່ສາມາດໂຫຼດຄັງໂຄດຈາກ GitHub ໄດ້.",
- "couldNotLoadGitlabRepositories": "ບໍ່ສາມາດໂຫຼດຄັງໂຄດຈາກ GitLab ໄດ້.",
- "gitlabConnected": "ເຊື່ອມຕໍ່ GitLab ແລ້ວ",
- "noRepositoriesVisibleBitbucket": "ບໍ່ພົບຄັງໂຄດ. ກວດເບິ່ງສິດເຂົ້າເຖິງຄັງໂຄດໃນ Bitbucket ແລ້ວໂຫຼດໃໝ່.",
- "noRepositoriesVisibleGitlab": "ບໍ່ພົບຄັງໂຄດ. ກວດເບິ່ງສິດເຂົ້າເຖິງຄັງໂຄດໃນ GitLab ແລ້ວໂຫຼດໃໝ່.",
- "openBitbucket": "ເປີດ Bitbucket",
- "openGitlab": "ເປີດ GitLab",
- "recentlyUsed": "ໃຊ້ຫຼ້າສຸດ",
"continueFrom": "ກຳລັງເຮັດວຽກຕໍ່ຈາກ {{title}}.",
"importingSession": "ກຳລັງນຳເຂົ້າເຊດຊັນ",
"cliCannotContinue": "CLI ນີ້ບໍ່ສາມາດເຮັດວຽກຕໍ່ຈາກເຊດຊັນໄດ້. ເລືອກ Cloud Agent ຫຼື CLI ອື່ນ.",
- "importFailed": "ບໍ່ສາມາດນຳເຂົ້າເຊດຊັນນີ້ໄດ້.",
- "discardWithUploadsMessage": "ຂໍ້ຄວາມທີ່ເຈົ້າຮ່າງໄວ້ ແລະໄຟລ໌ທີ່ອັບໂຫຼດໄວ້ແຕ່ຍັງບໍ່ໄດ້ໃຊ້ຈະຖືກລຶບ."
+ "importFailed": "ບໍ່ສາມາດນຳເຂົ້າເຊດຊັນນີ້ໄດ້."
},
"partRenderer": {
"updatedFileCount_one": "ອັບເດດໄຟລ໌ແລ້ວ {{displayCount}} ໄຟລ໌.",
diff --git a/apps/mobile/src/i18n/locales/lt.json b/apps/mobile/src/i18n/locales/lt.json
index c3888de30d..303785ea73 100644
--- a/apps/mobile/src/i18n/locales/lt.json
+++ b/apps/mobile/src/i18n/locales/lt.json
@@ -36,6 +36,7 @@
"cost": "Kaina",
"discard": "Atmesti",
"findings": "Problemos",
+ "mergeRequest": "merge request",
"notConnected": "Neprijungta",
"notifications": "Pranešimai",
"pullRequest": "pakeitimų užklausa",
@@ -344,10 +345,17 @@
"emptyDiffRow": "Tuščia pakeitimų palyginimo eilutė"
},
"connectionExpired": "Baigėsi GitHub prieigos galiojimas.",
+ "capabilities": {
+ "banner": {
+ "title": "Nepasiekiama šio teikėjo",
+ "accessibility": "Nepasiekiama šio teikėjo: {{reason}}"
+ }
+ },
"merge": {
"merge": "Sujungimas",
"mergeNow": "Sujungti dabar",
"mergePullRequest": "Pakeitimų užklausos sujungimas",
+ "mergeTermTitle": "Sujungti {{term}}",
"enableAutoMerge": "Įjungti automatinį sujungimą",
"disableAutoMerge": "Išjungti automatinį sujungimą",
"autoMergeOn": "Automatinis sujungimas įjungtas",
@@ -366,9 +374,12 @@
"deleteBranchAfterMerge": "Ištrinti šaką po sujungimo",
"noEnabledMethods": "Šioje saugykloje neįjungtas nė vienas sujungimo būdas. Paprašyk saugyklos administratoriaus įjungti įprastą sujungimą, įrašų sutraukimą arba perkėlimą į kitą bazę.",
"confirmTitle": "Sujungti pakeitimų užklausą?",
+ "confirmTitleTerm": "Sujungti {{term}}?",
"confirmMessage": "Tavo pakeitimai bus sujungti su bazine šaka.",
"enableAutoMergeConfirmTitle": "Įjungti automatinį sujungimą?",
"enableAutoMergeConfirmMessage": "GitHub automatiškai sujungs šią pakeitimų užklausą, kai visi privalomi patikrinimai bus sėkmingi.",
+ "enableAutoMergeConfirmMessageTerm": "Automatinis {{term}} sujungimas įvyks sėkmingai įvykdžius pipeline.",
+ "enableAutoMergeDescriptionTerm": "GitLab automatiškai sujungs {{term}}, kai pipeline bus sėkmingas.",
"forbidden": "Neturi teisės sujungti šios pakeitimų užklausos.",
"cannotMerge": "Dabartinės būsenos pakeitimų užklausos negalima sujungti.",
"couldNotMerge": "Nepavyko sujungti pakeitimų užklausos.",
@@ -379,7 +390,8 @@
},
"terminal": {
"alreadyMerged": "Jau sujungta",
- "closed": "Ši pakeitimų užklausa uždaryta"
+ "closed": "Ši pakeitimų užklausa uždaryta",
+ "closedMergeRequest": "Šis merge request uždarytas"
},
"partialSuccessBanner": {
"body": "Nepavyko ištrinti šakos: {{reason}}.",
@@ -405,6 +417,20 @@
"notMergeableTitle": "Šios pakeitimų užklausos dar negalima sujungti",
"notMergeableDetail": "GitHub nurodė sujungimo būseną: {{state}}."
},
+ "restrictions": {
+ "title": "Sujungimo apribojimai",
+ "approvalsRequired_one": "Reikalingas {{displayCount}} patvirtinimas",
+ "approvalsRequired_other": "Reikalingi {{displayCount}} patvirtinimai",
+ "pipelineMustSucceed": "Prieš sujungiant pipeline turi būti sėkmingas.",
+ "approvalsRequired_many": "Reikalinga {{displayCount}} patvirtinimų",
+ "approvalsRequired_few": "Reikalingi {{displayCount}} patvirtinimai"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline nepavyksta paskutiniame commit.",
+ "pendingPipeline": "Pipeline vis dar vykdomas paskutiniame commit.",
+ "permission": "Trūksta teisių sujungti {{term}}.",
+ "draft": "Prieš sujungiant pakeisk {{term}} būseną į paruoštą peržiūrai."
+ },
"methodLabels": {
"merge": "Sukurti sujungimo įrašą",
"squash": "Sutraukti įrašus ir sujungti",
@@ -452,6 +478,7 @@
"acceptTerms": "Sutikti",
"replyBadRequest": "Šio atsakymo negalima paskelbti. Gija galėjo pasikeisti.",
"replyForbidden": "Neturi teisės atsakyti šios pakeitimų užklausos diskusijoje.",
+ "replyForbiddenTerm": "Neturi teisės atsakyti į {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Apie šį komentarą negalima pranešti.",
@@ -483,10 +510,6 @@
"termsAcceptRequired": "Kad galėtum skelbti, turi sutikti su paslaugų teikimo sąlygomis.",
"termsOutdatedCopy": "Paslaugų teikimo sąlygos pasikeitė. Iš naujo atidaryk šį ekraną ir sutik su naujausia jų versija.",
"termsCheckRetryCopy": "Nepavyko patikrinti paslaugų teikimo sąlygų. Patikrink ryšį ir bandyk dar kartą.",
- "comment_few": "{{displayCount}} komentarai",
- "comment_many": "{{displayCount}} komentaro",
- "reaction_few": "reakcijos",
- "reaction_many": "reakcijos",
"reactions": {
"thumbsUp": "Patinka",
"thumbsDown": "Nepatinka",
@@ -504,7 +527,11 @@
"outdatedOnLines": "Pasenęs komentaras: {{lines}}",
"outdatedOnPath": "Pasenęs komentaras: {{path}}"
},
- "deletedUser": "ištrintas naudotojas"
+ "deletedUser": "ištrintas naudotojas",
+ "comment_few": "{{displayCount}} komentarai",
+ "comment_many": "{{displayCount}} komentaro",
+ "reaction_few": "reakcijos",
+ "reaction_many": "reakcijos"
},
"couldNotOpenGitHubAppSettings": "Nepavyko atidaryti GitHub programos nustatymų.",
"installKiloGitHubApp": "Įdiegti Kilo GitHub programėlę",
@@ -516,17 +543,19 @@
"reviewPullRequest": "Peržiūrėti pakeitimų užklausą",
"headLine": "{{counts}} · naujausias įrašas {{sha}}",
"entry": {
- "eyebrow": "Atidaryk pakeitimų užklausą pagal URL.",
- "pastePrLink": "Įklijuoti PR nuorodą",
- "noRecentPrs": "Nėra neseniai peržiūrėtų PR",
- "noRecentPrsDescription": "Įklijuok PR nuorodą viršuje ir pradėk peržiūrą — kitą kartą PR bus rodomas čia.",
+ "eyebrow": "Atidaryk pakeitimų užklausą arba merge request pagal URL",
+ "pastePrLink": "Įklijuoti pakeitimų užklausos arba merge request nuorodą",
+ "noRecentPrs": "Nėra nesenių peržiūrų",
+ "noRecentPrsDescription": "Įklijuok nuorodą viršuje ir pradėk peržiūrą — kitą kartą ji bus rodoma čia.",
"couldNotLoad": "Nepavyko įkelti.",
"removeFromRecentsTitle": "Pašalinti iš neseniai peržiūrėtų?",
- "removeFromRecentsMessage": "Ši pakeitimų užklausa bus pašalinta iš tavo neseniai peržiūrėtų užklausų sąrašo.",
+ "removeFromRecentsMessage": "Ši peržiūra bus pašalinta iš neseniai peržiūrėtų sąrašo.",
"removeRecentAccessibility": "Pašalinti {{repo}} iš neseniai peržiūrėtų užklausų sąrašo",
- "urlAccessibility": "GitHub pakeitimų užklausos URL",
- "clearLink": "Išvalyti pakeitimų užklausos nuorodą",
- "pasteLink": "Įklijuoti pakeitimų užklausos nuorodą",
+ "urlAccessibility": "Įvesk pakeitimų užklausos arba merge request URL",
+ "urlPlaceholder": "Pakeitimų užklausos arba merge request URL",
+ "openAccessibility": "Atidaryti pakeitimų užklausą arba merge request",
+ "clearLink": "Išvalyti nuorodą",
+ "pasteLink": "Įklijuoti pakeitimų užklausos arba merge request nuorodą",
"open": "Atidaryti"
},
"checks": {
@@ -575,9 +604,15 @@
"connect": {
"checkFailedTitle": "Nepavyko patikrinti GitHub ryšio.",
"checkFailedMessage": "Kol duomenys neįkelti, prisijungimo būsena nepasiekiama.",
+ "checkFailedTitleGitLab": "Nepavyko patikrinti GitLab ryšio.",
+ "checkFailedTitleBitbucket": "Nepavyko patikrinti Bitbucket ryšio.",
+ "providerCheckFailedMessage": "Ryšio būsena bus prieinama įkėlus duomenis.",
"reconnectTitle": "Prisijungti prie GitHub iš naujo",
"reconnectDescription": "Tavo GitHub prieiga atšaukta. Prisijunk iš naujo, kad galėtum toliau peržiūrėti pakeitimų užklausas mobiliajame įrenginyje.",
- "description": "Prijunk savo GitHub paskyrą, kad galėtum peržiūrėti pakeitimų užklausas mobiliajame įrenginyje."
+ "description": "Prijunk savo GitHub paskyrą, kad galėtum peržiūrėti pakeitimų užklausas mobiliajame įrenginyje.",
+ "gitlabDescription": "Prijunk savo GitLab paskyrą, kad galėtum peržiūrėti merge requests mobiliajame įrenginyje.",
+ "bitbucketDescription": "Prijunk Bitbucket prie šios organizacijos, kad galėtum peržiūrėti pakeitimų užklausas mobiliajame įrenginyje.",
+ "bitbucketOrgOnlyDescription": "Profilyje pasirink organizaciją, kad galėtum peržiūrėti jos Bitbucket pakeitimų užklausas."
},
"screen": {
"title": "#{{number}}",
@@ -601,7 +636,10 @@
},
"reconnectNotice": {
"title": "Baigėsi GitHub prieigos galiojimas.",
- "message": "Tavo GitHub ryšys nebegalioja. Patikrink ryšį dar kartą — prireikus bus paprašyta prisijungti iš naujo."
+ "message": "Tavo GitHub ryšys nebegalioja. Patikrink ryšį dar kartą — prireikus bus paprašyta prisijungti iš naujo.",
+ "gitlabTitle": "Baigėsi GitLab prieigos galiojimas.",
+ "bitbucketTitle": "Baigėsi Bitbucket prieigos galiojimas.",
+ "providerMessage": "Tavo {{provider}} ryšys nebegalioja. Patikrink ryšį dar kartą — prireikus bus paprašyta prisijungti iš naujo."
},
"eventChips": {
"comment": "Komentuoti",
@@ -657,6 +695,21 @@
"files": "Failai",
"discussion": "Diskusija"
},
+ "terms": {
+ "pullRequest": "Pakeitimų užklausa",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Bendrinti merge request",
+ "viewOnProvider": "Peržiūrėti {{provider}}",
+ "mergeRequestUnavailable": "Merge request nepasiekiamas",
+ "unavailableDescription": "Galbūt jis buvo ištrintas, arba neturi prieigos prie jo.",
+ "accessDeniedMergeRequest": "Neturi teisės peržiūrėti šio merge request.",
+ "couldNotLoadMergeRequest": "Nepavyko įkelti merge request.",
+ "discussionAccessDenied": "Neturi teisės peržiūrėti šio merge request diskusijos.",
+ "discussionUnavailableMessage": "Šis merge request galėjo būti pašalintas.",
+ "noDiscussionDescription": "Šiame merge request nėra peržiūros gijų ar diskusijos komentarų.",
+ "noFilesChangedDescription": "Šiame merge request nėra failų pakeitimų."
+ },
"fileStatus": {
"modified": "Pakeista",
"renamed": "Pervadinta",
@@ -673,7 +726,7 @@
"emptyLine": "(tuščia)"
},
"linkPasteClipboardEmpty": "Iškarpinė tuščia.",
- "linkPasteNotAPullRequest": "Tai ne GitHub pakeitimų užklausos nuoroda.",
+ "linkPasteNotAPullRequest": "Tai ne pakeitimų užklausos ar merge request nuoroda",
"announce": {
"commentPosted": "Komentaras paskelbtas",
"reviewSubmitted": "Peržiūra pateikta",
@@ -682,6 +735,7 @@
"mutationError": {
"commentNotPosted": "Šio komentaro paskelbti negalima. Pasirinkta eilutė galėjo pasikeisti arba PR galėjo būti atnaujintas.",
"reviewNotSubmitted": "Dabartinės peržiūros pateikti negalima. PR galėjo pasikeisti arba bandai peržiūrėti savo paties pakeitimų užklausą.",
+ "reviewNotSubmittedTerm": "Šios peržiūros pateikti negalima. {{term}} galėjo pasikeisti arba negali peržiūrėti savo {{term}}.",
"couldNotPostComment": "Nepavyko paskelbti komentaro.",
"couldNotSubmitReview": "Nepavyko pateikti peržiūros. Patikrink ryšį ir bandyk dar kartą."
},
@@ -689,6 +743,7 @@
"couldNotReply": "Nepavyko atsakyti.",
"couldNotCompleteAction": "Nepavyko atlikti šio veiksmo.",
"mergeResultDefaultError": "GitHub neužbaigė sujungimo.",
+ "mergeResultNotCompleted": "Nepavyko sujungti {{term}}. Patikrink būseną ir bandyk dar kartą.",
"ambiguous": "Nepavyko patvirtinti rezultato — prieš bandydamas dar kartą patikrink PR.",
"persistenceFailed": "Nepavyko užfiksuoti šio veiksmo. Bandyk dar kartą vėliau.",
"forbidden": "Šis veiksmas neleidžiamas."
@@ -2020,11 +2075,31 @@
"retryConnection": "Bandyti prisijungti iš naujo"
},
"newSession": {
+ "recentlyUsed": "Neseniai naudota",
+ "couldNotLoadGithubRepositories": "Nepavyko įkelti GitHub saugyklų.",
+ "couldNotLoadGitlabRepositories": "Nepavyko įkelti GitLab saugyklų.",
+ "couldNotLoadBitbucketRepositories": "Nepavyko įkelti Bitbucket saugyklų.",
"connectGithubDescription": "Naršyklėje susiekite GitHub paskyrą, tada grįžkite čia ir pasirinkite saugyklą.",
+ "connectGitlabDescription": "Naršyklėje susiekite GitLab paskyrą, tada grįžkite čia ir pasirinkite saugyklą.",
+ "connectBitbucketDescription": "Naršyklėje susiekite Bitbucket paskyrą, tada grįžkite čia ir pasirinkite saugyklą.",
"openGithub": "Atidaryti GitHub",
+ "openGitlab": "Atidaryti GitLab",
+ "openBitbucket": "Atidaryti Bitbucket",
"refreshRepositories": "Atnaujinti saugyklas",
"githubConnected": "GitHub paskyra susieta",
+ "gitlabConnected": "GitLab paskyra susieta",
"noRepositoriesVisible": "Saugyklų nerasta. Patikrinkite, ar Kilo programėlė turi prieigą prie GitHub saugyklų, tada atnaujinkite sąrašą.",
+ "noRepositoriesVisibleGitlab": "Saugyklų nerasta. Patikrinkite prieigą prie GitLab saugyklų, tada atnaujinkite sąrašą.",
+ "noRepositoriesVisibleBitbucket": "Saugyklų nerasta. Patikrinkite prieigą prie Bitbucket saugyklų, tada atnaujinkite sąrašą.",
+ "bitbucketOrganizationsOnly": "Bitbucket prieinamas tik organizacijoms.",
+ "branchPickerTitle": "Pasirinkti šaką",
+ "branchDefault": "Numatytoji",
+ "branchAccessibility": "Šaka: {{label}}",
+ "branchLoading": "Įkeliamos šakos",
+ "branchLoadError": "Nepavyko įkelti šakų",
+ "branchUnavailable": "Šiai saugyklai šakų nėra. Patikrink prieigos teises pas tiekėją ir pasirink kitą saugyklą.",
+ "branchEmpty": "Nėra prieinamų šakų",
+ "branchPlaceholder": "Pasirinkti šaką",
"runOnWithTarget": "Vykdymo vieta: {{target}}",
"environment": "Aplinka",
"couldNotLoadEnvironment": "Nepavyko įkelti jūsų aplinkos.",
@@ -2045,24 +2120,13 @@
"couldNotRefreshRepositories": "Nepavyko atnaujinti saugyklų. Bandykite dar kartą.",
"discardDraftTitle": "Atmesti juodraštį?",
"discardDraftMessage": "Jūsų užklausa bus prarasta.",
+ "discardWithUploadsMessage": "Jūsų užklausa ir visi prie išsiųstų žinučių nepridėti įkelti failai bus ištrinti.",
"discardFailed": "Nepavyko atmesti juodraščio. Bandykite dar kartą.",
"remoteHint": "Norėdami valdyti vietinį kilo procesą, kompiuteryje vykdykite `kilo remote` arba veikiančioje CLI sesijoje vykdykite `/remote`.",
- "connectBitbucketDescription": "Naršyklėje susiekite Bitbucket paskyrą, tada grįžkite čia ir pasirinkite saugyklą.",
- "connectGitlabDescription": "Naršyklėje susiekite GitLab paskyrą, tada grįžkite čia ir pasirinkite saugyklą.",
- "couldNotLoadBitbucketRepositories": "Nepavyko įkelti Bitbucket saugyklų.",
- "couldNotLoadGithubRepositories": "Nepavyko įkelti GitHub saugyklų.",
- "couldNotLoadGitlabRepositories": "Nepavyko įkelti GitLab saugyklų.",
- "gitlabConnected": "GitLab paskyra susieta",
- "noRepositoriesVisibleBitbucket": "Saugyklų nerasta. Patikrinkite prieigą prie Bitbucket saugyklų, tada atnaujinkite sąrašą.",
- "noRepositoriesVisibleGitlab": "Saugyklų nerasta. Patikrinkite prieigą prie GitLab saugyklų, tada atnaujinkite sąrašą.",
- "openBitbucket": "Atidaryti Bitbucket",
- "openGitlab": "Atidaryti GitLab",
- "recentlyUsed": "Neseniai naudota",
"continueFrom": "Tęsiama sesija „{{title}}“.",
"importingSession": "Importuojama sesija",
"cliCannotContinue": "Šioje CLI sesijos tęsti negalima. Pasirinkite „Cloud Agent“ arba kitą CLI.",
- "importFailed": "Nepavyko importuoti šios sesijos.",
- "discardWithUploadsMessage": "Jūsų užklausa ir visi prie išsiųstų žinučių nepridėti įkelti failai bus ištrinti."
+ "importFailed": "Nepavyko importuoti šios sesijos."
},
"partRenderer": {
"updatedFileCount_one": "Atnaujintas {{displayCount}} failas.",
diff --git a/apps/mobile/src/i18n/locales/lv.json b/apps/mobile/src/i18n/locales/lv.json
index 59ebe163ec..a4377e99af 100644
--- a/apps/mobile/src/i18n/locales/lv.json
+++ b/apps/mobile/src/i18n/locales/lv.json
@@ -36,6 +36,7 @@
"cost": "Izmaksas",
"discard": "Atmest",
"findings": "Konstatējumi",
+ "mergeRequest": "merge request",
"notConnected": "Nav pievienots",
"notifications": "Paziņojumi",
"pullRequest": "izmaiņu pieprasījums",
@@ -342,10 +343,17 @@
"emptyDiffRow": "Tukša izmaiņu salīdzinājuma rinda"
},
"connectionExpired": "GitHub savienojuma derīguma termiņš ir beidzies.",
+ "capabilities": {
+ "banner": {
+ "title": "Nav pieejams šim pakalpojumam",
+ "accessibility": "Nav pieejams šim pakalpojumam: {{reason}}"
+ }
+ },
"merge": {
"merge": "Apvienošana",
"mergeNow": "Apvienot tagad",
"mergePullRequest": "Izmaiņu pieprasījuma apvienošana",
+ "mergeTermTitle": "Apvienot {{term}}",
"enableAutoMerge": "Iespējot automātisko apvienošanu",
"disableAutoMerge": "Atspējot automātisko apvienošanu",
"autoMergeOn": "Automātiskā apvienošana ir ieslēgta",
@@ -364,9 +372,12 @@
"deleteBranchAfterMerge": "Dzēst zaru pēc apvienošanas",
"noEnabledMethods": "Šajā repozitorijā nav iespējota neviena apvienošanas metode. Lūdz repozitorija administratoram iespējot apvienošanu ar apvienošanas komitu, saspiešanu vai pārbāzēšanu.",
"confirmTitle": "Apvienot izmaiņu pieprasījumu?",
+ "confirmTitleTerm": "Apvienot {{term}}?",
"confirmMessage": "Tavas izmaiņas tiks apvienotas ar bāzes zaru.",
"enableAutoMergeConfirmTitle": "Iespējot automātisko apvienošanu?",
"enableAutoMergeConfirmMessage": "GitHub automātiski apvienos šo izmaiņu pieprasījumu, kad visas obligātās pārbaudes būs sekmīgas.",
+ "enableAutoMergeConfirmMessageTerm": "Pēc veiksmīgas izpildes {{term}} tiks apvienots automātiski.",
+ "enableAutoMergeDescriptionTerm": "GitLab automātiski apvienos {{term}}, kad pipeline izpildīsies veiksmīgi.",
"forbidden": "Tev nav atļaujas apvienot šo izmaiņu pieprasījumu.",
"cannotMerge": "Šo izmaiņu pieprasījumu pašreizējā stāvoklī nevar apvienot.",
"couldNotMerge": "Neizdevās apvienot izmaiņu pieprasījumu.",
@@ -377,7 +388,8 @@
},
"terminal": {
"alreadyMerged": "Jau apvienots",
- "closed": "Izmaiņu pieprasījums ir slēgts"
+ "closed": "Izmaiņu pieprasījums ir slēgts",
+ "closedMergeRequest": "Šis merge request ir slēgts"
},
"partialSuccessBanner": {
"body": "Neizdevās dzēst zaru: {{reason}}.",
@@ -403,6 +415,19 @@
"notMergeableTitle": "Šo izmaiņu pieprasījumu vēl nevar apvienot",
"notMergeableDetail": "GitHub ziņoja par apvienojamības stāvokli {{state}}."
},
+ "restrictions": {
+ "title": "Apvienošanas ierobežojumi",
+ "approvalsRequired_one": "Nepieciešams {{displayCount}} apstiprinājums",
+ "approvalsRequired_other": "Nepieciešami {{displayCount}} apstiprinājumi",
+ "pipelineMustSucceed": "Pirms apvienošanas pipeline ir jāizpildās veiksmīgi.",
+ "approvalsRequired_zero": "Apstiprinājumi nav nepieciešami"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline neizpildās pēdējajā commit.",
+ "pendingPipeline": "Pipeline joprojām tiek darbināts pēdējajā commit.",
+ "permission": "Tev nav atļaujas apvienot {{term}}.",
+ "draft": "Pirms apvienošanas atzīmē {{term}} kā gatavu pārskatīšanai."
+ },
"methodLabels": {
"merge": "Izveidot apvienošanas komitu",
"squash": "Saspiest un apvienot",
@@ -450,6 +475,7 @@
"acceptTerms": "Pieņemt",
"replyBadRequest": "Šo atbildi nevar publicēt. Pavediens, iespējams, ir mainījies.",
"replyForbidden": "Tev nav atļaujas atbildēt šajā izmaiņu pieprasījumā.",
+ "replyForbiddenTerm": "Tev nav atļaujas atbildēt uz {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Par šo komentāru nevar ziņot.",
@@ -481,8 +507,6 @@
"termsAcceptRequired": "Lai publicētu saturu, tev jāpieņem lietošanas noteikumi.",
"termsOutdatedCopy": "Lietošanas noteikumi ir mainīti. Atver šo ekrānu vēlreiz, lai pieņemtu jaunāko versiju.",
"termsCheckRetryCopy": "Neizdevās pārbaudīt lietošanas noteikumus. Pārbaudi savienojumu un mēģini vēlreiz.",
- "comment_zero": "{{displayCount}} komentāru",
- "reaction_zero": "reakciju",
"reactions": {
"thumbsUp": "Īkšķis uz augšu",
"thumbsDown": "Īkšķis uz leju",
@@ -500,7 +524,9 @@
"outdatedOnLines": "Novecojis: {{lines}}",
"outdatedOnPath": "Novecojis: {{path}}"
},
- "deletedUser": "dzēsts lietotājs"
+ "deletedUser": "dzēsts lietotājs",
+ "comment_zero": "{{displayCount}} komentāru",
+ "reaction_zero": "reakciju"
},
"couldNotOpenGitHubAppSettings": "Neizdevās atvērt GitHub lietotnes iestatījumus.",
"installKiloGitHubApp": "Instalēt Kilo GitHub lietotni",
@@ -512,17 +538,19 @@
"reviewPullRequest": "Pārskatīt izmaiņu pieprasījumu",
"headLine": "{{counts}} · jaunākais komits {{sha}}",
"entry": {
- "eyebrow": "Atver izmaiņu pieprasījumu, izmantojot URL.",
- "pastePrLink": "Ielīmēt PR saiti",
- "noRecentPrs": "Nav nesen atvērtu PR",
- "noRecentPrsDescription": "Ielīmē PR saiti augstāk, lai sāktu pārskatīšanu — nākamreiz šis PR būs redzams šeit.",
+ "eyebrow": "Atver izmaiņu pieprasījumu vai merge request, izmantojot URL",
+ "pastePrLink": "Ielīmēt izmaiņu pieprasījuma vai merge request saiti",
+ "noRecentPrs": "Nav nesenu pārskatu",
+ "noRecentPrsDescription": "Ielīmē saiti augšā, lai sāktu pārskatīšanu — nākamreiz tā būs redzama šeit.",
"couldNotLoad": "Neizdevās ielādēt.",
"removeFromRecentsTitle": "Noņemt no nesen atvērtajiem?",
- "removeFromRecentsMessage": "Šis izmaiņu pieprasījums tiks noņemts no tavu nesen atvērto pieprasījumu saraksta.",
+ "removeFromRecentsMessage": "Šī pārskatīšana tiks noņemta no nesenajiem vienumiem.",
"removeRecentAccessibility": "Noņemt {{repo}} no nesen atvērtajiem",
- "urlAccessibility": "GitHub izmaiņu pieprasījuma URL",
- "clearLink": "Notīrīt izmaiņu pieprasījuma saiti",
- "pasteLink": "Ielīmēt izmaiņu pieprasījuma saiti",
+ "urlAccessibility": "Ievadiet izmaiņu pieprasījuma vai merge request URL",
+ "urlPlaceholder": "Izmaiņu pieprasījuma vai merge request URL",
+ "openAccessibility": "Atvērt izmaiņu pieprasījumu vai merge request",
+ "clearLink": "Notīrīt saiti",
+ "pasteLink": "Ielīmēt izmaiņu pieprasījuma vai merge request saiti",
"open": "Atvērt"
},
"checks": {
@@ -571,9 +599,15 @@
"connect": {
"checkFailedTitle": "Neizdevās pārbaudīt GitHub savienojumu.",
"checkFailedMessage": "Pierakstīšanās statuss būs pieejams pēc ielādes.",
+ "checkFailedTitleGitLab": "Neizdevās pārbaudīt GitLab savienojumu.",
+ "checkFailedTitleBitbucket": "Neizdevās pārbaudīt Bitbucket savienojumu.",
+ "providerCheckFailedMessage": "Savienojuma statuss būs pieejams pēc ielādes.",
"reconnectTitle": "Atkārtoti savienot GitHub",
"reconnectDescription": "Tavam GitHub savienojumam ir atsaukta piekļuve. Izveido savienojumu no jauna, lai turpinātu pārskatīt izmaiņu pieprasījumus mobilajā ierīcē.",
- "description": "Pievieno savu GitHub kontu, lai pārskatītu izmaiņu pieprasījumus mobilajā ierīcē."
+ "description": "Pievieno savu GitHub kontu, lai pārskatītu izmaiņu pieprasījumus mobilajā ierīcē.",
+ "gitlabDescription": "Pievieno savu GitLab kontu, lai pārskatītu merge requests mobilajā ierīcē.",
+ "bitbucketDescription": "Pievieno Bitbucket šai organizācijai, lai pārskatītu izmaiņu pieprasījumus mobilajā ierīcē.",
+ "bitbucketOrgOnlyDescription": "Profilā izvēlies organizāciju, lai pārskatītu tās Bitbucket izmaiņu pieprasījumus."
},
"screen": {
"title": "#{{number}}",
@@ -596,7 +630,10 @@
},
"reconnectNotice": {
"title": "GitHub savienojuma derīguma termiņš ir beidzies.",
- "message": "Tavs GitHub savienojums vairs nav derīgs. Pārbaudi savienojumu vēlreiz — ja vajadzēs, lietotne aicinās izveidot savienojumu no jauna."
+ "message": "Tavs GitHub savienojums vairs nav derīgs. Pārbaudi savienojumu vēlreiz — ja vajadzēs, lietotne aicinās izveidot savienojumu no jauna.",
+ "gitlabTitle": "GitLab savienojuma derīguma termiņš ir beidzies.",
+ "bitbucketTitle": "Bitbucket savienojuma derīguma termiņš ir beidzies.",
+ "providerMessage": "Tavs {{provider}} savienojums vairs nav derīgs. Pārbaudi savienojumu vēlreiz — ja vajadzēs, lietotne aicinās izveidot savienojumu no jauna."
},
"eventChips": {
"comment": "Komentēt",
@@ -650,6 +687,21 @@
"files": "Faili",
"discussion": "Diskusija"
},
+ "terms": {
+ "pullRequest": "Izmaiņu pieprasījums",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Kopīgot merge request",
+ "viewOnProvider": "Skatīt {{provider}}",
+ "mergeRequestUnavailable": "Merge request nav pieejams",
+ "unavailableDescription": "Iespējams, tas ir dzēsts, vai arī tev nav tam pieejas.",
+ "accessDeniedMergeRequest": "Tev nav atļaujas skatīt šo merge request.",
+ "couldNotLoadMergeRequest": "Neizdevās ielādēt merge request.",
+ "discussionAccessDenied": "Tev nav atļaujas skatīt šī merge request diskusiju.",
+ "discussionUnavailableMessage": "Iespējams, šis merge request ir noņemts.",
+ "noDiscussionDescription": "Šajā merge request nav pārskatīšanas pavedienu vai diskusijas komentāru.",
+ "noFilesChangedDescription": "Šajā merge request nav failu izmaiņu."
+ },
"fileStatus": {
"modified": "Mainīts",
"renamed": "Pārdēvēts",
@@ -666,7 +718,7 @@
"emptyLine": "(tukšs)"
},
"linkPasteClipboardEmpty": "Starpliktuve ir tukša.",
- "linkPasteNotAPullRequest": "Tā nav GitHub izmaiņu pieprasījuma saite.",
+ "linkPasteNotAPullRequest": "Šī nav izmaiņu pieprasījuma vai merge request saite",
"announce": {
"commentPosted": "Komentārs publicēts",
"reviewSubmitted": "Vērtējums iesniegts",
@@ -675,6 +727,7 @@
"mutationError": {
"commentNotPosted": "Šo komentāru nevar publicēt. Atlasītā rinda, iespējams, ir mainījusies, vai PR ir atjaunināts.",
"reviewNotSubmitted": "Šo vērtējumu pašreizējā veidā nevar iesniegt. Iespējams, PR ir mainījies vai arī tu mēģini vērtēt savu izmaiņu pieprasījumu.",
+ "reviewNotSubmittedTerm": "Šo vērtējumu pašreizējā veidā nevar iesniegt. Iespējams, {{term}} ir mainījies, vai arī tu nevar vērtēt savu {{term}}.",
"couldNotPostComment": "Neizdevās publicēt komentāru.",
"couldNotSubmitReview": "Neizdevās iesniegt vērtējumu. Pārbaudi savienojumu un mēģini vēlreiz."
},
@@ -682,6 +735,7 @@
"couldNotReply": "Neizdevās atbildēt.",
"couldNotCompleteAction": "Neizdevās pabeigt šo darbību.",
"mergeResultDefaultError": "GitHub nepabeidza apvienošanu.",
+ "mergeResultNotCompleted": "{{term}} netika apvienots. Pārbaudi tā statusu un mēģini vēlreiz.",
"ambiguous": "Neizdevās apstiprināt rezultātu — pirms atkārtota mēģinājuma pārbaudi PR.",
"persistenceFailed": "Neizdevās reģistrēt šo darbību. Mēģini vēlreiz vēlāk.",
"forbidden": "Šī darbība nav atļauta."
@@ -2004,11 +2058,31 @@
"retryConnection": "Izveidot savienojumu vēlreiz"
},
"newSession": {
+ "recentlyUsed": "Nesen lietotie",
+ "couldNotLoadGithubRepositories": "Neizdevās ielādēt GitHub repozitorijus.",
+ "couldNotLoadGitlabRepositories": "Neizdevās ielādēt GitLab repozitorijus.",
+ "couldNotLoadBitbucketRepositories": "Neizdevās ielādēt Bitbucket repozitorijus.",
"connectGithubDescription": "Pievieno GitHub kontu pārlūkā, pēc tam atgriezies šeit, lai izvēlētos repozitoriju.",
+ "connectGitlabDescription": "Pievieno GitLab kontu pārlūkā, pēc tam atgriezies šeit, lai izvēlētos repozitoriju.",
+ "connectBitbucketDescription": "Pievieno Bitbucket kontu pārlūkā, pēc tam atgriezies šeit, lai izvēlētos repozitoriju.",
"openGithub": "Atvērt GitHub",
+ "openGitlab": "Atvērt GitLab",
+ "openBitbucket": "Atvērt Bitbucket",
"refreshRepositories": "Atsvaidzināt repozitorijus",
"githubConnected": "GitHub konts pievienots",
+ "gitlabConnected": "GitLab konts pievienots",
"noRepositoriesVisible": "Nav redzamu repozitoriju. Pārbaudi Kilo GitHub lietotnes piekļuvi repozitorijiem, pēc tam atsvaidzini sarakstu.",
+ "noRepositoriesVisibleGitlab": "Nav redzamu repozitoriju. Pārbaudi piekļuvi GitLab repozitorijiem, pēc tam atsvaidzini sarakstu.",
+ "noRepositoriesVisibleBitbucket": "Nav redzamu repozitoriju. Pārbaudi piekļuvi Bitbucket repozitorijiem, pēc tam atsvaidzini sarakstu.",
+ "bitbucketOrganizationsOnly": "Bitbucket ir pieejams tikai organizācijām.",
+ "branchPickerTitle": "Atlasīt atzaru",
+ "branchDefault": "Noklusējuma",
+ "branchAccessibility": "Atzars: {{label}}",
+ "branchLoading": "Notiek atzaru ielāde",
+ "branchLoadError": "Neizdevās ielādēt atzarus",
+ "branchUnavailable": "Šim repozitorijam atzari nav pieejami. Pārbaudi savas tiesības pie pakalpojumu sniedzēja un izvēlies citu repozitoriju.",
+ "branchEmpty": "Nav pieejamu atzaru",
+ "branchPlaceholder": "Izvēlēties atzaru",
"runOnWithTarget": "Izpildes vide: {{target}}",
"environment": "Vide",
"couldNotLoadEnvironment": "Neizdevās ielādēt tavu vidi.",
@@ -2029,24 +2103,13 @@
"couldNotRefreshRepositories": "Neizdevās atsvaidzināt repozitorijus. Lūdzu, mēģini vēlreiz.",
"discardDraftTitle": "Atmest melnrakstu?",
"discardDraftMessage": "Tava uzvedne tiks dzēsta.",
+ "discardWithUploadsMessage": "Tava uzvedne un augšupielādētie faili, kas nav pievienoti nosūtītiem ziņojumiem, tiks dzēsti.",
"discardFailed": "Neizdevās atmest melnrakstu. Lūdzu, mēģini vēlreiz.",
"remoteHint": "Palaid `kilo remote` savā datorā vai `/remote` aktīvā CLI sesijā, lai vadītu lokālu kilo procesu.",
- "connectBitbucketDescription": "Pievieno Bitbucket kontu pārlūkā, pēc tam atgriezies šeit, lai izvēlētos repozitoriju.",
- "connectGitlabDescription": "Pievieno GitLab kontu pārlūkā, pēc tam atgriezies šeit, lai izvēlētos repozitoriju.",
- "couldNotLoadBitbucketRepositories": "Neizdevās ielādēt Bitbucket repozitorijus.",
- "couldNotLoadGithubRepositories": "Neizdevās ielādēt GitHub repozitorijus.",
- "couldNotLoadGitlabRepositories": "Neizdevās ielādēt GitLab repozitorijus.",
- "gitlabConnected": "GitLab konts pievienots",
- "noRepositoriesVisibleBitbucket": "Nav redzamu repozitoriju. Pārbaudi piekļuvi Bitbucket repozitorijiem, pēc tam atsvaidzini sarakstu.",
- "noRepositoriesVisibleGitlab": "Nav redzamu repozitoriju. Pārbaudi piekļuvi GitLab repozitorijiem, pēc tam atsvaidzini sarakstu.",
- "openBitbucket": "Atvērt Bitbucket",
- "openGitlab": "Atvērt GitLab",
- "recentlyUsed": "Nesen lietotie",
"continueFrom": "Tiek turpināta sesija: {{title}}.",
"importingSession": "Importē sesiju…",
"cliCannotContinue": "Šis CLI nevar turpināt sesiju. Izvēlies Cloud Agent vai citu CLI.",
- "importFailed": "Neizdevās importēt šo sesiju.",
- "discardWithUploadsMessage": "Tava uzvedne un augšupielādētie faili, kas nav pievienoti nosūtītiem ziņojumiem, tiks dzēsti."
+ "importFailed": "Neizdevās importēt šo sesiju."
},
"partRenderer": {
"updatedFileCount_one": "Atjaunināts {{displayCount}} fails.",
diff --git a/apps/mobile/src/i18n/locales/mg.json b/apps/mobile/src/i18n/locales/mg.json
index 12b9fbab8b..16738cfba4 100644
--- a/apps/mobile/src/i18n/locales/mg.json
+++ b/apps/mobile/src/i18n/locales/mg.json
@@ -36,6 +36,7 @@
"cost": "Sarany",
"discard": "Ario",
"findings": "Olana hita",
+ "mergeRequest": "fangatahana fampiraisana",
"notConnected": "Tsy mifandray",
"notifications": "Fampandrenesana",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Andalana fahasamihafana banga"
},
"connectionExpired": "Lany daty ny fifandraisana amin'ny GitHub.",
+ "capabilities": {
+ "banner": {
+ "title": "Tsy azo amin'ity mpanome tolotra ity",
+ "accessibility": "Tsy azo amin'ity mpanome tolotra ity: {{reason}}"
+ }
+ },
"merge": {
"merge": "Fampiraisana",
"mergeNow": "Ampiraiso izao",
"mergePullRequest": "Fampiraisana ny fangatahana",
+ "mergeTermTitle": "Fampiraisana ny {{term}}",
"enableAutoMerge": "Alefaso ny fampiraisana mandeha ho azy",
"disableAutoMerge": "Atsaharo ny fampiraisana mandeha ho azy",
"autoMergeOn": "Miasa ny fampiraisana mandeha ho azy",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Fafao ny sampana aorian'ny fampiraisana",
"noEnabledMethods": "Tsy misy fomba fampiraisana navela ao amin'ity tahirin-kaody ity. Angataho ny mpitantana hamela ny fampiraisana tsotra, ny famintinana na ny famindrana fototra.",
"confirmTitle": "Hampiraisina ve ny fangatahana fampiraisana?",
+ "confirmTitleTerm": "Hampiraisina ve ny {{term}}?",
"confirmMessage": "Hampidirina ao amin'ny sampana fototra ny fanovana nataonao.",
"enableAutoMergeConfirmTitle": "Havelanao ve ny fampiraisana mandeha ho azy?",
"enableAutoMergeConfirmMessage": "Hampiraisin'ny GitHub ho azy ity fangatahana fampiraisana ity rehefa mahomby avokoa ny fanamarinana takina.",
+ "enableAutoMergeConfirmMessageTerm": "Hampiraisina ho azy ny {{term}} rehefa nahomby ny pipeline-ny.",
+ "enableAutoMergeDescriptionTerm": "Hampiraisinan'i GitLab ho azy ny {{term}} ity rehefa nahomby ny pipeline-ny.",
"forbidden": "Tsy manana alalana hampiray ity fangatahana fampiraisana ity ianao.",
"cannotMerge": "Tsy azo ampiraisina amin'izao toetrany izao ity fangatahana fampiraisana ity.",
"couldNotMerge": "Tsy vita ny fampiraisana ny fangatahana.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Efa nampiraisina",
- "closed": "Nakatona ity fangatahana fampiraisana ity"
+ "closed": "Nakatona ity fangatahana fampiraisana ity",
+ "closedMergeRequest": "Nakatona ity fangatahana fampiraisana ity"
},
"partialSuccessBanner": {
"body": "Tsy voafafa ny sampana: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Mbola tsy azo ampiraisina ity fangatahana fampiraisana ity",
"notMergeableDetail": "Izao ny sata momba ny fampiraisana nambaran'ny GitHub: {{state}}."
},
+ "restrictions": {
+ "title": "Fepetra momba ny fampiraisana",
+ "approvalsRequired_one": "Mila fankatoavana {{displayCount}}",
+ "approvalsRequired_other": "Mila fankatoavana {{displayCount}}",
+ "pipelineMustSucceed": "Tsy maintsy nahomby ny pipeline alohan'ny fampiraisana."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Mirava ny pipeline amin'ny firaketana fanovana farany.",
+ "pendingPipeline": "Mbola mandeha ny pipeline amin'ny firaketana fanovana farany.",
+ "permission": "Tsy manana alalana hampiray ity {{term}} ity ianao.",
+ "draft": "Mariho ho vonona hodinihina ny {{term}} alohan'ny hampiraisana azy."
+ },
"methodLabels": {
"merge": "Mamoròna firaketana fampiraisana",
"squash": "Fintino ary ampiraiso",
@@ -448,6 +472,7 @@
"acceptTerms": "Ekeo",
"replyBadRequest": "Tsy azo avoaka ity valiny ity. Mety niova ny loha-dresaka.",
"replyForbidden": "Tsy manana alalana hamaly ity fangatahana fampiraisana ity ianao.",
+ "replyForbiddenTerm": "Tsy manana alalana hamaly ity {{term}} ity ianao.",
"moderation": {
"reportContent": {
"terminal": "Tsy azo taterina ity hevitra ity.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Diniho ny fangatahana fampiraisana",
"headLine": "{{counts}} · firaketana farany {{sha}}",
"entry": {
- "eyebrow": "Sokafy amin'ny URL ny fangatahana fampiraisana.",
- "pastePrLink": "Apetaho ny rohy PR",
- "noRecentPrs": "Tsy misy PR nosokafana vao haingana",
- "noRecentPrsDescription": "Apetaho etsy ambony ny rohy PR hanombohana fandinihana — hiseho eto izy amin'ny manaraka.",
+ "eyebrow": "Sokafy ny fangatahana fampiraisana amin'ny URL",
+ "pastePrLink": "Apetaho ny rohy fangatahana fampiraisana",
+ "noRecentPrs": "Tsy misy fandinihana vao haingana",
+ "noRecentPrsDescription": "Apetaho ny rohy ambony mba hanombohana fandinihana — hita eto izy amin'ny manaraka.",
"couldNotLoad": "Tsy tafiditra ny angona.",
"removeFromRecentsTitle": "Hesorina amin'ny lisitry ny nosokafana farany ve?",
- "removeFromRecentsMessage": "Hesorina amin'ny lisitry ny nosokafanao farany ity fangatahana fampiraisana ity.",
+ "removeFromRecentsMessage": "Ho esorina ao amin'ny lisitry ny vao haingana ity fandinihana ity.",
"removeRecentAccessibility": "Esory amin'ny lisitry ny nosokafana farany ny {{repo}}",
- "urlAccessibility": "URL an'ny fangatahana fampiraisana ao amin'ny GitHub",
- "clearLink": "Fafao ny rohin'ny fangatahana fampiraisana",
- "pasteLink": "Apetaho ny rohin'ny fangatahana fampiraisana",
+ "urlAccessibility": "Ampidiro ny URL ny fangatahana fampiraisana",
+ "urlPlaceholder": "URL ny fangatahana fampiraisana",
+ "openAccessibility": "Sokafy ny fangatahana fampiraisana",
+ "clearLink": "Hamaro ny rohy",
+ "pasteLink": "Apetaho ny rohy fangatahana fampiraisana",
"open": "Misokatra"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Tsy voamarina ny fifandraisana amin'ny GitHub.",
"checkFailedMessage": "Tsy fantatra ny satan'ny fidirana raha tsy tafiditra ity angona ity.",
+ "checkFailedTitleGitLab": "Tsy voamarina ny fifandraisana amin'ny GitLab.",
+ "checkFailedTitleBitbucket": "Tsy voamarina ny fifandraisana amin'ny Bitbucket.",
+ "providerCheckFailedMessage": "Tsy azo ny satan'ny fifandraisana raha tsy tafiditra izao.",
"reconnectTitle": "Fampifandraisana indray amin'ny GitHub",
"reconnectDescription": "Nofoanana ny fifandraisanao amin'ny GitHub. Ampifandraiso indray mba hanohizana ny fandinihana fangatahana fampiraisana amin'ny finday.",
- "description": "Ampifandraiso ny kaontinao GitHub mba handinihana fangatahana fampiraisana amin'ny finday."
+ "description": "Ampifandraiso ny kaontinao GitHub mba handinihana fangatahana fampiraisana amin'ny finday.",
+ "gitlabDescription": "Ampifandraiso ny kaonty GitLab-nao mba hijerena ny fangatahana fampiraisana amin'ny finday.",
+ "bitbucketDescription": "Ampifandraiso amin'ity fikambanana ity ny Bitbucket mba hijerena ny fangatahana fampiraisana amin'ny finday.",
+ "bitbucketOrgOnlyDescription": "Safidio fikambanana ao amin'ny mombamomba-nao mba hijerena ny fangatahana fampiraisana Bitbucket-ny."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Lany daty ny fifandraisana amin'ny GitHub.",
- "message": "Tsy manan-kery intsony ny fifandraisanao amin'ny GitHub. Hamarino indray izany — hasaina hampifandray indray ianao raha ilaina."
+ "message": "Tsy manan-kery intsony ny fifandraisanao amin'ny GitHub. Hamarino indray izany — hasaina hampifandray indray ianao raha ilaina.",
+ "gitlabTitle": "Lany daty ny fifandraisana amin'ny GitLab.",
+ "bitbucketTitle": "Lany daty ny fifandraisana amin'ny Bitbucket.",
+ "providerMessage": "Tsy manan-kery intsony ny fifandraisanao amin'ny {{provider}}. Hamarino indray izany — hasaina hampifandray indray ianao raha ilaina."
},
"eventChips": {
"comment": "Fanehoan-kevitra",
@@ -643,6 +679,21 @@
"files": "Rakitra",
"discussion": "Resaka"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Fangatahana fampiraisana",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Zarao ny fangatahana fampiraisana",
+ "viewOnProvider": "Jereo amin'ny {{provider}}",
+ "mergeRequestUnavailable": "Tsy azo sokafana ny fangatahana fampiraisana",
+ "unavailableDescription": "Mety efa voafafa izany, na mety tsy manana alalana hiditra ianao.",
+ "accessDeniedMergeRequest": "Tsy manana alalana hijery ity fangatahana fampiraisana ity ianao.",
+ "couldNotLoadMergeRequest": "Tsy tafiditra ny fangatahana fampiraisana.",
+ "discussionAccessDenied": "Tsy manana alalana hijery ny resaka momba ity fangatahana fampiraisana ity ianao.",
+ "discussionUnavailableMessage": "Mety efa nesorina ity fangatahana fampiraisana ity.",
+ "noDiscussionDescription": "Tsy mbola misy loha-dresaka fandinihana na hevitra ao amin'ny resaka momba ity fangatahana fampiraisana ity.",
+ "noFilesChangedDescription": "Tsy misy rakitra novaina ao amin'ity fangatahana fampiraisana ity."
+ },
"fileStatus": {
"modified": "Novaina",
"renamed": "Novana anarana",
@@ -659,7 +710,7 @@
"emptyLine": "(foana)"
},
"linkPasteClipboardEmpty": "Foana ny fitahirizana vonjimaika.",
- "linkPasteNotAPullRequest": "Tsy rohin'ny fangatahana fampiraisana ao amin'ny GitHub io.",
+ "linkPasteNotAPullRequest": "Tsy rohy fangatahana fampiraisana izany",
"announce": {
"commentPosted": "Navoaka ny hevitra",
"reviewSubmitted": "Nalefa ny fandinihana",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Tsy azo avoaka ity hevitra ity. Mety niova ny andalana voafidy, na nohavaozina ny PR.",
"reviewNotSubmitted": "Tsy azo alefa amin'izao endriny izao ity fandinihana ity. Mety niova ny PR, na tsy azonao atao ny mandinika ny fangatahana fampiraisana nataonao.",
+ "reviewNotSubmittedTerm": "Tsy azo alefa toy izao ny fandinihana. Mety io {{term}} io, na tsy afaka mamandrika ny {{term}}-anao manokana ianao.",
"couldNotPostComment": "Tsy navoaka ny hevitra.",
"couldNotSubmitReview": "Tsy nalefa ny fandinihana. Jereo ny fifandraisanao ary andramo indray."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Tsy tafalefa ny valiny.",
"couldNotCompleteAction": "Tsy vita ity hetsika ity.",
"mergeResultDefaultError": "Tsy vitan'ny GitHub ny fampiraisana.",
+ "mergeResultNotCompleted": "Tsy nampidirina ny {{term}}. Jereo ny toerany ary andramo indray.",
"ambiguous": "Tsy voamarina ny vokatra — jereo ny PR alohan'ny hanandramana indray.",
"persistenceFailed": "Tsy vitanay ny nandrakitra ity hetsika ity. Andramo indray azafady any aoriana.",
"forbidden": "Voarara izany."
@@ -1988,11 +2041,31 @@
"retryConnection": "Andramo mifandray indray"
},
"newSession": {
+ "recentlyUsed": "Nampiasaina vao haingana",
+ "couldNotLoadGithubRepositories": "Tsy voaray ny tahirin-kaody ao amin'ny GitHub.",
+ "couldNotLoadGitlabRepositories": "Tsy voaray ny tahirin-kaody ao amin'ny GitLab.",
+ "couldNotLoadBitbucketRepositories": "Tsy voaray ny tahirin-kaody ao amin'ny Bitbucket.",
"connectGithubDescription": "Ampifandraiso ny GitHub ao amin'ny mpitety tranonkalanao, dia miverena eto hisafidy tahirin-kaody.",
+ "connectGitlabDescription": "Ampifandraiso ny GitLab ao amin'ny mpitety tranonkalanao, dia miverena eto hisafidy tahirin-kaody.",
+ "connectBitbucketDescription": "Ampifandraiso ny Bitbucket ao amin'ny mpitety tranonkalanao, dia miverena eto hisafidy tahirin-kaody.",
"openGithub": "Sokafy ny GitHub",
+ "openGitlab": "Sokafy ny GitLab",
+ "openBitbucket": "Sokafy ny Bitbucket",
"refreshRepositories": "Havaozy ny lisitry ny tahirin-kaody",
"githubConnected": "Voampifandraisina ny GitHub",
+ "gitlabConnected": "Voampifandraisina ny GitLab",
"noRepositoriesVisible": "Tsy misy tahirin-kaody hita. Hamarino ny alalan'ny rindranasa Kilo ao amin'ny GitHub hiditra amin'ny tahirin-kaody, dia havaozy ny lisitra.",
+ "noRepositoriesVisibleGitlab": "Tsy misy tahirin-kaody hita. Hamarino ny alalana hiditra amin'ny tahirin-kaody ao amin'ny GitLab, dia havaozy ny lisitra.",
+ "noRepositoriesVisibleBitbucket": "Tsy misy tahirin-kaody hita. Hamarino ny alalana hiditra amin'ny tahirin-kaody ao amin'ny Bitbucket, dia havaozy ny lisitra.",
+ "bitbucketOrganizationsOnly": "Ho an'ny fikambanana ihany ny Bitbucket.",
+ "branchPickerTitle": "Safidio ny sampana",
+ "branchDefault": "Default",
+ "branchAccessibility": "Sampana: {{label}}",
+ "branchLoading": "Mampiditra ny sampana",
+ "branchLoadError": "Tsy tafiditra ny sampana",
+ "branchUnavailable": "Tsy azo ny sampana amin'ity tahirin-kaody ity. Hamarino ny alalana ananao amin'ny mpanome tolotra, dia safidio tahirin-kaody hafa.",
+ "branchEmpty": "Tsy misy sampana azo",
+ "branchPlaceholder": "Safidio sampana iray",
"runOnWithTarget": "Ampandeho amin'ny: {{target}}",
"environment": "Tontolo fiasana",
"couldNotLoadEnvironment": "Tsy voaray ny tontolo fiasanao.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Tsy nahomby ny fanavaozana ny lisitry ny tahirin-kaody. Andramo indray azafady.",
"discardDraftTitle": "Hariana ve ny volavola?",
"discardDraftMessage": "Ho very ny toromarikanao.",
+ "discardWithUploadsMessage": "Hofafana ny toromarikanao sy ny rakitra nampakarina nefa mbola tsy nampiarahina tamin'ny hafatra nalefa.",
"discardFailed": "Tsy nahomby ny fanariana ny volavola. Andramo indray azafady.",
"remoteHint": "Alefaso ny `kilo remote` amin'ny solosainao, na ny `/remote` ao amin'ny fotoam-piasana CLI mandeha, mba hifehezana ny kilo mandeha eo an-toerana.",
- "connectBitbucketDescription": "Ampifandraiso ny Bitbucket ao amin'ny mpitety tranonkalanao, dia miverena eto hisafidy tahirin-kaody.",
- "connectGitlabDescription": "Ampifandraiso ny GitLab ao amin'ny mpitety tranonkalanao, dia miverena eto hisafidy tahirin-kaody.",
- "couldNotLoadBitbucketRepositories": "Tsy voaray ny tahirin-kaody ao amin'ny Bitbucket.",
- "couldNotLoadGithubRepositories": "Tsy voaray ny tahirin-kaody ao amin'ny GitHub.",
- "couldNotLoadGitlabRepositories": "Tsy voaray ny tahirin-kaody ao amin'ny GitLab.",
- "gitlabConnected": "Voampifandraisina ny GitLab",
- "noRepositoriesVisibleBitbucket": "Tsy misy tahirin-kaody hita. Hamarino ny alalana hiditra amin'ny tahirin-kaody ao amin'ny Bitbucket, dia havaozy ny lisitra.",
- "noRepositoriesVisibleGitlab": "Tsy misy tahirin-kaody hita. Hamarino ny alalana hiditra amin'ny tahirin-kaody ao amin'ny GitLab, dia havaozy ny lisitra.",
- "openBitbucket": "Sokafy ny Bitbucket",
- "openGitlab": "Sokafy ny GitLab",
- "recentlyUsed": "Nampiasaina vao haingana",
"continueFrom": "Mitohy ny {{title}}.",
"importingSession": "Manafatra fotoam-piasana",
"cliCannotContinue": "Tsy afaka manohy fotoam-piasana ity CLI ity. Safidio ny Cloud Agent na CLI hafa.",
- "importFailed": "Tsy nahomby ny fanafarana ity fotoam-piasana ity.",
- "discardWithUploadsMessage": "Hofafana ny toromarikanao sy ny rakitra nampakarina nefa mbola tsy nampiarahina tamin'ny hafatra nalefa."
+ "importFailed": "Tsy nahomby ny fanafarana ity fotoam-piasana ity."
},
"partRenderer": {
"updatedFileCount_one": "Nohavaozina ny rakitra {{displayCount}}.",
diff --git a/apps/mobile/src/i18n/locales/mi.json b/apps/mobile/src/i18n/locales/mi.json
index 5a2b99de01..705c23fb84 100644
--- a/apps/mobile/src/i18n/locales/mi.json
+++ b/apps/mobile/src/i18n/locales/mi.json
@@ -36,6 +36,7 @@
"cost": "Utu",
"discard": "Whakarere",
"findings": "Ngā kitenga",
+ "mergeRequest": "tono whakakotahi",
"notConnected": "Kāore anō kia hono",
"notifications": "Ngā whakamōhiotanga",
"pullRequest": "tono kume",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Rārangi rerekētanga pātea"
},
"connectionExpired": "Kua pau te wā o te hononga GitHub.",
+ "capabilities": {
+ "banner": {
+ "title": "Kāore e wātea ana i tēnei kaiwhakarato",
+ "accessibility": "Kāore e wātea ana i tēnei kaiwhakarato: {{reason}}"
+ }
+ },
"merge": {
"merge": "Whakakotahitanga",
"mergeNow": "Whakakotahitia ināianei",
"mergePullRequest": "Whakakotahi tono kume",
+ "mergeTermTitle": "Whakakotahi {{term}}",
"enableAutoMerge": "Whakahohehia te whakakotahi aunoa",
"disableAutoMerge": "Whakawetohia te whakakotahi aunoa",
"autoMergeOn": "Kua whakahohea te whakakotahi aunoa",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Mukua te peka i muri i te whakakotahitanga",
"noEnabledMethods": "Kāore he tikanga whakakotahi kua whakahohea mō tēnei pātaka waehere. Tonoa tētahi kaiwhakahaere o te pātaka waehere kia whakahohe i te whakakotahi, te kōpeke, te whakapūtake anō rānei.",
"confirmTitle": "Whakakotahitia te tono kume?",
+ "confirmTitleTerm": "Whakakotahitia te {{term}}?",
"confirmMessage": "Ka whakakotahitia ō huringa ki te peka pūtake.",
"enableAutoMergeConfirmTitle": "Whakahohehia te whakakotahi aunoa?",
"enableAutoMergeConfirmMessage": "Ka whakakotahi aunoa a GitHub i tēnei tono kume ina tutuki ngā arowhai katoa e hiahiatia ana.",
+ "enableAutoMergeConfirmMessageTerm": "Ka whakakotahi aunoa te {{term}} ina angitu tōna pipeline.",
+ "enableAutoMergeDescriptionTerm": "Ka whakakotahi aunoa a GitLab i tēnei {{term}} ina angitu tōna pipeline.",
"forbidden": "Kāore koe e whakaaetia kia whakakotahi i tēnei tono kume.",
"cannotMerge": "Kāore e taea te whakakotahi i tēnei tono kume i tōna āhua o nāianei.",
"couldNotMerge": "Kāore i taea te whakakotahi i te tono kume.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Kua whakakotahitia kē",
- "closed": "Kua katia tēnei tono kume"
+ "closed": "Kua katia tēnei tono kume",
+ "closedMergeRequest": "Kua katia tēnei tono whakakotahi"
},
"partialSuccessBanner": {
"body": "Kāore i taea te muku i te peka: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Kāore anō kia taea te whakakotahi i tēnei tono kume",
"notMergeableDetail": "E ai ki tā GitHub pūrongo, ko {{state}} te tūnga mō te whakakotahitanga."
},
+ "restrictions": {
+ "title": "Here whakakotahi",
+ "approvalsRequired_one": "E hiahiatia ana he whakaaetanga {{displayCount}}",
+ "approvalsRequired_other": "E hiahiatia ana ngā whakaaetanga {{displayCount}}",
+ "pipelineMustSucceed": "Me angitu te pipeline i mua i te whakakotahitanga."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Kei te rahua te pipeline i te whakapūmautanga hou rawa.",
+ "pendingPipeline": "Kei te rere tonu te pipeline i te whakapūmautanga hou rawa.",
+ "permission": "Kāore koe e whakaaetia kia whakakotahi i tēnei {{term}}.",
+ "draft": "Tohua te {{term}} kua rite mō te arotake i mua i te whakakotahitanga."
+ },
"methodLabels": {
"merge": "Waihangatia he tāpaetanga whakakotahi",
"squash": "Kōpeketia, ka whakakotahi",
@@ -448,6 +472,7 @@
"acceptTerms": "Whakaae",
"replyBadRequest": "Kāore e taea te tuku i tēnei whakautu. Kua rerekē pea te aho kōrero.",
"replyForbidden": "Kāore koe e whakaaetia kia whakautu ki tēnei tono kume.",
+ "replyForbiddenTerm": "Kāore koe e whakaaetia kia whakautu ki tēnei {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Kāore e taea te pūrongo i tēnei kōrero.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Arotakehia te tono kume",
"headLine": "{{counts}} · tāpaetanga hou rawa {{sha}}",
"entry": {
- "eyebrow": "Whakatuwheratia he tono kume mā tōna URL.",
- "pastePrLink": "Whakapirihia he hono PR",
- "noRecentPrs": "Kāore he PR o nā tata nei",
- "noRecentPrsDescription": "Whakapirihia he hono PR ki runga hei tīmata i te arotake — ka kitea i konei ā muri ake.",
+ "eyebrow": "Whakatuwheratia he tono kume, he tono whakakotahi rānei mā te URL",
+ "pastePrLink": "Whakapirihia he hono tono kume, tono whakakotahi rānei",
+ "noRecentPrs": "Kāore he arotake o nā tata nei",
+ "noRecentPrsDescription": "Whakapirihia he hono ki runga hei tīmata i te arotake — ka kitea i konei ā muri ake.",
"couldNotLoad": "Kāore i taea te uta.",
"removeFromRecentsTitle": "Tangohia i te rārangi o nā tata nei?",
- "removeFromRecentsMessage": "Ka tangohia tēnei tono kume i tō rārangi o nā tata nei.",
+ "removeFromRecentsMessage": "Ka tangohia tēnei arotake i tō rārangi o nā tata nei.",
"removeRecentAccessibility": "Tangohia {{repo}} i te rārangi o nā tata nei",
- "urlAccessibility": "URL mō te tono kume GitHub",
- "clearLink": "Ūkuia te hono tono kume",
- "pasteLink": "Whakapirihia te hono tono kume",
+ "urlAccessibility": "Tuhia he URL tono kume, tono whakakotahi rānei",
+ "urlPlaceholder": "URL tono kume, tono whakakotahi rānei",
+ "openAccessibility": "Whakatuwhera i te tono kume, i te tono whakakotahi rānei",
+ "clearLink": "Ūkuia te hono",
+ "pasteLink": "Whakapirihia te hono tono kume, tono whakakotahi rānei",
"open": "Tuwhera"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Kāore i taea te tirotiro i te hononga GitHub.",
"checkFailedMessage": "Kāore e wātea te tūnga takiuru kia utaina rā anō tēnei.",
+ "checkFailedTitleGitLab": "Kāore i taea te tirotiro i te hononga GitLab.",
+ "checkFailedTitleBitbucket": "Kāore i taea te tirotiro i te hononga Bitbucket.",
+ "providerCheckFailedMessage": "Kāore e wātea te tūnga hononga kia uta ra ano.",
"reconnectTitle": "Hono anō ki GitHub",
"reconnectDescription": "Kua whakakorea tō hononga GitHub. Hono anō kia arotake tonu ai koe i ngā tono kume i tō waea pūkoro.",
- "description": "Honoa tō pūkete GitHub hei arotake i ngā tono kume i tō waea pūkoro."
+ "description": "Honoa tō pūkete GitHub hei arotake i ngā tono kume i tō waea pūkoro.",
+ "gitlabDescription": "Honoa tō pūkete GitLab kia arotakehia ngā tono whakakotahi i te waea pūkoro.",
+ "bitbucketDescription": "Honoa a Bitbucket ki tēnei whakahaere kia arotakehia ngā tono kume i te waea pūkoro.",
+ "bitbucketOrgOnlyDescription": "Kōwhiria he whakahaere i tō pūkoro kia arotakehia ōna tono kume Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Kua pau te wā o te hononga GitHub.",
- "message": "Kua kore tō hononga GitHub e whai mana. Tirohia anō tō hononga — ka tonoa koe kia hono anō mēnā e hiahiatia ana."
+ "message": "Kua kore tō hononga GitHub e whai mana. Tirohia anō tō hononga — ka tonoa koe kia hono anō mēnā e hiahiatia ana.",
+ "gitlabTitle": "Kua pau te wā o te hononga GitLab.",
+ "bitbucketTitle": "Kua pau te wā o te hononga Bitbucket.",
+ "providerMessage": "Kua kore tō hononga {{provider}} e whai mana. Tirohia anō tō hononga — ka tonoa koe kia hono anō mēnā e hiahiatia ana."
},
"eventChips": {
"comment": "Kōrero",
@@ -643,6 +679,21 @@
"files": "Kōnae",
"discussion": "Kōrerorero"
},
+ "terms": {
+ "pullRequest": "Tono kume",
+ "mergeRequest": "Tono whakakotahi",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Tohaina te tono whakakotahi",
+ "viewOnProvider": "Tirohia i {{provider}}",
+ "mergeRequestUnavailable": "Kāore i te wātea te tono whakakotahi",
+ "unavailableDescription": "Tērā pea kua mukua, tērā pea kāore ō urunga.",
+ "accessDeniedMergeRequest": "Kāore koe e whakaaetia kia tiro i tēnei tono whakakotahi.",
+ "couldNotLoadMergeRequest": "Kāore i taea te uta i te tono whakakotahi.",
+ "discussionAccessDenied": "Kāore koe e whakaaetia kia tiro i te kōrerorero o tēnei tono whakakotahi.",
+ "discussionUnavailableMessage": "Kua tangohia pea tēnei tono whakakotahi.",
+ "noDiscussionDescription": "Kāore he aho arotake, he kōrero rānei mō tēnei tono whakakotahi.",
+ "noFilesChangedDescription": "Kāore he huringa kōnae i tēnei tono whakakotahi."
+ },
"fileStatus": {
"modified": "Kua whakarerekētia",
"renamed": "Kua whakaingoatia anō",
@@ -659,7 +710,7 @@
"emptyLine": "(pātea)"
},
"linkPasteClipboardEmpty": "Kei te pātea te papa tārua.",
- "linkPasteNotAPullRequest": "Ehara tēnei i te hono tono kume GitHub.",
+ "linkPasteNotAPullRequest": "Ehara tēnei i te hono tono kume, tono whakakotahi rānei",
"announce": {
"commentPosted": "Kua tukuna te kōrero",
"reviewSubmitted": "Kua tukuna te arotake",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Kāore e taea te tuku i tēnei kōrero. Kua rerekē pea te rārangi i kōwhiria, kua whakahoutia rānei te PR.",
"reviewNotSubmitted": "Kāore e taea te tuku i tēnei arotake i tōna āhua o nāianei. Kua rerekē pea te PR, kāore rānei koe e whakaaetia kia arotake i tō ake tono kume.",
+ "reviewNotSubmittedTerm": "Kāore e taea te tuku i tēnei arotake kia pēnei tonu. Tērā pea kua huri te {{term}}, kāore rānei e taea e koe te arotake i tō ake {{term}}.",
"couldNotPostComment": "Kāore i taea te tuku i te kōrero.",
"couldNotSubmitReview": "Kāore i taea te tuku i te arotake. Tirohia tō hononga, ka whakamātau anō."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Kāore i taea te whakautu.",
"couldNotCompleteAction": "Kāore i taea te whakaoti i tēnei mahi.",
"mergeResultDefaultError": "Kāore a GitHub i whakaoti i te whakakotahitanga.",
+ "mergeResultNotCompleted": "Kāore i whakakotahitia te {{term}}. Tirohia tōna tūnga, ka ngana anō.",
"ambiguous": "Kāore i taea te whakaū — tirohia te PR i mua i te whakamātau anō.",
"persistenceFailed": "Kāore i taea e mātou te tuhi i tēnei mahi. Whakamātau anō ā muri ake.",
"forbidden": "Kāore e whakaaetia."
@@ -1988,11 +2041,31 @@
"retryConnection": "Whakamātau ki te hono anō"
},
"newSession": {
+ "recentlyUsed": "Ngā mea i whakamahia tata nei",
+ "couldNotLoadGithubRepositories": "Kāore i taea te uta i ngā putunga waehere GitHub.",
+ "couldNotLoadGitlabRepositories": "Kāore i taea te uta i ngā putunga waehere GitLab.",
+ "couldNotLoadBitbucketRepositories": "Kāore i taea te uta i ngā putunga waehere Bitbucket.",
"connectGithubDescription": "Honohia a GitHub mā tō pūtirotiro, kātahi ka hoki mai ki konei ki te kōwhiri i tētahi putunga waehere.",
+ "connectGitlabDescription": "Honohia a GitLab mā tō pūtirotiro, kātahi ka hoki mai ki konei ki te kōwhiri i tētahi putunga waehere.",
+ "connectBitbucketDescription": "Honohia a Bitbucket mā tō pūtirotiro, kātahi ka hoki mai ki konei ki te kōwhiri i tētahi putunga waehere.",
"openGithub": "Whakatuwheratia a GitHub",
+ "openGitlab": "Whakatuwheratia a GitLab",
+ "openBitbucket": "Whakatuwheratia a Bitbucket",
"refreshRepositories": "Whakahoutia ngā putunga waehere",
"githubConnected": "Kua hono a GitHub",
+ "gitlabConnected": "Kua hono a GitLab",
"noRepositoriesVisible": "Kāore he putunga waehere e kitea ana. Tirohia ngā whakaaetanga uru ki ngā putunga waehere mō te taupānga Kilo mō GitHub, kātahi ka whakahou anō.",
+ "noRepositoriesVisibleGitlab": "Kāore he putunga waehere e kitea ana. Tirohia ngā whakaaetanga uru ki ngā putunga waehere mō GitLab, kātahi ka whakahou anō.",
+ "noRepositoriesVisibleBitbucket": "Kāore he putunga waehere e kitea ana. Tirohia ngā whakaaetanga uru ki ngā putunga waehere mō Bitbucket, kātahi ka whakahou anō.",
+ "bitbucketOrganizationsOnly": "He wātea a Bitbucket mō ngā whakahaere anake.",
+ "branchPickerTitle": "Kōwhiri peka",
+ "branchDefault": "Taunoa",
+ "branchAccessibility": "Peka: {{label}}",
+ "branchLoading": "E uta ana i ngā peka",
+ "branchLoadError": "Kāore i taea te uta i ngā peka",
+ "branchUnavailable": "Kāore ngā peka e wātea ana mō tēnei pūranga waehere. Tirohia tō urunga ki te kaiwhakarato, kātahi ka kōwhiri i tētahi atu pūranga waehere.",
+ "branchEmpty": "Kāore he peka e wātea ana",
+ "branchPlaceholder": "Kōwhiria he peka",
"runOnWithTarget": "Whakahaeretia ki: {{target}}",
"environment": "Te taiao",
"couldNotLoadEnvironment": "Kāore i taea te uta i tō taiao.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Kāore i taea te whakahou i ngā putunga waehere. Whakamātau anō.",
"discardDraftTitle": "Mukua te hukihuki?",
"discardDraftMessage": "Ka ngaro ō tohutohu.",
+ "discardWithUploadsMessage": "Ka mukua ō tohutohu me ngā kōnae kua tukuna ake kāore anō kia hono ki tētahi karere.",
"discardFailed": "Kāore i taea te muku i te hukihuki. Whakamātau anō.",
"remoteHint": "Whakahaeretia `kilo remote` ki tō rorohiko, `/remote` rānei ki tētahi wātū CLI e haere ana, hei whakahaere i tētahi tukanga kilo paetata.",
- "connectBitbucketDescription": "Honohia a Bitbucket mā tō pūtirotiro, kātahi ka hoki mai ki konei ki te kōwhiri i tētahi putunga waehere.",
- "connectGitlabDescription": "Honohia a GitLab mā tō pūtirotiro, kātahi ka hoki mai ki konei ki te kōwhiri i tētahi putunga waehere.",
- "couldNotLoadBitbucketRepositories": "Kāore i taea te uta i ngā putunga waehere Bitbucket.",
- "couldNotLoadGithubRepositories": "Kāore i taea te uta i ngā putunga waehere GitHub.",
- "couldNotLoadGitlabRepositories": "Kāore i taea te uta i ngā putunga waehere GitLab.",
- "gitlabConnected": "Kua hono a GitLab",
- "noRepositoriesVisibleBitbucket": "Kāore he putunga waehere e kitea ana. Tirohia ngā whakaaetanga uru ki ngā putunga waehere mō Bitbucket, kātahi ka whakahou anō.",
- "noRepositoriesVisibleGitlab": "Kāore he putunga waehere e kitea ana. Tirohia ngā whakaaetanga uru ki ngā putunga waehere mō GitLab, kātahi ka whakahou anō.",
- "openBitbucket": "Whakatuwheratia a Bitbucket",
- "openGitlab": "Whakatuwheratia a GitLab",
- "recentlyUsed": "Ngā mea i whakamahia tata nei",
- "cliCannotContinue": "Kāore e taea e tēnei CLI te haere tonu i tētahi wātū. Kōwhiria a Cloud Agent, tētahi atu CLI rānei.",
"continueFrom": "Kei te haere tonu te wātū {{title}}.",
- "importFailed": "Kāore i taea te kawemai i tēnei wātū.",
"importingSession": "Kei te kawemai i te wātū",
- "discardWithUploadsMessage": "Ka mukua ō tohutohu me ngā kōnae kua tukuna ake kāore anō kia hono ki tētahi karere."
+ "cliCannotContinue": "Kāore e taea e tēnei CLI te haere tonu i tētahi wātū. Kōwhiria a Cloud Agent, tētahi atu CLI rānei.",
+ "importFailed": "Kāore i taea te kawemai i tēnei wātū."
},
"partRenderer": {
"updatedFileCount_one": "Kua whakahoutia {{displayCount}} kōnae.",
diff --git a/apps/mobile/src/i18n/locales/mk.json b/apps/mobile/src/i18n/locales/mk.json
index a70da89397..03c787e455 100644
--- a/apps/mobile/src/i18n/locales/mk.json
+++ b/apps/mobile/src/i18n/locales/mk.json
@@ -36,6 +36,7 @@
"cost": "Трошок",
"discard": "Отфрли",
"findings": "Наоди",
+ "mergeRequest": "merge барање",
"notConnected": "Неповрзано",
"notifications": "Известувања",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Празен ред со разлики"
},
"connectionExpired": "Врската со GitHub истече.",
+ "capabilities": {
+ "banner": {
+ "title": "Не е достапно кај овој оператор",
+ "accessibility": "Не е достапно кај овој оператор: {{reason}}"
+ }
+ },
"merge": {
"merge": "Спојување",
"mergeNow": "Спој сега",
"mergePullRequest": "Спојување на барањето",
+ "mergeTermTitle": "Спој {{term}}",
"enableAutoMerge": "Овозможи автоматско спојување",
"disableAutoMerge": "Оневозможи автоматско спојување",
"autoMergeOn": "Автоматското спојување е вклучено",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Избриши ја гранката по спојувањето",
"noEnabledMethods": "Во ова складиште нема овозможени методи за спојување. Побарај од администратор на складиштето да овозможи спојување, обединување на комитите или пребазирање.",
"confirmTitle": "Да се спои барањето за спојување?",
+ "confirmTitleTerm": "Да се спои ли {{term}}?",
"confirmMessage": "Ова ќе ги спои твоите промени во основната гранка.",
"enableAutoMergeConfirmTitle": "Да се овозможи автоматско спојување?",
"enableAutoMergeConfirmMessage": "GitHub автоматски ќе го спои ова барање за спојување кога ќе поминат сите задолжителни проверки.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} ќе се спои автоматски откако фајплајнот ќе успее.",
+ "enableAutoMergeDescriptionTerm": "GitLab автоматски го спојува овој {{term}} откако фајплајнот ќе успее.",
"forbidden": "Немаш дозвола да го споиш ова барање за спојување.",
"cannotMerge": "Ова барање за спојување не може да се спои во сегашната состојба.",
"couldNotMerge": "Не успеа спојувањето на барањето.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Веќе споено",
- "closed": "Ова барање за спојување е затворено"
+ "closed": "Ова барање за спојување е затворено",
+ "closedMergeRequest": "Ова merge барање е затворено"
},
"partialSuccessBanner": {
"body": "Не успеа бришењето на гранката: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Ова барање за спојување сè уште не може да се спои",
"notMergeableDetail": "GitHub ја пријави состојбата {{state}} за можноста за спојување."
},
+ "restrictions": {
+ "title": "Ограничувања при спојување",
+ "approvalsRequired_one": "Потребно е {{displayCount}} одобрение",
+ "approvalsRequired_other": "Потребни се {{displayCount}} одобренија",
+ "pipelineMustSucceed": "Фајплајнот мора да успее пред спојувањето."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Фајплајнот не успева на последниот комит.",
+ "pendingPipeline": "Фајплајнот сè уште работи на последниот комит.",
+ "permission": "Немате дозвола за спојување на {{term}}.",
+ "draft": "Означете го {{term}} како подготвен за преглед пред спојувањето."
+ },
"methodLabels": {
"merge": "Создај комит за спојување",
"squash": "Обедини ги комитите и спои",
@@ -448,6 +472,7 @@
"acceptTerms": "Прифати",
"replyBadRequest": "Овој одговор не може да се објави. Можеби нишката е променета.",
"replyForbidden": "Немаш дозвола да одговориш на ова барање за спојување.",
+ "replyForbiddenTerm": "Немате дозвола за одговор на {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Овој коментар не може да се пријави.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Прегледај го барањето за спојување",
"headLine": "{{counts}} · последен комит {{sha}}",
"entry": {
- "eyebrow": "Отвори барање за спојување преку URL.",
- "pastePrLink": "Залепи линк до PR",
- "noRecentPrs": "Нема неодамнешни PR",
- "noRecentPrsDescription": "Залепи линк до PR погоре за да започнеш преглед — следниот пат ќе се појави тука.",
+ "eyebrow": "Отворете барање за спојување или merge барање преку URL",
+ "pastePrLink": "Залепете врска до барање за спојување или merge барање",
+ "noRecentPrs": "Нема скорешни прегледи",
+ "noRecentPrsDescription": "Залепете врска горе за да започнете преглед — следниот пат ќе се појави тука.",
"couldNotLoad": "Вчитувањето не успеа.",
"removeFromRecentsTitle": "Да се отстрани од неодамнешните?",
- "removeFromRecentsMessage": "Ова барање за спојување ќе се отстрани од списокот со неодамнешни барања.",
+ "removeFromRecentsMessage": "Овој преглед ќе биде отстранет од вашата листа на скорешни.",
"removeRecentAccessibility": "Отстрани {{repo}} од неодамнешните",
- "urlAccessibility": "URL на барањето за спојување на GitHub",
- "clearLink": "Исчисти го линкот до барањето за спојување",
- "pasteLink": "Залепи линк до барањето за спојување",
+ "urlAccessibility": "Внесете URL до барање за спојување или merge барање",
+ "urlPlaceholder": "URL до барање за спојување или merge барање",
+ "openAccessibility": "Отвори барање за спојување или merge барање",
+ "clearLink": "Исчисти врска",
+ "pasteLink": "Залепи врска до барање за спојување или merge барање",
"open": "Отворено"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Не успеа проверката на врската со GitHub.",
"checkFailedMessage": "Статусот на најавата е недостапен додека не заврши вчитувањето.",
+ "checkFailedTitleGitLab": "Не можеше да се провери врската со GitLab",
+ "checkFailedTitleBitbucket": "Не можеше да се провери врската со Bitbucket",
+ "providerCheckFailedMessage": "Статусот на врската е недостапен додека не се вчита.",
"reconnectTitle": "Повторно поврзување со GitHub",
"reconnectDescription": "Пристапот до твојата сметка на GitHub е отповикан. Поврзи се повторно за да продолжиш да прегледуваш барања за спојување од телефонот.",
- "description": "Поврзи ја твојата сметка на GitHub за да прегледуваш барања за спојување од телефонот."
+ "description": "Поврзи ја твојата сметка на GitHub за да прегледуваш барања за спојување од телефонот.",
+ "gitlabDescription": "Поврзете ја вашата GitLab сметка за преглед на merge барања на мобилно.",
+ "bitbucketDescription": "Поврзете Bitbucket со оваа организација за преглед на барања за спојување на мобилно.",
+ "bitbucketOrgOnlyDescription": "Изберете организација во вашиот профил за да ги прегледате нејзините Bitbucket барања за спојување."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Врската со GitHub истече.",
- "message": "Твојата врска со GitHub веќе не важи. Провери ја повторно — ако е потребно, ќе добиеш барање повторно да се поврзеш."
+ "message": "Твојата врска со GitHub веќе не важи. Провери ја повторно — ако е потребно, ќе добиеш барање повторно да се поврзеш.",
+ "gitlabTitle": "Врската со GitLab истече",
+ "bitbucketTitle": "Врската со Bitbucket истече",
+ "providerMessage": "Вашата врска со {{provider}} повеќе не е важечка. Проверете ја врската повторно — ако е потребно, ќе биде побарано да се поврзете одново."
},
"eventChips": {
"comment": "Коментирај",
@@ -643,6 +679,21 @@
"files": "Датотеки",
"discussion": "Дискусија"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge барање",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Сподели merge барање",
+ "viewOnProvider": "Прикажи на {{provider}}",
+ "mergeRequestUnavailable": "Merge барањето е недостапно",
+ "unavailableDescription": "Можеби е избришано или немате пристап до него.",
+ "accessDeniedMergeRequest": "Немате дозвола за преглед на ова merge барање.",
+ "couldNotLoadMergeRequest": "Не можеше да се вчита merge барањето",
+ "discussionAccessDenied": "Немате дозвола за преглед на дискусијата на ова merge барање.",
+ "discussionUnavailableMessage": "Ова merge барање можеби е отстрането.",
+ "noDiscussionDescription": "Нема ни теми за преглед ни коментари за разговор на ова merge барање.",
+ "noFilesChangedDescription": "Ова merge барање нема промени на датотеки."
+ },
"fileStatus": {
"modified": "Изменета",
"renamed": "Преименувана",
@@ -659,7 +710,7 @@
"emptyLine": "(празно)"
},
"linkPasteClipboardEmpty": "Таблата со исечоци е празна.",
- "linkPasteNotAPullRequest": "Ова не е линк до барање за спојување на GitHub.",
+ "linkPasteNotAPullRequest": "Ова не е врска до барање за спојување или merge барање",
"announce": {
"commentPosted": "Коментарот е објавен",
"reviewSubmitted": "Прегледот е испратен",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Овој коментар не може да се објави. Можеби избраниот ред е променет или PR е ажуриран.",
"reviewNotSubmitted": "Овој преглед не може да се испрати во сегашната состојба. Можеби PR е променет или се обидуваш да прегледаш сопствено барање за спојување.",
+ "reviewNotSubmittedTerm": "Овој преглед не може да се поднесе во сегашна состојба. {{term}} можеби се променил или не можете да го прегледате вашето сопствено {{term}}.",
"couldNotPostComment": "Не успеа објавувањето на коментарот.",
"couldNotSubmitReview": "Не успеа испраќањето на прегледот. Провери ја врската и обиди се повторно."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Одговорот не се испрати.",
"couldNotCompleteAction": "Не успеа извршувањето на ова дејство.",
"mergeResultDefaultError": "GitHub не го заврши спојувањето.",
+ "mergeResultNotCompleted": "{{term}} не беше споено. Проверете ја неговата состојба и обидете се повторно.",
"ambiguous": "Не успеа потврдата на дејството — провери го PR пред повторниот обид.",
"persistenceFailed": "Не успеа евидентирањето на ова дејство. Обиди се повторно подоцна.",
"forbidden": "Пристапот е забранет."
@@ -1988,11 +2041,31 @@
"retryConnection": "Поврзи се повторно"
},
"newSession": {
+ "recentlyUsed": "Неодамна користени",
+ "couldNotLoadGithubRepositories": "Не успеа вчитувањето на репозиториумите од GitHub.",
+ "couldNotLoadGitlabRepositories": "Не успеа вчитувањето на репозиториумите од GitLab.",
+ "couldNotLoadBitbucketRepositories": "Не успеа вчитувањето на репозиториумите од Bitbucket.",
"connectGithubDescription": "Поврзи го GitHub преку прелистувачот, па врати се тука за да избереш репозиториум.",
+ "connectGitlabDescription": "Поврзи го GitLab преку прелистувачот, па врати се тука за да избереш репозиториум.",
+ "connectBitbucketDescription": "Поврзи го Bitbucket преку прелистувачот, па врати се тука за да избереш репозиториум.",
"openGithub": "Отвори GitHub",
+ "openGitlab": "Отвори GitLab",
+ "openBitbucket": "Отвори Bitbucket",
"refreshRepositories": "Освежи ги репозиториумите",
"githubConnected": "GitHub е поврзан",
+ "gitlabConnected": "GitLab е поврзан",
"noRepositoriesVisible": "Нема видливи репозиториуми. Провери дали апликацијата Kilo за GitHub има пристап до репозиториумите, па освежи.",
+ "noRepositoriesVisibleGitlab": "Нема видливи репозиториуми. Провери го пристапот до репозиториумите на GitLab, па освежи.",
+ "noRepositoriesVisibleBitbucket": "Нема видливи репозиториуми. Провери го пристапот до репозиториумите на Bitbucket, па освежи.",
+ "bitbucketOrganizationsOnly": "Bitbucket е достапен само за организации.",
+ "branchPickerTitle": "Избери гранка",
+ "branchDefault": "Основна",
+ "branchAccessibility": "Гранка: {{label}}",
+ "branchLoading": "Се вчитуваат гранки",
+ "branchLoadError": "Не можеше да се вчитаат гранките",
+ "branchUnavailable": "Гранките се недостапни за овој репозиториум. Проверете го пристапот кај операторот, па изберете друг репозиториум.",
+ "branchEmpty": "Нема достапни гранки",
+ "branchPlaceholder": "Изберете гранка",
"runOnWithTarget": "Изврши на: {{target}}",
"environment": "Околина",
"couldNotLoadEnvironment": "Не успеа вчитувањето на твојата околина.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Не успеа освежувањето на репозиториумите. Обиди се повторно.",
"discardDraftTitle": "Да се отфрли нацртот?",
"discardDraftMessage": "Твоето упатство ќе се изгуби.",
+ "discardWithUploadsMessage": "Твоето упатство и сите прикачени датотеки што не се приложени кон испратени пораки ќе се избришат.",
"discardFailed": "Не успеа отфрлањето на нацртот. Обиди се повторно.",
"remoteHint": "За да управуваш со локален процес на kilo, изврши `kilo remote` на компјутерот или `/remote` во активна сесија на CLI.",
- "connectBitbucketDescription": "Поврзи го Bitbucket преку прелистувачот, па врати се тука за да избереш репозиториум.",
- "connectGitlabDescription": "Поврзи го GitLab преку прелистувачот, па врати се тука за да избереш репозиториум.",
- "couldNotLoadBitbucketRepositories": "Не успеа вчитувањето на репозиториумите од Bitbucket.",
- "couldNotLoadGithubRepositories": "Не успеа вчитувањето на репозиториумите од GitHub.",
- "couldNotLoadGitlabRepositories": "Не успеа вчитувањето на репозиториумите од GitLab.",
- "gitlabConnected": "GitLab е поврзан",
- "noRepositoriesVisibleBitbucket": "Нема видливи репозиториуми. Провери го пристапот до репозиториумите на Bitbucket, па освежи.",
- "noRepositoriesVisibleGitlab": "Нема видливи репозиториуми. Провери го пристапот до репозиториумите на GitLab, па освежи.",
- "openBitbucket": "Отвори Bitbucket",
- "openGitlab": "Отвори GitLab",
- "recentlyUsed": "Неодамна користени",
"continueFrom": "Се продолжува сесијата {{title}}.",
"importingSession": "Увезување на сесијата",
"cliCannotContinue": "Овој CLI не може да продолжи сесија. Избери Cloud Agent или друг CLI.",
- "importFailed": "Не успеа увезувањето на оваа сесија.",
- "discardWithUploadsMessage": "Твоето упатство и сите прикачени датотеки што не се приложени кон испратени пораки ќе се избришат."
+ "importFailed": "Не успеа увезувањето на оваа сесија."
},
"partRenderer": {
"updatedFileCount_one": "Ажурирана е {{displayCount}} датотека.",
diff --git a/apps/mobile/src/i18n/locales/ml.json b/apps/mobile/src/i18n/locales/ml.json
index 98a40ca807..05e466aa66 100644
--- a/apps/mobile/src/i18n/locales/ml.json
+++ b/apps/mobile/src/i18n/locales/ml.json
@@ -36,6 +36,7 @@
"cost": "ചെലവ്",
"discard": "ഉപേക്ഷിക്കുക",
"findings": "കണ്ടെത്തലുകൾ",
+ "mergeRequest": "മെർജ് റിക്വസ്റ്റ്",
"notConnected": "ബന്ധിപ്പിച്ചിട്ടില്ല",
"notifications": "അറിയിപ്പുകൾ",
"pullRequest": "പുൾ റിക്വസ്റ്റ്",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ഡിഫിലെ ശൂന്യമായ വരി"
},
"connectionExpired": "GitHub കണക്ഷൻ കാലഹരണപ്പെട്ടു.",
+ "capabilities": {
+ "banner": {
+ "title": "ഈ പ്രൊവൈഡറിൽ ലഭ്യമല്ല",
+ "accessibility": "ഈ പ്രൊവൈഡറിൽ ലഭ്യമല്ല: {{reason}}"
+ }
+ },
"merge": {
"merge": "മെർജ്",
"mergeNow": "ഇപ്പോൾ മെർജ് ചെയ്യുക",
"mergePullRequest": "പുൾ റിക്വസ്റ്റ് മെർജ്",
+ "mergeTermTitle": "{{term}} മെർജ്",
"enableAutoMerge": "ഓട്ടോ-മെർജ് ഓണാക്കുക",
"disableAutoMerge": "ഓട്ടോ-മെർജ് ഓഫാക്കുക",
"autoMergeOn": "ഓട്ടോ-മെർജ് ഓണാണ്",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "മെർജിന് ശേഷം ബ്രാഞ്ച് ഇല്ലാതാക്കുക",
"noEnabledMethods": "ഈ റിപ്പോസിറ്ററിയിൽ മെർജ് രീതികളൊന്നും അനുവദിച്ചിട്ടില്ല. മെർജ്, സ്ക്വാഷ്, റീബേസ് എന്നിവയിൽ ഏതെങ്കിലും അനുവദിക്കാൻ റിപ്പോസിറ്ററി അഡ്മിനോട് ആവശ്യപ്പെടുക.",
"confirmTitle": "പുൾ റിക്വസ്റ്റ് മെർജ് ചെയ്യണോ?",
+ "confirmTitleTerm": "{{term}} മെർജ് ചെയ്യണോ?",
"confirmMessage": "ഇത് നിങ്ങളുടെ മാറ്റങ്ങൾ ബേസ് ബ്രാഞ്ചിലേക്ക് മെർജ് ചെയ്യും.",
"enableAutoMergeConfirmTitle": "ഓട്ടോ-മെർജ് ഓണാക്കണോ?",
"enableAutoMergeConfirmMessage": "ആവശ്യമായ എല്ലാ പരിശോധനകളും വിജയിക്കുമ്പോൾ GitHub ഈ പുൾ റിക്വസ്റ്റ് സ്വയം മെർജ് ചെയ്യും.",
+ "enableAutoMergeConfirmMessageTerm": "പൈപ്പ്ലൈൻ വിജയിച്ചാൽ {{term}} സ്വയം മെർജ് ചെയ്യപ്പെടും.",
+ "enableAutoMergeDescriptionTerm": "പൈപ്പ്ലൈൻ വിജയിച്ചാൽ GitLab ഈ {{term}} സ്വയം മെർജ് ചെയ്യും.",
"forbidden": "ഈ പുൾ റിക്വസ്റ്റ് മെർജ് ചെയ്യാൻ നിങ്ങൾക്ക് അനുമതിയില്ല.",
"cannotMerge": "ഈ പുൾ റിക്വസ്റ്റ് നിലവിലെ രൂപത്തിൽ മെർജ് ചെയ്യാനാവില്ല.",
"couldNotMerge": "പുൾ റിക്വസ്റ്റ് മെർജ് ചെയ്യാനായില്ല.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "ഇതിനകം മെർജ് ചെയ്തു",
- "closed": "ഈ പുൾ റിക്വസ്റ്റ് അടച്ചു"
+ "closed": "ഈ പുൾ റിക്വസ്റ്റ് അടച്ചു",
+ "closedMergeRequest": "ഈ മെർജ് റിക്വസ്റ്റ് അടച്ചു"
},
"partialSuccessBanner": {
"body": "ബ്രാഞ്ച് ഇല്ലാതാക്കാനായില്ല: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ഈ പുൾ റിക്വസ്റ്റ് ഇതുവരെ മെർജ് ചെയ്യാൻ കഴിയില്ല",
"notMergeableDetail": "മെർജ് നില GitHub {{state}} എന്ന് റിപ്പോർട്ട് ചെയ്തു."
},
+ "restrictions": {
+ "title": "മെർജ് നിയന്ത്രണങ്ങൾ",
+ "approvalsRequired_one": "{{displayCount}} അംഗീകാരം ആവശ്യം",
+ "approvalsRequired_other": "{{displayCount}} അംഗീകാരങ്ങൾ ആവശ്യം",
+ "pipelineMustSucceed": "മെർജ് ചെയ്യുന്നതിന് മുമ്പ് പൈപ്പ്ലൈൻ വിജയിക്കണം."
+ },
+ "providerBlocked": {
+ "failingPipeline": "ഏറ്റവും പുതിയ കമ്മിറ്റിൽ പൈപ്പ്ലൈൻ പരാജയപ്പെടുകയാണ്.",
+ "pendingPipeline": "ഏറ്റവും പുതിയ കമ്മിറ്റിൽ പൈപ്പ്ലൈൻ ഇനിയും പ്രവർത്തിക്കുകയാണ്.",
+ "permission": "ഈ {{term}} മെർജ് ചെയ്യാൻ നിങ്ങൾക്ക് അനുമതിയില്ല.",
+ "draft": "മെർജ് ചെയ്യുന്നതിന് മുമ്പ് {{term}} അവലോകനത്തിന് തയ്യാറെന്ന് അടയാളപ്പെടുത്തുക."
+ },
"methodLabels": {
"merge": "മെർജ് കമ്മിറ്റ് സൃഷ്ടിക്കുക",
"squash": "സ്ക്വാഷ് ചെയ്ത് മെർജ് ചെയ്യുക",
@@ -448,6 +472,7 @@
"acceptTerms": "അംഗീകരിക്കുക",
"replyBadRequest": "ഈ മറുപടി പോസ്റ്റ് ചെയ്യാൻ കഴിയില്ല. ത്രെഡ് മാറിയിരിക്കാം.",
"replyForbidden": "ഈ പുൾ റിക്വസ്റ്റിന് മറുപടി നൽകാൻ നിങ്ങൾക്ക് അനുമതിയില്ല.",
+ "replyForbiddenTerm": "ഈ {{term}}-ന് മറുപടി നൽകാൻ നിങ്ങൾക്ക് അനുമതിയില്ല.",
"moderation": {
"reportContent": {
"terminal": "ഈ അഭിപ്രായം റിപ്പോർട്ട് ചെയ്യാൻ കഴിയില്ല.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "പുൾ റിക്വസ്റ്റ് അവലോകനം ചെയ്യുക",
"headLine": "{{counts}} · ഹെഡ് {{sha}}",
"entry": {
- "eyebrow": "URL ഉപയോഗിച്ച് പുൾ റിക്വസ്റ്റ് തുറക്കുക.",
- "pastePrLink": "PR ലിങ്ക് ഒട്ടിക്കുക",
- "noRecentPrs": "അടുത്തിടെ തുറന്ന PR-കളില്ല",
- "noRecentPrsDescription": "അവലോകനം തുടങ്ങാൻ മുകളിൽ ഒരു PR ലിങ്ക് ഒട്ടിക്കുക. അടുത്ത തവണ ആ PR ഇവിടെ കാണാം.",
+ "eyebrow": "URL വഴി പുൾ റിക്വസ്റ്റോ മെർജ് റിക്വസ്റ്റോ തുറക്കുക",
+ "pastePrLink": "പുൾ റിക്വസ്റ്റിന്റെയോ മെർജ് റിക്വസ്റ്റിന്റെയോ ലിങ്ക് ഒട്ടിക്കുക",
+ "noRecentPrs": "സമീപകാല റിവ്യൂുകളൊന്നുമില്ല",
+ "noRecentPrsDescription": "രിവ്യൂ ആരംഭിക്കാൻ മുകളിൽ ഒരു ലിങ്ക് ഒട്ടിക്കുക — അടുത്ത തവണ ഇത് ഇവിടെ കാണിക്കും.",
"couldNotLoad": "ലോഡ് ചെയ്യാനായില്ല.",
"removeFromRecentsTitle": "അടുത്തിടെ തുറന്നവയുടെ പട്ടികയിൽ നിന്ന് നീക്കണോ?",
- "removeFromRecentsMessage": "ഈ പുൾ റിക്വസ്റ്റ് അടുത്തിടെ തുറന്നവയുടെ പട്ടികയിൽ നിന്ന് നീക്കം ചെയ്യും.",
+ "removeFromRecentsMessage": "ഈ റിവ്യൂ നിങ്ങളുടെ സമീപകാല പട്ടികയിൽനിന്ന് നീക്കം ചെയ്യും.",
"removeRecentAccessibility": "അടുത്തിടെ തുറന്നവയുടെ പട്ടികയിൽ നിന്ന് {{repo}} നീക്കം ചെയ്യുക",
- "urlAccessibility": "GitHub പുൾ റിക്വസ്റ്റ് URL",
- "clearLink": "പുൾ റിക്വസ്റ്റ് ലിങ്ക് മായ്ക്കുക",
- "pasteLink": "പുൾ റിക്വസ്റ്റ് ലിങ്ക് ഒട്ടിക്കുക",
+ "urlAccessibility": "പുൾ റിക്വസ്റ്റിന്റെയോ മെർജ് റിക്വസ്റ്റിന്റെയോ URL നൽകുക",
+ "urlPlaceholder": "പുൾ റിക്വസ്റ്റ് അല്ലെങ്കിൽ മെർജ് റിക്വസ്റ്റ് URL",
+ "openAccessibility": "പുൾ റിക്വസ്റ്റ് അല്ലെങ്കിൽ മെർജ് റിക്വസ്റ്റ് തുറക്കുക",
+ "clearLink": "ലിങ്ക് മായ്ക്കുക",
+ "pasteLink": "പുൾ റിക്വസ്റ്റ് അല്ലെങ്കിൽ മെർജ് റിക്വസ്റ്റ് ലിങ്ക് ഒട്ടിക്കുക",
"open": "ഓപ്പൺ"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub കണക്ഷൻ പരിശോധിക്കാനായില്ല.",
"checkFailedMessage": "ഇത് ലോഡ് ചെയ്യുന്നത് വരെ സൈൻ-ഇൻ നില ലഭ്യമല്ല.",
+ "checkFailedTitleGitLab": "GitLab കണക്ഷൻ പരിശോധിക്കാനായില്ല.",
+ "checkFailedTitleBitbucket": "Bitbucket കണക്ഷൻ പരിശോധിക്കാനായില്ല.",
+ "providerCheckFailedMessage": "ഇത് ലോഡ് ആകുന്നതുവരെ കണക്ഷൻ നില ലഭ്യമല്ല.",
"reconnectTitle": "GitHub വീണ്ടും കണക്റ്റ് ചെയ്യുക",
"reconnectDescription": "നിങ്ങളുടെ GitHub കണക്ഷൻ റദ്ദാക്കി. മൊബൈലിൽ പുൾ റിക്വസ്റ്റുകൾ അവലോകനം ചെയ്യുന്നത് തുടരാൻ വീണ്ടും കണക്റ്റ് ചെയ്യുക.",
- "description": "മൊബൈലിൽ പുൾ റിക്വസ്റ്റുകൾ അവലോകനം ചെയ്യാൻ നിങ്ങളുടെ GitHub അക്കൗണ്ട് കണക്റ്റ് ചെയ്യുക."
+ "description": "മൊബൈലിൽ പുൾ റിക്വസ്റ്റുകൾ അവലോകനം ചെയ്യാൻ നിങ്ങളുടെ GitHub അക്കൗണ്ട് കണക്റ്റ് ചെയ്യുക.",
+ "gitlabDescription": "മൊബൈലിൽ മെർജ് റിക്വസ്റ്റുകൾ പരിശോധിക്കാൻ നിങ്ങളുടെ GitLab അക്കൗണ്ട് കണക്റ്റ് ചെയ്യുക.",
+ "bitbucketDescription": "മൊബൈലിൽ പുൾ റിക്വസ്റ്റുകൾ പരിശോധിക്കാൻ ഈ ഓർഗനൈസേഷനെ Bitbucket-മായി കണക്റ്റ് ചെയ്യുക.",
+ "bitbucketOrgOnlyDescription": "അതിന്റെ Bitbucket പുൾ റിക്വസ്റ്റുകൾ പരിശോധിക്കാൻ നിങ്ങളുടെ പ്രൊഫൈലിൽ ഒരു ഓർഗനൈസേഷൻ തിരഞ്ഞെടുക്കുക."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub കണക്ഷൻ കാലഹരണപ്പെട്ടു.",
- "message": "നിങ്ങളുടെ GitHub കണക്ഷൻ ഇനി സാധുവല്ല. കണക്ഷൻ വീണ്ടും പരിശോധിക്കുക — ആവശ്യമെങ്കിൽ വീണ്ടും കണക്റ്റ് ചെയ്യാൻ ആവശ്യപ്പെടും."
+ "message": "നിങ്ങളുടെ GitHub കണക്ഷൻ ഇനി സാധുവല്ല. കണക്ഷൻ വീണ്ടും പരിശോധിക്കുക — ആവശ്യമെങ്കിൽ വീണ്ടും കണക്റ്റ് ചെയ്യാൻ ആവശ്യപ്പെടും.",
+ "gitlabTitle": "GitLab കണക്ഷൻ കാലഹരണപ്പെട്ടു.",
+ "bitbucketTitle": "Bitbucket കണക്ഷൻ കാലഹരണപ്പെട്ടു.",
+ "providerMessage": "നിങ്ങളുടെ {{provider}} കണക്ഷൻ ഇനി സാധുവല്ല. കണക്ഷൻ വീണ്ടും പരിശോധിക്കുക — ആവശ്യമെങ്കിൽ വീണ്ടും കണക്റ്റ് ചെയ്യാൻ ആവശ്യപ്പെടും."
},
"eventChips": {
"comment": "അഭിപ്രായം",
@@ -643,6 +679,21 @@
"files": "ഫയലുകൾ",
"discussion": "ചർച്ച"
},
+ "terms": {
+ "pullRequest": "പുൾ റിക്വസ്റ്റ്",
+ "mergeRequest": "മെർജ് റിക്വസ്റ്റ്",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "മെർജ് റിക്വസ്റ്റ് പങ്കിടുക",
+ "viewOnProvider": "{{provider}}-ൽ കാണുക",
+ "mergeRequestUnavailable": "മെർജ് റിക്വസ്റ്റ് ലഭ്യമല്ല",
+ "unavailableDescription": "അത് ഇല്ലാതാക്കിയിട്ടുണ്ടാകാം, അല്ലെങ്കിൽ നിങ്ങൾക്ക് അതിലേക്ക് ആക്സസ് ഇല്ലെന്ന് വരാം.",
+ "accessDeniedMergeRequest": "ഈ മെർജ് റിക്വസ്റ്റ് കാണാൻ നിങ്ങൾക്ക് അനുമതിയില്ല.",
+ "couldNotLoadMergeRequest": "മെർജ് റിക്വസ്റ്റ് ലോഡ് ചെയ്യാനായില്ല.",
+ "discussionAccessDenied": "ഈ മെർജ് റിക്വസ്റ്റ്-ന്റെ ചർച്ച കാണാൻ നിങ്ങൾക്ക് അനുമതിയില്ല.",
+ "discussionUnavailableMessage": "ഈ മെർജ് റിക്വസ്റ്റ് നീക്കം ചെയ്തിരിക്കാം.",
+ "noDiscussionDescription": "ഈ മെർജ് റിക്വസ്റ്റിൽ അവലോകന ത്രെഡുകളോ ചർച്ചയിലെ അഭിപ്രായങ്ങളോ ഇല്ല.",
+ "noFilesChangedDescription": "ഈ മെർജ് റിക്വസ്റ്റിൽ ഫയലുകളിലൊന്നും മാറ്റങ്ങളില്ല."
+ },
"fileStatus": {
"modified": "പരിഷ്കരിച്ചു",
"renamed": "പേര് മാറ്റി",
@@ -659,7 +710,7 @@
"emptyLine": "(ശൂന്യം)"
},
"linkPasteClipboardEmpty": "ക്ലിപ്പ്ബോർഡ് ശൂന്യമാണ്.",
- "linkPasteNotAPullRequest": "ഇത് GitHub പുൾ റിക്വസ്റ്റ് ലിങ്കല്ല.",
+ "linkPasteNotAPullRequest": "ഇത് പുൾ റിക്വസ്റ്റിന്റെയോ മെർജ് റിക്വസ്റ്റിന്റെയോ ലിങ്ക് അല്ല",
"announce": {
"commentPosted": "അഭിപ്രായം പോസ്റ്റ് ചെയ്തു",
"reviewSubmitted": "അവലോകനം സമർപ്പിച്ചു",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ഈ അഭിപ്രായം പോസ്റ്റ് ചെയ്യാൻ കഴിയില്ല. തിരഞ്ഞെടുത്ത വരി മാറിയിരിക്കാം, അല്ലെങ്കിൽ PR അപ്ഡേറ്റ് ചെയ്തിരിക്കാം.",
"reviewNotSubmitted": "ഈ അവലോകനം നിലവിലെ രൂപത്തിൽ സമർപ്പിക്കാനാവില്ല. PR മാറിയിരിക്കാം, അല്ലെങ്കിൽ ഇത് നിങ്ങളുടെ സ്വന്തം പുൾ റിക്വസ്റ്റ് ആയിരിക്കാം; സ്വന്തം പുൾ റിക്വസ്റ്റ് അവലോകനം ചെയ്യാനാവില്ല.",
+ "reviewNotSubmittedTerm": "ഈ റിവ്യൂ അതുപോലെ സമർപ്പിക്കാനാവില്ല. {{term}} മാറിയിട്ടുണ്ടാകാം, അല്ലെങ്കിൽ നിങ്ങളുടെ സ്വന്തം {{term}} നിങ്ങൾക്ക് റിവ്യൂ ചെയ്യാനാവില്ല.",
"couldNotPostComment": "അഭിപ്രായം പോസ്റ്റ് ചെയ്യാനായില്ല.",
"couldNotSubmitReview": "അവലോകനം സമർപ്പിക്കാനായില്ല. ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക."
},
@@ -675,6 +727,7 @@
"couldNotReply": "മറുപടി നൽകാനായില്ല.",
"couldNotCompleteAction": "ഈ പ്രവർത്തനം പൂർത്തിയാക്കാനായില്ല.",
"mergeResultDefaultError": "GitHub മെർജ് പൂർത്തിയാക്കിയില്ല.",
+ "mergeResultNotCompleted": "{{term}} മെർജ് ചെയ്തിട്ടില്ല. അതിന്റെ നില പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.",
"ambiguous": "സ്ഥിരീകരിക്കാനായില്ല — വീണ്ടും ശ്രമിക്കുന്നതിന് മുമ്പ് PR പരിശോധിക്കുക.",
"persistenceFailed": "ഈ പ്രവർത്തനം രേഖപ്പെടുത്താനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.",
"forbidden": "അനുമതിയില്ല."
@@ -1988,11 +2041,31 @@
"retryConnection": "വീണ്ടും കണക്റ്റ് ചെയ്യാൻ ശ്രമിക്കുക"
},
"newSession": {
+ "recentlyUsed": "അടുത്തിടെ ഉപയോഗിച്ചവ",
+ "couldNotLoadGithubRepositories": "GitHub റിപ്പോസിറ്ററികൾ ലോഡ് ചെയ്യാൻ കഴിഞ്ഞില്ല.",
+ "couldNotLoadGitlabRepositories": "GitLab റിപ്പോസിറ്ററികൾ ലോഡ് ചെയ്യാൻ കഴിഞ്ഞില്ല.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket റിപ്പോസിറ്ററികൾ ലോഡ് ചെയ്യാൻ കഴിഞ്ഞില്ല.",
"connectGithubDescription": "ബ്രൗസറിൽ GitHub കണക്റ്റ് ചെയ്യുക. തുടർന്ന് ഒരു റിപ്പോസിറ്ററി തിരഞ്ഞെടുക്കാൻ ഇവിടെ മടങ്ങിയെത്തുക.",
+ "connectGitlabDescription": "ബ്രൗസറിൽ GitLab കണക്റ്റ് ചെയ്യുക. തുടർന്ന് ഒരു റിപ്പോസിറ്ററി തിരഞ്ഞെടുക്കാൻ ഇവിടെ മടങ്ങിയെത്തുക.",
+ "connectBitbucketDescription": "ബ്രൗസറിൽ Bitbucket കണക്റ്റ് ചെയ്യുക. തുടർന്ന് ഒരു റിപ്പോസിറ്ററി തിരഞ്ഞെടുക്കാൻ ഇവിടെ മടങ്ങിയെത്തുക.",
"openGithub": "GitHub തുറക്കുക",
+ "openGitlab": "GitLab തുറക്കുക",
+ "openBitbucket": "Bitbucket തുറക്കുക",
"refreshRepositories": "റിപ്പോസിറ്ററികൾ പുതുക്കുക",
"githubConnected": "GitHub കണക്റ്റ് ചെയ്തു",
+ "gitlabConnected": "GitLab കണക്റ്റ് ചെയ്തു",
"noRepositoriesVisible": "റിപ്പോസിറ്ററികളൊന്നും കാണുന്നില്ല. Kilo GitHub ആപ്പിന് റിപ്പോസിറ്ററികൾ ഉപയോഗിക്കാനുള്ള അനുമതിയുണ്ടെന്ന് ഉറപ്പാക്കി പട്ടിക പുതുക്കുക.",
+ "noRepositoriesVisibleGitlab": "റിപ്പോസിറ്ററികളൊന്നും കാണുന്നില്ല. GitLab-ന് റിപ്പോസിറ്ററികൾ ഉപയോഗിക്കാനുള്ള അനുമതിയുണ്ടെന്ന് ഉറപ്പാക്കി പട്ടിക പുതുക്കുക.",
+ "noRepositoriesVisibleBitbucket": "റിപ്പോസിറ്ററികളൊന്നും കാണുന്നില്ല. Bitbucket-ന് റിപ്പോസിറ്ററികൾ ഉപയോഗിക്കാനുള്ള അനുമതിയുണ്ടെന്ന് ഉറപ്പാക്കി പട്ടിക പുതുക്കുക.",
+ "bitbucketOrganizationsOnly": "ഓർഗനൈസേഷനുകൾക്ക് മാത്രമേ Bitbucket ലഭ്യമാകൂ.",
+ "branchPickerTitle": "ബ്രാഞ്ച് തിരഞ്ഞെടുക്കുക",
+ "branchDefault": "ഡിഫോൾട്ട്",
+ "branchAccessibility": "ബ്രാഞ്ച്: {{label}}",
+ "branchLoading": "ബ്രാഞ്ചുകൾ ലോഡ് ചെയ്യുന്നു",
+ "branchLoadError": "ബ്രാഞ്ചുകൾ ലോഡ് ചെയ്യാനായില്ല",
+ "branchUnavailable": "ഈ റിപ്പോസിറ്ററിക്ക് ബ്രാഞ്ചുകൾ ലഭ്യമല്ല. പ്രൊവൈഡറിൽ നിങ്ങളുടെ ആക്സസ് പരിശോധിച്ച്, മറ്റൊരു റിപ്പോസിറ്ററി തിരഞ്ഞെടുക്കുക.",
+ "branchEmpty": "ബ്രാഞ്ചുകൾ ലഭ്യമല്ല",
+ "branchPlaceholder": "ഒരു ബ്രാഞ്ച് തിരഞ്ഞെടുക്കുക",
"runOnWithTarget": "{{target}}-ൽ പ്രവർത്തിപ്പിക്കുക",
"environment": "പ്രവർത്തനാന്തരീക്ഷം",
"couldNotLoadEnvironment": "നിങ്ങളുടെ പ്രവർത്തനാന്തരീക്ഷം ലോഡ് ചെയ്യാൻ കഴിഞ്ഞില്ല.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "റിപ്പോസിറ്ററികൾ പുതുക്കാൻ കഴിഞ്ഞില്ല. വീണ്ടും ശ്രമിക്കുക.",
"discardDraftTitle": "ഡ്രാഫ്റ്റ് ഉപേക്ഷിക്കണോ?",
"discardDraftMessage": "നിങ്ങളുടെ പ്രോംപ്റ്റ് നഷ്ടപ്പെടും.",
+ "discardWithUploadsMessage": "നിങ്ങളുടെ പ്രോംപ്റ്റും ഒരു സന്ദേശത്തിലും ചേർത്തിട്ടില്ലാത്ത അപ്ലോഡുകളും ഇല്ലാതാക്കും.",
"discardFailed": "ഡ്രാഫ്റ്റ് ഉപേക്ഷിക്കാൻ കഴിഞ്ഞില്ല. വീണ്ടും ശ്രമിക്കുക.",
"remoteHint": "കമ്പ്യൂട്ടറിലെ kilo പ്രോസസ്സ് നിയന്ത്രിക്കാൻ അതിൽ `kilo remote` പ്രവർത്തിപ്പിക്കുക. അല്ലെങ്കിൽ പ്രവർത്തിക്കുന്ന CLI സെഷനിൽ `/remote` പ്രവർത്തിപ്പിക്കുക.",
- "connectBitbucketDescription": "ബ്രൗസറിൽ Bitbucket കണക്റ്റ് ചെയ്യുക. തുടർന്ന് ഒരു റിപ്പോസിറ്ററി തിരഞ്ഞെടുക്കാൻ ഇവിടെ മടങ്ങിയെത്തുക.",
- "connectGitlabDescription": "ബ്രൗസറിൽ GitLab കണക്റ്റ് ചെയ്യുക. തുടർന്ന് ഒരു റിപ്പോസിറ്ററി തിരഞ്ഞെടുക്കാൻ ഇവിടെ മടങ്ങിയെത്തുക.",
- "couldNotLoadBitbucketRepositories": "Bitbucket റിപ്പോസിറ്ററികൾ ലോഡ് ചെയ്യാൻ കഴിഞ്ഞില്ല.",
- "couldNotLoadGithubRepositories": "GitHub റിപ്പോസിറ്ററികൾ ലോഡ് ചെയ്യാൻ കഴിഞ്ഞില്ല.",
- "couldNotLoadGitlabRepositories": "GitLab റിപ്പോസിറ്ററികൾ ലോഡ് ചെയ്യാൻ കഴിഞ്ഞില്ല.",
- "gitlabConnected": "GitLab കണക്റ്റ് ചെയ്തു",
- "noRepositoriesVisibleBitbucket": "റിപ്പോസിറ്ററികളൊന്നും കാണുന്നില്ല. Bitbucket-ന് റിപ്പോസിറ്ററികൾ ഉപയോഗിക്കാനുള്ള അനുമതിയുണ്ടെന്ന് ഉറപ്പാക്കി പട്ടിക പുതുക്കുക.",
- "noRepositoriesVisibleGitlab": "റിപ്പോസിറ്ററികളൊന്നും കാണുന്നില്ല. GitLab-ന് റിപ്പോസിറ്ററികൾ ഉപയോഗിക്കാനുള്ള അനുമതിയുണ്ടെന്ന് ഉറപ്പാക്കി പട്ടിക പുതുക്കുക.",
- "openBitbucket": "Bitbucket തുറക്കുക",
- "openGitlab": "GitLab തുറക്കുക",
- "recentlyUsed": "അടുത്തിടെ ഉപയോഗിച്ചവ",
"continueFrom": "{{title}} തുടരുന്നു.",
"importingSession": "സെഷൻ ഇംപോർട്ട് ചെയ്യുന്നു",
"cliCannotContinue": "ഈ CLI-യ്ക്ക് ഒരു സെഷൻ തുടരാൻ കഴിയില്ല. Cloud Agent അല്ലെങ്കിൽ മറ്റൊരു CLI തിരഞ്ഞെടുക്കുക.",
- "importFailed": "ഈ സെഷൻ ഇംപോർട്ട് ചെയ്യാൻ കഴിഞ്ഞില്ല.",
- "discardWithUploadsMessage": "നിങ്ങളുടെ പ്രോംപ്റ്റും ഒരു സന്ദേശത്തിലും ചേർത്തിട്ടില്ലാത്ത അപ്ലോഡുകളും ഇല്ലാതാക്കും."
+ "importFailed": "ഈ സെഷൻ ഇംപോർട്ട് ചെയ്യാൻ കഴിഞ്ഞില്ല."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} ഫയൽ അപ്ഡേറ്റ് ചെയ്തു.",
diff --git a/apps/mobile/src/i18n/locales/mn.json b/apps/mobile/src/i18n/locales/mn.json
index 91376a31e1..d874c27af7 100644
--- a/apps/mobile/src/i18n/locales/mn.json
+++ b/apps/mobile/src/i18n/locales/mn.json
@@ -36,6 +36,7 @@
"cost": "Зардал",
"discard": "Хаях",
"findings": "Илэрсэн асуудлууд",
+ "mergeRequest": "нэгтгэх хүсэлт",
"notConnected": "Холбогдоогүй",
"notifications": "Мэдэгдэл",
"pullRequest": "нэгтгэх хүсэлт",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Өөрчлөлтийн харьцуулалтын хоосон мөр"
},
"connectionExpired": "GitHub холболтын хугацаа дууссан.",
+ "capabilities": {
+ "banner": {
+ "title": "Энэ провайдерт боломжгүй",
+ "accessibility": "Энэ провайдерт боломжгүй: {{reason}}"
+ }
+ },
"merge": {
"merge": "Нэгтгэх",
"mergeNow": "Одоо нэгтгэх",
"mergePullRequest": "Нэгтгэх хүсэлтийг нэгтгэх",
+ "mergeTermTitle": "{{term}}ийг нэгтгэх",
"enableAutoMerge": "Автоматаар нэгтгэхийг идэвхжүүлэх",
"disableAutoMerge": "Автоматаар нэгтгэхийг идэвхгүй болгох",
"autoMergeOn": "Автоматаар нэгтгэх идэвхтэй",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Нэгтгэсний дараа салбарыг устгах",
"noEnabledMethods": "Энэ кодын санд нэгтгэх ямар ч аргыг идэвхжүүлээгүй байна. Энгийн нэгтгэл, коммитуудыг багцлан нэгтгэх эсвэл суурийг нь сольж нэгтгэх аргыг идэвхжүүлэхийг кодын сангийн админаас хүснэ үү.",
"confirmTitle": "Нэгтгэх хүсэлтийг нэгтгэх үү?",
+ "confirmTitleTerm": "{{term}}ийг нэгтгэх үү?",
"confirmMessage": "Энэ нь таны өөрчлөлтийг суурь салбарт нэгтгэнэ.",
"enableAutoMergeConfirmTitle": "Автоматаар нэгтгэхийг идэвхжүүлэх үү?",
"enableAutoMergeConfirmMessage": "Шаардлагатай бүх шалгалт амжилттай болмогц GitHub энэ нэгтгэх хүсэлтийг автоматаар нэгтгэнэ.",
+ "enableAutoMergeConfirmMessageTerm": "Пайплайн амжилттай болсны дараа {{term}} автоматаар нэгтгэгдэнэ.",
+ "enableAutoMergeDescriptionTerm": "Пайплайн амжилттай болвол GitLab энэ {{term}}-ийг автоматаар нэгтгэнэ.",
"forbidden": "Танд энэ нэгтгэх хүсэлтийг нэгтгэх эрх байхгүй.",
"cannotMerge": "Энэ нэгтгэх хүсэлтийг одоогийн байдлаар нь нэгтгэх боломжгүй.",
"couldNotMerge": "Нэгтгэх хүсэлтийг нэгтгэж чадсангүй.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Аль хэдийн нэгтгэсэн",
- "closed": "Энэ нэгтгэх хүсэлт хаагдсан"
+ "closed": "Энэ нэгтгэх хүсэлт хаагдсан",
+ "closedMergeRequest": "Энэ нэгтгэх хүсэлт хаагдсан"
},
"partialSuccessBanner": {
"body": "Салбарыг устгаж чадсангүй: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Энэ нэгтгэх хүсэлтийг хараахан нэгтгэх боломжгүй",
"notMergeableDetail": "GitHub нэгтгэх боломжийн төлөвийг {{state}} гэж мэдээлсэн."
},
+ "restrictions": {
+ "title": "Нэгтгэх хязгаарлалт",
+ "approvalsRequired_one": "{{displayCount}} зөвшөөрөл шаардлагатай",
+ "approvalsRequired_other": "{{displayCount}} зөвшөөрөл шаардлагатай",
+ "pipelineMustSucceed": "Нэгтгэхээс өмнө пайплайн амжилттай байх ёстой."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Пайплайн сүүлийн коммит дээр амжилтгүй байна.",
+ "pendingPipeline": "Пайплайн сүүлийн коммит дээр ажиллаж байна.",
+ "permission": "Танд энэ {{term}}ийг нэгтгэх эрх байхгүй.",
+ "draft": "Нэгтгэхээс өмнө {{term}}ийг хянуулахад бэлэн гэж тэмдэглэнэ үү."
+ },
"methodLabels": {
"merge": "Нэгтгэх коммит үүсгэх",
"squash": "Коммитуудыг багцлан нэгтгэх",
@@ -448,6 +472,7 @@
"acceptTerms": "Зөвшөөрөх",
"replyBadRequest": "Энэ хариуг нийтлэх боломжгүй. Сэдэв өөрчлөгдсөн байж болзошгүй.",
"replyForbidden": "Танд энэ нэгтгэх хүсэлтэд хариу бичих эрх байхгүй.",
+ "replyForbiddenTerm": "Танд энэ {{term}}эд хариу бичих эрх байхгүй.",
"moderation": {
"reportContent": {
"terminal": "Энэ сэтгэгдлийн талаар гомдол гаргах боломжгүй.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Нэгтгэх хүсэлтийг хянах",
"headLine": "{{counts}} · сүүлийн коммит: {{sha}}",
"entry": {
- "eyebrow": "Нэгтгэх хүсэлтийг URL-ээр нээнэ үү.",
- "pastePrLink": "PR-ын холбоосыг буулгах",
- "noRecentPrs": "Саяхан үзсэн PR алга",
- "noRecentPrsDescription": "Хянаж эхлэхийн тулд PR-ын холбоосыг дээр буулгана уу. Дараагийн удаа тэр PR энд харагдана.",
+ "eyebrow": "URL-ээр татах эсвэл нэгтгэх хүсэлт нээнэ үү.",
+ "pastePrLink": "Татах эсвэл нэгтгэх хүсэлтийн холбоосыг буулгах",
+ "noRecentPrs": "Саяхны шалгалт алга",
+ "noRecentPrsDescription": "Шалгалт эхлэхийн тулд холбоосыг дээр буулгана уу — дараагийн удаа тэр энд харагдана.",
"couldNotLoad": "Ачаалж чадсангүй.",
"removeFromRecentsTitle": "Саяхан үзсэн жагсаалтаас хасах уу?",
- "removeFromRecentsMessage": "Энэ нэгтгэх хүсэлт таны саяхан үзсэн жагсаалтаас хасагдана.",
+ "removeFromRecentsMessage": "Энэ шалгалт таны саяхны жагсаалтаас хасагдана.",
"removeRecentAccessibility": "{{repo}}-г саяхан үзсэн жагсаалтаас хасах",
- "urlAccessibility": "GitHub нэгтгэх хүсэлтийн URL",
- "clearLink": "Нэгтгэх хүсэлтийн холбоосыг арилгах",
- "pasteLink": "Нэгтгэх хүсэлтийн холбоосыг буулгах",
+ "urlAccessibility": "Татах эсвэл нэгтгэх хүсэлтийн URL-ийг бичнэ үү",
+ "urlPlaceholder": "Татах эсвэл нэгтгэх хүсэлтийн URL",
+ "openAccessibility": "Татах эсвэл нэгтгэх хүсэлт нээх",
+ "clearLink": "Холбоосыг арилгах",
+ "pasteLink": "Татах эсвэл нэгтгэх хүсэлтийн холбоосыг буулгах",
"open": "Нээлттэй"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub холболтыг шалгаж чадсангүй.",
"checkFailedMessage": "Энэ мэдээллийг ачаалж дуустал нэвтэрсэн эсэхийг харуулах боломжгүй.",
+ "checkFailedTitleGitLab": "GitLab холболтыг шалгаж чадсангүй.",
+ "checkFailedTitleBitbucket": "Bitbucket холболтыг шалгаж чадсангүй.",
+ "providerCheckFailedMessage": "Ачаалагдах хүртэл холболтын төлөв харагдахгүй.",
"reconnectTitle": "GitHub-ыг дахин холбох",
"reconnectDescription": "Таны GitHub холболтын зөвшөөрлийг цуцалсан байна. Гар утаснаасаа нэгтгэх хүсэлтүүдийг үргэлжлүүлэн хянахын тулд дахин холбоно уу.",
- "description": "Гар утаснаасаа нэгтгэх хүсэлтүүдийг хянахын тулд GitHub бүртгэлээ холбоно уу."
+ "description": "Гар утаснаасаа нэгтгэх хүсэлтүүдийг хянахын тулд GitHub бүртгэлээ холбоно уу.",
+ "gitlabDescription": "Гар утаснаас нэгтгэх хүсэлтүүдийг шалгахын тулд GitLab бүртгэлээ холбоно уу.",
+ "bitbucketDescription": "Гар утаснаас татах хүсэлтүүдийг шалгахын тулд Bitbucket-ийг энэ байгууллагад холбоно уу.",
+ "bitbucketOrgOnlyDescription": "Тухайн байгууллагын Bitbucket татах хүсэлтүүдийг шалгахын тулд профайлаасаа байгууллага сонгоно уу."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub холболтын хугацаа дууссан.",
- "message": "Таны GitHub холболт хүчингүй болсон. Холболтоо дахин шалгана уу. Шаардлагатай бол дахин холбох заавар гарна."
+ "message": "Таны GitHub холболт хүчингүй болсон. Холболтоо дахин шалгана уу. Шаардлагатай бол дахин холбох заавар гарна.",
+ "gitlabTitle": "GitLab холболтын хугацаа дууссан.",
+ "bitbucketTitle": "Bitbucket холболтын хугацаа дууссан.",
+ "providerMessage": "Таны {{provider}} холболт хүчингүй болсон. Холболтоо дахин шалгана уу. Шаардлагатай бол дахин холбох заавар гарна."
},
"eventChips": {
"comment": "Сэтгэгдэл бичих",
@@ -643,6 +679,21 @@
"files": "Файл",
"discussion": "Хэлэлцүүлэг"
},
+ "terms": {
+ "pullRequest": "Нэгтгэх хүсэлт",
+ "mergeRequest": "Нэгтгэх хүсэлт",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Нэгтгэх хүсэлтийг хуваалцах",
+ "viewOnProvider": "{{provider}} дээр харах",
+ "mergeRequestUnavailable": "Нэгтгэх хүсэлтийг нээх боломжгүй",
+ "unavailableDescription": "Устсан байж болзошгүй, эсвэл танд хандах эрх байхгүй.",
+ "accessDeniedMergeRequest": "Танд энэ нэгтгэх хүсэлтийг үзэх эрх байхгүй.",
+ "couldNotLoadMergeRequest": "Нэгтгэх хүсэлтийг ачаалж чадсангүй.",
+ "discussionAccessDenied": "Танд энэ нэгтгэх хүсэлтийн хэлэлцүүлгийг үзэх эрх байхгүй.",
+ "discussionUnavailableMessage": "Энэ нэгтгэх хүсэлтийг устгасан байж болзошгүй.",
+ "noDiscussionDescription": "Энэ нэгтгэх хүсэлтэд хяналтын сэдэв эсвэл хэлэлцүүлгийн сэтгэгдэл байхгүй.",
+ "noFilesChangedDescription": "Энэ нэгтгэх хүсэлтэд файлын өөрчлөлт байхгүй."
+ },
"fileStatus": {
"modified": "Өөрчилсөн",
"renamed": "Нэрийг өөрчилсөн",
@@ -659,7 +710,7 @@
"emptyLine": "(хоосон)"
},
"linkPasteClipboardEmpty": "Хуулах санах ой хоосон байна.",
- "linkPasteNotAPullRequest": "Энэ нь GitHub нэгтгэх хүсэлтийн холбоос биш байна.",
+ "linkPasteNotAPullRequest": "Энэ татах эсвэл нэгтгэх хүсэлтийн холбоос биш байна.",
"announce": {
"commentPosted": "Сэтгэгдэл нийтлэгдсэн",
"reviewSubmitted": "Хяналтыг илгээсэн",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Энэ сэтгэгдлийг нийтлэх боломжгүй. Сонгосон мөр өөрчлөгдсөн эсвэл PR шинэчлэгдсэн байж болзошгүй.",
"reviewNotSubmitted": "Энэ хяналтыг одоогийн байдлаар нь илгээх боломжгүй. PR өөрчлөгдсөн байж болзошгүй, эсвэл та өөрийн нэгтгэх хүсэлтийг хянах гэж оролдсон байна.",
+ "reviewNotSubmittedTerm": "Энэ шалгалтыг хэвээр нь илгээх боломжгүй. {{term}} өөрчлөгдсөн байж болзошгүй, эсвэл та өөрийн {{term}}-г шалгах боломжгүй.",
"couldNotPostComment": "Сэтгэгдлийг нийтэлж чадсангүй.",
"couldNotSubmitReview": "Хяналтыг илгээж чадсангүй. Холболтоо шалгаад дахин оролдоно уу."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Хариу илгээж чадсангүй.",
"couldNotCompleteAction": "Энэ үйлдлийг гүйцэтгэж чадсангүй.",
"mergeResultDefaultError": "GitHub нэгтгэх үйлдлийг дуусгаагүй.",
+ "mergeResultNotCompleted": "{{term}} нэгтгэгдсэнгүй. Төлөвийг шалгаад дахин оролдоно уу.",
"ambiguous": "Баталгаажуулж чадсангүй. Дахин оролдохын өмнө PR-ыг шалгана уу.",
"persistenceFailed": "Энэ үйлдлийг бүртгэж чадсангүй. Дараа дахин оролдоно уу.",
"forbidden": "Энэ үйлдлийг хийх эрх байхгүй."
@@ -1988,11 +2041,31 @@
"retryConnection": "Дахин холбогдох"
},
"newSession": {
+ "recentlyUsed": "Сүүлд ашигласан",
+ "couldNotLoadGithubRepositories": "GitHub-ийн кодын сангуудыг ачаалж чадсангүй.",
+ "couldNotLoadGitlabRepositories": "GitLab-ийн кодын сангуудыг ачаалж чадсангүй.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket-ийн кодын сангуудыг ачаалж чадсангүй.",
"connectGithubDescription": "Хөтөч дээрээ GitHub-ыг холбоод, энд буцаж ирж кодын сангаа сонгоно уу.",
+ "connectGitlabDescription": "Хөтөч дээрээ GitLab-ыг холбоод, энд буцаж ирж кодын сангаа сонгоно уу.",
+ "connectBitbucketDescription": "Хөтөч дээрээ Bitbucket-ыг холбоод, энд буцаж ирж кодын сангаа сонгоно уу.",
"openGithub": "GitHub-ыг нээх",
+ "openGitlab": "GitLab-ыг нээх",
+ "openBitbucket": "Bitbucket-ыг нээх",
"refreshRepositories": "Кодын сангийн жагсаалтыг шинэчлэх",
"githubConnected": "GitHub холбогдсон",
+ "gitlabConnected": "GitLab холбогдсон",
"noRepositoriesVisible": "Кодын сан харагдахгүй байна. Kilo GitHub аппын кодын санд хандах эрхийг шалгаад жагсаалтыг шинэчилнэ үү.",
+ "noRepositoriesVisibleGitlab": "Кодын сан харагдахгүй байна. GitLab-ийн кодын санд хандах эрхийг шалгаад жагсаалтыг шинэчилнэ үү.",
+ "noRepositoriesVisibleBitbucket": "Кодын сан харагдахгүй байна. Bitbucket-ийн кодын санд хандах эрхийг шалгаад жагсаалтыг шинэчилнэ үү.",
+ "bitbucketOrganizationsOnly": "Bitbucket зөвхөн байгууллагуудад боломжтой.",
+ "branchPickerTitle": "Салбар сонгох",
+ "branchDefault": "Өгөгдмөл",
+ "branchAccessibility": "Салбар: {{label}}",
+ "branchLoading": "Салбаруудыг ачаалж байна",
+ "branchLoadError": "Салбаруудыг ачаалж чадсангүй",
+ "branchUnavailable": "Энэ кодны санд салбарууд боломжгүй. Провайдераас хандах эрхээ шалгаад, өөр кодны сан сонгоно уу.",
+ "branchEmpty": "Салбар боломжгүй",
+ "branchPlaceholder": "Салбар сонгоно уу",
"runOnWithTarget": "{{target}} дээр ажиллуулах",
"environment": "Орчин",
"couldNotLoadEnvironment": "Таны орчныг ачаалж чадсангүй.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Кодын сангийн жагсаалтыг шинэчилж чадсангүй. Дахин оролдоно уу.",
"discardDraftTitle": "Нооргийг устгах уу?",
"discardDraftMessage": "Таны бичсэн заавар устах болно.",
+ "discardWithUploadsMessage": "Таны бичсэн заавар болон илгээсэн мессежид хавсаргаагүй файлууд устах болно.",
"discardFailed": "Нооргийг устгаж чадсангүй. Дахин оролдоно уу.",
"remoteHint": "Компьютер дээрээ ажиллаж буй kilo процессыг удирдахын тулд `kilo remote`, эсвэл ажиллаж буй CLI сессэд `/remote` командыг ажиллуулна уу.",
- "connectBitbucketDescription": "Хөтөч дээрээ Bitbucket-ыг холбоод, энд буцаж ирж кодын сангаа сонгоно уу.",
- "connectGitlabDescription": "Хөтөч дээрээ GitLab-ыг холбоод, энд буцаж ирж кодын сангаа сонгоно уу.",
- "couldNotLoadBitbucketRepositories": "Bitbucket-ийн кодын сангуудыг ачаалж чадсангүй.",
- "couldNotLoadGithubRepositories": "GitHub-ийн кодын сангуудыг ачаалж чадсангүй.",
- "couldNotLoadGitlabRepositories": "GitLab-ийн кодын сангуудыг ачаалж чадсангүй.",
- "gitlabConnected": "GitLab холбогдсон",
- "noRepositoriesVisibleBitbucket": "Кодын сан харагдахгүй байна. Bitbucket-ийн кодын санд хандах эрхийг шалгаад жагсаалтыг шинэчилнэ үү.",
- "noRepositoriesVisibleGitlab": "Кодын сан харагдахгүй байна. GitLab-ийн кодын санд хандах эрхийг шалгаад жагсаалтыг шинэчилнэ үү.",
- "openBitbucket": "Bitbucket-ыг нээх",
- "openGitlab": "GitLab-ыг нээх",
- "recentlyUsed": "Сүүлд ашигласан",
"continueFrom": "«{{title}}» сессийг үргэлжлүүлж байна.",
"importingSession": "Сесс импортлож байна",
"cliCannotContinue": "Энэ CLI сессийг үргэлжлүүлэх боломжгүй. Cloud Agent эсвэл өөр CLI сонгоно уу.",
- "importFailed": "Энэ сессийг импортолж чадсангүй.",
- "discardWithUploadsMessage": "Таны бичсэн заавар болон илгээсэн мессежид хавсаргаагүй файлууд устах болно."
+ "importFailed": "Энэ сессийг импортолж чадсангүй."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} файлыг шинэчиллээ.",
diff --git a/apps/mobile/src/i18n/locales/mr.json b/apps/mobile/src/i18n/locales/mr.json
index d73a5814c8..67806d0aeb 100644
--- a/apps/mobile/src/i18n/locales/mr.json
+++ b/apps/mobile/src/i18n/locales/mr.json
@@ -36,6 +36,7 @@
"cost": "खर्च",
"discard": "टाकून द्या",
"findings": "निष्कर्ष",
+ "mergeRequest": "मर्ज रिक्वेस्ट",
"notConnected": "जोडलेले नाही",
"notifications": "सूचना",
"pullRequest": "पुल रिक्वेस्ट",
@@ -340,10 +341,17 @@
"emptyDiffRow": "बदलांच्या तुलनेतील रिकामी ओळ"
},
"connectionExpired": "GitHub जोडणीची मुदत संपली.",
+ "capabilities": {
+ "banner": {
+ "title": "या पुरवठादारावर उपलब्ध नाही",
+ "accessibility": "या पुरवठादारावर उपलब्ध नाही: {{reason}}"
+ }
+ },
"merge": {
"merge": "मर्ज",
"mergeNow": "आता मर्ज करा",
"mergePullRequest": "पुल रिक्वेस्ट मर्ज करा",
+ "mergeTermTitle": "{{term}} मर्ज करा",
"enableAutoMerge": "ऑटो-मर्ज चालू करा",
"disableAutoMerge": "ऑटो-मर्ज बंद करा",
"autoMergeOn": "ऑटो-मर्ज चालू आहे",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "मर्ज केल्यानंतर शाखा हटवा",
"noEnabledMethods": "या रेपॉझिटरीमध्ये मर्ज करण्याची कोणतीही पद्धत चालू नाही. रेपॉझिटरीच्या प्रशासकाला मर्ज, स्क्वॅश किंवा रिबेस यांपैकी एखादी पद्धत चालू करण्यास सांगा.",
"confirmTitle": "पुल रिक्वेस्ट मर्ज करायची?",
+ "confirmTitleTerm": "{{term}} मर्ज करायची?",
"confirmMessage": "यामुळे तुमचे बदल बेस शाखेत मर्ज होतील.",
"enableAutoMergeConfirmTitle": "ऑटो-मर्ज चालू करायचे?",
"enableAutoMergeConfirmMessage": "सर्व आवश्यक तपासण्या यशस्वी झाल्यावर GitHub ही पुल रिक्वेस्ट आपोआप मर्ज करेल.",
+ "enableAutoMergeConfirmMessageTerm": "पाइपलाइन यशस्वी झाल्यावर {{term}} स्वयंचलितपणे मर्ज होईल.",
+ "enableAutoMergeDescriptionTerm": "पाइपलाइन यशस्वी झाल्यावर GitLab ही {{term}} स्वयंचलितपणे मर्ज करते.",
"forbidden": "तुम्हाला ही पुल रिक्वेस्ट मर्ज करण्याची परवानगी नाही.",
"cannotMerge": "ही पुल रिक्वेस्ट सध्याच्या स्वरूपात मर्ज करता येत नाही.",
"couldNotMerge": "पुल रिक्वेस्ट मर्ज करता आली नाही.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "आधीच मर्ज झाली",
- "closed": "ही पुल रिक्वेस्ट बंद आहे"
+ "closed": "ही पुल रिक्वेस्ट बंद आहे",
+ "closedMergeRequest": "ही मर्ज रिक्वेस्ट बंद आहे"
},
"partialSuccessBanner": {
"body": "शाखा हटवता आली नाही: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ही पुल रिक्वेस्ट अजून मर्ज होऊ शकत नाही",
"notMergeableDetail": "GitHub ने मर्ज करण्याची स्थिती {{state}} असल्याचे कळवले."
},
+ "restrictions": {
+ "title": "मर्जवरील निर्बंध",
+ "approvalsRequired_one": "{{displayCount}} मंजुरी आवश्यक",
+ "approvalsRequired_other": "{{displayCount}} मंजुरी आवश्यक",
+ "pipelineMustSucceed": "मर्ज करण्यापूर्वी पाइपलाइन यशस्वी होणे आवश्यक आहे."
+ },
+ "providerBlocked": {
+ "failingPipeline": "सर्वात नवीन कमिटवर पाइपलाइन अयशस्वी होत आहे.",
+ "pendingPipeline": "सर्वात नवीन कमिटवर पाइपलाइन अजूनही चालू आहे.",
+ "permission": "तुम्हाला ही {{term}} मर्ज करण्याची परवानगी नाही.",
+ "draft": "मर्ज करण्यापूर्वी {{term}} पुनरावलोकनासाठी तयार असल्याची खूण करा."
+ },
"methodLabels": {
"merge": "मर्ज कमिट तयार करा",
"squash": "स्क्वॅश करून मर्ज करा",
@@ -448,6 +472,7 @@
"acceptTerms": "स्वीकारा",
"replyBadRequest": "हे उत्तर पोस्ट करता येत नाही. चर्चेत बदल झाला असेल.",
"replyForbidden": "तुम्हाला या पुल रिक्वेस्टला उत्तर देण्याची परवानगी नाही.",
+ "replyForbiddenTerm": "तुम्हाला या {{term}}ला उत्तर देण्याची परवानगी नाही.",
"moderation": {
"reportContent": {
"terminal": "या टिप्पणीची तक्रार करता येत नाही.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "पुल रिक्वेस्टचे पुनरावलोकन करा",
"headLine": "{{counts}} · हेड {{sha}}",
"entry": {
- "eyebrow": "URL वापरून पुल रिक्वेस्ट उघडा.",
- "pastePrLink": "PR ची लिंक पेस्ट करा",
- "noRecentPrs": "अलीकडील PR नाहीत",
- "noRecentPrsDescription": "पुनरावलोकन सुरू करण्यासाठी वर PR ची लिंक पेस्ट करा — पुढच्या वेळी तो PR येथे दिसेल.",
+ "eyebrow": "URL वापरून पुल रिक्वेस्ट किंवा मर्ज रिक्वेस्ट उघडा",
+ "pastePrLink": "पुल रिक्वेस्ट किंवा मर्ज रिक्वेस्टची लिंक पेस्ट करा",
+ "noRecentPrs": "अलीकडील पुनरावलोकने नाहीत",
+ "noRecentPrsDescription": "पुनरावलोकन सुरू करण्यासाठी वर एक लिंक पेस्ट करा — पुढच्या वेळी ती येथे दिसेल.",
"couldNotLoad": "लोड करता आले नाही.",
"removeFromRecentsTitle": "अलीकडील यादीतून काढायचे?",
- "removeFromRecentsMessage": "ही पुल रिक्वेस्ट तुमच्या अलीकडील यादीतून काढली जाईल.",
+ "removeFromRecentsMessage": "हे पुनरावलोकन तुमच्या अलीकडील यादीतून काढले जाईल.",
"removeRecentAccessibility": "{{repo}} अलीकडील यादीतून काढा",
- "urlAccessibility": "GitHub पुल रिक्वेस्टचा URL",
- "clearLink": "पुल रिक्वेस्टची लिंक काढा",
- "pasteLink": "पुल रिक्वेस्टची लिंक पेस्ट करा",
+ "urlAccessibility": "पुल रिक्वेस्ट किंवा मर्ज रिक्वेस्टचा URL टाका",
+ "urlPlaceholder": "पुल रिक्वेस्ट किंवा मर्ज रिक्वेस्ट URL",
+ "openAccessibility": "पुल रिक्वेस्ट किंवा मर्ज रिक्वेस्ट उघडा",
+ "clearLink": "लिंक काढा",
+ "pasteLink": "पुल रिक्वेस्ट किंवा मर्ज रिक्वेस्टची लिंक पेस्ट करा",
"open": "उघडा"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub कनेक्शन तपासता आले नाही.",
"checkFailedMessage": "हे लोड होईपर्यंत तुम्ही साइन इन केले आहे का ते कळणार नाही.",
+ "checkFailedTitleGitLab": "GitLab कनेक्शन तपासता आले नाही.",
+ "checkFailedTitleBitbucket": "Bitbucket कनेक्शन तपासता आले नाही.",
+ "providerCheckFailedMessage": "हे लोड होईपर्यंत कनेक्शनची स्थिती उपलब्ध नाही.",
"reconnectTitle": "GitHub पुन्हा कनेक्ट करा",
"reconnectDescription": "तुमचे GitHub कनेक्शन रद्द झाले आहे. मोबाइलवर पुल रिक्वेस्टचे पुनरावलोकन सुरू ठेवण्यासाठी पुन्हा कनेक्ट करा.",
- "description": "मोबाइलवर पुल रिक्वेस्टचे पुनरावलोकन करण्यासाठी तुमचे GitHub खाते कनेक्ट करा."
+ "description": "मोबाइलवर पुल रिक्वेस्टचे पुनरावलोकन करण्यासाठी तुमचे GitHub खाते कनेक्ट करा.",
+ "gitlabDescription": "मोबाइलवर मर्ज रिक्वेस्ट तपासण्यासाठी तुमचे GitLab खाते कनेक्ट करा.",
+ "bitbucketDescription": "मोबाइलवर पुल रिक्वेस्ट तपासण्यासाठी हे संघटन Bitbucket शी कनेक्ट करा.",
+ "bitbucketOrgOnlyDescription": "तुमच्या प्रोफाइलमध्ये एक संघटन निवडा जेणेकरून त्याची Bitbucket पुल रिक्वेस्ट तपासता येतील."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub जोडणीची मुदत संपली.",
- "message": "तुमचे GitHub कनेक्शन आता वैध नाही. कनेक्शन पुन्हा तपासा — गरज असल्यास तुम्हाला पुन्हा कनेक्ट करण्यास सांगितले जाईल."
+ "message": "तुमचे GitHub कनेक्शन आता वैध नाही. कनेक्शन पुन्हा तपासा — गरज असल्यास तुम्हाला पुन्हा कनेक्ट करण्यास सांगितले जाईल.",
+ "gitlabTitle": "GitLab जोडणीची मुदत संपली.",
+ "bitbucketTitle": "Bitbucket जोडणीची मुदत संपली.",
+ "providerMessage": "तुमचे {{provider}} कनेक्शन आता वैध नाही. कनेक्शन पुन्हा तपासा — गरज असल्यास तुम्हाला पुन्हा कनेक्ट करण्यास सांगितले जाईल."
},
"eventChips": {
"comment": "टिप्पणी",
@@ -643,6 +679,21 @@
"files": "फाइली",
"discussion": "चर्चा"
},
+ "terms": {
+ "pullRequest": "पुल रिक्वेस्ट",
+ "mergeRequest": "मर्ज रिक्वेस्ट",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "मर्ज रिक्वेस्ट शेअर करा",
+ "viewOnProvider": "{{provider}} वर पहा",
+ "mergeRequestUnavailable": "मर्ज रिक्वेस्ट अनुपलब्ध",
+ "unavailableDescription": "ती हटवली गेली असेल, किंवा तुम्हाला त्यावर प्रवेश नसेल.",
+ "accessDeniedMergeRequest": "तुम्हाला ही मर्ज रिक्वेस्ट पाहण्याची परवानगी नाही.",
+ "couldNotLoadMergeRequest": "मर्ज रिक्वेस्ट लोड करता आली नाही.",
+ "discussionAccessDenied": "तुम्हाला या मर्ज रिक्वेस्ट वरील चर्चा पाहण्याची परवानगी नाही.",
+ "discussionUnavailableMessage": "ही मर्ज रिक्वेस्ट काढून टाकली असेल.",
+ "noDiscussionDescription": "या मर्ज रिक्वेस्टवर पुनरावलोकनाच्या चर्चा किंवा इतर टिप्पण्या नाहीत.",
+ "noFilesChangedDescription": "या मर्ज रिक्वेस्टमध्ये कोणत्याही फाइलमध्ये बदल केलेले नाहीत."
+ },
"fileStatus": {
"modified": "बदल केलेली",
"renamed": "नाव बदललेली",
@@ -659,7 +710,7 @@
"emptyLine": "(रिकामे)"
},
"linkPasteClipboardEmpty": "क्लिपबोर्ड रिकामा आहे.",
- "linkPasteNotAPullRequest": "ही GitHub पुल रिक्वेस्टची लिंक नाही.",
+ "linkPasteNotAPullRequest": "ही पुल रिक्वेस्ट किंवा मर्ज रिक्वेस्टची लिंक नाही",
"announce": {
"commentPosted": "टिप्पणी पोस्ट केली",
"reviewSubmitted": "पुनरावलोकन सादर केले",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ही टिप्पणी पोस्ट करता येत नाही. निवडलेली ओळ बदलली असेल किंवा PR अपडेट झाला असेल.",
"reviewNotSubmitted": "हे पुनरावलोकन सध्याच्या स्वरूपात सादर करता येत नाही. PR बदलला असेल किंवा ही तुमची स्वतःची पुल रिक्वेस्ट असेल, जिचे तुम्ही पुनरावलोकन करू शकत नाही.",
+ "reviewNotSubmittedTerm": "हे पुनरावलोकन तसेच सबमिट करता येत नाही. {{term}} बदलली असेल, किंवा तुम्ही तुमच्या स्वतःच्या {{term}} चे पुनरावलोकन करू शकत नाही.",
"couldNotPostComment": "टिप्पणी पोस्ट करता आली नाही.",
"couldNotSubmitReview": "पुनरावलोकन सादर करता आले नाही. इंटरनेट कनेक्शन तपासा आणि पुन्हा प्रयत्न करा."
},
@@ -675,6 +727,7 @@
"couldNotReply": "उत्तर देता आले नाही.",
"couldNotCompleteAction": "ही कृती पूर्ण करता आली नाही.",
"mergeResultDefaultError": "GitHub ने मर्ज पूर्ण केले नाही.",
+ "mergeResultNotCompleted": "{{term}} मर्ज झाली नाही. तिची स्थिती तपासा आणि पुन्हा प्रयत्न करा.",
"ambiguous": "पुष्टी करता आली नाही — पुन्हा प्रयत्न करण्यापूर्वी PR तपासा.",
"persistenceFailed": "ही कृती नोंदवता आली नाही. कृपया नंतर पुन्हा प्रयत्न करा.",
"forbidden": "या कृतीची परवानगी नाही."
@@ -1988,11 +2041,31 @@
"retryConnection": "पुन्हा कनेक्ट करण्याचा प्रयत्न करा"
},
"newSession": {
+ "recentlyUsed": "अलीकडे वापरलेले",
+ "couldNotLoadGithubRepositories": "GitHub रिपॉझिटरी लोड करता आल्या नाहीत.",
+ "couldNotLoadGitlabRepositories": "GitLab रिपॉझिटरी लोड करता आल्या नाहीत.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket रिपॉझिटरी लोड करता आल्या नाहीत.",
"connectGithubDescription": "तुमच्या ब्राउझरमध्ये GitHub कनेक्ट करा, नंतर रिपॉझिटरी निवडण्यासाठी येथे परत या.",
+ "connectGitlabDescription": "तुमच्या ब्राउझरमध्ये GitLab कनेक्ट करा, नंतर रिपॉझिटरी निवडण्यासाठी येथे परत या.",
+ "connectBitbucketDescription": "तुमच्या ब्राउझरमध्ये Bitbucket कनेक्ट करा, नंतर रिपॉझिटरी निवडण्यासाठी येथे परत या.",
"openGithub": "GitHub उघडा",
+ "openGitlab": "GitLab उघडा",
+ "openBitbucket": "Bitbucket उघडा",
"refreshRepositories": "रिपॉझिटरींची यादी रिफ्रेश करा",
"githubConnected": "GitHub कनेक्ट झाले",
+ "gitlabConnected": "GitLab कनेक्ट झाले",
"noRepositoriesVisible": "कोणतीही रिपॉझिटरी दिसत नाही. Kilo GitHub अॅपला रिपॉझिटरी वापरण्याची परवानगी आहे का ते तपासा, नंतर रिफ्रेश करा.",
+ "noRepositoriesVisibleGitlab": "कोणतीही रिपॉझिटरी दिसत नाही. GitLab वरील रिपॉझिटरी वापरण्याची परवानगी तपासा, नंतर रिफ्रेश करा.",
+ "noRepositoriesVisibleBitbucket": "कोणतीही रिपॉझिटरी दिसत नाही. Bitbucket वरील रिपॉझिटरी वापरण्याची परवानगी तपासा, नंतर रिफ्रेश करा.",
+ "bitbucketOrganizationsOnly": "Bitbucket फक्त संघटनांसाठी उपलब्ध आहे.",
+ "branchPickerTitle": "ब्रँच निवडा",
+ "branchDefault": "डीफॉल्ट",
+ "branchAccessibility": "ब्रँच: {{label}}",
+ "branchLoading": "ब्रँच लोड होत आहेत",
+ "branchLoadError": "ब्रँच लोड करता आल्या नाहीत",
+ "branchUnavailable": "या रिपॉझिटरीसाठी ब्रँच उपलब्ध नाहीत. पुरवठादाराकडे तुमचा प्रवेश तपासा, मग दुसरी रिपॉझिटरी निवडा.",
+ "branchEmpty": "कोणत्याही ब्रँच उपलब्ध नाहीत",
+ "branchPlaceholder": "एक ब्रँच निवडा",
"runOnWithTarget": "यावर चालवा: {{target}}",
"environment": "कार्यपरिसर",
"couldNotLoadEnvironment": "तुमचा कार्यपरिसर लोड करता आला नाही.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "रिपॉझिटरींची यादी रिफ्रेश करता आली नाही. कृपया पुन्हा प्रयत्न करा.",
"discardDraftTitle": "मसुदा रद्द करायचा?",
"discardDraftMessage": "तुमचा प्रॉम्प्ट हटवला जाईल.",
+ "discardWithUploadsMessage": "तुमचा प्रॉम्प्ट आणि पाठवलेल्या संदेशांना संलग्न नसलेल्या अपलोड केलेल्या फाइल्स हटवल्या जातील.",
"discardFailed": "मसुदा रद्द करता आला नाही. कृपया पुन्हा प्रयत्न करा.",
"remoteHint": "स्थानिक kilo प्रक्रिया नियंत्रित करण्यासाठी तुमच्या संगणकावर `kilo remote` चालवा किंवा चालू CLI सत्रात `/remote` चालवा.",
- "connectBitbucketDescription": "तुमच्या ब्राउझरमध्ये Bitbucket कनेक्ट करा, नंतर रिपॉझिटरी निवडण्यासाठी येथे परत या.",
- "connectGitlabDescription": "तुमच्या ब्राउझरमध्ये GitLab कनेक्ट करा, नंतर रिपॉझिटरी निवडण्यासाठी येथे परत या.",
- "couldNotLoadBitbucketRepositories": "Bitbucket रिपॉझिटरी लोड करता आल्या नाहीत.",
- "couldNotLoadGithubRepositories": "GitHub रिपॉझिटरी लोड करता आल्या नाहीत.",
- "couldNotLoadGitlabRepositories": "GitLab रिपॉझिटरी लोड करता आल्या नाहीत.",
- "gitlabConnected": "GitLab कनेक्ट झाले",
- "noRepositoriesVisibleBitbucket": "कोणतीही रिपॉझिटरी दिसत नाही. Bitbucket वरील रिपॉझिटरी वापरण्याची परवानगी तपासा, नंतर रिफ्रेश करा.",
- "noRepositoriesVisibleGitlab": "कोणतीही रिपॉझिटरी दिसत नाही. GitLab वरील रिपॉझिटरी वापरण्याची परवानगी तपासा, नंतर रिफ्रेश करा.",
- "openBitbucket": "Bitbucket उघडा",
- "openGitlab": "GitLab उघडा",
- "recentlyUsed": "अलीकडे वापरलेले",
"continueFrom": "{{title}} हे सत्र पुढे सुरू होत आहे.",
"importingSession": "सत्र आयात होत आहे",
"cliCannotContinue": "हे CLI सत्र सुरू ठेवू शकत नाही. Cloud Agent किंवा दुसरे CLI निवडा.",
- "importFailed": "हे सत्र आयात करता आले नाही.",
- "discardWithUploadsMessage": "तुमचा प्रॉम्प्ट आणि पाठवलेल्या संदेशांना संलग्न नसलेल्या अपलोड केलेल्या फाइल्स हटवल्या जातील."
+ "importFailed": "हे सत्र आयात करता आले नाही."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} फाइल अद्ययावत केली.",
diff --git a/apps/mobile/src/i18n/locales/ms.json b/apps/mobile/src/i18n/locales/ms.json
index 8379b30ae8..a909f635fc 100644
--- a/apps/mobile/src/i18n/locales/ms.json
+++ b/apps/mobile/src/i18n/locales/ms.json
@@ -36,6 +36,7 @@
"cost": "Kos",
"discard": "Buang",
"findings": "Dapatan",
+ "mergeRequest": "permintaan gabungan",
"notConnected": "Tidak disambungkan",
"notifications": "Pemberitahuan",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Baris perbezaan kod kosong"
},
"connectionExpired": "Sambungan GitHub telah tamat tempoh.",
+ "capabilities": {
+ "banner": {
+ "title": "Tidak tersedia pada penyedia ini",
+ "accessibility": "Tidak tersedia pada penyedia ini: {{reason}}"
+ }
+ },
"merge": {
"merge": "Gabungan",
"mergeNow": "Gabungkan sekarang",
"mergePullRequest": "Gabungkan permintaan tarik",
+ "mergeTermTitle": "Gabungkan {{term}}",
"enableAutoMerge": "Dayakan penggabungan automatik",
"disableAutoMerge": "Nyahdayakan penggabungan automatik",
"autoMergeOn": "Penggabungan automatik aktif",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Padam cabang selepas penggabungan",
"noEnabledMethods": "Tiada kaedah penggabungan yang didayakan untuk repositori ini. Minta pentadbir repositori mendayakan penggabungan biasa, pemadatan komit, atau pengasasan semula.",
"confirmTitle": "Gabungkan permintaan tarik?",
+ "confirmTitleTerm": "Gabungkan {{term}}?",
"confirmMessage": "Perubahan anda akan digabungkan ke dalam cabang asas.",
"enableAutoMergeConfirmTitle": "Dayakan penggabungan automatik?",
"enableAutoMergeConfirmMessage": "GitHub akan menggabungkan permintaan tarik ini secara automatik apabila semua pemeriksaan wajib lulus.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} akan digabungkan secara automatik setelah pipeline berjaya.",
+ "enableAutoMergeDescriptionTerm": "GitLab menggabungkan {{term}} ini secara automatik setelah pipeline berjaya.",
"forbidden": "Anda tidak mempunyai kebenaran untuk menggabungkan permintaan tarik ini.",
"cannotMerge": "Permintaan tarik ini tidak boleh digabungkan dalam keadaan sekarang.",
"couldNotMerge": "Tidak dapat menggabungkan permintaan tarik.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Sudah digabungkan",
- "closed": "Permintaan tarik ini telah ditutup"
+ "closed": "Permintaan tarik ini telah ditutup",
+ "closedMergeRequest": "Permintaan gabungan ini telah ditutup"
},
"partialSuccessBanner": {
"body": "Tidak dapat memadam cabang: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Permintaan tarik ini belum boleh digabungkan",
"notMergeableDetail": "GitHub melaporkan status kebolehgabungan: {{state}}."
},
+ "restrictions": {
+ "title": "Sekatan penggabungan",
+ "approvalsRequired_one": "{{displayCount}} kelulusan diperlukan",
+ "approvalsRequired_other": "{{displayCount}} kelulusan diperlukan",
+ "pipelineMustSucceed": "Pipeline mesti berjaya sebelum penggabungan."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline gagal pada komit terbaharu.",
+ "pendingPipeline": "Pipeline masih berjalan pada komit terbaharu.",
+ "permission": "Anda tidak mempunyai kebenaran untuk menggabungkan {{term}} ini.",
+ "draft": "Tandakan {{term}} sebagai sedia untuk disemak sebelum membuat penggabungan."
+ },
"methodLabels": {
"merge": "Cipta komit gabungan",
"squash": "Padatkan komit dan gabungkan",
@@ -448,6 +472,7 @@
"acceptTerms": "Terima",
"replyBadRequest": "Balasan ini tidak dapat disiarkan. Rantaian perbincangan ini mungkin telah berubah.",
"replyForbidden": "Anda tidak mempunyai kebenaran untuk membalas permintaan tarik ini.",
+ "replyForbiddenTerm": "Anda tidak mempunyai kebenaran untuk membalas {{term}} ini.",
"moderation": {
"reportContent": {
"terminal": "Komen ini tidak boleh dilaporkan.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Semak permintaan tarik",
"headLine": "{{counts}} · komit terkini {{sha}}",
"entry": {
- "eyebrow": "Buka permintaan tarik melalui URL.",
- "pastePrLink": "Tampal pautan PR",
- "noRecentPrs": "Tiada PR terkini",
- "noRecentPrsDescription": "Tampal pautan PR di atas untuk memulakan semakan. PR itu akan muncul di sini selepas ini.",
+ "eyebrow": "Buka permintaan tarik atau permintaan gabungan melalui URL",
+ "pastePrLink": "Tampal pautan permintaan tarik atau permintaan gabungan",
+ "noRecentPrs": "Tiada semakan terkini",
+ "noRecentPrsDescription": "Tampal pautan di atas untuk memulakan semakan — ia akan muncul di sini pada kali berikutnya.",
"couldNotLoad": "Tidak dapat memuatkan data.",
"removeFromRecentsTitle": "Alih keluar daripada senarai terkini?",
- "removeFromRecentsMessage": "Permintaan tarik ini akan dialih keluar daripada senarai terkini anda.",
+ "removeFromRecentsMessage": "Semakan ini akan dialih keluar daripada senarai terkini anda.",
"removeRecentAccessibility": "Alih keluar {{repo}} daripada senarai terkini",
- "urlAccessibility": "URL permintaan tarik GitHub",
- "clearLink": "Kosongkan pautan permintaan tarik",
- "pasteLink": "Tampal pautan permintaan tarik",
+ "urlAccessibility": "Masukkan URL permintaan tarik atau permintaan gabungan",
+ "urlPlaceholder": "URL permintaan tarik atau permintaan gabungan",
+ "openAccessibility": "Buka permintaan tarik atau permintaan gabungan",
+ "clearLink": "Kosongkan pautan",
+ "pasteLink": "Tampal pautan permintaan tarik atau permintaan gabungan",
"open": "Buka"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Tidak dapat menyemak sambungan GitHub.",
"checkFailedMessage": "Status log masuk hanya tersedia selepas data ini dimuatkan.",
+ "checkFailedTitleGitLab": "Tidak dapat menyemak sambungan GitLab.",
+ "checkFailedTitleBitbucket": "Tidak dapat menyemak sambungan Bitbucket.",
+ "providerCheckFailedMessage": "Status sambungan tidak tersedia sehingga ia dimuatkan.",
"reconnectTitle": "Sambung semula ke GitHub",
"reconnectDescription": "Sambungan GitHub anda telah dibatalkan. Sambung semula untuk terus menyemak permintaan tarik pada peranti mudah alih.",
- "description": "Sambungkan akaun GitHub anda untuk menyemak permintaan tarik pada peranti mudah alih."
+ "description": "Sambungkan akaun GitHub anda untuk menyemak permintaan tarik pada peranti mudah alih.",
+ "gitlabDescription": "Sambungkan akaun GitLab anda untuk menyemak permintaan gabungan pada mudah alih.",
+ "bitbucketDescription": "Sambungkan Bitbucket ke organisasi ini untuk menyemak permintaan tarik pada mudah alih.",
+ "bitbucketOrgOnlyDescription": "Pilih organisasi dalam profil anda untuk menyemak permintaan tarik Bitbucketnya."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Sambungan GitHub telah tamat tempoh.",
- "message": "Sambungan GitHub anda tidak lagi sah. Semak semula sambungan anda. Anda akan diminta menyambung semula jika perlu."
+ "message": "Sambungan GitHub anda tidak lagi sah. Semak semula sambungan anda. Anda akan diminta menyambung semula jika perlu.",
+ "gitlabTitle": "Sambungan GitLab telah tamat tempoh.",
+ "bitbucketTitle": "Sambungan Bitbucket telah tamat tempoh.",
+ "providerMessage": "Sambungan {{provider}} anda tidak lagi sah. Semak semula sambungan anda. Anda akan diminta menyambung semula jika perlu."
},
"eventChips": {
"comment": "Komen",
@@ -643,6 +679,21 @@
"files": "Fail",
"discussion": "Perbincangan"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Permintaan gabungan",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Kongsi permintaan gabungan",
+ "viewOnProvider": "Lihat pada {{provider}}",
+ "mergeRequestUnavailable": "Permintaan gabungan tidak tersedia",
+ "unavailableDescription": "Ia mungkin telah dipadamkan, atau anda tiada akses kepadanya.",
+ "accessDeniedMergeRequest": "Anda tidak mempunyai kebenaran untuk melihat permintaan gabungan ini.",
+ "couldNotLoadMergeRequest": "Tidak dapat memuatkan permintaan gabungan.",
+ "discussionAccessDenied": "Anda tidak mempunyai kebenaran untuk melihat perbincangan permintaan gabungan ini.",
+ "discussionUnavailableMessage": "Permintaan gabungan ini mungkin telah dialih keluar.",
+ "noDiscussionDescription": "Belum ada rantaian semakan atau komen perbualan pada permintaan gabungan ini.",
+ "noFilesChangedDescription": "Tiada perubahan pada fail dalam permintaan gabungan ini."
+ },
"fileStatus": {
"modified": "Diubah suai",
"renamed": "Dinamakan semula",
@@ -659,7 +710,7 @@
"emptyLine": "(kosong)"
},
"linkPasteClipboardEmpty": "Papan keratan kosong.",
- "linkPasteNotAPullRequest": "Ini bukan pautan permintaan tarik GitHub.",
+ "linkPasteNotAPullRequest": "Ini bukan pautan permintaan tarik atau permintaan gabungan",
"announce": {
"commentPosted": "Komen disiarkan",
"reviewSubmitted": "Semakan dihantar",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Komen ini tidak boleh disiarkan. Baris yang dipilih mungkin telah berubah, atau PR mungkin telah dikemas kini.",
"reviewNotSubmitted": "Semakan ini tidak dapat dihantar dalam keadaan sekarang. PR mungkin telah berubah, atau anda cuba menyemak permintaan tarik anda sendiri.",
+ "reviewNotSubmittedTerm": "Semakan ini tidak dapat dihantar seperti sedia ada. {{term}} mungkin telah berubah, atau anda tidak boleh menyemak {{term}} anda sendiri.",
"couldNotPostComment": "Tidak dapat menyiarkan komen.",
"couldNotSubmitReview": "Tidak dapat menghantar semakan. Semak sambungan anda dan cuba lagi."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Tidak dapat membalas.",
"couldNotCompleteAction": "Tidak dapat menyelesaikan tindakan ini.",
"mergeResultDefaultError": "GitHub tidak menyelesaikan penggabungan.",
+ "mergeResultNotCompleted": "{{term}} tidak digabungkan. Semak keadaannya dan cuba lagi.",
"ambiguous": "Tidak dapat mengesahkan hasil tindakan. Semak PR sebelum mencuba lagi.",
"persistenceFailed": "Kami tidak dapat merekodkan tindakan ini. Sila cuba lagi kemudian.",
"forbidden": "Tindakan ini tidak dibenarkan."
@@ -1988,11 +2041,31 @@
"retryConnection": "Cuba sambung semula"
},
"newSession": {
+ "recentlyUsed": "Digunakan baru-baru ini",
+ "couldNotLoadGithubRepositories": "Tidak dapat memuatkan repositori GitHub.",
+ "couldNotLoadGitlabRepositories": "Tidak dapat memuatkan repositori GitLab.",
+ "couldNotLoadBitbucketRepositories": "Tidak dapat memuatkan repositori Bitbucket.",
"connectGithubDescription": "Sambungkan GitHub dalam pelayar anda, kemudian kembali ke sini untuk memilih repositori.",
+ "connectGitlabDescription": "Sambungkan GitLab dalam pelayar anda, kemudian kembali ke sini untuk memilih repositori.",
+ "connectBitbucketDescription": "Sambungkan Bitbucket dalam pelayar anda, kemudian kembali ke sini untuk memilih repositori.",
"openGithub": "Buka GitHub",
+ "openGitlab": "Buka GitLab",
+ "openBitbucket": "Buka Bitbucket",
"refreshRepositories": "Muat semula repositori",
"githubConnected": "GitHub disambungkan",
+ "gitlabConnected": "GitLab disambungkan",
"noRepositoriesVisible": "Tiada repositori dipaparkan. Semak akses repositori untuk apl GitHub Kilo, kemudian muat semula.",
+ "noRepositoriesVisibleGitlab": "Tiada repositori dipaparkan. Semak akses repositori untuk GitLab, kemudian muat semula.",
+ "noRepositoriesVisibleBitbucket": "Tiada repositori dipaparkan. Semak akses repositori untuk Bitbucket, kemudian muat semula.",
+ "bitbucketOrganizationsOnly": "Bitbucket hanya tersedia untuk organisasi.",
+ "branchPickerTitle": "Pilih cabang",
+ "branchDefault": "Lalai",
+ "branchAccessibility": "Cabang: {{label}}",
+ "branchLoading": "Memuatkan cabang",
+ "branchLoadError": "Tidak dapat memuatkan cabang",
+ "branchUnavailable": "Cabang tidak tersedia untuk repositori ini. Semak akses anda dengan penyedia, kemudian pilih repositori lain.",
+ "branchEmpty": "Tiada cabang tersedia",
+ "branchPlaceholder": "Pilih satu cabang",
"runOnWithTarget": "Jalankan pada: {{target}}",
"environment": "Persekitaran",
"couldNotLoadEnvironment": "Tidak dapat memuatkan persekitaran anda.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Tidak dapat memuatkan semula repositori. Sila cuba semula.",
"discardDraftTitle": "Buang draf?",
"discardDraftMessage": "Gesaan anda akan hilang.",
+ "discardWithUploadsMessage": "Gesaan anda dan fail yang dimuat naik tetapi tidak dilampirkan pada mesej yang dihantar akan dipadam.",
"discardFailed": "Tidak dapat membuang draf. Sila cuba semula.",
"remoteHint": "Jalankan `kilo remote` pada komputer anda, atau `/remote` dalam sesi CLI yang berjalan, untuk mengawal proses kilo tempatan.",
- "connectBitbucketDescription": "Sambungkan Bitbucket dalam pelayar anda, kemudian kembali ke sini untuk memilih repositori.",
- "connectGitlabDescription": "Sambungkan GitLab dalam pelayar anda, kemudian kembali ke sini untuk memilih repositori.",
- "couldNotLoadBitbucketRepositories": "Tidak dapat memuatkan repositori Bitbucket.",
- "couldNotLoadGithubRepositories": "Tidak dapat memuatkan repositori GitHub.",
- "couldNotLoadGitlabRepositories": "Tidak dapat memuatkan repositori GitLab.",
- "gitlabConnected": "GitLab disambungkan",
- "noRepositoriesVisibleBitbucket": "Tiada repositori dipaparkan. Semak akses repositori untuk Bitbucket, kemudian muat semula.",
- "noRepositoriesVisibleGitlab": "Tiada repositori dipaparkan. Semak akses repositori untuk GitLab, kemudian muat semula.",
- "openBitbucket": "Buka Bitbucket",
- "openGitlab": "Buka GitLab",
- "recentlyUsed": "Digunakan baru-baru ini",
- "cliCannotContinue": "CLI ini tidak dapat meneruskan sesi. Pilih Cloud Agent atau CLI lain.",
"continueFrom": "Sesi {{title}} diteruskan.",
- "importFailed": "Tidak dapat mengimport sesi ini.",
"importingSession": "Mengimport sesi",
- "discardWithUploadsMessage": "Gesaan anda dan fail yang dimuat naik tetapi tidak dilampirkan pada mesej yang dihantar akan dipadam."
+ "cliCannotContinue": "CLI ini tidak dapat meneruskan sesi. Pilih Cloud Agent atau CLI lain.",
+ "importFailed": "Tidak dapat mengimport sesi ini."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} fail telah dikemas kini.",
diff --git a/apps/mobile/src/i18n/locales/mt.json b/apps/mobile/src/i18n/locales/mt.json
index 0b7e238d00..25e958b230 100644
--- a/apps/mobile/src/i18n/locales/mt.json
+++ b/apps/mobile/src/i18n/locales/mt.json
@@ -36,6 +36,7 @@
"cost": "Spiża",
"discard": "Warrab",
"findings": "Sejbiet",
+ "mergeRequest": "merge request",
"notConnected": "Mhux imqabbad",
"notifications": "Notifiki",
"pullRequest": "pR",
@@ -346,10 +347,17 @@
"emptyDiffRow": "Ringiela vojta tad-differenzi"
},
"connectionExpired": "Il-konnessjoni ma' GitHub skadiet.",
+ "capabilities": {
+ "banner": {
+ "title": "Mhux disponibbli ma' dan il-fornitur",
+ "accessibility": "Mhux disponibbli ma' dan il-fornitur: {{reason}}"
+ }
+ },
"merge": {
"merge": "Għaqda",
"mergeNow": "Għaqqad issa",
"mergePullRequest": "Għaqda tat-talba",
+ "mergeTermTitle": "Għaqda tal-{{term}}",
"enableAutoMerge": "Attiva l-għaqda awtomatika",
"disableAutoMerge": "Iddiżattiva l-għaqda awtomatika",
"autoMergeOn": "Għaqda awtomatika attiva",
@@ -368,9 +376,12 @@
"deleteBranchAfterMerge": "Ħassar il-fergħa wara l-għaqda",
"noEnabledMethods": "Dan ir-repożitorju m'għandu l-ebda metodu ta' għaqda attiv. Itlob lil amministratur tar-repożitorju biex jattiva l-għaqda, il-konsolidazzjoni jew it-tibdil tal-bażi.",
"confirmTitle": "Trid tgħaqqad it-talba?",
+ "confirmTitleTerm": "Trid tgħaqqad il-{{term}}?",
"confirmMessage": "Dan se jgħaqqad il-bidliet tiegħek mal-fergħa bażi.",
"enableAutoMergeConfirmTitle": "Trid tattiva l-għaqda awtomatika?",
"enableAutoMergeConfirmMessage": "GitHub se jgħaqqad din it-talba għall-għaqda awtomatikament meta jgħaddu l-kontrolli kollha meħtieġa.",
+ "enableAutoMergeConfirmMessageTerm": "Il-{{term}} se jiġi mgħaqqad awtomatikament ladarba l-pipeline tirnexxi.",
+ "enableAutoMergeDescriptionTerm": "GitLab igħaqqad dan il-{{term}} awtomatikament ladarba l-pipeline tirnexxi.",
"forbidden": "M'għandekx permess biex tgħaqqad din it-talba għall-għaqda.",
"cannotMerge": "Din it-talba għall-għaqda ma tistax tingħaqad kif inhi.",
"couldNotMerge": "It-talba għall-għaqda ma setgħetx tingħaqad.",
@@ -381,7 +392,8 @@
},
"terminal": {
"alreadyMerged": "Diġà magħquda",
- "closed": "Din it-talba għall-għaqda hija magħluqa"
+ "closed": "Din it-talba għall-għaqda hija magħluqa",
+ "closedMergeRequest": "Dan il-merge request huwa magħluq"
},
"partialSuccessBanner": {
"body": "Ma setgħetx titħassar il-fergħa: {{reason}}.",
@@ -407,6 +419,21 @@
"notMergeableTitle": "Din it-talba għall-għaqda għadha ma tistax tingħaqad",
"notMergeableDetail": "GitHub irrapporta l-istat {{state}} għall-possibbiltà tal-għaqda."
},
+ "restrictions": {
+ "title": "Restrizzjonijiet fuq l-għaqda",
+ "approvalsRequired_one": "Hemm bżonn {{displayCount}} approvazzjoni",
+ "approvalsRequired_other": "Hemm bżonn {{displayCount}} approvazzjonijiet",
+ "pipelineMustSucceed": "Il-pipeline trid tirnexxi qabel l-għaqda.",
+ "approvalsRequired_many": "Hemm bżonn {{displayCount}} approvazzjonijiet",
+ "approvalsRequired_few": "Hemm bżonn {{displayCount}} approvazzjonijiet",
+ "approvalsRequired_two": "Hemm bżonn {{displayCount}} approvazzjonijiet"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Il-pipeline qed tfalli fl-aħħar reġistrazzjoni.",
+ "pendingPipeline": "Il-pipeline għadha sejra fl-aħħar reġistrazzjoni.",
+ "permission": "M'għandekx permess biex tgħaqqad dan il-{{term}}.",
+ "draft": "Immarka l-{{term}} bħala lest għar-reviżjoni qabel ma tgħaqqdu."
+ },
"methodLabels": {
"merge": "Oħloq reġistrazzjoni tal-għaqda",
"squash": "Ikkonsolida u għaqqad",
@@ -454,6 +481,7 @@
"acceptTerms": "Aċċetta",
"replyBadRequest": "Din ir-risposta ma tistax tiġi ppubblikata. Is-sensiela ta' kummenti setgħet inbidlet.",
"replyForbidden": "M'għandekx permess biex tirrispondi għal din it-talba għall-għaqda.",
+ "replyForbiddenTerm": "M'għandekx permess biex tirrispondi għal dan il-{{term}}.",
"moderation": {
"reportContent": {
"terminal": "Dan il-kumment ma jistax jiġi rrapportat.",
@@ -485,12 +513,6 @@
"termsAcceptRequired": "Trid taċċetta t-termini tas-servizz biex tippubblika.",
"termsOutdatedCopy": "It-termini tas-servizz inbidlu. Erġa' iftaħ dan l-iskrin biex taċċetta l-aħħar verżjoni.",
"termsCheckRetryCopy": "Ma setgħux jiġu ċċekkjati t-termini tas-servizz. Iċċekkja l-konnessjoni tiegħek u erġa' pprova.",
- "comment_two": "{{displayCount}} kummenti",
- "comment_few": "{{displayCount}} kummenti",
- "comment_many": "{{displayCount}}-il kumment",
- "reaction_two": "reazzjonijiet",
- "reaction_few": "reazzjonijiet",
- "reaction_many": "reazzjoni",
"reactions": {
"thumbsUp": "Is-saba' l-kbir 'il fuq",
"thumbsDown": "Is-saba' l-kbir 'l isfel",
@@ -508,7 +530,13 @@
"outdatedOnLines": "Mhux aġġornat fuq {{lines}}",
"outdatedOnPath": "Mhux aġġornat fuq {{path}}"
},
- "deletedUser": "utent imħassar"
+ "deletedUser": "utent imħassar",
+ "comment_two": "{{displayCount}} kummenti",
+ "comment_few": "{{displayCount}} kummenti",
+ "comment_many": "{{displayCount}}-il kumment",
+ "reaction_two": "reazzjonijiet",
+ "reaction_few": "reazzjonijiet",
+ "reaction_many": "reazzjoni"
},
"couldNotOpenGitHubAppSettings": "Ma stajniex niftħu l-issettjar tal-app ta' GitHub.",
"installKiloGitHubApp": "Installa l-app ta' Kilo għal GitHub",
@@ -520,17 +548,19 @@
"reviewPullRequest": "Irrevedi t-talba għall-għaqda",
"headLine": "{{counts}} · l-aħħar reġistrazzjoni {{sha}}",
"entry": {
- "eyebrow": "Iftaħ talba għall-għaqda permezz ta' URL.",
- "pastePrLink": "Waħħal ħolqa ta' PR",
- "noRecentPrs": "L-ebda PR riċenti",
- "noRecentPrsDescription": "Waħħal ħolqa ta' PR hawn fuq biex tibda reviżjoni — il-PR jidher hawn id-darba li jmiss.",
+ "eyebrow": "Iftaħ PR jew merge request permezz ta' URL",
+ "pastePrLink": "Waħħal ħolqa ta' PR jew merge request",
+ "noRecentPrs": "L-ebda reviżjoni riċenti",
+ "noRecentPrsDescription": "Waħħal ħolqa hawn fuq biex tibda reviżjoni — id-darba li jmiss tidher hawn.",
"couldNotLoad": "Ma setax jitgħabba l-kontenut.",
"removeFromRecentsTitle": "Trid tneħħiha mir-riċenti?",
- "removeFromRecentsMessage": "Din it-talba għall-għaqda se titneħħa mil-lista tar-riċenti tiegħek.",
+ "removeFromRecentsMessage": "Din ir-reviżjoni se titneħħa mil-lista tar-riċenti tiegħek.",
"removeRecentAccessibility": "Neħħi {{repo}} mir-riċenti",
- "urlAccessibility": "URL ta' talba għall-għaqda fuq GitHub",
- "clearLink": "Neħħi l-ħolqa tat-talba għall-għaqda",
- "pasteLink": "Waħħal il-ħolqa tat-talba għall-għaqda",
+ "urlAccessibility": "Daħħal URL ta' PR jew merge request",
+ "urlPlaceholder": "URL ta' PR jew merge request",
+ "openAccessibility": "Iftaħ PR jew merge request",
+ "clearLink": "Neħħi l-ħolqa",
+ "pasteLink": "Waħħal il-ħolqa ta' PR jew merge request",
"open": "Ftuħ"
},
"checks": {
@@ -579,9 +609,15 @@
"connect": {
"checkFailedTitle": "Ma setgħetx tiġi ċċekkjata l-konnessjoni ma' GitHub.",
"checkFailedMessage": "L-istatus tad-dħul mhux disponibbli sakemm jitgħabba dan il-kontenut.",
+ "checkFailedTitleGitLab": "Ma setgħetx tiġi ċċekkjata l-konnessjoni ma' GitLab.",
+ "checkFailedTitleBitbucket": "Ma setgħetx tiġi ċċekkjata l-konnessjoni ma' Bitbucket.",
+ "providerCheckFailedMessage": "L-istat tal-konnessjoni mhux disponibbli sakemm jitgħabba.",
"reconnectTitle": "Erġa' kkonnetta GitHub",
"reconnectDescription": "L-aċċess tiegħek għal GitHub ġie revokat. Erġa' kkonnetta biex tkompli tirrevedi t-talbiet għall-għaqda fuq il-mowbajl.",
- "description": "Ikkonnetta l-kont ta' GitHub tiegħek biex tirrevedi t-talbiet għall-għaqda fuq il-mowbajl."
+ "description": "Ikkonnetta l-kont ta' GitHub tiegħek biex tirrevedi t-talbiet għall-għaqda fuq il-mowbajl.",
+ "gitlabDescription": "Ikkonnettja l-kont GitLab tiegħek biex tirrevedi l-merge requests fuq il-mowbajl.",
+ "bitbucketDescription": "Ikkonnettja Bitbucket ma' din l-organizzazzjoni biex tirrevedi l-PRs fuq il-mowbajl.",
+ "bitbucketOrgOnlyDescription": "Agħżel organizzazzjoni fil-profil tiegħek biex tirrevedi l-PRs tagħha fuq Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -606,7 +642,10 @@
},
"reconnectNotice": {
"title": "Il-konnessjoni ma' GitHub skadiet.",
- "message": "Il-konnessjoni tiegħek ma' GitHub m'għadhiex valida. Erġa' ċċekkja l-konnessjoni — jekk ikun hemm bżonn, tintalab terġa' tikkonnettja."
+ "message": "Il-konnessjoni tiegħek ma' GitHub m'għadhiex valida. Erġa' ċċekkja l-konnessjoni — jekk ikun hemm bżonn, tintalab terġa' tikkonnettja.",
+ "gitlabTitle": "Il-konnessjoni ma' GitLab skadiet.",
+ "bitbucketTitle": "Il-konnessjoni ma' Bitbucket skadiet.",
+ "providerMessage": "Il-konnessjoni tiegħek ma' {{provider}} m'għadhiex valida. Erġa' ċċekkja l-konnessjoni — jekk ikun hemm bżonn, tintalab terġa' tikkonnettja."
},
"eventChips": {
"comment": "Kumment",
@@ -664,6 +703,21 @@
"files": "Fajls",
"discussion": "Diskussjoni"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Aqsam il-merge request",
+ "viewOnProvider": "Ara fuq {{provider}}",
+ "mergeRequestUnavailable": "Il-merge request mhux disponibbli",
+ "unavailableDescription": "Fori ġiet imħassra, jew fori m'għandekx aċċess għaliha.",
+ "accessDeniedMergeRequest": "M'għandekx permess biex tara dan il-merge request.",
+ "couldNotLoadMergeRequest": "Ma setgħax jitgħabba l-merge request.",
+ "discussionAccessDenied": "M'għandekx permess biex tara d-diskussjoni ta' dan il-merge request.",
+ "discussionUnavailableMessage": "Dan il-merge request setgħa tneħħa.",
+ "noDiscussionDescription": "Dan il-merge request għadu m'għandhu l-ebda sensiela ta' kummenti ta' reviżjoni jew kummenti fid-diskussjoni.",
+ "noFilesChangedDescription": "Dan il-merge request m'għandux bidliet fil-fajls."
+ },
"fileStatus": {
"modified": "Modifikat",
"renamed": "Isem mibdul",
@@ -680,7 +734,7 @@
"emptyLine": "(vojt)"
},
"linkPasteClipboardEmpty": "Il-klibbord huwa vojt.",
- "linkPasteNotAPullRequest": "Din mhix ħolqa ta' talba għall-għaqda fuq GitHub.",
+ "linkPasteNotAPullRequest": "Din mhix ħolqa ta' PR jew merge request",
"announce": {
"commentPosted": "Il-kumment ġie ppubblikat",
"reviewSubmitted": "Ir-reviżjoni ntbagħtet",
@@ -689,6 +743,7 @@
"mutationError": {
"commentNotPosted": "Dan il-kumment ma jistax jiġi ppubblikat. Il-linja magħżula setgħet inbidlet, jew il-PR seta' ġie aġġornat.",
"reviewNotSubmitted": "Din ir-reviżjoni ma tistax tintbagħat kif inhi. Il-PR seta' nbidel, jew ma tistax tirrevedi t-talba għall-għaqda tiegħek stess.",
+ "reviewNotSubmittedTerm": "Din ir-reviżjoni ma tistax tintbagħat hekk kif inhi. Il-{{term}} fori nbidel, jew ma tistax tirrevedi l-{{term}} tiegħek stess.",
"couldNotPostComment": "Ma setax jiġi ppubblikat il-kumment.",
"couldNotSubmitReview": "Ma setgħetx tintbagħat ir-reviżjoni. Iċċekkja l-konnessjoni tiegħek u erġa' pprova."
},
@@ -696,6 +751,7 @@
"couldNotReply": "Ma stajniex nibagħtu t-tweġiba.",
"couldNotCompleteAction": "Ma setgħetx titlesta din l-azzjoni.",
"mergeResultDefaultError": "GitHub ma temmx l-għaqda.",
+ "mergeResultNotCompleted": "Il-{{term}} ma ngħaqadx. Iċċekkja l-istat tiegħu u erġa' pprova.",
"ambiguous": "Ma stajniex nikkonfermaw ir-riżultat — iċċekkja l-PR qabel terġa' tipprova.",
"persistenceFailed": "Ma stajniex nirreġistraw din l-azzjoni. Jekk jogħġbok erġa' pprova aktar tard.",
"forbidden": "Din l-azzjoni mhix permessa."
@@ -2036,11 +2092,31 @@
"retryConnection": "Erġa' pprova taqbad"
},
"newSession": {
+ "recentlyUsed": "Użati reċentement",
+ "couldNotLoadGithubRepositories": "Ma setgħux jitgħabbew ir-repożitorji ta' GitHub.",
+ "couldNotLoadGitlabRepositories": "Ma setgħux jitgħabbew ir-repożitorji ta' GitLab.",
+ "couldNotLoadBitbucketRepositories": "Ma setgħux jitgħabbew ir-repożitorji ta' Bitbucket.",
"connectGithubDescription": "Qabbad GitHub fil-brawżer tiegħek, imbagħad erġa' lura hawn biex tagħżel repożitorju.",
+ "connectGitlabDescription": "Qabbad GitLab fil-brawżer tiegħek, imbagħad erġa' lura hawn biex tagħżel repożitorju.",
+ "connectBitbucketDescription": "Qabbad Bitbucket fil-brawżer tiegħek, imbagħad erġa' lura hawn biex tagħżel repożitorju.",
"openGithub": "Iftaħ GitHub",
+ "openGitlab": "Iftaħ GitLab",
+ "openBitbucket": "Iftaħ Bitbucket",
"refreshRepositories": "Aġġorna r-repożitorji",
"githubConnected": "GitHub imqabbad",
+ "gitlabConnected": "GitLab imqabbad",
"noRepositoriesVisible": "Ma jidher l-ebda repożitorju. Iċċekkja l-aċċess għar-repożitorji tal-applikazzjoni Kilo għal GitHub, imbagħad aġġorna.",
+ "noRepositoriesVisibleGitlab": "Ma jidher l-ebda repożitorju. Iċċekkja l-aċċess għar-repożitorji għal GitLab, imbagħad aġġorna.",
+ "noRepositoriesVisibleBitbucket": "Ma jidher l-ebda repożitorju. Iċċekkja l-aċċess għar-repożitorji għal Bitbucket, imbagħad aġġorna.",
+ "bitbucketOrganizationsOnly": "Bitbucket huwa disponibbli għall-organizzazzjonijiet biss.",
+ "branchPickerTitle": "Agħżel fergħa",
+ "branchDefault": "Predefinit",
+ "branchAccessibility": "Fergħa: {{label}}",
+ "branchLoading": "Tagħbija tal-fergħat",
+ "branchLoadError": "Ma setgħetx titgħabba l-fergħat",
+ "branchUnavailable": "M'hemmx fergħat disponibbli għal dan ir-repożitorju. Iċċekkja l-aċċess tiegħek mal-fornitur, imbagħad agħżel repożitorju ieħor.",
+ "branchEmpty": "Ebda fergħa disponibbli",
+ "branchPlaceholder": "Agħżel fergħa",
"runOnWithTarget": "Ħaddem fuq: {{target}}",
"environment": "Ambjent",
"couldNotLoadEnvironment": "Ma setax jitgħabba l-ambjent tiegħek.",
@@ -2061,24 +2137,13 @@
"couldNotRefreshRepositories": "Ma setgħux jiġu aġġornati r-repożitorji. Erġa' pprova.",
"discardDraftTitle": "Twarrab l-abbozz?",
"discardDraftMessage": "L-istruzzjoni tiegħek se tintilef.",
+ "discardWithUploadsMessage": "L-istruzzjoni tiegħek u kull fajl imtella' li għadu mhux mehmuż ma' messaġġ mibgħut se jitħassru.",
"discardFailed": "Ma setax jitwarrab l-abbozz. Erġa' pprova.",
"remoteHint": "Ħaddem `kilo remote` fuq il-kompjuter tiegħek, jew `/remote` f'sessjoni CLI li għaddejja, biex tikkontrolla proċess lokali ta' kilo.",
- "connectBitbucketDescription": "Qabbad Bitbucket fil-brawżer tiegħek, imbagħad erġa' lura hawn biex tagħżel repożitorju.",
- "connectGitlabDescription": "Qabbad GitLab fil-brawżer tiegħek, imbagħad erġa' lura hawn biex tagħżel repożitorju.",
- "couldNotLoadBitbucketRepositories": "Ma setgħux jitgħabbew ir-repożitorji ta' Bitbucket.",
- "couldNotLoadGithubRepositories": "Ma setgħux jitgħabbew ir-repożitorji ta' GitHub.",
- "couldNotLoadGitlabRepositories": "Ma setgħux jitgħabbew ir-repożitorji ta' GitLab.",
- "gitlabConnected": "GitLab imqabbad",
- "noRepositoriesVisibleBitbucket": "Ma jidher l-ebda repożitorju. Iċċekkja l-aċċess għar-repożitorji għal Bitbucket, imbagħad aġġorna.",
- "noRepositoriesVisibleGitlab": "Ma jidher l-ebda repożitorju. Iċċekkja l-aċċess għar-repożitorji għal GitLab, imbagħad aġġorna.",
- "openBitbucket": "Iftaħ Bitbucket",
- "openGitlab": "Iftaħ GitLab",
- "recentlyUsed": "Użati reċentement",
"continueFrom": "Qed tkompli s-sessjoni {{title}}.",
"importingSession": "Qed tiġi importata s-sessjoni",
"cliCannotContinue": "Dan il-CLI ma jistax ikompli sessjoni. Agħżel Cloud Agent jew CLI ieħor.",
- "importFailed": "Ma setgħetx tiġi importata din is-sessjoni.",
- "discardWithUploadsMessage": "L-istruzzjoni tiegħek u kull fajl imtella' li għadu mhux mehmuż ma' messaġġ mibgħut se jitħassru."
+ "importFailed": "Ma setgħetx tiġi importata din is-sessjoni."
},
"partRenderer": {
"updatedFileCount_one": "Ġie aġġornat {{displayCount}} fajl.",
diff --git a/apps/mobile/src/i18n/locales/my.json b/apps/mobile/src/i18n/locales/my.json
index d9cf73a6f8..5f7795a250 100644
--- a/apps/mobile/src/i18n/locales/my.json
+++ b/apps/mobile/src/i18n/locales/my.json
@@ -36,6 +36,7 @@
"cost": "ကုန်ကျစရိတ်",
"discard": "ပယ်ဖျက်ပါ",
"findings": "တွေ့ရှိချက်များ",
+ "mergeRequest": "merge request",
"notConnected": "မချိတ်ဆက်ထား",
"notifications": "အသိပေးချက်များ",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ကွာခြားချက် အတန်းအလွတ်"
},
"connectionExpired": "GitHub ချိတ်ဆက်မှု သက်တမ်းကုန်သွားပါပြီ။",
+ "capabilities": {
+ "banner": {
+ "title": "ဤဝန်ဆောင်မှုပေးသူတွင် မရရှိနိုင်ပါ",
+ "accessibility": "ဤဝန်ဆောင်မှုပေးသူတွင် မရရှိနိုင်ပါ: {{reason}}"
+ }
+ },
"merge": {
"merge": "ပေါင်းစည်းခြင်း",
"mergeNow": "ယခု ပေါင်းစည်းပါ",
"mergePullRequest": "PR ပေါင်းစည်းခြင်း",
+ "mergeTermTitle": "{{term}} ပေါင်းစည်းခြင်း",
"enableAutoMerge": "အလိုအလျောက် ပေါင်းစည်းမှုကို ဖွင့်ပါ",
"disableAutoMerge": "အလိုအလျောက် ပေါင်းစည်းမှုကို ပိတ်ပါ",
"autoMergeOn": "အလိုအလျောက် ပေါင်းစည်းမှု ဖွင့်ထားသည်",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "ပေါင်းစည်းပြီးနောက် ဘရန်ချ်ကို ဖျက်ပါ",
"noEnabledMethods": "ဒီကုဒ်သိုလှောင်ရာတွင် ပေါင်းစည်းနည်းတစ်ခုမျှ ဖွင့်မထားပါ။ ပေါင်းစည်းခြင်း၊ တစ်ခုတည်းချုံ့ခြင်း သို့မဟုတ် အခြေခံပြောင်းခြင်းနည်းကို ဖွင့်ပေးရန် ကုဒ်သိုလှောင်ရာ၏ စီမံခန့်ခွဲသူကို တောင်းဆိုပါ။",
"confirmTitle": "PR ကို ပေါင်းစည်းမလား",
+ "confirmTitleTerm": "{{term}} ကို ပေါင်းစည်းမလား",
"confirmMessage": "သင့်ပြောင်းလဲမှုများကို အခြေခံဘရန်ချ်ထဲသို့ ပေါင်းစည်းပါမည်။",
"enableAutoMergeConfirmTitle": "အလိုအလျောက် ပေါင်းစည်းမှုကို ဖွင့်မလား",
"enableAutoMergeConfirmMessage": "လိုအပ်သော စစ်ဆေးမှုအားလုံး အောင်မြင်လျှင် GitHub က ဒီ PR ကို အလိုအလျောက် ပေါင်းစည်းပါမည်။",
+ "enableAutoMergeConfirmMessageTerm": "ပိုက်လိုင်းအောင်မြင်ပါ {{term}} ကို အလိုအလျောက် ပေါင်းစည်းမည်။",
+ "enableAutoMergeDescriptionTerm": "ပိုက်လိုင်းအောင်မြင်ပါ GitLab က ဤ{{term}}ကို အလိုအလျောက် ပေါင်းစည်းမည်။",
"forbidden": "ဒီ PR ကို ပေါင်းစည်းခွင့် မရှိပါ။",
"cannotMerge": "ဒီ PR ကို လက်ရှိအတိုင်း ပေါင်းစည်း၍မရပါ။",
"couldNotMerge": "PR ကို ပေါင်းစည်း၍မရပါ။",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "ပေါင်းစည်းပြီးပါပြီ",
- "closed": "ဒီ PR ကို ပိတ်ထားသည်"
+ "closed": "ဒီ PR ကို ပိတ်ထားသည်",
+ "closedMergeRequest": "ဒီ merge request ကို ပိတ်ထားသည်"
},
"partialSuccessBanner": {
"body": "ဘရန်ချ်ကို ဖျက်၍မရပါ: {{reason}}။",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ဒီ PR ကို ပေါင်းစည်း၍မရသေးပါ",
"notMergeableDetail": "GitHub က ပေါင်းစည်းနိုင်မှု အခြေအနေကို {{state}} ဟု ဖော်ပြထားပါသည်။"
},
+ "restrictions": {
+ "title": "ပေါင်းစည်းမှု ပိတ်ပင်တားမြစ်ချက်များ",
+ "approvalsRequired_one": "{{displayCount}} ခု အတည်ပြုချက် လိုအပ်သည်",
+ "approvalsRequired_other": "{{displayCount}} ခု အတည်ပြုချက်များ လိုအပ်သည်",
+ "pipelineMustSucceed": "ပေါင်းစည်းမီ ပိုက်လိုင်း အောင်မြင်ရမည်။"
+ },
+ "providerBlocked": {
+ "failingPipeline": "နောက်ဆုံးကွန်မစ်တွင် ပိုက်လိုင်း ရှုံးနိမ့်နေသည်။",
+ "pendingPipeline": "နောက်ဆုံးကွန်မစ်တွင် ပိုက်လိုင်း ဆက်လက်လည်ပတ်နေဆဲဖြစ်သည်။",
+ "permission": "ဒီ {{term}} ကို ပေါင်းစည်းခွင့် မရှိပါ။",
+ "draft": "မပေါင်းစည်းမီ {{term}} ကို သုံးသပ်ရန်အသင့်အဖြစ် မှတ်သားပါ။"
+ },
"methodLabels": {
"merge": "ပေါင်းစည်းကွန်မစ်ကို ဖန်တီးပါ",
"squash": "တစ်ခုတည်းချုံ့ပြီး ပေါင်းစည်းပါ",
@@ -448,6 +472,7 @@
"acceptTerms": "လက်ခံပါ",
"replyBadRequest": "ဒီအကြောင်းပြန်စာကို တင်၍မရပါ။ ဆွေးနွေးချက်တွဲ ပြောင်းလဲသွားခြင်း ဖြစ်နိုင်ပါသည်။",
"replyForbidden": "ဒီ PR တွင် အကြောင်းပြန်ခွင့် မရှိပါ။",
+ "replyForbiddenTerm": "ဒီ {{term}} တွင် အကြောင်းပြန်ခွင့် မရှိပါ။",
"moderation": {
"reportContent": {
"terminal": "ဒီမှတ်ချက်ကို တိုင်ကြား၍မရပါ။",
@@ -508,17 +533,19 @@
"reviewPullRequest": "PR ကို သုံးသပ်ပါ",
"headLine": "{{counts}} · နောက်ဆုံးကွန်မစ် {{sha}}",
"entry": {
- "eyebrow": "URL ဖြင့် PR ကို ဖွင့်ပါ။",
- "pastePrLink": "PR လင့်ခ်ကူးထည့်ပါ",
- "noRecentPrs": "မကြာသေးမီက ကြည့်ထားသော PR မရှိပါ",
- "noRecentPrsDescription": "သုံးသပ်မှုစတင်ရန် အပေါ်တွင် PR လင့်ခ်ကို ကူးထည့်ပါ။ နောက်တစ်ကြိမ်တွင် ဒီနေရာ၌ ပေါ်လာပါမည်။",
+ "eyebrow": "URL ဖြင့် PR သို့မဟုတ် merge request ကို ဖွင့်ပါ",
+ "pastePrLink": "PR သို့မဟုတ် merge request လင့်ခ်ကို ကူးထည့်ပါ",
+ "noRecentPrs": "မကြာသေးမီက သုံးသပ်ချက်များ မရှိပါ",
+ "noRecentPrsDescription": "သုံးသပ်မှုစရန် အပေါ်တွင် လင့်ခ်ကို ကူးထည့်ပါ — နောက်တစ်ကြိမ်တွင် ဤနေရာ၌ ပေါ်လာမည်။",
"couldNotLoad": "ရယူ၍မရပါ။",
"removeFromRecentsTitle": "မကြာသေးမီက ကြည့်ထားသော စာရင်းမှ ဖယ်ရှားမလား",
- "removeFromRecentsMessage": "ဒီ PR ကို မကြာသေးမီက ကြည့်ထားသော စာရင်းမှ ဖယ်ရှားပါမည်။",
+ "removeFromRecentsMessage": "ဤသုံးသပ်ချက်ကို သင့်မကြာသေးမီက စာရင်းမှ ဖယ်ရှားပါမည်။",
"removeRecentAccessibility": "{{repo}} ကို မကြာသေးမီက ကြည့်ထားသော စာရင်းမှ ဖယ်ရှားပါ",
- "urlAccessibility": "GitHub PR ၏ URL",
- "clearLink": "PR လင့်ခ်ကို ရှင်းပါ",
- "pasteLink": "PR လင့်ခ်ကို ကူးထည့်ပါ",
+ "urlAccessibility": "PR သို့မဟုတ် merge request URL ကို ထည့်သွင်းပါ",
+ "urlPlaceholder": "PR သို့မဟုတ် merge request URL",
+ "openAccessibility": "PR သို့မဟုတ် merge request ကို ဖွင့်ရန်",
+ "clearLink": "လင့်ခ်ကို ရှင်းပါ",
+ "pasteLink": "PR သို့မဟုတ် merge request လင့်ခ်ကို ကူးထည့်ပါ",
"open": "ဖွင့်"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub ချိတ်ဆက်မှုကို စစ်ဆေး၍မရပါ။",
"checkFailedMessage": "အချက်အလက် ရယူပြီးမှသာ အကောင့်ဝင်ထားခြင်း ရှိမရှိ သိနိုင်ပါမည်။",
+ "checkFailedTitleGitLab": "GitLab ချိတ်ဆက်မှုကို စစ်ဆေး၍မရပါ။",
+ "checkFailedTitleBitbucket": "Bitbucket ချိတ်ဆက်မှုကို စစ်ဆေး၍မရပါ။",
+ "providerCheckFailedMessage": "၎င်းတိုင် လိုက်ဒ်မဖြစ်မီ ချိတ်ဆက်မှုအခြေအနေ မရရှိနိုင်ပါ။",
"reconnectTitle": "GitHub ပြန်ချိတ်ဆက်ခြင်း",
"reconnectDescription": "သင့် GitHub ချိတ်ဆက်ခွင့်ကို ရုပ်သိမ်းထားပါသည်။ ဖုန်းပေါ်တွင် PR များကို ဆက်သုံးသပ်ရန် ပြန်ချိတ်ဆက်ပါ။",
- "description": "ဖုန်းပေါ်တွင် PR များကို သုံးသပ်ရန် သင့် GitHub အကောင့်ကို ချိတ်ဆက်ပါ။"
+ "description": "ဖုန်းပေါ်တွင် PR များကို သုံးသပ်ရန် သင့် GitHub အကောင့်ကို ချိတ်ဆက်ပါ။",
+ "gitlabDescription": "ဖုန်းပေါ်တွင် merge request များကို သုံးသပ်ရန် သင့် GitLab အကောင့်ကို ချိတ်ဆက်ပါ။",
+ "bitbucketDescription": "ဖုန်းပေါ်တွင် PR များကို သုံးသပ်ရန် ဤအဖွဲ့ကို Bitbucket နှင့် ချိတ်ဆက်ပါ။",
+ "bitbucketOrgOnlyDescription": "၎င်း၏ Bitbucket PR များကို သုံးသပ်ရန် သင့်ပရိုဖိုင်တွင် အဖွဲ့တစ်ခုကို ရွေးချယ်ပါ။"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub ချိတ်ဆက်မှု သက်တမ်းကုန်သွားပါပြီ။",
- "message": "သင့် GitHub ချိတ်ဆက်မှုကို အသုံးပြု၍မရတော့ပါ။ ချိတ်ဆက်မှုကို ပြန်စစ်ဆေးပါ။ လိုအပ်လျှင် ပြန်ချိတ်ဆက်ရန် တောင်းဆိုပါမည်။"
+ "message": "သင့် GitHub ချိတ်ဆက်မှုကို အသုံးပြု၍မရတော့ပါ။ ချိတ်ဆက်မှုကို ပြန်စစ်ဆေးပါ။ လိုအပ်လျှင် ပြန်ချိတ်ဆက်ရန် တောင်းဆိုပါမည်။",
+ "gitlabTitle": "GitLab ချိတ်ဆက်မှု သက်တမ်းကုန်သွားပါပြီ။",
+ "bitbucketTitle": "Bitbucket ချိတ်ဆက်မှု သက်တမ်းကုန်သွားပါပြီ။",
+ "providerMessage": "သင့် {{provider}} ချိတ်ဆက်မှုကို အသုံးပြု၍မရတော့ပါ။ ချိတ်ဆက်မှုကို ပြန်စစ်ဆေးပါ။ လိုအပ်လျှင် ပြန်ချိတ်ဆက်ရန် တောင်းဆိုပါမည်။"
},
"eventChips": {
"comment": "မှတ်ချက်",
@@ -643,6 +679,21 @@
"files": "ဖိုင်",
"discussion": "ဆွေးနွေးချက်"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Merge request ကို မျှဝေပါ",
+ "viewOnProvider": "{{provider}} တွင် ကြည့်ရန်",
+ "mergeRequestUnavailable": "Merge request မရနိုင်ပါ",
+ "unavailableDescription": "၎င်းကို ဖယ်ရှားထားခြင်း ဖြစ်နိုင်သည်၊ သို့မဟုတ် သင့်တွင် ဝင်ရောက်ခွင့် မရှိနိုင်ပါ။",
+ "accessDeniedMergeRequest": "ဒီ merge request ကို ကြည့်ရှုခွင့် မရှိပါ။",
+ "couldNotLoadMergeRequest": "Merge request ကို ရယူ၍မရပါ။",
+ "discussionAccessDenied": "ဒီ merge request ၏ ဆွေးနွေးချက်ကို ကြည့်ရှုခွင့် မရှိပါ။",
+ "discussionUnavailableMessage": "ဒီ merge request ကို ဖယ်ရှားထားခြင်း ဖြစ်နိုင်ပါသည်။",
+ "noDiscussionDescription": "ဒီ merge request တွင် သုံးသပ်မှု ဆွေးနွေးချက်တွဲများ သို့မဟုတ် စကားဝိုင်းမှတ်ချက်များ မရှိပါ။",
+ "noFilesChangedDescription": "ဒီ merge request တွင် ဖိုင်ပြောင်းလဲမှု မရှိပါ။"
+ },
"fileStatus": {
"modified": "ပြုပြင်ပြီး",
"renamed": "အမည်ပြောင်းပြီး",
@@ -659,7 +710,7 @@
"emptyLine": "(ဗလာ)"
},
"linkPasteClipboardEmpty": "ကလစ်ဘုတ်တွင် ဘာမျှမရှိပါ။",
- "linkPasteNotAPullRequest": "GitHub PR လင့်ခ် မဟုတ်ပါ။",
+ "linkPasteNotAPullRequest": "ဤသည် PR သို့မဟုတ် merge request လင့်ခ် မဟုတ်ပါ",
"announce": {
"commentPosted": "မှတ်ချက် တင်ပြီးပါပြီ",
"reviewSubmitted": "သုံးသပ်မှု တင်သွင်းပြီးပါပြီ",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ဒီမှတ်ချက်ကို တင်၍မရပါ။ ရွေးထားသော စာကြောင်း ပြောင်းလဲသွားခြင်း သို့မဟုတ် PR ကို မွမ်းမံထားခြင်း ဖြစ်နိုင်ပါသည်။",
"reviewNotSubmitted": "ဒီသုံးသပ်မှုကို လက်ရှိအတိုင်း တင်၍မရပါ။ PR ပြောင်းလဲသွားခြင်း သို့မဟုတ် ကိုယ်ပိုင် PR ကို သုံးသပ်ခွင့်မရှိခြင်းကြောင့် ဖြစ်နိုင်ပါသည်။",
+ "reviewNotSubmittedTerm": "ဤသုံးသပ်ချက်ကို ဤအတိုင်း တင်သွင်း၍မရပါ။ {{term}} ပြောင်းလဲသွားခြင်း ဖြစ်နိုင်သည်၊ သို့မဟုတ် သင့်ကိုယ်ပိုင် {{term}} ကို သုံးသပ်၍မရပါ။",
"couldNotPostComment": "မှတ်ချက်ကို တင်၍မရပါ။",
"couldNotSubmitReview": "သုံးသပ်မှုကို တင်၍မရပါ။ အင်တာနက်ချိတ်ဆက်မှုကို စစ်ဆေးပြီး ထပ်စမ်းကြည့်ပါ။"
},
@@ -675,6 +727,7 @@
"couldNotReply": "အကြောင်းမပြန်နိုင်ပါ။",
"couldNotCompleteAction": "ဒီလုပ်ဆောင်ချက်ကို အပြီးသတ်၍မရပါ။",
"mergeResultDefaultError": "GitHub က ပေါင်းစည်းမှုကို အပြီးမသတ်ခဲ့ပါ။",
+ "mergeResultNotCompleted": "{{term}} ပေါင်းစည်းခြင်း မဖြစ်ပါ။ ၎င်း၏အခြေအနေကို စစ်ဆေးပြီး ပြန်ကြိုးစားပါ။",
"ambiguous": "လုပ်ဆောင်မှုရလဒ်ကို အတည်ပြု၍မရပါ။ ထပ်မစမ်းမီ PR ကို စစ်ဆေးပါ။",
"persistenceFailed": "ဒီလုပ်ဆောင်ချက်ကို မှတ်တမ်းတင်၍မရပါ။ နောက်မှ ထပ်စမ်းကြည့်ပါ။",
"forbidden": "လုပ်ဆောင်ခွင့် မရှိပါ။"
@@ -1988,11 +2041,31 @@
"retryConnection": "ထပ်ချိတ်ဆက်ကြည့်ပါ"
},
"newSession": {
+ "recentlyUsed": "မကြာသေးမီက အသုံးပြုထားသည့်အရာများ",
+ "couldNotLoadGithubRepositories": "GitHub ကုဒ်သိုလှောင်ခန်းများကို ရယူ၍မရပါ။",
+ "couldNotLoadGitlabRepositories": "GitLab ကုဒ်သိုလှောင်ခန်းများကို ရယူ၍မရပါ။",
+ "couldNotLoadBitbucketRepositories": "Bitbucket ကုဒ်သိုလှောင်ခန်းများကို ရယူ၍မရပါ။",
"connectGithubDescription": "ဘရောက်ဆာတွင် GitHub ကို ချိတ်ဆက်ပါ။ ထို့နောက် ကုဒ်သိုလှောင်ခန်းတစ်ခု ရွေးရန် ဤနေရာသို့ ပြန်လာပါ။",
+ "connectGitlabDescription": "ဘရောက်ဆာတွင် GitLab ကို ချိတ်ဆက်ပါ။ ထို့နောက် ကုဒ်သိုလှောင်ခန်းတစ်ခု ရွေးရန် ဤနေရာသို့ ပြန်လာပါ။",
+ "connectBitbucketDescription": "ဘရောက်ဆာတွင် Bitbucket ကို ချိတ်ဆက်ပါ။ ထို့နောက် ကုဒ်သိုလှောင်ခန်းတစ်ခု ရွေးရန် ဤနေရာသို့ ပြန်လာပါ။",
"openGithub": "GitHub ဖွင့်ပါ",
+ "openGitlab": "GitLab ဖွင့်ပါ",
+ "openBitbucket": "Bitbucket ဖွင့်ပါ",
"refreshRepositories": "ကုဒ်သိုလှောင်ခန်းစာရင်းကို ပြန်လည်ရယူပါ",
"githubConnected": "GitHub ချိတ်ဆက်ပြီး",
+ "gitlabConnected": "GitLab ချိတ်ဆက်ပြီး",
"noRepositoriesVisible": "ကုဒ်သိုလှောင်ခန်းများကို မတွေ့ရပါ။ Kilo GitHub အက်ပ်၏ ကုဒ်သိုလှောင်ခန်းဝင်ရောက်ခွင့်ကို စစ်ဆေးပြီး စာရင်းကို ပြန်လည်ရယူပါ။",
+ "noRepositoriesVisibleGitlab": "ကုဒ်သိုလှောင်ခန်းများကို မတွေ့ရပါ။ GitLab ၏ ကုဒ်သိုလှောင်ခန်းဝင်ရောက်ခွင့်ကို စစ်ဆေးပြီး စာရင်းကို ပြန်လည်ရယူပါ။",
+ "noRepositoriesVisibleBitbucket": "ကုဒ်သိုလှောင်ခန်းများကို မတွေ့ရပါ။ Bitbucket ၏ ကုဒ်သိုလှောင်ခန်းဝင်ရောက်ခွင့်ကို စစ်ဆေးပြီး စာရင်းကို ပြန်လည်ရယူပါ။",
+ "bitbucketOrganizationsOnly": "Bitbucket ကို အဖွဲ့များအတွက်သာ ရနိုင်ပါသည်။",
+ "branchPickerTitle": "ခွဲကို ရွေးချယ်ပါ",
+ "branchDefault": "ပုံသေ",
+ "branchAccessibility": "ခွဲ: {{label}}",
+ "branchLoading": "ခွဲများ လိုက်ဒ်တင်နေသည်",
+ "branchLoadError": "ခွဲများကို လိုက်ဒ်တင်၍မရပါ",
+ "branchUnavailable": "ဤရီပိုထရီအတွက် ခွဲများ မရရှိနိုင်ပါ။ ဝန်ဆောင်မှုပေးသူထံ သင့်ဝင်ရောက်ခွင့်ကို စစ်ဆေးပြီးနောက် အခြားရီပိုထရီကို ရွေးချယ်ပါ။",
+ "branchEmpty": "ရရှိနိုင်သော ခွဲများ မရှိပါ",
+ "branchPlaceholder": "ခွဲတစ်ခုကို ရွေးချယ်ပါ",
"runOnWithTarget": "လုပ်ဆောင်မည့်နေရာ- {{target}}",
"environment": "လုပ်ဆောင်မှုပတ်ဝန်းကျင်",
"couldNotLoadEnvironment": "သင့်လုပ်ဆောင်မှုပတ်ဝန်းကျင်ကို ရယူ၍မရပါ။",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "ကုဒ်သိုလှောင်ခန်းစာရင်းကို ပြန်လည်ရယူ၍မရပါ။ ထပ်ကြိုးစားပါ။",
"discardDraftTitle": "မူကြမ်းကို ပယ်ဖျက်မလား။",
"discardDraftMessage": "သင့်ညွှန်ကြားချက် ပျောက်သွားပါမည်။",
+ "discardWithUploadsMessage": "သင့်ညွှန်ကြားချက်နှင့် မက်ဆေ့ခ်ျတွင် မပူးတွဲရသေးသော တင်ထားသည့်ဖိုင်များကို ဖျက်ပါမည်။",
"discardFailed": "မူကြမ်းကို ပယ်ဖျက်၍မရခဲ့ပါ။ ထပ်ကြိုးစားပါ။",
"remoteHint": "သင့်ကွန်ပျူတာရှိ kilo လုပ်ငန်းစဉ်ကို ထိန်းချုပ်ရန် ကွန်ပျူတာတွင် `kilo remote` ကို လုပ်ဆောင်ပါ၊ သို့မဟုတ် လုပ်ဆောင်နေသော CLI စက်ရှင်တွင် `/remote` ကို သုံးပါ။",
- "connectBitbucketDescription": "ဘရောက်ဆာတွင် Bitbucket ကို ချိတ်ဆက်ပါ။ ထို့နောက် ကုဒ်သိုလှောင်ခန်းတစ်ခု ရွေးရန် ဤနေရာသို့ ပြန်လာပါ။",
- "connectGitlabDescription": "ဘရောက်ဆာတွင် GitLab ကို ချိတ်ဆက်ပါ။ ထို့နောက် ကုဒ်သိုလှောင်ခန်းတစ်ခု ရွေးရန် ဤနေရာသို့ ပြန်လာပါ။",
- "couldNotLoadBitbucketRepositories": "Bitbucket ကုဒ်သိုလှောင်ခန်းများကို ရယူ၍မရပါ။",
- "couldNotLoadGithubRepositories": "GitHub ကုဒ်သိုလှောင်ခန်းများကို ရယူ၍မရပါ။",
- "couldNotLoadGitlabRepositories": "GitLab ကုဒ်သိုလှောင်ခန်းများကို ရယူ၍မရပါ။",
- "gitlabConnected": "GitLab ချိတ်ဆက်ပြီး",
- "noRepositoriesVisibleBitbucket": "ကုဒ်သိုလှောင်ခန်းများကို မတွေ့ရပါ။ Bitbucket ၏ ကုဒ်သိုလှောင်ခန်းဝင်ရောက်ခွင့်ကို စစ်ဆေးပြီး စာရင်းကို ပြန်လည်ရယူပါ။",
- "noRepositoriesVisibleGitlab": "ကုဒ်သိုလှောင်ခန်းများကို မတွေ့ရပါ။ GitLab ၏ ကုဒ်သိုလှောင်ခန်းဝင်ရောက်ခွင့်ကို စစ်ဆေးပြီး စာရင်းကို ပြန်လည်ရယူပါ။",
- "openBitbucket": "Bitbucket ဖွင့်ပါ",
- "openGitlab": "GitLab ဖွင့်ပါ",
- "recentlyUsed": "မကြာသေးမီက အသုံးပြုထားသည့်အရာများ",
"continueFrom": "{{title}} ကို ဆက်လုပ်နေပါသည်။",
"importingSession": "စက်ရှင်ကို တင်သွင်းနေသည်",
"cliCannotContinue": "ဤ CLI ဖြင့် စက်ရှင်ကို ဆက်လုပ်၍မရပါ။ Cloud Agent သို့မဟုတ် အခြား CLI တစ်ခုကို ရွေးပါ။",
- "importFailed": "ဤစက်ရှင်ကို တင်သွင်း၍မရပါ။",
- "discardWithUploadsMessage": "သင့်ညွှန်ကြားချက်နှင့် မက်ဆေ့ခ်ျတွင် မပူးတွဲရသေးသော တင်ထားသည့်ဖိုင်များကို ဖျက်ပါမည်။"
+ "importFailed": "ဤစက်ရှင်ကို တင်သွင်း၍မရပါ။"
},
"partRenderer": {
"updatedFileCount_one": "ဖိုင် {{displayCount}} ခုကို ပြင်ဆင်ပြီးပါပြီ။",
diff --git a/apps/mobile/src/i18n/locales/nb.json b/apps/mobile/src/i18n/locales/nb.json
index da969c8522..b6f35a71c4 100644
--- a/apps/mobile/src/i18n/locales/nb.json
+++ b/apps/mobile/src/i18n/locales/nb.json
@@ -36,6 +36,7 @@
"cost": "Kostnad",
"discard": "Forkast",
"findings": "Funn",
+ "mergeRequest": "merge request",
"notConnected": "Ikke tilkoblet",
"notifications": "Varsler",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Tom rad i endringsvisningen"
},
"connectionExpired": "GitHub-tilkoblingen er utløpt.",
+ "capabilities": {
+ "banner": {
+ "title": "Ikke tilgjengelig hos denne leverandøren",
+ "accessibility": "Ikke tilgjengelig hos denne leverandøren: {{reason}}"
+ }
+ },
"merge": {
"merge": "Fletting",
"mergeNow": "Flett nå",
"mergePullRequest": "Flett PR",
+ "mergeTermTitle": "Flett {{term}}",
"enableAutoMerge": "Aktiver automatisk fletting",
"disableAutoMerge": "Deaktiver automatisk fletting",
"autoMergeOn": "Automatisk fletting er på",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Slett gren etter fletting",
"noEnabledMethods": "Ingen flettemetoder er aktivert for dette kodelageret. Be en administrator aktivere vanlig fletting, sammenslåing eller ombasering.",
"confirmTitle": "Flette PR-en?",
+ "confirmTitleTerm": "Flette {{term}}?",
"confirmMessage": "Dette fletter endringene dine inn i målgrenen.",
"enableAutoMergeConfirmTitle": "Aktivere automatisk fletting?",
"enableAutoMergeConfirmMessage": "GitHub fletter denne PR-en automatisk når alle påkrevde sjekker er bestått.",
+ "enableAutoMergeConfirmMessageTerm": "Når pipeline er vellykket, blir {{term}} flettet automatisk.",
+ "enableAutoMergeDescriptionTerm": "GitLab fletter denne {{term}} automatisk når pipeline er vellykket.",
"forbidden": "Du har ikke tillatelse til å flette denne PR-en.",
"cannotMerge": "Denne PR-en kan ikke flettes slik den er nå.",
"couldNotMerge": "Kunne ikke flette PR-en.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Allerede flettet",
- "closed": "Denne PR-en er lukket"
+ "closed": "Denne PR-en er lukket",
+ "closedMergeRequest": "Denne merge request-en er lukket"
},
"partialSuccessBanner": {
"body": "Kunne ikke slette grenen: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Denne PR-en kan ikke flettes ennå",
"notMergeableDetail": "GitHub rapporterte følgende flettestatus: {{state}}."
},
+ "restrictions": {
+ "title": "Flettebegrensninger",
+ "approvalsRequired_one": "{{displayCount}} godkjenning kreves",
+ "approvalsRequired_other": "{{displayCount}} godkjenninger kreves",
+ "pipelineMustSucceed": "Pipeline må være vellykket før fletting."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline feiler på siste commit.",
+ "pendingPipeline": "Pipeline kjører fortsatt på siste commit.",
+ "permission": "Du har ikke tillatelse til å flette denne {{term}}.",
+ "draft": "Merk denne {{term}} som klar for kodegjennomgang før du fletter."
+ },
"methodLabels": {
"merge": "Opprett en flettecommit",
"squash": "Slå sammen og flett",
@@ -448,6 +472,7 @@
"acceptTerms": "Godta",
"replyBadRequest": "Dette svaret kan ikke publiseres. Tråden kan ha endret seg.",
"replyForbidden": "Du har ikke tillatelse til å svare på denne PR-en.",
+ "replyForbiddenTerm": "Du har ikke tillatelse til å svare på denne {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Denne kommentaren kan ikke rapporteres.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Gå gjennom PR-en",
"headLine": "{{counts}} · siste commit {{sha}}",
"entry": {
- "eyebrow": "Åpne en PR med en URL.",
- "pastePrLink": "Lim inn en PR-lenke",
- "noRecentPrs": "Ingen nylige PR-er",
- "noRecentPrsDescription": "Lim inn en PR-lenke ovenfor for å starte en kodegjennomgang. PR-en vises her neste gang.",
+ "eyebrow": "Åpne en PR eller merge request med en URL",
+ "pastePrLink": "Lim inn en PR- eller merge request-lenke",
+ "noRecentPrs": "Ingen nylige gjennomganger",
+ "noRecentPrsDescription": "Lim inn en lenke ovenfor for å starte en kodegjennomgang — den vises her neste gang.",
"couldNotLoad": "Kunne ikke laste inn innholdet.",
"removeFromRecentsTitle": "Fjerne fra listen over nylige PR-er?",
- "removeFromRecentsMessage": "Denne PR-en fjernes fra listen over nylige PR-er.",
+ "removeFromRecentsMessage": "Denne gjennomgangen fjernes fra listen over nylige.",
"removeRecentAccessibility": "Fjern {{repo}} fra listen over nylige PR-er",
- "urlAccessibility": "URL til en PR på GitHub",
- "clearLink": "Fjern PR-lenken",
- "pasteLink": "Lim inn PR-lenke",
+ "urlAccessibility": "Skriv inn en PR- eller merge request-URL",
+ "urlPlaceholder": "URL for PR eller merge request",
+ "openAccessibility": "Åpne PR eller merge request",
+ "clearLink": "Fjern lenken",
+ "pasteLink": "Lim inn PR- eller merge request-lenke",
"open": "Åpne"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Kunne ikke sjekke GitHub-tilkoblingen.",
"checkFailedMessage": "Påloggingsstatusen er ikke tilgjengelig før innlastingen er fullført.",
+ "checkFailedTitleGitLab": "Kunne ikke sjekke GitLab-tilkoblingen.",
+ "checkFailedTitleBitbucket": "Kunne ikke sjekke Bitbucket-tilkoblingen.",
+ "providerCheckFailedMessage": "Tilkoblingsstatusen er ikke tilgjengelig før innlastingen er fullført.",
"reconnectTitle": "Koble til GitHub på nytt",
"reconnectDescription": "Tilgangen til GitHub-kontoen din er trukket tilbake. Koble til på nytt for å fortsette med kodegjennomganger av PR-er på mobilen.",
- "description": "Koble til GitHub-kontoen din for å gå gjennom PR-er på mobilen."
+ "description": "Koble til GitHub-kontoen din for å gå gjennom PR-er på mobilen.",
+ "gitlabDescription": "Koble til GitLab-kontoen din for å gå gjennom merge requests på mobilen.",
+ "bitbucketDescription": "Koble Bitbucket til denne organisasjonen for å gå gjennom PR-er på mobilen.",
+ "bitbucketOrgOnlyDescription": "Velg en organisasjon i profilen din for å gå gjennom PR-ene deres på Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub-tilkoblingen er utløpt.",
- "message": "GitHub-tilkoblingen din er ikke lenger gyldig. Sjekk den på nytt. Du blir bedt om å koble til igjen ved behov."
+ "message": "GitHub-tilkoblingen din er ikke lenger gyldig. Sjekk den på nytt. Du blir bedt om å koble til igjen ved behov.",
+ "gitlabTitle": "GitLab-tilkoblingen er utløpt.",
+ "bitbucketTitle": "Bitbucket-tilkoblingen er utløpt.",
+ "providerMessage": "{{provider}}-tilkoblingen din er ikke lenger gyldig. Sjekk den på nytt. Du blir bedt om å koble til igjen ved behov."
},
"eventChips": {
"comment": "Kommenter",
@@ -643,6 +679,21 @@
"files": "Filer",
"discussion": "Diskusjon"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Del merge request",
+ "viewOnProvider": "Vis på {{provider}}",
+ "mergeRequestUnavailable": "Merge request er utilgjengelig",
+ "unavailableDescription": "Den kan ha blitt slettet, eller du har ikke tilgang til den.",
+ "accessDeniedMergeRequest": "Du har ikke tilgang til å se denne merge request.",
+ "couldNotLoadMergeRequest": "Kunne ikke laste inn merge request.",
+ "discussionAccessDenied": "Du har ikke tilgang til diskusjonen om denne merge request.",
+ "discussionUnavailableMessage": "Denne merge request kan ha blitt fjernet.",
+ "noDiscussionDescription": "Denne merge request har ingen diskusjonstråder fra kodegjennomganger eller andre kommentarer.",
+ "noFilesChangedDescription": "Denne merge request inneholder ingen filendringer."
+ },
"fileStatus": {
"modified": "Endret",
"renamed": "Omdøpt",
@@ -659,7 +710,7 @@
"emptyLine": "(tom)"
},
"linkPasteClipboardEmpty": "Utklippstavlen er tom.",
- "linkPasteNotAPullRequest": "Dette er ikke en lenke til en PR på GitHub.",
+ "linkPasteNotAPullRequest": "Dette er ikke en lenke til en PR eller merge request",
"announce": {
"commentPosted": "Kommentar publisert",
"reviewSubmitted": "Kodegjennomgang sendt inn",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Denne kommentaren kan ikke publiseres. Den valgte linjen kan ha endret seg, eller PR-en kan ha blitt oppdatert.",
"reviewNotSubmitted": "Denne kodegjennomgangen kan ikke sendes inn slik den er nå. PR-en kan være endret, eller du prøver å gå gjennom din egen PR.",
+ "reviewNotSubmittedTerm": "Denne kodegjennomgangen kan ikke sendes inn slik den er nå. {{term}} kan være endret, eller du kan ikke gå gjennom din egen {{term}}.",
"couldNotPostComment": "Kunne ikke publisere kommentaren.",
"couldNotSubmitReview": "Kunne ikke sende inn kodegjennomgangen. Sjekk tilkoblingen og prøv igjen."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Kunne ikke sende svaret.",
"couldNotCompleteAction": "Kunne ikke fullføre denne handlingen.",
"mergeResultDefaultError": "GitHub fullførte ikke flettingen.",
+ "mergeResultNotCompleted": "{{term}} ble ikke flettet. Sjekk statusen og prøv på nytt.",
"ambiguous": "Kunne ikke bekrefte resultatet. Sjekk PR-en før du prøver igjen.",
"persistenceFailed": "Vi kunne ikke registrere denne handlingen. Prøv igjen senere.",
"forbidden": "Du har ikke tilgang."
@@ -1988,11 +2041,31 @@
"retryConnection": "Prøv å koble til på nytt"
},
"newSession": {
+ "recentlyUsed": "Nylig brukt",
+ "couldNotLoadGithubRepositories": "Kunne ikke laste inn kodelagre fra GitHub.",
+ "couldNotLoadGitlabRepositories": "Kunne ikke laste inn kodelagre fra GitLab.",
+ "couldNotLoadBitbucketRepositories": "Kunne ikke laste inn kodelagre fra Bitbucket.",
"connectGithubDescription": "Koble til GitHub i nettleseren. Gå deretter tilbake hit for å velge et kodelager.",
+ "connectGitlabDescription": "Koble til GitLab i nettleseren. Gå deretter tilbake hit for å velge et kodelager.",
+ "connectBitbucketDescription": "Koble til Bitbucket i nettleseren. Gå deretter tilbake hit for å velge et kodelager.",
"openGithub": "Åpne GitHub",
+ "openGitlab": "Åpne GitLab",
+ "openBitbucket": "Åpne Bitbucket",
"refreshRepositories": "Oppdater kodelagre",
"githubConnected": "GitHub tilkoblet",
+ "gitlabConnected": "GitLab tilkoblet",
"noRepositoriesVisible": "Ingen kodelagre vises. Sjekk hvilke kodelagre Kilos GitHub-app har tilgang til, og oppdater listen.",
+ "noRepositoriesVisibleGitlab": "Ingen kodelagre vises. Sjekk tilgangen til kodelagrene på GitLab, og oppdater listen.",
+ "noRepositoriesVisibleBitbucket": "Ingen kodelagre vises. Sjekk tilgangen til kodelagrene på Bitbucket, og oppdater listen.",
+ "bitbucketOrganizationsOnly": "Bitbucket er kun tilgjengelig for organisasjoner.",
+ "branchPickerTitle": "Velg gren",
+ "branchDefault": "Standard",
+ "branchAccessibility": "Gren: {{label}}",
+ "branchLoading": "Laster inn grener",
+ "branchLoadError": "Kunne ikke laste inn grener",
+ "branchUnavailable": "Ingen grener er tilgjengelige for dette kodelageret. Sjekk tilgangen din hos leverandøren og velg et annet kodelager.",
+ "branchEmpty": "Ingen tilgjengelige grener",
+ "branchPlaceholder": "Velg en gren",
"runOnWithTarget": "Kjør på: {{target}}",
"environment": "Miljø",
"couldNotLoadEnvironment": "Kunne ikke laste inn miljøet ditt.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Kunne ikke oppdatere kodelagrene. Prøv igjen.",
"discardDraftTitle": "Forkaste utkast?",
"discardDraftMessage": "Instruksjonen din går tapt.",
+ "discardWithUploadsMessage": "Instruksjonen din og opplastede filer som ikke er vedlagt sendte meldinger, blir slettet.",
"discardFailed": "Kunne ikke forkaste utkastet. Prøv igjen.",
"remoteHint": "Kjør `kilo remote` på datamaskinen din, eller `/remote` i en aktiv CLI-økt, for å styre en lokal kilo-prosess.",
- "connectBitbucketDescription": "Koble til Bitbucket i nettleseren. Gå deretter tilbake hit for å velge et kodelager.",
- "connectGitlabDescription": "Koble til GitLab i nettleseren. Gå deretter tilbake hit for å velge et kodelager.",
- "couldNotLoadBitbucketRepositories": "Kunne ikke laste inn kodelagre fra Bitbucket.",
- "couldNotLoadGithubRepositories": "Kunne ikke laste inn kodelagre fra GitHub.",
- "couldNotLoadGitlabRepositories": "Kunne ikke laste inn kodelagre fra GitLab.",
- "gitlabConnected": "GitLab tilkoblet",
- "noRepositoriesVisibleBitbucket": "Ingen kodelagre vises. Sjekk tilgangen til kodelagrene på Bitbucket, og oppdater listen.",
- "noRepositoriesVisibleGitlab": "Ingen kodelagre vises. Sjekk tilgangen til kodelagrene på GitLab, og oppdater listen.",
- "openBitbucket": "Åpne Bitbucket",
- "openGitlab": "Åpne GitLab",
- "recentlyUsed": "Nylig brukt",
- "cliCannotContinue": "Denne CLI-en kan ikke fortsette en økt. Velg Cloud Agent eller en annen CLI.",
"continueFrom": "Fortsetter økten {{title}}.",
- "importFailed": "Kunne ikke importere denne økten.",
"importingSession": "Importerer økten",
- "discardWithUploadsMessage": "Instruksjonen din og opplastede filer som ikke er vedlagt sendte meldinger, blir slettet."
+ "cliCannotContinue": "Denne CLI-en kan ikke fortsette en økt. Velg Cloud Agent eller en annen CLI.",
+ "importFailed": "Kunne ikke importere denne økten."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} fil er oppdatert.",
diff --git a/apps/mobile/src/i18n/locales/ne.json b/apps/mobile/src/i18n/locales/ne.json
index 472255545f..4597801b15 100644
--- a/apps/mobile/src/i18n/locales/ne.json
+++ b/apps/mobile/src/i18n/locales/ne.json
@@ -36,6 +36,7 @@
"cost": "लागत",
"discard": "खारेज गर्नुहोस्",
"findings": "भेटिएका समस्या",
+ "mergeRequest": "मर्ज रिक्वेस्ट",
"notConnected": "जडान छैन",
"notifications": "सूचनाहरू",
"pullRequest": "पुल रिक्वेस्ट",
@@ -340,10 +341,17 @@
"emptyDiffRow": "परिवर्तन विवरणको खाली पङ्क्ति"
},
"connectionExpired": "GitHub जडानको म्याद सकियो।",
+ "capabilities": {
+ "banner": {
+ "title": "यस प्रदायकमा उपलब्ध छैन",
+ "accessibility": "यस प्रदायकमा उपलब्ध छैन: {{reason}}"
+ }
+ },
"merge": {
"merge": "मर्ज",
"mergeNow": "अहिले मर्ज गर्नुहोस्",
"mergePullRequest": "पुल रिक्वेस्ट मर्ज",
+ "mergeTermTitle": "{{term}} मर्ज",
"enableAutoMerge": "स्वचालित मर्ज चालू गर्नुहोस्",
"disableAutoMerge": "स्वचालित मर्ज बन्द गर्नुहोस्",
"autoMergeOn": "स्वचालित मर्ज चालू छ",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "मर्ज गरेपछि शाखा मेट्नुहोस्",
"noEnabledMethods": "यो रिपोजिटरीमा मर्ज गर्ने कुनै विधि चालू छैन। रिपोजिटरीका प्रशासकलाई मर्ज, स्क्वाश वा रिबेस विधि चालू गर्न अनुरोध गर्नुहोस्।",
"confirmTitle": "पुल रिक्वेस्ट मर्ज गर्ने?",
+ "confirmTitleTerm": "{{term}} मर्ज गर्ने?",
"confirmMessage": "यसले तपाईंका परिवर्तनहरू आधार शाखामा मर्ज गर्नेछ।",
"enableAutoMergeConfirmTitle": "स्वचालित मर्ज चालू गर्ने?",
"enableAutoMergeConfirmMessage": "सबै आवश्यक जाँचहरू सफल भएपछि GitHub ले यो पुल रिक्वेस्ट स्वतः मर्ज गर्नेछ।",
+ "enableAutoMergeConfirmMessageTerm": "पाइपलाइन सफल भएपछि {{term}} स्वचालित रूपमा मर्ज हुनेछ।",
+ "enableAutoMergeDescriptionTerm": "पाइपलाइन सफल भएपछि GitLab ले यो {{term}} स्वचालित रूपमा मर्ज गर्छ।",
"forbidden": "तपाईंसँग यो पुल रिक्वेस्ट मर्ज गर्ने अनुमति छैन।",
"cannotMerge": "यो पुल रिक्वेस्ट हालको अवस्थामा मर्ज गर्न सकिँदैन।",
"couldNotMerge": "पुल रिक्वेस्ट मर्ज गर्न सकिएन।",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "पहिले नै मर्ज भइसकेको",
- "closed": "यो पुल रिक्वेस्ट बन्द छ"
+ "closed": "यो पुल रिक्वेस्ट बन्द छ",
+ "closedMergeRequest": "यो मर्ज रिक्वेस्ट बन्द छ"
},
"partialSuccessBanner": {
"body": "शाखा मेट्न सकिएन: {{reason}}।",
@@ -401,6 +413,18 @@
"notMergeableTitle": "यो पुल रिक्वेस्ट अझै मर्ज गर्न मिल्दैन",
"notMergeableDetail": "GitHub ले मर्जसम्बन्धी अवस्था {{state}} रहेको जनाएको छ।"
},
+ "restrictions": {
+ "title": "मर्ज प्रतिबन्धहरू",
+ "approvalsRequired_one": "{{displayCount}} स्वीकृति आवश्यक",
+ "approvalsRequired_other": "{{displayCount}} स्वीकृतिहरू आवश्यक",
+ "pipelineMustSucceed": "मर्ज गर्नुअघि पाइपलाइन सफल हुनुपर्छ।"
+ },
+ "providerBlocked": {
+ "failingPipeline": "पछिल्लो कमिटमा पाइपलाइन असफल हुँदैछ।",
+ "pendingPipeline": "पछिल्लो कमिटमा पाइपलाइन अझै चलिरहेको छ।",
+ "permission": "तपाईंसँग यो {{term}} मर्ज गर्ने अनुमति छैन।",
+ "draft": "मर्ज गर्नुअघि {{term}}लाई समीक्षाका लागि तयार भनी चिन्ह लगाउनुहोस्।"
+ },
"methodLabels": {
"merge": "मर्ज कमिट सिर्जना गर्नुहोस्",
"squash": "स्क्वाश गरेर मर्ज गर्नुहोस्",
@@ -448,6 +472,7 @@
"acceptTerms": "स्वीकार गर्नुहोस्",
"replyBadRequest": "यो जवाफ पोस्ट गर्न सकिँदैन। थ्रेड परिवर्तन भएको हुन सक्छ।",
"replyForbidden": "तपाईंसँग यो पुल रिक्वेस्टमा जवाफ दिने अनुमति छैन।",
+ "replyForbiddenTerm": "तपाईंसँग यो {{term}}मा जवाफ दिने अनुमति छैन।",
"moderation": {
"reportContent": {
"terminal": "यो टिप्पणी रिपोर्ट गर्न सकिँदैन।",
@@ -508,17 +533,19 @@
"reviewPullRequest": "पुल रिक्वेस्टको समीक्षा गर्नुहोस्",
"headLine": "{{counts}} · हेड {{sha}}",
"entry": {
- "eyebrow": "URL बाट पुल रिक्वेस्ट खोल्नुहोस्।",
- "pastePrLink": "PR लिङ्क टाँस्नुहोस्",
- "noRecentPrs": "हालैका PR छैनन्",
- "noRecentPrsDescription": "समीक्षा सुरु गर्न माथि PR लिङ्क टाँस्नुहोस् — यो अर्को पटक यहाँ देखिनेछ।",
+ "eyebrow": "URL बाट पुल रिक्वेस्ट वा मर्ज रिक्वेस्ट खोल्नुहोस्",
+ "pastePrLink": "पुल रिक्वेस्ट वा मर्ज रिक्वेस्टको लिङ्क टाँस्नुहोस्",
+ "noRecentPrs": "हालैका समीक्षाहरू छैनन्",
+ "noRecentPrsDescription": "समीक्षा सुरु गर्न माथि लिङ्क टाँस्नुहोस् — यो अर्को पटक यहाँ देखिनेछ।",
"couldNotLoad": "लोड गर्न सकिएन।",
"removeFromRecentsTitle": "हालैको सूचीबाट हटाउने?",
- "removeFromRecentsMessage": "यो पुल रिक्वेस्ट तपाईंको हालैको सूचीबाट हटाइनेछ।",
+ "removeFromRecentsMessage": "यो समीक्षा तपाईंको हालैको सूचीबाट हटाइनेछ।",
"removeRecentAccessibility": "{{repo}} लाई हालैको सूचीबाट हटाउनुहोस्",
- "urlAccessibility": "GitHub पुल रिक्वेस्टको URL",
- "clearLink": "पुल रिक्वेस्टको लिङ्क हटाउनुहोस्",
- "pasteLink": "पुल रिक्वेस्टको लिङ्क टाँस्नुहोस्",
+ "urlAccessibility": "पुल रिक्वेस्ट वा मर्ज रिक्वेस्टको URL प्रविष्ट गर्नुहोस्",
+ "urlPlaceholder": "पुल रिक्वेस्ट वा मर्ज रिक्वेस्ट URL",
+ "openAccessibility": "पुल रिक्वेस्ट वा मर्ज रिक्वेस्ट खोल्नुहोस्",
+ "clearLink": "लिङ्क हटाउनुहोस्",
+ "pasteLink": "पुल रिक्वेस्ट वा मर्ज रिक्वेस्टको लिङ्क टाँस्नुहोस्",
"open": "खुला"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub जडान जाँच्न सकिएन।",
"checkFailedMessage": "यो लोड नभएसम्म साइन इनको अवस्था थाहा हुँदैन।",
+ "checkFailedTitleGitLab": "GitLab जडान जाँच्न सकिएन।",
+ "checkFailedTitleBitbucket": "Bitbucket जडान जाँच्न सकिएन।",
+ "providerCheckFailedMessage": "यो लोड नभएसम्म जडानको अवस्था उपलब्ध छैन।",
"reconnectTitle": "GitHub मा पुनः जडान",
"reconnectDescription": "तपाईंको GitHub जडानको अनुमति रद्द भएको छ। मोबाइलमा पुल रिक्वेस्टको समीक्षा जारी राख्न पुनः जडान गर्नुहोस्।",
- "description": "मोबाइलमा पुल रिक्वेस्टको समीक्षा गर्न आफ्नो GitHub खाता जडान गर्नुहोस्।"
+ "description": "मोबाइलमा पुल रिक्वेस्टको समीक्षा गर्न आफ्नो GitHub खाता जडान गर्नुहोस्।",
+ "gitlabDescription": "मोबाइलमा मर्ज रिक्वेस्टहरू समीक्षा गर्न आफ्नो GitLab खाता जडान गर्नुहोस्।",
+ "bitbucketDescription": "मोबाइलमा पुल रिक्वेस्टहरू समीक्षा गर्न यो संस्थालाई Bitbucket सँग जडान गर्नुहोस्।",
+ "bitbucketOrgOnlyDescription": "त्यसका Bitbucket पुल रिक्वेस्टहरू समीक्षा गर्न आफ्नो प्रोफाइलमा एउटा संस्था चयन गर्नुहोस्।"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub जडानको म्याद सकियो।",
- "message": "तपाईंको GitHub जडान अब मान्य छैन। तपाईंको जडान फेरि जाँच्नुहोस् — आवश्यक परेमा फेरि जडान गर्न भनिनेछ।"
+ "message": "तपाईंको GitHub जडान अब मान्य छैन। तपाईंको जडान फेरि जाँच्नुहोस् — आवश्यक परेमा फेरि जडान गर्न भनिनेछ।",
+ "gitlabTitle": "GitLab जडानको म्याद सकियो।",
+ "bitbucketTitle": "Bitbucket जडानको म्याद सकियो।",
+ "providerMessage": "तपाईंको {{provider}} जडान अब मान्य छैन। तपाईंको जडान फेरि जाँच्नुहोस् — आवश्यक परेमा फेरि जडान गर्न भनिनेछ।"
},
"eventChips": {
"comment": "टिप्पणी",
@@ -643,6 +679,21 @@
"files": "फाइलहरू",
"discussion": "छलफल"
},
+ "terms": {
+ "pullRequest": "पुल रिक्वेस्ट",
+ "mergeRequest": "मर्ज रिक्वेस्ट",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "मर्ज रिक्वेस्ट सेयर गर्नुहोस्",
+ "viewOnProvider": "{{provider}} मा हेर्नुहोस्",
+ "mergeRequestUnavailable": "मर्ज रिक्वेस्ट उपलब्ध छैन",
+ "unavailableDescription": "यो मेटिएको हुनसक्छ, वा तपाईंलाई यसको पहुँच नहुन सक्छ।",
+ "accessDeniedMergeRequest": "तपाईंसँग यो मर्ज रिक्वेस्ट हेर्ने अनुमति छैन।",
+ "couldNotLoadMergeRequest": "मर्ज रिक्वेस्ट लोड गर्न सकिएन।",
+ "discussionAccessDenied": "यो मर्ज रिक्वेस्ट को छलफल हेर्ने अनुमति तपाईंसँग छैन।",
+ "discussionUnavailableMessage": "यो मर्ज रिक्वेस्ट हटाइएको हुन सक्छ।",
+ "noDiscussionDescription": "यो मर्ज रिक्वेस्टमा समीक्षाका थ्रेड वा छलफलका टिप्पणीहरू छैनन्।",
+ "noFilesChangedDescription": "यो मर्ज रिक्वेस्टमा कुनै पनि फाइल परिवर्तन भएको छैन।"
+ },
"fileStatus": {
"modified": "परिमार्जित",
"renamed": "नाम फेरिएको",
@@ -659,7 +710,7 @@
"emptyLine": "(खाली)"
},
"linkPasteClipboardEmpty": "क्लिपबोर्ड खाली छ।",
- "linkPasteNotAPullRequest": "यो GitHub पुल रिक्वेस्टको लिङ्क होइन।",
+ "linkPasteNotAPullRequest": "यो पुल रिक्वेस्ट वा मर्ज रिक्वेस्टको लिङ्क होइन",
"announce": {
"commentPosted": "टिप्पणी पोस्ट गरियो",
"reviewSubmitted": "समीक्षा पठाइयो",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "यो टिप्पणी पोस्ट गर्न सकिँदैन। चयन गरिएको पङ्क्ति परिवर्तन भएको वा PR अद्यावधिक भएको हुन सक्छ।",
"reviewNotSubmitted": "यो समीक्षा हालको अवस्थामा पठाउन सकिँदैन। PR मा परिवर्तन भएको हुन सक्छ वा तपाईं आफ्नै पुल रिक्वेस्टको समीक्षा गर्दै हुनुहुन्छ।",
+ "reviewNotSubmittedTerm": "यो समीक्षा यथावत पेश गर्न सकिँदैन। {{term}} परिवर्तन भएको हुनसक्छ, वा तपाईंले आफ्नै {{term}} को समीक्षा गर्न सक्नुहुन्न।",
"couldNotPostComment": "टिप्पणी पोस्ट गर्न सकिएन।",
"couldNotSubmitReview": "समीक्षा पठाउन सकिएन। आफ्नो जडान जाँचेर फेरि प्रयास गर्नुहोस्।"
},
@@ -675,6 +727,7 @@
"couldNotReply": "जवाफ दिन सकिएन।",
"couldNotCompleteAction": "यो कार्य पूरा गर्न सकिएन।",
"mergeResultDefaultError": "GitHub ले मर्ज पूरा गरेन।",
+ "mergeResultNotCompleted": "{{term}} मर्ज भएन। यसको अवस्था जाँच गर्नुहोस् र फेरि प्रयास गर्नुहोस्।",
"ambiguous": "पुष्टि गर्न सकिएन — पुनः प्रयास गर्नुअघि PR जाँच्नुहोस्।",
"persistenceFailed": "हामीले यो कार्यको अभिलेख राख्न सकेनौँ। कृपया पछि फेरि प्रयास गर्नुहोस्।",
"forbidden": "अनुमति छैन।"
@@ -1988,11 +2041,31 @@
"retryConnection": "जडान गर्न पुनः प्रयास गर्नुहोस्"
},
"newSession": {
+ "recentlyUsed": "हालै प्रयोग गरिएका",
+ "couldNotLoadGithubRepositories": "GitHub रिपोजिटरीहरू लोड गर्न सकिएन।",
+ "couldNotLoadGitlabRepositories": "GitLab रिपोजिटरीहरू लोड गर्न सकिएन।",
+ "couldNotLoadBitbucketRepositories": "Bitbucket रिपोजिटरीहरू लोड गर्न सकिएन।",
"connectGithubDescription": "आफ्नो ब्राउजरमा GitHub जडान गर्नुहोस्। त्यसपछि रिपोजिटरी छान्न यहाँ फर्कनुहोस्।",
+ "connectGitlabDescription": "आफ्नो ब्राउजरमा GitLab जडान गर्नुहोस्। त्यसपछि रिपोजिटरी छान्न यहाँ फर्कनुहोस्।",
+ "connectBitbucketDescription": "आफ्नो ब्राउजरमा Bitbucket जडान गर्नुहोस्। त्यसपछि रिपोजिटरी छान्न यहाँ फर्कनुहोस्।",
"openGithub": "GitHub खोल्नुहोस्",
+ "openGitlab": "GitLab खोल्नुहोस्",
+ "openBitbucket": "Bitbucket खोल्नुहोस्",
"refreshRepositories": "रिपोजिटरीहरूको सूची ताजा गर्नुहोस्",
"githubConnected": "GitHub जडान भएको",
+ "gitlabConnected": "GitLab जडान भएको",
"noRepositoriesVisible": "कुनै रिपोजिटरी देखिएको छैन। Kilo GitHub एपलाई रिपोजिटरीमा पहुँच छ कि छैन जाँचेर सूची ताजा गर्नुहोस्।",
+ "noRepositoriesVisibleGitlab": "कुनै रिपोजिटरी देखिएको छैन। GitLab मा रिपोजिटरीको पहुँच जाँचेर सूची ताजा गर्नुहोस्।",
+ "noRepositoriesVisibleBitbucket": "कुनै रिपोजिटरी देखिएको छैन। Bitbucket मा रिपोजिटरीको पहुँच जाँचेर सूची ताजा गर्नुहोस्।",
+ "bitbucketOrganizationsOnly": "Bitbucket संस्थाहरूका लागि मात्र उपलब्ध छ।",
+ "branchPickerTitle": "ब्रान्च चयन गर्नुहोस्",
+ "branchDefault": "पूर्वनिर्धारित",
+ "branchAccessibility": "ब्रान्च: {{label}}",
+ "branchLoading": "ब्रान्चहरू लोड हुँदैछन्",
+ "branchLoadError": "ब्रान्चहरू लोड गर्न सकिएन",
+ "branchUnavailable": "यस रिपोजिटरीका लागि ब्रान्चहरू उपलब्ध छैनन्। प्रदायकसँग तपाईंको पहुँच जाँच्नुहोस्, त्यसपछि अर्को रिपोजिटरी चयन गर्नुहोस्।",
+ "branchEmpty": "कुनै ब्रान्च उपलब्ध छैन",
+ "branchPlaceholder": "एउटा ब्रान्च चयन गर्नुहोस्",
"runOnWithTarget": "{{target}} मा चलाउनुहोस्",
"environment": "वातावरण",
"couldNotLoadEnvironment": "तपाईंको वातावरण लोड गर्न सकिएन।",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "रिपोजिटरीहरूको सूची ताजा गर्न सकिएन। फेरि प्रयास गर्नुहोस्।",
"discardDraftTitle": "मस्यौदा मेट्ने?",
"discardDraftMessage": "तपाईंको प्रम्प्ट मेटिनेछ।",
+ "discardWithUploadsMessage": "तपाईंको प्रम्प्ट र कुनै सन्देशमा संलग्न नभएका अपलोड गरिएका फाइलहरू मेटिनेछन्।",
"discardFailed": "मस्यौदा मेट्न सकिएन। फेरि प्रयास गर्नुहोस्।",
"remoteHint": "स्थानीय kilo प्रक्रिया नियन्त्रण गर्न आफ्नो कम्प्युटरमा `kilo remote` वा चलिरहेको CLI सत्रमा `/remote` चलाउनुहोस्।",
- "connectBitbucketDescription": "आफ्नो ब्राउजरमा Bitbucket जडान गर्नुहोस्। त्यसपछि रिपोजिटरी छान्न यहाँ फर्कनुहोस्।",
- "connectGitlabDescription": "आफ्नो ब्राउजरमा GitLab जडान गर्नुहोस्। त्यसपछि रिपोजिटरी छान्न यहाँ फर्कनुहोस्।",
- "couldNotLoadBitbucketRepositories": "Bitbucket रिपोजिटरीहरू लोड गर्न सकिएन।",
- "couldNotLoadGithubRepositories": "GitHub रिपोजिटरीहरू लोड गर्न सकिएन।",
- "couldNotLoadGitlabRepositories": "GitLab रिपोजिटरीहरू लोड गर्न सकिएन।",
- "gitlabConnected": "GitLab जडान भएको",
- "noRepositoriesVisibleBitbucket": "कुनै रिपोजिटरी देखिएको छैन। Bitbucket मा रिपोजिटरीको पहुँच जाँचेर सूची ताजा गर्नुहोस्।",
- "noRepositoriesVisibleGitlab": "कुनै रिपोजिटरी देखिएको छैन। GitLab मा रिपोजिटरीको पहुँच जाँचेर सूची ताजा गर्नुहोस्।",
- "openBitbucket": "Bitbucket खोल्नुहोस्",
- "openGitlab": "GitLab खोल्नुहोस्",
- "recentlyUsed": "हालै प्रयोग गरिएका",
"continueFrom": "{{title}} जारी राखिँदैछ।",
"importingSession": "सत्र आयात गर्दै",
"cliCannotContinue": "यो CLI ले सत्र जारी राख्न सक्दैन। Cloud Agent वा अर्को CLI छान्नुहोस्।",
- "importFailed": "यो सत्र आयात गर्न सकिएन।",
- "discardWithUploadsMessage": "तपाईंको प्रम्प्ट र कुनै सन्देशमा संलग्न नभएका अपलोड गरिएका फाइलहरू मेटिनेछन्।"
+ "importFailed": "यो सत्र आयात गर्न सकिएन।"
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} फाइल अद्यावधिक गरियो।",
diff --git a/apps/mobile/src/i18n/locales/nl.json b/apps/mobile/src/i18n/locales/nl.json
index 89078fe409..852d9425e0 100644
--- a/apps/mobile/src/i18n/locales/nl.json
+++ b/apps/mobile/src/i18n/locales/nl.json
@@ -3,6 +3,9 @@
"cancel": "Annuleren",
"done": "Klaar",
"retry": "Opnieuw proberen",
+ "tryAgain": "Opnieuw proberen",
+ "continue": "Doorgaan",
+ "notNow": "Niet nu",
"language": "Taal",
"device": "Apparaat",
"share": "{{title}} delen",
@@ -14,15 +17,12 @@
"approve": "Goedkeuren",
"refresh": "Vernieuwen",
"couldNotRefresh": "Het vernieuwen is mislukt. Trek omlaag om het opnieuw te proberen.",
- "tryAgain": "Opnieuw proberen",
"openInBrowser": "In browser openen",
"openSettings": "Instellingen openen",
"copiedToClipboard": "Naar het klembord gekopieerd",
"couldNotCopyToClipboard": "Het kopiëren naar het klembord is mislukt.",
"required": "verplicht",
"error": "fout: {{error}}",
- "notNow": "Niet nu",
- "continue": "Doorgaan",
"back": "Terug",
"somethingWentWrong": "Er is iets misgegaan.",
"couldNotOpen": "{{label}} kon niet worden geopend.",
@@ -36,6 +36,7 @@
"cost": "Kosten",
"discard": "Verwerpen",
"findings": "Bevindingen",
+ "mergeRequest": "merge request",
"notConnected": "Niet gekoppeld",
"notifications": "Meldingen",
"pullRequest": "pR",
@@ -1557,11 +1558,31 @@
"retryConnection": "Opnieuw verbinden"
},
"newSession": {
+ "recentlyUsed": "Recent gebruikt",
+ "couldNotLoadGithubRepositories": "De GitHub-repositories konden niet worden geladen.",
+ "couldNotLoadGitlabRepositories": "De GitLab-repositories konden niet worden geladen.",
+ "couldNotLoadBitbucketRepositories": "De Bitbucket-repositories konden niet worden geladen.",
"connectGithubDescription": "Koppel GitHub in je browser en kom hier terug om een repository te kiezen.",
+ "connectGitlabDescription": "Koppel GitLab in je browser en kom hier terug om een repository te kiezen.",
+ "connectBitbucketDescription": "Koppel Bitbucket in je browser en kom hier terug om een repository te kiezen.",
"openGithub": "GitHub openen",
+ "openGitlab": "GitLab openen",
+ "openBitbucket": "Bitbucket openen",
"refreshRepositories": "Repositories vernieuwen",
"githubConnected": "GitHub gekoppeld",
+ "gitlabConnected": "GitLab gekoppeld",
"noRepositoriesVisible": "Er zijn geen repositories zichtbaar. Controleer of de Kilo GitHub-app toegang heeft tot je repositories en vernieuw de lijst.",
+ "noRepositoriesVisibleGitlab": "Er zijn geen repositories zichtbaar. Controleer de toegang tot je GitLab-repositories en vernieuw de lijst.",
+ "noRepositoriesVisibleBitbucket": "Er zijn geen repositories zichtbaar. Controleer de toegang tot je Bitbucket-repositories en vernieuw de lijst.",
+ "bitbucketOrganizationsOnly": "Bitbucket is alleen beschikbaar voor organisaties.",
+ "branchPickerTitle": "Branch selecteren",
+ "branchDefault": "Standaard",
+ "branchAccessibility": "Branch: {{label}}",
+ "branchLoading": "Branches laden",
+ "branchLoadError": "Branches konden niet worden geladen",
+ "branchUnavailable": "Er zijn geen branches beschikbaar voor deze repository. Controleer je toegang bij de provider en kies een andere repository.",
+ "branchEmpty": "Geen branches beschikbaar",
+ "branchPlaceholder": "Een branch selecteren",
"runOnWithTarget": "Uitvoeren op: {{target}}",
"environment": "Omgeving",
"couldNotLoadEnvironment": "Je omgeving kon niet worden geladen.",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "De wachtende sessies konden niet worden uitgelezen. Probeer het opnieuw.",
"failedToCreate": "De sessie kon niet worden aangemaakt.",
"couldNotRefreshRepositories": "De repositories konden niet worden vernieuwd. Probeer het opnieuw.",
- "discardDraftMessage": "Je prompt gaat verloren.",
"discardDraftTitle": "Concept verwijderen?",
+ "discardDraftMessage": "Je prompt gaat verloren.",
+ "discardWithUploadsMessage": "Je prompt en alle uploads die nog niet zijn gebruikt, worden verwijderd.",
"discardFailed": "Het concept kon niet worden verwijderd. Probeer het opnieuw.",
"remoteHint": "Voer `kilo remote` uit op je computer, of `/remote` in een actieve CLI-sessie, om een lokaal kilo-proces te besturen.",
- "connectBitbucketDescription": "Koppel Bitbucket in je browser en kom hier terug om een repository te kiezen.",
- "connectGitlabDescription": "Koppel GitLab in je browser en kom hier terug om een repository te kiezen.",
- "couldNotLoadBitbucketRepositories": "De Bitbucket-repositories konden niet worden geladen.",
- "couldNotLoadGithubRepositories": "De GitHub-repositories konden niet worden geladen.",
- "couldNotLoadGitlabRepositories": "De GitLab-repositories konden niet worden geladen.",
- "gitlabConnected": "GitLab gekoppeld",
- "noRepositoriesVisibleBitbucket": "Er zijn geen repositories zichtbaar. Controleer de toegang tot je Bitbucket-repositories en vernieuw de lijst.",
- "noRepositoriesVisibleGitlab": "Er zijn geen repositories zichtbaar. Controleer de toegang tot je GitLab-repositories en vernieuw de lijst.",
- "openBitbucket": "Bitbucket openen",
- "openGitlab": "GitLab openen",
- "recentlyUsed": "Recent gebruikt",
"continueFrom": "Je gaat verder met {{title}}.",
"importingSession": "Sessie importeren…",
"cliCannotContinue": "Deze CLI kan geen sessie voortzetten. Kies Cloud Agent of een andere CLI.",
- "importFailed": "Deze sessie kon niet worden geïmporteerd.",
- "discardWithUploadsMessage": "Je prompt en alle uploads die nog niet zijn gebruikt, worden verwijderd."
+ "importFailed": "Deze sessie kon niet worden geïmporteerd."
},
"partRenderer": {
"updatedFileCount_one": "Er is {{displayCount}} bestand bijgewerkt.",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "Bijhouden van de installatiebron toestaan?"
},
"prReview": {
+ "pullRequestUnavailable": "PR niet beschikbaar",
+ "pullRequestUnavailableDescription": "Deze PR kan niet worden geopend. Mogelijk is de PR verwijderd, is de repository privé of is de Kilo GitHub-app niet voor deze repository geïnstalleerd.",
"accessDeniedDescription": "Je hebt geen toestemming om deze PR te bekijken.",
- "checkConnection": "Verbinding controleren",
- "checks": {
- "checksCount": "{{displayCount}} controles",
- "couldNotLoad": "De controles konden niet worden geladen.",
- "failed": "{{displayCount}} mislukt",
- "noAccess": "Je hebt geen toegang tot de controles voor deze repository.",
- "noChecksReported": "Geen controles gemeld",
- "notAvailable": "De controles zijn nog niet beschikbaar. Mogelijk is de laatste commit nog niet verwerkt of is de Kilo GitHub-app niet voor de bronrepository geïnstalleerd.",
- "openDetails": "Details van {{name}} openen",
- "passed": "{{displayCount}} geslaagd",
- "pending": "{{displayCount}} in afwachting",
- "retryChecks": "Controles opnieuw proberen",
- "skipped": "{{displayCount}} overgeslagen",
- "title": "Controles",
- "viewOnGitHub": "PR op GitHub bekijken",
- "checkDetails": "controledetails"
- },
- "composer": {
- "addTitle": "Opmerking toevoegen",
- "addToReview": "Aan beoordeling toevoegen",
- "comment": "Opmerking plaatsen",
- "commentBody": "Tekst van de opmerking",
- "commentBodyPlaceholder": "Je opmerking",
- "commentNow": "Opmerking nu plaatsen",
- "discardMessage": "Je concept gaat verloren.",
- "discardTitle": "Opmerking verwerpen?",
- "editTitle": "Opmerking bewerken",
- "insertSuggestion": "Suggestie invoegen",
- "insertSuggestionA11y": "Een codesuggestie invoegen",
- "loadFailedTitle": "De editor voor opmerkingen kon niet worden geladen.",
- "ok": "OK",
- "unavailableMessage": "Deze nog niet verzonden opmerking is al verwijderd of verzonden.",
- "unavailableTitle": "Opmerking niet beschikbaar",
- "bodyEmpty": "De opmerking mag niet leeg zijn.",
- "suggestionsOnlyAddedLines": "Suggesties gelden alleen voor toegevoegde regels.",
- "tapDiffLineToSuggest": "Tik op een diff-regel om suggesties in te schakelen."
- },
- "connect": {
- "checkFailedMessage": "De aanmeldstatus is pas beschikbaar zodra het laden is voltooid.",
- "checkFailedTitle": "De GitHub-verbinding kon niet worden gecontroleerd.",
- "description": "Koppel je GitHub-account om PR's op je telefoon te beoordelen.",
- "reconnectDescription": "De toegang tot je GitHub-account is ingetrokken. Maak opnieuw verbinding om PR's op je telefoon te blijven beoordelen.",
- "reconnectTitle": "GitHub opnieuw verbinden"
- },
- "connectionExpired": "De GitHub-koppeling is verlopen.",
- "couldNotLoadPullRequest": "De PR kon niet worden geladen.",
- "couldNotOpenGitHubAppSettings": "De instellingen van de GitHub-app konden niet worden geopend.",
- "description": "Beschrijving",
- "discussion": {
- "acceptTerms": "Accepteren",
- "accessDeniedMessage": "Je hebt geen toestemming om de discussie van deze PR te bekijken.",
- "addReaction": "Reactie toevoegen",
- "block": "Blokkeren",
- "blockedUser": "{{login}} geblokkeerd",
- "collapseThread": "Discussie inklappen",
- "commentActions": "Acties voor opmerking",
- "comment": "{{displayCount}} opmerkingen",
- "comment_other": "{{displayCount}} opmerkingen",
- "couldNotLoad": "De discussie kon niet worden geladen.",
- "couldNotLoadMore": "Er konden geen extra opmerkingen worden geladen.",
- "loadMoreComments": "Meer opmerkingen laden",
- "loading": "Discussie laden",
- "moderation": {
- "block": {
- "retryable": "Deze gebruiker kon niet worden geblokkeerd. Controleer je verbinding en probeer het opnieuw.",
- "terminal": "Deze gebruiker kan niet worden geblokkeerd."
- },
- "mute": {
- "retryable": "Deze gebruiker kon niet worden gedempt. Controleer je verbinding en probeer het opnieuw.",
- "terminal": "Deze gebruiker kan niet worden gedempt."
- },
- "reportContent": {
- "retryable": "Deze opmerking kon niet worden gemeld. Controleer je verbinding en probeer het opnieuw.",
- "terminal": "Deze opmerking kan niet worden gemeld."
- },
- "reportUser": {
- "retryable": "Deze gebruiker kon niet worden gemeld. Controleer je verbinding en probeer het opnieuw.",
- "terminal": "Deze gebruiker kan niet worden gemeld."
- }
- },
- "moreLinesAbove": "… Hierboven staan nog {{displayCount}} regels.",
- "mute": "Dempen",
- "mutedUser": "{{login}} gedempt",
- "noDiscussion": "Nog geen discussie",
- "noDiscussionDescription": "Er zijn nog geen discussies over de beoordeling of algemene opmerkingen bij deze PR.",
- "comment_one": "1 opmerking",
- "outdated": "Verouderd",
- "quotedDiffSnippet": "Geciteerd diff-fragment",
- "reactionPill": "Reactie {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "reacties",
- "reaction_other": "reacties",
- "reaction_one": "reactie",
- "replyBadRequest": "Dit antwoord kan niet worden geplaatst. De discussie is mogelijk gewijzigd.",
- "replyBody": "Antwoordtekst",
- "replyForbidden": "Je hebt geen toestemming om op deze PR te reageren.",
- "replyPlaceholder": "Je antwoord…",
- "reportContent": "Inhoud melden",
- "reportUser": "Gebruiker melden",
- "resolveThread": "Discussie als opgelost markeren",
- "resolved": "Opgelost",
- "retryLoadingMore": "Meer opmerkingen opnieuw proberen te laden",
- "reviewFiles": "Bestanden beoordelen",
- "startedRelative": " · {{relative}} gestart",
- "submitReply": "Antwoord verzenden",
- "termsAcceptRetry": "De gebruiksvoorwaarden konden niet worden geaccepteerd. Controleer je verbinding en probeer het opnieuw.",
- "termsCopy": "Je moet minstens 13 jaar zijn om berichten te plaatsen.",
- "termsTitle": "Gebruiksvoorwaarden",
- "threadAccessibilityLabel": "Discussie {{anchorLabel}}",
- "unavailable": "De discussie is niet beschikbaar.",
- "unavailableMessage": "Deze PR is mogelijk verwijderd.",
- "unresolveThread": "Discussie heropenen",
- "viewTerms": "Voorwaarden bekijken",
- "termsAcceptRequired": "Je moet de gebruiksvoorwaarden accepteren om berichten te plaatsen.",
- "termsCheckRetryCopy": "De gebruiksvoorwaarden konden niet worden gecontroleerd. Controleer je verbinding en probeer het opnieuw.",
- "termsOutdatedCopy": "De gebruiksvoorwaarden zijn gewijzigd. Open dit scherm opnieuw om de nieuwste versie te accepteren.",
- "reactions": {
- "thumbsUp": "Duim omhoog",
- "thumbsDown": "Duim omlaag",
- "laugh": "Lachen",
- "hooray": "Hoera",
- "confused": "Verward",
- "heart": "Hart",
- "rocket": "Raket",
- "eyes": "Ogen"
- },
- "anchor": {
- "fileCommentOnPath": "Opmerking bij bestand {{path}}",
- "fileComment": "Opmerking bij bestand",
- "outdatedOnPathLines": "Verouderd in {{path}}, {{lines}}",
- "outdatedOnLines": "Verouderd bij {{lines}}",
- "outdatedOnPath": "Verouderd in {{path}}"
- },
- "deletedUser": "verwijderde gebruiker"
- },
- "entry": {
- "clearLink": "PR-koppeling wissen",
- "couldNotLoad": "Het laden is mislukt.",
- "eyebrow": "Open een PR via een URL.",
- "noRecentPrs": "Geen recente PR's",
- "noRecentPrsDescription": "Plak hierboven een PR-koppeling om een beoordeling te starten. De PR verschijnt hier de volgende keer.",
- "open": "Openen",
- "pasteLink": "PR-koppeling plakken",
- "pastePrLink": "PR-koppeling plakken",
- "removeFromRecentsMessage": "Deze PR wordt uit je recente items verwijderd.",
- "removeFromRecentsTitle": "Uit recente items verwijderen?",
- "removeRecentAccessibility": "{{repo}} uit recente items verwijderen",
- "urlAccessibility": "URL van de PR op GitHub"
- },
- "eventChips": {
- "comment": "Opmerking plaatsen",
- "label": "Soort beoordeling",
- "requestChanges": "Wijzigingen vragen"
- },
+ "noFilesChanged": "Geen bestanden gewijzigd",
+ "noFilesChangedDescription": "Deze PR bevat geen bestandswijzigingen.",
"fileList": {
"filesList": "Bestandenlijst",
"filesViewed": "Bestanden · {{viewed}} van {{total}} bekeken",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "Opmerking bij geselecteerde regels plaatsen",
"finishReview": "Beoordeling afronden"
},
- "headLine": "{{counts}} · laatste commit {{sha}}",
"hunkRows": {
"contextUnavailable": "De context is niet beschikbaar voor deze referentie.",
"expandAll": "Alles tonen",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "Context opnieuw laden",
"retryLoadingNextPage": "Volgende pagina opnieuw laden"
},
- "inbox": {
- "couldNotLoad": "Het postvak IN kon niet worden geladen.",
- "loading": "Postvak IN laden",
- "noReviewRequests": "Geen beoordelingsverzoeken",
- "noReviewRequestsDescription": "Hier verschijnen PR's die op je beoordeling wachten. Je kunt hierboven ook een andere PR-koppeling plakken.",
- "title": "Postvak IN"
+ "sideBySide": {
+ "emptyDiffColumn": "lege diffkolom",
+ "emptyDiffRow": "Lege diffrij",
+ "newOnly": "Alleen nieuw: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ het bestand eindigt niet met een regeleinde.",
+ "oldNew": "Oud: {{old}} | Nieuw: {{new}}",
+ "oldOnly": "Alleen oud: {{text}}"
+ },
+ "connectionExpired": "De GitHub-koppeling is verlopen.",
+ "capabilities": {
+ "banner": {
+ "title": "Niet beschikbaar bij deze provider",
+ "accessibility": "Niet beschikbaar bij deze provider: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Kilo GitHub-app installeren",
"merge": {
- "autoMergeDescription": "GitHub voegt deze PR automatisch samen zodra alle vereiste controles slagen (methode: {{method}}).",
+ "merge": "Samenvoegen",
+ "mergeNow": "Nu samenvoegen",
+ "mergePullRequest": "PR samenvoegen",
+ "mergeTermTitle": "{{term}} samenvoegen",
+ "enableAutoMerge": "Automatisch samenvoegen inschakelen",
+ "disableAutoMerge": "Automatisch samenvoegen uitschakelen",
"autoMergeOn": "Automatisch samenvoegen staat aan",
- "blockedTitle": "Waarom dit nog niet kan worden samengevoegd",
- "cannotMerge": "Deze PR kan in de huidige vorm niet worden samengevoegd.",
+ "autoMergeDescription": "GitHub voegt deze PR automatisch samen zodra alle vereiste controles slagen (methode: {{method}}).",
"checking": "Controleren of samenvoegen mogelijk is…",
+ "couldNotDetermine": "Er kon niet worden bepaald of samenvoegen mogelijk is.",
+ "refreshMergeability": "Opnieuw controleren of samenvoegen mogelijk is",
+ "blockedTitle": "Waarom dit nog niet kan worden samengevoegd",
+ "updateBranch": "Branch bijwerken",
+ "updateBranchFromBase": "Branch bijwerken vanuit de basisbranch",
+ "methodLabel": "Methode",
+ "commitTitle": "Committitel",
"commitMessage": "Commitbericht",
"commitMessagePlaceholder": "Optionele beschrijving voor de merge-commit",
- "commitTitle": "Committitel",
- "confirmMessage": "Je wijzigingen worden hiermee in de basisbranch opgenomen.",
- "confirmTitle": "PR samenvoegen?",
- "couldNotDetermine": "Er kon niet worden bepaald of samenvoegen mogelijk is.",
- "couldNotMerge": "De PR kon niet worden samengevoegd.",
"deleteBranch": "Branch verwijderen",
"deleteBranchAfterMerge": "Branch verwijderen na samenvoegen",
- "disableAutoMerge": "Automatisch samenvoegen uitschakelen",
- "enableAutoMerge": "Automatisch samenvoegen inschakelen",
- "enableAutoMergeConfirmMessage": "GitHub voegt deze PR automatisch samen zodra alle vereiste controles slagen.",
+ "noEnabledMethods": "Voor deze repository zijn geen samenvoegmethoden ingeschakeld. Vraag een repositorybeheerder om samenvoegen met een merge-commit, squashen of rebasen in te schakelen.",
+ "confirmTitle": "PR samenvoegen?",
+ "confirmTitleTerm": "{{term}} samenvoegen?",
+ "confirmMessage": "Je wijzigingen worden hiermee in de basisbranch opgenomen.",
"enableAutoMergeConfirmTitle": "Automatisch samenvoegen inschakelen?",
+ "enableAutoMergeConfirmMessage": "GitHub voegt deze PR automatisch samen zodra alle vereiste controles slagen.",
+ "enableAutoMergeConfirmMessageTerm": "De {{term}} wordt automatisch samengevoegd zodra de pipeline slaagt.",
+ "enableAutoMergeDescriptionTerm": "GitLab voegt deze {{term}} automatisch samen zodra de pipeline slaagt.",
"forbidden": "Je hebt geen toestemming om deze PR samen te voegen.",
- "loadFailedTitle": "De samenvoegopties konden niet worden geladen.",
- "merge": "Samenvoegen",
- "mergeNow": "Nu samenvoegen",
- "mergePullRequest": "PR samenvoegen",
- "methodLabel": "Methode",
+ "cannotMerge": "Deze PR kan in de huidige vorm niet worden samengevoegd.",
+ "couldNotMerge": "De PR kon niet worden samengevoegd.",
"methods": {
"merge": "Samenvoegen",
"rebase": "Rebasen",
"squash": "Squashen"
},
- "noEnabledMethods": "Voor deze repository zijn geen samenvoegmethoden ingeschakeld. Vraag een repositorybeheerder om samenvoegen met een merge-commit, squashen of rebasen in te schakelen.",
+ "terminal": {
+ "alreadyMerged": "Al samengevoegd",
+ "closed": "Deze PR is gesloten",
+ "closedMergeRequest": "Deze merge request is gesloten"
+ },
"partialSuccessBanner": {
"accessibility": "Samengevoegd. De branch kon niet worden verwijderd. Reden: {{reason}}",
"body": "De branch kon niet worden verwijderd. Reden: {{reason}}"
},
- "refreshMergeability": "Opnieuw controleren of samenvoegen mogelijk is",
- "terminal": {
- "alreadyMerged": "Al samengevoegd",
- "closed": "Deze PR is gesloten"
- },
- "updateBranch": "Branch bijwerken",
- "updateBranchFromBase": "Branch bijwerken vanuit de basisbranch",
+ "loadFailedTitle": "De samenvoegopties konden niet worden geladen.",
"blocked": {
"unknownStateTitle": "GitHub heeft nog niet bevestigd dat samenvoegen mogelijk is",
"unknownStateDetail": "Probeer het overzicht straks opnieuw te vernieuwen.",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "Deze PR kan nog niet worden samengevoegd",
"notMergeableDetail": "GitHub meldt de samenvoegstatus {{state}}."
},
+ "restrictions": {
+ "title": "Samenvoegrestricties",
+ "approvalsRequired_one": "{{displayCount}} goedkeuring vereist",
+ "approvalsRequired_other": "{{displayCount}} goedkeuringen vereist",
+ "pipelineMustSucceed": "De pipeline moet slagen voordat je kunt samenvoegen."
+ },
+ "providerBlocked": {
+ "failingPipeline": "De pipeline mislukt bij de laatste commit.",
+ "pendingPipeline": "De pipeline wordt bij de laatste commit nog uitgevoerd.",
+ "permission": "Je hebt geen toestemming om deze {{term}} samen te voegen.",
+ "draft": "Markeer de {{term}} als klaar voor beoordeling voordat je deze samenvoegt."
+ },
"methodLabels": {
"merge": "Merge-commit maken",
"squash": "Squashen en samenvoegen",
@@ -2623,9 +2507,204 @@
"rebase": "Pas alle commits van deze branch opnieuw toe op de basisbranch zonder een merge-commit te maken."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Discussie {{anchorLabel}}",
+ "collapseThread": "Discussie inklappen",
+ "resolveThread": "Discussie als opgelost markeren",
+ "unresolveThread": "Discussie heropenen",
+ "resolved": "Opgelost",
+ "outdated": "Verouderd",
+ "comment_one": "1 opmerking",
+ "comment": "{{displayCount}} opmerkingen",
+ "comment_other": "{{displayCount}} opmerkingen",
+ "startedRelative": " · {{relative}} gestart",
+ "couldNotLoadMore": "Er konden geen extra opmerkingen worden geladen.",
+ "retryLoadingMore": "Meer opmerkingen opnieuw proberen te laden",
+ "loadMoreComments": "Meer opmerkingen laden",
+ "addReaction": "Reactie toevoegen",
+ "reactionPill": "Reactie {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "reactie",
+ "reaction": "reacties",
+ "reaction_other": "reacties",
+ "commentActions": "Acties voor opmerking",
+ "reportContent": "Inhoud melden",
+ "reportUser": "Gebruiker melden",
+ "mute": "Dempen",
+ "block": "Blokkeren",
+ "blockedUser": "{{login}} geblokkeerd",
+ "mutedUser": "{{login}} gedempt",
+ "replyPlaceholder": "Je antwoord…",
+ "replyBody": "Antwoordtekst",
+ "submitReply": "Antwoord verzenden",
+ "termsTitle": "Gebruiksvoorwaarden",
+ "termsCopy": "Je moet minstens 13 jaar zijn om berichten te plaatsen.",
+ "termsAcceptRetry": "De gebruiksvoorwaarden konden niet worden geaccepteerd. Controleer je verbinding en probeer het opnieuw.",
+ "viewTerms": "Voorwaarden bekijken",
+ "acceptTerms": "Accepteren",
+ "replyBadRequest": "Dit antwoord kan niet worden geplaatst. De discussie is mogelijk gewijzigd.",
+ "replyForbidden": "Je hebt geen toestemming om op deze PR te reageren.",
+ "replyForbiddenTerm": "Je hebt geen toestemming om op deze {{term}} te reageren.",
+ "moderation": {
+ "block": {
+ "retryable": "Deze gebruiker kon niet worden geblokkeerd. Controleer je verbinding en probeer het opnieuw.",
+ "terminal": "Deze gebruiker kan niet worden geblokkeerd."
+ },
+ "mute": {
+ "retryable": "Deze gebruiker kon niet worden gedempt. Controleer je verbinding en probeer het opnieuw.",
+ "terminal": "Deze gebruiker kan niet worden gedempt."
+ },
+ "reportContent": {
+ "retryable": "Deze opmerking kon niet worden gemeld. Controleer je verbinding en probeer het opnieuw.",
+ "terminal": "Deze opmerking kan niet worden gemeld."
+ },
+ "reportUser": {
+ "retryable": "Deze gebruiker kon niet worden gemeld. Controleer je verbinding en probeer het opnieuw.",
+ "terminal": "Deze gebruiker kan niet worden gemeld."
+ }
+ },
+ "accessDeniedMessage": "Je hebt geen toestemming om de discussie van deze PR te bekijken.",
+ "unavailable": "De discussie is niet beschikbaar.",
+ "unavailableMessage": "Deze PR is mogelijk verwijderd.",
+ "couldNotLoad": "De discussie kon niet worden geladen.",
+ "loading": "Discussie laden",
+ "noDiscussion": "Nog geen discussie",
+ "noDiscussionDescription": "Er zijn nog geen discussies over de beoordeling of algemene opmerkingen bij deze PR.",
+ "reviewFiles": "Bestanden beoordelen",
+ "quotedDiffSnippet": "Geciteerd diff-fragment",
+ "moreLinesAbove": "… Hierboven staan nog {{displayCount}} regels.",
+ "termsAcceptRequired": "Je moet de gebruiksvoorwaarden accepteren om berichten te plaatsen.",
+ "termsOutdatedCopy": "De gebruiksvoorwaarden zijn gewijzigd. Open dit scherm opnieuw om de nieuwste versie te accepteren.",
+ "termsCheckRetryCopy": "De gebruiksvoorwaarden konden niet worden gecontroleerd. Controleer je verbinding en probeer het opnieuw.",
+ "reactions": {
+ "thumbsUp": "Duim omhoog",
+ "thumbsDown": "Duim omlaag",
+ "laugh": "Lachen",
+ "hooray": "Hoera",
+ "confused": "Verward",
+ "heart": "Hart",
+ "rocket": "Raket",
+ "eyes": "Ogen"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Opmerking bij bestand {{path}}",
+ "fileComment": "Opmerking bij bestand",
+ "outdatedOnPathLines": "Verouderd in {{path}}, {{lines}}",
+ "outdatedOnLines": "Verouderd bij {{lines}}",
+ "outdatedOnPath": "Verouderd in {{path}}"
+ },
+ "deletedUser": "verwijderde gebruiker"
+ },
+ "couldNotOpenGitHubAppSettings": "De instellingen van de GitHub-app konden niet worden geopend.",
+ "installKiloGitHubApp": "Kilo GitHub-app installeren",
+ "checkConnection": "Verbinding controleren",
+ "couldNotLoadPullRequest": "De PR kon niet worden geladen.",
+ "description": "Beschrijving",
"noDescriptionProvided": "Er is geen beschrijving opgegeven.",
- "noFilesChanged": "Geen bestanden gewijzigd",
- "noFilesChangedDescription": "Deze PR bevat geen bestandswijzigingen.",
+ "review": "Beoordeling",
+ "reviewPullRequest": "PR beoordelen",
+ "headLine": "{{counts}} · laatste commit {{sha}}",
+ "entry": {
+ "eyebrow": "Open een PR of merge request via een URL",
+ "pastePrLink": "PR- of merge request-koppeling plakken",
+ "noRecentPrs": "Geen recente beoordelingen",
+ "noRecentPrsDescription": "Plak hierboven een koppeling om een beoordeling te starten — deze verschijnt de volgende keer hier.",
+ "couldNotLoad": "Het laden is mislukt.",
+ "removeFromRecentsTitle": "Uit recente items verwijderen?",
+ "removeFromRecentsMessage": "Deze beoordeling wordt uit je recente items verwijderd.",
+ "removeRecentAccessibility": "{{repo}} uit recente items verwijderen",
+ "urlAccessibility": "Voer een PR- of merge request-URL in",
+ "urlPlaceholder": "URL van een PR of merge request",
+ "openAccessibility": "PR of merge request openen",
+ "clearLink": "Koppeling wissen",
+ "pasteLink": "PR- of merge request-koppeling plakken",
+ "open": "Openen"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} controles",
+ "couldNotLoad": "De controles konden niet worden geladen.",
+ "failed": "{{displayCount}} mislukt",
+ "noAccess": "Je hebt geen toegang tot de controles voor deze repository.",
+ "noChecksReported": "Geen controles gemeld",
+ "notAvailable": "De controles zijn nog niet beschikbaar. Mogelijk is de laatste commit nog niet verwerkt of is de Kilo GitHub-app niet voor de bronrepository geïnstalleerd.",
+ "openDetails": "Details van {{name}} openen",
+ "passed": "{{displayCount}} geslaagd",
+ "pending": "{{displayCount}} in afwachting",
+ "retryChecks": "Controles opnieuw proberen",
+ "skipped": "{{displayCount}} overgeslagen",
+ "title": "Controles",
+ "viewOnGitHub": "PR op GitHub bekijken",
+ "checkDetails": "controledetails"
+ },
+ "inbox": {
+ "couldNotLoad": "Het postvak IN kon niet worden geladen.",
+ "loading": "Postvak IN laden",
+ "noReviewRequests": "Geen beoordelingsverzoeken",
+ "noReviewRequestsDescription": "Hier verschijnen PR's die op je beoordeling wachten. Je kunt hierboven ook een andere PR-koppeling plakken.",
+ "title": "Postvak IN"
+ },
+ "composer": {
+ "addTitle": "Opmerking toevoegen",
+ "addToReview": "Aan beoordeling toevoegen",
+ "comment": "Opmerking plaatsen",
+ "commentBody": "Tekst van de opmerking",
+ "commentBodyPlaceholder": "Je opmerking",
+ "commentNow": "Opmerking nu plaatsen",
+ "discardMessage": "Je concept gaat verloren.",
+ "discardTitle": "Opmerking verwerpen?",
+ "editTitle": "Opmerking bewerken",
+ "insertSuggestion": "Suggestie invoegen",
+ "insertSuggestionA11y": "Een codesuggestie invoegen",
+ "loadFailedTitle": "De editor voor opmerkingen kon niet worden geladen.",
+ "ok": "OK",
+ "unavailableMessage": "Deze nog niet verzonden opmerking is al verwijderd of verzonden.",
+ "unavailableTitle": "Opmerking niet beschikbaar",
+ "bodyEmpty": "De opmerking mag niet leeg zijn.",
+ "suggestionsOnlyAddedLines": "Suggesties gelden alleen voor toegevoegde regels.",
+ "tapDiffLineToSuggest": "Tik op een diff-regel om suggesties in te schakelen."
+ },
+ "connect": {
+ "checkFailedTitle": "De GitHub-verbinding kon niet worden gecontroleerd.",
+ "checkFailedMessage": "De aanmeldstatus is pas beschikbaar zodra het laden is voltooid.",
+ "checkFailedTitleGitLab": "De GitLab-verbinding kon niet worden gecontroleerd.",
+ "checkFailedTitleBitbucket": "De Bitbucket-verbinding kon niet worden gecontroleerd.",
+ "providerCheckFailedMessage": "De verbindingsstatus is pas beschikbaar zodra het laden is voltooid.",
+ "reconnectTitle": "GitHub opnieuw verbinden",
+ "reconnectDescription": "De toegang tot je GitHub-account is ingetrokken. Maak opnieuw verbinding om PR's op je telefoon te blijven beoordelen.",
+ "description": "Koppel je GitHub-account om PR's op je telefoon te beoordelen.",
+ "gitlabDescription": "Koppel je GitLab-account om merge requests op je telefoon te beoordelen.",
+ "bitbucketDescription": "Koppel Bitbucket aan deze organisatie om PR's op je telefoon te beoordelen.",
+ "bitbucketOrgOnlyDescription": "Selecteer een organisatie in je profiel om de PR's van die organisatie op Bitbucket te beoordelen."
+ },
+ "screen": {
+ "shareA11y": "PR delen",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Deze opmerking wordt uit de wachtrij voor de beoordeling verwijderd.",
+ "deletePendingTitle": "Nog niet verzonden opmerking verwijderen?",
+ "loadFailedTitle": "Het formulier voor het verzenden van de beoordeling kon niet worden geladen.",
+ "pendingComment": "nog niet verzonden opmerkingen",
+ "pendingComment_other": "nog niet verzonden opmerkingen",
+ "pendingComment_one": "nog niet verzonden opmerking",
+ "summaryOptional": "Samenvatting (optioneel)",
+ "partialPostedMessage": "Geplaatste opmerkingen: {{displayFreshCount}}. Opmerkingen bij een oudere commit die in je wachtrij blijven staan: {{displayStaleCount}}.",
+ "submitCountOfTotal": "{{displayFreshCount}} van {{displayTotalCount}} opmerkingen verzenden",
+ "submitReview": "Beoordeling verzenden",
+ "blockedRequestChanges": "Voeg een samenvatting of minstens één opmerking toe om wijzigingen te vragen.",
+ "blockedComment": "Voeg een samenvatting of minstens één opmerking toe om een beoordeling met opmerkingen te verzenden."
+ },
+ "reconnectNotice": {
+ "title": "De GitHub-koppeling is verlopen.",
+ "message": "Je GitHub-verbinding is niet meer geldig. Controleer de verbinding opnieuw. Als dat nodig is, krijg je de vraag om opnieuw verbinding te maken.",
+ "gitlabTitle": "De GitLab-koppeling is verlopen.",
+ "bitbucketTitle": "De Bitbucket-koppeling is verlopen.",
+ "providerMessage": "Je {{provider}}-verbinding is niet meer geldig. Controleer de verbinding opnieuw. Als dat nodig is, krijg je de vraag om opnieuw verbinding te maken."
+ },
+ "eventChips": {
+ "comment": "Opmerking plaatsen",
+ "label": "Soort beoordeling",
+ "requestChanges": "Wijzigingen vragen"
+ },
"overview": {
"commit": "codecommits",
"commit_other": "codecommits",
@@ -2666,39 +2745,25 @@
"summaryA11y": "Samenvatting van de beoordeling",
"summaryPlaceholder": "Optionele samenvatting van de beoordeling"
},
- "pullRequestUnavailable": "PR niet beschikbaar",
- "pullRequestUnavailableDescription": "Deze PR kan niet worden geopend. Mogelijk is de PR verwijderd, is de repository privé of is de Kilo GitHub-app niet voor deze repository geïnstalleerd.",
- "reconnectNotice": {
- "message": "Je GitHub-verbinding is niet meer geldig. Controleer de verbinding opnieuw. Als dat nodig is, krijg je de vraag om opnieuw verbinding te maken.",
- "title": "De GitHub-koppeling is verlopen."
- },
- "review": "Beoordeling",
- "reviewPullRequest": "PR beoordelen",
- "screen": {
- "shareA11y": "PR delen",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "lege diffkolom",
- "emptyDiffRow": "Lege diffrij",
- "newOnly": "Alleen nieuw: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ het bestand eindigt niet met een regeleinde.",
- "oldNew": "Oud: {{old}} | Nieuw: {{new}}",
- "oldOnly": "Alleen oud: {{text}}"
+ "tabs": {
+ "discussion": "Discussie",
+ "files": "Bestanden",
+ "overview": "Overzicht"
},
- "submit": {
- "deletePendingMessage": "Deze opmerking wordt uit de wachtrij voor de beoordeling verwijderd.",
- "deletePendingTitle": "Nog niet verzonden opmerking verwijderen?",
- "loadFailedTitle": "Het formulier voor het verzenden van de beoordeling kon niet worden geladen.",
- "pendingComment": "nog niet verzonden opmerkingen",
- "pendingComment_other": "nog niet verzonden opmerkingen",
- "pendingComment_one": "nog niet verzonden opmerking",
- "summaryOptional": "Samenvatting (optioneel)",
- "partialPostedMessage": "Geplaatste opmerkingen: {{displayFreshCount}}. Opmerkingen bij een oudere commit die in je wachtrij blijven staan: {{displayStaleCount}}.",
- "submitCountOfTotal": "{{displayFreshCount}} van {{displayTotalCount}} opmerkingen verzenden",
- "submitReview": "Beoordeling verzenden",
- "blockedRequestChanges": "Voeg een samenvatting of minstens één opmerking toe om wijzigingen te vragen.",
- "blockedComment": "Voeg een samenvatting of minstens één opmerking toe om een beoordeling met opmerkingen te verzenden."
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Merge request delen",
+ "viewOnProvider": "Bekijken op {{provider}}",
+ "mergeRequestUnavailable": "Merge request niet beschikbaar",
+ "unavailableDescription": "Mogelijk is deze verwijderd, of heb je geen toegang.",
+ "accessDeniedMergeRequest": "Je hebt geen toestemming om deze merge request te bekijken.",
+ "couldNotLoadMergeRequest": "De merge request kon niet worden geladen.",
+ "discussionAccessDenied": "Je hebt geen toestemming om de discussie van deze merge request te bekijken.",
+ "discussionUnavailableMessage": "Deze merge request is mogelijk verwijderd.",
+ "noDiscussionDescription": "Er zijn nog geen discussies over de beoordeling of algemene opmerkingen bij deze merge request.",
+ "noFilesChangedDescription": "Deze merge request bevat geen bestandswijzigingen."
},
"fileStatus": {
"changed": "Gewijzigd",
@@ -2706,11 +2771,6 @@
"modified": "Aangepast",
"renamed": "Hernoemd"
},
- "tabs": {
- "discussion": "Discussie",
- "files": "Bestanden",
- "overview": "Overzicht"
- },
"diff": {
"selectedTapToChange": "{{label}} geselecteerd, tik om de selectie te wijzigen",
"tapToComment": "{{label}}, tik om te reageren",
@@ -2721,7 +2781,7 @@
"emptyLine": "(leeg)"
},
"linkPasteClipboardEmpty": "Het klembord is leeg.",
- "linkPasteNotAPullRequest": "Dit is geen koppeling naar een PR op GitHub.",
+ "linkPasteNotAPullRequest": "Dit is geen koppeling naar een PR of merge request",
"announce": {
"commentPosted": "Opmerking geplaatst",
"reviewSubmitted": "Beoordeling verzonden",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "Deze opmerking kan niet worden geplaatst. Mogelijk is de geselecteerde regel gewijzigd of is de PR bijgewerkt.",
"reviewNotSubmitted": "Deze beoordeling kan in de huidige vorm niet worden verzonden. Mogelijk is de PR gewijzigd of probeer je je eigen PR te beoordelen.",
+ "reviewNotSubmittedTerm": "Deze beoordeling kan niet in de huidige vorm worden verzonden. Mogelijk is de {{term}} gewijzigd, of kun je je eigen {{term}} niet beoordelen.",
"couldNotPostComment": "De opmerking kon niet worden geplaatst.",
"couldNotSubmitReview": "De beoordeling kon niet worden verzonden. Controleer je verbinding en probeer het opnieuw."
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "Het antwoord kon niet worden verzonden.",
"couldNotCompleteAction": "Deze actie kon niet worden voltooid.",
"mergeResultDefaultError": "GitHub heeft het samenvoegen niet voltooid.",
+ "mergeResultNotCompleted": "De {{term}} is niet samengevoegd. Controleer de status en probeer het opnieuw.",
"ambiguous": "Het resultaat kon niet worden bevestigd. Controleer de PR voordat je het opnieuw probeert.",
"persistenceFailed": "We konden deze actie niet vastleggen. Probeer het later opnieuw.",
"forbidden": "Je hebt geen toestemming voor deze actie."
diff --git a/apps/mobile/src/i18n/locales/om.json b/apps/mobile/src/i18n/locales/om.json
index 45400af3f5..7e83dfcae3 100644
--- a/apps/mobile/src/i18n/locales/om.json
+++ b/apps/mobile/src/i18n/locales/om.json
@@ -36,6 +36,7 @@
"cost": "Baasii",
"discard": "Dhiisi",
"findings": "Argannoowwan",
+ "mergeRequest": "gaaffii walitti makuu",
"notConnected": "Walitti hin hidhamne",
"notifications": "Beeksisota",
"pullRequest": "gaaffii walitti makuu",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Tarree garaagarummaa duwwaa"
},
"connectionExpired": "Yeroon walitti hidhamiinsa GitHub darbeera.",
+ "capabilities": {
+ "banner": {
+ "title": "Waltajjii kanaan hin argamu",
+ "accessibility": "Waltajjii kanaan hin argamu: {{reason}}"
+ }
+ },
"merge": {
"merge": "Walitti makuu",
"mergeNow": "Amma walitti maki",
"mergePullRequest": "Gaaffii walitti makuu raawwachuu",
+ "mergeTermTitle": "{{term}} raawwachuu",
"enableAutoMerge": "Ofumaan walitti makuu hojii irra oolchi",
"disableAutoMerge": "Ofumaan walitti makuu dhaabi",
"autoMergeOn": "Ofumaan walitti makuun hojii irra jira",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Walitti makuu booda damee haqi",
"noEnabledMethods": "Kuusaan koodii kun mala walitti makuu hojii irra jiru hin qabu. Bulchaa kuusaa koodii mala walitti makuu, galmee tokkootti cuunfuu ykn bu'uura jijjiiruu akka hojii irra oolchu gaafadhu.",
"confirmTitle": "Gaaffii walitti makuu raawwatamuu?",
+ "confirmTitleTerm": "{{term}} raawwatamuu?",
"confirmMessage": "Kun jijjiiramoota kee damee bu'uuraatti walitti maka.",
"enableAutoMergeConfirmTitle": "Ofumaan walitti makuun hojii irra haa oolu?",
"enableAutoMergeConfirmMessage": "Qorannoowwan barbaachisan hundi yeroo darban, GitHub gaaffii walitti makuu kana ofumaan raawwata.",
+ "enableAutoMergeConfirmMessageTerm": "Piipilaayiniin isaa yoo milkaa'e, {{term}} ofumaan ni raawwatama.",
+ "enableAutoMergeDescriptionTerm": "GitLab {{term}} kana piipilaayiniin isaa yoo milkaa'e ofumaan ni raawwata.",
"forbidden": "Gaaffii walitti makuu kana raawwachuuf hayyama hin qabdu.",
"cannotMerge": "Gaaffiin walitti makuu kun akkuma jirutti raawwatamuu hin danda'u.",
"couldNotMerge": "Gaaffii walitti makuu raawwachuun hin danda'amne.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Duraan walitti makameera",
- "closed": "Gaaffiin walitti makuu kun cufameera"
+ "closed": "Gaaffiin walitti makuu kun cufameera",
+ "closedMergeRequest": "Gaaffiin walitti makuu kun cufameera"
},
"partialSuccessBanner": {
"body": "Damee haquun hin danda'amne: {{reason}}",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Gaaffiin walitti makuu kun ammatti raawwatamuu hin danda'u",
"notMergeableDetail": "GitHub haala walitti makamuu {{state}} jedhamu gabaase."
},
+ "restrictions": {
+ "title": "Dhorkawwan raawwachuu",
+ "approvalsRequired_one": "Mirkaneessi {{displayCount}} barbaachisa",
+ "approvalsRequired_other": "Mirkaneewwan {{displayCount}} barbaachisu",
+ "pipelineMustSucceed": "Raawwachuu dura piipilaayiniin milkaa'uun dirqama."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Piipilaayiniin galmee jijjiiramaa dhiyeenya kanaa irratti ni kufaa jira.",
+ "pendingPipeline": "Piipilaayiniin galmee jijjiiramaa dhiyeenya kanaa irratti ammallee hojjechaa jira.",
+ "permission": "{{term}} kana raawwachuuf hayyama hin qabdu.",
+ "draft": "Walitti makuu dura {{term}} gamaaggamaaf qophii ta'uu isaa mallatteessi."
+ },
"methodLabels": {
"merge": "Galmee walitti makuu uumi",
"squash": "Galmee tokkootti cuunfiitii walitti maki",
@@ -448,6 +472,7 @@
"acceptTerms": "Fudhadhu",
"replyBadRequest": "Deebiin kun maxxanfamuu hin danda'u. Dameen marii jijjiirameera ta'a.",
"replyForbidden": "Gaaffii walitti makuu kanaaf deebii kennuuf hayyama hin qabdu.",
+ "replyForbiddenTerm": "{{term}} kanaaf deebii kennuuf hayyama hin qabdu.",
"moderation": {
"reportContent": {
"terminal": "Yaadni kun gabaafamuu hin danda'u.",
@@ -508,16 +533,18 @@
"reviewPullRequest": "Gaaffii walitti makuu gamaaggami",
"headLine": "{{counts}} · galmee dhumaa {{sha}}",
"entry": {
- "eyebrow": "URL fayyadamuun gaaffii walitti makuu bani.",
- "pastePrLink": "Liinkii PR maxxansi",
- "noRecentPrs": "PR dhiheenyaa hin jiru",
- "noRecentPrsDescription": "Gamaaggama jalqabuuf liinkii PR bakka armaan oliitti maxxansi — yeroo itti aanu asitti mul'ata.",
+ "eyebrow": "Gaaffii walitti makuu URL dhaan bani",
+ "pastePrLink": "Liinkii gaaffii walitti makuu maxxansi",
+ "noRecentPrs": "Gamaaggawwan dhiyeenya kanaa hin jiran",
+ "noRecentPrsDescription": "Gamaaggama jalqabuuf liinkii olitti maxxansi — yeroo itti aanu asitti ni mul'ata.",
"couldNotLoad": "Fe'uu hin danda'amne.",
"removeFromRecentsTitle": "Tarree dhiheenyaa keessaa haqamuu?",
- "removeFromRecentsMessage": "Gaaffiin walitti makuu kun tarree dhiheenyaa kee keessaa haqama.",
+ "removeFromRecentsMessage": "Gamaaggamaan kun gamaaggawwan dhiyeenya kanaa keessaa ni haqama.",
"removeRecentAccessibility": "{{repo}} tarree dhiheenyaa keessaa haqi",
- "urlAccessibility": "URL gaaffii walitti makuu GitHub",
- "clearLink": "Liinkii gaaffii walitti makuu haqi",
+ "urlAccessibility": "URL gaaffii walitti makuu galchi",
+ "urlPlaceholder": "URL gaaffii walitti makuu",
+ "openAccessibility": "Gaaffii walitti makuu bani",
+ "clearLink": "Liinkii qulqulleessi",
"pasteLink": "Liinkii gaaffii walitti makuu maxxansi",
"open": "Banaa"
},
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Walqunnamtii GitHub sakatta'uun hin danda'amne.",
"checkFailedMessage": "Hanga kun fe'amutti haala seensaa beekuun hin danda'amu.",
+ "checkFailedTitleGitLab": "Walqunnamtii GitLab sakatta'uun hin danda'amne.",
+ "checkFailedTitleBitbucket": "Walqunnamtii Bitbucket sakatta'uun hin danda'amne.",
+ "providerCheckFailedMessage": "Kun fe'amuun isaa dura haalli walqunnamtii hin argamu.",
"reconnectTitle": "GitHub irra deebi'ii walqabsiisi",
"reconnectDescription": "Hayyamni walqunnamtii GitHub kee haqameera. Gaaffiiwwan walitti makuu bilbilaan gamaaggamuu itti fufuuf irra deebi'ii walqabsiisi.",
- "description": "Gaaffiiwwan walitti makuu bilbilaan gamaaggamuuf herrega GitHub kee walqabsiisi."
+ "description": "Gaaffiiwwan walitti makuu bilbilaan gamaaggamuuf herrega GitHub kee walqabsiisi.",
+ "gitlabDescription": "Gaaffiiwwan walitti makuu simbirroo harkaan gamaaggamuuf herrega GitLab kee walqabsiisi.",
+ "bitbucketDescription": "Gaaffiiwwan walitti makuu simbirroo harkaan gamaaggamuuf Bitbucket dhaabbata kana waliin walqabsiisi.",
+ "bitbucketOrgOnlyDescription": "Gaaffiiwwan walitti makuu Bitbucket isaa gamaaggamuuf profaayilii kee keessatti dhaabbata filadhu."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Yeroon walitti hidhamiinsa GitHub darbeera.",
- "message": "Walqunnamtiin GitHub kee kana booda hin hojjetu. Irra deebi'ii ilaali — yoo barbaachise akka irra deebi'ii walqabsiiftu gaafatamta."
+ "message": "Walqunnamtiin GitHub kee kana booda hin hojjetu. Irra deebi'ii ilaali — yoo barbaachise akka irra deebi'ii walqabsiiftu gaafatamta.",
+ "gitlabTitle": "Yeroon walitti hidhamiinsa GitLab darbeera.",
+ "bitbucketTitle": "Yeroon walitti hidhamiinsa Bitbucket darbeera.",
+ "providerMessage": "Walqunnamtiin {{provider}} kee kana booda hin hojjetu. Irra deebi'ii ilaali — yoo barbaachise akka irra deebi'ii walqabsiiftu gaafatamta."
},
"eventChips": {
"comment": "Yaada kenni",
@@ -643,6 +679,21 @@
"files": "Faayiloota",
"discussion": "Marii"
},
+ "terms": {
+ "pullRequest": "Gaaffii walitti makuu",
+ "mergeRequest": "Gaaffii walitti makuu",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Gaaffii walitti makuu qoodi",
+ "viewOnProvider": "{{provider}} irratti ilaali",
+ "mergeRequestUnavailable": "Gaaffiin walitti makuu hin argamu",
+ "unavailableDescription": "Haqame ta'uu danda'a, yookiin hayyama isaa hin qabdu.",
+ "accessDeniedMergeRequest": "Gaaffii walitti makuu kana ilaaluuf hayyama hin qabdu.",
+ "couldNotLoadMergeRequest": "Gaaffii walitti makuu fe'uu hin danda'amne.",
+ "discussionAccessDenied": "Marii gaaffii walitti makuu kanaa ilaaluuf hayyama hin qabdu.",
+ "discussionUnavailableMessage": "Gaaffiin walitti makuu kun haqameera ta'a.",
+ "noDiscussionDescription": "Gaaffii walitti makuu kana irratti dameewwan gamaaggamaa ykn yaadonni marii hin jiran.",
+ "noFilesChangedDescription": "Gaaffiin walitti makuu kun jijjiirama faayilii hin qabu."
+ },
"fileStatus": {
"modified": "Fooyya'e",
"renamed": "Maqaan jijjiirame",
@@ -659,7 +710,7 @@
"emptyLine": "(duwwaa)"
},
"linkPasteClipboardEmpty": "Gabateen waraabbii duwwaadha.",
- "linkPasteNotAPullRequest": "Kun liinkii gaaffii walitti makuu GitHub miti.",
+ "linkPasteNotAPullRequest": "Liinkii gaaffii walitti makuu miti",
"announce": {
"commentPosted": "Yaadni maxxanfameera",
"reviewSubmitted": "Gamaaggamni dhiheeffameera",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Yaadni kun maxxanfamuu hin danda'u. Sararri filatame jijjiirameera ta'a, ykn PR haaromfameera ta'a.",
"reviewNotSubmitted": "Gamaaggamni kun akkuma jirutti dhiheeffamuu hin danda'u. PR jijjiirameera ta'a, ykn gaaffii walitti makuu mataa keetii gamaaggamuu hin dandeessu.",
+ "reviewNotSubmittedTerm": "Gamaaggamaan kun akkasumaan hin galmaa'u. {{term}} jijjiirame ta'uu danda'a, yookiin {{term}} ofii kee gamaaggamuu hin dandeessu.",
"couldNotPostComment": "Yaada maxxansuu hin dandeenye.",
"couldNotSubmitReview": "Gamaaggama dhiheessuun hin danda'amne. Walqunnamtii kee ilaaliitii irra deebi'ii yaali."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Deebii kennuun hin danda'amne.",
"couldNotCompleteAction": "Gocha kana xumuruu hin dandeenye.",
"mergeResultDefaultError": "GitHub walitti makuu hin xumurre.",
+ "mergeResultNotCompleted": "{{term}} ni raawwatame hin jiru. Haala isaa ilaali itti deebi'ii yaali.",
"ambiguous": "Mirkaneessuu hin dandeenye — deebi'ii yaaluu dura PR ilaali.",
"persistenceFailed": "Gocha kana galmeessuu hin dandeenye. Maaloo booda deebi'ii yaali.",
"forbidden": "Hayyamni hin jiru."
@@ -1988,11 +2041,31 @@
"retryConnection": "Deebi'ii walqabsiisuuf yaali"
},
"newSession": {
+ "recentlyUsed": "Dhiheenya itti fayyadamte",
+ "couldNotLoadGithubRepositories": "Kuusaawwan koodii GitHub fe'uu hin danda'amne.",
+ "couldNotLoadGitlabRepositories": "Kuusaawwan koodii GitLab fe'uu hin danda'amne.",
+ "couldNotLoadBitbucketRepositories": "Kuusaawwan koodii Bitbucket fe'uu hin danda'amne.",
"connectGithubDescription": "GitHub biraawzarii kee keessatti walqabsiisi, sana booda kuusaa koodii filachuuf asitti deebi'i.",
+ "connectGitlabDescription": "GitLab biraawzarii kee keessatti walqabsiisi, sana booda kuusaa koodii filachuuf asitti deebi'i.",
+ "connectBitbucketDescription": "Bitbucket biraawzarii kee keessatti walqabsiisi, sana booda kuusaa koodii filachuuf asitti deebi'i.",
"openGithub": "GitHub bani",
+ "openGitlab": "GitLab bani",
+ "openBitbucket": "Bitbucket bani",
"refreshRepositories": "Kuusaawwan koodii haaromsi",
"githubConnected": "GitHub walqabateera",
+ "gitlabConnected": "GitLab walqabateera",
"noRepositoriesVisible": "Kuusaan koodii mul'atu hin jiru. Hayyama appilikeeshinii Kilo GitHub kuusaa koodii bira ga'uuf qabu ilaaliitii haaromsi.",
+ "noRepositoriesVisibleGitlab": "Kuusaan koodii mul'atu hin jiru. Hayyama GitLab kuusaa koodii bira ga'uuf qabu ilaaliitii haaromsi.",
+ "noRepositoriesVisibleBitbucket": "Kuusaan koodii mul'atu hin jiru. Hayyama Bitbucket kuusaa koodii bira ga'uuf qabu ilaaliitii haaromsi.",
+ "bitbucketOrganizationsOnly": "Bitbucket dhaabbilee qofaaf ni argama.",
+ "branchPickerTitle": "Damee filadhu",
+ "branchDefault": "Ofumaan",
+ "branchAccessibility": "Damee: {{label}}",
+ "branchLoading": "Dameewwan fe'amaa jiru",
+ "branchLoadError": "Dameewwan fe'uu hin danda'amne",
+ "branchUnavailable": "Kuusaa koodii kanaaf dameewwan hin argaman. Hayyama waltajjii waliin qabdu ilaali, erga kanaan booda kuusaa koodii bira filadhu.",
+ "branchEmpty": "Damee hin jiru",
+ "branchPlaceholder": "Damee tokko filadhu",
"runOnWithTarget": "{{target}} irratti hojjechiisi",
"environment": "Naannoo",
"couldNotLoadEnvironment": "Naannoo kee fe'uu hin danda'amne.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Kuusaawwan koodii haaromsuu hin danda'amne. Deebi'ii yaali.",
"discardDraftTitle": "Wixinee haqxaa?",
"discardDraftMessage": "Gaaffiin kee ni bada.",
+ "discardWithUploadsMessage": "Gaaffiin kee fi faayiloonni ol fe'aman kan ergaa ergametti hin qabachiifamne ni haqamu.",
"discardFailed": "Wixinee haquu hin danda'amne. Deebi'ii yaali.",
"remoteHint": "Adeemsa kilo kompiitara kee irratti hojjechaa jiru to'achuuf, kompiitara kee irratti `kilo remote` yookaan turtii CLI hojjechaa jiru keessatti `/remote` raawwadhu.",
- "connectBitbucketDescription": "Bitbucket biraawzarii kee keessatti walqabsiisi, sana booda kuusaa koodii filachuuf asitti deebi'i.",
- "connectGitlabDescription": "GitLab biraawzarii kee keessatti walqabsiisi, sana booda kuusaa koodii filachuuf asitti deebi'i.",
- "couldNotLoadBitbucketRepositories": "Kuusaawwan koodii Bitbucket fe'uu hin danda'amne.",
- "couldNotLoadGithubRepositories": "Kuusaawwan koodii GitHub fe'uu hin danda'amne.",
- "couldNotLoadGitlabRepositories": "Kuusaawwan koodii GitLab fe'uu hin danda'amne.",
- "gitlabConnected": "GitLab walqabateera",
- "noRepositoriesVisibleBitbucket": "Kuusaan koodii mul'atu hin jiru. Hayyama Bitbucket kuusaa koodii bira ga'uuf qabu ilaaliitii haaromsi.",
- "noRepositoriesVisibleGitlab": "Kuusaan koodii mul'atu hin jiru. Hayyama GitLab kuusaa koodii bira ga'uuf qabu ilaaliitii haaromsi.",
- "openBitbucket": "Bitbucket bani",
- "openGitlab": "GitLab bani",
- "recentlyUsed": "Dhiheenya itti fayyadamte",
- "cliCannotContinue": "CLI kun turtii itti fufuu hin danda'u. Cloud Agent yookaan CLI biraa filadhu.",
"continueFrom": "{{title}} itti fufaa jira.",
- "importFailed": "Turtii kana galchuu hin danda'amne.",
"importingSession": "Turtii galchaa jira",
- "discardWithUploadsMessage": "Gaaffiin kee fi faayiloonni ol fe'aman kan ergaa ergametti hin qabachiifamne ni haqamu."
+ "cliCannotContinue": "CLI kun turtii itti fufuu hin danda'u. Cloud Agent yookaan CLI biraa filadhu.",
+ "importFailed": "Turtii kana galchuu hin danda'amne."
},
"partRenderer": {
"updatedFileCount_one": "Faayiliin {{displayCount}} haaromfameera.",
diff --git a/apps/mobile/src/i18n/locales/or.json b/apps/mobile/src/i18n/locales/or.json
index c3b36b9dfc..6aa7c003de 100644
--- a/apps/mobile/src/i18n/locales/or.json
+++ b/apps/mobile/src/i18n/locales/or.json
@@ -36,6 +36,7 @@
"cost": "ଖର୍ଚ୍ଚ",
"discard": "ଛାଡ଼ିଦିଅନ୍ତୁ",
"findings": "ଚିହ୍ନଟ ସମସ୍ୟା",
+ "mergeRequest": "ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ",
"notConnected": "ସଂଯୋଗ ହୋଇନାହିଁ",
"notifications": "ବିଜ୍ଞପ୍ତି",
"pullRequest": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ପରିବର୍ତ୍ତନ ବିବରଣୀର ଖାଲି ଧାଡ଼ି"
},
"connectionExpired": "GitHub ସଂଯୋଗର ଅବଧି ଶେଷ ହୋଇଛି।",
+ "capabilities": {
+ "banner": {
+ "title": "ଏହି ପ୍ରଦାନକାରୀଙ୍କଠାରେ ଉପଲବ୍ଧ ନୁହେଁ",
+ "accessibility": "ଏହି ପ୍ରଦାନକାରୀଙ୍କଠାରେ ଉପଲବ୍ଧ ନୁହେଁ: {{reason}}"
+ }
+ },
"merge": {
"merge": "ମର୍ଜ୍",
"mergeNow": "ଏବେ ମର୍ଜ୍ କରନ୍ତୁ",
"mergePullRequest": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ମର୍ଜ୍",
+ "mergeTermTitle": "{{term}} ମର୍ଜ୍",
"enableAutoMerge": "ସ୍ୱୟଂଚାଳିତ ମର୍ଜ୍ ଚାଲୁ କରନ୍ତୁ",
"disableAutoMerge": "ସ୍ୱୟଂଚାଳିତ ମର୍ଜ୍ ବନ୍ଦ କରନ୍ତୁ",
"autoMergeOn": "ସ୍ୱୟଂଚାଳିତ ମର୍ଜ୍ ଚାଲୁ ଅଛି",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "ମର୍ଜ୍ ପରେ ଶାଖା ବିଲୋପ କରନ୍ତୁ",
"noEnabledMethods": "ଏହି ରିପୋଜିଟୋରିରେ କୌଣସି ମର୍ଜ୍ ପଦ୍ଧତି ଚାଲୁ ନାହିଁ। ମର୍ଜ୍, ସ୍କ୍ୱାସ୍ କିମ୍ବା ରିବେସ୍ ପଦ୍ଧତି ଚାଲୁ କରିବାକୁ ରିପୋଜିଟୋରିର ଜଣେ ପ୍ରଶାସକଙ୍କୁ କୁହନ୍ତୁ।",
"confirmTitle": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ମର୍ଜ୍ କରିବେ?",
+ "confirmTitleTerm": "{{term}} ମର୍ଜ୍ କରିବେ?",
"confirmMessage": "ଏହା ଆପଣଙ୍କ ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ବେସ୍ ଶାଖାରେ ମର୍ଜ୍ କରିବ।",
"enableAutoMergeConfirmTitle": "ସ୍ୱୟଂଚାଳିତ ମର୍ଜ୍ ଚାଲୁ କରିବେ?",
"enableAutoMergeConfirmMessage": "ସବୁ ଆବଶ୍ୟକ ଯାଞ୍ଚ ସଫଳ ହେଲେ GitHub ଏହି ପୁଲ୍ ରିକ୍ୱେଷ୍ଟକୁ ସ୍ୱୟଂଚାଳିତ ଭାବେ ମର୍ଜ୍ କରିବ।",
+ "enableAutoMergeConfirmMessageTerm": "ପାଇପଲାଇନ୍ ସଫଳ ହେଲେ {{term}} ସ୍ୱୟଂଚାଳିତ ଭାବେ ମର୍ଜ୍ ହେବ।",
+ "enableAutoMergeDescriptionTerm": "ପାଇପଲାଇନ୍ ସଫଳ ହେଲେ GitLab ଏହି {{term}}କୁ ସ୍ୱୟଂଚାଳିତ ଭାବେ ମର୍ଜ୍ କରେ।",
"forbidden": "ଏହି ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ମର୍ଜ୍ କରିବାକୁ ଆପଣଙ୍କର ଅନୁମତି ନାହିଁ।",
"cannotMerge": "ଏହି ପୁଲ୍ ରିକ୍ୱେଷ୍ଟକୁ ବର୍ତ୍ତମାନ ସ୍ଥିତିରେ ମର୍ଜ୍ କରିହେବ ନାହିଁ।",
"couldNotMerge": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ମର୍ଜ୍ ହୋଇପାରିଲା ନାହିଁ।",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "ଆଗରୁ ମର୍ଜ୍ ହୋଇଛି",
- "closed": "ଏହି ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ବନ୍ଦ ଅଛି"
+ "closed": "ଏହି ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ବନ୍ଦ ଅଛି",
+ "closedMergeRequest": "ଏହି ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ବନ୍ଦ ଅଛି"
},
"partialSuccessBanner": {
"body": "ଶାଖା ବିଲୋପ ହୋଇପାରିଲା ନାହିଁ: {{reason}}।",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ଏହି ପୁଲ୍ ରିକ୍ୱେଷ୍ଟକୁ ଏବେ ମର୍ଜ୍ କରିହେବ ନାହିଁ",
"notMergeableDetail": "GitHub ଅନୁସାରେ ମର୍ଜ୍ ସ୍ଥିତି ହେଉଛି {{state}}।"
},
+ "restrictions": {
+ "title": "ମର୍ଜ୍ ପ୍ରତିବନ୍ଧକ",
+ "approvalsRequired_one": "{{displayCount}} ଅନୁମୋଦନ ଆବଶ୍ୟକ",
+ "approvalsRequired_other": "{{displayCount}} ଅନୁମୋଦନ ଆବଶ୍ୟକ",
+ "pipelineMustSucceed": "ମର୍ଜ୍ କରିବା ପୂର୍ବରୁ ପାଇପଲାଇନ୍ ସଫଳ ହେବା ଆବଶ୍ୟକ।"
+ },
+ "providerBlocked": {
+ "failingPipeline": "ଶେଷ କମିଟ୍ରେ ପାଇପଲାଇନ୍ ଅସଫଳ ହେଉଛି।",
+ "pendingPipeline": "ଶେଷ କମିଟ୍ରେ ପାଇପଲାଇନ୍ ଏବେ ମଧ୍ୟ ଚାଲୁଛି।",
+ "permission": "ଏହି {{term}} ମର୍ଜ୍ କରିବାକୁ ଆପଣଙ୍କର ଅନୁମତି ନାହିଁ।",
+ "draft": "ମର୍ଜ୍ କରିବା ପୂର୍ବରୁ {{term}}କୁ ସମୀକ୍ଷା ପାଇଁ ପ୍ରସ୍ତୁତ ଭାବେ ଚିହ୍ନିତ କରନ୍ତୁ।"
+ },
"methodLabels": {
"merge": "ଏକ ମର୍ଜ୍ କମିଟ୍ ସୃଷ୍ଟି କରନ୍ତୁ",
"squash": "ସ୍କ୍ୱାସ୍ କରି ମର୍ଜ୍ କରନ୍ତୁ",
@@ -448,6 +472,7 @@
"acceptTerms": "ଗ୍ରହଣ କରନ୍ତୁ",
"replyBadRequest": "ଏହି ଉତ୍ତର ପୋଷ୍ଟ କରିହେବ ନାହିଁ। ଥ୍ରେଡ୍ ବଦଳିଥାଇପାରେ।",
"replyForbidden": "ଏହି ପୁଲ୍ ରିକ୍ୱେଷ୍ଟରେ ଉତ୍ତର ଦେବାକୁ ଆପଣଙ୍କର ଅନୁମତି ନାହିଁ।",
+ "replyForbiddenTerm": "ଏହି {{term}}ରେ ଉତ୍ତର ଦେବାକୁ ଆପଣଙ୍କର ଅନୁମତି ନାହିଁ।",
"moderation": {
"reportContent": {
"terminal": "ଏହି ମନ୍ତବ୍ୟ ବିଷୟରେ ରିପୋର୍ଟ କରିହେବ ନାହିଁ।",
@@ -508,17 +533,19 @@
"reviewPullRequest": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ସମୀକ୍ଷା କରନ୍ତୁ",
"headLine": "{{counts}} · ହେଡ୍ {{sha}}",
"entry": {
- "eyebrow": "URL ଦେଇ ଏକ ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ଖୋଲନ୍ତୁ।",
- "pastePrLink": "ଏକ PR ଲିଙ୍କ୍ ପେଷ୍ଟ କରନ୍ତୁ",
- "noRecentPrs": "ନିକଟରେ ଖୋଲିଥିବା କୌଣସି PR ନାହିଁ",
- "noRecentPrsDescription": "ସମୀକ୍ଷା ଆରମ୍ଭ କରିବାକୁ ଉପରେ ଏକ PR ଲିଙ୍କ୍ ପେଷ୍ଟ କରନ୍ତୁ — ପରବର୍ତ୍ତୀ ଥର ଏହା ଏଠାରେ ଦେଖାଯିବ।",
+ "eyebrow": "URL ମାଧ୍ୟମରେ ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ କିମ୍ବା ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ଖୋଲନ୍ତୁ",
+ "pastePrLink": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ କିମ୍ବା ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ଲିଙ୍କ୍ ପେଷ୍ଟ କରନ୍ତୁ",
+ "noRecentPrs": "କୌଣସି ସାମ୍ପ୍ରତିକ ସମୀକ୍ଷା ନାହିଁ",
+ "noRecentPrsDescription": "ସମୀକ୍ଷା ଆରମ୍ଭ କରିବାକୁ ଉପରେ ଏକ ଲିଙ୍କ୍ ପେଷ୍ଟ କରନ୍ତୁ — ପରବର୍ତ୍ତୀ ସମୟରେ ଏହା ଏଠାରେ ଦେଖାଯିବ।",
"couldNotLoad": "ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।",
"removeFromRecentsTitle": "ନିକଟରେ ଖୋଲିଥିବା ତାଲିକାରୁ ହଟାଇବେ?",
- "removeFromRecentsMessage": "ନିକଟରେ ଖୋଲିଥିବା ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ତାଲିକାରୁ ଏହି ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ହଟାଯିବ।",
+ "removeFromRecentsMessage": "ଏହି ସମୀକ୍ଷା ଆପଣଙ୍କ ସାମ୍ପ୍ରତିକ ତାଲିକାରୁ ହଟାଯିବ।",
"removeRecentAccessibility": "ନିକଟରେ ଖୋଲିଥିବା ତାଲିକାରୁ {{repo}}କୁ ହଟାନ୍ତୁ",
- "urlAccessibility": "GitHub ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ URL",
- "clearLink": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ଲିଙ୍କ୍ ହଟାନ୍ତୁ",
- "pasteLink": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ଲିଙ୍କ୍ ପେଷ୍ଟ କରନ୍ତୁ",
+ "urlAccessibility": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ କିମ୍ବା ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ URL ଦିଅନ୍ତୁ",
+ "urlPlaceholder": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ କିମ୍ବା ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ URL",
+ "openAccessibility": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ କିମ୍ବା ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ଖୋଲନ୍ତୁ",
+ "clearLink": "ଲିଙ୍କ୍ ହଟାନ୍ତୁ",
+ "pasteLink": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ କିମ୍ବା ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ଲିଙ୍କ୍ ପେଷ୍ଟ କରନ୍ତୁ",
"open": "ଖୋଲା"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub ସଂଯୋଗ ଯାଞ୍ଚ କରିହେଲା ନାହିଁ।",
"checkFailedMessage": "ଏହା ଲୋଡ୍ ହେବା ପରେ ହିଁ ସାଇନ୍ ଇନ୍ ସ୍ଥିତି ଜାଣିହେବ।",
+ "checkFailedTitleGitLab": "GitLab ସଂଯୋଗ ଯାଞ୍ଚ କରିହେଲା ନାହିଁ।",
+ "checkFailedTitleBitbucket": "Bitbucket ସଂଯୋଗ ଯାଞ୍ଚ କରିହେଲା ନାହିଁ।",
+ "providerCheckFailedMessage": "ଏହା ଲୋଡ୍ ହେବା ପର୍ଯ୍ୟନ୍ତ ସଂଯୋଗ ଅବସ୍ଥା ଉପଲବ୍ଧ ନୁହେଁ।",
"reconnectTitle": "GitHub ସହ ପୁଣି ସଂଯୋଗ",
"reconnectDescription": "ଆପଣଙ୍କ GitHub ସଂଯୋଗର ଅନୁମତି ପ୍ରତ୍ୟାହାର କରାଯାଇଛି। ମୋବାଇଲ୍ରେ ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ସମୀକ୍ଷା ଜାରି ରଖିବାକୁ ପୁଣି ସଂଯୋଗ କରନ୍ତୁ।",
- "description": "ମୋବାଇଲ୍ରେ ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ସମୀକ୍ଷା କରିବାକୁ ଆପଣଙ୍କ GitHub ଆକାଉଣ୍ଟ ସଂଯୋଗ କରନ୍ତୁ।"
+ "description": "ମୋବାଇଲ୍ରେ ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ସମୀକ୍ଷା କରିବାକୁ ଆପଣଙ୍କ GitHub ଆକାଉଣ୍ଟ ସଂଯୋଗ କରନ୍ତୁ।",
+ "gitlabDescription": "ମୋବାଇଲରେ ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟଗୁଡ଼ିକୁ ସମୀକ୍ଷା କରିବାକୁ ଆପଣଙ୍କ GitLab ଖାତା ସଂଯୋଗ କରନ୍ତୁ।",
+ "bitbucketDescription": "ମୋବାଇଲରେ ପୁଲ୍ ରିକ୍ୱେଷ୍ଟଗୁଡ଼ିକୁ ସମୀକ୍ଷା କରିବାକୁ ଏହି ସଂଗଠନକୁ Bitbucket ସହ ସଂଯୋଗ କରନ୍ତୁ।",
+ "bitbucketOrgOnlyDescription": "ଏହାର Bitbucket ପୁଲ୍ ରିକ୍ୱେଷ୍ଟଗୁଡ଼ିକୁ ସମୀକ୍ଷା କରିବାକୁ ଆପଣଙ୍କ ପ୍ରୋଫାଇଲରେ ଗୋଟିଏ ସଂଗଠନ ବାଛନ୍ତୁ।"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub ସଂଯୋଗର ଅବଧି ଶେଷ ହୋଇଛି।",
- "message": "ଆପଣଙ୍କ GitHub ସଂଯୋଗ ଆଉ ବୈଧ ନୁହେଁ। ସଂଯୋଗ ପୁଣି ଯାଞ୍ଚ କରନ୍ତୁ — ଆବଶ୍ୟକ ହେଲେ ପୁଣି ସଂଯୋଗ କରିବାକୁ କୁହାଯିବ।"
+ "message": "ଆପଣଙ୍କ GitHub ସଂଯୋଗ ଆଉ ବୈଧ ନୁହେଁ। ସଂଯୋଗ ପୁଣି ଯାଞ୍ଚ କରନ୍ତୁ — ଆବଶ୍ୟକ ହେଲେ ପୁଣି ସଂଯୋଗ କରିବାକୁ କୁହାଯିବ।",
+ "gitlabTitle": "GitLab ସଂଯୋଗର ଅବଧି ଶେଷ ହୋଇଛି।",
+ "bitbucketTitle": "Bitbucket ସଂଯୋଗର ଅବଧି ଶେଷ ହୋଇଛି।",
+ "providerMessage": "ଆପଣଙ୍କ {{provider}} ସଂଯୋଗ ଆଉ ବୈଧ ନୁହେଁ। ସଂଯୋଗ ପୁଣି ଯାଞ୍ଚ କରନ୍ତୁ — ଆବଶ୍ୟକ ହେଲେ ପୁଣି ସଂଯୋଗ କରିବାକୁ କୁହାଯିବ।"
},
"eventChips": {
"comment": "ମନ୍ତବ୍ୟ",
@@ -643,6 +679,21 @@
"files": "ଫାଇଲ୍",
"discussion": "ଆଲୋଚନା"
},
+ "terms": {
+ "pullRequest": "ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ",
+ "mergeRequest": "ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ସେୟାର କରନ୍ତୁ",
+ "viewOnProvider": "{{provider}}ରେ ଦେଖନ୍ତୁ",
+ "mergeRequestUnavailable": "ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ଉପଲବ୍ଧ ନାହିଁ",
+ "unavailableDescription": "ଏହା ଡିଲିଟ୍ କରାଯାଇଥିବ, କିମ୍ବା ଆପଣଙ୍କୁ ଏହାର ଆକ୍ସେସ୍ ମିଳିବ ନାହିଁ।",
+ "accessDeniedMergeRequest": "ଏହି ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ଦେଖିବାକୁ ଆପଣଙ୍କର ଅନୁମତି ନାହିଁ।",
+ "couldNotLoadMergeRequest": "ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।",
+ "discussionAccessDenied": "ଏହି ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ର ଆଲୋଚନା ଦେଖିବାକୁ ଆପଣଙ୍କର ଅନୁମତି ନାହିଁ।",
+ "discussionUnavailableMessage": "ଏହି ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ହଟାଯାଇଥାଇ ପାରେ।",
+ "noDiscussionDescription": "ଏହି ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟରେ କୌଣସି ସମୀକ୍ଷା ଥ୍ରେଡ୍ କିମ୍ବା ଆଲୋଚନା ମନ୍ତବ୍ୟ ନାହିଁ।",
+ "noFilesChangedDescription": "ଏହି ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟରେ କୌଣସି ଫାଇଲ୍ ପରିବର୍ତ୍ତନ ନାହିଁ।"
+ },
"fileStatus": {
"modified": "ପରିବର୍ତ୍ତିତ",
"renamed": "ନାମ ବଦଳାଗଲା",
@@ -659,7 +710,7 @@
"emptyLine": "(ଖାଲି)"
},
"linkPasteClipboardEmpty": "କ୍ଲିପବୋର୍ଡ ଖାଲି ଅଛି।",
- "linkPasteNotAPullRequest": "ଏହା GitHub ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ଲିଙ୍କ୍ ନୁହେଁ।",
+ "linkPasteNotAPullRequest": "ଏହା ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ କିମ୍ବା ମର୍ଜ୍ ରିକ୍ୱେଷ୍ଟ ଲିଙ୍କ୍ ନୁହେଁ",
"announce": {
"commentPosted": "ମନ୍ତବ୍ୟ ପୋଷ୍ଟ ହେଲା",
"reviewSubmitted": "ସମୀକ୍ଷା ଦାଖଲ ହେଲା",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ଏହି ମନ୍ତବ୍ୟ ପୋଷ୍ଟ କରିହେବ ନାହିଁ। ବଛାଯାଇଥିବା ଧାଡ଼ି ବଦଳିଥାଇପାରେ କିମ୍ବା PR ଅପଡେଟ୍ ହୋଇଥାଇପାରେ।",
"reviewNotSubmitted": "ଏହି ସମୀକ୍ଷାକୁ ବର୍ତ୍ତମାନ ସ୍ଥିତିରେ ଦାଖଲ କରିହେବ ନାହିଁ। PR ବଦଳିଥାଇପାରେ କିମ୍ବା ଏହା ଆପଣଙ୍କ ନିଜ ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ହୋଇଥିବାରୁ ଆପଣ ସମୀକ୍ଷା କରିପାରିବେ ନାହିଁ।",
+ "reviewNotSubmittedTerm": "ଏହି ସମୀକ୍ଷା ଯେମିତି ଅଛି ସେମିତି ଜମା ହୋଇପାରିବ ନାହିଁ। {{term}} ବଦଳିଯାଇଥିବ, କିମ୍ବା ଆପଣ ନିଜର {{term}}କୁ ସମୀକ୍ଷା କରିପାରିବେ ନାହିଁ।",
"couldNotPostComment": "ମନ୍ତବ୍ୟ ପୋଷ୍ଟ ହୋଇପାରିଲା ନାହିଁ।",
"couldNotSubmitReview": "ସମୀକ୍ଷା ଦାଖଲ ହୋଇପାରିଲା ନାହିଁ। ଆପଣଙ୍କ ସଂଯୋଗ ଯାଞ୍ଚ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"
},
@@ -675,6 +727,7 @@
"couldNotReply": "ଉତ୍ତର ଦିଆଯାଇପାରିଲା ନାହିଁ।",
"couldNotCompleteAction": "ଏହି କାର୍ଯ୍ୟ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇପାରିଲା ନାହିଁ।",
"mergeResultDefaultError": "GitHub ମର୍ଜ୍ ସମ୍ପୂର୍ଣ୍ଣ କଲା ନାହିଁ।",
+ "mergeResultNotCompleted": "{{term}} ମର୍ଜ୍ ହୋଇନାହିଁ। ଏହାର ଅବସ୍ଥା ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।",
"ambiguous": "କାର୍ଯ୍ୟ ସଫଳ ହୋଇଛି କି ନାହିଁ ନିଶ୍ଚିତ କରିହେଲା ନାହିଁ — ପୁଣି ଚେଷ୍ଟା କରିବା ପୂର୍ବରୁ PR ଯାଞ୍ଚ କରନ୍ତୁ।",
"persistenceFailed": "ଏହି କାର୍ଯ୍ୟର ରେକର୍ଡ୍ ରଖିହେଲା ନାହିଁ। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।",
"forbidden": "ଏହି କାର୍ଯ୍ୟ ପାଇଁ ଅନୁମତି ନାହିଁ।"
@@ -1988,11 +2041,31 @@
"retryConnection": "ପୁଣି ସଂଯୋଗ କରନ୍ତୁ"
},
"newSession": {
+ "recentlyUsed": "ନିକଟରେ ବ୍ୟବହୃତ",
+ "couldNotLoadGithubRepositories": "GitHub ରିପୋଜିଟୋରୀ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।",
+ "couldNotLoadGitlabRepositories": "GitLab ରିପୋଜିଟୋରୀ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।",
+ "couldNotLoadBitbucketRepositories": "Bitbucket ରିପୋଜିଟୋରୀ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।",
"connectGithubDescription": "ଆପଣଙ୍କ ବ୍ରାଉଜରରେ GitHub ସଂଯୋଗ କରନ୍ତୁ, ତା'ପରେ ଏକ ରିପୋଜିଟୋରୀ ବାଛିବାକୁ ଏଠାକୁ ଫେରନ୍ତୁ।",
+ "connectGitlabDescription": "ଆପଣଙ୍କ ବ୍ରାଉଜରରେ GitLab ସଂଯୋଗ କରନ୍ତୁ, ତା'ପରେ ଏକ ରିପୋଜିଟୋରୀ ବାଛିବାକୁ ଏଠାକୁ ଫେରନ୍ତୁ।",
+ "connectBitbucketDescription": "ଆପଣଙ୍କ ବ୍ରାଉଜରରେ Bitbucket ସଂଯୋଗ କରନ୍ତୁ, ତା'ପରେ ଏକ ରିପୋଜିଟୋରୀ ବାଛିବାକୁ ଏଠାକୁ ଫେରନ୍ତୁ।",
"openGithub": "GitHub ଖୋଲନ୍ତୁ",
+ "openGitlab": "GitLab ଖୋଲନ୍ତୁ",
+ "openBitbucket": "Bitbucket ଖୋଲନ୍ତୁ",
"refreshRepositories": "ରିପୋଜିଟୋରୀ ତାଲିକା ରିଫ୍ରେସ୍ କରନ୍ତୁ",
"githubConnected": "GitHub ସଂଯୋଜିତ",
+ "gitlabConnected": "GitLab ସଂଯୋଜିତ",
"noRepositoriesVisible": "କୌଣସି ରିପୋଜିଟୋରୀ ଦେଖାଯାଉନାହିଁ। Kilo GitHub ଆପ୍ର ରିପୋଜିଟୋରୀ ପ୍ରବେଶ ଅନୁମତି ଯାଞ୍ଚ କରି ରିଫ୍ରେସ୍ କରନ୍ତୁ।",
+ "noRepositoriesVisibleGitlab": "କୌଣସି ରିପୋଜିଟୋରୀ ଦେଖାଯାଉନାହିଁ। GitLab ର ରିପୋଜିଟୋରୀ ପ୍ରବେଶ ଅନୁମତି ଯାଞ୍ଚ କରି ରିଫ୍ରେସ୍ କରନ୍ତୁ।",
+ "noRepositoriesVisibleBitbucket": "କୌଣସି ରିପୋଜିଟୋରୀ ଦେଖାଯାଉନାହିଁ। Bitbucket ର ରିପୋଜିଟୋରୀ ପ୍ରବେଶ ଅନୁମତି ଯାଞ୍ଚ କରି ରିଫ୍ରେସ୍ କରନ୍ତୁ।",
+ "bitbucketOrganizationsOnly": "Bitbucket କେବଳ ସଂଗଠନଗୁଡ଼ିକ ପାଇଁ ଉପଲବ୍ଧ।",
+ "branchPickerTitle": "ଶାଖା ବାଛନ୍ତୁ",
+ "branchDefault": "ପୂର୍ବନିର୍ଦ୍ଧାରିତ",
+ "branchAccessibility": "ଶାଖା: {{label}}",
+ "branchLoading": "ଶାଖା ଲୋଡ୍ ହେଉଛି",
+ "branchLoadError": "ଶାଖା ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ",
+ "branchUnavailable": "ଏହି ରିପୋଜିଟରୀ ପାଇଁ ଶାଖା ଉପଲବ୍ଧ ନୁହେଁ। ପ୍ରଦାନକାରୀଙ୍କଠାରେ ଆପଣଙ୍କ ଆକ୍ସେସ୍ ଯାଞ୍ଚ କରନ୍ତୁ, ପରେ ଅନ୍ୟ ରିପୋଜିଟରୀ ବାଛନ୍ତୁ।",
+ "branchEmpty": "କୌଣସି ଶାଖା ଉପଲବ୍ଧ ନାହିଁ",
+ "branchPlaceholder": "ଗୋଟିଏ ଶାଖା ବାଛନ୍ତୁ",
"runOnWithTarget": "{{target}} ରେ ଚଲାନ୍ତୁ",
"environment": "ପରିବେଶ",
"couldNotLoadEnvironment": "ଆପଣଙ୍କ ପରିବେଶ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "ରିପୋଜିଟୋରୀ ତାଲିକା ରିଫ୍ରେସ୍ ହୋଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।",
"discardDraftTitle": "ଡ୍ରାଫ୍ଟ ହଟାଇବେ?",
"discardDraftMessage": "ଆପଣଙ୍କ ପ୍ରମ୍ପ୍ଟ ହଟିଯିବ।",
+ "discardWithUploadsMessage": "ଆପଣଙ୍କ ପ୍ରମ୍ପ୍ଟ ଏବଂ କୌଣସି ପଠାଯାଇଥିବା ବାର୍ତ୍ତାରେ ଯୋଡ଼ା ହୋଇନଥିବା ଅପଲୋଡ୍ ଫାଇଲ୍ ହଟିଯିବ।",
"discardFailed": "ଡ୍ରାଫ୍ଟ ହଟାଇ ହେଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।",
"remoteHint": "ସ୍ଥାନୀୟ kilo ପ୍ରକ୍ରିୟାକୁ ନିୟନ୍ତ୍ରଣ କରିବାକୁ ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ `kilo remote` କିମ୍ବା ଚାଲୁଥିବା CLI ସେସନରେ `/remote` ଚଲାନ୍ତୁ।",
- "connectBitbucketDescription": "ଆପଣଙ୍କ ବ୍ରାଉଜରରେ Bitbucket ସଂଯୋଗ କରନ୍ତୁ, ତା'ପରେ ଏକ ରିପୋଜିଟୋରୀ ବାଛିବାକୁ ଏଠାକୁ ଫେରନ୍ତୁ।",
- "connectGitlabDescription": "ଆପଣଙ୍କ ବ୍ରାଉଜରରେ GitLab ସଂଯୋଗ କରନ୍ତୁ, ତା'ପରେ ଏକ ରିପୋଜିଟୋରୀ ବାଛିବାକୁ ଏଠାକୁ ଫେରନ୍ତୁ।",
- "couldNotLoadBitbucketRepositories": "Bitbucket ରିପୋଜିଟୋରୀ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।",
- "couldNotLoadGithubRepositories": "GitHub ରିପୋଜିଟୋରୀ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।",
- "couldNotLoadGitlabRepositories": "GitLab ରିପୋଜିଟୋରୀ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ।",
- "gitlabConnected": "GitLab ସଂଯୋଜିତ",
- "noRepositoriesVisibleBitbucket": "କୌଣସି ରିପୋଜିଟୋରୀ ଦେଖାଯାଉନାହିଁ। Bitbucket ର ରିପୋଜିଟୋରୀ ପ୍ରବେଶ ଅନୁମତି ଯାଞ୍ଚ କରି ରିଫ୍ରେସ୍ କରନ୍ତୁ।",
- "noRepositoriesVisibleGitlab": "କୌଣସି ରିପୋଜିଟୋରୀ ଦେଖାଯାଉନାହିଁ। GitLab ର ରିପୋଜିଟୋରୀ ପ୍ରବେଶ ଅନୁମତି ଯାଞ୍ଚ କରି ରିଫ୍ରେସ୍ କରନ୍ତୁ।",
- "openBitbucket": "Bitbucket ଖୋଲନ୍ତୁ",
- "openGitlab": "GitLab ଖୋଲନ୍ତୁ",
- "recentlyUsed": "ନିକଟରେ ବ୍ୟବହୃତ",
- "cliCannotContinue": "ଏହି CLI ସେସନ୍ ଜାରି ରଖିପାରିବ ନାହିଁ। Cloud Agent କିମ୍ବା ଅନ୍ୟ ଏକ CLI ବାଛନ୍ତୁ।",
"continueFrom": "{{title}} ଜାରି ରଖାଯାଉଛି।",
- "importFailed": "ଏହି ସେସନ୍ ଆମଦାନି ହୋଇପାରିଲା ନାହିଁ।",
"importingSession": "ସେସନ୍ ଆମଦାନି ହେଉଛି",
- "discardWithUploadsMessage": "ଆପଣଙ୍କ ପ୍ରମ୍ପ୍ଟ ଏବଂ କୌଣସି ପଠାଯାଇଥିବା ବାର୍ତ୍ତାରେ ଯୋଡ଼ା ହୋଇନଥିବା ଅପଲୋଡ୍ ଫାଇଲ୍ ହଟିଯିବ।"
+ "cliCannotContinue": "ଏହି CLI ସେସନ୍ ଜାରି ରଖିପାରିବ ନାହିଁ। Cloud Agent କିମ୍ବା ଅନ୍ୟ ଏକ CLI ବାଛନ୍ତୁ।",
+ "importFailed": "ଏହି ସେସନ୍ ଆମଦାନି ହୋଇପାରିଲା ନାହିଁ।"
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}}ଟି ଫାଇଲ୍ ଅଦ୍ୟତନ ହୋଇଛି।",
diff --git a/apps/mobile/src/i18n/locales/pa.json b/apps/mobile/src/i18n/locales/pa.json
index 0a341d00aa..4777aa3ece 100644
--- a/apps/mobile/src/i18n/locales/pa.json
+++ b/apps/mobile/src/i18n/locales/pa.json
@@ -36,6 +36,7 @@
"cost": "ਲਾਗਤ",
"discard": "ਰੱਦ ਕਰੋ",
"findings": "ਜਾਂਚ ਦੇ ਨਤੀਜੇ",
+ "mergeRequest": "ਮਰਜ਼ ਰਿਕਵੈਸਟ",
"notConnected": "ਜੁੜਿਆ ਨਹੀਂ",
"notifications": "ਸੂਚਨਾਵਾਂ",
"pullRequest": "ਪੁੱਲ ਰਿਕਵੈਸਟ",
@@ -340,10 +341,17 @@
"emptyDiffRow": "ਡਿਫ਼ ਦੀ ਖਾਲੀ ਕਤਾਰ"
},
"connectionExpired": "GitHub ਕਨੈਕਸ਼ਨ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ।",
+ "capabilities": {
+ "banner": {
+ "title": "ਇਸ ਪ੍ਰਦਾਤਾ ਉੱਤੇ ਉਪਲਬਧ ਨਹੀਂ",
+ "accessibility": "ਇਸ ਪ੍ਰਦਾਤਾ ਉੱਤੇ ਉਪਲਬਧ ਨਹੀਂ: {{reason}}"
+ }
+ },
"merge": {
"merge": "ਮਰਜ",
"mergeNow": "ਹੁਣੇ ਮਰਜ ਕਰੋ",
"mergePullRequest": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਮਰਜ ਕਰਨਾ",
+ "mergeTermTitle": "{{term}} ਮਰਜ ਕਰਨਾ",
"enableAutoMerge": "ਆਟੋ-ਮਰਜ ਚਾਲੂ ਕਰੋ",
"disableAutoMerge": "ਆਟੋ-ਮਰਜ ਬੰਦ ਕਰੋ",
"autoMergeOn": "ਆਟੋ-ਮਰਜ ਚਾਲੂ ਹੈ",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "ਮਰਜ ਤੋਂ ਬਾਅਦ ਬ੍ਰਾਂਚ ਮਿਟਾਓ",
"noEnabledMethods": "ਇਸ ਰਿਪੋਜ਼ਿਟਰੀ ਵਿੱਚ ਮਰਜ ਕਰਨ ਦੀ ਕੋਈ ਵਿਧੀ ਚਾਲੂ ਨਹੀਂ ਹੈ। ਰਿਪੋਜ਼ਿਟਰੀ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਮਰਜ, ਸਕੁਐਸ਼ ਜਾਂ ਰੀਬੇਸ ਵਿਧੀ ਚਾਲੂ ਕਰਨ ਲਈ ਕਹੋ।",
"confirmTitle": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਮਰਜ ਕਰੀਏ?",
+ "confirmTitleTerm": "{{term}} ਮਰਜ ਕਰੀਏ?",
"confirmMessage": "ਇਸ ਨਾਲ ਤੁਹਾਡੇ ਬਦਲਾਅ ਬੇਸ ਬ੍ਰਾਂਚ ਵਿੱਚ ਮਰਜ ਹੋ ਜਾਣਗੇ।",
"enableAutoMergeConfirmTitle": "ਆਟੋ-ਮਰਜ ਚਾਲੂ ਕਰੀਏ?",
"enableAutoMergeConfirmMessage": "ਸਾਰੀਆਂ ਲੋੜੀਂਦੀਆਂ ਜਾਂਚਾਂ ਸਫਲ ਹੋਣ 'ਤੇ GitHub ਇਸ ਪੁੱਲ ਰਿਕਵੈਸਟ ਨੂੰ ਆਪਣੇ ਆਪ ਮਰਜ ਕਰੇਗਾ।",
+ "enableAutoMergeConfirmMessageTerm": "ਪਾਈਪਲਾਈਨ ਸਫ਼ਲ ਹੁੰਦਿਆਂ ਹੀ {{term}} ਆਪਣੇ ਆਪ ਮਰਜ਼ ਹੋ ਜਾਵੇਗੀ।",
+ "enableAutoMergeDescriptionTerm": "ਪਾਈਪਲਾਈਨ ਸਫ਼ਲ ਹੁੰਦਿਆਂ ਹੀ GitLab ਇਸ {{term}} ਨੂੰ ਆਪਣੇ ਆਪ ਮਰਜ਼ ਕਰ ਦਿੰਦਾ ਹੈ।",
"forbidden": "ਤੁਹਾਨੂੰ ਇਸ ਪੁੱਲ ਰਿਕਵੈਸਟ ਨੂੰ ਮਰਜ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
"cannotMerge": "ਇਸ ਪੁੱਲ ਰਿਕਵੈਸਟ ਨੂੰ ਇਸ ਦੀ ਮੌਜੂਦਾ ਸਥਿਤੀ ਵਿੱਚ ਮਰਜ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।",
"couldNotMerge": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਮਰਜ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "ਪਹਿਲਾਂ ਹੀ ਮਰਜ ਹੋ ਗਈ",
- "closed": "ਇਹ ਪੁੱਲ ਰਿਕਵੈਸਟ ਬੰਦ ਹੈ"
+ "closed": "ਇਹ ਪੁੱਲ ਰਿਕਵੈਸਟ ਬੰਦ ਹੈ",
+ "closedMergeRequest": "ਇਹ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਬੰਦ ਹੈ"
},
"partialSuccessBanner": {
"body": "ਬ੍ਰਾਂਚ ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ: {{reason}}।",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ਇਹ ਪੁੱਲ ਰਿਕਵੈਸਟ ਅਜੇ ਮਰਜ ਨਹੀਂ ਹੋ ਸਕਦੀ",
"notMergeableDetail": "GitHub ਮੁਤਾਬਕ ਮਰਜ ਦੀ ਸਥਿਤੀ {{state}} ਹੈ।"
},
+ "restrictions": {
+ "title": "ਮਰਜ਼ ਪਾਬੰਦੀਆਂ",
+ "approvalsRequired_one": "{{displayCount}} ਮਨਜ਼ੂਰੀ ਚਾਹੀਦੀ",
+ "approvalsRequired_other": "{{displayCount}} ਮਨਜ਼ੂਰੀਆਂ ਚਾਹੀਦੀਆਂ",
+ "pipelineMustSucceed": "ਮਰਜ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਾਈਪਲਾਈਨ ਦਾ ਸਫ਼ਲ ਹੋਣਾ ਜ਼ਰੂਰੀ ਹੈ।"
+ },
+ "providerBlocked": {
+ "failingPipeline": "ਸਭ ਤੋਂ ਨਵੇਂ ਕਮਿਟ ਉੱਤੇ ਪਾਈਪਲਾਈਨ ਫੇਲ੍ਹ ਹੋ ਰਹੀ ਹੈ।",
+ "pendingPipeline": "ਸਭ ਤੋਂ ਨਵੇਂ ਕਮਿਟ ਉੱਤੇ ਪਾਈਪਲਾਈਨ ਹਾਲੇ ਵੀ ਚੱਲ ਰਹੀ ਹੈ।",
+ "permission": "ਤੁਹਾਨੂੰ ਇਸ {{term}} ਨੂੰ ਮਰਜ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
+ "draft": "ਮਰਜ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ {{term}} ਨੂੰ ਸਮੀਖਿਆ ਲਈ ਤਿਆਰ ਵਜੋਂ ਚਿੰਨ੍ਹਿਤ ਕਰੋ।"
+ },
"methodLabels": {
"merge": "ਮਰਜ ਕਮਿਟ ਬਣਾਓ",
"squash": "ਸਕੁਐਸ਼ ਕਰਕੇ ਮਰਜ ਕਰੋ",
@@ -448,6 +472,7 @@
"acceptTerms": "ਸਵੀਕਾਰ ਕਰੋ",
"replyBadRequest": "ਇਹ ਜਵਾਬ ਪੋਸਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਥ੍ਰੈਡ ਬਦਲਿਆ ਹੋ ਸਕਦਾ ਹੈ।",
"replyForbidden": "ਤੁਹਾਨੂੰ ਇਸ ਪੁੱਲ ਰਿਕਵੈਸਟ 'ਤੇ ਜਵਾਬ ਦੇਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
+ "replyForbiddenTerm": "ਤੁਹਾਨੂੰ ਇਸ {{term}} 'ਤੇ ਜਵਾਬ ਦੇਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
"moderation": {
"reportContent": {
"terminal": "ਇਸ ਟਿੱਪਣੀ ਦੀ ਰਿਪੋਰਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।",
@@ -508,17 +533,19 @@
"reviewPullRequest": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਦੀ ਸਮੀਖਿਆ ਕਰੋ",
"headLine": "{{counts}} · ਹੈੱਡ {{sha}}",
"entry": {
- "eyebrow": "URL ਰਾਹੀਂ ਪੁੱਲ ਰਿਕਵੈਸਟ ਖੋਲ੍ਹੋ।",
- "pastePrLink": "PR ਲਿੰਕ ਪੇਸਟ ਕਰੋ",
- "noRecentPrs": "ਹਾਲ ਹੀ ਦੀ ਕੋਈ PR ਨਹੀਂ",
- "noRecentPrsDescription": "ਸਮੀਖਿਆ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਉੱਪਰ PR ਲਿੰਕ ਪੇਸਟ ਕਰੋ — ਇਹ ਅਗਲੀ ਵਾਰ ਇੱਥੇ ਦਿਖਾਈ ਦੇਵੇਗੀ।",
+ "eyebrow": "URL ਰਾਹੀਂ ਪੁੱਲ ਰਿਕਵੈਸਟ ਜਾਂ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਖੋਲ੍ਹੋ",
+ "pastePrLink": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਜਾਂ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਦਾ ਲਿੰਕ ਪੇਸਟ ਕਰੋ",
+ "noRecentPrs": "ਕੋਈ ਹਾਲੀਆ ਸਮੀਖਿਆ ਨਹੀਂ",
+ "noRecentPrsDescription": "ਸਮੀਖਿਆ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਉੱਤੇ ਲਿੰਕ ਪੇਸਟ ਕਰੋ — ਅਗਲੀ ਵਾਰ ਇਹ ਇੱਥੇ ਦਿਖਾਈ ਦੇਵੇਗੀ।",
"couldNotLoad": "ਲੋਡ ਨਹੀਂ ਹੋ ਸਕਿਆ।",
"removeFromRecentsTitle": "ਹਾਲੀਆ ਸੂਚੀ ਵਿੱਚੋਂ ਹਟਾਈਏ?",
- "removeFromRecentsMessage": "ਇਹ ਪੁੱਲ ਰਿਕਵੈਸਟ ਤੁਹਾਡੀ ਹਾਲੀਆ ਸੂਚੀ ਵਿੱਚੋਂ ਹਟਾ ਦਿੱਤੀ ਜਾਵੇਗੀ।",
+ "removeFromRecentsMessage": "ਇਹ ਸਮੀਖਿਆ ਤੁਹਾਡੀ ਹਾਲੀਆ ਸੂਚੀ ਵਿੱਚੋਂ ਹਟਾ ਦਿੱਤੀ ਜਾਵੇਗੀ।",
"removeRecentAccessibility": "{{repo}} ਨੂੰ ਹਾਲੀਆ ਸੂਚੀ ਵਿੱਚੋਂ ਹਟਾਓ",
- "urlAccessibility": "GitHub ਪੁੱਲ ਰਿਕਵੈਸਟ ਦਾ URL",
- "clearLink": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਦਾ ਲਿੰਕ ਹਟਾਓ",
- "pasteLink": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਦਾ ਲਿੰਕ ਪੇਸਟ ਕਰੋ",
+ "urlAccessibility": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਜਾਂ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਦਾ URL ਦਰਜ ਕਰੋ",
+ "urlPlaceholder": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਜਾਂ ਮਰਜ਼ ਰਿਕਵੈਸਟ URL",
+ "openAccessibility": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਜਾਂ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਖੋਲ੍ਹੋ",
+ "clearLink": "ਲਿੰਕ ਹਟਾਓ",
+ "pasteLink": "ਪੁੱਲ ਰਿਕਵੈਸਟ ਜਾਂ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਦਾ ਲਿੰਕ ਪੇਸਟ ਕਰੋ",
"open": "ਖੋਲ੍ਹੋ"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਨਹੀਂ ਹੋ ਸਕੀ।",
"checkFailedMessage": "ਇਹ ਲੋਡ ਹੋਣ ਤੱਕ ਸਾਈਨ-ਇਨ ਦੀ ਸਥਿਤੀ ਉਪਲਬਧ ਨਹੀਂ ਹੋਵੇਗੀ।",
+ "checkFailedTitleGitLab": "GitLab ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਨਹੀਂ ਹੋ ਸਕੀ।",
+ "checkFailedTitleBitbucket": "Bitbucket ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਨਹੀਂ ਹੋ ਸਕੀ।",
+ "providerCheckFailedMessage": "ਇਸ ਦੇ ਲੋਡ ਹੋਣ ਤੱਕ ਕਨੈਕਸ਼ਨ ਦੀ ਸਥਿਤੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।",
"reconnectTitle": "GitHub ਨੂੰ ਦੁਬਾਰਾ ਕਨੈਕਟ ਕਰੋ",
"reconnectDescription": "ਤੁਹਾਡਾ GitHub ਕਨੈਕਸ਼ਨ ਰੱਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ। ਮੋਬਾਈਲ 'ਤੇ ਪੁੱਲ ਰਿਕਵੈਸਟਾਂ ਦੀ ਸਮੀਖਿਆ ਜਾਰੀ ਰੱਖਣ ਲਈ ਦੁਬਾਰਾ ਕਨੈਕਟ ਕਰੋ।",
- "description": "ਮੋਬਾਈਲ 'ਤੇ ਪੁੱਲ ਰਿਕਵੈਸਟਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰਨ ਲਈ ਆਪਣਾ GitHub ਖਾਤਾ ਕਨੈਕਟ ਕਰੋ।"
+ "description": "ਮੋਬਾਈਲ 'ਤੇ ਪੁੱਲ ਰਿਕਵੈਸਟਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰਨ ਲਈ ਆਪਣਾ GitHub ਖਾਤਾ ਕਨੈਕਟ ਕਰੋ।",
+ "gitlabDescription": "ਮੋਬਾਈਲ ਉੱਤੇ ਮਰਜ਼ ਰਿਕਵੈਸਟਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰਨ ਲਈ ਆਪਣਾ GitLab ਖਾਤਾ ਕਨੈਕਟ ਕਰੋ।",
+ "bitbucketDescription": "ਮੋਬਾਈਲ ਉੱਤੇ ਪੁੱਲ ਰਿਕਵੈਸਟਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰਨ ਲਈ ਇਸ ਸੰਗਠਨ ਨੂੰ Bitbucket ਨਾਲ ਕਨੈਕਟ ਕਰੋ।",
+ "bitbucketOrgOnlyDescription": "ਆਪਣੀ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਕੋਈ ਸੰਗਠਨ ਚੁਣੋ ਤਾਂ ਜੋ ਉਸ ਦੀਆਂ Bitbucket ਪੁੱਲ ਰਿਕਵੈਸਟਾਂ ਦੀ ਸਮੀਖਿਆ ਕੀਤੀ ਜਾ ਸਕੇ।"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub ਕਨੈਕਸ਼ਨ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ।",
- "message": "ਤੁਹਾਡਾ GitHub ਕਨੈਕਸ਼ਨ ਹੁਣ ਵੈਧ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਕਨੈਕਸ਼ਨ ਦੀ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ — ਲੋੜ ਹੋਣ 'ਤੇ ਤੁਹਾਨੂੰ ਦੁਬਾਰਾ ਕਨੈਕਟ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਵੇਗਾ।"
+ "message": "ਤੁਹਾਡਾ GitHub ਕਨੈਕਸ਼ਨ ਹੁਣ ਵੈਧ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਕਨੈਕਸ਼ਨ ਦੀ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ — ਲੋੜ ਹੋਣ 'ਤੇ ਤੁਹਾਨੂੰ ਦੁਬਾਰਾ ਕਨੈਕਟ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਵੇਗਾ।",
+ "gitlabTitle": "GitLab ਕਨੈਕਸ਼ਨ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ।",
+ "bitbucketTitle": "Bitbucket ਕਨੈਕਸ਼ਨ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ।",
+ "providerMessage": "ਤੁਹਾਡਾ {{provider}} ਕਨੈਕਸ਼ਨ ਹੁਣ ਵੈਧ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਕਨੈਕਸ਼ਨ ਦੀ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ — ਲੋੜ ਹੋਣ 'ਤੇ ਤੁਹਾਨੂੰ ਦੁਬਾਰਾ ਕਨੈਕਟ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਵੇਗਾ।"
},
"eventChips": {
"comment": "ਟਿੱਪਣੀ",
@@ -643,6 +679,21 @@
"files": "ਫਾਈਲਾਂ",
"discussion": "ਚਰਚਾ"
},
+ "terms": {
+ "pullRequest": "ਪੁੱਲ ਰਿਕਵੈਸਟ",
+ "mergeRequest": "ਮਰਜ਼ ਰਿਕਵੈਸਟ",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "ਮਰਜ਼ ਰਿਕਵੈਸਟ ਸਾਂਝੀ ਕਰੋ",
+ "viewOnProvider": "{{provider}} ਉੱਤੇ ਵੇਖੋ",
+ "mergeRequestUnavailable": "ਮਰਜ਼ ਰਿਕਵੈਸਟ ਉਪਲਬਧ ਨਹੀਂ",
+ "unavailableDescription": "ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਹਟਾ ਦਿੱਤੀ ਗਈ ਹੋਵੇ, ਜਾਂ ਤੁਹਾਡੇ ਕੋਲ ਇਸ ਦੀ ਪਹੁੰਚ ਨਾ ਹੋਵੇ।",
+ "accessDeniedMergeRequest": "ਤੁਹਾਨੂੰ ਇਸ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਨੂੰ ਵੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
+ "couldNotLoadMergeRequest": "ਮਰਜ਼ ਰਿਕਵੈਸਟ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀ।",
+ "discussionAccessDenied": "ਤੁਹਾਨੂੰ ਇਸ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਦੀ ਚਰਚਾ ਵੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
+ "discussionUnavailableMessage": "ਇਹ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਹਟਾਈ ਗਈ ਹੋ ਸਕਦੀ ਹੈ।",
+ "noDiscussionDescription": "ਇਸ ਮਰਜ਼ ਰਿਕਵੈਸਟ 'ਤੇ ਸਮੀਖਿਆ ਦਾ ਕੋਈ ਥ੍ਰੈਡ ਜਾਂ ਗੱਲਬਾਤ ਦੀ ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ ਹੈ।",
+ "noFilesChangedDescription": "ਇਸ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਵਿੱਚ ਕਿਸੇ ਫਾਈਲ ਵਿੱਚ ਬਦਲਾਅ ਨਹੀਂ ਕੀਤਾ ਗਿਆ।"
+ },
"fileStatus": {
"modified": "ਸੋਧੀ ਗਈ",
"renamed": "ਨਾਮ ਬਦਲਿਆ",
@@ -659,7 +710,7 @@
"emptyLine": "(ਖਾਲੀ)"
},
"linkPasteClipboardEmpty": "ਕਲਿੱਪਬੋਰਡ ਖਾਲੀ ਹੈ।",
- "linkPasteNotAPullRequest": "ਇਹ GitHub ਪੁੱਲ ਰਿਕਵੈਸਟ ਦਾ ਲਿੰਕ ਨਹੀਂ ਹੈ।",
+ "linkPasteNotAPullRequest": "ਇਹ ਪੁੱਲ ਰਿਕਵੈਸਟ ਜਾਂ ਮਰਜ਼ ਰਿਕਵੈਸਟ ਦਾ ਲਿੰਕ ਨਹੀਂ ਹੈ",
"announce": {
"commentPosted": "ਟਿੱਪਣੀ ਪੋਸਟ ਹੋ ਗਈ",
"reviewSubmitted": "ਸਮੀਖਿਆ ਜਮ੍ਹਾਂ ਹੋ ਗਈ",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ਇਹ ਟਿੱਪਣੀ ਪੋਸਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਚੁਣੀ ਲਾਈਨ ਬਦਲ ਗਈ ਹੋਵੇ ਜਾਂ PR ਅੱਪਡੇਟ ਹੋ ਗਈ ਹੋਵੇ।",
"reviewNotSubmitted": "ਇਸ ਸਮੀਖਿਆ ਨੂੰ ਇਸ ਦੇ ਮੌਜੂਦਾ ਰੂਪ ਵਿੱਚ ਜਮ੍ਹਾਂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ PR ਬਦਲ ਗਈ ਹੋਵੇ ਜਾਂ ਇਹ ਤੁਹਾਡੀ ਆਪਣੀ ਪੁੱਲ ਰਿਕਵੈਸਟ ਹੋਵੇ, ਜਿਸ ਦੀ ਸਮੀਖਿਆ ਤੁਸੀਂ ਨਹੀਂ ਕਰ ਸਕਦੇ।",
+ "reviewNotSubmittedTerm": "ਇਹ ਸਮੀਖਿਆ ਇਵੇਂ ਸਬਮਿਟ ਨਹੀਂ ਹੋ ਸਕਦੀ। ਹੋ ਸਕਦਾ ਹੈ {{term}} ਬਦਲ ਗਈ ਹੋਵੇ, ਜਾਂ ਤੁਸੀਂ ਆਪਣੀ ਖ਼ੁਦ ਦੀ {{term}} ਦੀ ਸਮੀਖਿਆ ਨਹੀਂ ਕਰ ਸਕਦੇ।",
"couldNotPostComment": "ਟਿੱਪਣੀ ਪੋਸਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।",
"couldNotSubmitReview": "ਸਮੀਖਿਆ ਜਮ੍ਹਾਂ ਨਹੀਂ ਹੋ ਸਕੀ। ਆਪਣੇ ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
},
@@ -675,6 +727,7 @@
"couldNotReply": "ਜਵਾਬ ਨਹੀਂ ਦਿੱਤਾ ਜਾ ਸਕਿਆ।",
"couldNotCompleteAction": "ਇਹ ਕਾਰਵਾਈ ਪੂਰੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।",
"mergeResultDefaultError": "GitHub ਨੇ ਮਰਜ ਪੂਰਾ ਨਹੀਂ ਕੀਤਾ।",
+ "mergeResultNotCompleted": "{{term}} ਮਰਜ਼ ਨਹੀਂ ਹੋਈ। ਇਸ ਦੀ ਸਥਿਤੀ ਜਾਂਚੋ ਅਤੇ ਫਿਰ ਤੋਂ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
"ambiguous": "ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋ ਸਕੀ — ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ PR ਦੀ ਜਾਂਚ ਕਰੋ।",
"persistenceFailed": "ਅਸੀਂ ਇਹ ਕਾਰਵਾਈ ਰਿਕਾਰਡ ਨਹੀਂ ਕਰ ਸਕੇ। ਕਿਰਪਾ ਕਰਕੇ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
"forbidden": "ਇਸ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।"
@@ -1988,11 +2041,31 @@
"retryConnection": "ਮੁੜ ਕਨੈਕਟ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ"
},
"newSession": {
+ "recentlyUsed": "ਹਾਲ ਹੀ ਵਿੱਚ ਵਰਤੇ ਗਏ",
+ "couldNotLoadGithubRepositories": "GitHub ਰਿਪੋਜ਼ਟਰੀਆਂ ਲੋਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ।",
+ "couldNotLoadGitlabRepositories": "GitLab ਰਿਪੋਜ਼ਟਰੀਆਂ ਲੋਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ।",
+ "couldNotLoadBitbucketRepositories": "Bitbucket ਰਿਪੋਜ਼ਟਰੀਆਂ ਲੋਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ।",
"connectGithubDescription": "ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ GitHub ਨੂੰ ਕਨੈਕਟ ਕਰੋ, ਫਿਰ ਰਿਪੋਜ਼ਟਰੀ ਚੁਣਨ ਲਈ ਇੱਥੇ ਵਾਪਸ ਆਓ।",
+ "connectGitlabDescription": "GitLab ਨੂੰ ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਕਨੈਕਟ ਕਰੋ, ਫਿਰ ਰਿਪੋਜ਼ਟਰੀ ਚੁਣਨ ਲਈ ਇੱਥੇ ਵਾਪਸ ਆਓ।",
+ "connectBitbucketDescription": "Bitbucket ਨੂੰ ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਕਨੈਕਟ ਕਰੋ, ਫਿਰ ਰਿਪੋਜ਼ਟਰੀ ਚੁਣਨ ਲਈ ਇੱਥੇ ਵਾਪਸ ਆਓ।",
"openGithub": "GitHub ਖੋਲ੍ਹੋ",
+ "openGitlab": "GitLab ਖੋਲ੍ਹੋ",
+ "openBitbucket": "Bitbucket ਖੋਲ੍ਹੋ",
"refreshRepositories": "ਰਿਪੋਜ਼ਟਰੀਆਂ ਰਿਫਰੈਸ਼ ਕਰੋ",
"githubConnected": "GitHub ਕਨੈਕਟ ਹੈ",
+ "gitlabConnected": "GitLab ਕਨੈਕਟ ਹੈ",
"noRepositoriesVisible": "ਕੋਈ ਰਿਪੋਜ਼ਟਰੀ ਦਿਖਾਈ ਨਹੀਂ ਦੇ ਰਹੀ। ਜਾਂਚੋ ਕਿ Kilo GitHub ਐਪ ਨੂੰ ਰਿਪੋਜ਼ਟਰੀਆਂ ਤੱਕ ਪਹੁੰਚ ਹੈ, ਫਿਰ ਰਿਫਰੈਸ਼ ਕਰੋ।",
+ "noRepositoriesVisibleGitlab": "ਕੋਈ ਰਿਪੋਜ਼ਟਰੀ ਦਿਖਾਈ ਨਹੀਂ ਦੇ ਰਹੀ। GitLab ਲਈ ਰਿਪੋਜ਼ਟਰੀਆਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਜਾਂਚ ਕਰੋ, ਫਿਰ ਰਿਫਰੈਸ਼ ਕਰੋ।",
+ "noRepositoriesVisibleBitbucket": "ਕੋਈ ਰਿਪੋਜ਼ਟਰੀ ਦਿਖਾਈ ਨਹੀਂ ਦੇ ਰਹੀ। Bitbucket ਲਈ ਰਿਪੋਜ਼ਟਰੀਆਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਜਾਂਚ ਕਰੋ, ਫਿਰ ਰਿਫਰੈਸ਼ ਕਰੋ।",
+ "bitbucketOrganizationsOnly": "Bitbucket ਸਿਰਫ਼ ਸੰਗਠਨਾਂ ਲਈ ਉਪਲਬਧ ਹੈ।",
+ "branchPickerTitle": "ਬ੍ਰਾਂਚ ਚੁਣੋ",
+ "branchDefault": "ਡਿਫ਼ੌਲਟ",
+ "branchAccessibility": "ਬ੍ਰਾਂਚ: {{label}}",
+ "branchLoading": "ਬ੍ਰਾਂਚ ਲੋਡ ਹੋ ਰਹੇ ਹਨ",
+ "branchLoadError": "ਬ੍ਰਾਂਚ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੇ",
+ "branchUnavailable": "ਇਸ ਰਿਪੋਜ਼ਟਰੀ ਲਈ ਬ੍ਰਾਂਚ ਉਪਲਬਧ ਨਹੀਂ ਹਨ। ਪ੍ਰਦਾਤਾ ਕੋਲ ਆਪਣੀ ਪਹੁੰਚ ਜਾਂਚੋ, ਫਿਰ ਕੋਈ ਹੋਰ ਰਿਪੋਜ਼ਟਰੀ ਚੁਣੋ।",
+ "branchEmpty": "ਕੋਈ ਬ੍ਰਾਂਚ ਉਪਲਬਧ ਨਹੀਂ",
+ "branchPlaceholder": "ਇੱਕ ਬ੍ਰਾਂਚ ਚੁਣੋ",
"runOnWithTarget": "{{target}} 'ਤੇ ਚਲਾਓ",
"environment": "ਵਾਤਾਵਰਣ",
"couldNotLoadEnvironment": "ਤੁਹਾਡਾ ਵਾਤਾਵਰਣ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "ਰਿਪੋਜ਼ਟਰੀਆਂ ਰਿਫਰੈਸ਼ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
"discardDraftTitle": "ਕੀ ਡਰਾਫਟ ਰੱਦ ਕਰਨਾ ਹੈ?",
"discardDraftMessage": "ਤੁਹਾਡਾ ਪ੍ਰੌਂਪਟ ਮਿਟ ਜਾਵੇਗਾ।",
+ "discardWithUploadsMessage": "ਤੁਹਾਡਾ ਪ੍ਰੌਂਪਟ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਉਹ ਫਾਈਲਾਂ ਮਿਟਾ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ ਜੋ ਕਿਸੇ ਭੇਜੇ ਗਏ ਸੁਨੇਹੇ ਨਾਲ ਅਟੈਚ ਨਹੀਂ ਹਨ।",
"discardFailed": "ਡਰਾਫਟ ਰੱਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
"remoteHint": "ਆਪਣੇ ਕੰਪਿਊਟਰ 'ਤੇ ਚੱਲ ਰਹੀ kilo ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਕੰਟਰੋਲ ਕਰਨ ਲਈ `kilo remote` ਚਲਾਓ ਜਾਂ ਚੱਲ ਰਹੇ CLI ਸੈਸ਼ਨ ਵਿੱਚ `/remote` ਚਲਾਓ।",
- "connectBitbucketDescription": "Bitbucket ਨੂੰ ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਕਨੈਕਟ ਕਰੋ, ਫਿਰ ਰਿਪੋਜ਼ਟਰੀ ਚੁਣਨ ਲਈ ਇੱਥੇ ਵਾਪਸ ਆਓ।",
- "connectGitlabDescription": "GitLab ਨੂੰ ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਕਨੈਕਟ ਕਰੋ, ਫਿਰ ਰਿਪੋਜ਼ਟਰੀ ਚੁਣਨ ਲਈ ਇੱਥੇ ਵਾਪਸ ਆਓ।",
- "couldNotLoadBitbucketRepositories": "Bitbucket ਰਿਪੋਜ਼ਟਰੀਆਂ ਲੋਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ।",
- "couldNotLoadGithubRepositories": "GitHub ਰਿਪੋਜ਼ਟਰੀਆਂ ਲੋਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ।",
- "couldNotLoadGitlabRepositories": "GitLab ਰਿਪੋਜ਼ਟਰੀਆਂ ਲੋਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ।",
- "gitlabConnected": "GitLab ਕਨੈਕਟ ਹੈ",
- "noRepositoriesVisibleBitbucket": "ਕੋਈ ਰਿਪੋਜ਼ਟਰੀ ਦਿਖਾਈ ਨਹੀਂ ਦੇ ਰਹੀ। Bitbucket ਲਈ ਰਿਪੋਜ਼ਟਰੀਆਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਜਾਂਚ ਕਰੋ, ਫਿਰ ਰਿਫਰੈਸ਼ ਕਰੋ।",
- "noRepositoriesVisibleGitlab": "ਕੋਈ ਰਿਪੋਜ਼ਟਰੀ ਦਿਖਾਈ ਨਹੀਂ ਦੇ ਰਹੀ। GitLab ਲਈ ਰਿਪੋਜ਼ਟਰੀਆਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਜਾਂਚ ਕਰੋ, ਫਿਰ ਰਿਫਰੈਸ਼ ਕਰੋ।",
- "openBitbucket": "Bitbucket ਖੋਲ੍ਹੋ",
- "openGitlab": "GitLab ਖੋਲ੍ਹੋ",
- "recentlyUsed": "ਹਾਲ ਹੀ ਵਿੱਚ ਵਰਤੇ ਗਏ",
- "cliCannotContinue": "ਇਹ CLI ਸੈਸ਼ਨ ਜਾਰੀ ਨਹੀਂ ਰੱਖ ਸਕਦਾ। Cloud Agent ਜਾਂ ਕੋਈ ਹੋਰ CLI ਚੁਣੋ।",
"continueFrom": "{{title}} ਨੂੰ ਜਾਰੀ ਰੱਖਿਆ ਜਾ ਰਿਹਾ ਹੈ।",
- "importFailed": "ਇਸ ਸੈਸ਼ਨ ਨੂੰ ਆਯਾਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।",
"importingSession": "ਸੈਸ਼ਨ ਆਯਾਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
- "discardWithUploadsMessage": "ਤੁਹਾਡਾ ਪ੍ਰੌਂਪਟ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਉਹ ਫਾਈਲਾਂ ਮਿਟਾ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ ਜੋ ਕਿਸੇ ਭੇਜੇ ਗਏ ਸੁਨੇਹੇ ਨਾਲ ਅਟੈਚ ਨਹੀਂ ਹਨ।"
+ "cliCannotContinue": "ਇਹ CLI ਸੈਸ਼ਨ ਜਾਰੀ ਨਹੀਂ ਰੱਖ ਸਕਦਾ। Cloud Agent ਜਾਂ ਕੋਈ ਹੋਰ CLI ਚੁਣੋ।",
+ "importFailed": "ਇਸ ਸੈਸ਼ਨ ਨੂੰ ਆਯਾਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।"
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} ਫਾਈਲ ਅੱਪਡੇਟ ਕੀਤੀ ਗਈ ਹੈ।",
diff --git a/apps/mobile/src/i18n/locales/pl.json b/apps/mobile/src/i18n/locales/pl.json
index 87356d2d37..042949ac4c 100644
--- a/apps/mobile/src/i18n/locales/pl.json
+++ b/apps/mobile/src/i18n/locales/pl.json
@@ -4,6 +4,8 @@
"done": "Gotowe",
"retry": "Spróbuj ponownie",
"tryAgain": "Spróbuj ponownie",
+ "continue": "Kontynuuj",
+ "notNow": "Nie teraz",
"language": "Język",
"device": "Urządzenie",
"share": "Udostępnij {{title}}",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "Nie udało się skopiować do schowka.",
"required": "wymagane",
"error": "błąd: {{error}}",
- "notNow": "Nie teraz",
- "continue": "Kontynuuj",
"back": "Wstecz",
"somethingWentWrong": "Coś poszło nie tak.",
"couldNotOpen": "Nie udało się otworzyć: {{label}}.",
@@ -36,6 +36,7 @@
"cost": "Koszt",
"discard": "Odrzuć",
"findings": "Wykryte problemy",
+ "mergeRequest": "merge request",
"notConnected": "Brak połączenia",
"notifications": "Powiadomienia",
"pullRequest": "pR",
@@ -1575,11 +1576,31 @@
"retryConnection": "Połącz ponownie"
},
"newSession": {
+ "recentlyUsed": "Ostatnio używane",
+ "couldNotLoadGithubRepositories": "Nie udało się wczytać repozytoriów z GitHub.",
+ "couldNotLoadGitlabRepositories": "Nie udało się wczytać repozytoriów z GitLab.",
+ "couldNotLoadBitbucketRepositories": "Nie udało się wczytać repozytoriów z Bitbucket.",
"connectGithubDescription": "Połącz konto GitHub w przeglądarce, a następnie wróć tutaj, aby wybrać repozytorium.",
+ "connectGitlabDescription": "Połącz konto GitLab w przeglądarce, a następnie wróć tutaj, aby wybrać repozytorium.",
+ "connectBitbucketDescription": "Połącz konto Bitbucket w przeglądarce, a następnie wróć tutaj, aby wybrać repozytorium.",
"openGithub": "Otwórz GitHub",
+ "openGitlab": "Otwórz GitLab",
+ "openBitbucket": "Otwórz Bitbucket",
"refreshRepositories": "Odśwież repozytoria",
"githubConnected": "Połączono z GitHub",
+ "gitlabConnected": "Połączono z GitLab",
"noRepositoriesVisible": "Nie widać żadnych repozytoriów. Sprawdź, czy aplikacja Kilo w GitHub ma do nich dostęp, a następnie odśwież listę.",
+ "noRepositoriesVisibleGitlab": "Nie widać żadnych repozytoriów. Sprawdź uprawnienia dostępu do repozytoriów w GitLab, a następnie odśwież listę.",
+ "noRepositoriesVisibleBitbucket": "Nie widać żadnych repozytoriów. Sprawdź uprawnienia dostępu do repozytoriów w Bitbucket, a następnie odśwież listę.",
+ "bitbucketOrganizationsOnly": "Bitbucket jest dostępny tylko dla organizacji.",
+ "branchPickerTitle": "Wybierz gałąź",
+ "branchDefault": "Domyślna",
+ "branchAccessibility": "Gałąź: {{label}}",
+ "branchLoading": "Wczytywanie gałęzi",
+ "branchLoadError": "Nie udało się wczytać gałęzi",
+ "branchUnavailable": "Gałęzie nie są dostępne dla tego repozytorium. Sprawdź swój dostęp u dostawcy, a potem wybierz inne repozytorium.",
+ "branchEmpty": "Brak dostępnych gałęzi",
+ "branchPlaceholder": "Wybierz gałąź",
"runOnWithTarget": "Miejsce uruchomienia: {{target}}",
"environment": "Środowisko",
"couldNotLoadEnvironment": "Nie udało się wczytać twojego środowiska.",
@@ -1598,26 +1619,15 @@
"couldNotReadPendingSessions": "Nie udało się odczytać oczekujących sesji. Spróbuj ponownie.",
"failedToCreate": "Nie udało się utworzyć sesji.",
"couldNotRefreshRepositories": "Nie udało się odświeżyć repozytoriów. Spróbuj ponownie.",
- "discardDraftMessage": "Twoje polecenie zostanie usunięte.",
"discardDraftTitle": "Odrzucić szkic?",
+ "discardDraftMessage": "Twoje polecenie zostanie usunięte.",
+ "discardWithUploadsMessage": "Twoje polecenie i wszystkie przesłane pliki niedołączone do wysłanych wiadomości zostaną usunięte.",
"discardFailed": "Nie udało się odrzucić szkicu. Spróbuj ponownie.",
"remoteHint": "Uruchom `kilo remote` na swoim komputerze lub `/remote` w działającej sesji CLI, aby sterować lokalnym procesem kilo.",
- "connectBitbucketDescription": "Połącz konto Bitbucket w przeglądarce, a następnie wróć tutaj, aby wybrać repozytorium.",
- "connectGitlabDescription": "Połącz konto GitLab w przeglądarce, a następnie wróć tutaj, aby wybrać repozytorium.",
- "couldNotLoadBitbucketRepositories": "Nie udało się wczytać repozytoriów z Bitbucket.",
- "couldNotLoadGithubRepositories": "Nie udało się wczytać repozytoriów z GitHub.",
- "couldNotLoadGitlabRepositories": "Nie udało się wczytać repozytoriów z GitLab.",
- "gitlabConnected": "Połączono z GitLab",
- "noRepositoriesVisibleBitbucket": "Nie widać żadnych repozytoriów. Sprawdź uprawnienia dostępu do repozytoriów w Bitbucket, a następnie odśwież listę.",
- "noRepositoriesVisibleGitlab": "Nie widać żadnych repozytoriów. Sprawdź uprawnienia dostępu do repozytoriów w GitLab, a następnie odśwież listę.",
- "openBitbucket": "Otwórz Bitbucket",
- "openGitlab": "Otwórz GitLab",
- "recentlyUsed": "Ostatnio używane",
"continueFrom": "Kontynuujesz sesję {{title}}.",
"importingSession": "Importowanie sesji",
"cliCannotContinue": "Ta instancja CLI nie obsługuje kontynuowania sesji. Wybierz Cloud Agent lub inną instancję CLI.",
- "importFailed": "Nie udało się zaimportować tej sesji.",
- "discardWithUploadsMessage": "Twoje polecenie i wszystkie przesłane pliki niedołączone do wysłanych wiadomości zostaną usunięte."
+ "importFailed": "Nie udało się zaimportować tej sesji."
},
"partRenderer": {
"updatedFileCount_one": "Zaktualizowano {{displayCount}} plik.",
@@ -2340,164 +2350,11 @@
"installAttributionPromptTitle": "Zezwolić na ustalenie źródła instalacji?"
},
"prReview": {
+ "pullRequestUnavailable": "PR niedostępny",
+ "pullRequestUnavailableDescription": "Nie można otworzyć tego PR. Być może został usunięty, repozytorium jest prywatne lub nie zainstalowano w nim aplikacji Kilo dla GitHub.",
"accessDeniedDescription": "Nie masz uprawnień do wyświetlenia tego PR.",
- "checkConnection": "Sprawdź połączenie",
- "checks": {
- "checksCount": "kontrole: {{displayCount}}",
- "couldNotLoad": "Nie udało się wczytać kontroli.",
- "failed": "nieudane: {{displayCount}}",
- "noAccess": "Nie masz dostępu do kontroli tego repozytorium.",
- "noChecksReported": "Brak zgłoszonych kontroli",
- "notAvailable": "Kontrole nie są jeszcze dostępne. Być może najnowszy commit nie został jeszcze przetworzony lub aplikacja Kilo dla GitHub nie jest zainstalowana w repozytorium źródłowym.",
- "openDetails": "Otwórz szczegóły {{name}}",
- "passed": "zaliczone: {{displayCount}}",
- "pending": "oczekujące: {{displayCount}}",
- "retryChecks": "Ponów kontrole",
- "skipped": "pominięte: {{displayCount}}",
- "title": "Kontrole",
- "viewOnGitHub": "Zobacz PR w serwisie GitHub",
- "checkDetails": "szczegóły kontroli"
- },
- "composer": {
- "addTitle": "Nowy komentarz",
- "addToReview": "Dodaj do przeglądu",
- "comment": "Komentarz",
- "commentBody": "Treść komentarza",
- "commentBodyPlaceholder": "Treść komentarza",
- "commentNow": "Skomentuj teraz",
- "discardMessage": "Utracisz wersję roboczą komentarza.",
- "discardTitle": "Odrzucić komentarz?",
- "editTitle": "Edycja komentarza",
- "insertSuggestion": "Wstaw sugestię",
- "insertSuggestionA11y": "Wstaw sugestię zmiany kodu",
- "loadFailedTitle": "Nie udało się wczytać edytora komentarzy.",
- "ok": "OK",
- "unavailableMessage": "Ten komentarz do wysłania został już usunięty lub wysłany.",
- "unavailableTitle": "Komentarz niedostępny",
- "bodyEmpty": "Treść komentarza nie może być pusta.",
- "suggestionsOnlyAddedLines": "Sugestie dotyczą tylko dodanych wierszy.",
- "tapDiffLineToSuggest": "Dotknij wiersza w widoku różnic, aby włączyć sugestie."
- },
- "connect": {
- "checkFailedMessage": "Status logowania będzie dostępny dopiero po wczytaniu danych.",
- "checkFailedTitle": "Nie udało się sprawdzić połączenia z kontem GitHub.",
- "description": "Połącz konto GitHub, aby przeglądać PR na telefonie.",
- "reconnectDescription": "Cofnięto dostęp do konta GitHub. Połącz je ponownie, aby nadal przeglądać PR na telefonie.",
- "reconnectTitle": "Połącz ponownie konto GitHub"
- },
- "connectionExpired": "Połączenie z serwisem GitHub wygasło.",
- "couldNotLoadPullRequest": "Nie udało się wczytać PR.",
- "couldNotOpenGitHubAppSettings": "Nie udało się otworzyć ustawień aplikacji GitHub.",
- "description": "Opis",
- "discussion": {
- "acceptTerms": "Akceptuj",
- "accessDeniedMessage": "Nie masz uprawnień do wyświetlenia dyskusji w tym PR.",
- "addReaction": "Dodaj reakcję",
- "block": "Blokada",
- "blockedUser": "Zablokowano {{login}}",
- "collapseThread": "Zwiń wątek",
- "commentActions": "Opcje komentarza",
- "comment": "{{displayCount}} komentarza",
- "comment_other": "{{displayCount}} komentarza",
- "couldNotLoad": "Nie udało się wczytać dyskusji.",
- "couldNotLoadMore": "Nie udało się wczytać kolejnych komentarzy.",
- "loadMoreComments": "Wczytaj kolejne komentarze",
- "loading": "Wczytywanie dyskusji",
- "moderation": {
- "block": {
- "retryable": "Nie udało się zablokować tego użytkownika. Sprawdź połączenie i spróbuj ponownie.",
- "terminal": "Tego użytkownika nie można zablokować."
- },
- "mute": {
- "retryable": "Nie udało się wyciszyć tego użytkownika. Sprawdź połączenie i spróbuj ponownie.",
- "terminal": "Tego użytkownika nie można wyciszyć."
- },
- "reportContent": {
- "retryable": "Nie udało się zgłosić tego komentarza. Sprawdź połączenie i spróbuj ponownie.",
- "terminal": "Tego komentarza nie można zgłosić."
- },
- "reportUser": {
- "retryable": "Nie udało się zgłosić tego użytkownika. Sprawdź połączenie i spróbuj ponownie.",
- "terminal": "Tego użytkownika nie można zgłosić."
- }
- },
- "moreLinesAbove": "… liczba dodatkowych wierszy powyżej: {{displayCount}}",
- "mute": "Wycisz",
- "mutedUser": "Wyciszono {{login}}",
- "noDiscussion": "Brak dyskusji",
- "noDiscussionDescription": "W tym PR nie ma jeszcze wątków przeglądu ani komentarzy w dyskusji.",
- "comment_one": "1 komentarz",
- "outdated": "Nieaktualny",
- "quotedDiffSnippet": "Cytowany fragment różnic",
- "reactionPill": "reakcja {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "reakcji",
- "reaction_other": "reakcji",
- "reaction_one": "reakcja",
- "replyBadRequest": "Tej odpowiedzi nie można opublikować. Wątek mógł się zmienić.",
- "replyBody": "Treść odpowiedzi",
- "replyForbidden": "Nie masz uprawnień do odpowiadania w tym PR.",
- "replyPlaceholder": "Odpowiedź…",
- "reportContent": "Zgłoś treść",
- "reportUser": "Zgłoś użytkownika",
- "resolveThread": "Oznacz wątek jako rozwiązany",
- "resolved": "Rozwiązany",
- "retryLoadingMore": "Ponów wczytywanie kolejnych komentarzy",
- "reviewFiles": "Przejrzyj pliki",
- "startedRelative": " · rozpoczęto {{relative}}",
- "submitReply": "Wyślij odpowiedź",
- "termsAcceptRetry": "Nie udało się zaakceptować regulaminu. Sprawdź połączenie i spróbuj ponownie.",
- "termsCopy": "Aby publikować, musisz mieć co najmniej 13 lat.",
- "termsTitle": "Regulamin",
- "threadAccessibilityLabel": "Wątek dyskusji {{anchorLabel}}",
- "unavailable": "Dyskusja jest niedostępna.",
- "unavailableMessage": "Ten PR mógł zostać usunięty.",
- "unresolveThread": "Oznacz wątek jako nierozwiązany",
- "viewTerms": "Zobacz regulamin",
- "termsAcceptRequired": "Aby publikować, musisz zaakceptować regulamin.",
- "termsCheckRetryCopy": "Nie udało się sprawdzić regulaminu. Sprawdź połączenie i spróbuj ponownie.",
- "termsOutdatedCopy": "Regulamin się zmienił. Otwórz ponownie ten ekran, aby zaakceptować najnowszą wersję.",
- "comment_few": "{{displayCount}} komentarze",
- "comment_many": "{{displayCount}} komentarzy",
- "reaction_few": "reakcje",
- "reaction_many": "reakcji",
- "reactions": {
- "thumbsUp": "Kciuk w górę",
- "thumbsDown": "Kciuk w dół",
- "laugh": "Śmiech",
- "hooray": "Hurra",
- "confused": "Dezorientacja",
- "heart": "Serce",
- "rocket": "Rakieta",
- "eyes": "Oczy"
- },
- "anchor": {
- "fileCommentOnPath": "Komentarz do pliku {{path}}",
- "fileComment": "Komentarz do pliku",
- "outdatedOnPathLines": "Nieaktualny: {{path}}, {{lines}}",
- "outdatedOnLines": "Nieaktualny: {{lines}}",
- "outdatedOnPath": "Nieaktualny: {{path}}"
- },
- "deletedUser": "usunięty użytkownik"
- },
- "entry": {
- "clearLink": "Wyczyść odnośnik do PR",
- "couldNotLoad": "Nie udało się wczytać danych.",
- "eyebrow": "Otwórz PR za pomocą adresu URL.",
- "noRecentPrs": "Brak ostatnio otwieranych PR",
- "noRecentPrsDescription": "Wklej powyżej odnośnik do PR, aby rozpocząć przegląd. Przy następnym otwarciu tej listy znajdziesz go tutaj.",
- "open": "Otwórz",
- "pasteLink": "Wklej odnośnik do PR",
- "pastePrLink": "Wklej odnośnik do PR",
- "removeFromRecentsMessage": "Ten PR zniknie z listy ostatnio otwieranych PR.",
- "removeFromRecentsTitle": "Usunąć z listy ostatnio otwieranych?",
- "removeRecentAccessibility": "Usuń {{repo}} z listy ostatnio otwieranych",
- "urlAccessibility": "Adres URL PR w serwisie GitHub"
- },
- "eventChips": {
- "comment": "Komentarz",
- "label": "Rodzaj przeglądu",
- "requestChanges": "Poproś o zmiany"
- },
+ "noFilesChanged": "Brak zmienionych plików",
+ "noFilesChangedDescription": "Ten PR nie zawiera zmian w plikach.",
"fileList": {
"filesList": "Lista plików",
"filesViewed": "Pliki · przejrzano {{viewed}} z {{total}}",
@@ -2542,7 +2399,6 @@
"commentOnSelectedLines": "Skomentuj zaznaczone wiersze",
"finishReview": "Zakończ przegląd"
},
- "headLine": "{{counts}} · najnowszy commit {{sha}}",
"hunkRows": {
"contextUnavailable": "Kontekst nie jest dostępny dla tego odwołania.",
"expandAll": "Rozwiń wszystko",
@@ -2579,56 +2435,68 @@
"fileLoadedOfTotalCount_few": "Wczytano {{displayCount}} pliki z {{total}}",
"fileLoadedOfTotalCount_many": "Wczytano {{displayCount}} plików z {{total}}"
},
- "inbox": {
- "couldNotLoad": "Nie udało się wczytać skrzynki.",
- "loading": "Wczytywanie skrzynki",
- "noReviewRequests": "Brak próśb o przegląd",
- "noReviewRequestsDescription": "Tutaj pojawią się PR oczekujące na twój przegląd. Powyżej możesz też wkleić odnośnik do dowolnego PR.",
- "title": "Skrzynka"
+ "sideBySide": {
+ "emptyDiffColumn": "pusta kolumna różnic",
+ "emptyDiffRow": "Pusty wiersz różnic",
+ "newOnly": "Tylko po zmianie: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ brak nowej linii na końcu pliku",
+ "oldNew": "Przed zmianą: {{old}} | Po zmianie: {{new}}",
+ "oldOnly": "Tylko przed zmianą: {{text}}"
+ },
+ "connectionExpired": "Połączenie z serwisem GitHub wygasło.",
+ "capabilities": {
+ "banner": {
+ "title": "Niedostępne u tego dostawcy",
+ "accessibility": "Niedostępne u tego dostawcy: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Zainstaluj aplikację Kilo dla GitHub",
"merge": {
- "autoMergeDescription": "GitHub automatycznie scali ten PR, gdy wszystkie wymagane kontrole zakończą się pomyślnie (metoda: {{method}}).",
+ "merge": "Scalanie",
+ "mergeNow": "Scal teraz",
+ "mergePullRequest": "Scalanie PR",
+ "mergeTermTitle": "Scalanie {{term}}",
+ "enableAutoMerge": "Włącz automatyczne scalanie",
+ "disableAutoMerge": "Wyłącz automatyczne scalanie",
"autoMergeOn": "Automatyczne scalanie włączone",
- "blockedTitle": "Przyczyny blokady scalania",
- "cannotMerge": "Nie można scalić tego PR w obecnej postaci.",
+ "autoMergeDescription": "GitHub automatycznie scali ten PR, gdy wszystkie wymagane kontrole zakończą się pomyślnie (metoda: {{method}}).",
"checking": "Sprawdzanie możliwości scalenia…",
+ "couldNotDetermine": "Nie udało się ustalić, czy można scalić ten PR.",
+ "refreshMergeability": "Sprawdź ponownie możliwość scalenia",
+ "blockedTitle": "Przyczyny blokady scalania",
+ "updateBranch": "Zaktualizuj gałąź",
+ "updateBranchFromBase": "Zaktualizuj gałąź na podstawie gałęzi bazowej",
+ "methodLabel": "Metoda",
+ "commitTitle": "Tytuł commita",
"commitMessage": "Komunikat commita",
"commitMessagePlaceholder": "Opcjonalny opis commita scalającego",
- "commitTitle": "Tytuł commita",
- "confirmMessage": "Twoje zmiany zostaną scalone z gałęzią bazową.",
- "confirmTitle": "Scalić PR?",
- "couldNotDetermine": "Nie udało się ustalić, czy można scalić ten PR.",
- "couldNotMerge": "Nie udało się scalić PR.",
"deleteBranch": "Usuń gałąź",
"deleteBranchAfterMerge": "Usuń gałąź po scaleniu",
- "disableAutoMerge": "Wyłącz automatyczne scalanie",
- "enableAutoMerge": "Włącz automatyczne scalanie",
- "enableAutoMergeConfirmMessage": "GitHub automatycznie scali ten PR, gdy wszystkie wymagane kontrole zakończą się pomyślnie.",
+ "noEnabledMethods": "W tym repozytorium nie włączono żadnej metody scalania. Poproś administratora o włączenie scalania z commitem scalającym, połączeniem commitów lub zmianą bazy.",
+ "confirmTitle": "Scalić PR?",
+ "confirmTitleTerm": "Scalić {{term}}?",
+ "confirmMessage": "Twoje zmiany zostaną scalone z gałęzią bazową.",
"enableAutoMergeConfirmTitle": "Włączyć automatyczne scalanie?",
+ "enableAutoMergeConfirmMessage": "GitHub automatycznie scali ten PR, gdy wszystkie wymagane kontrole zakończą się pomyślnie.",
+ "enableAutoMergeConfirmMessageTerm": "Po pomyślnym przejściu pipeline {{term}} zostanie automatycznie scalony.",
+ "enableAutoMergeDescriptionTerm": "GitLab scala ten {{term}} automatycznie, gdy pipeline zakończy się sukcesem.",
"forbidden": "Nie masz uprawnień do scalenia tego PR.",
- "loadFailedTitle": "Nie udało się wczytać opcji scalania.",
- "merge": "Scalanie",
- "mergeNow": "Scal teraz",
- "mergePullRequest": "Scalanie PR",
- "methodLabel": "Metoda",
+ "cannotMerge": "Nie można scalić tego PR w obecnej postaci.",
+ "couldNotMerge": "Nie udało się scalić PR.",
"methods": {
"merge": "Scalanie",
"rebase": "Zmiana bazy",
"squash": "Połączenie commitów"
},
- "noEnabledMethods": "W tym repozytorium nie włączono żadnej metody scalania. Poproś administratora o włączenie scalania z commitem scalającym, połączeniem commitów lub zmianą bazy.",
+ "terminal": {
+ "alreadyMerged": "Już scalono",
+ "closed": "PR zamknięty",
+ "closedMergeRequest": "Merge request zamknięty"
+ },
"partialSuccessBanner": {
"accessibility": "Scalono. Nie udało się usunąć gałęzi: {{reason}}",
"body": "Nie udało się usunąć gałęzi: {{reason}}."
},
- "refreshMergeability": "Sprawdź ponownie możliwość scalenia",
- "terminal": {
- "alreadyMerged": "Już scalono",
- "closed": "PR zamknięty"
- },
- "updateBranch": "Zaktualizuj gałąź",
- "updateBranchFromBase": "Zaktualizuj gałąź na podstawie gałęzi bazowej",
+ "loadFailedTitle": "Nie udało się wczytać opcji scalania.",
"blocked": {
"unknownStateTitle": "GitHub nie potwierdził możliwości scalenia",
"unknownStateDetail": "Spróbuj za chwilę odświeżyć podsumowanie.",
@@ -2648,6 +2516,20 @@
"notMergeableTitle": "Nie można jeszcze scalić tego PR",
"notMergeableDetail": "GitHub zgłosił status scalania: {{state}}."
},
+ "restrictions": {
+ "title": "Ograniczenia scalania",
+ "approvalsRequired_one": "Wymagane jest {{displayCount}} zatwierdzenie",
+ "approvalsRequired_other": "Wymagane jest {{displayCount}} zatwierdzeń",
+ "pipelineMustSucceed": "Pipeline musi zakończyć się sukcesem przed scaleniem.",
+ "approvalsRequired_many": "Wymaganych jest {{displayCount}} zatwierdzeń",
+ "approvalsRequired_few": "Wymagane są {{displayCount}} zatwierdzenia"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline na najnowszym commicie się nie powiódł.",
+ "pendingPipeline": "Pipeline na najnowszym commicie nadal się wykonuje.",
+ "permission": "Nie masz uprawnień do scalenia tego {{term}}.",
+ "draft": "Przed scaleniem oznacz {{term}} jako gotowy do przeglądu."
+ },
"methodLabels": {
"merge": "Utwórz commit scalający",
"squash": "Połącz commity i scal",
@@ -2659,9 +2541,210 @@
"rebase": "Odtwórz wszystkie commity z tej gałęzi na gałęzi bazowej bez commita scalającego."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Wątek dyskusji {{anchorLabel}}",
+ "collapseThread": "Zwiń wątek",
+ "resolveThread": "Oznacz wątek jako rozwiązany",
+ "unresolveThread": "Oznacz wątek jako nierozwiązany",
+ "resolved": "Rozwiązany",
+ "outdated": "Nieaktualny",
+ "comment_one": "1 komentarz",
+ "comment": "{{displayCount}} komentarza",
+ "comment_other": "{{displayCount}} komentarza",
+ "startedRelative": " · rozpoczęto {{relative}}",
+ "couldNotLoadMore": "Nie udało się wczytać kolejnych komentarzy.",
+ "retryLoadingMore": "Ponów wczytywanie kolejnych komentarzy",
+ "loadMoreComments": "Wczytaj kolejne komentarze",
+ "addReaction": "Dodaj reakcję",
+ "reactionPill": "reakcja {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "reakcja",
+ "reaction": "reakcji",
+ "reaction_other": "reakcji",
+ "commentActions": "Opcje komentarza",
+ "reportContent": "Zgłoś treść",
+ "reportUser": "Zgłoś użytkownika",
+ "mute": "Wycisz",
+ "block": "Blokada",
+ "blockedUser": "Zablokowano {{login}}",
+ "mutedUser": "Wyciszono {{login}}",
+ "replyPlaceholder": "Odpowiedź…",
+ "replyBody": "Treść odpowiedzi",
+ "submitReply": "Wyślij odpowiedź",
+ "termsTitle": "Regulamin",
+ "termsCopy": "Aby publikować, musisz mieć co najmniej 13 lat.",
+ "termsAcceptRetry": "Nie udało się zaakceptować regulaminu. Sprawdź połączenie i spróbuj ponownie.",
+ "viewTerms": "Zobacz regulamin",
+ "acceptTerms": "Akceptuj",
+ "replyBadRequest": "Tej odpowiedzi nie można opublikować. Wątek mógł się zmienić.",
+ "replyForbidden": "Nie masz uprawnień do odpowiadania w tym PR.",
+ "replyForbiddenTerm": "Nie masz uprawnień do odpowiadania w tym {{term}}.",
+ "moderation": {
+ "block": {
+ "retryable": "Nie udało się zablokować tego użytkownika. Sprawdź połączenie i spróbuj ponownie.",
+ "terminal": "Tego użytkownika nie można zablokować."
+ },
+ "mute": {
+ "retryable": "Nie udało się wyciszyć tego użytkownika. Sprawdź połączenie i spróbuj ponownie.",
+ "terminal": "Tego użytkownika nie można wyciszyć."
+ },
+ "reportContent": {
+ "retryable": "Nie udało się zgłosić tego komentarza. Sprawdź połączenie i spróbuj ponownie.",
+ "terminal": "Tego komentarza nie można zgłosić."
+ },
+ "reportUser": {
+ "retryable": "Nie udało się zgłosić tego użytkownika. Sprawdź połączenie i spróbuj ponownie.",
+ "terminal": "Tego użytkownika nie można zgłosić."
+ }
+ },
+ "accessDeniedMessage": "Nie masz uprawnień do wyświetlenia dyskusji w tym PR.",
+ "unavailable": "Dyskusja jest niedostępna.",
+ "unavailableMessage": "Ten PR mógł zostać usunięty.",
+ "couldNotLoad": "Nie udało się wczytać dyskusji.",
+ "loading": "Wczytywanie dyskusji",
+ "noDiscussion": "Brak dyskusji",
+ "noDiscussionDescription": "W tym PR nie ma jeszcze wątków przeglądu ani komentarzy w dyskusji.",
+ "reviewFiles": "Przejrzyj pliki",
+ "quotedDiffSnippet": "Cytowany fragment różnic",
+ "moreLinesAbove": "… liczba dodatkowych wierszy powyżej: {{displayCount}}",
+ "termsAcceptRequired": "Aby publikować, musisz zaakceptować regulamin.",
+ "termsOutdatedCopy": "Regulamin się zmienił. Otwórz ponownie ten ekran, aby zaakceptować najnowszą wersję.",
+ "termsCheckRetryCopy": "Nie udało się sprawdzić regulaminu. Sprawdź połączenie i spróbuj ponownie.",
+ "reactions": {
+ "thumbsUp": "Kciuk w górę",
+ "thumbsDown": "Kciuk w dół",
+ "laugh": "Śmiech",
+ "hooray": "Hurra",
+ "confused": "Dezorientacja",
+ "heart": "Serce",
+ "rocket": "Rakieta",
+ "eyes": "Oczy"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Komentarz do pliku {{path}}",
+ "fileComment": "Komentarz do pliku",
+ "outdatedOnPathLines": "Nieaktualny: {{path}}, {{lines}}",
+ "outdatedOnLines": "Nieaktualny: {{lines}}",
+ "outdatedOnPath": "Nieaktualny: {{path}}"
+ },
+ "deletedUser": "usunięty użytkownik",
+ "comment_few": "{{displayCount}} komentarze",
+ "comment_many": "{{displayCount}} komentarzy",
+ "reaction_few": "reakcje",
+ "reaction_many": "reakcji"
+ },
+ "couldNotOpenGitHubAppSettings": "Nie udało się otworzyć ustawień aplikacji GitHub.",
+ "installKiloGitHubApp": "Zainstaluj aplikację Kilo dla GitHub",
+ "checkConnection": "Sprawdź połączenie",
+ "couldNotLoadPullRequest": "Nie udało się wczytać PR.",
+ "description": "Opis",
"noDescriptionProvided": "Nie podano opisu.",
- "noFilesChanged": "Brak zmienionych plików",
- "noFilesChangedDescription": "Ten PR nie zawiera zmian w plikach.",
+ "review": "Przegląd",
+ "reviewPullRequest": "Przejrzyj PR",
+ "headLine": "{{counts}} · najnowszy commit {{sha}}",
+ "entry": {
+ "eyebrow": "Otwórz PR lub merge request za pomocą adresu URL",
+ "pastePrLink": "Wklej odnośnik do PR lub merge requestu",
+ "noRecentPrs": "Brak ostatnich recenzji",
+ "noRecentPrsDescription": "Wklej powyżej odnośnik, aby rozpocząć recenzję — następnym razem pojawi się tutaj.",
+ "couldNotLoad": "Nie udało się wczytać danych.",
+ "removeFromRecentsTitle": "Usunąć z listy ostatnio otwieranych?",
+ "removeFromRecentsMessage": "Ta recenzja zostanie usunięta z listy ostatnich.",
+ "removeRecentAccessibility": "Usuń {{repo}} z listy ostatnio otwieranych",
+ "urlAccessibility": "Wpisz adres URL PR lub merge requestu",
+ "urlPlaceholder": "URL PR lub merge requesta",
+ "openAccessibility": "Otwórz PR lub merge request",
+ "clearLink": "Wyczyść odnośnik",
+ "pasteLink": "Wklej odnośnik do PR lub merge requestu",
+ "open": "Otwórz"
+ },
+ "checks": {
+ "checksCount": "kontrole: {{displayCount}}",
+ "couldNotLoad": "Nie udało się wczytać kontroli.",
+ "failed": "nieudane: {{displayCount}}",
+ "noAccess": "Nie masz dostępu do kontroli tego repozytorium.",
+ "noChecksReported": "Brak zgłoszonych kontroli",
+ "notAvailable": "Kontrole nie są jeszcze dostępne. Być może najnowszy commit nie został jeszcze przetworzony lub aplikacja Kilo dla GitHub nie jest zainstalowana w repozytorium źródłowym.",
+ "openDetails": "Otwórz szczegóły {{name}}",
+ "passed": "zaliczone: {{displayCount}}",
+ "pending": "oczekujące: {{displayCount}}",
+ "retryChecks": "Ponów kontrole",
+ "skipped": "pominięte: {{displayCount}}",
+ "title": "Kontrole",
+ "viewOnGitHub": "Zobacz PR w serwisie GitHub",
+ "checkDetails": "szczegóły kontroli"
+ },
+ "inbox": {
+ "couldNotLoad": "Nie udało się wczytać skrzynki.",
+ "loading": "Wczytywanie skrzynki",
+ "noReviewRequests": "Brak próśb o przegląd",
+ "noReviewRequestsDescription": "Tutaj pojawią się PR oczekujące na twój przegląd. Powyżej możesz też wkleić odnośnik do dowolnego PR.",
+ "title": "Skrzynka"
+ },
+ "composer": {
+ "addTitle": "Nowy komentarz",
+ "addToReview": "Dodaj do przeglądu",
+ "comment": "Komentarz",
+ "commentBody": "Treść komentarza",
+ "commentBodyPlaceholder": "Treść komentarza",
+ "commentNow": "Skomentuj teraz",
+ "discardMessage": "Utracisz wersję roboczą komentarza.",
+ "discardTitle": "Odrzucić komentarz?",
+ "editTitle": "Edycja komentarza",
+ "insertSuggestion": "Wstaw sugestię",
+ "insertSuggestionA11y": "Wstaw sugestię zmiany kodu",
+ "loadFailedTitle": "Nie udało się wczytać edytora komentarzy.",
+ "ok": "OK",
+ "unavailableMessage": "Ten komentarz do wysłania został już usunięty lub wysłany.",
+ "unavailableTitle": "Komentarz niedostępny",
+ "bodyEmpty": "Treść komentarza nie może być pusta.",
+ "suggestionsOnlyAddedLines": "Sugestie dotyczą tylko dodanych wierszy.",
+ "tapDiffLineToSuggest": "Dotknij wiersza w widoku różnic, aby włączyć sugestie."
+ },
+ "connect": {
+ "checkFailedTitle": "Nie udało się sprawdzić połączenia z kontem GitHub.",
+ "checkFailedMessage": "Status logowania będzie dostępny dopiero po wczytaniu danych.",
+ "checkFailedTitleGitLab": "Nie udało się sprawdzić połączenia z kontem GitLab.",
+ "checkFailedTitleBitbucket": "Nie udało się sprawdzić połączenia z kontem Bitbucket.",
+ "providerCheckFailedMessage": "Status połączenia będzie dostępny po wczytaniu danych.",
+ "reconnectTitle": "Połącz ponownie konto GitHub",
+ "reconnectDescription": "Cofnięto dostęp do konta GitHub. Połącz je ponownie, aby nadal przeglądać PR na telefonie.",
+ "description": "Połącz konto GitHub, aby przeglądać PR na telefonie.",
+ "gitlabDescription": "Połącz konto GitLab, aby przeglądać merge requesty na telefonie.",
+ "bitbucketDescription": "Połącz Bitbucket z tą organizacją, aby przeglądać PR-y na telefonie.",
+ "bitbucketOrgOnlyDescription": "Wybierz organizację w swoim profilu, aby przeglądać jej PR-y na Bitbucket."
+ },
+ "screen": {
+ "shareA11y": "Udostępnij PR",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Ten komentarz zostanie usunięty z kolejki komentarzy do przeglądu.",
+ "deletePendingTitle": "Usunąć komentarz do wysłania?",
+ "loadFailedTitle": "Nie udało się wczytać formularza wysyłania przeglądu.",
+ "pendingComment": "oczekującego komentarza",
+ "pendingComment_other": "oczekującego komentarza",
+ "pendingComment_one": "komentarz do wysłania",
+ "summaryOptional": "Podsumowanie (opcjonalne)",
+ "partialPostedMessage": "Liczba opublikowanych komentarzy: {{displayFreshCount}}. Komentarze dotyczące starszego commita pozostały w kolejce. Ich liczba: {{displayStaleCount}}.",
+ "submitCountOfTotal": "Wyślij {{displayFreshCount}} z {{displayTotalCount}} komentarzy",
+ "submitReview": "Prześlij wynik przeglądu",
+ "pendingComment_few": "oczekujące komentarze",
+ "pendingComment_many": "oczekujących komentarzy",
+ "blockedRequestChanges": "Dodaj podsumowanie lub co najmniej jeden komentarz, aby poprosić o zmiany.",
+ "blockedComment": "Dodaj podsumowanie lub co najmniej jeden komentarz, aby opublikować przegląd z komentarzem."
+ },
+ "reconnectNotice": {
+ "title": "Połączenie z serwisem GitHub wygasło.",
+ "message": "Połączenie z kontem GitHub wygasło. Sprawdź je ponownie — w razie potrzeby aplikacja poprosi o ponowne połączenie.",
+ "gitlabTitle": "Połączenie z serwisem GitLab wygasło.",
+ "bitbucketTitle": "Połączenie z serwisem Bitbucket wygasło.",
+ "providerMessage": "Połączenie z kontem {{provider}} wygasło. Sprawdź je ponownie — w razie potrzeby aplikacja poprosi o ponowne połączenie."
+ },
+ "eventChips": {
+ "comment": "Komentarz",
+ "label": "Rodzaj przeglądu",
+ "requestChanges": "Poproś o zmiany"
+ },
"overview": {
"commit": "zatwierdzenia",
"commit_other": "zatwierdzenia",
@@ -2706,41 +2789,25 @@
"summaryA11y": "Podsumowanie przeglądu",
"summaryPlaceholder": "Opcjonalne podsumowanie przeglądu"
},
- "pullRequestUnavailable": "PR niedostępny",
- "pullRequestUnavailableDescription": "Nie można otworzyć tego PR. Być może został usunięty, repozytorium jest prywatne lub nie zainstalowano w nim aplikacji Kilo dla GitHub.",
- "reconnectNotice": {
- "message": "Połączenie z kontem GitHub wygasło. Sprawdź je ponownie — w razie potrzeby aplikacja poprosi o ponowne połączenie.",
- "title": "Połączenie z serwisem GitHub wygasło."
- },
- "review": "Przegląd",
- "reviewPullRequest": "Przejrzyj PR",
- "screen": {
- "shareA11y": "Udostępnij PR",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "pusta kolumna różnic",
- "emptyDiffRow": "Pusty wiersz różnic",
- "newOnly": "Tylko po zmianie: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ brak nowej linii na końcu pliku",
- "oldNew": "Przed zmianą: {{old}} | Po zmianie: {{new}}",
- "oldOnly": "Tylko przed zmianą: {{text}}"
+ "tabs": {
+ "discussion": "Dyskusja",
+ "files": "Pliki",
+ "overview": "Podsumowanie"
},
- "submit": {
- "deletePendingMessage": "Ten komentarz zostanie usunięty z kolejki komentarzy do przeglądu.",
- "deletePendingTitle": "Usunąć komentarz do wysłania?",
- "loadFailedTitle": "Nie udało się wczytać formularza wysyłania przeglądu.",
- "pendingComment": "oczekującego komentarza",
- "pendingComment_other": "oczekującego komentarza",
- "pendingComment_one": "komentarz do wysłania",
- "summaryOptional": "Podsumowanie (opcjonalne)",
- "partialPostedMessage": "Liczba opublikowanych komentarzy: {{displayFreshCount}}. Komentarze dotyczące starszego commita pozostały w kolejce. Ich liczba: {{displayStaleCount}}.",
- "submitCountOfTotal": "Wyślij {{displayFreshCount}} z {{displayTotalCount}} komentarzy",
- "submitReview": "Prześlij wynik przeglądu",
- "pendingComment_few": "oczekujące komentarze",
- "pendingComment_many": "oczekujących komentarzy",
- "blockedRequestChanges": "Dodaj podsumowanie lub co najmniej jeden komentarz, aby poprosić o zmiany.",
- "blockedComment": "Dodaj podsumowanie lub co najmniej jeden komentarz, aby opublikować przegląd z komentarzem."
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Udostępnij merge request",
+ "viewOnProvider": "Zobacz w {{provider}}",
+ "mergeRequestUnavailable": "Merge request niedostępny",
+ "unavailableDescription": "Mógł zostać usunięty albo nie masz do niego dostępu.",
+ "accessDeniedMergeRequest": "Nie masz uprawnień do wyświetlenia tego merge request.",
+ "couldNotLoadMergeRequest": "Nie udało się wczytać merge request.",
+ "discussionAccessDenied": "Nie masz uprawnień do wyświetlenia dyskusji w tym merge request.",
+ "discussionUnavailableMessage": "Ten merge request mógł zostać usunięty.",
+ "noDiscussionDescription": "W tym merge request nie ma jeszcze wątków przeglądu ani komentarzy w dyskusji.",
+ "noFilesChangedDescription": "Ten merge request nie zawiera zmian w plikach."
},
"fileStatus": {
"changed": "Zmieniono",
@@ -2748,11 +2815,6 @@
"modified": "Zmodyfikowano",
"renamed": "Zmieniono nazwę"
},
- "tabs": {
- "discussion": "Dyskusja",
- "files": "Pliki",
- "overview": "Podsumowanie"
- },
"diff": {
"selectedTapToChange": "Zaznaczono {{label}}, dotknij, aby zmienić zaznaczenie",
"tapToComment": "{{label}}, dotknij, aby skomentować",
@@ -2763,7 +2825,7 @@
"emptyLine": "(brak treści)"
},
"linkPasteClipboardEmpty": "Schowek jest pusty.",
- "linkPasteNotAPullRequest": "To nie jest odnośnik do PR w serwisie GitHub.",
+ "linkPasteNotAPullRequest": "To nie jest odnośnik do PR ani merge requestu",
"announce": {
"commentPosted": "Opublikowano komentarz",
"reviewSubmitted": "Wysłano przegląd",
@@ -2772,6 +2834,7 @@
"mutationError": {
"commentNotPosted": "Nie można opublikować tego komentarza. Wybrany wiersz mógł się zmienić lub PR mógł zostać zaktualizowany.",
"reviewNotSubmitted": "Nie można wysłać tego przeglądu w obecnej postaci. PR mógł się zmienić albo jest to twój własny PR, którego nie możesz przeglądać w ten sposób.",
+ "reviewNotSubmittedTerm": "Nie można wysłać tego przeglądu w obecnej postaci. {{term}} mógł się zmienić albo nie możesz przeglądać własnego {{term}}.",
"couldNotPostComment": "Nie udało się opublikować komentarza.",
"couldNotSubmitReview": "Nie udało się wysłać przeglądu. Sprawdź połączenie i spróbuj ponownie."
},
@@ -2779,6 +2842,7 @@
"couldNotReply": "Nie udało się odpowiedzieć.",
"couldNotCompleteAction": "Nie udało się wykonać tej operacji.",
"mergeResultDefaultError": "GitHub nie ukończył scalania.",
+ "mergeResultNotCompleted": "{{term}} nie został scalony. Sprawdź jego stan i spróbuj ponownie.",
"ambiguous": "Nie udało się potwierdzić wyniku — sprawdź PR przed ponowną próbą.",
"persistenceFailed": "Nie udało się zapisać tej operacji. Spróbuj ponownie później.",
"forbidden": "Nie masz uprawnień do tej operacji."
diff --git a/apps/mobile/src/i18n/locales/ps.json b/apps/mobile/src/i18n/locales/ps.json
index d64785c373..bb9a076514 100644
--- a/apps/mobile/src/i18n/locales/ps.json
+++ b/apps/mobile/src/i18n/locales/ps.json
@@ -36,6 +36,7 @@
"cost": "لګښت",
"discard": "لغوه کړئ",
"findings": "موندنې",
+ "mergeRequest": "د یوځای کولو غوښتنه",
"notConnected": "نه دی نښلول شوی",
"notifications": "خبرتیاوې",
"pullRequest": "پل ریکویسټ",
@@ -340,10 +341,17 @@
"emptyDiffRow": "د توپیر تشه کرښه"
},
"connectionExpired": "له GitHub سره د اړیکې موده پای ته ورسېده.",
+ "capabilities": {
+ "banner": {
+ "title": "پدې چمتو کوونکي کې شتون نلري",
+ "accessibility": "پدې چمتو کوونکي کې شتون نلري: {{reason}}"
+ }
+ },
"merge": {
"merge": "یوځای کول",
"mergeNow": "همدا اوس یوځای کړئ",
"mergePullRequest": "د پل ریکویسټ یوځای کول",
+ "mergeTermTitle": "د {{term}} یوځای کول",
"enableAutoMerge": "خپلکار یوځای کول فعال کړئ",
"disableAutoMerge": "خپلکار یوځای کول غیر فعال کړئ",
"autoMergeOn": "خپلکار یوځای کول فعال دي",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "له یوځای کولو وروسته څانګه ړنګ کړئ",
"noEnabledMethods": "په دې زېرمتون کې د یوځای کولو هېڅ طریقه فعاله نه ده. د زېرمتون له مدیر څخه وغواړئ چې عادي یوځای کول، د کمېټونو یو کول، یا بیا بنسټول فعال کړي.",
"confirmTitle": "پل ریکویسټ یوځای شي؟",
+ "confirmTitleTerm": "{{term}} یوځای شي؟",
"confirmMessage": "دا به ستاسو بدلونونه په بنسټیزه څانګه کې یوځای کړي.",
"enableAutoMergeConfirmTitle": "خپلکار یوځای کول فعال شي؟",
"enableAutoMergeConfirmMessage": "کله چې ټولې اړینې ازموینې بریالۍ شي، GitHub به دا پل ریکویسټ په خپلکار ډول یوځای کړي.",
+ "enableAutoMergeConfirmMessageTerm": "کله چې پایپلاین بریالی شي، {{term}} به په اتوماتیک ډول یوځای شي.",
+ "enableAutoMergeDescriptionTerm": "کله چې پایپلاین بریالی شي، GitLab به دا {{term}} په اتوماتیک ډول یوځای کړي.",
"forbidden": "تاسو د دې پل ریکویسټ د یوځای کولو اجازه نه لرئ.",
"cannotMerge": "دا پل ریکویسټ په اوسني حالت کې نه شي یوځای کېدای.",
"couldNotMerge": "پل ریکویسټ یوځای نه شو.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "مخکې یوځای شوی",
- "closed": "دا پل ریکویسټ تړل شوی"
+ "closed": "دا پل ریکویسټ تړل شوی",
+ "closedMergeRequest": "دا د یوځای کولو غوښتنه تړل شوی"
},
"partialSuccessBanner": {
"body": "څانګه ړنګه نه شوه: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "دا پل ریکویسټ لا نه شي یوځای کېدای",
"notMergeableDetail": "GitHub د یوځای کولو حالت {{state}} ښودلی دی."
},
+ "restrictions": {
+ "title": "د یوځای کولو محدودیتونه",
+ "approvalsRequired_one": "{{displayCount}} تایید اړین دی",
+ "approvalsRequired_other": "{{displayCount}} تاییدونه اړین دي",
+ "pipelineMustSucceed": "له یوځای کولو مخکې باید پایپلاین بریالی وي."
+ },
+ "providerBlocked": {
+ "failingPipeline": "په وروستي کمېټ کې پایپلاین ناکامېږي.",
+ "pendingPipeline": "په وروستي کمېټ کې پایپلاین لا هم روان دی.",
+ "permission": "تاسو د دې {{term}} د یوځای کولو اجازه نه لرئ.",
+ "draft": "له یوځای کولو مخکې {{term}} د بیاکتنې لپاره د چمتو په توګه په نښه کړئ."
+ },
"methodLabels": {
"merge": "د یوځای کولو کمېټ جوړ کړئ",
"squash": "کمېټونه یو کړئ او څانګې یوځای کړئ",
@@ -448,6 +472,7 @@
"acceptTerms": "ومنئ",
"replyBadRequest": "دا ځواب نه شي خپرېدای. کېدای شي د بحث لړۍ بدله شوې وي.",
"replyForbidden": "تاسو دې پل ریکویسټ ته د ځواب ورکولو اجازه نه لرئ.",
+ "replyForbiddenTerm": "تاسو دې {{term}} ته د ځواب ورکولو اجازه نه لرئ.",
"moderation": {
"reportContent": {
"terminal": "د دې تبصرې راپور نه شي ورکول کېدای.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "د پل ریکویسټ بیاکتنه وکړئ",
"headLine": "{{counts}} · وروستی کمېټ {{sha}}",
"entry": {
- "eyebrow": "د URL له لارې پل ریکویسټ پرانیزئ.",
- "pastePrLink": "د PR لینک ونښلوئ",
- "noRecentPrs": "وروستي PR نشته",
- "noRecentPrsDescription": "د بیاکتنې د پیلولو لپاره پورته د PR لینک ونښلوئ — بل ځل به دلته ښکاره شي.",
+ "eyebrow": "د URL له لارې پول ریکویسټ یا د یوځای کولو غوښتنه پرانیزئ",
+ "pastePrLink": "د پول ریکویسټ یا د یوځای کولو غوښتنې لینک ونښلوئ",
+ "noRecentPrs": "وروستۍ بیاکتنې نشته",
+ "noRecentPrsDescription": "د بیاکتنې پیلولو لپاره پورته لینک ونښلوئ — بل ځل به دلته ښکاره شي.",
"couldNotLoad": "بار نه شو.",
"removeFromRecentsTitle": "له وروستي لړلیک څخه لرې شي؟",
- "removeFromRecentsMessage": "دا پل ریکویسټ به ستاسو له وروستي لړلیک څخه لرې شي.",
+ "removeFromRecentsMessage": "دا بیاکتنه به ستاسو له وروستي لړلیک څخه لرې شي.",
"removeRecentAccessibility": "{{repo}} له وروستي لړلیک څخه لرې کړئ",
- "urlAccessibility": "د GitHub پل ریکویسټ URL",
- "clearLink": "د پل ریکویسټ لینک پاک کړئ",
- "pasteLink": "د پل ریکویسټ لینک ونښلوئ",
+ "urlAccessibility": "د پول ریکویسټ یا د یوځای کولو غوښتنې URL ولیکئ",
+ "urlPlaceholder": "د پول ریکویسټ یا د یوځای کولو غوښتنې URL",
+ "openAccessibility": "پول ریکویسټ یا د یوځای کولو غوښتنه پرانیزئ",
+ "clearLink": "لینک پاک کړئ",
+ "pasteLink": "د پول ریکویسټ یا د یوځای کولو غوښتنې لینک ونښلوئ",
"open": "خلاص"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "د GitHub اړیکه ونه کتل شوه.",
"checkFailedMessage": "تر هغه چې دا بار نه شي، د ننوتلو حالت نه څرګندېږي.",
+ "checkFailedTitleGitLab": "د GitLab اړیکه ونه کتل شوه.",
+ "checkFailedTitleBitbucket": "د Bitbucket اړیکه ونه کتل شوه.",
+ "providerCheckFailedMessage": "تر څو چې دا نه وي بار شوی، د اړیکې حالت شتون نلري.",
"reconnectTitle": "GitHub بیا ونښلئ",
"reconnectDescription": "ستاسو د GitHub اړیکه لغوه شوې ده. په موبایل کې د پل ریکویسټونو د بیاکتنې د دوام لپاره بیا ونښلئ.",
- "description": "په موبایل کې د پل ریکویسټونو د بیاکتنې لپاره خپل GitHub حساب ونښلوئ."
+ "description": "په موبایل کې د پل ریکویسټونو د بیاکتنې لپاره خپل GitHub حساب ونښلوئ.",
+ "gitlabDescription": "په موبایل کې د یوځای کولو د غوښتنو د بیاکتنې لپاره خپل GitLab حساب ونښلوئ.",
+ "bitbucketDescription": "په موبایل کې د پول ریکویسټونو د بیاکتنې لپاره Bitbucket له دې بنسټ سره ونښلوئ.",
+ "bitbucketOrgOnlyDescription": "خپل پروفایل کې یو بنسټ وټاکئ ترڅو د هغه Bitbucket پول ریکویسټونه وبیایۍ."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "له GitHub سره د اړیکې موده پای ته ورسېده.",
- "message": "ستاسو د GitHub اړیکه نور اعتبار نه لري. خپله اړیکه بیا وګورئ — که اړتیا وي، د بیا نښلولو غوښتنه به درڅخه وشي."
+ "message": "ستاسو د GitHub اړیکه نور اعتبار نه لري. خپله اړیکه بیا وګورئ — که اړتیا وي، د بیا نښلولو غوښتنه به درڅخه وشي.",
+ "gitlabTitle": "له GitLab سره د اړیکې موده پای ته ورسېده.",
+ "bitbucketTitle": "له Bitbucket سره د اړیکې موده پای ته ورسېده.",
+ "providerMessage": "ستاسو د {{provider}} اړیکه نور اعتبار نه لري. خپله اړیکه بیا وګورئ — که اړتیا وي، د بیا نښلولو غوښتنه به درڅخه وشي."
},
"eventChips": {
"comment": "تبصره",
@@ -643,6 +679,21 @@
"files": "فایلونه",
"discussion": "بحث"
},
+ "terms": {
+ "pullRequest": "پل ریکویسټ",
+ "mergeRequest": "د یوځای کولو غوښتنه",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "د یوځای کولو غوښتنه شریک کړئ",
+ "viewOnProvider": "په {{provider}} کې وګورئ",
+ "mergeRequestUnavailable": "د یوځای کولو غوښتنه نشته",
+ "unavailableDescription": "کېدای شي لرې شوی وي، یا تاسو ورسره لاسرسی نه لرئ.",
+ "accessDeniedMergeRequest": "تاسو د دې د یوځای کولو غوښتنه د لیدلو اجازه نه لرئ.",
+ "couldNotLoadMergeRequest": "د یوځای کولو غوښتنه بار نه شو.",
+ "discussionAccessDenied": "تاسو د دې د یوځای کولو غوښتنه د بحث د لیدلو اجازه نه لرئ.",
+ "discussionUnavailableMessage": "کېدای شي دا د یوځای کولو غوښتنه لرې شوی وي.",
+ "noDiscussionDescription": "په دې د یوځای کولو غوښتنه کې نه د بیاکتنې د بحث لړۍ شته او نه د خبرو تبصرې.",
+ "noFilesChangedDescription": "په دې د یوځای کولو غوښتنه کې هېڅ فایل نه دی بدل شوی."
+ },
"fileStatus": {
"modified": "بدل شوی",
"renamed": "نوم بدل شوی",
@@ -659,7 +710,7 @@
"emptyLine": "(خالي)"
},
"linkPasteClipboardEmpty": "کلیپبورډ تش دی.",
- "linkPasteNotAPullRequest": "دا د GitHub د پل ریکویسټ لینک نه دی.",
+ "linkPasteNotAPullRequest": "د پول ریکویسټ یا د یوځای کولو غوښتنې لینک نه دی",
"announce": {
"commentPosted": "تبصره خپره شوه",
"reviewSubmitted": "بیاکتنه وسپارل شوه",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "دا تبصره نه شي خپرېدای. کېدای شي ټاکل شوې کرښه بدله شوې وي، یا PR تازه شوی وي.",
"reviewNotSubmitted": "دا بیاکتنه په اوسني حالت کې نه شي سپارل کېدای. کېدای شي PR بدل شوی وي، یا تاسو د خپل پل ریکویسټ د بیاکتنې اجازه نه لرئ.",
+ "reviewNotSubmittedTerm": "دا بیاکتنه په همدې بڼه نه شي کولای وسپارل شي. کېدای شي {{term}} بدل شوی وي، یا تاسو خپله {{term}} نشئ کولای وبيایۍ.",
"couldNotPostComment": "تبصره خپره نه شوه.",
"couldNotSubmitReview": "بیاکتنه ونه سپارل شوه. خپله اړیکه وګورئ او بیا هڅه وکړئ."
},
@@ -675,6 +727,7 @@
"couldNotReply": "ځواب ونه لېږل شو.",
"couldNotCompleteAction": "دا کړنه بشپړه نه شوه.",
"mergeResultDefaultError": "GitHub یوځای کول بشپړ نه کړل.",
+ "mergeResultNotCompleted": "{{term}} و نه یوځای شو. حالت یې وګورئ او بیا هڅه وکړئ.",
"ambiguous": "تایید نه شو — له بیا هڅې مخکې PR وګورئ.",
"persistenceFailed": "موږ ونه شو کړای دا کړنه ثبت کړو. مهرباني وکړئ وروسته بیا هڅه وکړئ.",
"forbidden": "اجازه نشته."
@@ -1988,11 +2041,31 @@
"retryConnection": "بیا د نښلېدو هڅه وکړئ"
},
"newSession": {
+ "recentlyUsed": "په دې وروستیو کې کارول شوي",
+ "couldNotLoadGithubRepositories": "د GitHub زېرمتونونه بار نه شول.",
+ "couldNotLoadGitlabRepositories": "د GitLab زېرمتونونه بار نه شول.",
+ "couldNotLoadBitbucketRepositories": "د Bitbucket زېرمتونونه بار نه شول.",
"connectGithubDescription": "په خپل براوزر کې GitHub ونښلوئ، بیا دلته راشئ او یو زېرمتون غوره کړئ.",
+ "connectGitlabDescription": "په خپل براوزر کې GitLab ونښلوئ، بیا دلته راشئ او یو زېرمتون غوره کړئ.",
+ "connectBitbucketDescription": "په خپل براوزر کې Bitbucket ونښلوئ، بیا دلته راشئ او یو زېرمتون غوره کړئ.",
"openGithub": "GitHub پرانیزئ",
+ "openGitlab": "GitLab پرانیزئ",
+ "openBitbucket": "Bitbucket پرانیزئ",
"refreshRepositories": "زېرمتونونه تازه کړئ",
"githubConnected": "GitHub نښلول شوی",
+ "gitlabConnected": "GitLab نښلول شوی",
"noRepositoriesVisible": "هېڅ زېرمتون نه ښکاري. وګورئ چې د Kilo GitHub اپلیکیشن زېرمتونونو ته لاسرسی لري، بیا لېست تازه کړئ.",
+ "noRepositoriesVisibleGitlab": "هېڅ زېرمتون نه ښکاري. د GitLab زېرمتونونو ته د لاسرسي اجازې وګورئ، بیا لېست تازه کړئ.",
+ "noRepositoriesVisibleBitbucket": "هېڅ زېرمتون نه ښکاري. د Bitbucket زېرمتونونو ته د لاسرسي اجازې وګورئ، بیا لېست تازه کړئ.",
+ "bitbucketOrganizationsOnly": "Bitbucket یوازې د بنسټونو لپاره شتون لري.",
+ "branchPickerTitle": "څانګه وټاکئ",
+ "branchDefault": "ډیفالټ",
+ "branchAccessibility": "څانګه: {{label}}",
+ "branchLoading": "څانګې بارېږي",
+ "branchLoadError": "څانګې بار نه شوې",
+ "branchUnavailable": "د دې زېرمتون لپاره څانګې شتون نلري. له چمتو کوونکي سره خپل لاسرسی وګورئ، بیا بل زېرمتون وټاکئ.",
+ "branchEmpty": "هېڅ څانګه شتون نلري",
+ "branchPlaceholder": "یوه څانګه وټاکئ",
"runOnWithTarget": "د چلولو ځای: {{target}}",
"environment": "چاپېریال",
"couldNotLoadEnvironment": "ستاسو چاپېریال بار نه شو.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "زېرمتونونه تازه نه شول. بیا هڅه وکړئ.",
"discardDraftTitle": "مسوده ړنګه کړم؟",
"discardDraftMessage": "ستاسو پرامپټ به له منځه ولاړ شي.",
+ "discardWithUploadsMessage": "ستاسو پرامپټ او هغه پورته شوي فایلونه به ړنګ شي چې له لېږل شویو پیغامونو سره ضمیمه نه دي.",
"discardFailed": "مسوده ړنګه نه شوه. بیا هڅه وکړئ.",
"remoteHint": "د kilo د یوې ځايي پروسې د کنټرول لپاره په خپل کمپیوټر کې `kilo remote`، یا د CLI په روانه ناسته کې `/remote` وچلوئ.",
- "connectBitbucketDescription": "په خپل براوزر کې Bitbucket ونښلوئ، بیا دلته راشئ او یو زېرمتون غوره کړئ.",
- "connectGitlabDescription": "په خپل براوزر کې GitLab ونښلوئ، بیا دلته راشئ او یو زېرمتون غوره کړئ.",
- "couldNotLoadBitbucketRepositories": "د Bitbucket زېرمتونونه بار نه شول.",
- "couldNotLoadGithubRepositories": "د GitHub زېرمتونونه بار نه شول.",
- "couldNotLoadGitlabRepositories": "د GitLab زېرمتونونه بار نه شول.",
- "gitlabConnected": "GitLab نښلول شوی",
- "noRepositoriesVisibleBitbucket": "هېڅ زېرمتون نه ښکاري. د Bitbucket زېرمتونونو ته د لاسرسي اجازې وګورئ، بیا لېست تازه کړئ.",
- "noRepositoriesVisibleGitlab": "هېڅ زېرمتون نه ښکاري. د GitLab زېرمتونونو ته د لاسرسي اجازې وګورئ، بیا لېست تازه کړئ.",
- "openBitbucket": "Bitbucket پرانیزئ",
- "openGitlab": "GitLab پرانیزئ",
- "recentlyUsed": "په دې وروستیو کې کارول شوي",
"continueFrom": "د {{title}} ناستې دوام روان دی.",
"importingSession": "ناسته واردېږي",
"cliCannotContinue": "دا CLI ناستې ته دوام نه شي ورکولی. Cloud Agent یا بل CLI غوره کړئ.",
- "importFailed": "دا ناسته وارده نه شوه.",
- "discardWithUploadsMessage": "ستاسو پرامپټ او هغه پورته شوي فایلونه به ړنګ شي چې له لېږل شویو پیغامونو سره ضمیمه نه دي."
+ "importFailed": "دا ناسته وارده نه شوه."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} فایل تازه شو.",
diff --git a/apps/mobile/src/i18n/locales/pt-BR.json b/apps/mobile/src/i18n/locales/pt-BR.json
index 43f110a475..7110b66004 100644
--- a/apps/mobile/src/i18n/locales/pt-BR.json
+++ b/apps/mobile/src/i18n/locales/pt-BR.json
@@ -3,6 +3,9 @@
"cancel": "Cancelar",
"done": "Concluir",
"retry": "Tentar novamente",
+ "tryAgain": "Tentar novamente",
+ "continue": "Continuar",
+ "notNow": "Agora não",
"language": "Idioma",
"device": "Dispositivo",
"share": "Compartilhar {{title}}",
@@ -14,15 +17,12 @@
"approve": "Aprovar",
"refresh": "Atualizar",
"couldNotRefresh": "Não foi possível atualizar. Puxe para baixo para tentar novamente.",
- "tryAgain": "Tentar novamente",
"openInBrowser": "Abrir no navegador",
"openSettings": "Abrir configurações",
"copiedToClipboard": "Copiado para a área de transferência",
"couldNotCopyToClipboard": "Não foi possível copiar para a área de transferência.",
"required": "obrigatório",
"error": "erro: {{error}}",
- "notNow": "Agora não",
- "continue": "Continuar",
"back": "Voltar",
"somethingWentWrong": "Algo deu errado.",
"couldNotOpen": "Não foi possível abrir {{label}}.",
@@ -36,6 +36,7 @@
"cost": "Custo",
"discard": "Descartar",
"findings": "Problemas",
+ "mergeRequest": "merge request",
"notConnected": "Não conectado",
"notifications": "Notificações",
"pullRequest": "pR",
@@ -1543,11 +1544,31 @@
"retryConnection": "Tentar reconectar"
},
"newSession": {
+ "recentlyUsed": "Usados recentemente",
+ "couldNotLoadGithubRepositories": "Não foi possível carregar os repositórios do GitHub.",
+ "couldNotLoadGitlabRepositories": "Não foi possível carregar os repositórios do GitLab.",
+ "couldNotLoadBitbucketRepositories": "Não foi possível carregar os repositórios do Bitbucket.",
"connectGithubDescription": "Conecte o GitHub no seu navegador e volte aqui para escolher um repositório.",
+ "connectGitlabDescription": "Conecte o GitLab no seu navegador e volte aqui para escolher um repositório.",
+ "connectBitbucketDescription": "Conecte o Bitbucket no seu navegador e volte aqui para escolher um repositório.",
"openGithub": "Abrir GitHub",
+ "openGitlab": "Abrir GitLab",
+ "openBitbucket": "Abrir Bitbucket",
"refreshRepositories": "Atualizar repositórios",
"githubConnected": "GitHub conectado",
+ "gitlabConnected": "GitLab conectado",
"noRepositoriesVisible": "Nenhum repositório está visível. Verifique as permissões de acesso do aplicativo Kilo no GitHub e atualize a lista.",
+ "noRepositoriesVisibleGitlab": "Nenhum repositório está visível. Verifique as permissões de acesso aos repositórios no GitLab e atualize a lista.",
+ "noRepositoriesVisibleBitbucket": "Nenhum repositório está visível. Verifique as permissões de acesso aos repositórios no Bitbucket e atualize a lista.",
+ "bitbucketOrganizationsOnly": "O Bitbucket está disponível apenas para organizações.",
+ "branchPickerTitle": "Selecionar branch",
+ "branchDefault": "Padrão",
+ "branchAccessibility": "Branch: {{label}}",
+ "branchLoading": "Carregando branches",
+ "branchLoadError": "Não foi possível carregar os branches",
+ "branchUnavailable": "Não há branches disponíveis para este repositório. Verifique seu acesso com o provedor e escolha outro repositório.",
+ "branchEmpty": "Nenhum branch disponível",
+ "branchPlaceholder": "Selecionar um branch",
"runOnWithTarget": "Executar em: {{target}}",
"environment": "Ambiente",
"couldNotLoadEnvironment": "Não foi possível carregar seu ambiente.",
@@ -1566,26 +1587,15 @@
"couldNotReadPendingSessions": "Não foi possível ler as sessões pendentes. Tente novamente.",
"failedToCreate": "Não foi possível criar a sessão.",
"couldNotRefreshRepositories": "Não foi possível atualizar os repositórios. Tente novamente.",
- "discardDraftMessage": "Seu prompt será perdido.",
"discardDraftTitle": "Descartar rascunho?",
+ "discardDraftMessage": "Seu prompt será perdido.",
+ "discardWithUploadsMessage": "Seu prompt e os arquivos enviados ainda não vinculados a uma mensagem serão excluídos.",
"discardFailed": "Não foi possível descartar o rascunho. Tente novamente.",
"remoteHint": "Execute `kilo remote` no seu computador ou `/remote` em uma sessão ativa da CLI para controlar um processo local do kilo.",
- "connectBitbucketDescription": "Conecte o Bitbucket no seu navegador e volte aqui para escolher um repositório.",
- "connectGitlabDescription": "Conecte o GitLab no seu navegador e volte aqui para escolher um repositório.",
- "couldNotLoadBitbucketRepositories": "Não foi possível carregar os repositórios do Bitbucket.",
- "couldNotLoadGithubRepositories": "Não foi possível carregar os repositórios do GitHub.",
- "couldNotLoadGitlabRepositories": "Não foi possível carregar os repositórios do GitLab.",
- "gitlabConnected": "GitLab conectado",
- "noRepositoriesVisibleBitbucket": "Nenhum repositório está visível. Verifique as permissões de acesso aos repositórios no Bitbucket e atualize a lista.",
- "noRepositoriesVisibleGitlab": "Nenhum repositório está visível. Verifique as permissões de acesso aos repositórios no GitLab e atualize a lista.",
- "openBitbucket": "Abrir Bitbucket",
- "openGitlab": "Abrir GitLab",
- "recentlyUsed": "Usados recentemente",
"continueFrom": "Continuando a sessão {{title}}.",
"importingSession": "Importando sessão",
"cliCannotContinue": "Esta CLI não permite continuar uma sessão. Escolha o Cloud Agent ou outra CLI.",
- "importFailed": "Não foi possível importar esta sessão.",
- "discardWithUploadsMessage": "Seu prompt e os arquivos enviados ainda não vinculados a uma mensagem serão excluídos."
+ "importFailed": "Não foi possível importar esta sessão."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} arquivo foi atualizado.",
@@ -2326,162 +2336,11 @@
"installAttributionPromptTitle": "Permitir atribuição de instalação?"
},
"prReview": {
+ "pullRequestUnavailable": "Pull request indisponível",
+ "pullRequestUnavailableDescription": "Não é possível abrir este PR. Ele pode ter sido excluído, o repositório pode ser privado ou o aplicativo do Kilo para GitHub pode não estar instalado nele.",
"accessDeniedDescription": "Você não tem permissão para ver este pull request.",
- "checkConnection": "Verificar conexão",
- "checks": {
- "checksCount": "{{displayCount}} verificações",
- "couldNotLoad": "Não foi possível carregar as verificações.",
- "failed": "{{displayCount}} com falha",
- "noAccess": "Você não tem acesso às verificações deste repositório.",
- "noChecksReported": "Nenhuma verificação informada",
- "notAvailable": "As verificações ainda não estão disponíveis. O commit de origem pode não ter sido processado ou o aplicativo do Kilo para GitHub pode não estar instalado no repositório de origem.",
- "openDetails": "Abrir detalhes de {{name}}",
- "passed": "{{displayCount}} com sucesso",
- "pending": "{{displayCount}} pendentes",
- "retryChecks": "Tentar carregar as verificações novamente",
- "skipped": "{{displayCount}} ignoradas",
- "title": "Verificações",
- "viewOnGitHub": "Ver PR no GitHub",
- "checkDetails": "detalhes da verificação"
- },
- "composer": {
- "addTitle": "Novo comentário",
- "addToReview": "Adicionar à revisão",
- "comment": "Comentar",
- "commentBody": "Texto do comentário",
- "commentBodyPlaceholder": "Seu comentário",
- "commentNow": "Comentar agora",
- "discardMessage": "Seu rascunho será perdido.",
- "discardTitle": "Descartar comentário?",
- "editTitle": "Edição do comentário",
- "insertSuggestion": "Inserir sugestão",
- "insertSuggestionA11y": "Inserir uma sugestão de código",
- "loadFailedTitle": "Não foi possível carregar o editor de comentários.",
- "ok": "OK",
- "unavailableMessage": "Este comentário pendente já foi excluído ou enviado.",
- "unavailableTitle": "Comentário indisponível",
- "bodyEmpty": "O comentário não pode ficar vazio.",
- "suggestionsOnlyAddedLines": "As sugestões se aplicam apenas às linhas adicionadas.",
- "tapDiffLineToSuggest": "Toque em uma linha da comparação para ativar as sugestões."
- },
- "connect": {
- "checkFailedMessage": "Não é possível saber se você está conectado até o carregamento terminar.",
- "checkFailedTitle": "Não foi possível verificar a conexão com o GitHub.",
- "description": "Conecte sua conta do GitHub para revisar pull requests no celular.",
- "reconnectDescription": "Sua conexão com o GitHub foi revogada. Conecte-se novamente para continuar revisando pull requests no celular.",
- "reconnectTitle": "Reconexão com o GitHub"
- },
- "connectionExpired": "A conexão com o GitHub expirou.",
- "couldNotLoadPullRequest": "Não foi possível carregar o pull request.",
- "couldNotOpenGitHubAppSettings": "Não foi possível abrir as configurações do aplicativo do GitHub.",
- "description": "Descrição",
- "discussion": {
- "acceptTerms": "Aceitar",
- "accessDeniedMessage": "Você não tem permissão para ver a discussão deste PR.",
- "addReaction": "Adicionar reação",
- "block": "Bloquear",
- "blockedUser": "{{login}} bloqueado",
- "collapseThread": "Recolher conversa",
- "commentActions": "Ações do comentário",
- "comment": "{{displayCount}} comentários",
- "comment_other": "{{displayCount}} comentários",
- "couldNotLoad": "Não foi possível carregar a discussão.",
- "couldNotLoadMore": "Não foi possível carregar mais comentários.",
- "loadMoreComments": "Carregar mais comentários",
- "loading": "Carregando discussão",
- "moderation": {
- "block": {
- "retryable": "Não foi possível bloquear este usuário. Verifique sua conexão e tente novamente.",
- "terminal": "Este usuário não pode ser bloqueado."
- },
- "mute": {
- "retryable": "Não foi possível silenciar este usuário. Verifique sua conexão e tente novamente.",
- "terminal": "Este usuário não pode ser silenciado."
- },
- "reportContent": {
- "retryable": "Não foi possível denunciar este comentário. Verifique sua conexão e tente novamente.",
- "terminal": "Este comentário não pode ser denunciado."
- },
- "reportUser": {
- "retryable": "Não foi possível denunciar este usuário. Verifique sua conexão e tente novamente.",
- "terminal": "Este usuário não pode ser denunciado."
- }
- },
- "moreLinesAbove": "… mais {{displayCount}} linhas acima",
- "mute": "Silenciar",
- "mutedUser": "{{login}} silenciado",
- "noDiscussion": "Ainda não há discussão",
- "noDiscussionDescription": "Este pull request ainda não tem conversas de revisão nem comentários gerais.",
- "comment_one": "1 comentário",
- "outdated": "Desatualizado",
- "quotedDiffSnippet": "Trecho citado da comparação",
- "reactionPill": "reação {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "reações",
- "reaction_other": "reações",
- "reaction_one": "reação",
- "replyBadRequest": "Não é possível publicar esta resposta. A conversa pode ter sido alterada.",
- "replyBody": "Texto da resposta",
- "replyForbidden": "Você não tem permissão para responder a este pull request.",
- "replyPlaceholder": "Sua resposta…",
- "reportContent": "Denunciar conteúdo",
- "reportUser": "Denunciar usuário",
- "resolveThread": "Resolver conversa",
- "resolved": "Resolvida",
- "retryLoadingMore": "Tentar carregar mais comentários novamente",
- "reviewFiles": "Revisar arquivos",
- "startedRelative": " · iniciada {{relative}}",
- "submitReply": "Enviar resposta",
- "termsAcceptRetry": "Não foi possível aceitar os termos. Verifique sua conexão e tente novamente.",
- "termsCopy": "Você precisa ter pelo menos 13 anos para publicar.",
- "termsTitle": "Termos de serviço",
- "threadAccessibilityLabel": "Conversa {{anchorLabel}}",
- "unavailable": "A discussão está indisponível.",
- "unavailableMessage": "Este pull request pode ter sido removido.",
- "unresolveThread": "Reabrir conversa",
- "viewTerms": "Ver termos",
- "termsAcceptRequired": "Você precisa aceitar os termos de serviço para publicar.",
- "termsCheckRetryCopy": "Não foi possível consultar os termos de serviço. Verifique sua conexão e tente novamente.",
- "termsOutdatedCopy": "Os termos de serviço foram atualizados. Reabra esta tela para aceitar a versão mais recente.",
- "comment_many": "{{displayCount}} comentários",
- "reaction_many": "reações",
- "reactions": {
- "thumbsUp": "Polegar para cima",
- "thumbsDown": "Polegar para baixo",
- "laugh": "Riso",
- "hooray": "Viva",
- "confused": "Confuso",
- "heart": "Coração",
- "rocket": "Foguete",
- "eyes": "Olhos"
- },
- "anchor": {
- "fileCommentOnPath": "Comentário sobre o arquivo {{path}}",
- "fileComment": "Comentário sobre o arquivo",
- "outdatedOnPathLines": "Desatualizado em {{path}} {{lines}}",
- "outdatedOnLines": "Desatualizado em {{lines}}",
- "outdatedOnPath": "Desatualizado em {{path}}"
- },
- "deletedUser": "usuário excluído"
- },
- "entry": {
- "clearLink": "Limpar link do pull request",
- "couldNotLoad": "Não foi possível carregar.",
- "eyebrow": "Abra um pull request pela URL.",
- "noRecentPrs": "Nenhum PR recente",
- "noRecentPrsDescription": "Cole um link de PR acima para iniciar uma revisão — ele aparecerá aqui na próxima vez.",
- "open": "Abrir",
- "pasteLink": "Colar link do pull request",
- "pastePrLink": "Colar link de um PR",
- "removeFromRecentsMessage": "Este pull request será removido da sua lista de recentes.",
- "removeFromRecentsTitle": "Remover da lista de recentes?",
- "removeRecentAccessibility": "Remover {{repo}} da lista de recentes",
- "urlAccessibility": "URL do pull request do GitHub"
- },
- "eventChips": {
- "comment": "Comentar",
- "label": "Tipo de revisão",
- "requestChanges": "Solicitar alterações"
- },
+ "noFilesChanged": "Nenhum arquivo alterado",
+ "noFilesChangedDescription": "Este pull request não contém alterações em arquivos.",
"fileList": {
"filesList": "Lista de arquivos",
"filesViewed": "Arquivos · {{viewed}} de {{total}} visualizados",
@@ -2526,7 +2385,6 @@
"commentOnSelectedLines": "Comentar nas linhas selecionadas",
"finishReview": "Concluir revisão"
},
- "headLine": "{{counts}} · commit de origem {{sha}}",
"hunkRows": {
"contextUnavailable": "O contexto não está disponível nesta referência.",
"expandAll": "Expandir tudo",
@@ -2561,56 +2419,68 @@
"fileLoadedCount_many": "{{displayCount}} arquivos carregados",
"fileLoadedOfTotalCount_many": "{{displayCount}} de {{total}} arquivos carregados"
},
- "inbox": {
- "couldNotLoad": "Não foi possível carregar a caixa de entrada.",
- "loading": "Carregando caixa de entrada",
- "noReviewRequests": "Nenhuma solicitação de revisão",
- "noReviewRequestsDescription": "Os pull requests que aguardam sua revisão aparecem aqui. Você também pode colar o link de qualquer PR acima.",
- "title": "Caixa de entrada"
+ "sideBySide": {
+ "emptyDiffColumn": "coluna vazia na comparação",
+ "emptyDiffRow": "Linha vazia na comparação",
+ "newOnly": "Apenas na nova versão: {{text}}",
+ "noNewlineAtEndOfFile": "não há quebra de linha no final do arquivo.",
+ "oldNew": "Antigo: {{old}} | Novo: {{new}}",
+ "oldOnly": "Apenas na versão anterior: {{text}}"
+ },
+ "connectionExpired": "A conexão com o GitHub expirou.",
+ "capabilities": {
+ "banner": {
+ "title": "Não disponível neste provedor",
+ "accessibility": "Não disponível neste provedor: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Instalar o aplicativo do Kilo para GitHub",
"merge": {
- "autoMergeDescription": "O GitHub mesclará este pull request automaticamente quando todas as verificações obrigatórias forem aprovadas (método: {{method}}).",
+ "merge": "Mesclagem",
+ "mergeNow": "Mesclar agora",
+ "mergePullRequest": "Mesclagem do pull request",
+ "mergeTermTitle": "Mesclar {{term}}",
+ "enableAutoMerge": "Ativar mesclagem automática",
+ "disableAutoMerge": "Desativar mesclagem automática",
"autoMergeOn": "Mesclagem automática ativada",
- "blockedTitle": "O que impede a mesclagem",
- "cannotMerge": "Este pull request não pode ser mesclado no estado atual.",
+ "autoMergeDescription": "O GitHub mesclará este pull request automaticamente quando todas as verificações obrigatórias forem aprovadas (método: {{method}}).",
"checking": "Verificando se é possível mesclar…",
+ "couldNotDetermine": "Não foi possível verificar se o pull request pode ser mesclado.",
+ "refreshMergeability": "Verificar novamente se é possível mesclar",
+ "blockedTitle": "O que impede a mesclagem",
+ "updateBranch": "Atualizar branch",
+ "updateBranchFromBase": "Atualizar branch a partir do branch de base",
+ "methodLabel": "Método",
+ "commitTitle": "Título do commit",
"commitMessage": "Mensagem do commit",
"commitMessagePlaceholder": "Descrição opcional do commit de mesclagem",
- "commitTitle": "Título do commit",
- "confirmMessage": "Isso mesclará suas alterações no branch de base.",
- "confirmTitle": "Mesclar pull request?",
- "couldNotDetermine": "Não foi possível verificar se o pull request pode ser mesclado.",
- "couldNotMerge": "Não foi possível mesclar o pull request.",
"deleteBranch": "Excluir branch",
"deleteBranchAfterMerge": "Excluir branch após a mesclagem",
- "disableAutoMerge": "Desativar mesclagem automática",
- "enableAutoMerge": "Ativar mesclagem automática",
- "enableAutoMergeConfirmMessage": "O GitHub mesclará este pull request automaticamente quando todas as verificações obrigatórias forem aprovadas.",
+ "noEnabledMethods": "Este repositório não tem métodos de mesclagem ativados. Peça a um administrador do repositório para ativar a mesclagem com um commit de mesclagem, com agrupamento de commits ou com reaplicação de commits.",
+ "confirmTitle": "Mesclar pull request?",
+ "confirmTitleTerm": "Mesclar {{term}}?",
+ "confirmMessage": "Isso mesclará suas alterações no branch de base.",
"enableAutoMergeConfirmTitle": "Ativar mesclagem automática?",
+ "enableAutoMergeConfirmMessage": "O GitHub mesclará este pull request automaticamente quando todas as verificações obrigatórias forem aprovadas.",
+ "enableAutoMergeConfirmMessageTerm": "O {{term}} será mesclado automaticamente quando o pipeline for bem-sucedido.",
+ "enableAutoMergeDescriptionTerm": "O GitLab mescla este {{term}} automaticamente quando o pipeline for bem-sucedido.",
"forbidden": "Você não tem permissão para mesclar este pull request.",
- "loadFailedTitle": "Não foi possível carregar as opções de mesclagem.",
- "merge": "Mesclagem",
- "mergeNow": "Mesclar agora",
- "mergePullRequest": "Mesclagem do pull request",
- "methodLabel": "Método",
+ "cannotMerge": "Este pull request não pode ser mesclado no estado atual.",
+ "couldNotMerge": "Não foi possível mesclar o pull request.",
"methods": {
"merge": "Mesclagem",
"rebase": "Reaplicar",
"squash": "Agrupar"
},
- "noEnabledMethods": "Este repositório não tem métodos de mesclagem ativados. Peça a um administrador do repositório para ativar a mesclagem com um commit de mesclagem, com agrupamento de commits ou com reaplicação de commits.",
+ "terminal": {
+ "alreadyMerged": "Já mesclado",
+ "closed": "Este pull request está fechado",
+ "closedMergeRequest": "Este merge request está fechado"
+ },
"partialSuccessBanner": {
"accessibility": "Mesclado. Não foi possível excluir o branch: {{reason}}",
"body": "Não foi possível excluir o branch: {{reason}}."
},
- "refreshMergeability": "Verificar novamente se é possível mesclar",
- "terminal": {
- "alreadyMerged": "Já mesclado",
- "closed": "Este pull request está fechado"
- },
- "updateBranch": "Atualizar branch",
- "updateBranchFromBase": "Atualizar branch a partir do branch de base",
+ "loadFailedTitle": "Não foi possível carregar as opções de mesclagem.",
"blocked": {
"unknownStateTitle": "O GitHub ainda não confirmou se é possível mesclar",
"unknownStateDetail": "Tente atualizar a visão geral em instantes.",
@@ -2630,6 +2500,19 @@
"notMergeableTitle": "Este pull request ainda não pode ser mesclado",
"notMergeableDetail": "O GitHub informou o seguinte estado de mesclagem: {{state}}."
},
+ "restrictions": {
+ "title": "Restrições de mesclagem",
+ "approvalsRequired_one": "{{displayCount}} aprovação necessária",
+ "approvalsRequired_other": "{{displayCount}} aprovações necessárias",
+ "pipelineMustSucceed": "O pipeline precisa ser bem-sucedido antes da mesclagem.",
+ "approvalsRequired_many": "{{displayCount}} aprovações necessárias"
+ },
+ "providerBlocked": {
+ "failingPipeline": "O pipeline está falhando no último commit.",
+ "pendingPipeline": "O pipeline ainda está sendo executado no último commit.",
+ "permission": "Você não tem permissão para mesclar este {{term}}.",
+ "draft": "Marque o {{term}} como pronto para revisão antes de mesclar."
+ },
"methodLabels": {
"merge": "Criar um commit de mesclagem",
"squash": "Agrupar e mesclar",
@@ -2641,9 +2524,207 @@
"rebase": "Reaplique todos os commits deste branch sobre o branch de base, sem criar um commit de mesclagem."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Conversa {{anchorLabel}}",
+ "collapseThread": "Recolher conversa",
+ "resolveThread": "Resolver conversa",
+ "unresolveThread": "Reabrir conversa",
+ "resolved": "Resolvida",
+ "outdated": "Desatualizado",
+ "comment_one": "1 comentário",
+ "comment": "{{displayCount}} comentários",
+ "comment_other": "{{displayCount}} comentários",
+ "startedRelative": " · iniciada {{relative}}",
+ "couldNotLoadMore": "Não foi possível carregar mais comentários.",
+ "retryLoadingMore": "Tentar carregar mais comentários novamente",
+ "loadMoreComments": "Carregar mais comentários",
+ "addReaction": "Adicionar reação",
+ "reactionPill": "reação {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "reação",
+ "reaction": "reações",
+ "reaction_other": "reações",
+ "commentActions": "Ações do comentário",
+ "reportContent": "Denunciar conteúdo",
+ "reportUser": "Denunciar usuário",
+ "mute": "Silenciar",
+ "block": "Bloquear",
+ "blockedUser": "{{login}} bloqueado",
+ "mutedUser": "{{login}} silenciado",
+ "replyPlaceholder": "Sua resposta…",
+ "replyBody": "Texto da resposta",
+ "submitReply": "Enviar resposta",
+ "termsTitle": "Termos de serviço",
+ "termsCopy": "Você precisa ter pelo menos 13 anos para publicar.",
+ "termsAcceptRetry": "Não foi possível aceitar os termos. Verifique sua conexão e tente novamente.",
+ "viewTerms": "Ver termos",
+ "acceptTerms": "Aceitar",
+ "replyBadRequest": "Não é possível publicar esta resposta. A conversa pode ter sido alterada.",
+ "replyForbidden": "Você não tem permissão para responder a este pull request.",
+ "replyForbiddenTerm": "Você não tem permissão para responder a este {{term}}.",
+ "moderation": {
+ "block": {
+ "retryable": "Não foi possível bloquear este usuário. Verifique sua conexão e tente novamente.",
+ "terminal": "Este usuário não pode ser bloqueado."
+ },
+ "mute": {
+ "retryable": "Não foi possível silenciar este usuário. Verifique sua conexão e tente novamente.",
+ "terminal": "Este usuário não pode ser silenciado."
+ },
+ "reportContent": {
+ "retryable": "Não foi possível denunciar este comentário. Verifique sua conexão e tente novamente.",
+ "terminal": "Este comentário não pode ser denunciado."
+ },
+ "reportUser": {
+ "retryable": "Não foi possível denunciar este usuário. Verifique sua conexão e tente novamente.",
+ "terminal": "Este usuário não pode ser denunciado."
+ }
+ },
+ "accessDeniedMessage": "Você não tem permissão para ver a discussão deste PR.",
+ "unavailable": "A discussão está indisponível.",
+ "unavailableMessage": "Este pull request pode ter sido removido.",
+ "couldNotLoad": "Não foi possível carregar a discussão.",
+ "loading": "Carregando discussão",
+ "noDiscussion": "Ainda não há discussão",
+ "noDiscussionDescription": "Este pull request ainda não tem conversas de revisão nem comentários gerais.",
+ "reviewFiles": "Revisar arquivos",
+ "quotedDiffSnippet": "Trecho citado da comparação",
+ "moreLinesAbove": "… mais {{displayCount}} linhas acima",
+ "termsAcceptRequired": "Você precisa aceitar os termos de serviço para publicar.",
+ "termsOutdatedCopy": "Os termos de serviço foram atualizados. Reabra esta tela para aceitar a versão mais recente.",
+ "termsCheckRetryCopy": "Não foi possível consultar os termos de serviço. Verifique sua conexão e tente novamente.",
+ "reactions": {
+ "thumbsUp": "Polegar para cima",
+ "thumbsDown": "Polegar para baixo",
+ "laugh": "Riso",
+ "hooray": "Viva",
+ "confused": "Confuso",
+ "heart": "Coração",
+ "rocket": "Foguete",
+ "eyes": "Olhos"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Comentário sobre o arquivo {{path}}",
+ "fileComment": "Comentário sobre o arquivo",
+ "outdatedOnPathLines": "Desatualizado em {{path}} {{lines}}",
+ "outdatedOnLines": "Desatualizado em {{lines}}",
+ "outdatedOnPath": "Desatualizado em {{path}}"
+ },
+ "deletedUser": "usuário excluído",
+ "comment_many": "{{displayCount}} comentários",
+ "reaction_many": "reações"
+ },
+ "couldNotOpenGitHubAppSettings": "Não foi possível abrir as configurações do aplicativo do GitHub.",
+ "installKiloGitHubApp": "Instalar o aplicativo do Kilo para GitHub",
+ "checkConnection": "Verificar conexão",
+ "couldNotLoadPullRequest": "Não foi possível carregar o pull request.",
+ "description": "Descrição",
"noDescriptionProvided": "Não há descrição.",
- "noFilesChanged": "Nenhum arquivo alterado",
- "noFilesChangedDescription": "Este pull request não contém alterações em arquivos.",
+ "review": "Revisão",
+ "reviewPullRequest": "Revisar pull request",
+ "headLine": "{{counts}} · commit de origem {{sha}}",
+ "entry": {
+ "eyebrow": "Abra um pull request ou merge request pela URL",
+ "pastePrLink": "Colar link de um pull request ou merge request",
+ "noRecentPrs": "Nenhuma revisão recente",
+ "noRecentPrsDescription": "Cole um link acima para iniciar uma revisão — ele aparecerá aqui na próxima vez.",
+ "couldNotLoad": "Não foi possível carregar.",
+ "removeFromRecentsTitle": "Remover da lista de recentes?",
+ "removeFromRecentsMessage": "Esta revisão será removida da sua lista de recentes.",
+ "removeRecentAccessibility": "Remover {{repo}} da lista de recentes",
+ "urlAccessibility": "Digite a URL de um pull request ou merge request",
+ "urlPlaceholder": "URL de pull request ou merge request",
+ "openAccessibility": "Abrir pull request ou merge request",
+ "clearLink": "Limpar link",
+ "pasteLink": "Colar link do pull request ou merge request",
+ "open": "Abrir"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} verificações",
+ "couldNotLoad": "Não foi possível carregar as verificações.",
+ "failed": "{{displayCount}} com falha",
+ "noAccess": "Você não tem acesso às verificações deste repositório.",
+ "noChecksReported": "Nenhuma verificação informada",
+ "notAvailable": "As verificações ainda não estão disponíveis. O commit de origem pode não ter sido processado ou o aplicativo do Kilo para GitHub pode não estar instalado no repositório de origem.",
+ "openDetails": "Abrir detalhes de {{name}}",
+ "passed": "{{displayCount}} com sucesso",
+ "pending": "{{displayCount}} pendentes",
+ "retryChecks": "Tentar carregar as verificações novamente",
+ "skipped": "{{displayCount}} ignoradas",
+ "title": "Verificações",
+ "viewOnGitHub": "Ver PR no GitHub",
+ "checkDetails": "detalhes da verificação"
+ },
+ "inbox": {
+ "couldNotLoad": "Não foi possível carregar a caixa de entrada.",
+ "loading": "Carregando caixa de entrada",
+ "noReviewRequests": "Nenhuma solicitação de revisão",
+ "noReviewRequestsDescription": "Os pull requests que aguardam sua revisão aparecem aqui. Você também pode colar o link de qualquer PR acima.",
+ "title": "Caixa de entrada"
+ },
+ "composer": {
+ "addTitle": "Novo comentário",
+ "addToReview": "Adicionar à revisão",
+ "comment": "Comentar",
+ "commentBody": "Texto do comentário",
+ "commentBodyPlaceholder": "Seu comentário",
+ "commentNow": "Comentar agora",
+ "discardMessage": "Seu rascunho será perdido.",
+ "discardTitle": "Descartar comentário?",
+ "editTitle": "Edição do comentário",
+ "insertSuggestion": "Inserir sugestão",
+ "insertSuggestionA11y": "Inserir uma sugestão de código",
+ "loadFailedTitle": "Não foi possível carregar o editor de comentários.",
+ "ok": "OK",
+ "unavailableMessage": "Este comentário pendente já foi excluído ou enviado.",
+ "unavailableTitle": "Comentário indisponível",
+ "bodyEmpty": "O comentário não pode ficar vazio.",
+ "suggestionsOnlyAddedLines": "As sugestões se aplicam apenas às linhas adicionadas.",
+ "tapDiffLineToSuggest": "Toque em uma linha da comparação para ativar as sugestões."
+ },
+ "connect": {
+ "checkFailedTitle": "Não foi possível verificar a conexão com o GitHub.",
+ "checkFailedMessage": "Não é possível saber se você está conectado até o carregamento terminar.",
+ "checkFailedTitleGitLab": "Não foi possível verificar a conexão com o GitLab.",
+ "checkFailedTitleBitbucket": "Não foi possível verificar a conexão com o Bitbucket.",
+ "providerCheckFailedMessage": "O status da conexão só fica disponível quando o carregamento terminar.",
+ "reconnectTitle": "Reconexão com o GitHub",
+ "reconnectDescription": "Sua conexão com o GitHub foi revogada. Conecte-se novamente para continuar revisando pull requests no celular.",
+ "description": "Conecte sua conta do GitHub para revisar pull requests no celular.",
+ "gitlabDescription": "Conecte sua conta do GitLab para revisar merge requests no celular.",
+ "bitbucketDescription": "Conecte o Bitbucket a esta organização para revisar pull requests no celular.",
+ "bitbucketOrgOnlyDescription": "Selecione uma organização no seu perfil para revisar os pull requests dela no Bitbucket."
+ },
+ "screen": {
+ "shareA11y": "Compartilhar pull request",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Este comentário será removido da fila de revisão.",
+ "deletePendingTitle": "Excluir comentário pendente?",
+ "loadFailedTitle": "Não foi possível carregar a tela de envio da revisão.",
+ "pendingComment": "comentários pendentes",
+ "pendingComment_other": "comentários pendentes",
+ "pendingComment_one": "comentário pendente",
+ "summaryOptional": "Resumo (opcional)",
+ "partialPostedMessage": "Comentários publicados: {{displayFreshCount}}. Comentários mantidos na fila por se referirem a um commit mais antigo: {{displayStaleCount}}.",
+ "submitCountOfTotal": "Enviar {{displayFreshCount}} de {{displayTotalCount}} comentários",
+ "submitReview": "Enviar revisão",
+ "pendingComment_many": "comentários pendentes",
+ "blockedRequestChanges": "Adicione um resumo ou pelo menos um comentário para solicitar alterações.",
+ "blockedComment": "Adicione um resumo ou pelo menos um comentário para enviar uma revisão com comentários."
+ },
+ "reconnectNotice": {
+ "title": "A conexão com o GitHub expirou.",
+ "message": "Sua conexão com o GitHub não é mais válida. Verifique a conexão novamente. Se necessário, o app pedirá que você se reconecte.",
+ "gitlabTitle": "A conexão com o GitLab expirou.",
+ "bitbucketTitle": "A conexão com o Bitbucket expirou.",
+ "providerMessage": "Sua conexão com o {{provider}} não é mais válida. Verifique a conexão novamente. Se necessário, o app pedirá que você se reconecte."
+ },
+ "eventChips": {
+ "comment": "Comentar",
+ "label": "Tipo de revisão",
+ "requestChanges": "Solicitar alterações"
+ },
"overview": {
"commit": "alterações registradas",
"commit_other": "alterações registradas",
@@ -2686,40 +2767,25 @@
"summaryA11y": "Resumo da revisão",
"summaryPlaceholder": "Resumo opcional para a revisão"
},
- "pullRequestUnavailable": "Pull request indisponível",
- "pullRequestUnavailableDescription": "Não é possível abrir este PR. Ele pode ter sido excluído, o repositório pode ser privado ou o aplicativo do Kilo para GitHub pode não estar instalado nele.",
- "reconnectNotice": {
- "message": "Sua conexão com o GitHub não é mais válida. Verifique a conexão novamente. Se necessário, o app pedirá que você se reconecte.",
- "title": "A conexão com o GitHub expirou."
- },
- "review": "Revisão",
- "reviewPullRequest": "Revisar pull request",
- "screen": {
- "shareA11y": "Compartilhar pull request",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "coluna vazia na comparação",
- "emptyDiffRow": "Linha vazia na comparação",
- "newOnly": "Apenas na nova versão: {{text}}",
- "noNewlineAtEndOfFile": "não há quebra de linha no final do arquivo.",
- "oldNew": "Antigo: {{old}} | Novo: {{new}}",
- "oldOnly": "Apenas na versão anterior: {{text}}"
+ "tabs": {
+ "discussion": "Discussão",
+ "files": "Arquivos",
+ "overview": "Visão geral"
},
- "submit": {
- "deletePendingMessage": "Este comentário será removido da fila de revisão.",
- "deletePendingTitle": "Excluir comentário pendente?",
- "loadFailedTitle": "Não foi possível carregar a tela de envio da revisão.",
- "pendingComment": "comentários pendentes",
- "pendingComment_other": "comentários pendentes",
- "pendingComment_one": "comentário pendente",
- "summaryOptional": "Resumo (opcional)",
- "partialPostedMessage": "Comentários publicados: {{displayFreshCount}}. Comentários mantidos na fila por se referirem a um commit mais antigo: {{displayStaleCount}}.",
- "submitCountOfTotal": "Enviar {{displayFreshCount}} de {{displayTotalCount}} comentários",
- "submitReview": "Enviar revisão",
- "pendingComment_many": "comentários pendentes",
- "blockedRequestChanges": "Adicione um resumo ou pelo menos um comentário para solicitar alterações.",
- "blockedComment": "Adicione um resumo ou pelo menos um comentário para enviar uma revisão com comentários."
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Compartilhar merge request",
+ "viewOnProvider": "Ver no {{provider}}",
+ "mergeRequestUnavailable": "Merge request indisponível",
+ "unavailableDescription": "Ele pode ter sido excluído, ou você não tem acesso a ele.",
+ "accessDeniedMergeRequest": "Você não tem permissão para ver este merge request.",
+ "couldNotLoadMergeRequest": "Não foi possível carregar o merge request.",
+ "discussionAccessDenied": "Você não tem permissão para ver a discussão deste merge request.",
+ "discussionUnavailableMessage": "Este merge request pode ter sido removido.",
+ "noDiscussionDescription": "Este merge request ainda não tem conversas de revisão nem comentários gerais.",
+ "noFilesChangedDescription": "Este merge request não contém alterações em arquivos."
},
"fileStatus": {
"changed": "Alterado",
@@ -2727,11 +2793,6 @@
"modified": "Modificado",
"renamed": "Renomeado"
},
- "tabs": {
- "discussion": "Discussão",
- "files": "Arquivos",
- "overview": "Visão geral"
- },
"diff": {
"selectedTapToChange": "Seleção atual: {{label}}. Toque para alterar a seleção",
"tapToComment": "{{label}}, toque para comentar",
@@ -2742,7 +2803,7 @@
"emptyLine": "(vazio)"
},
"linkPasteClipboardEmpty": "A área de transferência está vazia.",
- "linkPasteNotAPullRequest": "Este link não é de um pull request do GitHub.",
+ "linkPasteNotAPullRequest": "Este link não é de um pull request ou merge request",
"announce": {
"commentPosted": "Comentário publicado",
"reviewSubmitted": "Revisão enviada",
@@ -2751,6 +2812,7 @@
"mutationError": {
"commentNotPosted": "Não é possível publicar este comentário. A linha selecionada pode ter mudado ou o PR pode ter sido atualizado.",
"reviewNotSubmitted": "Não é possível enviar esta revisão no estado atual. O PR pode ter mudado ou você pode estar tentando revisar seu próprio pull request.",
+ "reviewNotSubmittedTerm": "Não é possível enviar esta revisão no estado atual. O {{term}} pode ter mudado ou você não pode revisar o seu próprio {{term}}.",
"couldNotPostComment": "Não foi possível publicar o comentário.",
"couldNotSubmitReview": "Não foi possível enviar a revisão. Verifique sua conexão e tente novamente."
},
@@ -2758,6 +2820,7 @@
"couldNotReply": "Não foi possível responder.",
"couldNotCompleteAction": "Não foi possível concluir esta ação.",
"mergeResultDefaultError": "O GitHub não concluiu a mesclagem.",
+ "mergeResultNotCompleted": "O {{term}} não foi mesclado. Verifique o estado e tente novamente.",
"ambiguous": "Não foi possível confirmar — verifique o PR antes de tentar novamente.",
"persistenceFailed": "Não foi possível registrar esta ação. Tente novamente mais tarde.",
"forbidden": "Você não tem permissão para realizar esta ação."
diff --git a/apps/mobile/src/i18n/locales/pt.json b/apps/mobile/src/i18n/locales/pt.json
index 59ab25801c..cd131aecd2 100644
--- a/apps/mobile/src/i18n/locales/pt.json
+++ b/apps/mobile/src/i18n/locales/pt.json
@@ -36,6 +36,7 @@
"cost": "Custo",
"discard": "Descartar",
"findings": "Ocorrências",
+ "mergeRequest": "merge request",
"notConnected": "Sem ligação",
"notifications": "Notificações",
"pullRequest": "pR",
@@ -342,10 +343,17 @@
"emptyDiffRow": "Linha de diferenças vazia"
},
"connectionExpired": "A ligação ao GitHub expirou.",
+ "capabilities": {
+ "banner": {
+ "title": "Não disponível neste fornecedor",
+ "accessibility": "Não disponível neste fornecedor: {{reason}}"
+ }
+ },
"merge": {
"merge": "Fusão",
"mergeNow": "Integrar agora",
"mergePullRequest": "Integrar PR",
+ "mergeTermTitle": "Integrar {{term}}",
"enableAutoMerge": "Ativar integração automática",
"disableAutoMerge": "Desativar integração automática",
"autoMergeOn": "Integração automática ativa",
@@ -364,9 +372,12 @@
"deleteBranchAfterMerge": "Eliminar o ramo após a integração",
"noEnabledMethods": "Este repositório não tem métodos de integração ativos. Pede a um administrador do repositório para ativar a integração com um commit, a combinação de commits ou a reaplicação de commits.",
"confirmTitle": "Integrar PR?",
+ "confirmTitleTerm": "Integrar {{term}}?",
"confirmMessage": "As tuas alterações serão integradas no ramo base.",
"enableAutoMergeConfirmTitle": "Ativar integração automática?",
"enableAutoMergeConfirmMessage": "O GitHub vai integrar este PR automaticamente quando todas as verificações obrigatórias forem concluídas com êxito.",
+ "enableAutoMergeConfirmMessageTerm": "O {{term}} será integrado automaticamente quando o pipeline for bem-sucedido.",
+ "enableAutoMergeDescriptionTerm": "O GitLab integra este {{term}} automaticamente quando o pipeline for bem-sucedido.",
"forbidden": "Não tens permissão para integrar este PR.",
"cannotMerge": "Não é possível integrar este PR no estado atual.",
"couldNotMerge": "Não foi possível integrar o PR.",
@@ -377,7 +388,8 @@
},
"terminal": {
"alreadyMerged": "Já integrado",
- "closed": "Este PR está fechado"
+ "closed": "Este PR está fechado",
+ "closedMergeRequest": "Este merge request está fechado"
},
"partialSuccessBanner": {
"body": "Não foi possível eliminar o ramo: {{reason}}.",
@@ -403,6 +415,19 @@
"notMergeableTitle": "Ainda não é possível integrar este PR",
"notMergeableDetail": "O GitHub indicou o estado de integração {{state}}."
},
+ "restrictions": {
+ "title": "Restrições à integração",
+ "approvalsRequired_one": "É necessária {{displayCount}} aprovação",
+ "approvalsRequired_other": "São necessárias {{displayCount}} aprovações",
+ "pipelineMustSucceed": "O pipeline tem de ser bem-sucedido antes da integração.",
+ "approvalsRequired_many": "São necessárias {{displayCount}} aprovações"
+ },
+ "providerBlocked": {
+ "failingPipeline": "O pipeline está a falhar no último commit.",
+ "pendingPipeline": "O pipeline ainda está a ser executado no último commit.",
+ "permission": "Não tens permissão para integrar este {{term}}.",
+ "draft": "Marca o {{term}} como pronto para revisão antes de o integrar."
+ },
"methodLabels": {
"merge": "Criar um commit de integração",
"squash": "Combinar commits e integrar",
@@ -450,6 +475,7 @@
"acceptTerms": "Aceitar",
"replyBadRequest": "Esta resposta não pode ser publicada. A conversa pode ter mudado.",
"replyForbidden": "Não tens permissão para responder a este PR.",
+ "replyForbiddenTerm": "Não tens permissão para responder a este {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Este comentário não pode ser denunciado.",
@@ -481,8 +507,6 @@
"termsAcceptRequired": "Tens de aceitar os termos de serviço para publicar.",
"termsOutdatedCopy": "Os termos de serviço foram alterados. Volta a abrir este ecrã para aceitar a versão mais recente.",
"termsCheckRetryCopy": "Não foi possível verificar os termos de serviço. Verifica a tua ligação e tenta novamente.",
- "comment_many": "{{displayCount}} comentários",
- "reaction_many": "reações",
"reactions": {
"thumbsUp": "Polegar para cima",
"thumbsDown": "Polegar para baixo",
@@ -500,7 +524,9 @@
"outdatedOnLines": "Desatualizado em {{lines}}",
"outdatedOnPath": "Desatualizado em {{path}}"
},
- "deletedUser": "utilizador eliminado"
+ "deletedUser": "utilizador eliminado",
+ "comment_many": "{{displayCount}} comentários",
+ "reaction_many": "reações"
},
"couldNotOpenGitHubAppSettings": "Não foi possível abrir as definições da aplicação GitHub.",
"installKiloGitHubApp": "Instalar a aplicação do Kilo para o GitHub",
@@ -512,17 +538,19 @@
"reviewPullRequest": "Rever PR",
"headLine": "{{counts}} · commit mais recente: {{sha}}",
"entry": {
- "eyebrow": "Abre um PR através do URL.",
- "pastePrLink": "Colar uma ligação de PR",
- "noRecentPrs": "Sem PRs recentes",
- "noRecentPrsDescription": "Cola uma ligação de PR acima para iniciar uma revisão. O PR aparecerá aqui na próxima vez.",
+ "eyebrow": "Abre um PR ou um merge request através do URL",
+ "pastePrLink": "Colar uma ligação de PR ou de merge request",
+ "noRecentPrs": "Sem revisões recentes",
+ "noRecentPrsDescription": "Cola uma ligação acima para iniciar uma revisão — aparecerá aqui na próxima vez.",
"couldNotLoad": "Não foi possível carregar os dados.",
"removeFromRecentsTitle": "Remover dos recentes?",
- "removeFromRecentsMessage": "Este PR será removido da tua lista de recentes.",
+ "removeFromRecentsMessage": "Esta revisão será removida da tua lista de recentes.",
"removeRecentAccessibility": "Remover {{repo}} dos recentes",
- "urlAccessibility": "URL do PR no GitHub",
- "clearLink": "Limpar a ligação do PR",
- "pasteLink": "Colar a ligação do PR",
+ "urlAccessibility": "Introduz um URL de PR ou de merge request",
+ "urlPlaceholder": "URL de PR ou de merge request",
+ "openAccessibility": "Abrir PR ou merge request",
+ "clearLink": "Limpar a ligação",
+ "pasteLink": "Colar a ligação de PR ou de merge request",
"open": "Abrir"
},
"checks": {
@@ -571,9 +599,15 @@
"connect": {
"checkFailedTitle": "Não foi possível verificar a ligação ao GitHub.",
"checkFailedMessage": "O estado da sessão só fica disponível quando o carregamento terminar.",
+ "checkFailedTitleGitLab": "Não foi possível verificar a ligação ao GitLab.",
+ "checkFailedTitleBitbucket": "Não foi possível verificar a ligação ao Bitbucket.",
+ "providerCheckFailedMessage": "O estado da ligação só fica disponível quando o carregamento terminar.",
"reconnectTitle": "Voltar a ligar o GitHub",
"reconnectDescription": "A tua ligação ao GitHub foi revogada. Volta a ligar a conta para continuar a rever PRs no telemóvel.",
- "description": "Liga a tua conta do GitHub para rever PRs no telemóvel."
+ "description": "Liga a tua conta do GitHub para rever PRs no telemóvel.",
+ "gitlabDescription": "Liga a tua conta do GitLab para rever merge requests no telemóvel.",
+ "bitbucketDescription": "Liga o Bitbucket a esta organização para rever PRs no telemóvel.",
+ "bitbucketOrgOnlyDescription": "Seleciona uma organização no teu perfil para rever os PRs dessa organização no Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -596,7 +630,10 @@
},
"reconnectNotice": {
"title": "A ligação ao GitHub expirou.",
- "message": "A tua ligação ao GitHub já não é válida. Verifica-a novamente. Se for necessário, ser-te-á pedido que voltes a ligar a conta."
+ "message": "A tua ligação ao GitHub já não é válida. Verifica-a novamente. Se for necessário, ser-te-á pedido que voltes a ligar a conta.",
+ "gitlabTitle": "A ligação ao GitLab expirou.",
+ "bitbucketTitle": "A ligação ao Bitbucket expirou.",
+ "providerMessage": "A tua ligação ao {{provider}} já não é válida. Verifica-a novamente. Se for necessário, ser-te-á pedido que voltes a ligar a conta."
},
"eventChips": {
"comment": "Comentar",
@@ -650,6 +687,21 @@
"files": "Ficheiros",
"discussion": "Discussão"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Partilhar merge request",
+ "viewOnProvider": "Ver em {{provider}}",
+ "mergeRequestUnavailable": "Merge request indisponível",
+ "unavailableDescription": "Pode ter sido eliminado, ou não tens acesso a ele.",
+ "accessDeniedMergeRequest": "Não tens permissão para ver este merge request.",
+ "couldNotLoadMergeRequest": "Não foi possível carregar o merge request.",
+ "discussionAccessDenied": "Não tens permissão para ver a discussão deste merge request.",
+ "discussionUnavailableMessage": "Este merge request pode ter sido removido.",
+ "noDiscussionDescription": "Este merge request ainda não tem conversas de revisão nem comentários na discussão.",
+ "noFilesChangedDescription": "Este merge request não tem alterações nos ficheiros."
+ },
"fileStatus": {
"modified": "Modificado",
"renamed": "Renomeado",
@@ -666,7 +718,7 @@
"emptyLine": "(vazio)"
},
"linkPasteClipboardEmpty": "A área de transferência está vazia.",
- "linkPasteNotAPullRequest": "Esta ligação não corresponde a um PR do GitHub.",
+ "linkPasteNotAPullRequest": "Esta ligação não corresponde a um PR ou merge request",
"announce": {
"commentPosted": "Comentário publicado",
"reviewSubmitted": "Revisão enviada",
@@ -675,6 +727,7 @@
"mutationError": {
"commentNotPosted": "Não é possível publicar este comentário. A linha selecionada pode ter mudado ou o PR pode ter sido atualizado.",
"reviewNotSubmitted": "Não é possível enviar esta revisão no estado atual. O PR pode ter mudado ou podes estar a tentar rever o teu próprio PR.",
+ "reviewNotSubmittedTerm": "Não é possível enviar esta revisão no estado atual. O {{term}} pode ter mudado ou não podes rever o teu próprio {{term}}.",
"couldNotPostComment": "Não foi possível publicar o comentário.",
"couldNotSubmitReview": "Não foi possível enviar a revisão. Verifica a tua ligação e tenta novamente."
},
@@ -682,6 +735,7 @@
"couldNotReply": "Não foi possível responder.",
"couldNotCompleteAction": "Não foi possível concluir esta ação.",
"mergeResultDefaultError": "O GitHub não concluiu a integração.",
+ "mergeResultNotCompleted": "O {{term}} não foi integrado. Verifica o estado e tenta novamente.",
"ambiguous": "Não foi possível confirmar o resultado. Verifica o PR antes de tentar novamente.",
"persistenceFailed": "Não foi possível registar esta ação. Tenta novamente mais tarde.",
"forbidden": "Não tens permissão para executar esta ação."
@@ -2004,11 +2058,31 @@
"retryConnection": "Tentar ligar novamente"
},
"newSession": {
+ "recentlyUsed": "Usados recentemente",
+ "couldNotLoadGithubRepositories": "Não foi possível carregar os repositórios do GitHub.",
+ "couldNotLoadGitlabRepositories": "Não foi possível carregar os repositórios do GitLab.",
+ "couldNotLoadBitbucketRepositories": "Não foi possível carregar os repositórios do Bitbucket.",
"connectGithubDescription": "Ligue a sua conta do GitHub no navegador e volte aqui para escolher um repositório.",
+ "connectGitlabDescription": "Ligue a sua conta do GitLab no navegador e volte aqui para escolher um repositório.",
+ "connectBitbucketDescription": "Ligue a sua conta do Bitbucket no navegador e volte aqui para escolher um repositório.",
"openGithub": "Abrir o GitHub",
+ "openGitlab": "Abrir o GitLab",
+ "openBitbucket": "Abrir o Bitbucket",
"refreshRepositories": "Atualizar repositórios",
"githubConnected": "GitHub ligado",
+ "gitlabConnected": "GitLab ligado",
"noRepositoriesVisible": "Não há repositórios visíveis. Verifique as permissões de acesso da aplicação Kilo para GitHub e atualize a lista.",
+ "noRepositoriesVisibleGitlab": "Não há repositórios visíveis. Verifique as permissões de acesso aos repositórios do GitLab e atualize a lista.",
+ "noRepositoriesVisibleBitbucket": "Não há repositórios visíveis. Verifique as permissões de acesso aos repositórios do Bitbucket e atualize a lista.",
+ "bitbucketOrganizationsOnly": "O Bitbucket está disponível apenas para organizações.",
+ "branchPickerTitle": "Selecionar ramo",
+ "branchDefault": "Predefinido",
+ "branchAccessibility": "Ramo: {{label}}",
+ "branchLoading": "A carregar ramos",
+ "branchLoadError": "Não foi possível carregar os ramos",
+ "branchUnavailable": "Não há ramos disponíveis para este repositório. Verifica o teu acesso junto do fornecedor e escolhe outro repositório.",
+ "branchEmpty": "Nenhum ramo disponível",
+ "branchPlaceholder": "Selecionar um ramo",
"runOnWithTarget": "Executar em: {{target}}",
"environment": "Ambiente",
"couldNotLoadEnvironment": "Não foi possível carregar o seu ambiente.",
@@ -2029,24 +2103,13 @@
"couldNotRefreshRepositories": "Não foi possível atualizar os repositórios. Tente novamente.",
"discardDraftTitle": "Eliminar rascunho?",
"discardDraftMessage": "O seu pedido será eliminado.",
+ "discardWithUploadsMessage": "O seu pedido e os ficheiros carregados que não estejam associados a mensagens enviadas serão eliminados.",
"discardFailed": "Não foi possível eliminar o rascunho. Tente novamente.",
"remoteHint": "Execute `kilo remote` no seu computador ou `/remote` numa sessão CLI em execução para controlar um processo local do kilo.",
- "connectBitbucketDescription": "Ligue a sua conta do Bitbucket no navegador e volte aqui para escolher um repositório.",
- "connectGitlabDescription": "Ligue a sua conta do GitLab no navegador e volte aqui para escolher um repositório.",
- "couldNotLoadBitbucketRepositories": "Não foi possível carregar os repositórios do Bitbucket.",
- "couldNotLoadGithubRepositories": "Não foi possível carregar os repositórios do GitHub.",
- "couldNotLoadGitlabRepositories": "Não foi possível carregar os repositórios do GitLab.",
- "gitlabConnected": "GitLab ligado",
- "noRepositoriesVisibleBitbucket": "Não há repositórios visíveis. Verifique as permissões de acesso aos repositórios do Bitbucket e atualize a lista.",
- "noRepositoriesVisibleGitlab": "Não há repositórios visíveis. Verifique as permissões de acesso aos repositórios do GitLab e atualize a lista.",
- "openBitbucket": "Abrir o Bitbucket",
- "openGitlab": "Abrir o GitLab",
- "recentlyUsed": "Usados recentemente",
"continueFrom": "A sessão {{title}} está a ser retomada.",
"importingSession": "A importar a sessão",
"cliCannotContinue": "Esta CLI não permite continuar uma sessão. Escolha o Cloud Agent ou outra CLI.",
- "importFailed": "Não foi possível importar esta sessão.",
- "discardWithUploadsMessage": "O seu pedido e os ficheiros carregados que não estejam associados a mensagens enviadas serão eliminados."
+ "importFailed": "Não foi possível importar esta sessão."
},
"partRenderer": {
"updatedFileCount_one": "Foi atualizado {{displayCount}} ficheiro.",
diff --git a/apps/mobile/src/i18n/locales/ro.json b/apps/mobile/src/i18n/locales/ro.json
index 9a38ff7015..2928d30de6 100644
--- a/apps/mobile/src/i18n/locales/ro.json
+++ b/apps/mobile/src/i18n/locales/ro.json
@@ -36,6 +36,7 @@
"cost": "Costuri",
"discard": "Renunță",
"findings": "Probleme detectate",
+ "mergeRequest": "merge request",
"notConnected": "Neconectat",
"notifications": "Notificări",
"pullRequest": "pR",
@@ -342,10 +343,17 @@
"emptyDiffRow": "Rând gol în comparație"
},
"connectionExpired": "Conexiunea la GitHub a expirat.",
+ "capabilities": {
+ "banner": {
+ "title": "Nu este disponibil pentru acest furnizor",
+ "accessibility": "Nu este disponibil pentru acest furnizor: {{reason}}"
+ }
+ },
"merge": {
"merge": "Îmbinare",
"mergeNow": "Îmbină acum",
"mergePullRequest": "Îmbinarea PR-ului",
+ "mergeTermTitle": "Îmbinarea {{term}}-ului",
"enableAutoMerge": "Activează îmbinarea automată",
"disableAutoMerge": "Dezactivează îmbinarea automată",
"autoMergeOn": "Îmbinare automată activată",
@@ -364,9 +372,12 @@
"deleteBranchAfterMerge": "Șterge ramura după îmbinare",
"noEnabledMethods": "Acest depozit nu are nicio metodă de îmbinare activată. Cere unui administrator al depozitului să activeze îmbinarea printr-un commit nou, prin comasarea commiturilor sau prin rebazare.",
"confirmTitle": "Îmbini PR-ul?",
+ "confirmTitleTerm": "Îmbini {{term}}-ul?",
"confirmMessage": "Modificările tale vor fi îmbinate în ramura de bază.",
"enableAutoMergeConfirmTitle": "Activezi îmbinarea automată?",
"enableAutoMergeConfirmMessage": "GitHub va îmbina automat acest PR după ce toate verificările obligatorii se încheie cu succes.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} va fi îmbinat automat după ce pipeline-ul său are succes.",
+ "enableAutoMergeDescriptionTerm": "GitLab îmbină automat acest {{term}} după ce pipeline-ul său are succes.",
"forbidden": "Nu ai permisiunea să îmbini acest PR.",
"cannotMerge": "Acest PR nu poate fi îmbinat în forma actuală.",
"couldNotMerge": "Nu s-a putut îmbina PR-ul.",
@@ -377,7 +388,8 @@
},
"terminal": {
"alreadyMerged": "Deja îmbinat",
- "closed": "PR închis"
+ "closed": "PR închis",
+ "closedMergeRequest": "Merge request închis"
},
"partialSuccessBanner": {
"body": "Nu s-a putut șterge ramura: {{reason}}.",
@@ -403,6 +415,19 @@
"notMergeableTitle": "Acest PR nu poate fi îmbinat încă",
"notMergeableDetail": "GitHub a raportat următoarea stare pentru îmbinare: {{state}}."
},
+ "restrictions": {
+ "title": "Restricții de îmbinare",
+ "approvalsRequired_one": "{{displayCount}} aprobare necesară",
+ "approvalsRequired_other": "{{displayCount}} aprobări necesare",
+ "pipelineMustSucceed": "Pipeline-ul trebuie să aibă succes înainte de îmbinare.",
+ "approvalsRequired_few": "{{displayCount}} aprobări necesare"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline-ul eșuează la cel mai recent commit.",
+ "pendingPipeline": "Pipeline-ul încă rulează la cel mai recent commit.",
+ "permission": "Nu ai permisiunea să îmbini acest {{term}}.",
+ "draft": "Marchează {{term}}-ul ca pregătit pentru revizuire înainte de îmbinare."
+ },
"methodLabels": {
"merge": "Creează un commit de îmbinare",
"squash": "Comasează și îmbină",
@@ -450,6 +475,7 @@
"acceptTerms": "Acceptă",
"replyBadRequest": "Acest răspuns nu poate fi publicat. Este posibil ca firul de discuție să se fi modificat.",
"replyForbidden": "Nu ai permisiunea să răspunzi la acest PR.",
+ "replyForbiddenTerm": "Nu ai permisiunea să răspunzi la acest {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Acest comentariu nu poate fi raportat.",
@@ -481,8 +507,6 @@
"termsAcceptRequired": "Trebuie să accepți termenii de utilizare pentru a publica mesaje.",
"termsOutdatedCopy": "Termenii de utilizare s-au modificat. Redeschide acest ecran pentru a accepta cea mai recentă versiune.",
"termsCheckRetryCopy": "Nu s-au putut verifica termenii de utilizare. Verifică conexiunea și încearcă din nou.",
- "comment_few": "{{displayCount}} comentarii",
- "reaction_few": "reacții",
"reactions": {
"thumbsUp": "Degetul mare în sus",
"thumbsDown": "Degetul mare în jos",
@@ -500,7 +524,9 @@
"outdatedOnLines": "Depășit: {{lines}}",
"outdatedOnPath": "Depășit: {{path}}"
},
- "deletedUser": "utilizator șters"
+ "deletedUser": "utilizator șters",
+ "comment_few": "{{displayCount}} comentarii",
+ "reaction_few": "reacții"
},
"couldNotOpenGitHubAppSettings": "Nu s-au putut deschide setările aplicației GitHub.",
"installKiloGitHubApp": "Instalează aplicația Kilo pentru GitHub",
@@ -512,17 +538,19 @@
"reviewPullRequest": "Revizuiește PR-ul",
"headLine": "{{counts}} · ultimul commit {{sha}}",
"entry": {
- "eyebrow": "Deschide un PR folosind adresa URL.",
- "pastePrLink": "Lipește o legătură către un PR",
- "noRecentPrs": "Fără PR-uri recente",
- "noRecentPrsDescription": "Lipește mai sus o legătură către un PR pentru a începe revizuirea. PR-ul va apărea aici data viitoare.",
+ "eyebrow": "Deschide un PR sau un merge request folosind adresa URL",
+ "pastePrLink": "Lipește o legătură către un PR sau un merge request",
+ "noRecentPrs": "Nicio revizuire recentă",
+ "noRecentPrsDescription": "Lipește o legătură mai sus pentru a începe o revizuire — va apărea aici data viitoare.",
"couldNotLoad": "Nu s-au putut încărca datele.",
"removeFromRecentsTitle": "Elimini din lista de PR-uri recente?",
- "removeFromRecentsMessage": "Acest PR va fi eliminat din lista ta de PR-uri recente.",
+ "removeFromRecentsMessage": "Această revizuire va fi eliminată din recente.",
"removeRecentAccessibility": "Elimină {{repo}} din lista de PR-uri recente",
- "urlAccessibility": "Adresa URL a PR-ului de pe GitHub",
- "clearLink": "Șterge legătura către PR",
- "pasteLink": "Lipește legătura către PR",
+ "urlAccessibility": "Introdu URL-ul unui PR sau al unui merge request",
+ "urlPlaceholder": "URL pentru PR sau merge request",
+ "openAccessibility": "Deschide un PR sau un merge request",
+ "clearLink": "Șterge legătura",
+ "pasteLink": "Lipește legătura către PR sau merge request",
"open": "Deschidere"
},
"checks": {
@@ -571,9 +599,15 @@
"connect": {
"checkFailedTitle": "Nu s-a putut verifica conexiunea la GitHub.",
"checkFailedMessage": "Starea autentificării nu este disponibilă până la încărcarea acestor date.",
+ "checkFailedTitleGitLab": "Nu s-a putut verifica conexiunea la GitLab.",
+ "checkFailedTitleBitbucket": "Nu s-a putut verifica conexiunea la Bitbucket.",
+ "providerCheckFailedMessage": "Starea conexiunii nu este disponibilă până când se încarcă.",
"reconnectTitle": "Reconectare la GitHub",
"reconnectDescription": "Accesul la contul tău GitHub a fost revocat. Reconectează-te pentru a continua să revizuiești PR-uri pe mobil.",
- "description": "Conectează-ți contul GitHub pentru a revizui PR-uri pe mobil."
+ "description": "Conectează-ți contul GitHub pentru a revizui PR-uri pe mobil.",
+ "gitlabDescription": "Conectează-ți contul GitLab pentru a revizui merge requesturi de pe mobil.",
+ "bitbucketDescription": "Conectează Bitbucket la această organizație pentru a revizui PR-uri de pe mobil.",
+ "bitbucketOrgOnlyDescription": "Selectează o organizație în profilul tău pentru a-i revizui PR-urile Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -596,7 +630,10 @@
},
"reconnectNotice": {
"title": "Conexiunea la GitHub a expirat.",
- "message": "Conexiunea ta la GitHub nu mai este validă. Verifică din nou conexiunea — ți se va cere să te reconectezi dacă este necesar."
+ "message": "Conexiunea ta la GitHub nu mai este validă. Verifică din nou conexiunea — ți se va cere să te reconectezi dacă este necesar.",
+ "gitlabTitle": "Conexiunea la GitLab a expirat.",
+ "bitbucketTitle": "Conexiunea la Bitbucket a expirat.",
+ "providerMessage": "Conexiunea ta la {{provider}} nu mai este validă. Verifică din nou conexiunea — ți se va cere să te reconectezi dacă este necesar."
},
"eventChips": {
"comment": "Comentariu",
@@ -650,6 +687,21 @@
"files": "Fișiere",
"discussion": "Discuție"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Distribuie merge request-ul",
+ "viewOnProvider": "Vezi pe {{provider}}",
+ "mergeRequestUnavailable": "Merge request indisponibil",
+ "unavailableDescription": "S-ar putea să fi fost șters sau să nu ai acces la el.",
+ "accessDeniedMergeRequest": "Nu ai permisiunea să vezi acest merge request.",
+ "couldNotLoadMergeRequest": "Nu s-a putut încărca merge request-ul.",
+ "discussionAccessDenied": "Nu ai permisiunea să vezi discuția acestui merge request.",
+ "discussionUnavailableMessage": "Este posibil ca acest merge request să fi fost eliminat.",
+ "noDiscussionDescription": "Acest merge request nu are încă fire de discuție pentru revizuire sau comentarii generale.",
+ "noFilesChangedDescription": "Acest merge request nu conține modificări ale fișierelor."
+ },
"fileStatus": {
"modified": "Modificat",
"renamed": "Redenumit",
@@ -666,7 +718,7 @@
"emptyLine": "(gol)"
},
"linkPasteClipboardEmpty": "Clipboardul este gol.",
- "linkPasteNotAPullRequest": "Aceasta nu este o legătură către un PR de pe GitHub.",
+ "linkPasteNotAPullRequest": "Aceasta nu este o legătură către un PR sau un merge request",
"announce": {
"commentPosted": "Comentariu publicat",
"reviewSubmitted": "Revizuire trimisă",
@@ -675,6 +727,7 @@
"mutationError": {
"commentNotPosted": "Acest comentariu nu poate fi publicat. Este posibil ca linia selectată să se fi modificat sau PR-ul să fi fost actualizat.",
"reviewNotSubmitted": "Această revizuire nu poate fi trimisă în forma actuală. Este posibil ca PR-ul să se fi modificat sau să fie propriul tău PR, pe care nu îl poți revizui.",
+ "reviewNotSubmittedTerm": "Această revizuire nu poate fi trimisă în starea curentă. E posibil ca {{term}} să se fi modificat sau nu îți poți revizui propriul {{term}}.",
"couldNotPostComment": "Nu s-a putut publica comentariul.",
"couldNotSubmitReview": "Nu s-a putut trimite revizuirea. Verifică conexiunea și încearcă din nou."
},
@@ -682,6 +735,7 @@
"couldNotReply": "Nu s-a putut trimite răspunsul.",
"couldNotCompleteAction": "Nu s-a putut finaliza această acțiune.",
"mergeResultDefaultError": "GitHub nu a finalizat îmbinarea.",
+ "mergeResultNotCompleted": "{{term}} nu a fost îmbinat. Verifică starea lui și încearcă din nou.",
"ambiguous": "Nu s-a putut confirma rezultatul — verifică PR-ul înainte de a încerca din nou.",
"persistenceFailed": "Nu am putut înregistra această acțiune. Încearcă din nou mai târziu.",
"forbidden": "Accesul este interzis."
@@ -2004,11 +2058,31 @@
"retryConnection": "Încearcă din nou conectarea"
},
"newSession": {
+ "recentlyUsed": "Folosite recent",
+ "couldNotLoadGithubRepositories": "Nu s-au putut încărca depozitele GitHub.",
+ "couldNotLoadGitlabRepositories": "Nu s-au putut încărca depozitele GitLab.",
+ "couldNotLoadBitbucketRepositories": "Nu s-au putut încărca depozitele Bitbucket.",
"connectGithubDescription": "Conectează contul GitHub în browser, apoi revino aici pentru a alege un depozit.",
+ "connectGitlabDescription": "Conectează contul GitLab în browser, apoi revino aici pentru a alege un depozit.",
+ "connectBitbucketDescription": "Conectează contul Bitbucket în browser, apoi revino aici pentru a alege un depozit.",
"openGithub": "Deschide GitHub",
+ "openGitlab": "Deschide GitLab",
+ "openBitbucket": "Deschide Bitbucket",
"refreshRepositories": "Reîmprospătează depozitele",
"githubConnected": "GitHub conectat",
+ "gitlabConnected": "GitLab conectat",
"noRepositoriesVisible": "Nu este vizibil niciun depozit. Verifică accesul aplicației Kilo pentru GitHub la depozite, apoi reîmprospătează lista.",
+ "noRepositoriesVisibleGitlab": "Nu este vizibil niciun depozit. Verifică accesul la depozitele GitLab, apoi reîmprospătează lista.",
+ "noRepositoriesVisibleBitbucket": "Nu este vizibil niciun depozit. Verifică accesul la depozitele Bitbucket, apoi reîmprospătează lista.",
+ "bitbucketOrganizationsOnly": "Bitbucket este disponibil doar pentru organizații.",
+ "branchPickerTitle": "Selectează ramura",
+ "branchDefault": "Implicit",
+ "branchAccessibility": "Ramură: {{label}}",
+ "branchLoading": "Se încarcă ramurile",
+ "branchLoadError": "Nu s-au putut încărca ramurile",
+ "branchUnavailable": "Nu există ramuri disponibile pentru acest depozit. Verifică-ți accesul la furnizor, apoi alege alt depozit.",
+ "branchEmpty": "Nicio ramură disponibilă",
+ "branchPlaceholder": "Selectează o ramură",
"runOnWithTarget": "Rulează pe: {{target}}",
"environment": "Mediu",
"couldNotLoadEnvironment": "Nu s-a putut încărca mediul tău.",
@@ -2029,24 +2103,13 @@
"couldNotRefreshRepositories": "Nu s-au putut reîmprospăta depozitele. Încearcă din nou.",
"discardDraftTitle": "Renunți la ciornă?",
"discardDraftMessage": "Instrucțiunile tale se vor pierde.",
+ "discardWithUploadsMessage": "Instrucțiunile tale și fișierele încărcate care nu sunt atașate la mesaje trimise vor fi șterse.",
"discardFailed": "Nu s-a putut șterge ciorna. Încearcă din nou.",
"remoteHint": "Rulează `kilo remote` pe computerul tău sau `/remote` într-o sesiune CLI activă pentru a controla un proces kilo local.",
- "connectBitbucketDescription": "Conectează contul Bitbucket în browser, apoi revino aici pentru a alege un depozit.",
- "connectGitlabDescription": "Conectează contul GitLab în browser, apoi revino aici pentru a alege un depozit.",
- "couldNotLoadBitbucketRepositories": "Nu s-au putut încărca depozitele Bitbucket.",
- "couldNotLoadGithubRepositories": "Nu s-au putut încărca depozitele GitHub.",
- "couldNotLoadGitlabRepositories": "Nu s-au putut încărca depozitele GitLab.",
- "gitlabConnected": "GitLab conectat",
- "noRepositoriesVisibleBitbucket": "Nu este vizibil niciun depozit. Verifică accesul la depozitele Bitbucket, apoi reîmprospătează lista.",
- "noRepositoriesVisibleGitlab": "Nu este vizibil niciun depozit. Verifică accesul la depozitele GitLab, apoi reîmprospătează lista.",
- "openBitbucket": "Deschide Bitbucket",
- "openGitlab": "Deschide GitLab",
- "recentlyUsed": "Folosite recent",
"continueFrom": "Se continuă sesiunea {{title}}.",
"importingSession": "Se importă sesiunea",
"cliCannotContinue": "Acest CLI nu poate continua o sesiune. Alege Cloud Agent sau alt CLI.",
- "importFailed": "Nu s-a putut importa această sesiune.",
- "discardWithUploadsMessage": "Instrucțiunile tale și fișierele încărcate care nu sunt atașate la mesaje trimise vor fi șterse."
+ "importFailed": "Nu s-a putut importa această sesiune."
},
"partRenderer": {
"updatedFileCount_one": "S-a actualizat {{displayCount}} fișier.",
diff --git a/apps/mobile/src/i18n/locales/ru.json b/apps/mobile/src/i18n/locales/ru.json
index af380fdfed..250dfddf1a 100644
--- a/apps/mobile/src/i18n/locales/ru.json
+++ b/apps/mobile/src/i18n/locales/ru.json
@@ -4,6 +4,8 @@
"done": "Готово",
"retry": "Повторить",
"tryAgain": "Попробовать снова",
+ "continue": "Продолжить",
+ "notNow": "Не сейчас",
"language": "Язык",
"device": "Устройство",
"share": "Поделиться: {{title}}",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "Не удалось скопировать в буфер обмена.",
"required": "обязательно",
"error": "ошибка: {{error}}",
- "notNow": "Не сейчас",
- "continue": "Продолжить",
"back": "Назад",
"somethingWentWrong": "Что-то пошло не так.",
"couldNotOpen": "Не удалось открыть {{label}}.",
@@ -36,6 +36,7 @@
"cost": "Стоимость",
"discard": "Отменить",
"findings": "Замечания",
+ "mergeRequest": "запрос на слияние",
"notConnected": "Не подключено",
"notifications": "Уведомления",
"pullRequest": "пул-реквест",
@@ -1575,11 +1576,31 @@
"retryConnection": "Повторить подключение"
},
"newSession": {
+ "recentlyUsed": "Недавно использованные",
+ "couldNotLoadGithubRepositories": "Не удалось загрузить репозитории GitHub.",
+ "couldNotLoadGitlabRepositories": "Не удалось загрузить репозитории GitLab.",
+ "couldNotLoadBitbucketRepositories": "Не удалось загрузить репозитории Bitbucket.",
"connectGithubDescription": "Подключите GitHub в браузере, затем вернитесь сюда, чтобы выбрать репозиторий.",
+ "connectGitlabDescription": "Подключите GitLab в браузере, затем вернитесь сюда, чтобы выбрать репозиторий.",
+ "connectBitbucketDescription": "Подключите Bitbucket в браузере, затем вернитесь сюда, чтобы выбрать репозиторий.",
"openGithub": "Открыть GitHub",
+ "openGitlab": "Открыть GitLab",
+ "openBitbucket": "Открыть Bitbucket",
"refreshRepositories": "Обновить список репозиториев",
"githubConnected": "GitHub подключён",
+ "gitlabConnected": "GitLab подключён",
"noRepositoriesVisible": "Репозитории не отображаются. Проверьте доступ приложения Kilo к репозиториям GitHub и обновите список.",
+ "noRepositoriesVisibleGitlab": "Репозитории не отображаются. Проверьте доступ к репозиториям GitLab и обновите список.",
+ "noRepositoriesVisibleBitbucket": "Репозитории не отображаются. Проверьте доступ к репозиториям Bitbucket и обновите список.",
+ "bitbucketOrganizationsOnly": "Bitbucket доступен только для организаций.",
+ "branchPickerTitle": "Выбрать ветку",
+ "branchDefault": "По умолчанию",
+ "branchAccessibility": "Ветка: {{label}}",
+ "branchLoading": "Загрузка веток",
+ "branchLoadError": "Не удалось загрузить ветки",
+ "branchUnavailable": "Ветки недоступны для этого репозитория. Проверьте доступ у провайдера, затем выберите другой репозиторий.",
+ "branchEmpty": "Нет доступных веток",
+ "branchPlaceholder": "Выберите ветку",
"runOnWithTarget": "Место запуска: {{target}}",
"environment": "Окружение",
"couldNotLoadEnvironment": "Не удалось загрузить ваше окружение.",
@@ -1598,26 +1619,15 @@
"couldNotReadPendingSessions": "Не удалось прочитать данные сеансов в очереди. Попробуйте снова.",
"failedToCreate": "Не удалось создать сеанс.",
"couldNotRefreshRepositories": "Не удалось обновить список репозиториев. Попробуйте снова.",
- "discardDraftMessage": "Ваш запрос будет удалён.",
"discardDraftTitle": "Удалить черновик?",
+ "discardDraftMessage": "Ваш запрос будет удалён.",
+ "discardWithUploadsMessage": "Ваш запрос и все загруженные файлы, не прикреплённые к отправленным сообщениям, будут удалены.",
"discardFailed": "Не удалось удалить черновик. Попробуйте снова.",
"remoteHint": "Выполните `kilo remote` на компьютере или `/remote` в текущем сеансе CLI, чтобы управлять локальным процессом kilo.",
- "connectBitbucketDescription": "Подключите Bitbucket в браузере, затем вернитесь сюда, чтобы выбрать репозиторий.",
- "connectGitlabDescription": "Подключите GitLab в браузере, затем вернитесь сюда, чтобы выбрать репозиторий.",
- "couldNotLoadBitbucketRepositories": "Не удалось загрузить репозитории Bitbucket.",
- "couldNotLoadGithubRepositories": "Не удалось загрузить репозитории GitHub.",
- "couldNotLoadGitlabRepositories": "Не удалось загрузить репозитории GitLab.",
- "gitlabConnected": "GitLab подключён",
- "noRepositoriesVisibleBitbucket": "Репозитории не отображаются. Проверьте доступ к репозиториям Bitbucket и обновите список.",
- "noRepositoriesVisibleGitlab": "Репозитории не отображаются. Проверьте доступ к репозиториям GitLab и обновите список.",
- "openBitbucket": "Открыть Bitbucket",
- "openGitlab": "Открыть GitLab",
- "recentlyUsed": "Недавно использованные",
- "cliCannotContinue": "Этот CLI не поддерживает продолжение сеанса. Выберите Cloud Agent или другой CLI.",
"continueFrom": "Продолжаем сеанс «{{title}}».",
- "importFailed": "Не удалось импортировать этот сеанс.",
"importingSession": "Импорт сеанса",
- "discardWithUploadsMessage": "Ваш запрос и все загруженные файлы, не прикреплённые к отправленным сообщениям, будут удалены."
+ "cliCannotContinue": "Этот CLI не поддерживает продолжение сеанса. Выберите Cloud Agent или другой CLI.",
+ "importFailed": "Не удалось импортировать этот сеанс."
},
"partRenderer": {
"updatedFileCount_one": "Обновлён {{displayCount}} файл.",
@@ -2340,164 +2350,11 @@
"installAttributionPromptTitle": "Разрешить определение источника установки?"
},
"prReview": {
+ "pullRequestUnavailable": "Запрос на слияние недоступен",
+ "pullRequestUnavailableDescription": "Не удаётся открыть этот PR. Возможно, он удалён, репозиторий закрытый или в нём не установлено приложение Kilo для GitHub.",
"accessDeniedDescription": "У вас нет прав на просмотр этого запроса на слияние.",
- "checkConnection": "Проверить подключение",
- "checks": {
- "checksCount": "проверок: {{displayCount}}",
- "couldNotLoad": "Не удалось загрузить проверки.",
- "failed": "с ошибками: {{displayCount}}",
- "noAccess": "У вас нет доступа к проверкам этого репозитория.",
- "noChecksReported": "Нет данных о проверках",
- "notAvailable": "Проверки пока недоступны. Возможно, последний коммит ещё не обработан или в исходном репозитории не установлено приложение Kilo для GitHub.",
- "openDetails": "Открыть сведения о {{name}}",
- "passed": "успешно: {{displayCount}}",
- "pending": "в ожидании: {{displayCount}}",
- "retryChecks": "Повторить проверки",
- "skipped": "пропущено: {{displayCount}}",
- "title": "Проверки",
- "viewOnGitHub": "Открыть PR на GitHub",
- "checkDetails": "сведения о проверке"
- },
- "composer": {
- "addTitle": "Новый комментарий",
- "addToReview": "Добавить в ревью",
- "comment": "Комментарий",
- "commentBody": "Текст комментария",
- "commentBodyPlaceholder": "Ваш комментарий",
- "commentNow": "Отправить комментарий",
- "discardMessage": "Черновик будет удалён.",
- "discardTitle": "Удалить черновик комментария?",
- "editTitle": "Редактирование комментария",
- "insertSuggestion": "Вставить правку",
- "insertSuggestionA11y": "Вставить предлагаемую правку кода",
- "loadFailedTitle": "Не удалось загрузить редактор комментария.",
- "ok": "ОК",
- "unavailableMessage": "Этот неотправленный комментарий уже удалён или опубликован.",
- "unavailableTitle": "Комментарий недоступен",
- "bodyEmpty": "Текст комментария не может быть пустым.",
- "suggestionsOnlyAddedLines": "Предлагаемые правки применяются только к добавленным строкам.",
- "tapDiffLineToSuggest": "Нажмите на строку в изменениях, чтобы предложить правку."
- },
- "connect": {
- "checkFailedMessage": "Пока данные не загрузятся, статус входа будет недоступен.",
- "checkFailedTitle": "Не удалось проверить подключение к GitHub.",
- "description": "Подключите аккаунт GitHub, чтобы проводить ревью запросов на слияние в мобильном приложении.",
- "reconnectDescription": "Доступ к вашему аккаунту GitHub отозван. Подключитесь снова, чтобы продолжить ревью запросов на слияние в мобильном приложении.",
- "reconnectTitle": "Подключить GitHub снова"
- },
- "connectionExpired": "Срок действия подключения к GitHub истёк.",
- "couldNotLoadPullRequest": "Не удалось загрузить запрос на слияние.",
- "couldNotOpenGitHubAppSettings": "Не удалось открыть настройки приложения GitHub.",
- "description": "Описание",
- "discussion": {
- "acceptTerms": "Принять",
- "accessDeniedMessage": "У вас нет прав на просмотр обсуждения этого PR.",
- "addReaction": "Добавить реакцию",
- "block": "Заблокировать",
- "blockedUser": "{{login}} заблокирован",
- "collapseThread": "Свернуть обсуждение",
- "commentActions": "Действия с комментарием",
- "comment": "{{displayCount}} комментария",
- "comment_other": "{{displayCount}} комментария",
- "couldNotLoad": "Не удалось загрузить обсуждение.",
- "couldNotLoadMore": "Не удалось загрузить остальные комментарии.",
- "loadMoreComments": "Загрузить ещё комментарии",
- "loading": "Загрузка обсуждения",
- "moderation": {
- "block": {
- "retryable": "Не удалось заблокировать этого пользователя. Проверьте подключение и попробуйте снова.",
- "terminal": "Этого пользователя нельзя заблокировать."
- },
- "mute": {
- "retryable": "Не удалось скрыть сообщения этого пользователя. Проверьте подключение и попробуйте снова.",
- "terminal": "Нельзя скрыть сообщения этого пользователя."
- },
- "reportContent": {
- "retryable": "Не удалось пожаловаться на этот комментарий. Проверьте подключение и попробуйте снова.",
- "terminal": "На этот комментарий нельзя пожаловаться."
- },
- "reportUser": {
- "retryable": "Не удалось пожаловаться на этого пользователя. Проверьте подключение и попробуйте снова.",
- "terminal": "На этого пользователя нельзя пожаловаться."
- }
- },
- "moreLinesAbove": "… строк выше: {{displayCount}}",
- "mute": "Скрыть сообщения",
- "mutedUser": "Сообщения от {{login}} скрыты",
- "noDiscussion": "Обсуждений пока нет",
- "noDiscussionDescription": "В этом запросе на слияние пока нет обсуждений кода и общих комментариев.",
- "comment_one": "1 комментарий",
- "outdated": "Устарело",
- "quotedDiffSnippet": "Цитата из фрагмента изменений",
- "reactionPill": "Реакция {{emoji}}: {{displayCount}} {{countLabel}}",
- "reaction": "реакций",
- "reaction_other": "реакций",
- "reaction_one": "реакция",
- "replyBadRequest": "Не удаётся опубликовать ответ. Возможно, обсуждение изменилось.",
- "replyBody": "Текст ответа",
- "replyForbidden": "У вас нет прав на ответы в этом запросе на слияние.",
- "replyPlaceholder": "Ваш ответ…",
- "reportContent": "Пожаловаться на комментарий",
- "reportUser": "Пожаловаться на пользователя",
- "resolveThread": "Закрыть обсуждение",
- "resolved": "Закрыто",
- "retryLoadingMore": "Повторить загрузку остальных комментариев",
- "reviewFiles": "Проверить файлы",
- "startedRelative": " · начато {{relative}}",
- "submitReply": "Отправить ответ",
- "termsAcceptRetry": "Не удалось принять условия. Проверьте подключение и попробуйте снова.",
- "termsCopy": "Публиковать сообщения можно с 13 лет.",
- "termsTitle": "Условия использования",
- "threadAccessibilityLabel": "Обсуждение {{anchorLabel}}",
- "unavailable": "Обсуждение недоступно.",
- "unavailableMessage": "Возможно, этот запрос на слияние удалён.",
- "unresolveThread": "Открыть обсуждение снова",
- "viewTerms": "Открыть условия",
- "termsAcceptRequired": "Чтобы публиковать сообщения, нужно принять условия использования.",
- "termsCheckRetryCopy": "Не удалось проверить условия использования. Проверьте подключение и попробуйте снова.",
- "termsOutdatedCopy": "Условия использования изменились. Откройте этот экран снова, чтобы принять новую версию.",
- "comment_few": "{{displayCount}} комментария",
- "comment_many": "{{displayCount}} комментариев",
- "reaction_few": "реакции",
- "reaction_many": "реакций",
- "reactions": {
- "thumbsUp": "Большой палец вверх",
- "thumbsDown": "Большой палец вниз",
- "laugh": "Смех",
- "hooray": "Ура",
- "confused": "Недоумение",
- "heart": "Сердце",
- "rocket": "Ракета",
- "eyes": "Глаза"
- },
- "anchor": {
- "fileCommentOnPath": "Комментарий к файлу {{path}}",
- "fileComment": "Комментарий к файлу",
- "outdatedOnPathLines": "Устаревший комментарий: {{path}}, {{lines}}",
- "outdatedOnLines": "Устаревший комментарий: {{lines}}",
- "outdatedOnPath": "Устаревший комментарий: {{path}}"
- },
- "deletedUser": "удалённый пользователь"
- },
- "entry": {
- "clearLink": "Удалить ссылку на запрос на слияние",
- "couldNotLoad": "Не удалось загрузить данные.",
- "eyebrow": "Откройте запрос на слияние по URL.",
- "noRecentPrs": "Нет недавних PR",
- "noRecentPrsDescription": "Вставьте ссылку на PR выше, чтобы начать ревью. В следующий раз этот PR появится здесь.",
- "open": "Открыть",
- "pasteLink": "Вставить ссылку на запрос на слияние",
- "pastePrLink": "Вставить ссылку на PR",
- "removeFromRecentsMessage": "Этот запрос на слияние будет удалён из списка недавних.",
- "removeFromRecentsTitle": "Удалить из недавних?",
- "removeRecentAccessibility": "Удалить {{repo}} из недавних",
- "urlAccessibility": "URL запроса на слияние на GitHub"
- },
- "eventChips": {
- "comment": "Комментарий",
- "label": "Результат ревью",
- "requestChanges": "Запросить изменения"
- },
+ "noFilesChanged": "Нет изменённых файлов",
+ "noFilesChangedDescription": "В этом запросе на слияние нет изменений в файлах.",
"fileList": {
"filesList": "Список файлов",
"filesViewed": "Файлы · просмотрено {{viewed}} из {{total}}",
@@ -2542,7 +2399,6 @@
"commentOnSelectedLines": "Прокомментировать выделенные строки",
"finishReview": "Завершить ревью"
},
- "headLine": "{{counts}} · последний коммит {{sha}}",
"hunkRows": {
"contextUnavailable": "Контекст недоступен для этой версии.",
"expandAll": "Развернуть все",
@@ -2579,56 +2435,68 @@
"fileLoadedOfTotalCount_few": "загружено {{displayCount}} файла из {{total}}",
"fileLoadedOfTotalCount_many": "загружено {{displayCount}} файлов из {{total}}"
},
- "inbox": {
- "couldNotLoad": "Не удалось загрузить входящие.",
- "loading": "Загрузка входящих",
- "noReviewRequests": "Нет запросов на ревью",
- "noReviewRequestsDescription": "Здесь появятся запросы на слияние, ожидающие вашего ревью. Вы также можете вставить выше ссылку на любой PR.",
- "title": "Входящие"
+ "sideBySide": {
+ "emptyDiffColumn": "пустой столбец изменений",
+ "emptyDiffRow": "Пустая строка изменений",
+ "newOnly": "Только в новой версии: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ нет перевода строки в конце файла",
+ "oldNew": "До: {{old}} | После: {{new}}",
+ "oldOnly": "Только в исходной версии: {{text}}"
+ },
+ "connectionExpired": "Срок действия подключения к GitHub истёк.",
+ "capabilities": {
+ "banner": {
+ "title": "Недоступно у этого провайдера",
+ "accessibility": "Недоступно у этого провайдера: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Установить приложение Kilo для GitHub",
"merge": {
- "autoMergeDescription": "GitHub автоматически выполнит слияние этого запроса после успешного завершения всех обязательных проверок (способ: {{method}}).",
+ "merge": "Объединение",
+ "mergeNow": "Выполнить слияние сейчас",
+ "mergePullRequest": "Слияние запроса",
+ "mergeTermTitle": "Слить {{term}}",
+ "enableAutoMerge": "Включить автослияние",
+ "disableAutoMerge": "Отключить автослияние",
"autoMergeOn": "Автослияние включено",
- "blockedTitle": "Причины блокировки слияния",
- "cannotMerge": "Слияние этого запроса в текущем виде невозможно.",
+ "autoMergeDescription": "GitHub автоматически выполнит слияние этого запроса после успешного завершения всех обязательных проверок (способ: {{method}}).",
"checking": "Проверка возможности слияния…",
+ "couldNotDetermine": "Не удалось определить возможность слияния.",
+ "refreshMergeability": "Повторно проверить возможность слияния",
+ "blockedTitle": "Причины блокировки слияния",
+ "updateBranch": "Обновить ветку",
+ "updateBranchFromBase": "Обновить ветку из базовой",
+ "methodLabel": "Способ слияния",
+ "commitTitle": "Заголовок коммита",
"commitMessage": "Сообщение коммита",
"commitMessagePlaceholder": "Необязательное описание коммита слияния",
- "commitTitle": "Заголовок коммита",
- "confirmMessage": "Ваши изменения будут добавлены в базовую ветку.",
- "confirmTitle": "Выполнить слияние запроса?",
- "couldNotDetermine": "Не удалось определить возможность слияния.",
- "couldNotMerge": "Не удалось выполнить слияние запроса.",
"deleteBranch": "Удалить ветку",
"deleteBranchAfterMerge": "Удалить ветку после слияния",
- "disableAutoMerge": "Отключить автослияние",
- "enableAutoMerge": "Включить автослияние",
- "enableAutoMergeConfirmMessage": "GitHub автоматически выполнит слияние этого запроса после успешного завершения всех обязательных проверок.",
+ "noEnabledMethods": "В этом репозитории отключены все способы слияния. Попросите администратора разрешить обычное слияние, объединение коммитов или перебазирование.",
+ "confirmTitle": "Выполнить слияние запроса?",
+ "confirmTitleTerm": "Слить {{term}}?",
+ "confirmMessage": "Ваши изменения будут добавлены в базовую ветку.",
"enableAutoMergeConfirmTitle": "Включить автослияние?",
+ "enableAutoMergeConfirmMessage": "GitHub автоматически выполнит слияние этого запроса после успешного завершения всех обязательных проверок.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} будет автоматически слит после успешного выполнения конвейера.",
+ "enableAutoMergeDescriptionTerm": "GitLab автоматически сольёт этот {{term}} после успешного выполнения конвейера.",
"forbidden": "У вас нет прав на слияние этого запроса.",
- "loadFailedTitle": "Не удалось загрузить параметры слияния.",
- "merge": "Объединение",
- "mergeNow": "Выполнить слияние сейчас",
- "mergePullRequest": "Слияние запроса",
- "methodLabel": "Способ слияния",
+ "cannotMerge": "Слияние этого запроса в текущем виде невозможно.",
+ "couldNotMerge": "Не удалось выполнить слияние запроса.",
"methods": {
"merge": "Объединение",
"rebase": "Перебазирование",
"squash": "Объединение"
},
- "noEnabledMethods": "В этом репозитории отключены все способы слияния. Попросите администратора разрешить обычное слияние, объединение коммитов или перебазирование.",
+ "terminal": {
+ "alreadyMerged": "Слияние уже выполнено",
+ "closed": "Запрос на слияние закрыт",
+ "closedMergeRequest": "Этот запрос на слияние закрыт"
+ },
"partialSuccessBanner": {
"accessibility": "Слияние выполнено. Не удалось удалить ветку: {{reason}}",
"body": "Не удалось удалить ветку. Причина: {{reason}}"
},
- "refreshMergeability": "Повторно проверить возможность слияния",
- "terminal": {
- "alreadyMerged": "Слияние уже выполнено",
- "closed": "Запрос на слияние закрыт"
- },
- "updateBranch": "Обновить ветку",
- "updateBranchFromBase": "Обновить ветку из базовой",
+ "loadFailedTitle": "Не удалось загрузить параметры слияния.",
"blocked": {
"unknownStateTitle": "GitHub не подтвердил возможность слияния",
"unknownStateDetail": "Попробуйте обновить обзор чуть позже.",
@@ -2648,6 +2516,20 @@
"notMergeableTitle": "Слияние этого запроса пока невозможно",
"notMergeableDetail": "GitHub сообщил о состоянии слияния: {{state}}."
},
+ "restrictions": {
+ "title": "Ограничения на слияние",
+ "approvalsRequired_one": "Требуется {{displayCount}} одобрение",
+ "approvalsRequired_other": "Требуется {{displayCount}} одобрений",
+ "pipelineMustSucceed": "Перед слиянием конвейер должен завершиться успешно.",
+ "approvalsRequired_many": "Требуется {{displayCount}} одобрений",
+ "approvalsRequired_few": "Требуется {{displayCount}} одобрения"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Конвейер завершается ошибкой на последнем коммите.",
+ "pendingPipeline": "Конвейер все еще выполняется на последнем коммите.",
+ "permission": "У вас нет прав на слияние {{term}}.",
+ "draft": "Перед слиянием переведите {{term}} в состояние готовности к ревью."
+ },
"methodLabels": {
"merge": "Создать коммит слияния",
"squash": "Объединить коммиты и выполнить слияние",
@@ -2659,9 +2541,210 @@
"rebase": "Все коммиты этой ветки последовательно применяются к базовой без создания коммита слияния."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Обсуждение {{anchorLabel}}",
+ "collapseThread": "Свернуть обсуждение",
+ "resolveThread": "Закрыть обсуждение",
+ "unresolveThread": "Открыть обсуждение снова",
+ "resolved": "Закрыто",
+ "outdated": "Устарело",
+ "comment_one": "1 комментарий",
+ "comment": "{{displayCount}} комментария",
+ "comment_other": "{{displayCount}} комментария",
+ "startedRelative": " · начато {{relative}}",
+ "couldNotLoadMore": "Не удалось загрузить остальные комментарии.",
+ "retryLoadingMore": "Повторить загрузку остальных комментариев",
+ "loadMoreComments": "Загрузить ещё комментарии",
+ "addReaction": "Добавить реакцию",
+ "reactionPill": "Реакция {{emoji}}: {{displayCount}} {{countLabel}}",
+ "reaction_one": "реакция",
+ "reaction": "реакций",
+ "reaction_other": "реакций",
+ "commentActions": "Действия с комментарием",
+ "reportContent": "Пожаловаться на комментарий",
+ "reportUser": "Пожаловаться на пользователя",
+ "mute": "Скрыть сообщения",
+ "block": "Заблокировать",
+ "blockedUser": "{{login}} заблокирован",
+ "mutedUser": "Сообщения от {{login}} скрыты",
+ "replyPlaceholder": "Ваш ответ…",
+ "replyBody": "Текст ответа",
+ "submitReply": "Отправить ответ",
+ "termsTitle": "Условия использования",
+ "termsCopy": "Публиковать сообщения можно с 13 лет.",
+ "termsAcceptRetry": "Не удалось принять условия. Проверьте подключение и попробуйте снова.",
+ "viewTerms": "Открыть условия",
+ "acceptTerms": "Принять",
+ "replyBadRequest": "Не удаётся опубликовать ответ. Возможно, обсуждение изменилось.",
+ "replyForbidden": "У вас нет прав на ответы в этом запросе на слияние.",
+ "replyForbiddenTerm": "У вас нет прав для ответа в {{term}}.",
+ "moderation": {
+ "block": {
+ "retryable": "Не удалось заблокировать этого пользователя. Проверьте подключение и попробуйте снова.",
+ "terminal": "Этого пользователя нельзя заблокировать."
+ },
+ "mute": {
+ "retryable": "Не удалось скрыть сообщения этого пользователя. Проверьте подключение и попробуйте снова.",
+ "terminal": "Нельзя скрыть сообщения этого пользователя."
+ },
+ "reportContent": {
+ "retryable": "Не удалось пожаловаться на этот комментарий. Проверьте подключение и попробуйте снова.",
+ "terminal": "На этот комментарий нельзя пожаловаться."
+ },
+ "reportUser": {
+ "retryable": "Не удалось пожаловаться на этого пользователя. Проверьте подключение и попробуйте снова.",
+ "terminal": "На этого пользователя нельзя пожаловаться."
+ }
+ },
+ "accessDeniedMessage": "У вас нет прав на просмотр обсуждения этого PR.",
+ "unavailable": "Обсуждение недоступно.",
+ "unavailableMessage": "Возможно, этот запрос на слияние удалён.",
+ "couldNotLoad": "Не удалось загрузить обсуждение.",
+ "loading": "Загрузка обсуждения",
+ "noDiscussion": "Обсуждений пока нет",
+ "noDiscussionDescription": "В этом запросе на слияние пока нет обсуждений кода и общих комментариев.",
+ "reviewFiles": "Проверить файлы",
+ "quotedDiffSnippet": "Цитата из фрагмента изменений",
+ "moreLinesAbove": "… строк выше: {{displayCount}}",
+ "termsAcceptRequired": "Чтобы публиковать сообщения, нужно принять условия использования.",
+ "termsOutdatedCopy": "Условия использования изменились. Откройте этот экран снова, чтобы принять новую версию.",
+ "termsCheckRetryCopy": "Не удалось проверить условия использования. Проверьте подключение и попробуйте снова.",
+ "reactions": {
+ "thumbsUp": "Большой палец вверх",
+ "thumbsDown": "Большой палец вниз",
+ "laugh": "Смех",
+ "hooray": "Ура",
+ "confused": "Недоумение",
+ "heart": "Сердце",
+ "rocket": "Ракета",
+ "eyes": "Глаза"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Комментарий к файлу {{path}}",
+ "fileComment": "Комментарий к файлу",
+ "outdatedOnPathLines": "Устаревший комментарий: {{path}}, {{lines}}",
+ "outdatedOnLines": "Устаревший комментарий: {{lines}}",
+ "outdatedOnPath": "Устаревший комментарий: {{path}}"
+ },
+ "deletedUser": "удалённый пользователь",
+ "comment_few": "{{displayCount}} комментария",
+ "comment_many": "{{displayCount}} комментариев",
+ "reaction_few": "реакции",
+ "reaction_many": "реакций"
+ },
+ "couldNotOpenGitHubAppSettings": "Не удалось открыть настройки приложения GitHub.",
+ "installKiloGitHubApp": "Установить приложение Kilo для GitHub",
+ "checkConnection": "Проверить подключение",
+ "couldNotLoadPullRequest": "Не удалось загрузить запрос на слияние.",
+ "description": "Описание",
"noDescriptionProvided": "Описания нет.",
- "noFilesChanged": "Нет изменённых файлов",
- "noFilesChangedDescription": "В этом запросе на слияние нет изменений в файлах.",
+ "review": "Проверка",
+ "reviewPullRequest": "Провести ревью запроса на слияние",
+ "headLine": "{{counts}} · последний коммит {{sha}}",
+ "entry": {
+ "eyebrow": "Откройте пул-реквест или запрос на слияние по URL",
+ "pastePrLink": "Вставьте ссылку на пул-реквест или запрос на слияние",
+ "noRecentPrs": "Нет недавних ревью",
+ "noRecentPrsDescription": "Вставьте ссылку выше, чтобы начать ревью. В следующий раз оно появится здесь.",
+ "couldNotLoad": "Не удалось загрузить данные.",
+ "removeFromRecentsTitle": "Удалить из недавних?",
+ "removeFromRecentsMessage": "Это ревью будет удалено из списка недавних.",
+ "removeRecentAccessibility": "Удалить {{repo}} из недавних",
+ "urlAccessibility": "Введите URL пул-реквеста или запроса на слияние",
+ "urlPlaceholder": "URL пул-реквеста или запроса на слияние",
+ "openAccessibility": "Открыть пул-реквест или запрос на слияние",
+ "clearLink": "Очистить ссылку",
+ "pasteLink": "Вставить ссылку на пул-реквест или запрос на слияние",
+ "open": "Открыть"
+ },
+ "checks": {
+ "checksCount": "проверок: {{displayCount}}",
+ "couldNotLoad": "Не удалось загрузить проверки.",
+ "failed": "с ошибками: {{displayCount}}",
+ "noAccess": "У вас нет доступа к проверкам этого репозитория.",
+ "noChecksReported": "Нет данных о проверках",
+ "notAvailable": "Проверки пока недоступны. Возможно, последний коммит ещё не обработан или в исходном репозитории не установлено приложение Kilo для GitHub.",
+ "openDetails": "Открыть сведения о {{name}}",
+ "passed": "успешно: {{displayCount}}",
+ "pending": "в ожидании: {{displayCount}}",
+ "retryChecks": "Повторить проверки",
+ "skipped": "пропущено: {{displayCount}}",
+ "title": "Проверки",
+ "viewOnGitHub": "Открыть PR на GitHub",
+ "checkDetails": "сведения о проверке"
+ },
+ "inbox": {
+ "couldNotLoad": "Не удалось загрузить входящие.",
+ "loading": "Загрузка входящих",
+ "noReviewRequests": "Нет запросов на ревью",
+ "noReviewRequestsDescription": "Здесь появятся запросы на слияние, ожидающие вашего ревью. Вы также можете вставить выше ссылку на любой PR.",
+ "title": "Входящие"
+ },
+ "composer": {
+ "addTitle": "Новый комментарий",
+ "addToReview": "Добавить в ревью",
+ "comment": "Комментарий",
+ "commentBody": "Текст комментария",
+ "commentBodyPlaceholder": "Ваш комментарий",
+ "commentNow": "Отправить комментарий",
+ "discardMessage": "Черновик будет удалён.",
+ "discardTitle": "Удалить черновик комментария?",
+ "editTitle": "Редактирование комментария",
+ "insertSuggestion": "Вставить правку",
+ "insertSuggestionA11y": "Вставить предлагаемую правку кода",
+ "loadFailedTitle": "Не удалось загрузить редактор комментария.",
+ "ok": "ОК",
+ "unavailableMessage": "Этот неотправленный комментарий уже удалён или опубликован.",
+ "unavailableTitle": "Комментарий недоступен",
+ "bodyEmpty": "Текст комментария не может быть пустым.",
+ "suggestionsOnlyAddedLines": "Предлагаемые правки применяются только к добавленным строкам.",
+ "tapDiffLineToSuggest": "Нажмите на строку в изменениях, чтобы предложить правку."
+ },
+ "connect": {
+ "checkFailedTitle": "Не удалось проверить подключение к GitHub.",
+ "checkFailedMessage": "Пока данные не загрузятся, статус входа будет недоступен.",
+ "checkFailedTitleGitLab": "Не удалось проверить подключение к GitLab",
+ "checkFailedTitleBitbucket": "Не удалось проверить подключение к Bitbucket",
+ "providerCheckFailedMessage": "Статус подключения недоступен до загрузки.",
+ "reconnectTitle": "Подключить GitHub снова",
+ "reconnectDescription": "Доступ к вашему аккаунту GitHub отозван. Подключитесь снова, чтобы продолжить ревью запросов на слияние в мобильном приложении.",
+ "description": "Подключите аккаунт GitHub, чтобы проводить ревью запросов на слияние в мобильном приложении.",
+ "gitlabDescription": "Подключите аккаунт GitLab, чтобы просматривать запросы на слияние с мобильного.",
+ "bitbucketDescription": "Подключите Bitbucket к этой организации, чтобы просматривать пул-реквесты с мобильного.",
+ "bitbucketOrgOnlyDescription": "Выберите организацию в профиле, чтобы просматривать её пул-реквесты Bitbucket."
+ },
+ "screen": {
+ "shareA11y": "Поделиться запросом на слияние",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Этот комментарий будет удалён из очереди ревью.",
+ "deletePendingTitle": "Удалить неотправленный комментарий?",
+ "loadFailedTitle": "Не удалось загрузить форму отправки ревью.",
+ "pendingComment": "неотправленного комментария",
+ "pendingComment_other": "неотправленного комментария",
+ "pendingComment_one": "неотправленный комментарий",
+ "summaryOptional": "Итоговый комментарий (необязательно)",
+ "partialPostedMessage": "Опубликовано комментариев: {{displayFreshCount}}. Остались в очереди комментарии к старому коммиту: {{displayStaleCount}}.",
+ "submitCountOfTotal": "Отправить {{displayFreshCount}} из {{displayTotalCount}} комментариев",
+ "submitReview": "Отправить результаты проверки",
+ "pendingComment_few": "неотправленных комментария",
+ "pendingComment_many": "неотправленных комментариев",
+ "blockedRequestChanges": "Добавьте итоговый комментарий или хотя бы один комментарий к коду, чтобы запросить изменения.",
+ "blockedComment": "Добавьте итоговый комментарий или хотя бы один комментарий к коду, чтобы отправить ревью с комментариями."
+ },
+ "reconnectNotice": {
+ "title": "Срок действия подключения к GitHub истёк.",
+ "message": "Подключение к GitHub больше не действует. Проверьте его снова — при необходимости появится предложение подключиться заново.",
+ "gitlabTitle": "Срок действия подключения к GitLab истёк",
+ "bitbucketTitle": "Срок действия подключения к Bitbucket истёк",
+ "providerMessage": "Ваше подключение к {{provider}} больше не действительно. Повторно проверьте подключение — при необходимости вам предложат подключиться заново."
+ },
+ "eventChips": {
+ "comment": "Комментарий",
+ "label": "Результат ревью",
+ "requestChanges": "Запросить изменения"
+ },
"overview": {
"commit": "коммита",
"commit_other": "коммита",
@@ -2706,41 +2789,25 @@
"summaryA11y": "Итоговый комментарий к ревью",
"summaryPlaceholder": "Итоговый комментарий к ревью (необязательно)"
},
- "pullRequestUnavailable": "Запрос на слияние недоступен",
- "pullRequestUnavailableDescription": "Не удаётся открыть этот PR. Возможно, он удалён, репозиторий закрытый или в нём не установлено приложение Kilo для GitHub.",
- "reconnectNotice": {
- "message": "Подключение к GitHub больше не действует. Проверьте его снова — при необходимости появится предложение подключиться заново.",
- "title": "Срок действия подключения к GitHub истёк."
- },
- "review": "Проверка",
- "reviewPullRequest": "Провести ревью запроса на слияние",
- "screen": {
- "shareA11y": "Поделиться запросом на слияние",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "пустой столбец изменений",
- "emptyDiffRow": "Пустая строка изменений",
- "newOnly": "Только в новой версии: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ нет перевода строки в конце файла",
- "oldNew": "До: {{old}} | После: {{new}}",
- "oldOnly": "Только в исходной версии: {{text}}"
+ "tabs": {
+ "discussion": "Обсуждение",
+ "files": "Файлы",
+ "overview": "Обзор"
},
- "submit": {
- "deletePendingMessage": "Этот комментарий будет удалён из очереди ревью.",
- "deletePendingTitle": "Удалить неотправленный комментарий?",
- "loadFailedTitle": "Не удалось загрузить форму отправки ревью.",
- "pendingComment": "неотправленного комментария",
- "pendingComment_other": "неотправленного комментария",
- "pendingComment_one": "неотправленный комментарий",
- "summaryOptional": "Итоговый комментарий (необязательно)",
- "partialPostedMessage": "Опубликовано комментариев: {{displayFreshCount}}. Остались в очереди комментарии к старому коммиту: {{displayStaleCount}}.",
- "submitCountOfTotal": "Отправить {{displayFreshCount}} из {{displayTotalCount}} комментариев",
- "submitReview": "Отправить результаты проверки",
- "pendingComment_few": "неотправленных комментария",
- "pendingComment_many": "неотправленных комментариев",
- "blockedRequestChanges": "Добавьте итоговый комментарий или хотя бы один комментарий к коду, чтобы запросить изменения.",
- "blockedComment": "Добавьте итоговый комментарий или хотя бы один комментарий к коду, чтобы отправить ревью с комментариями."
+ "terms": {
+ "pullRequest": "Пул-реквест",
+ "mergeRequest": "Запрос на слияние",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Поделиться запросом на слияние",
+ "viewOnProvider": "Открыть в {{provider}}",
+ "mergeRequestUnavailable": "Запрос на слияние недоступен",
+ "unavailableDescription": "Возможно, он был удалён или у вас нет к нему доступа.",
+ "accessDeniedMergeRequest": "У вас нет прав на просмотр этого запроса на слияние.",
+ "couldNotLoadMergeRequest": "Не удалось загрузить запрос на слияние",
+ "discussionAccessDenied": "У вас нет прав на просмотр обсуждения этого запроса на слияние.",
+ "discussionUnavailableMessage": "Этот запрос на слияние мог быть удалён.",
+ "noDiscussionDescription": "В этом запросе на слияние нет веток ревью или комментариев.",
+ "noFilesChangedDescription": "В этом запросе на слияние нет изменений файлов."
},
"fileStatus": {
"changed": "Изменён",
@@ -2748,11 +2815,6 @@
"modified": "Изменён",
"renamed": "Переименован"
},
- "tabs": {
- "discussion": "Обсуждение",
- "files": "Файлы",
- "overview": "Обзор"
- },
"diff": {
"selectedTapToChange": "Выделено: {{label}}. Нажмите, чтобы изменить выделение",
"tapToComment": "{{label}}, нажмите, чтобы оставить комментарий",
@@ -2763,7 +2825,7 @@
"emptyLine": "(пусто)"
},
"linkPasteClipboardEmpty": "Буфер обмена пуст.",
- "linkPasteNotAPullRequest": "Это не ссылка на запрос на слияние на GitHub.",
+ "linkPasteNotAPullRequest": "Это не ссылка на пул-реквест или запрос на слияние",
"announce": {
"commentPosted": "Комментарий опубликован",
"reviewSubmitted": "Ревью отправлено",
@@ -2772,6 +2834,7 @@
"mutationError": {
"commentNotPosted": "Не удаётся опубликовать комментарий. Возможно, выбранная строка изменилась или PR обновлён.",
"reviewNotSubmitted": "Не удаётся отправить ревью в текущем виде. Возможно, PR изменился или вы пытаетесь провести ревью собственного запроса на слияние.",
+ "reviewNotSubmittedTerm": "Это ревью невозможно отправить как есть. {{term}} мог измениться, или вы не можете ревьюить свой собственный {{term}}.",
"couldNotPostComment": "Не удалось отправить комментарий.",
"couldNotSubmitReview": "Не удалось отправить ревью. Проверьте подключение и попробуйте снова."
},
@@ -2779,6 +2842,7 @@
"couldNotReply": "Не удалось ответить.",
"couldNotCompleteAction": "Не удалось выполнить это действие.",
"mergeResultDefaultError": "GitHub не завершил слияние.",
+ "mergeResultNotCompleted": "{{term}} не был слит. Проверьте его состояние и повторите попытку.",
"ambiguous": "Не удалось подтвердить результат — проверьте PR перед повторной попыткой.",
"persistenceFailed": "Не удалось записать это действие. Повторите попытку позже.",
"forbidden": "Доступ запрещён."
diff --git a/apps/mobile/src/i18n/locales/si.json b/apps/mobile/src/i18n/locales/si.json
index 86f16cf64e..8a5fed1a12 100644
--- a/apps/mobile/src/i18n/locales/si.json
+++ b/apps/mobile/src/i18n/locales/si.json
@@ -36,6 +36,7 @@
"cost": "පිරිවැය",
"discard": "ඉවතලන්න",
"findings": "හඳුනාගත් ගැටලු",
+ "mergeRequest": "මර්ජ ඉල්ලීම",
"notConnected": "සම්බන්ධ නැත",
"notifications": "දැනුම්දීම්",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "වෙනස්කම් දර්ශනයේ හිස් පේළිය"
},
"connectionExpired": "GitHub සම්බන්ධතාව කල් ඉකුත් වී ඇත.",
+ "capabilities": {
+ "banner": {
+ "title": "මෙම සැපයුම්කරු සඳහා නොමැත",
+ "accessibility": "මෙම සැපයුම්කරු සඳහා නොමැත: {{reason}}"
+ }
+ },
"merge": {
"merge": "ඒකාබද්ධ කිරීම",
"mergeNow": "දැන් ඒකාබද්ධ කරන්න",
"mergePullRequest": "පුල් ඉල්ලීම ඒකාබද්ධ කිරීම",
+ "mergeTermTitle": "{{term}} ඒකාබද්ධ කරන්න",
"enableAutoMerge": "ස්වයංක්රීය ඒකාබද්ධ කිරීම සක්රීය කරන්න",
"disableAutoMerge": "ස්වයංක්රීය ඒකාබද්ධ කිරීම අක්රීය කරන්න",
"autoMergeOn": "ස්වයංක්රීය ඒකාබද්ධ කිරීම ක්රියාත්මකයි",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "ඒකාබද්ධ කිරීමෙන් පසු ශාඛාව මකන්න",
"noEnabledMethods": "මෙම ගබඩාවේ කිසිදු ඒකාබද්ධ කිරීමේ ක්රමයක් සක්රීය කර නොමැත. සාමාන්ය ඒකාබද්ධ කිරීම, ස්ක්වොෂ් කිරීම හෝ රීබේස් කිරීම සක්රීය කරන ලෙස ගබඩාවේ පරිපාලකයෙකුගෙන් ඉල්ලන්න.",
"confirmTitle": "පුල් ඉල්ලීම ඒකාබද්ධ කරන්නද?",
+ "confirmTitleTerm": "{{term}} ඒකාබද්ධ කරන්නද?",
"confirmMessage": "මෙයින් ඔබේ වෙනස්කම් මූලික ශාඛාවට ඒකාබද්ධ වේ.",
"enableAutoMergeConfirmTitle": "ස්වයංක්රීය ඒකාබද්ධ කිරීම සක්රීය කරන්නද?",
"enableAutoMergeConfirmMessage": "අනිවාර්ය පරීක්ෂණ සියල්ල සමත් වූ විට GitHub මෙම පුල් ඉල්ලීම ස්වයංක්රීයව ඒකාබද්ධ කරයි.",
+ "enableAutoMergeConfirmMessageTerm": "පයිප්ලයින් සාර්ථක වූ පසු {{term}} ස්වයංක්රීයව ඒකාබද්ධ වේ.",
+ "enableAutoMergeDescriptionTerm": "GitLab මෙම {{term}} පයිප්ලයින් සාර්ථක වූ පසු ස්වයංක්රීයව ඒකාබද්ධ කරයි.",
"forbidden": "මෙම පුල් ඉල්ලීම ඒකාබද්ධ කිරීමට ඔබට අවසර නොමැත.",
"cannotMerge": "මෙම පුල් ඉල්ලීම පවතින තත්ත්වයෙන් ඒකාබද්ධ කළ නොහැක.",
"couldNotMerge": "පුල් ඉල්ලීම ඒකාබද්ධ කිරීමට නොහැකි විය.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "දැනටමත් ඒකාබද්ධ කර ඇත",
- "closed": "මෙම පුල් ඉල්ලීම වසා ඇත"
+ "closed": "මෙම පුල් ඉල්ලීම වසා ඇත",
+ "closedMergeRequest": "මෙම මර්ජ ඉල්ලීම වසා ඇත"
},
"partialSuccessBanner": {
"body": "ශාඛාව මැකීමට නොහැකි විය: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "මෙම පුල් ඉල්ලීම තවමත් ඒකාබද්ධ කළ නොහැක",
"notMergeableDetail": "GitHub වාර්තා කළ ඒකාබද්ධ කිරීමේ හැකියාව පිළිබඳ තත්ත්වය: {{state}}."
},
+ "restrictions": {
+ "title": "ඒකාබද්ධ කිරීමේ සීමාවන්",
+ "approvalsRequired_one": "අනුමැතිය {{displayCount}}ක් අවශ්යයි",
+ "approvalsRequired_other": "අනුමැතීන් {{displayCount}}ක් අවශ්යයි",
+ "pipelineMustSucceed": "ඒකාබද්ධ කිරීමට පෙර පයිප්ලයින් සාර්ථක විය යුතුය."
+ },
+ "providerBlocked": {
+ "failingPipeline": "අවසන් කමිට් එකේ පයිප්ලයින් අසාර්ථක වෙමින් පවතී.",
+ "pendingPipeline": "අවසන් කමිට් එකේ පයිප්ලයින් තවම ක්රියාත්මක වෙමින් පවතී.",
+ "permission": "මෙම {{term}} ඒකාබද්ධ කිරීමට ඔබට අවසර නොමැත.",
+ "draft": "ඒකාබද්ධ කිරීමට පෙර {{term}} සමාලෝචනයට සූදානම් බව සලකුණු කරන්න."
+ },
"methodLabels": {
"merge": "ඒකාබද්ධ කමිට් එකක් සාදන්න",
"squash": "ස්ක්වොෂ් කර ඒකාබද්ධ කරන්න",
@@ -448,6 +472,7 @@
"acceptTerms": "පිළිගන්න",
"replyBadRequest": "මෙම පිළිතුර පළ කළ නොහැක. සාකච්ඡා පෙළ වෙනස් වී තිබිය හැක.",
"replyForbidden": "මෙම පුල් ඉල්ලීමට පිළිතුරු දීමට ඔබට අවසර නොමැත.",
+ "replyForbiddenTerm": "මෙම {{term}}ට පිළිතුරු දීමට ඔබට අවසර නොමැත.",
"moderation": {
"reportContent": {
"terminal": "මෙම අදහස වාර්තා කළ නොහැක.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "පුල් ඉල්ලීම සමාලෝචනය කරන්න",
"headLine": "{{counts}} · නවතම කමිට් එක {{sha}}",
"entry": {
- "eyebrow": "URL එකකින් පුල් ඉල්ලීමක් විවෘත කරන්න.",
- "pastePrLink": "PR සබැඳියක් අලවන්න",
- "noRecentPrs": "මෑත PR නොමැත",
- "noRecentPrsDescription": "සමාලෝචනයක් ආරම්භ කිරීමට ඉහළින් PR සබැඳියක් අලවන්න — ඊළඟ වතාවේ එය මෙහි දිස්වේ.",
+ "eyebrow": "URL මගින් පුල් ඉල්ලීමක් හෝ මර්ජ ඉල්ලීමක් විවෘත කරන්න",
+ "pastePrLink": "පුල් ඉල්ලීමක හෝ මර්ජ ඉල්ලීමක සබැඳිය අලවන්න",
+ "noRecentPrs": "මෑත සමාලෝචන නොමැත",
+ "noRecentPrsDescription": "සමාලෝචනයක් අරඹන්න ඉහත සබැඳියක් අලවා — ඊළඟ වරට මෙතැනින් පෙනේ.",
"couldNotLoad": "පූරණය කිරීමට නොහැකි විය.",
"removeFromRecentsTitle": "මෑත ඉල්ලීම් ලැයිස්තුවෙන් ඉවත් කරන්නද?",
- "removeFromRecentsMessage": "මෙම පුල් ඉල්ලීම ඔබේ මෑත ඉල්ලීම් ලැයිස්තුවෙන් ඉවත් කෙරේ.",
+ "removeFromRecentsMessage": "මෙම සමාලෝචනය ඔබේ මෑත සමාලෝචන ලැයිස්තුවෙන් ඉවත් කෙරේ.",
"removeRecentAccessibility": "මෑත ඉල්ලීම් ලැයිස්තුවෙන් {{repo}} ඉවත් කරන්න",
- "urlAccessibility": "GitHub පුල් ඉල්ලීමේ URL එක",
- "clearLink": "පුල් ඉල්ලීමේ සබැඳිය ඉවත් කරන්න",
- "pasteLink": "පුල් ඉල්ලීමේ සබැඳිය අලවන්න",
+ "urlAccessibility": "පුල් ඉල්ලීමක හෝ මර්ජ ඉල්ලීමක URL ඇතුළත් කරන්න",
+ "urlPlaceholder": "පුල් ඉල්ලීම හෝ මර්ජ ඉල්ලීම URL",
+ "openAccessibility": "පුල් ඉල්ලීම හෝ මර්ජ ඉල්ලීම විවෘත කරන්න",
+ "clearLink": "සබැඳිය හිස් කරන්න",
+ "pasteLink": "පුල් ඉල්ලීමේ හෝ මර්ජ ඉල්ලීමේ සබැඳිය අලවන්න",
"open": "විවෘත"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub සම්බන්ධතාවය පරීක්ෂා කිරීමට නොහැකි විය.",
"checkFailedMessage": "මෙය පූරණය වන තුරු පිවිසුම් තත්ත්වය දැනගත නොහැක.",
+ "checkFailedTitleGitLab": "GitLab සම්බන්ධතාවය පරීක්ෂා කිරීමට නොහැකි විය.",
+ "checkFailedTitleBitbucket": "Bitbucket සම්බන්ධතාවය පරීක්ෂා කිරීමට නොහැකි විය.",
+ "providerCheckFailedMessage": "මෙය පූරණය වන තුරු සම්බන්ධතා තත්ත්වය ලබා ගත නොහැක.",
"reconnectTitle": "GitHub නැවත සම්බන්ධ කරන්න",
"reconnectDescription": "ඔබේ GitHub සම්බන්ධතාවය අවලංගු කර ඇත. ජංගම දුරකථනයෙන් පුල් ඉල්ලීම් සමාලෝචනය දිගටම කිරීමට නැවත සම්බන්ධ වන්න.",
- "description": "ජංගම දුරකථනයෙන් පුල් ඉල්ලීම් සමාලෝචනය කිරීමට ඔබේ GitHub ගිණුම සම්බන්ධ කරන්න."
+ "description": "ජංගම දුරකථනයෙන් පුල් ඉල්ලීම් සමාලෝචනය කිරීමට ඔබේ GitHub ගිණුම සම්බන්ධ කරන්න.",
+ "gitlabDescription": "ජංගම දුරකථනයෙන් මර්ජ ඉල්ලීම් සමාලෝචනය කිරීමට ඔබේ GitLab ගිණුම සම්බන්ධ කරන්න.",
+ "bitbucketDescription": "ජංගම දුරකථනයෙන් පුල් ඉල්ලීම් සමාලෝචනය කිරීමට Bitbucket මෙම සංවිධානයට සම්බන්ධ කරන්න.",
+ "bitbucketOrgOnlyDescription": "එහි Bitbucket පුල් ඉල්ලීම් සමාලෝචනය කිරීමට ඔබේ පැතිකඩේ සංවිධානයක් තෝරන්න."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub සම්බන්ධතාව කල් ඉකුත් වී ඇත.",
- "message": "ඔබේ GitHub සම්බන්ධතාවය තවදුරටත් වලංගු නොවේ. ඔබේ සම්බන්ධතාවය නැවත පරීක්ෂා කරන්න — අවශ්ය නම් නැවත සම්බන්ධ වීමට ඔබෙන් අසනු ඇත."
+ "message": "ඔබේ GitHub සම්බන්ධතාවය තවදුරටත් වලංගු නොවේ. ඔබේ සම්බන්ධතාවය නැවත පරීක්ෂා කරන්න — අවශ්ය නම් නැවත සම්බන්ධ වීමට ඔබෙන් අසනු ඇත.",
+ "gitlabTitle": "GitLab සම්බන්ධතාව කල් ඉකුත් වී ඇත.",
+ "bitbucketTitle": "Bitbucket සම්බන්ධතාව කල් ඉකුත් වී ඇත.",
+ "providerMessage": "ඔබේ {{provider}} සම්බන්ධතාවය තවදුරටත් වලංගු නොවේ. ඔබේ සම්බන්ධතාවය නැවත පරීක්ෂා කරන්න — අවශ්ය නම් නැවත සම්බන්ධ වීමට ඔබෙන් අසනු ඇත."
},
"eventChips": {
"comment": "අදහස් දැක්වීම",
@@ -643,6 +679,21 @@
"files": "ගොනු",
"discussion": "සාකච්ඡාව"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "මර්ජ ඉල්ලීම",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "මර්ජ ඉල්ලීම බෙදාගන්න",
+ "viewOnProvider": "{{provider}} මත බලන්න",
+ "mergeRequestUnavailable": "මර්ජ ඉල්ලීම ලබා ගත නොහැක",
+ "unavailableDescription": "එය මකා දමා තිබිය හැකිය, නැතහොත් ඔබට එයට ප්රවේශය නොමැති විය හැකිය.",
+ "accessDeniedMergeRequest": "මෙම මර්ජ ඉල්ලීම බැලීමට ඔබට අවසර නොමැත.",
+ "couldNotLoadMergeRequest": "මර්ජ ඉල්ලීම පූරණය කිරීමට නොහැකි විය.",
+ "discussionAccessDenied": "මෙම මර්ජ ඉල්ලීමේ සාකච්ඡාව බැලීමට ඔබට අවසර නොමැත.",
+ "discussionUnavailableMessage": "මෙම මර්ජ ඉල්ලීම ඉවත් කර තිබිය හැක.",
+ "noDiscussionDescription": "මෙම මර්ජ ඉල්ලීමේ සමාලෝචන සාකච්ඡා පෙළවල් හෝ සංවාද අදහස් නොමැත.",
+ "noFilesChangedDescription": "මෙම මර්ජ ඉල්ලීමේ ගොනු වෙනස්කම් නොමැත."
+ },
"fileStatus": {
"modified": "වෙනස් කර ඇත",
"renamed": "නම වෙනස් කර ඇත",
@@ -659,7 +710,7 @@
"emptyLine": "(හිස්)"
},
"linkPasteClipboardEmpty": "පසුරු පුවරුව හිස්ය.",
- "linkPasteNotAPullRequest": "මෙය GitHub පුල් ඉල්ලීමක සබැඳියක් නොවේ.",
+ "linkPasteNotAPullRequest": "මෙය පුල් ඉල්ලීමක හෝ මර්ජ ඉල්ලීමක සබැඳියක් නොවේ",
"announce": {
"commentPosted": "අදහස පළ කරන ලදී",
"reviewSubmitted": "සමාලෝචනය ඉදිරිපත් කරන ලදී",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "මෙම අදහස පළ කළ නොහැක. තෝරාගත් පේළිය වෙනස් වී තිබිය හැක, නැතහොත් PR යාවත්කාලීන කර තිබිය හැක.",
"reviewNotSubmitted": "මෙම සමාලෝචනය පවතින තත්ත්වයෙන් ඉදිරිපත් කළ නොහැක. PR වෙනස් වී තිබිය හැක, නැතහොත් මෙය ඔබේම පුල් ඉල්ලීමක් නිසා ඔබට එය සමාලෝචනය කළ නොහැක.",
+ "reviewNotSubmittedTerm": "මෙම සමාලෝචනය එලෙසම ඉදිරිපත් කළ නොහැක. {{term}} වෙනස් වී තිබිය හැකිය, නැතහොත් ඔබට ඔබේම {{term}} සමාලෝචනය කළ නොහැක.",
"couldNotPostComment": "අදහස පළ කිරීමට නොහැකි විය.",
"couldNotSubmitReview": "සමාලෝචනය ඉදිරිපත් කිරීමට නොහැකි විය. ඔබේ සම්බන්ධතාවය පරීක්ෂා කර නැවත උත්සාහ කරන්න."
},
@@ -675,6 +727,7 @@
"couldNotReply": "පිළිතුරු දීමට නොහැකි විය.",
"couldNotCompleteAction": "මෙම ක්රියාව සම්පූර්ණ කිරීමට නොහැකි විය.",
"mergeResultDefaultError": "GitHub ඒකාබද්ධ කිරීම සම්පූර්ණ කළේ නැත.",
+ "mergeResultNotCompleted": "{{term}} ඒකාබද්ධ කර නොමැත. එහි තත්ත්වය පරීක්ෂා කර නැවත උත්සාහ කරන්න.",
"ambiguous": "තහවුරු කිරීමට නොහැකි විය — නැවත උත්සාහ කිරීමට පෙර PR එක පරීක්ෂා කරන්න.",
"persistenceFailed": "මෙම ක්රියාව වාර්තා කිරීමට නොහැකි විය. කරුණාකර පසුව නැවත උත්සාහ කරන්න.",
"forbidden": "මෙයට අවසර නොමැත."
@@ -1988,11 +2041,31 @@
"retryConnection": "නැවත සම්බන්ධ වීමට උත්සාහ කරන්න"
},
"newSession": {
+ "recentlyUsed": "මෑතකදී භාවිතා කළ",
+ "couldNotLoadGithubRepositories": "GitHub ගබඩා පූරණය කළ නොහැකි විය.",
+ "couldNotLoadGitlabRepositories": "GitLab ගබඩා පූරණය කළ නොහැකි විය.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket ගබඩා පූරණය කළ නොහැකි විය.",
"connectGithubDescription": "ඔබේ බ්රවුසරයෙන් GitHub සම්බන්ධ කරන්න. ඉන්පසු ගබඩාවක් තෝරා ගැනීමට මෙහි ආපසු එන්න.",
+ "connectGitlabDescription": "ඔබේ බ්රවුසරයෙන් GitLab සම්බන්ධ කරන්න. ඉන්පසු ගබඩාවක් තෝරා ගැනීමට මෙහි ආපසු එන්න.",
+ "connectBitbucketDescription": "ඔබේ බ්රවුසරයෙන් Bitbucket සම්බන්ධ කරන්න. ඉන්පසු ගබඩාවක් තෝරා ගැනීමට මෙහි ආපසු එන්න.",
"openGithub": "GitHub විවෘත කරන්න",
+ "openGitlab": "GitLab විවෘත කරන්න",
+ "openBitbucket": "Bitbucket විවෘත කරන්න",
"refreshRepositories": "ගබඩා නැවුම් කරන්න",
"githubConnected": "GitHub සම්බන්ධයි",
+ "gitlabConnected": "GitLab සම්බන්ධයි",
"noRepositoriesVisible": "ගබඩා නොපෙනේ. Kilo GitHub යෙදුමට ගබඩා වෙත ප්රවේශ වීමට අවසර තිබේදැයි පරීක්ෂා කර නැවුම් කරන්න.",
+ "noRepositoriesVisibleGitlab": "ගබඩා නොපෙනේ. GitLab ගබඩා වෙත ප්රවේශ වීමට අවසර තිබේදැයි පරීක්ෂා කර නැවුම් කරන්න.",
+ "noRepositoriesVisibleBitbucket": "ගබඩා නොපෙනේ. Bitbucket ගබඩා වෙත ප්රවේශ වීමට අවසර තිබේදැයි පරීක්ෂා කර නැවුම් කරන්න.",
+ "bitbucketOrganizationsOnly": "සංවිධාන සඳහා පමණක් Bitbucket ලබා ගත හැක.",
+ "branchPickerTitle": "ශාඛාව තෝරන්න",
+ "branchDefault": "පෙරනිමිය",
+ "branchAccessibility": "ශාඛාව: {{label}}",
+ "branchLoading": "ශාඛා පූරණය වෙමින්",
+ "branchLoadError": "ශාඛා පූරණය කළ නොහැකි විය",
+ "branchUnavailable": "මෙම ගබඩාව සඳහා ශාඛා ලබා ගත නොහැක. සැපයුම්කරු සමඟ ඔබේ ප්රවේශය පරීක්ෂා කර, පසුව තවත් ගබඩාවක් තෝරන්න.",
+ "branchEmpty": "ශාඛා නොමැත",
+ "branchPlaceholder": "ශාඛාවක් තෝරන්න",
"runOnWithTarget": "ධාවනය වන ස්ථානය: {{target}}",
"environment": "පරිසරය",
"couldNotLoadEnvironment": "ඔබේ පරිසරය පූරණය කළ නොහැකි විය.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "ගබඩා නැවුම් කළ නොහැකි විය. කරුණාකර නැවත උත්සාහ කරන්න.",
"discardDraftTitle": "කටු සටහන ඉවතලන්නද?",
"discardDraftMessage": "ඔබේ ඉල්ලීම අහිමි වනු ඇත.",
+ "discardWithUploadsMessage": "ඔබේ ඉල්ලීම සහ යැවූ පණිවිඩවලට අමුණා නැති උඩුගත කළ ගොනු මකා දමනු ඇත.",
"discardFailed": "කටු සටහන ඉවත දැමිය නොහැකි විය. කරුණාකර නැවත උත්සාහ කරන්න.",
"remoteHint": "ඔබේ පරිගණකයේ kilo ක්රියාවලියක් පාලනය කිරීමට එම පරිගණකයේ `kilo remote` ධාවනය කරන්න, නැතහොත් ක්රියාත්මක CLI සැසියක `/remote` ධාවනය කරන්න.",
- "connectBitbucketDescription": "ඔබේ බ්රවුසරයෙන් Bitbucket සම්බන්ධ කරන්න. ඉන්පසු ගබඩාවක් තෝරා ගැනීමට මෙහි ආපසු එන්න.",
- "connectGitlabDescription": "ඔබේ බ්රවුසරයෙන් GitLab සම්බන්ධ කරන්න. ඉන්පසු ගබඩාවක් තෝරා ගැනීමට මෙහි ආපසු එන්න.",
- "couldNotLoadBitbucketRepositories": "Bitbucket ගබඩා පූරණය කළ නොහැකි විය.",
- "couldNotLoadGithubRepositories": "GitHub ගබඩා පූරණය කළ නොහැකි විය.",
- "couldNotLoadGitlabRepositories": "GitLab ගබඩා පූරණය කළ නොහැකි විය.",
- "gitlabConnected": "GitLab සම්බන්ධයි",
- "noRepositoriesVisibleBitbucket": "ගබඩා නොපෙනේ. Bitbucket ගබඩා වෙත ප්රවේශ වීමට අවසර තිබේදැයි පරීක්ෂා කර නැවුම් කරන්න.",
- "noRepositoriesVisibleGitlab": "ගබඩා නොපෙනේ. GitLab ගබඩා වෙත ප්රවේශ වීමට අවසර තිබේදැයි පරීක්ෂා කර නැවුම් කරන්න.",
- "openBitbucket": "Bitbucket විවෘත කරන්න",
- "openGitlab": "GitLab විවෘත කරන්න",
- "recentlyUsed": "මෑතකදී භාවිතා කළ",
- "cliCannotContinue": "මෙම CLI අනුවාදයට සැසියක් දිගටම කරගෙන යා නොහැක. Cloud Agent හෝ වෙනත් CLI එකක් තෝරන්න.",
"continueFrom": "{{title}} සැසිය දිගටම කරගෙන යමින් පවතී.",
- "importFailed": "මෙම සැසිය ආයාත කළ නොහැකි විය.",
"importingSession": "සැසිය ආයාත කරමින්",
- "discardWithUploadsMessage": "ඔබේ ඉල්ලීම සහ යැවූ පණිවිඩවලට අමුණා නැති උඩුගත කළ ගොනු මකා දමනු ඇත."
+ "cliCannotContinue": "මෙම CLI අනුවාදයට සැසියක් දිගටම කරගෙන යා නොහැක. Cloud Agent හෝ වෙනත් CLI එකක් තෝරන්න.",
+ "importFailed": "මෙම සැසිය ආයාත කළ නොහැකි විය."
},
"partRenderer": {
"updatedFileCount_one": "ගොනු {{displayCount}} ක් යාවත්කාලීන කර ඇත.",
diff --git a/apps/mobile/src/i18n/locales/sk.json b/apps/mobile/src/i18n/locales/sk.json
index e8db648d2a..5e7fa50ac0 100644
--- a/apps/mobile/src/i18n/locales/sk.json
+++ b/apps/mobile/src/i18n/locales/sk.json
@@ -36,6 +36,7 @@
"cost": "Cena",
"discard": "Zahodiť",
"findings": "Zistenia",
+ "mergeRequest": "merge request",
"notConnected": "Nepripojené",
"notifications": "Upozornenia",
"pullRequest": "pR",
@@ -344,10 +345,17 @@
"emptyDiffRow": "Prázdny riadok prehľadu zmien"
},
"connectionExpired": "Platnosť pripojenia k službe GitHub vypršala.",
+ "capabilities": {
+ "banner": {
+ "title": "Nie je dostupné u tohto poskytovateľa",
+ "accessibility": "Nie je dostupné u tohto poskytovateľa: {{reason}}"
+ }
+ },
"merge": {
"merge": "Zlúčenie",
"mergeNow": "Zlúčiť teraz",
"mergePullRequest": "Zlúčenie žiadosti",
+ "mergeTermTitle": "Zlúčiť {{term}}",
"enableAutoMerge": "Zapnúť automatické zlúčenie",
"disableAutoMerge": "Vypnúť automatické zlúčenie",
"autoMergeOn": "Automatické zlúčenie je zapnuté",
@@ -366,9 +374,12 @@
"deleteBranchAfterMerge": "Odstrániť vetvu po zlúčení",
"noEnabledMethods": "V tomto repozitári nie je povolená žiadna metóda zlúčenia. Požiadaj správcu, aby povolil zlučovací commit, zlúčenie commitov do jedného alebo presadenie commitov.",
"confirmTitle": "Zlúčiť žiadosť?",
+ "confirmTitleTerm": "Zlúčiť {{term}}?",
"confirmMessage": "Tvoje zmeny sa zlúčia do cieľovej vetvy.",
"enableAutoMergeConfirmTitle": "Zapnúť automatické zlúčenie?",
"enableAutoMergeConfirmMessage": "GitHub automaticky zlúči túto žiadosť, keď všetky povinné kontroly úspešne prebehnú.",
+ "enableAutoMergeConfirmMessageTerm": "Po úspešnom behu pipeline sa {{term}} automaticky zlúči.",
+ "enableAutoMergeDescriptionTerm": "GitLab automaticky zlúči tento {{term}}, keď pipeline prebehne úspešne.",
"forbidden": "Nemáš oprávnenie zlúčiť túto žiadosť.",
"cannotMerge": "Táto žiadosť o zlúčenie sa v súčasnom stave nedá zlúčiť.",
"couldNotMerge": "Žiadosť sa nepodarilo zlúčiť.",
@@ -379,7 +390,8 @@
},
"terminal": {
"alreadyMerged": "Už zlúčené",
- "closed": "Táto žiadosť o zlúčenie je uzavretá"
+ "closed": "Táto žiadosť o zlúčenie je uzavretá",
+ "closedMergeRequest": "Tento merge request je uzavretý"
},
"partialSuccessBanner": {
"body": "Vetvu sa nepodarilo odstrániť: {{reason}}.",
@@ -405,6 +417,20 @@
"notMergeableTitle": "Táto žiadosť sa ešte nedá zlúčiť",
"notMergeableDetail": "GitHub oznámil tento stav možnosti zlúčenia: {{state}}."
},
+ "restrictions": {
+ "title": "Obmedzenia zlúčenia",
+ "approvalsRequired_one": "Vyžaduje sa {{displayCount}} schválenie",
+ "approvalsRequired_other": "Vyžaduje sa {{displayCount}} schválenia",
+ "pipelineMustSucceed": "Pred zlúčením musí pipeline prebehnúť úspešne.",
+ "approvalsRequired_many": "Vyžaduje sa {{displayCount}} schválení",
+ "approvalsRequired_few": "Vyžadujú sa {{displayCount}} schválenia"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline na najnovšom commite zlyháva.",
+ "pendingPipeline": "Pipeline na najnovšom commite stále beží.",
+ "permission": "Nemáš oprávnenie zlúčiť tento {{term}}.",
+ "draft": "Pred zlúčením označ {{term}} ako pripravený na kontrolu kódu."
+ },
"methodLabels": {
"merge": "Vytvoriť zlučovací commit",
"squash": "Spojiť commity do jedného a zlúčiť",
@@ -452,6 +478,7 @@
"acceptTerms": "Prijať",
"replyBadRequest": "Túto odpoveď nemožno odoslať. Vlákno sa mohlo zmeniť.",
"replyForbidden": "Nemáš oprávnenie odpovedať na túto žiadosť o zlúčenie.",
+ "replyForbiddenTerm": "Nemáš oprávnenie odpovedať na tento {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Tento komentár sa nedá nahlásiť.",
@@ -483,10 +510,6 @@
"termsAcceptRequired": "Ak chceš pridávať príspevky, musíš prijať podmienky používania.",
"termsOutdatedCopy": "Podmienky používania sa zmenili. Znova otvor túto obrazovku a prijmi najnovšiu verziu.",
"termsCheckRetryCopy": "Podmienky používania sa nepodarilo overiť. Skontroluj pripojenie a skús to znova.",
- "comment_few": "{{displayCount}} komentáre",
- "comment_many": "{{displayCount}} komentára",
- "reaction_few": "reakcie",
- "reaction_many": "reakcie",
"reactions": {
"thumbsUp": "Palec hore",
"thumbsDown": "Palec dole",
@@ -504,7 +527,11 @@
"outdatedOnLines": "Neaktuálne: {{lines}}",
"outdatedOnPath": "Neaktuálne: {{path}}"
},
- "deletedUser": "odstránený používateľ"
+ "deletedUser": "odstránený používateľ",
+ "comment_few": "{{displayCount}} komentáre",
+ "comment_many": "{{displayCount}} komentára",
+ "reaction_few": "reakcie",
+ "reaction_many": "reakcie"
},
"couldNotOpenGitHubAppSettings": "Nepodarilo sa otvoriť nastavenia aplikácie GitHub.",
"installKiloGitHubApp": "Nainštalovať aplikáciu Kilo pre GitHub",
@@ -516,17 +543,19 @@
"reviewPullRequest": "Skontrolovať žiadosť o zlúčenie",
"headLine": "{{counts}} · najnovší commit {{sha}}",
"entry": {
- "eyebrow": "Otvor žiadosť o zlúčenie pomocou URL.",
- "pastePrLink": "Vložiť odkaz na PR",
- "noRecentPrs": "Žiadne nedávne PR",
- "noRecentPrsDescription": "Vlož odkaz na PR vyššie a začni kontrolu kódu. Nabudúce sa PR zobrazí tu.",
+ "eyebrow": "Otvorte PR alebo merge request pomocou URL",
+ "pastePrLink": "Vložiť odkaz na PR alebo merge request",
+ "noRecentPrs": "Žiadne nedávne recenzie",
+ "noRecentPrsDescription": "Ak chcete začať recenziu, vložte vyššie odkaz — nabudúce sa zobrazí tu.",
"couldNotLoad": "Nepodarilo sa načítať.",
"removeFromRecentsTitle": "Odstrániť z nedávnych žiadostí?",
- "removeFromRecentsMessage": "Táto žiadosť o zlúčenie sa odstráni z tvojho zoznamu nedávnych žiadostí.",
+ "removeFromRecentsMessage": "Táto recenzia sa odstráni z nedávnych.",
"removeRecentAccessibility": "Odstrániť {{repo}} zo zoznamu nedávnych žiadostí",
- "urlAccessibility": "URL žiadosti o zlúčenie na GitHub",
- "clearLink": "Vymazať odkaz na žiadosť o zlúčenie",
- "pasteLink": "Vložiť odkaz na žiadosť o zlúčenie",
+ "urlAccessibility": "Zadajte URL adresu PR alebo merge requestu",
+ "urlPlaceholder": "URL žiadosti o zlúčenie alebo merge requestu",
+ "openAccessibility": "Otvoriť žiadosť o zlúčenie alebo merge request",
+ "clearLink": "Vymazať odkaz",
+ "pasteLink": "Vložiť odkaz na PR alebo merge request",
"open": "Otvorené"
},
"checks": {
@@ -575,9 +604,15 @@
"connect": {
"checkFailedTitle": "Pripojenie k službe GitHub sa nepodarilo skontrolovať.",
"checkFailedMessage": "Stav prihlásenia bude dostupný až po načítaní údajov.",
+ "checkFailedTitleGitLab": "Pripojenie k službe GitLab sa nepodarilo skontrolovať.",
+ "checkFailedTitleBitbucket": "Pripojenie k službe Bitbucket sa nepodarilo skontrolovať.",
+ "providerCheckFailedMessage": "Stav pripojenia bude dostupný po načítaní.",
"reconnectTitle": "Opätovné pripojenie k službe GitHub",
"reconnectDescription": "Prístup k tvojmu účtu GitHub bol odvolaný. Znova pripoj účet, aby si mohol pokračovať v kontrole žiadostí o zlúčenie v mobile.",
- "description": "Pripoj svoj účet GitHub a kontroluj žiadosti o zlúčenie v mobile."
+ "description": "Pripoj svoj účet GitHub a kontroluj žiadosti o zlúčenie v mobile.",
+ "gitlabDescription": "Pripoj svoj účet GitLab a kontroluj merge requesty v mobile.",
+ "bitbucketDescription": "Pripoj Bitbucket k tejto organizácii a kontroluj žiadosti o zlúčenie v mobile.",
+ "bitbucketOrgOnlyDescription": "Vyber organizáciu vo svojom profile a kontroluj jej Bitbucket žiadosti o zlúčenie."
},
"screen": {
"title": "#{{number}}",
@@ -601,7 +636,10 @@
},
"reconnectNotice": {
"title": "Platnosť pripojenia k službe GitHub vypršala.",
- "message": "Tvoje pripojenie k službe GitHub už nie je platné. Znova ho skontroluj — v prípade potreby ťa vyzveme na opätovné pripojenie."
+ "message": "Tvoje pripojenie k službe GitHub už nie je platné. Znova ho skontroluj — v prípade potreby ťa vyzveme na opätovné pripojenie.",
+ "gitlabTitle": "Platnosť pripojenia k službe GitLab vypršala.",
+ "bitbucketTitle": "Platnosť pripojenia k službe Bitbucket vypršala.",
+ "providerMessage": "Tvoje pripojenie k službe {{provider}} už nie je platné. Znova ho skontroluj — v prípade potreby ťa vyzveme na opätovné pripojenie."
},
"eventChips": {
"comment": "Komentár",
@@ -657,6 +695,21 @@
"files": "Súborov",
"discussion": "Diskusia"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Zdieľať merge request",
+ "viewOnProvider": "Zobraziť v {{provider}}",
+ "mergeRequestUnavailable": "Merge request nie je dostupný",
+ "unavailableDescription": "Bol možná odstránený, alebo k nemu nemáš prístup.",
+ "accessDeniedMergeRequest": "Nemáš oprávnenie zobraziť tento merge request.",
+ "couldNotLoadMergeRequest": "Merge request sa nepodarilo načítať.",
+ "discussionAccessDenied": "Nemáš oprávnenie zobraziť diskusiu k tomuto merge request.",
+ "discussionUnavailableMessage": "Tento merge request bol možná odstránený.",
+ "noDiscussionDescription": "Tento merge request zatiaľ nemá žiadne vlákna ku kontrole kódu ani komentáre v diskusii.",
+ "noFilesChangedDescription": "Tento merge request neobsahuje žiadne zmeny súborov."
+ },
"fileStatus": {
"modified": "Upravené",
"renamed": "Premenované",
@@ -673,7 +726,7 @@
"emptyLine": "(prázdne)"
},
"linkPasteClipboardEmpty": "Schránka je prázdna.",
- "linkPasteNotAPullRequest": "Toto nie je odkaz na žiadosť o zlúčenie na GitHub.",
+ "linkPasteNotAPullRequest": "Nie je to odkaz na PR ani merge request",
"announce": {
"commentPosted": "Komentár bol odoslaný",
"reviewSubmitted": "Kontrola kódu bola odoslaná",
@@ -682,6 +735,7 @@
"mutationError": {
"commentNotPosted": "Tento komentár sa nedá odoslať. Vybraný riadok sa mohol zmeniť alebo bol PR aktualizovaný.",
"reviewNotSubmitted": "Túto kontrolu kódu nemožno odoslať v tejto podobe. PR sa mohol zmeniť alebo ide o tvoju vlastnú žiadosť o zlúčenie, ktorú nemôžeš posúdiť.",
+ "reviewNotSubmittedTerm": "Túto kontrolu kódu nemožno odoslať v tejto podobe. {{term}} sa mohol zmeniť alebo nemôžeš posúdiť svoj vlastný {{term}}.",
"couldNotPostComment": "Komentár sa nepodarilo odoslať.",
"couldNotSubmitReview": "Kontrolu kódu sa nepodarilo odoslať. Skontroluj pripojenie a skús to znova."
},
@@ -689,6 +743,7 @@
"couldNotReply": "Nepodarilo sa odpovedať.",
"couldNotCompleteAction": "Túto akciu sa nepodarilo dokončiť.",
"mergeResultDefaultError": "GitHub nedokončil zlúčenie.",
+ "mergeResultNotCompleted": "{{term}} nebol zlúčený. Skontroluj jeho stav a skús to znova.",
"ambiguous": "Výsledok sa nepodarilo potvrdiť. Pred ďalším pokusom skontroluj PR.",
"persistenceFailed": "Túto akciu sa nepodarilo zaznamenať. Skús to neskôr.",
"forbidden": "Na túto akciu nemáš oprávnenie."
@@ -2020,11 +2075,31 @@
"retryConnection": "Znova sa pripojiť"
},
"newSession": {
+ "recentlyUsed": "Naposledy použité",
+ "couldNotLoadGithubRepositories": "Repozitáre zo služby GitHub sa nepodarilo načítať.",
+ "couldNotLoadGitlabRepositories": "Repozitáre zo služby GitLab sa nepodarilo načítať.",
+ "couldNotLoadBitbucketRepositories": "Repozitáre zo služby Bitbucket sa nepodarilo načítať.",
"connectGithubDescription": "Pripoj GitHub v prehliadači, potom sa sem vráť a vyber repozitár.",
+ "connectGitlabDescription": "Pripoj GitLab v prehliadači, potom sa sem vráť a vyber repozitár.",
+ "connectBitbucketDescription": "Pripoj Bitbucket v prehliadači, potom sa sem vráť a vyber repozitár.",
"openGithub": "Otvoriť GitHub",
+ "openGitlab": "Otvoriť GitLab",
+ "openBitbucket": "Otvoriť Bitbucket",
"refreshRepositories": "Obnoviť repozitáre",
"githubConnected": "GitHub pripojený",
+ "gitlabConnected": "GitLab pripojený",
"noRepositoriesVisible": "Nezobrazujú sa žiadne repozitáre. Skontroluj prístup aplikácie Kilo k repozitárom v službe GitHub a potom obnov zoznam.",
+ "noRepositoriesVisibleGitlab": "Nezobrazujú sa žiadne repozitáre. Skontroluj prístup k repozitárom v službe GitLab a potom obnov zoznam.",
+ "noRepositoriesVisibleBitbucket": "Nezobrazujú sa žiadne repozitáre. Skontroluj prístup k repozitárom v službe Bitbucket a potom obnov zoznam.",
+ "bitbucketOrganizationsOnly": "Bitbucket je dostupný len pre organizácie.",
+ "branchPickerTitle": "Vybrať vetvu",
+ "branchDefault": "Predvolená",
+ "branchAccessibility": "Vetva: {{label}}",
+ "branchLoading": "Načítavajú sa vetvy",
+ "branchLoadError": "Vetvy sa nepodarilo načítať",
+ "branchUnavailable": "Pre tento repozitár nie sú vetvy dostupné. Skontroluj svoj prístup u poskytovateľa a vyber iný repozitár.",
+ "branchEmpty": "Žiadne dostupné vetvy",
+ "branchPlaceholder": "Vybrať vetvu",
"runOnWithTarget": "Spustiť na: {{target}}",
"environment": "Prostredie",
"couldNotLoadEnvironment": "Tvoje prostredie sa nepodarilo načítať.",
@@ -2045,24 +2120,13 @@
"couldNotRefreshRepositories": "Repozitáre sa nepodarilo obnoviť. Skús to znova.",
"discardDraftTitle": "Zahodiť koncept?",
"discardDraftMessage": "Tvoje zadanie sa stratí.",
+ "discardWithUploadsMessage": "Tvoje zadanie a všetky nahrané súbory nepriložené k odoslaným správam sa odstránia.",
"discardFailed": "Koncept sa nepodarilo zahodiť. Skús to znova.",
"remoteHint": "Ak chceš ovládať lokálny proces kilo, spusti `kilo remote` na počítači alebo `/remote` v spustenej relácii CLI.",
- "connectBitbucketDescription": "Pripoj Bitbucket v prehliadači, potom sa sem vráť a vyber repozitár.",
- "connectGitlabDescription": "Pripoj GitLab v prehliadači, potom sa sem vráť a vyber repozitár.",
- "couldNotLoadBitbucketRepositories": "Repozitáre zo služby Bitbucket sa nepodarilo načítať.",
- "couldNotLoadGithubRepositories": "Repozitáre zo služby GitHub sa nepodarilo načítať.",
- "couldNotLoadGitlabRepositories": "Repozitáre zo služby GitLab sa nepodarilo načítať.",
- "gitlabConnected": "GitLab pripojený",
- "noRepositoriesVisibleBitbucket": "Nezobrazujú sa žiadne repozitáre. Skontroluj prístup k repozitárom v službe Bitbucket a potom obnov zoznam.",
- "noRepositoriesVisibleGitlab": "Nezobrazujú sa žiadne repozitáre. Skontroluj prístup k repozitárom v službe GitLab a potom obnov zoznam.",
- "openBitbucket": "Otvoriť Bitbucket",
- "openGitlab": "Otvoriť GitLab",
- "recentlyUsed": "Naposledy použité",
"continueFrom": "Pokračuje sa v relácii {{title}}.",
"importingSession": "Importuje sa relácia",
"cliCannotContinue": "Táto verzia CLI nepodporuje pokračovanie v relácii. Vyber službu Cloud Agent alebo inú inštanciu CLI.",
- "importFailed": "Túto reláciu sa nepodarilo importovať.",
- "discardWithUploadsMessage": "Tvoje zadanie a všetky nahrané súbory nepriložené k odoslaným správam sa odstránia."
+ "importFailed": "Túto reláciu sa nepodarilo importovať."
},
"partRenderer": {
"updatedFileCount_one": "Aktualizoval sa {{displayCount}} súbor.",
diff --git a/apps/mobile/src/i18n/locales/sl.json b/apps/mobile/src/i18n/locales/sl.json
index 02394374f7..5998a6a950 100644
--- a/apps/mobile/src/i18n/locales/sl.json
+++ b/apps/mobile/src/i18n/locales/sl.json
@@ -36,6 +36,7 @@
"cost": "Stroški",
"discard": "Zavrzi",
"findings": "Ugotovitve",
+ "mergeRequest": "merge request",
"notConnected": "Ni povezano",
"notifications": "Obvestila",
"pullRequest": "zahteva za združitev",
@@ -344,10 +345,17 @@
"emptyDiffRow": "Prazna vrstica prikaza razlik"
},
"connectionExpired": "Povezava z računom GitHub je potekla.",
+ "capabilities": {
+ "banner": {
+ "title": "Ni na voljo pri tem ponudniku",
+ "accessibility": "Ni na voljo pri tem ponudniku: {{reason}}"
+ }
+ },
"merge": {
"merge": "Združitev",
"mergeNow": "Združi zdaj",
"mergePullRequest": "Združitev zahtevka",
+ "mergeTermTitle": "Združi {{term}}",
"enableAutoMerge": "Omogoči samodejno združevanje",
"disableAutoMerge": "Onemogoči samodejno združevanje",
"autoMergeOn": "Samodejno združevanje je vklopljeno",
@@ -366,9 +374,12 @@
"deleteBranchAfterMerge": "Izbriši vejo po združitvi",
"noEnabledMethods": "V tem repozitoriju ni omogočen noben način združitve. Prosi skrbnika, naj omogoči združevanje s potrditvijo, strnitvijo potrditev ali prestavitvijo osnove.",
"confirmTitle": "Združim zahtevek?",
+ "confirmTitleTerm": "Združim {{term}}?",
"confirmMessage": "Tvoje spremembe bodo združene v osnovno vejo.",
"enableAutoMergeConfirmTitle": "Omogočim samodejno združevanje?",
"enableAutoMergeConfirmMessage": "GitHub bo ta zahtevek za združitev samodejno združil, ko bodo vsa obvezna preverjanja uspešna.",
+ "enableAutoMergeConfirmMessageTerm": "Ko pipeline uspe, se {{term}} samodejno združi.",
+ "enableAutoMergeDescriptionTerm": "GitLab samodejno združi ta {{term}}, ko pipeline uspe.",
"forbidden": "Nimaš dovoljenja za združitev tega zahtevka.",
"cannotMerge": "Tega zahtevka za združitev v trenutnem stanju ni mogoče združiti.",
"couldNotMerge": "Zahtevka za združitev ni bilo mogoče združiti.",
@@ -379,7 +390,8 @@
},
"terminal": {
"alreadyMerged": "Že združeno",
- "closed": "Zahtevek za združitev je zaprt"
+ "closed": "Zahtevek za združitev je zaprt",
+ "closedMergeRequest": "Ta merge request je zaprt"
},
"partialSuccessBanner": {
"body": "Veje ni bilo mogoče izbrisati: {{reason}}.",
@@ -405,6 +417,20 @@
"notMergeableTitle": "Tega zahtevka za združitev še ni mogoče združiti",
"notMergeableDetail": "GitHub je sporočil stanje možnosti združitve: {{state}}."
},
+ "restrictions": {
+ "title": "Omejitve združevanja",
+ "approvalsRequired_one": "Potrebna je {{displayCount}} potrditev",
+ "approvalsRequired_other": "Potrebnih je {{displayCount}} potrditev",
+ "pipelineMustSucceed": "Pred združitvijo mora pipeline uspeti.",
+ "approvalsRequired_few": "Potrebne so {{displayCount}} potrditve",
+ "approvalsRequired_two": "Potrebni sta {{displayCount}} potrditvi"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline na zadnjem commitu spodletva.",
+ "pendingPipeline": "Pipeline na zadnjem commitu še teče.",
+ "permission": "Nimaš dovoljenja za združitev tega {{term}}.",
+ "draft": "Pred združitvijo označi ta {{term}} kot pripravljen na pregled."
+ },
"methodLabels": {
"merge": "Ustvari združitveno potrditev",
"squash": "Strni potrditve in združi",
@@ -452,6 +478,7 @@
"acceptTerms": "Sprejmi",
"replyBadRequest": "Tega odgovora ni mogoče objaviti. Nit se je morda spremenila.",
"replyForbidden": "Nimaš dovoljenja za odgovarjanje na ta zahtevek za združitev.",
+ "replyForbiddenTerm": "Nimaš dovoljenja za odgovarjanje na ta {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Tega komentarja ni mogoče prijaviti.",
@@ -483,10 +510,6 @@
"termsAcceptRequired": "Za objavljanje moraš sprejeti pogoje uporabe.",
"termsOutdatedCopy": "Pogoji uporabe so se spremenili. Znova odpri ta zaslon, da sprejmeš najnovejšo različico.",
"termsCheckRetryCopy": "Pogojev uporabe ni bilo mogoče preveriti. Preveri povezavo in poskusi znova.",
- "comment_two": "{{displayCount}} komentarja",
- "comment_few": "{{displayCount}} komentarji",
- "reaction_two": "reakciji",
- "reaction_few": "reakcije",
"reactions": {
"thumbsUp": "Palec gor",
"thumbsDown": "Palec dol",
@@ -504,7 +527,11 @@
"outdatedOnLines": "Zastarelo: {{lines}}",
"outdatedOnPath": "Zastarelo: {{path}}"
},
- "deletedUser": "izbrisani uporabnik"
+ "deletedUser": "izbrisani uporabnik",
+ "comment_two": "{{displayCount}} komentarja",
+ "comment_few": "{{displayCount}} komentarji",
+ "reaction_two": "reakciji",
+ "reaction_few": "reakcije"
},
"couldNotOpenGitHubAppSettings": "Nastavitev aplikacije GitHub ni bilo mogoče odpreti.",
"installKiloGitHubApp": "Namesti aplikacijo Kilo za GitHub",
@@ -516,17 +543,19 @@
"reviewPullRequest": "Preglej zahtevek za združitev",
"headLine": "{{counts}} · zadnja potrditev {{sha}}",
"entry": {
- "eyebrow": "Odpri zahtevek za združitev z naslovom URL.",
- "pastePrLink": "Prilepi povezavo do PR-ja",
- "noRecentPrs": "Ni nedavnih PR-jev",
- "noRecentPrsDescription": "Zgoraj prilepi povezavo do PR-ja, da začneš pregled. Naslednjič se bo PR prikazal tukaj.",
+ "eyebrow": "Odpri zahtevek za združitev ali merge request z naslovom URL",
+ "pastePrLink": "Prilepi povezavo do zahtevka za združitev ali merge requesta",
+ "noRecentPrs": "Ni nedavnih pregledov",
+ "noRecentPrsDescription": "Za začetek pregleda zgoraj prilepite povezavo — naslednjič se pojavi tukaj.",
"couldNotLoad": "Vsebine ni bilo mogoče naložiti.",
"removeFromRecentsTitle": "Odstranim s seznama nedavnih?",
- "removeFromRecentsMessage": "Ta zahtevek za združitev bo odstranjen s tvojega seznama nedavnih zahtevkov.",
+ "removeFromRecentsMessage": "Ta pregled bo odstranjen iz nedavnih.",
"removeRecentAccessibility": "Odstrani {{repo}} s seznama nedavnih",
- "urlAccessibility": "URL zahtevka za združitev na GitHubu",
- "clearLink": "Počisti povezavo do zahtevka za združitev",
- "pasteLink": "Prilepi povezavo do zahtevka za združitev",
+ "urlAccessibility": "Vnesite URL zahtevka za združitev ali merge requesta",
+ "urlPlaceholder": "URL zahteve za združitev ali merge requesta",
+ "openAccessibility": "Odpri zahtevo za združitev ali merge request",
+ "clearLink": "Počisti povezavo",
+ "pasteLink": "Prilepi povezavo do zahtevka za združitev ali merge requesta",
"open": "Odprto"
},
"checks": {
@@ -575,9 +604,15 @@
"connect": {
"checkFailedTitle": "Povezave z GitHubom ni bilo mogoče preveriti.",
"checkFailedMessage": "Stanje prijave bo na voljo šele po končanem nalaganju.",
+ "checkFailedTitleGitLab": "Povezave z GitLabom ni bilo mogoče preveriti.",
+ "checkFailedTitleBitbucket": "Povezave z Bitbucketom ni bilo mogoče preveriti.",
+ "providerCheckFailedMessage": "Stanje povezave bo na voljo po končanem nalaganju.",
"reconnectTitle": "Ponovna povezava z GitHubom",
"reconnectDescription": "Tvoja povezava z GitHubom je bila preklicana. Znova poveži račun, da lahko še naprej pregleduješ zahtevke za združitev na mobilni napravi.",
- "description": "Poveži svoj račun GitHub, da lahko pregleduješ zahtevke za združitev na mobilni napravi."
+ "description": "Poveži svoj račun GitHub, da lahko pregleduješ zahtevke za združitev na mobilni napravi.",
+ "gitlabDescription": "Poveži svoj račun GitLab, da lahko pregleduješ merge requeste na mobilni napravi.",
+ "bitbucketDescription": "Poveži Bitbucket s to organizacijo, da lahko pregleduješ zahtevke za združitev na mobilni napravi.",
+ "bitbucketOrgOnlyDescription": "V profilu izberi organizacijo, da lahko pregleduješ njene zahtevke za združitev na Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -601,7 +636,10 @@
},
"reconnectNotice": {
"title": "Povezava z računom GitHub je potekla.",
- "message": "Tvoja povezava z GitHubom ni več veljavna. Znova jo preveri. Po potrebi te bomo pozvali k ponovni povezavi."
+ "message": "Tvoja povezava z GitHubom ni več veljavna. Znova jo preveri. Po potrebi te bomo pozvali k ponovni povezavi.",
+ "gitlabTitle": "Povezava z računom GitLab je potekla.",
+ "bitbucketTitle": "Povezava z računom Bitbucket je potekla.",
+ "providerMessage": "Tvoja povezava z {{provider}}om ni več veljavna. Znova jo preveri. Po potrebi te bomo pozvali k ponovni povezavi."
},
"eventChips": {
"comment": "Komentar",
@@ -657,6 +695,21 @@
"files": "Datotek",
"discussion": "Razprava"
},
+ "terms": {
+ "pullRequest": "Zahteva za združitev",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Deli merge request",
+ "viewOnProvider": "Poglej na {{provider}}",
+ "mergeRequestUnavailable": "Merge request ni na voljo",
+ "unavailableDescription": "Morda je bil odstranjen ali pa nimaš dostopa do njega.",
+ "accessDeniedMergeRequest": "Nimaš dovoljenja za ogled tega merge requesta.",
+ "couldNotLoadMergeRequest": "Merge requesta ni bilo mogoče naložiti.",
+ "discussionAccessDenied": "Nimaš dovoljenja za ogled razprave o tem merge requestu.",
+ "discussionUnavailableMessage": "Ta merge request je bil morda odstranjen.",
+ "noDiscussionDescription": "Ta merge request še nima niti razprave o pregledu ali drugih komentarjev.",
+ "noFilesChangedDescription": "Ta merge request ne vsebuje sprememb datotek."
+ },
"fileStatus": {
"modified": "Spremenjeno",
"renamed": "Preimenovano",
@@ -673,7 +726,7 @@
"emptyLine": "(prazno)"
},
"linkPasteClipboardEmpty": "Odložišče je prazno.",
- "linkPasteNotAPullRequest": "To ni povezava do zahtevka za združitev na GitHubu.",
+ "linkPasteNotAPullRequest": "To ni povezava do zahtevka za združitev ali merge requesta",
"announce": {
"commentPosted": "Komentar objavljen",
"reviewSubmitted": "Pregled oddan",
@@ -682,6 +735,7 @@
"mutationError": {
"commentNotPosted": "Tega komentarja ni mogoče objaviti. Izbrana vrstica se je morda spremenila ali pa je bil PR posodobljen.",
"reviewNotSubmitted": "Tega pregleda ni mogoče oddati v trenutni obliki. PR se je morda spremenil ali pa poskušaš pregledati svoj zahtevek za združitev.",
+ "reviewNotSubmittedTerm": "Tega pregleda ni mogoče oddati v trenutni obliki. {{term}} se je morda spremenil ali ne moreš pregledovati svojega {{term}}.",
"couldNotPostComment": "Komentarja ni bilo mogoče objaviti.",
"couldNotSubmitReview": "Pregleda ni bilo mogoče oddati. Preveri povezavo in poskusi znova."
},
@@ -689,6 +743,7 @@
"couldNotReply": "Odgovora ni bilo mogoče poslati.",
"couldNotCompleteAction": "Tega dejanja ni bilo mogoče dokončati.",
"mergeResultDefaultError": "GitHub ni dokončal združitve.",
+ "mergeResultNotCompleted": "Ta {{term}} ni bil združen. Preveri njegovo stanje in poskusi znova.",
"ambiguous": "Dejanja ni bilo mogoče potrditi — pred ponovnim poskusom preveri PR.",
"persistenceFailed": "Tega dejanja ni bilo mogoče zabeležiti. Poskusi znova pozneje.",
"forbidden": "Dejanje ni dovoljeno."
@@ -2020,11 +2075,31 @@
"retryConnection": "Znova vzpostavi povezavo"
},
"newSession": {
+ "recentlyUsed": "Nedavno uporabljeno",
+ "couldNotLoadGithubRepositories": "Skladišč na GitHub ni bilo mogoče naložiti.",
+ "couldNotLoadGitlabRepositories": "Skladišč na GitLab ni bilo mogoče naložiti.",
+ "couldNotLoadBitbucketRepositories": "Skladišč na Bitbucket ni bilo mogoče naložiti.",
"connectGithubDescription": "Poveži GitHub v brskalniku, nato se vrni sem in izberi skladišče.",
+ "connectGitlabDescription": "Poveži GitLab v brskalniku, nato se vrni sem in izberi skladišče.",
+ "connectBitbucketDescription": "Poveži Bitbucket v brskalniku, nato se vrni sem in izberi skladišče.",
"openGithub": "Odpri GitHub",
+ "openGitlab": "Odpri GitLab",
+ "openBitbucket": "Odpri Bitbucket",
"refreshRepositories": "Osveži skladišča",
"githubConnected": "Povezan GitHub",
+ "gitlabConnected": "Povezan GitLab",
"noRepositoriesVisible": "Nobeno skladišče ni vidno. Preveri, ali ima aplikacija Kilo za GitHub dostop do skladišč, nato osveži seznam.",
+ "noRepositoriesVisibleGitlab": "Nobeno skladišče ni vidno. Preveri dostop do skladišč na GitLab, nato osveži seznam.",
+ "noRepositoriesVisibleBitbucket": "Nobeno skladišče ni vidno. Preveri dostop do skladišč na Bitbucket, nato osveži seznam.",
+ "bitbucketOrganizationsOnly": "Bitbucket je na voljo samo za organizacije.",
+ "branchPickerTitle": "Izberi vejo",
+ "branchDefault": "Privzeta",
+ "branchAccessibility": "Veja: {{label}}",
+ "branchLoading": "Nalaganje vej",
+ "branchLoadError": "Vej ni bilo mogoče naložiti",
+ "branchUnavailable": "Veje za to skladišče niso na voljo. Preveri svoj dostop pri ponudniku in izberi drugo skladišče.",
+ "branchEmpty": "Ni razpoložljivih vej",
+ "branchPlaceholder": "Izberi vejo",
"runOnWithTarget": "Zaženi na: {{target}}",
"environment": "Okolje",
"couldNotLoadEnvironment": "Tvojega okolja ni bilo mogoče naložiti.",
@@ -2045,24 +2120,13 @@
"couldNotRefreshRepositories": "Skladišč ni bilo mogoče osvežiti. Poskusi znova.",
"discardDraftTitle": "Želiš zavreči osnutek?",
"discardDraftMessage": "Tvoj poziv se ne bo shranil.",
+ "discardWithUploadsMessage": "Tvoj poziv in vse naložene datoteke, ki niso priložene poslanim sporočilom, bodo izbrisani.",
"discardFailed": "Osnutka ni bilo mogoče zavreči. Poskusi znova.",
"remoteHint": "Za upravljanje lokalnega procesa kilo zaženi `kilo remote` na svojem računalniku ali `/remote` v aktivni seji CLI.",
- "connectBitbucketDescription": "Poveži Bitbucket v brskalniku, nato se vrni sem in izberi skladišče.",
- "connectGitlabDescription": "Poveži GitLab v brskalniku, nato se vrni sem in izberi skladišče.",
- "couldNotLoadBitbucketRepositories": "Skladišč na Bitbucket ni bilo mogoče naložiti.",
- "couldNotLoadGithubRepositories": "Skladišč na GitHub ni bilo mogoče naložiti.",
- "couldNotLoadGitlabRepositories": "Skladišč na GitLab ni bilo mogoče naložiti.",
- "gitlabConnected": "Povezan GitLab",
- "noRepositoriesVisibleBitbucket": "Nobeno skladišče ni vidno. Preveri dostop do skladišč na Bitbucket, nato osveži seznam.",
- "noRepositoriesVisibleGitlab": "Nobeno skladišče ni vidno. Preveri dostop do skladišč na GitLab, nato osveži seznam.",
- "openBitbucket": "Odpri Bitbucket",
- "openGitlab": "Odpri GitLab",
- "recentlyUsed": "Nedavno uporabljeno",
- "cliCannotContinue": "Ta CLI ne podpira nadaljevanja seje. Izberi Cloud Agent ali drug CLI.",
"continueFrom": "Nadaljuje se seja {{title}}.",
- "importFailed": "Te seje ni bilo mogoče uvoziti.",
"importingSession": "Uvažanje seje",
- "discardWithUploadsMessage": "Tvoj poziv in vse naložene datoteke, ki niso priložene poslanim sporočilom, bodo izbrisani."
+ "cliCannotContinue": "Ta CLI ne podpira nadaljevanja seje. Izberi Cloud Agent ali drug CLI.",
+ "importFailed": "Te seje ni bilo mogoče uvoziti."
},
"partRenderer": {
"updatedFileCount_one": "Posodobljena je {{displayCount}} datoteka.",
diff --git a/apps/mobile/src/i18n/locales/so.json b/apps/mobile/src/i18n/locales/so.json
index 5f795b3f73..cf49faa195 100644
--- a/apps/mobile/src/i18n/locales/so.json
+++ b/apps/mobile/src/i18n/locales/so.json
@@ -36,6 +36,7 @@
"cost": "Kharashka",
"discard": "Tuur",
"findings": "Natiijooyin",
+ "mergeRequest": "merge request",
"notConnected": "Kuma xirna",
"notifications": "Ogeysiisyada",
"pullRequest": "codsi isku-darid",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Saf madhan oo kala duwanaanshaha ah"
},
"connectionExpired": "Muddadii xiriirka GitHub way dhammaatay.",
+ "capabilities": {
+ "banner": {
+ "title": "Kuma jirto bixiyahan",
+ "accessibility": "Kuma jirto bixiyahan: {{reason}}"
+ }
+ },
"merge": {
"merge": "Isku-darid",
"mergeNow": "Hadda isku dar",
"mergePullRequest": "Isku-darka codsiga",
+ "mergeTermTitle": "Isku-dar {{term}}",
"enableAutoMerge": "Daar isku-darka tooska ah",
"disableAutoMerge": "Dami isku-darka tooska ah",
"autoMergeOn": "Isku-darka tooska ah waa daaran yahay",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Tirtir laanta isku-darka ka dib",
"noEnabledMethods": "Kaydkan kama daarna hab isku-dar ah. Ka codso maamulaha kaydka inuu daaro isku-darka caadiga ah, isku-ururinta ama saldhig-beddelka.",
"confirmTitle": "Ma la isku daraa codsiga?",
+ "confirmTitleTerm": "Ma la isku daraa {{term}}?",
"confirmMessage": "Tani waxay isbeddelladaada ku dari doontaa laanta saldhigga.",
"enableAutoMergeConfirmTitle": "Ma la daaraa isku-darka tooska ah?",
"enableAutoMergeConfirmMessage": "GitHub wuxuu codsigan isku-darka si toos ah isugu dari doonaa marka dhammaan hubinnada loo baahan yahay ay gudbaan.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} waa la isku-daraya si otomaatig ah marka pipeline-ku guulaysto.",
+ "enableAutoMergeDescriptionTerm": "GitLab wuxuu si otomaatig ah u isku-darayaa {{term}} marka pipeline-ku guulaysto.",
"forbidden": "Ma haysatid oggolaansho aad ku fuliso codsigan isku-darka.",
"cannotMerge": "Codsigan isku-darka lama fulin karo sida uu hadda yahay.",
"couldNotMerge": "Codsiga isku-darka lama fulin karin.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Hore ayaa la isugu daray",
- "closed": "Codsigan isku-darka waa xiran yahay"
+ "closed": "Codsigan isku-darka waa xiran yahay",
+ "closedMergeRequest": "Codsigan merge request waa xiran yahay"
},
"partialSuccessBanner": {
"body": "Laanta lama tirtiri karin: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Codsigan isku-darka weli lama fulin karo",
"notMergeableDetail": "GitHub wuxuu xaaladda suurtagalnimada isku-darka ku sheegay {{state}}."
},
+ "restrictions": {
+ "title": "Xaddidaadaha isku-darka",
+ "approvalsRequired_one": "{{displayCount}} ogolaansho ayaa loo baahan yahay",
+ "approvalsRequired_other": "{{displayCount}} ogolaansho ayaa loo baahan yahay",
+ "pipelineMustSucceed": "Pipeline-ku waa inuu guulaystaa ka hor inta aan la isku darin."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline-ku wuu ku fashilmay diiwaankii ugu dambeeyay.",
+ "pendingPipeline": "Pipeline-ku weli wuu ka socdaa diiwaankii ugu dambeeyay.",
+ "permission": "Ma haysatid oggolaansho aad ku isku-darto {{term}}.",
+ "draft": "Ku calaamadee {{term}} inuu diyaar u yahay dib-u-eegis ka hor intaadan isku darin."
+ },
"methodLabels": {
"merge": "Abuur diiwaan isbeddel oo isku-dar ah",
"squash": "Isku ururi oo isku dar",
@@ -448,6 +472,7 @@
"acceptTerms": "Aqbal",
"replyBadRequest": "Jawaabtan lama daabici karo. Waxaa laga yaabaa in dooddu isbeddeshay.",
"replyForbidden": "Ma haysatid oggolaansho aad uga jawaabto codsigan isku-darka.",
+ "replyForbiddenTerm": "Ma haysatid oggolaansho aad uga jawaabto {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Faalladan lama soo sheegi karo.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Dib u eeg codsiga isku-darka",
"headLine": "{{counts}} · diiwaanka isbeddelka ugu dambeeya {{sha}}",
"entry": {
- "eyebrow": "Ku fur codsi isku-dar ah URL-kiisa.",
- "pastePrLink": "Ku dheji xiriiriye PR ah",
- "noRecentPrs": "Ma jiraan PR-yo dhowaan la isticmaalay",
- "noRecentPrsDescription": "Kor ku dheji xiriiriye PR ah si aad u bilowdo dib-u-eegis — marka xigta halkan ayuu ka soo muuqan doonaa.",
+ "eyebrow": "Ku fur PR ama merge request URL-ka",
+ "pastePrLink": "Ku dheji xiriiriye PR ama merge request ah",
+ "noRecentPrs": "Ma jiraan dib-u-eegisyo dhowaan la sameeyay",
+ "noRecentPrsDescription": "Kor ku dheji xiriiriye si aad u bilowdo dib-u-eegis — marka xigta halkan ayuu ka soo muuqan doonaa.",
"couldNotLoad": "Lama soo rari karin.",
"removeFromRecentsTitle": "Ma laga saaraa kuwii dhowaan la isticmaalay?",
- "removeFromRecentsMessage": "Codsigan isku-darka waxaa laga saari doonaa liiska kuwii aad dhowaan isticmaashay.",
+ "removeFromRecentsMessage": "Dib-u-eegistan waxaa laga saari doonaa liiska kuwii aad dhowaan isticmaashay.",
"removeRecentAccessibility": "Ka saar {{repo}} liiska kuwii dhowaan la isticmaalay",
- "urlAccessibility": "URL-ka codsiga isku-darka ee GitHub",
- "clearLink": "Ka saar xiriiriyaha codsiga isku-darka",
- "pasteLink": "Ku dheji xiriiriyaha codsiga isku-darka",
+ "urlAccessibility": "Geli URL-ka PR ama merge request",
+ "urlPlaceholder": "URL-ka PR ama merge request",
+ "openAccessibility": "Fur PR ama merge request",
+ "clearLink": "Ka saar xiriiriyaha",
+ "pasteLink": "Ku dheji xiriiriyaha PR ama merge request",
"open": "Furan"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Xiriirka GitHub lama hubin karin.",
"checkFailedMessage": "Xaaladda soo gelitaanka lama heli karo ilaa tan la soo raro.",
+ "checkFailedTitleGitLab": "Xiriirka GitLab lama hubin karin.",
+ "checkFailedTitleBitbucket": "Xiriirka Bitbucket lama hubin karin.",
+ "providerCheckFailedMessage": "Xaaladda xiriirka ma muuqato inta la soo dhacayo.",
"reconnectTitle": "Dib u xir GitHub",
"reconnectDescription": "Oggolaanshaha xiriirkaaga GitHub waa lagala noqday. Dib u xir si aad taleefanka uga sii waddo dib-u-eegista codsiyada isku-darka.",
- "description": "Ku xir akoonkaaga GitHub si aad taleefanka uga eegto codsiyada isku-darka."
+ "description": "Ku xir akoonkaaga GitHub si aad taleefanka uga eegto codsiyada isku-darka.",
+ "gitlabDescription": "Ku xir xisaabtaada GitLab si aad mobilka ugu eegto merge request-yada.",
+ "bitbucketDescription": "Bitbucket ku xir hay'addan si aad mobilka ugu eegto PR-yada.",
+ "bitbucketOrgOnlyDescription": "Ka dooro hay'ad profile-kaaga si aad ugu eegto PR-yada Bitbucket ee hay'addaas."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Muddadii xiriirka GitHub way dhammaatay.",
- "message": "Xiriirkaaga GitHub hadda ma ansaxsana. Mar kale hubi xiriirkaaga — waxaa lagu weydiin doonaa inaad dib u xirto haddii loo baahdo."
+ "message": "Xiriirkaaga GitHub hadda ma ansaxsana. Mar kale hubi xiriirkaaga — waxaa lagu weydiin doonaa inaad dib u xirto haddii loo baahdo.",
+ "gitlabTitle": "Muddadii xiriirka GitLab way dhammaatay.",
+ "bitbucketTitle": "Muddadii xiriirka Bitbucket way dhammaatay.",
+ "providerMessage": "Xiriirkaaga {{provider}} hadda ma ansaxsana. Mar kale hubi xiriirkaaga — waxaa lagu weydiin doonaa inaad dib u xirto haddii loo baahdo."
},
"eventChips": {
"comment": "Faallo",
@@ -643,6 +679,21 @@
"files": "Faylal",
"discussion": "Dood"
},
+ "terms": {
+ "pullRequest": "Codsi isku-darid",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "La wadaag merge request-ka",
+ "viewOnProvider": "Kasoo eeg {{provider}}",
+ "mergeRequestUnavailable": "Merge request-ka lama heli karo",
+ "unavailableDescription": "Waa laga yaabaa in la tirtiray, ama inadan helin ogolaansho.",
+ "accessDeniedMergeRequest": "Ma haysatid oggolaansho aad ku aragto merge request-kan.",
+ "couldNotLoadMergeRequest": "Merge request-ka lama soo rari karin.",
+ "discussionAccessDenied": "Ma haysatid oggolaansho aad ku aragto doodda merge request-kan.",
+ "discussionUnavailableMessage": "Waxaa laga yaabaa in merge request-kan la saaray.",
+ "noDiscussionDescription": "Merge request-kan kuma jiraan dooddo dib-u-eegis ama faallooyin wada hadal.",
+ "noFilesChangedDescription": "Merge request-kan kuma jiraan isbeddello faylal."
+ },
"fileStatus": {
"modified": "Waa la beddelay",
"renamed": "Magaca ayaa la beddelay",
@@ -659,7 +710,7 @@
"emptyLine": "(madhan)"
},
"linkPasteClipboardEmpty": "Sabuuradda nuqulladu waa madhan tahay.",
- "linkPasteNotAPullRequest": "Kani ma aha xiriiriye codsi isku-dar oo GitHub ah.",
+ "linkPasteNotAPullRequest": "Kani ma aha xiriiriye PR ama merge request ah",
"announce": {
"commentPosted": "Faallada waa la daabacay",
"reviewSubmitted": "Dib-u-eegista waa la gudbiyay",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Faalladan lama daabici karo. Waxaa laga yaabaa in sadarka la doortay la beddelay ama PR-ka la cusboonaysiiyay.",
"reviewNotSubmitted": "Dib-u-eegistan lama gudbin karo sida ay tahay. Waxaa laga yaabaa in PR-ka la beddelay ama inaadan dib u eegi karin codsigaaga isku-darka.",
+ "reviewNotSubmittedTerm": "Dib-u-eegistan laguma diri karo sida uu yahay. {{term}} waa la yaabaa inuu isbeddelay, ama ma dib-u-eegi kartid {{term}} kaa ah.",
"couldNotPostComment": "Faallada lama daabici karin.",
"couldNotSubmitReview": "Dib-u-eegista lama gudbin karin. Hubi xiriirkaaga oo mar kale isku day."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Lama jawaabi karin.",
"couldNotCompleteAction": "Falkan lama dhammayn karin.",
"mergeResultDefaultError": "GitHub ma dhammaystirin isku-darka.",
+ "mergeResultNotCompleted": "{{term}} lama isku darin. Xaaladdiisa hubi kadibna mar kale isku day.",
"ambiguous": "Lama xaqiijin karin — hubi PR-ka ka hor intaadan mar kale isku dayin.",
"persistenceFailed": "Falkan lama diiwaangelin karin. Fadlan mar kale isku day waqti dambe.",
"forbidden": "Lama oggola."
@@ -1988,11 +2041,31 @@
"retryConnection": "Mar kale isku day inaad ku xirmato"
},
"newSession": {
+ "recentlyUsed": "Dhawaan la isticmaalay",
+ "couldNotLoadGithubRepositories": "Kaydadka GitHub lama soo shubi karin.",
+ "couldNotLoadGitlabRepositories": "Kaydadka GitLab lama soo shubi karin.",
+ "couldNotLoadBitbucketRepositories": "Kaydadka Bitbucket lama soo shubi karin.",
"connectGithubDescription": "GitHub ku xiriiri biraawsarkaaga, ka dibna halkan ku soo noqo si aad kayd u doorato.",
+ "connectGitlabDescription": "GitLab ku xiriiri biraawsarkaaga, ka dibna halkan ku soo noqo si aad kayd u doorato.",
+ "connectBitbucketDescription": "Bitbucket ku xiriiri biraawsarkaaga, ka dibna halkan ku soo noqo si aad kayd u doorato.",
"openGithub": "Fur GitHub",
+ "openGitlab": "Fur GitLab",
+ "openBitbucket": "Fur Bitbucket",
"refreshRepositories": "Cusboonaysii kaydadka",
"githubConnected": "GitHub waa la xiriiriyay",
+ "gitlabConnected": "GitLab waa la xiriiriyay",
"noRepositoriesVisible": "Ma jiraan kaydad muuqda. Hubi in barnaamijka Kilo GitHub uu geli karo kaydadka, ka dibna cusboonaysii.",
+ "noRepositoriesVisibleGitlab": "Ma jiraan kaydad muuqda. Hubi oggolaanshaha gelitaanka kaydadka GitLab, ka dibna cusboonaysii.",
+ "noRepositoriesVisibleBitbucket": "Ma jiraan kaydad muuqda. Hubi oggolaanshaha gelitaanka kaydadka Bitbucket, ka dibna cusboonaysii.",
+ "bitbucketOrganizationsOnly": "Bitbucket waxa uu u helan yahay hay'adaha oo keliya.",
+ "branchPickerTitle": "Dooro laan",
+ "branchDefault": "Aasaasi",
+ "branchAccessibility": "Laan: {{label}}",
+ "branchLoading": "Laamaha soo dhacaya",
+ "branchLoadError": "Laamaha lama soo dejin karin",
+ "branchUnavailable": "Laamo kuma jiraan kaydkan. Xiriirkaaga bixiyaha hubi, kadibna dooro kayd kale.",
+ "branchEmpty": "Laamo la heli karo ma jiraan",
+ "branchPlaceholder": "Dooro laan",
"runOnWithTarget": "Ku socodsii: {{target}}",
"environment": "Deegaanka",
"couldNotLoadEnvironment": "Deegaankaaga lama soo shubi karin.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Kaydadka lama cusboonaysiin karin. Fadlan mar kale isku day.",
"discardDraftTitle": "Ma tirtiraysaa qabyada?",
"discardDraftMessage": "Tilmaantaadu way lumi doontaa.",
+ "discardWithUploadsMessage": "Tilmaantaada iyo faylasha la gudbiyay ee aan weli la isticmaalin waa la tirtiri doonaa.",
"discardFailed": "Qabyada lama tirtiri karin. Fadlan mar kale isku day.",
"remoteHint": "Ku socodsii `kilo remote` kombiyuutarkaaga, ama `/remote` kalfadhi CLI oo socda, si aad u maamusho hawl kilo oo kombiyuutarkaaga ka socota.",
- "connectBitbucketDescription": "Bitbucket ku xiriiri biraawsarkaaga, ka dibna halkan ku soo noqo si aad kayd u doorato.",
- "connectGitlabDescription": "GitLab ku xiriiri biraawsarkaaga, ka dibna halkan ku soo noqo si aad kayd u doorato.",
- "couldNotLoadBitbucketRepositories": "Kaydadka Bitbucket lama soo shubi karin.",
- "couldNotLoadGithubRepositories": "Kaydadka GitHub lama soo shubi karin.",
- "couldNotLoadGitlabRepositories": "Kaydadka GitLab lama soo shubi karin.",
- "gitlabConnected": "GitLab waa la xiriiriyay",
- "noRepositoriesVisibleBitbucket": "Ma jiraan kaydad muuqda. Hubi oggolaanshaha gelitaanka kaydadka Bitbucket, ka dibna cusboonaysii.",
- "noRepositoriesVisibleGitlab": "Ma jiraan kaydad muuqda. Hubi oggolaanshaha gelitaanka kaydadka GitLab, ka dibna cusboonaysii.",
- "openBitbucket": "Fur Bitbucket",
- "openGitlab": "Fur GitLab",
- "recentlyUsed": "Dhawaan la isticmaalay",
"continueFrom": "Waxaa la sii wadaa {{title}}.",
"importingSession": "Kalfadhiga waa la soo gelinayaa",
"cliCannotContinue": "CLI-kan ma sii wadi karo kalfadhi. Dooro Cloud Agent ama CLI kale.",
- "importFailed": "Kalfadhigan lama soo gelin karin.",
- "discardWithUploadsMessage": "Tilmaantaada iyo faylasha la gudbiyay ee aan weli la isticmaalin waa la tirtiri doonaa."
+ "importFailed": "Kalfadhigan lama soo gelin karin."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} fayl ayaa la cusboonaysiiyay.",
diff --git a/apps/mobile/src/i18n/locales/sq.json b/apps/mobile/src/i18n/locales/sq.json
index 48dba9f42b..a7f9a52482 100644
--- a/apps/mobile/src/i18n/locales/sq.json
+++ b/apps/mobile/src/i18n/locales/sq.json
@@ -36,6 +36,7 @@
"cost": "Kostoja",
"discard": "Mos ruaj",
"findings": "Gjetjet",
+ "mergeRequest": "kërkesë integrimi",
"notConnected": "Pa lidhje",
"notifications": "Njoftimet",
"pullRequest": "kërkesë bashkimi",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Rresht bosh në pamjen e ndryshimeve"
},
"connectionExpired": "Lidhja me GitHub skadoi.",
+ "capabilities": {
+ "banner": {
+ "title": "Nuk është e disponueshme te ky ofrues",
+ "accessibility": "Nuk është e disponueshme te ky ofrues: {{reason}}"
+ }
+ },
"merge": {
"merge": "Bashkimi",
"mergeNow": "Bashko tani",
"mergePullRequest": "Bashkimi i kërkesës",
+ "mergeTermTitle": "Bashko {{term}}",
"enableAutoMerge": "Aktivizo bashkimin automatik",
"disableAutoMerge": "Çaktivizo bashkimin automatik",
"autoMergeOn": "Bashkimi automatik është aktiv",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Fshi degën pas bashkimit",
"noEnabledMethods": "Kjo depo nuk ka asnjë metodë bashkimi të aktivizuar. Kërkoji një administratori të depos të aktivizojë bashkimin e zakonshëm, bashkimin me ngjeshje ose bashkimin me ribazim.",
"confirmTitle": "Të bashkohet kërkesa?",
+ "confirmTitleTerm": "Të bashkohet {{term}}?",
"confirmMessage": "Kjo do t'i bashkojë ndryshimet e tua me degën bazë.",
"enableAutoMergeConfirmTitle": "Të aktivizohet bashkimi automatik?",
"enableAutoMergeConfirmMessage": "GitHub do ta bashkojë këtë kërkesë automatikisht kur të kalojnë të gjitha kontrollet e detyrueshme.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} do të bashkohet automatikisht sapo pipeline-i të japë sukses.",
+ "enableAutoMergeDescriptionTerm": "GitLab e bashkon këtë {{term}} automatikisht sapo pipeline-i të japë sukses.",
"forbidden": "Nuk ke leje për ta bashkuar këtë kërkesë.",
"cannotMerge": "Kjo kërkesë për bashkim nuk mund të bashkohet në gjendjen aktuale.",
"couldNotMerge": "Kërkesa nuk u bashkua.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Tashmë e bashkuar",
- "closed": "Kjo kërkesë për bashkim është mbyllur"
+ "closed": "Kjo kërkesë për bashkim është mbyllur",
+ "closedMergeRequest": "Kjo kërkesë integrimi është mbyllur"
},
"partialSuccessBanner": {
"body": "Dega nuk u fshi: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Kjo kërkesë ende nuk mund të bashkohet",
"notMergeableDetail": "GitHub raportoi gjendjen {{state}} për mundësinë e bashkimit."
},
+ "restrictions": {
+ "title": "Kufizime bashkimi",
+ "approvalsRequired_one": "Kërkohet {{displayCount}} miratim",
+ "approvalsRequired_other": "Kërkohen {{displayCount}} miratime",
+ "pipelineMustSucceed": "Pipeline-i duhet të japë sukses përpara bashkimit."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline-i dështon te depozitimi i fundit.",
+ "pendingPipeline": "Pipeline-i ende ekzekutohet te depozitimi i fundit.",
+ "permission": "Nuk ke leje për ta bashkuar këtë {{term}}.",
+ "draft": "Shëno {{term}} si gati për rishikim përpara se ta bashkosh."
+ },
"methodLabels": {
"merge": "Krijo një depozitim bashkimi",
"squash": "Ngjesh dhe bashko",
@@ -448,6 +472,7 @@
"acceptTerms": "Prano",
"replyBadRequest": "Kjo përgjigje nuk mund të postohet. Diskutimi mund të ketë ndryshuar.",
"replyForbidden": "Nuk ke leje të përgjigjesh në këtë kërkesë për bashkim.",
+ "replyForbiddenTerm": "Nuk ke leje të përgjigjesh në këtë {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Ky koment nuk mund të raportohet.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Rishiko kërkesën për bashkim",
"headLine": "{{counts}} · depozitimi i fundit {{sha}}",
"entry": {
- "eyebrow": "Hap një kërkesë për bashkim përmes URL-së.",
- "pastePrLink": "Ngjit lidhjen e një PR-je",
- "noRecentPrs": "Asnjë PR e hapur së fundmi",
- "noRecentPrsDescription": "Ngjit lidhjen e një PR-je më sipër për të nisur rishikimin. PR-ja do të shfaqet këtu herën tjetër.",
+ "eyebrow": "Hap një kërkesë për bashkim ose kërkesë integrimi përmes URL-së",
+ "pastePrLink": "Ngjit lidhjen e një kërkeze për bashkim ose kërkeze integrimi",
+ "noRecentPrs": "Asnjë rishikim i fundit",
+ "noRecentPrsDescription": "Ngjit një lidhje më sipër për të filluar një rishikim — do të shfaqet këtu herën tjetër.",
"couldNotLoad": "Ngarkimi dështoi.",
"removeFromRecentsTitle": "Të hiqet nga lista e fundit?",
- "removeFromRecentsMessage": "Kjo kërkesë për bashkim do të hiqet nga lista e kërkesave që ke hapur së fundmi.",
+ "removeFromRecentsMessage": "Ky rishikim do të hiqet nga lista jote e të fundmëve.",
"removeRecentAccessibility": "Hiq {{repo}} nga lista e fundit",
- "urlAccessibility": "URL-ja e kërkesës për bashkim në GitHub",
- "clearLink": "Pastro lidhjen e kërkesës për bashkim",
- "pasteLink": "Ngjit lidhjen e kërkesës për bashkim",
+ "urlAccessibility": "Jep URL-në e një kërkeze për bashkim ose kërkeze integrimi",
+ "urlPlaceholder": "URL e kërkesës për bashkim ose e kërkesës së integrimit",
+ "openAccessibility": "Hap një kërkesë për bashkim ose kërkesë integrimi",
+ "clearLink": "Pastro lidhjen",
+ "pasteLink": "Ngjit lidhjen e kërkesës për bashkim ose kërkesës së integrimit",
"open": "Hapje"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Nuk u kontrollua lidhja me GitHub.",
"checkFailedMessage": "Statusi i hyrjes nuk është i disponueshëm derisa të ngarkohet ky informacion.",
+ "checkFailedTitleGitLab": "Nuk u kontrollua lidhja me GitLab.",
+ "checkFailedTitleBitbucket": "Nuk u kontrollua lidhja me Bitbucket.",
+ "providerCheckFailedMessage": "Gjendja e lidhjes nuk është e disponueshme derisa të ngarkohet.",
"reconnectTitle": "Rilidhu me GitHub",
"reconnectDescription": "Lidhja jote me GitHub është revokuar. Rilidhu për të vazhduar rishikimin e kërkesave për bashkim në telefon.",
- "description": "Lidh llogarinë tënde të GitHub për të rishikuar kërkesat për bashkim në telefon."
+ "description": "Lidh llogarinë tënde të GitHub për të rishikuar kërkesat për bashkim në telefon.",
+ "gitlabDescription": "Lidho llogarinë tënde GitLab për të rishikuar kërkesat e integrimit në celular.",
+ "bitbucketDescription": "Lidho Bitbucket me këtë organizatë për të rishikuar kërkesat për bashkim në celular.",
+ "bitbucketOrgOnlyDescription": "Përzgjidh një organizatë në profilin tënd për të rishikuar kërkesat e saj për bashkim në Bitbucket."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Lidhja me GitHub skadoi.",
- "message": "Lidhja jote me GitHub nuk është më e vlefshme. Rikontrollo lidhjen — do të të kërkohet të rilidhesh nëse është e nevojshme."
+ "message": "Lidhja jote me GitHub nuk është më e vlefshme. Rikontrollo lidhjen — do të të kërkohet të rilidhesh nëse është e nevojshme.",
+ "gitlabTitle": "Lidhja me GitLab skadoi.",
+ "bitbucketTitle": "Lidhja me Bitbucket skadoi.",
+ "providerMessage": "Lidhja jote me {{provider}} nuk është më e vlefshme. Rikontrollo lidhjen — do të të kërkohet të rilidhesh nëse është e nevojshme."
},
"eventChips": {
"comment": "Koment",
@@ -643,6 +679,21 @@
"files": "Skedarë",
"discussion": "Diskutimi"
},
+ "terms": {
+ "pullRequest": "Kërkesë bashkimi",
+ "mergeRequest": "Kërkesë integrimi",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Ndaj kërkesën e integrimit",
+ "viewOnProvider": "Shih te {{provider}}",
+ "mergeRequestUnavailable": "Kërkesa e integrimit nuk është e disponueshme",
+ "unavailableDescription": "Mbase është fshirë, ose mbase nuk ke akses për të.",
+ "accessDeniedMergeRequest": "Nuk ke leje për ta parë këtë kërkesë integrimi.",
+ "couldNotLoadMergeRequest": "Nuk u ngarkua kërkesa e integrimit.",
+ "discussionAccessDenied": "Nuk ke leje për ta parë diskutimin e kësaj kërkeze integrimi.",
+ "discussionUnavailableMessage": "Kjo kërkesë integrimi mund të jetë hequr.",
+ "noDiscussionDescription": "Nuk ka diskutime rishikimi ose komente bisede në këtë kërkesë integrimi.",
+ "noFilesChangedDescription": "Kjo kërkesë integrimi nuk përmban ndryshime në skedarë."
+ },
"fileStatus": {
"modified": "I modifikuar",
"renamed": "I riemërtuar",
@@ -659,7 +710,7 @@
"emptyLine": "(bosh)"
},
"linkPasteClipboardEmpty": "Kujtesa e kopjimit është bosh.",
- "linkPasteNotAPullRequest": "Kjo nuk është lidhje e një kërkese për bashkim në GitHub.",
+ "linkPasteNotAPullRequest": "Kjo nuk është lidhje për një kërkesë për bashkim ose kërkesë integrimi",
"announce": {
"commentPosted": "Komenti u postua",
"reviewSubmitted": "Rishikimi u dërgua",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Ky koment nuk mund të postohet. Rreshti i përzgjedhur mund të ketë ndryshuar ose PR-ja mund të jetë përditësuar.",
"reviewNotSubmitted": "Ky rishikim nuk mund të dërgohet në gjendjen aktuale. PR-ja mund të ketë ndryshuar ose nuk lejohet të rishikosh kërkesën tënde për bashkim.",
+ "reviewNotSubmittedTerm": "Ky rishikim nuk mund të dërgohet siç është. Mbase {{term}} ka ndryshuar, ose nuk mund të rishikosh {{term}} tënde.",
"couldNotPostComment": "Nuk u arrit të postohej komenti.",
"couldNotSubmitReview": "Nuk u dërgua rishikimi. Kontrollo lidhjen dhe provo përsëri."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Përgjigjja nuk u dërgua.",
"couldNotCompleteAction": "Nuk u arrit të përfundohej ky veprim.",
"mergeResultDefaultError": "GitHub nuk e përfundoi bashkimin.",
+ "mergeResultNotCompleted": "{{term}} nuk u bashkua. Kontrollo gjendjen dhe provo përsëri.",
"ambiguous": "Nuk u konfirmua — kontrollo PR-në përpara se të provosh përsëri.",
"persistenceFailed": "Nuk arritëm ta regjistronim këtë veprim. Provo përsëri më vonë.",
"forbidden": "Ky veprim nuk lejohet."
@@ -1988,11 +2041,31 @@
"retryConnection": "Provo të lidhesh përsëri"
},
"newSession": {
+ "recentlyUsed": "Të përdorura së fundmi",
+ "couldNotLoadGithubRepositories": "Nuk u ngarkuan depot nga GitHub.",
+ "couldNotLoadGitlabRepositories": "Nuk u ngarkuan depot nga GitLab.",
+ "couldNotLoadBitbucketRepositories": "Nuk u ngarkuan depot nga Bitbucket.",
"connectGithubDescription": "Lidh llogarinë e GitHub në shfletuesin tënd, pastaj kthehu këtu për të zgjedhur një depo.",
+ "connectGitlabDescription": "Lidh llogarinë e GitLab në shfletuesin tënd, pastaj kthehu këtu për të zgjedhur një depo.",
+ "connectBitbucketDescription": "Lidh llogarinë e Bitbucket në shfletuesin tënd, pastaj kthehu këtu për të zgjedhur një depo.",
"openGithub": "Hap GitHub",
+ "openGitlab": "Hap GitLab",
+ "openBitbucket": "Hap Bitbucket",
"refreshRepositories": "Rifresko depot",
"githubConnected": "GitHub i lidhur",
+ "gitlabConnected": "GitLab i lidhur",
"noRepositoriesVisible": "Nuk shfaqet asnjë depo. Kontrollo qasjen në depo për aplikacionin Kilo në GitHub, pastaj rifresko.",
+ "noRepositoriesVisibleGitlab": "Nuk shfaqet asnjë depo. Kontrollo qasjen në depo për GitLab, pastaj rifresko.",
+ "noRepositoriesVisibleBitbucket": "Nuk shfaqet asnjë depo. Kontrollo qasjen në depo për Bitbucket, pastaj rifresko.",
+ "bitbucketOrganizationsOnly": "Bitbucket është i disponueshëm vetëm për organizata.",
+ "branchPickerTitle": "Përzgjidh degën",
+ "branchDefault": "Parazgjedhje",
+ "branchAccessibility": "Dega: {{label}}",
+ "branchLoading": "Degët po ngarkohen",
+ "branchLoadError": "Degët nuk u ngarkuan dot",
+ "branchUnavailable": "Nuk ka degë të disponueshme për këtë depo. Kontrollo aksesin tënd te ofruesi, pastaj përzgjidh një depo tjetër.",
+ "branchEmpty": "Nuk ka degë të disponueshme",
+ "branchPlaceholder": "Përzgjidh një degë",
"runOnWithTarget": "Ekzekuto në: {{target}}",
"environment": "Mjedisi",
"couldNotLoadEnvironment": "Nuk u ngarkua mjedisi yt.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Nuk u rifreskuan depot. Provo përsëri.",
"discardDraftTitle": "Të fshihet drafti?",
"discardDraftMessage": "Kërkesa jote do të humbasë.",
+ "discardWithUploadsMessage": "Kërkesa jote dhe skedarët e ngarkuar që nuk janë bashkëngjitur në mesazhet e dërguara do të fshihen.",
"discardFailed": "Nuk u fshi drafti. Provo përsëri.",
"remoteHint": "Ekzekuto `kilo remote` në kompjuterin tënd ose `/remote` në një seancë aktive CLI për të kontrolluar një proces lokal kilo.",
- "connectBitbucketDescription": "Lidh llogarinë e Bitbucket në shfletuesin tënd, pastaj kthehu këtu për të zgjedhur një depo.",
- "connectGitlabDescription": "Lidh llogarinë e GitLab në shfletuesin tënd, pastaj kthehu këtu për të zgjedhur një depo.",
- "couldNotLoadBitbucketRepositories": "Nuk u ngarkuan depot nga Bitbucket.",
- "couldNotLoadGithubRepositories": "Nuk u ngarkuan depot nga GitHub.",
- "couldNotLoadGitlabRepositories": "Nuk u ngarkuan depot nga GitLab.",
- "gitlabConnected": "GitLab i lidhur",
- "noRepositoriesVisibleBitbucket": "Nuk shfaqet asnjë depo. Kontrollo qasjen në depo për Bitbucket, pastaj rifresko.",
- "noRepositoriesVisibleGitlab": "Nuk shfaqet asnjë depo. Kontrollo qasjen në depo për GitLab, pastaj rifresko.",
- "openBitbucket": "Hap Bitbucket",
- "openGitlab": "Hap GitLab",
- "recentlyUsed": "Të përdorura së fundmi",
"continueFrom": "Po vazhdon seanca {{title}}.",
"importingSession": "Duke importuar seancën",
"cliCannotContinue": "Ky CLI nuk mund të vazhdojë një seancë. Zgjidh Cloud Agent ose një CLI tjetër.",
- "importFailed": "Nuk u arrit të importohej kjo seancë.",
- "discardWithUploadsMessage": "Kërkesa jote dhe skedarët e ngarkuar që nuk janë bashkëngjitur në mesazhet e dërguara do të fshihen."
+ "importFailed": "Nuk u arrit të importohej kjo seancë."
},
"partRenderer": {
"updatedFileCount_one": "U përditësua {{displayCount}} skedar.",
diff --git a/apps/mobile/src/i18n/locales/sr.json b/apps/mobile/src/i18n/locales/sr.json
index 3d6ce21f60..e7f399e773 100644
--- a/apps/mobile/src/i18n/locales/sr.json
+++ b/apps/mobile/src/i18n/locales/sr.json
@@ -36,6 +36,7 @@
"cost": "Trošak",
"discard": "Odbaci",
"findings": "Nalazi",
+ "mergeRequest": "merge request",
"notConnected": "Nepovezano",
"notifications": "Obaveštenja",
"pullRequest": "pR",
@@ -342,10 +343,17 @@
"emptyDiffRow": "Prazan red u prikazu izmena"
},
"connectionExpired": "Veza sa GitHub nalogom je istekla.",
+ "capabilities": {
+ "banner": {
+ "title": "Nije dostupno kod ovog pružaoca usluga",
+ "accessibility": "Nije dostupno kod ovog pružaoca usluga: {{reason}}"
+ }
+ },
"merge": {
"merge": "Spajanje",
"mergeNow": "Spoji sada",
"mergePullRequest": "Spajanje zahteva",
+ "mergeTermTitle": "Spoji {{term}}",
"enableAutoMerge": "Uključi automatsko spajanje",
"disableAutoMerge": "Isključi automatsko spajanje",
"autoMergeOn": "Automatsko spajanje je uključeno",
@@ -364,9 +372,12 @@
"deleteBranchAfterMerge": "Obriši granu nakon spajanja",
"noEnabledMethods": "U ovom repozitorijumu nije omogućena nijedna metoda spajanja. Zamoli administratora repozitorijuma da omogući spajanje uz novi komit, objedinjavanje komita ili prebaziranje.",
"confirmTitle": "Spojiti zahtev?",
+ "confirmTitleTerm": "Spojiti {{term}}?",
"confirmMessage": "Tvoje izmene će se spojiti u osnovnu granu.",
"enableAutoMergeConfirmTitle": "Uključiti automatsko spajanje?",
"enableAutoMergeConfirmMessage": "GitHub će automatski spojiti ovaj zahtev kada sve obavezne provere prođu.",
+ "enableAutoMergeConfirmMessageTerm": "Kada pipeline uspe, {{term}} će se automatski spojiti.",
+ "enableAutoMergeDescriptionTerm": "GitLab automatski spaja ovaj {{term}} kada pipeline uspe.",
"forbidden": "Nemaš dozvolu da spojiš ovaj zahtev.",
"cannotMerge": "Ovaj zahtev za spajanje nije moguće spojiti u trenutnom stanju.",
"couldNotMerge": "Nije moguće spojiti zahtev.",
@@ -377,7 +388,8 @@
},
"terminal": {
"alreadyMerged": "Već spojeno",
- "closed": "Zahtev za spajanje je zatvoren"
+ "closed": "Zahtev za spajanje je zatvoren",
+ "closedMergeRequest": "Ovaj merge request je zatvoren"
},
"partialSuccessBanner": {
"body": "Nije moguće obrisati granu: {{reason}}.",
@@ -403,6 +415,19 @@
"notMergeableTitle": "Ovaj zahtev još nije moguće spojiti",
"notMergeableDetail": "GitHub je prijavio sledeće stanje spajanja: {{state}}."
},
+ "restrictions": {
+ "title": "Ograničenja spajanja",
+ "approvalsRequired_one": "Potrebno je {{displayCount}} odobrenje",
+ "approvalsRequired_other": "Potrebno je {{displayCount}} odobrenja",
+ "pipelineMustSucceed": "Pre spajanja pipeline mora uspeti.",
+ "approvalsRequired_few": "Potrebna su {{displayCount}} odobrenja"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline ne uspeva na poslednjem commitu.",
+ "pendingPipeline": "Pipeline je još u toku na poslednjem commitu.",
+ "permission": "Nemaš dozvolu da spojiš ovaj {{term}}.",
+ "draft": "Pre spajanja označi {{term}} kao spreman za pregled."
+ },
"methodLabels": {
"merge": "Napravi komit spajanja",
"squash": "Objedini komite i spoji",
@@ -450,6 +475,7 @@
"acceptTerms": "Prihvati",
"replyBadRequest": "Ovaj odgovor se ne može objaviti. Nit se možda promenila.",
"replyForbidden": "Nemaš dozvolu da odgovoriš na ovaj zahtev za spajanje.",
+ "replyForbiddenTerm": "Nemaš dozvolu da odgovoriš na ovaj {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Ovaj komentar se ne može prijaviti.",
@@ -481,8 +507,6 @@
"termsAcceptRequired": "Za objavljivanje moraš da prihvatiš uslove korišćenja.",
"termsOutdatedCopy": "Uslovi korišćenja su izmenjeni. Ponovo otvori ovaj ekran da prihvatiš najnoviju verziju.",
"termsCheckRetryCopy": "Nije moguće proveriti uslove korišćenja. Proveri vezu i pokušaj ponovo.",
- "comment_few": "{{displayCount}} komentara",
- "reaction_few": "reakcije",
"reactions": {
"thumbsUp": "Palac gore",
"thumbsDown": "Palac dole",
@@ -500,7 +524,9 @@
"outdatedOnLines": "Zastarelo na {{lines}}",
"outdatedOnPath": "Zastarelo na {{path}}"
},
- "deletedUser": "obrisani korisnik"
+ "deletedUser": "obrisani korisnik",
+ "comment_few": "{{displayCount}} komentara",
+ "reaction_few": "reakcije"
},
"couldNotOpenGitHubAppSettings": "Nije moguće otvoriti podešavanja GitHub aplikacije.",
"installKiloGitHubApp": "Instaliraj aplikaciju Kilo za GitHub",
@@ -512,17 +538,19 @@
"reviewPullRequest": "Pregledaj zahtev za spajanje",
"headLine": "{{counts}} · poslednji komit {{sha}}",
"entry": {
- "eyebrow": "Otvori zahtev za spajanje pomoću URL-a.",
- "pastePrLink": "Nalepi vezu do PR-a",
- "noRecentPrs": "Nema skorašnjih PR-ova",
- "noRecentPrsDescription": "Nalepi vezu do PR-a iznad da započneš pregled — sledeći put će se pojaviti ovde.",
+ "eyebrow": "Otvori zahtev za spajanje ili merge request pomoću URL-a",
+ "pastePrLink": "Nalepi vezu do zahteva za spajanje ili merge requesta",
+ "noRecentPrs": "Nema skorašnjih pregleda",
+ "noRecentPrsDescription": "Da započnete pregled, nalepite vezu gore — sledeći put će se pojaviti ovde.",
"couldNotLoad": "Učitavanje nije uspelo.",
"removeFromRecentsTitle": "Ukloniti sa spiska nedavnih zahteva?",
- "removeFromRecentsMessage": "Ovaj zahtev za spajanje će biti uklonjen sa tvog spiska nedavnih zahteva.",
+ "removeFromRecentsMessage": "Ovaj pregled će biti uklonjen iz skorašnjih.",
"removeRecentAccessibility": "Ukloni {{repo}} sa spiska nedavnih zahteva",
- "urlAccessibility": "URL zahteva za spajanje na GitHub-u",
- "clearLink": "Obriši vezu do zahteva za spajanje",
- "pasteLink": "Nalepi vezu do zahteva za spajanje",
+ "urlAccessibility": "Unesite URL zahteva za spajanje ili merge requesta",
+ "urlPlaceholder": "URL zahteva za spajanje ili merge requesta",
+ "openAccessibility": "Otvori zahtev za spajanje ili merge request",
+ "clearLink": "Obriši vezu",
+ "pasteLink": "Nalepi vezu do zahteva za spajanje ili merge requesta",
"open": "Otvori"
},
"checks": {
@@ -571,9 +599,15 @@
"connect": {
"checkFailedTitle": "Nije moguće proveriti vezu sa GitHub-om.",
"checkFailedMessage": "Status prijave nije dostupan dok se ovo ne učita.",
+ "checkFailedTitleGitLab": "Nije moguće proveriti vezu sa GitLab-om.",
+ "checkFailedTitleBitbucket": "Nije moguće proveriti vezu sa Bitbucket-om.",
+ "providerCheckFailedMessage": "Status veze nije dostupan dok se ovo ne učita.",
"reconnectTitle": "Ponovo poveži GitHub",
"reconnectDescription": "Tvoja veza sa GitHub-om je opozvana. Ponovo se poveži da nastaviš da pregledaš zahteve za spajanje na telefonu.",
- "description": "Poveži svoj GitHub nalog da pregledaš zahteve za spajanje na telefonu."
+ "description": "Poveži svoj GitHub nalog da pregledaš zahteve za spajanje na telefonu.",
+ "gitlabDescription": "Poveži svoj GitLab nalog da pregledaš merge requeste na telefonu.",
+ "bitbucketDescription": "Poveži Bitbucket sa ovom organizacijom da pregledaš zahteve za spajanje na telefonu.",
+ "bitbucketOrgOnlyDescription": "Izaberi organizaciju u svom profilu da pregledaš njene zahteve za spajanje na Bitbucketu."
},
"screen": {
"title": "#{{number}}",
@@ -596,7 +630,10 @@
},
"reconnectNotice": {
"title": "Veza sa GitHub nalogom je istekla.",
- "message": "Tvoja veza sa GitHub-om više ne važi. Ponovo proveri vezu — po potrebi će se pojaviti zahtev za ponovno povezivanje."
+ "message": "Tvoja veza sa GitHub-om više ne važi. Ponovo proveri vezu — po potrebi će se pojaviti zahtev za ponovno povezivanje.",
+ "gitlabTitle": "Veza sa GitLab nalogom je istekla.",
+ "bitbucketTitle": "Veza sa Bitbucket nalogom je istekla.",
+ "providerMessage": "Tvoja veza sa {{provider}}-om više ne važi. Ponovo proveri vezu — po potrebi će se pojaviti zahtev za ponovno povezivanje."
},
"eventChips": {
"comment": "Komentariši",
@@ -650,6 +687,21 @@
"files": "Datoteke",
"discussion": "Diskusija"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Podeli merge request",
+ "viewOnProvider": "Pogledaj na {{provider}}",
+ "mergeRequestUnavailable": "Merge request nije dostupan",
+ "unavailableDescription": "Možda je obrisan ili nemaš pristup njemu.",
+ "accessDeniedMergeRequest": "Nemaš dozvolu da vidiš ovaj merge request.",
+ "couldNotLoadMergeRequest": "Nije moguće učitati merge request.",
+ "discussionAccessDenied": "Nemaš dozvolu da vidiš diskusiju o ovom merge requestu.",
+ "discussionUnavailableMessage": "Ovaj merge request je možda uklonjen.",
+ "noDiscussionDescription": "Ovaj merge request još nema niti pregleda ni komentara u diskusiji.",
+ "noFilesChangedDescription": "U ovom merge requestu nema izmena datoteka."
+ },
"fileStatus": {
"modified": "Izmenjeno",
"renamed": "Preimenovano",
@@ -666,7 +718,7 @@
"emptyLine": "(prazno)"
},
"linkPasteClipboardEmpty": "Ostava je prazna.",
- "linkPasteNotAPullRequest": "Ovo nije veza do zahteva za spajanje na GitHub-u.",
+ "linkPasteNotAPullRequest": "Ovo nije veza do zahteva za spajanje ili merge requesta",
"announce": {
"commentPosted": "Komentar objavljen",
"reviewSubmitted": "Pregled poslat",
@@ -675,6 +727,7 @@
"mutationError": {
"commentNotPosted": "Ovaj komentar nije moguće objaviti. Izabrani red je možda izmenjen ili je PR ažuriran.",
"reviewNotSubmitted": "Ovaj pregled nije moguće poslati u trenutnom obliku. PR je možda izmenjen ili pokušavaš da pregledaš sopstveni zahtev za spajanje.",
+ "reviewNotSubmittedTerm": "Ovaj pregled nije moguće poslati u trenutnom obliku. {{term}} je možda izmenjen ili ne možeš da pregledaš sopstveni {{term}}.",
"couldNotPostComment": "Komentar nije moguće objaviti.",
"couldNotSubmitReview": "Nije moguće poslati pregled. Proveri vezu i pokušaj ponovo."
},
@@ -682,6 +735,7 @@
"couldNotReply": "Nije moguće odgovoriti.",
"couldNotCompleteAction": "Nije moguće dovršiti ovu radnju.",
"mergeResultDefaultError": "GitHub nije završio spajanje.",
+ "mergeResultNotCompleted": "{{term}} nije spojen. Proveri njegovo stanje i pokušaj ponovo.",
"ambiguous": "Nije moguće potvrditi ishod — proveri PR pre ponovnog pokušaja.",
"persistenceFailed": "Nismo uspeli da zabeležimo ovu radnju. Pokušaj ponovo kasnije.",
"forbidden": "Pristup je zabranjen."
@@ -2004,11 +2058,31 @@
"retryConnection": "Pokušaj ponovo da se povežeš"
},
"newSession": {
+ "recentlyUsed": "Nedavno korišćeno",
+ "couldNotLoadGithubRepositories": "Učitavanje GitHub repozitorijuma nije uspelo.",
+ "couldNotLoadGitlabRepositories": "Učitavanje GitLab repozitorijuma nije uspelo.",
+ "couldNotLoadBitbucketRepositories": "Učitavanje Bitbucket repozitorijuma nije uspelo.",
"connectGithubDescription": "Poveži GitHub u pregledaču, a zatim se vrati ovde da izabereš repozitorijum.",
+ "connectGitlabDescription": "Poveži GitLab u pregledaču, a zatim se vrati ovde da izabereš repozitorijum.",
+ "connectBitbucketDescription": "Poveži Bitbucket u pregledaču, a zatim se vrati ovde da izabereš repozitorijum.",
"openGithub": "Otvori GitHub",
+ "openGitlab": "Otvori GitLab",
+ "openBitbucket": "Otvori Bitbucket",
"refreshRepositories": "Osveži repozitorijume",
"githubConnected": "GitHub povezan",
+ "gitlabConnected": "GitLab povezan",
"noRepositoriesVisible": "Nema vidljivih repozitorijuma. Proveri da li aplikacija Kilo GitHub ima pristup repozitorijumima, pa osveži spisak.",
+ "noRepositoriesVisibleGitlab": "Nema vidljivih repozitorijuma. Proveri pristup repozitorijumima na platformi GitLab, pa osveži spisak.",
+ "noRepositoriesVisibleBitbucket": "Nema vidljivih repozitorijuma. Proveri pristup repozitorijumima na platformi Bitbucket, pa osveži spisak.",
+ "bitbucketOrganizationsOnly": "Bitbucket je dostupan samo za organizacije.",
+ "branchPickerTitle": "Izaberi granu",
+ "branchDefault": "Podrazumevano",
+ "branchAccessibility": "Grana: {{label}}",
+ "branchLoading": "Učitavanje grana",
+ "branchLoadError": "Nije moguće učitati grane",
+ "branchUnavailable": "Grane nisu dostupne za ovaj repozitorijum. Proveri svoj pristup kod pružaoca usluge, pa izaberi drugi repozitorijum.",
+ "branchEmpty": "Nema dostupnih grana",
+ "branchPlaceholder": "Izaberi granu",
"runOnWithTarget": "Pokretanje na: {{target}}",
"environment": "Okruženje",
"couldNotLoadEnvironment": "Učitavanje tvog okruženja nije uspelo.",
@@ -2029,24 +2103,13 @@
"couldNotRefreshRepositories": "Osvežavanje repozitorijuma nije uspelo. Pokušaj ponovo.",
"discardDraftTitle": "Odbaciti nacrt?",
"discardDraftMessage": "Tvoj upit će biti obrisan.",
+ "discardWithUploadsMessage": "Tvoj upit i svi otpremljeni fajlovi koji nisu priloženi poslatim porukama biće obrisani.",
"discardFailed": "Odbacivanje nacrta nije uspelo. Pokušaj ponovo.",
"remoteHint": "Pokreni `kilo remote` na svom računaru ili `/remote` u aktivnoj CLI sesiji da upravljaš lokalnim procesom kilo.",
- "connectBitbucketDescription": "Poveži Bitbucket u pregledaču, a zatim se vrati ovde da izabereš repozitorijum.",
- "connectGitlabDescription": "Poveži GitLab u pregledaču, a zatim se vrati ovde da izabereš repozitorijum.",
- "couldNotLoadBitbucketRepositories": "Učitavanje Bitbucket repozitorijuma nije uspelo.",
- "couldNotLoadGithubRepositories": "Učitavanje GitHub repozitorijuma nije uspelo.",
- "couldNotLoadGitlabRepositories": "Učitavanje GitLab repozitorijuma nije uspelo.",
- "gitlabConnected": "GitLab povezan",
- "noRepositoriesVisibleBitbucket": "Nema vidljivih repozitorijuma. Proveri pristup repozitorijumima na platformi Bitbucket, pa osveži spisak.",
- "noRepositoriesVisibleGitlab": "Nema vidljivih repozitorijuma. Proveri pristup repozitorijumima na platformi GitLab, pa osveži spisak.",
- "openBitbucket": "Otvori Bitbucket",
- "openGitlab": "Otvori GitLab",
- "recentlyUsed": "Nedavno korišćeno",
- "cliCannotContinue": "Ovaj CLI ne može da nastavi sesiju. Izaberi Cloud Agent ili drugi CLI.",
"continueFrom": "Nastavlja se sesija {{title}}.",
- "importFailed": "Uvoz ove sesije nije uspeo.",
"importingSession": "Uvoz sesije",
- "discardWithUploadsMessage": "Tvoj upit i svi otpremljeni fajlovi koji nisu priloženi poslatim porukama biće obrisani."
+ "cliCannotContinue": "Ovaj CLI ne može da nastavi sesiju. Izaberi Cloud Agent ili drugi CLI.",
+ "importFailed": "Uvoz ove sesije nije uspeo."
},
"partRenderer": {
"updatedFileCount_one": "Ažuriran je {{displayCount}} fajl.",
diff --git a/apps/mobile/src/i18n/locales/sv.json b/apps/mobile/src/i18n/locales/sv.json
index 03a0873657..b205fed60d 100644
--- a/apps/mobile/src/i18n/locales/sv.json
+++ b/apps/mobile/src/i18n/locales/sv.json
@@ -36,6 +36,7 @@
"cost": "Kostnad",
"discard": "Kassera",
"findings": "Anmärkningar",
+ "mergeRequest": "merge request",
"notConnected": "Inte ansluten",
"notifications": "Aviseringar",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Tom diffrad"
},
"connectionExpired": "GitHub-anslutningen har upphört att gälla.",
+ "capabilities": {
+ "banner": {
+ "title": "Inte tillgänglig hos den här leverantören",
+ "accessibility": "Inte tillgänglig hos den här leverantören: {{reason}}"
+ }
+ },
"merge": {
"merge": "Sammanfogning",
"mergeNow": "Slå samman nu",
"mergePullRequest": "Slå samman PR",
+ "mergeTermTitle": "Slå samman {{term}}",
"enableAutoMerge": "Aktivera automatisk sammanslagning",
"disableAutoMerge": "Inaktivera automatisk sammanslagning",
"autoMergeOn": "Automatisk sammanslagning är aktiverad",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Ta bort grenen efter sammanslagning",
"noEnabledMethods": "Det här kodarkivet har inga aktiverade sammanslagningsmetoder. Be en administratör för kodarkivet att aktivera sammanslagning med en separat incheckning, hopslagning av incheckningar eller ombasering.",
"confirmTitle": "Slå samman PR:en?",
+ "confirmTitleTerm": "Slå samman {{term}}?",
"confirmMessage": "Dina ändringar slås samman med basgrenen.",
"enableAutoMergeConfirmTitle": "Aktivera automatisk sammanslagning?",
"enableAutoMergeConfirmMessage": "GitHub slår samman den här PR:en automatiskt när alla obligatoriska kontroller har godkänts.",
+ "enableAutoMergeConfirmMessageTerm": "När pipelinen lyckats slås {{term}} samman automatiskt.",
+ "enableAutoMergeDescriptionTerm": "GitLab slår ihop den här {{term}} automatiskt när pipelinen lyckats.",
"forbidden": "Du har inte behörighet att slå samman den här PR:en.",
"cannotMerge": "Den här PR:en kan inte slås samman i sitt nuvarande skick.",
"couldNotMerge": "Kunde inte slå samman PR:en.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Redan sammanslagen",
- "closed": "Den här PR:en är stängd"
+ "closed": "Den här PR:en är stängd",
+ "closedMergeRequest": "Den här merge requesten är stängd"
},
"partialSuccessBanner": {
"body": "Kunde inte ta bort grenen. Orsak: {{reason}}",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Den här PR:en kan inte slås samman ännu",
"notMergeableDetail": "GitHub rapporterade följande status för sammanslagningen: {{state}}."
},
+ "restrictions": {
+ "title": "Sammanslagningsbegränsningar",
+ "approvalsRequired_one": "{{displayCount}} godkännande krävs",
+ "approvalsRequired_other": "{{displayCount}} godkännanden krävs",
+ "pipelineMustSucceed": "Pipelinen måste lyckas innan sammanslagning."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipelinen misslyckas med den senaste commiten.",
+ "pendingPipeline": "Pipelinen körs fortfarande på den senaste commiten.",
+ "permission": "Du har inte behörighet att slå samman {{term}}.",
+ "draft": "Markera {{term}} som redo för granskning före sammanslagningen."
+ },
"methodLabels": {
"merge": "Skapa en incheckning för sammanslagningen",
"squash": "Slå ihop incheckningar och slå samman",
@@ -448,6 +472,7 @@
"acceptTerms": "Godkänn",
"replyBadRequest": "Det här svaret kan inte publiceras. Tråden kan ha ändrats.",
"replyForbidden": "Du har inte behörighet att svara på den här PR:en.",
+ "replyForbiddenTerm": "Du har inte behörighet att svara på {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Den här kommentaren kan inte anmälas.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Granska PR",
"headLine": "{{counts}} · senaste incheckning {{sha}}",
"entry": {
- "eyebrow": "Öppna en PR via en URL.",
- "pastePrLink": "Klistra in en PR-länk",
- "noRecentPrs": "Inga nyligen öppnade PR:er",
- "noRecentPrsDescription": "Klistra in en PR-länk ovan för att börja granska. PR:en visas här nästa gång.",
+ "eyebrow": "Öppna en PR eller merge request via en URL",
+ "pastePrLink": "Klistra in en PR- eller merge request-länk",
+ "noRecentPrs": "Inga senaste granskningar",
+ "noRecentPrsDescription": "Klistra in en länk ovan för att börja granska — den visas här nästa gång.",
"couldNotLoad": "Kunde inte läsa in innehållet.",
"removeFromRecentsTitle": "Ta bort från senast öppnade?",
- "removeFromRecentsMessage": "Den här PR:en tas bort från listan över senast öppnade PR:er.",
+ "removeFromRecentsMessage": "Den här granskningen tas bort från listan över senaste.",
"removeRecentAccessibility": "Ta bort {{repo}} från senast öppnade",
- "urlAccessibility": "URL till en PR på GitHub",
- "clearLink": "Rensa PR-länken",
- "pasteLink": "Klistra in PR-länk",
+ "urlAccessibility": "Ange en URL till en PR eller merge request",
+ "urlPlaceholder": "URL till PR eller merge request",
+ "openAccessibility": "Öppna PR eller merge request",
+ "clearLink": "Rensa länken",
+ "pasteLink": "Klistra in PR- eller merge request-länk",
"open": "Öppna"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Kunde inte kontrollera GitHub-anslutningen.",
"checkFailedMessage": "Inloggningsstatusen kan inte visas förrän inläsningen är klar.",
+ "checkFailedTitleGitLab": "Kunde inte kontrollera GitLab-anslutningen.",
+ "checkFailedTitleBitbucket": "Kunde inte kontrollera Bitbucket-anslutningen.",
+ "providerCheckFailedMessage": "Anslutningsstatusen kan inte visas förrän inläsningen är klar.",
"reconnectTitle": "Anslut GitHub igen",
"reconnectDescription": "Åtkomsten via din GitHub-anslutning har återkallats. Anslut igen för att fortsätta granska PR:er i mobilen.",
- "description": "Anslut ditt GitHub-konto för att granska PR:er i mobilen."
+ "description": "Anslut ditt GitHub-konto för att granska PR:er i mobilen.",
+ "gitlabDescription": "Anslut ditt GitLab-konto för att granska merge requests i mobilen.",
+ "bitbucketDescription": "Anslut Bitbucket till den här organisationen för att granska PR:er i mobilen.",
+ "bitbucketOrgOnlyDescription": "Välj en organisation i din profil för att granska dess Bitbucket-PR:er."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub-anslutningen har upphört att gälla.",
- "message": "Din GitHub-anslutning är inte längre giltig. Kontrollera anslutningen igen. Du blir ombedd att ansluta på nytt om det behövs."
+ "message": "Din GitHub-anslutning är inte längre giltig. Kontrollera anslutningen igen. Du blir ombedd att ansluta på nytt om det behövs.",
+ "gitlabTitle": "GitLab-anslutningen har upphört att gälla.",
+ "bitbucketTitle": "Bitbucket-anslutningen har upphört att gälla.",
+ "providerMessage": "Din {{provider}}-anslutning är inte längre giltig. Kontrollera anslutningen igen. Du blir ombedd att ansluta på nytt om det behövs."
},
"eventChips": {
"comment": "Kommentera",
@@ -643,6 +679,21 @@
"files": "Filer",
"discussion": "Diskussion"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Dela merge request",
+ "viewOnProvider": "Visa på {{provider}}",
+ "mergeRequestUnavailable": "Merge requesten är inte tillgänglig",
+ "unavailableDescription": "Den kan ha tagits bort, eller så har du inte åtkomst.",
+ "accessDeniedMergeRequest": "Du har inte behörighet att se den här merge requesten.",
+ "couldNotLoadMergeRequest": "Kunde inte läsa in merge requesten.",
+ "discussionAccessDenied": "Du har inte behörighet att se diskussionen för den här merge requesten.",
+ "discussionUnavailableMessage": "Den här merge requesten kan ha tagits bort.",
+ "noDiscussionDescription": "Den här merge requesten har inga granskningstrådar eller kommentarer i diskussionen.",
+ "noFilesChangedDescription": "Den här merge requesten innehåller inga filändringar."
+ },
"fileStatus": {
"modified": "Ändrad",
"renamed": "Namnändrad",
@@ -659,7 +710,7 @@
"emptyLine": "(tom)"
},
"linkPasteClipboardEmpty": "Urklipp är tomt.",
- "linkPasteNotAPullRequest": "Länken leder inte till en PR på GitHub.",
+ "linkPasteNotAPullRequest": "Länken leder inte till en PR eller merge request",
"announce": {
"commentPosted": "Kommentar publicerad",
"reviewSubmitted": "Granskning skickad",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Den här kommentaren kan inte publiceras. Den markerade raden kan ha ändrats eller PR:en kan ha uppdaterats.",
"reviewNotSubmitted": "Den här granskningen kan inte skickas i sitt nuvarande skick. PR:en kan ha ändrats, eller så gäller den din egen PR som du inte får granska.",
+ "reviewNotSubmittedTerm": "Den här granskningen kan inte skickas i sitt nuvarande skick. {{term}} kan ha ändrats, eller så kan du inte granska din egen {{term}}.",
"couldNotPostComment": "Kunde inte publicera kommentaren.",
"couldNotSubmitReview": "Kunde inte skicka granskningen. Kontrollera anslutningen och försök igen."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Det gick inte att skicka svaret.",
"couldNotCompleteAction": "Kunde inte slutföra den här åtgärden.",
"mergeResultDefaultError": "GitHub slutförde inte sammanslagningen.",
+ "mergeResultNotCompleted": "{{term}} slogs inte samman. Kontrollera statusen och försök igen.",
"ambiguous": "Kunde inte bekräfta resultatet. Kontrollera PR:en innan du försöker igen.",
"persistenceFailed": "Vi kunde inte registrera den här åtgärden. Försök igen senare.",
"forbidden": "Du saknar behörighet."
@@ -1988,11 +2041,31 @@
"retryConnection": "Försök ansluta igen"
},
"newSession": {
+ "recentlyUsed": "Nyligen använda",
+ "couldNotLoadGithubRepositories": "Det gick inte att läsa in kodarkiven från GitHub.",
+ "couldNotLoadGitlabRepositories": "Det gick inte att läsa in kodarkiven från GitLab.",
+ "couldNotLoadBitbucketRepositories": "Det gick inte att läsa in kodarkiven från Bitbucket.",
"connectGithubDescription": "Anslut GitHub i webbläsaren och kom sedan tillbaka hit för att välja ett kodarkiv.",
+ "connectGitlabDescription": "Anslut GitLab i webbläsaren och kom sedan tillbaka hit för att välja ett kodarkiv.",
+ "connectBitbucketDescription": "Anslut Bitbucket i webbläsaren och kom sedan tillbaka hit för att välja ett kodarkiv.",
"openGithub": "Öppna GitHub",
+ "openGitlab": "Öppna GitLab",
+ "openBitbucket": "Öppna Bitbucket",
"refreshRepositories": "Uppdatera kodarkiven",
"githubConnected": "GitHub anslutet",
+ "gitlabConnected": "GitLab anslutet",
"noRepositoriesVisible": "Inga kodarkiv visas. Kontrollera vilka kodarkiv Kilos GitHub-app har åtkomst till och uppdatera sedan listan.",
+ "noRepositoriesVisibleGitlab": "Inga kodarkiv visas. Kontrollera åtkomsten till kodarkiven i GitLab och uppdatera sedan listan.",
+ "noRepositoriesVisibleBitbucket": "Inga kodarkiv visas. Kontrollera åtkomsten till kodarkiven i Bitbucket och uppdatera sedan listan.",
+ "bitbucketOrganizationsOnly": "Bitbucket är bara tillgängligt för organisationer.",
+ "branchPickerTitle": "Välj gren",
+ "branchDefault": "Standard",
+ "branchAccessibility": "Gren: {{label}}",
+ "branchLoading": "Läser in grenar",
+ "branchLoadError": "Kunde inte läsa in grenar",
+ "branchUnavailable": "Inga grenar är tillgängliga för det här kodarkivet. Kontrollera din åtkomst hos leverantören och välj ett annat kodarkiv.",
+ "branchEmpty": "Inga grenar tillgängliga",
+ "branchPlaceholder": "Välj en gren",
"runOnWithTarget": "Kör på: {{target}}",
"environment": "Miljö",
"couldNotLoadEnvironment": "Det gick inte att läsa in din miljö.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Det gick inte att uppdatera kodarkiven. Försök igen.",
"discardDraftTitle": "Ta bort utkastet?",
"discardDraftMessage": "Din prompt går förlorad.",
+ "discardWithUploadsMessage": "Din prompt och uppladdade filer som inte har bifogats i skickade meddelanden tas bort.",
"discardFailed": "Det gick inte att ta bort utkastet. Försök igen.",
"remoteHint": "Kör `kilo remote` på din dator, eller `/remote` i en aktiv CLI-session, för att styra en lokal kilo-process.",
- "connectBitbucketDescription": "Anslut Bitbucket i webbläsaren och kom sedan tillbaka hit för att välja ett kodarkiv.",
- "connectGitlabDescription": "Anslut GitLab i webbläsaren och kom sedan tillbaka hit för att välja ett kodarkiv.",
- "couldNotLoadBitbucketRepositories": "Det gick inte att läsa in kodarkiven från Bitbucket.",
- "couldNotLoadGithubRepositories": "Det gick inte att läsa in kodarkiven från GitHub.",
- "couldNotLoadGitlabRepositories": "Det gick inte att läsa in kodarkiven från GitLab.",
- "gitlabConnected": "GitLab anslutet",
- "noRepositoriesVisibleBitbucket": "Inga kodarkiv visas. Kontrollera åtkomsten till kodarkiven i Bitbucket och uppdatera sedan listan.",
- "noRepositoriesVisibleGitlab": "Inga kodarkiv visas. Kontrollera åtkomsten till kodarkiven i GitLab och uppdatera sedan listan.",
- "openBitbucket": "Öppna Bitbucket",
- "openGitlab": "Öppna GitLab",
- "recentlyUsed": "Nyligen använda",
- "cliCannotContinue": "Den här CLI-versionen kan inte fortsätta en session. Välj Cloud Agent eller en annan CLI-instans.",
"continueFrom": "Sessionen {{title}} fortsätter.",
- "importFailed": "Det gick inte att importera den här sessionen.",
"importingSession": "Importerar sessionen",
- "discardWithUploadsMessage": "Din prompt och uppladdade filer som inte har bifogats i skickade meddelanden tas bort."
+ "cliCannotContinue": "Den här CLI-versionen kan inte fortsätta en session. Välj Cloud Agent eller en annan CLI-instans.",
+ "importFailed": "Det gick inte att importera den här sessionen."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} fil har uppdaterats.",
diff --git a/apps/mobile/src/i18n/locales/sw.json b/apps/mobile/src/i18n/locales/sw.json
index aed358cfc5..51abfada08 100644
--- a/apps/mobile/src/i18n/locales/sw.json
+++ b/apps/mobile/src/i18n/locales/sw.json
@@ -36,6 +36,7 @@
"cost": "Gharama",
"discard": "Tupa",
"findings": "Matokeo",
+ "mergeRequest": "ombi la kuunganisha",
"notConnected": "Haijaunganishwa",
"notifications": "Arifa",
"pullRequest": "ombi la kuunganisha",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Safu mlalo tupu ya tofauti za msimbo"
},
"connectionExpired": "Muda wa muunganisho wa GitHub umeisha.",
+ "capabilities": {
+ "banner": {
+ "title": "Haipatikani kwa mtoa huduma huyu",
+ "accessibility": "Haipatikani kwa mtoa huduma huyu: {{reason}}"
+ }
+ },
"merge": {
"merge": "Uunganishaji",
"mergeNow": "Unganisha sasa",
"mergePullRequest": "Kuunganisha ombi",
+ "mergeTermTitle": "Unganisha {{term}}",
"enableAutoMerge": "Washa muunganisho wa kiotomatiki",
"disableAutoMerge": "Zima muunganisho wa kiotomatiki",
"autoMergeOn": "Muunganisho wa kiotomatiki umewashwa",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Futa tawi baada ya kuunganisha",
"noEnabledMethods": "Hakuna mbinu ya kuunganisha iliyowezeshwa kwenye hazina hii ya msimbo. Mwombe msimamizi wa hazina awezeshe kuunganisha kwa rekodi ya kuunganisha, kwa rekodi moja, au kwa kuweka upya msingi.",
"confirmTitle": "Ungependa kuunganisha ombi?",
+ "confirmTitleTerm": "Ungependa kuunganisha {{term}}?",
"confirmMessage": "Hii itaunganisha mabadiliko yako kwenye tawi la msingi.",
"enableAutoMergeConfirmTitle": "Ungependa kuwasha muunganisho wa kiotomatiki?",
"enableAutoMergeConfirmMessage": "GitHub itaunganisha ombi hili kiotomatiki vipimo vyote vinavyohitajika vikifaulu.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} litaunganishwa kiotomatiki pipeline yake inapofaulu.",
+ "enableAutoMergeDescriptionTerm": "GitLab litaunganisha {{term}} hili kiotomatiki pipeline yake inapofaulu.",
"forbidden": "Huna ruhusa ya kuunganisha ombi hili.",
"cannotMerge": "Ombi hili la kuunganisha haliwezi kuunganishwa lilivyo sasa.",
"couldNotMerge": "Imeshindikana kuunganisha ombi.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Tayari limeunganishwa",
- "closed": "Ombi hili la kuunganisha limefungwa"
+ "closed": "Ombi hili la kuunganisha limefungwa",
+ "closedMergeRequest": "Ombi hili la kuunganisha limefungwa"
},
"partialSuccessBanner": {
"body": "Imeshindikana kufuta tawi: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Ombi hili bado haliwezi kuunganishwa",
"notMergeableDetail": "GitHub imeripoti hali ya kuunganisha kuwa {{state}}."
},
+ "restrictions": {
+ "title": "Vikwazo vya kuunganisha",
+ "approvalsRequired_one": "Idhini {{displayCount}} inahitajika",
+ "approvalsRequired_other": "Idhini {{displayCount}} zinahitajika",
+ "pipelineMustSucceed": "Pipeline lazima ifaulu kabla ya kuunganisha."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline inashindwa kwenye hifadhi ya mabadiliko ya mwisho.",
+ "pendingPipeline": "Pipeline bado inaendelea kwenye hifadhi ya mabadiliko ya mwisho.",
+ "permission": "Huna ruhusa ya kuunganisha {{term}}.",
+ "draft": "Weka alama kuwa {{term}} liko tayari kukaguliwa kabla ya kuunganisha."
+ },
"methodLabels": {
"merge": "Unda rekodi ya kuunganisha",
"squash": "Fanya rekodi moja kisha unganisha",
@@ -448,6 +472,7 @@
"acceptTerms": "Kubali",
"replyBadRequest": "Jibu hili haliwezi kuchapishwa. Mada huenda imebadilika.",
"replyForbidden": "Huna ruhusa ya kujibu ombi hili la kuunganisha.",
+ "replyForbiddenTerm": "Huna ruhusa ya kujibu {{term}}.",
"moderation": {
"reportContent": {
"terminal": "Maoni haya hayawezi kuripotiwa.",
@@ -508,16 +533,18 @@
"reviewPullRequest": "Kagua ombi la kuunganisha",
"headLine": "{{counts}} · rekodi ya mwisho {{sha}}",
"entry": {
- "eyebrow": "Fungua ombi la kuunganisha kwa kutumia URL.",
- "pastePrLink": "Bandika kiungo cha PR",
- "noRecentPrs": "Hakuna PR za hivi karibuni",
- "noRecentPrsDescription": "Bandika kiungo cha PR hapo juu ili uanze ukaguzi — PR hiyo itaonekana hapa wakati ujao.",
+ "eyebrow": "Fungua ombi la kuunganisha kwa URL",
+ "pastePrLink": "Bandika kiungo cha ombi la kuunganisha",
+ "noRecentPrs": "Hakuna ukaguzi wa hivi karibuni",
+ "noRecentPrsDescription": "Bandika kiungo hapo juu kuanza ukaguzi — kitaonekana hapa mara ijayo.",
"couldNotLoad": "Imeshindikana kupakia.",
"removeFromRecentsTitle": "Ungependa kuondoa kwenye orodha ya hivi karibuni?",
- "removeFromRecentsMessage": "Ombi hili la kuunganisha litaondolewa kwenye orodha yako ya hivi karibuni.",
+ "removeFromRecentsMessage": "Ukaguzi huu utaondolewa kwenye orodha yako ya hivi karibuni.",
"removeRecentAccessibility": "Ondoa {{repo}} kwenye orodha ya hivi karibuni",
- "urlAccessibility": "URL ya ombi la kuunganisha la GitHub",
- "clearLink": "Ondoa kiungo cha ombi la kuunganisha",
+ "urlAccessibility": "Weka URL ya ombi la kuunganisha",
+ "urlPlaceholder": "URL ya ombi la kuunganisha",
+ "openAccessibility": "Fungua ombi la kuunganisha",
+ "clearLink": "Futa kiungo",
"pasteLink": "Bandika kiungo cha ombi la kuunganisha",
"open": "Wazi"
},
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Imeshindikana kuangalia muunganisho wa GitHub.",
"checkFailedMessage": "Hali ya kuingia haipatikani hadi upakiaji huu ukamilike.",
+ "checkFailedTitleGitLab": "Imeshindikana kuangalia muunganisho wa GitLab.",
+ "checkFailedTitleBitbucket": "Imeshindikana kuangalia muunganisho wa Bitbucket.",
+ "providerCheckFailedMessage": "Hali ya muunganisho haipatikani hadi hii ipakie.",
"reconnectTitle": "Unganisha GitHub tena",
"reconnectDescription": "Ruhusa ya muunganisho wako wa GitHub imebatilishwa. Unganisha tena ili uendelee kukagua maombi ya kuunganisha kwenye simu.",
- "description": "Unganisha akaunti yako ya GitHub ili ukague maombi ya kuunganisha kwenye simu."
+ "description": "Unganisha akaunti yako ya GitHub ili ukague maombi ya kuunganisha kwenye simu.",
+ "gitlabDescription": "Unganisha akaunti yako ya GitLab ili kukagua maombi ya kuunganisha kwenye simu.",
+ "bitbucketDescription": "Unganisha Bitbucket na shirika hili ili kukagua maombi ya kuunganisha kwenye simu.",
+ "bitbucketOrgOnlyDescription": "Chagua shirika kwenye wasifu wako ili kukagua maombi ya kuunganisha ya Bitbucket yake."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Muda wa muunganisho wa GitHub umeisha.",
- "message": "Muunganisho wako wa GitHub si halali tena. Uangalie tena — utaombwa kuunganisha upya ikihitajika."
+ "message": "Muunganisho wako wa GitHub si halali tena. Uangalie tena — utaombwa kuunganisha upya ikihitajika.",
+ "gitlabTitle": "Muda wa muunganisho wa GitLab umeisha.",
+ "bitbucketTitle": "Muda wa muunganisho wa Bitbucket umeisha.",
+ "providerMessage": "Muunganisho wako wa {{provider}} si halali tena. Uangalie tena — utaombwa kuunganisha upya ikihitajika."
},
"eventChips": {
"comment": "Toa maoni",
@@ -643,6 +679,21 @@
"files": "Faili",
"discussion": "Mazungumzo"
},
+ "terms": {
+ "pullRequest": "Ombi la kuunganisha",
+ "mergeRequest": "Ombi la kuunganisha",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Shiriki ombi la kuunganisha",
+ "viewOnProvider": "Tazama kwenye {{provider}}",
+ "mergeRequestUnavailable": "Ombi la kuunganisha halipatikani",
+ "unavailableDescription": "Huenda kimefutwa, au huenda huna ruhusa ya kukionoa.",
+ "accessDeniedMergeRequest": "Huna ruhusa ya kuona ombi hili la kuunganisha.",
+ "couldNotLoadMergeRequest": "Imeshindikana kupakia ombi la kuunganisha.",
+ "discussionAccessDenied": "Huna ruhusa ya kuangalia mazungumzo ya ombi hili la kuunganisha.",
+ "discussionUnavailableMessage": "Huenda ombi hili la kuunganisha limeondolewa.",
+ "noDiscussionDescription": "Hakuna mada za ukaguzi wala maoni ya mazungumzo kwenye ombi hili la kuunganisha.",
+ "noFilesChangedDescription": "Ombi hili la kuunganisha halina mabadiliko ya faili."
+ },
"fileStatus": {
"modified": "Imebadilishwa",
"renamed": "Jina limebadilishwa",
@@ -659,7 +710,7 @@
"emptyLine": "(tupu)"
},
"linkPasteClipboardEmpty": "Ubao wa kunakili ni tupu.",
- "linkPasteNotAPullRequest": "Hiki si kiungo cha ombi la kuunganisha la GitHub.",
+ "linkPasteNotAPullRequest": "Sio kiungo cha ombi la kuunganisha",
"announce": {
"commentPosted": "Maoni yamechapishwa",
"reviewSubmitted": "Ukaguzi umewasilishwa",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Maoni haya hayawezi kuchapishwa. Mstari uliochaguliwa huenda umebadilika, au PR huenda imesasishwa.",
"reviewNotSubmitted": "Ukaguzi huu hauwezi kuwasilishwa ulivyo sasa. Huenda PR imebadilika, au huwezi kukagua ombi lako mwenyewe la kuunganisha.",
+ "reviewNotSubmittedTerm": "Ukaguzi huu hauwezi kutumwa kama ulivyo. Huenda {{term}} limebadilika, au huwezi kukagua {{term}} wako mwenyewe.",
"couldNotPostComment": "Imeshindikana kuchapisha maoni.",
"couldNotSubmitReview": "Imeshindikana kuwasilisha ukaguzi. Angalia muunganisho wako kisha ujaribu tena."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Imeshindikana kutuma jibu.",
"couldNotCompleteAction": "Imeshindikana kukamilisha kitendo hiki.",
"mergeResultDefaultError": "GitHub haikukamilisha muunganisho.",
+ "mergeResultNotCompleted": "{{term}} haikuunganishwa. Angalia hali yake na ujaribu tena.",
"ambiguous": "Imeshindikana kuthibitisha matokeo — angalia PR kabla ya kujaribu tena.",
"persistenceFailed": "Hatukuweza kurekodi kitendo hiki. Tafadhali jaribu tena baadaye.",
"forbidden": "Kitendo hiki hakiruhusiwi."
@@ -1988,11 +2041,31 @@
"retryConnection": "Jaribu kuunganisha tena"
},
"newSession": {
+ "recentlyUsed": "Zilizotumika hivi karibuni",
+ "couldNotLoadGithubRepositories": "Imeshindikana kupakia hazina za GitHub.",
+ "couldNotLoadGitlabRepositories": "Imeshindikana kupakia hazina za GitLab.",
+ "couldNotLoadBitbucketRepositories": "Imeshindikana kupakia hazina za Bitbucket.",
"connectGithubDescription": "Unganisha GitHub kwenye kivinjari chako, kisha rudi hapa kuchagua hazina.",
+ "connectGitlabDescription": "Unganisha GitLab kwenye kivinjari chako, kisha rudi hapa kuchagua hazina.",
+ "connectBitbucketDescription": "Unganisha Bitbucket kwenye kivinjari chako, kisha rudi hapa kuchagua hazina.",
"openGithub": "Fungua GitHub",
+ "openGitlab": "Fungua GitLab",
+ "openBitbucket": "Fungua Bitbucket",
"refreshRepositories": "Pakia upya hazina",
"githubConnected": "GitHub imeunganishwa",
+ "gitlabConnected": "GitLab imeunganishwa",
"noRepositoriesVisible": "Hakuna hazina zinazoonekana. Angalia ruhusa za programu ya Kilo kwenye GitHub kufikia hazina, kisha pakia upya orodha.",
+ "noRepositoriesVisibleGitlab": "Hakuna hazina zinazoonekana. Angalia ruhusa za kufikia hazina kwenye GitLab, kisha pakia upya orodha.",
+ "noRepositoriesVisibleBitbucket": "Hakuna hazina zinazoonekana. Angalia ruhusa za kufikia hazina kwenye Bitbucket, kisha pakia upya orodha.",
+ "bitbucketOrganizationsOnly": "Bitbucket inapatikana kwa mashirika pekee.",
+ "branchPickerTitle": "Chagua tawi",
+ "branchDefault": "Chaguomsingi",
+ "branchAccessibility": "Tawi: {{label}}",
+ "branchLoading": "Inapakia matawi",
+ "branchLoadError": "Imeshindikana kupakia matawi",
+ "branchUnavailable": "Matawi hayapatikani kwa hazina hii. Angalia ruhusa yako kwa mtoa huduma, kisha chagua hazina nyingine.",
+ "branchEmpty": "Hakuna matawi yanayopatikana",
+ "branchPlaceholder": "Chagua tawi",
"runOnWithTarget": "Endesha kwenye: {{target}}",
"environment": "Mazingira",
"couldNotLoadEnvironment": "Imeshindikana kupakia mazingira yako.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Imeshindikana kupakia upya hazina. Tafadhali jaribu tena.",
"discardDraftTitle": "Ungependa kufuta rasimu?",
"discardDraftMessage": "Maagizo yako yatapotea.",
+ "discardWithUploadsMessage": "Maagizo yako na faili zozote zilizopakiwa ambazo hazijaambatishwa kwenye ujumbe uliotumwa zitafutwa.",
"discardFailed": "Imeshindikana kufuta rasimu. Tafadhali jaribu tena.",
"remoteHint": "Endesha `kilo remote` kwenye kompyuta yako, au `/remote` kwenye kikao cha CLI kinachoendelea, ili kudhibiti mchakato wa kilo kwenye kompyuta yako.",
- "connectBitbucketDescription": "Unganisha Bitbucket kwenye kivinjari chako, kisha rudi hapa kuchagua hazina.",
- "connectGitlabDescription": "Unganisha GitLab kwenye kivinjari chako, kisha rudi hapa kuchagua hazina.",
- "couldNotLoadBitbucketRepositories": "Imeshindikana kupakia hazina za Bitbucket.",
- "couldNotLoadGithubRepositories": "Imeshindikana kupakia hazina za GitHub.",
- "couldNotLoadGitlabRepositories": "Imeshindikana kupakia hazina za GitLab.",
- "gitlabConnected": "GitLab imeunganishwa",
- "noRepositoriesVisibleBitbucket": "Hakuna hazina zinazoonekana. Angalia ruhusa za kufikia hazina kwenye Bitbucket, kisha pakia upya orodha.",
- "noRepositoriesVisibleGitlab": "Hakuna hazina zinazoonekana. Angalia ruhusa za kufikia hazina kwenye GitLab, kisha pakia upya orodha.",
- "openBitbucket": "Fungua Bitbucket",
- "openGitlab": "Fungua GitLab",
- "recentlyUsed": "Zilizotumika hivi karibuni",
- "cliCannotContinue": "CLI hii haiwezi kuendelea na kikao. Chagua Cloud Agent au CLI nyingine.",
"continueFrom": "Kikao {{title}} kinaendelea.",
- "importFailed": "Imeshindikana kuingiza kikao hiki.",
"importingSession": "Inaingiza kikao",
- "discardWithUploadsMessage": "Maagizo yako na faili zozote zilizopakiwa ambazo hazijaambatishwa kwenye ujumbe uliotumwa zitafutwa."
+ "cliCannotContinue": "CLI hii haiwezi kuendelea na kikao. Chagua Cloud Agent au CLI nyingine.",
+ "importFailed": "Imeshindikana kuingiza kikao hiki."
},
"partRenderer": {
"updatedFileCount_one": "Faili {{displayCount}} imesasishwa.",
diff --git a/apps/mobile/src/i18n/locales/ta.json b/apps/mobile/src/i18n/locales/ta.json
index fe7b0f818e..fc1a99f830 100644
--- a/apps/mobile/src/i18n/locales/ta.json
+++ b/apps/mobile/src/i18n/locales/ta.json
@@ -36,6 +36,7 @@
"cost": "செலவு",
"discard": "கைவிடவும்",
"findings": "கண்டறிந்த சிக்கல்கள்",
+ "mergeRequest": "இணைப்புக் கோரிக்கை",
"notConnected": "இணைக்கப்படவில்லை",
"notifications": "அறிவிப்புகள்",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "மாற்ற ஒப்பீட்டில் வெற்று வரிசை"
},
"connectionExpired": "GitHub இணைப்பு காலாவதியானது.",
+ "capabilities": {
+ "banner": {
+ "title": "இந்த வழங்குநரில் கிடைக்காது",
+ "accessibility": "இந்த வழங்குநரில் கிடைக்காது: {{reason}}"
+ }
+ },
"merge": {
"merge": "ஒன்றிணைத்தல்",
"mergeNow": "இப்போது இணைக்கவும்",
"mergePullRequest": "இணைப்புக் கோரிக்கையை இணைத்தல்",
+ "mergeTermTitle": "{{term}}-ஐ இணைக்கவும்",
"enableAutoMerge": "தானியங்கி இணைப்பை இயக்கவும்",
"disableAutoMerge": "தானியங்கி இணைப்பை முடக்கவும்",
"autoMergeOn": "தானியங்கி இணைப்பு இயக்கத்தில் உள்ளது",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "இணைத்த பிறகு கிளையை நீக்கவும்",
"noEnabledMethods": "இந்தக் களஞ்சியத்தில் எந்த இணைப்பு முறையும் இயக்கப்படவில்லை. இணைப்பு, ஸ்குவாஷ் அல்லது ரீபேஸ் முறையை இயக்கக் களஞ்சிய நிர்வாகியிடம் கேட்கவும்.",
"confirmTitle": "இணைப்புக் கோரிக்கையை இணைக்கவா?",
+ "confirmTitleTerm": "{{term}}-ஐ இணைக்கவா?",
"confirmMessage": "இது உங்கள் மாற்றங்களை அடிப்படைக் கிளையில் இணைக்கும்.",
"enableAutoMergeConfirmTitle": "தானியங்கி இணைப்பை இயக்கவா?",
"enableAutoMergeConfirmMessage": "கட்டாயச் சோதனைகள் அனைத்தும் வெற்றியடைந்ததும் GitHub இந்த இணைப்புக் கோரிக்கையைத் தானாக இணைக்கும்.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}}-ன் பைப்லைன் வெற்றிபெற்றவுடன் அது தானாக இணைக்கப்படும்.",
+ "enableAutoMergeDescriptionTerm": "இந்த {{term}}-ஐ GitLab அதன் பைப்லைன் வெற்றிபெற்றவுடன் தானாக இணைக்கிறது.",
"forbidden": "இந்த இணைப்புக் கோரிக்கையை இணைக்க உங்களுக்கு அனுமதி இல்லை.",
"cannotMerge": "இந்த இணைப்புக் கோரிக்கையைத் தற்போதைய நிலையில் இணைக்க முடியாது.",
"couldNotMerge": "இணைப்புக் கோரிக்கையை இணைக்க முடியவில்லை.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "ஏற்கனவே இணைக்கப்பட்டது",
- "closed": "இந்த இணைப்புக் கோரிக்கை மூடப்பட்டது"
+ "closed": "இந்த இணைப்புக் கோரிக்கை மூடப்பட்டது",
+ "closedMergeRequest": "இந்த இணைப்புக் கோரிக்கை மூடப்பட்டது"
},
"partialSuccessBanner": {
"body": "கிளையை நீக்க முடியவில்லை: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "இந்த இணைப்புக் கோரிக்கையை இன்னும் இணைக்க முடியாது",
"notMergeableDetail": "இணைக்கும் நிலையை {{state}} என GitHub தெரிவித்தது."
},
+ "restrictions": {
+ "title": "இணைப்புக் கட்டுப்பாடுகள்",
+ "approvalsRequired_one": "{{displayCount}} ஒப்புதல் தேவை",
+ "approvalsRequired_other": "{{displayCount}} ஒப்புதல்கள் தேவை",
+ "pipelineMustSucceed": "இணைக்கும் முன் பைப்லைன் வெற்றிபெற வேண்டும்."
+ },
+ "providerBlocked": {
+ "failingPipeline": "சமீபத்திய கமிட்டில் பைப்லைன் தோல்வியடைகிறது.",
+ "pendingPipeline": "சமீபத்திய கமிட்டில் பைப்லைன் இன்னும் இயங்கிக்கொண்டிருக்கிறது.",
+ "permission": "இந்த {{term}}-ஐ இணைக்க உங்களுக்கு அனுமதி இல்லை.",
+ "draft": "இணைப்பதற்கு முன் {{term}}-ஐ மதிப்பாய்வுக்குத் தயாராக உள்ளதாகக் குறிக்கவும்."
+ },
"methodLabels": {
"merge": "இணைப்பு கமிட்டை உருவாக்கவும்",
"squash": "ஸ்குவாஷ் செய்து இணைக்கவும்",
@@ -448,6 +472,7 @@
"acceptTerms": "ஏற்கவும்",
"replyBadRequest": "இந்தப் பதிலை இடுகையிட முடியாது. கருத்துத் தொடர் மாறியிருக்கலாம்.",
"replyForbidden": "இந்த இணைப்புக் கோரிக்கைக்குப் பதிலளிக்க உங்களுக்கு அனுமதி இல்லை.",
+ "replyForbiddenTerm": "இந்த {{term}}-க்குப் பதிலளிக்க உங்களுக்கு அனுமதி இல்லை.",
"moderation": {
"reportContent": {
"terminal": "இந்தக் கருத்து குறித்துப் புகாரளிக்க முடியாது.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "இணைப்புக் கோரிக்கையை மதிப்பாய்வு செய்யவும்",
"headLine": "{{counts}} · கடைசி கமிட் {{sha}}",
"entry": {
- "eyebrow": "URL மூலம் இணைப்புக் கோரிக்கையைத் திறக்கவும்.",
- "pastePrLink": "PR இணைப்பை ஒட்டவும்",
- "noRecentPrs": "சமீபத்திய PR-கள் இல்லை",
- "noRecentPrsDescription": "மதிப்பாய்வைத் தொடங்க மேலே ஒரு PR இணைப்பை ஒட்டவும் — அடுத்த முறை அது இங்கே காட்டப்படும்.",
+ "eyebrow": "URL மூலம் இணைப்புக் கோரிக்கையைத் திறக்கவும்",
+ "pastePrLink": "இணைப்புக் கோரிக்கை இணைப்பை ஒட்டவும்",
+ "noRecentPrs": "சமீபத்திய மதிப்பாய்வுகள் இல்லை",
+ "noRecentPrsDescription": "மதிப்பாய்வு தொடங்க மேலே இணைப்பை ஒட்டவும் — அடுத்த முறை இங்கே தோன்றும்.",
"couldNotLoad": "ஏற்ற முடியவில்லை.",
"removeFromRecentsTitle": "சமீபத்திய பட்டியலிலிருந்து அகற்றவா?",
- "removeFromRecentsMessage": "இந்த இணைப்புக் கோரிக்கை உங்கள் சமீபத்திய பட்டியலிலிருந்து அகற்றப்படும்.",
+ "removeFromRecentsMessage": "இந்த மதிப்பாய்வு உங்கள் சமீபத்தியவற்றிலிருந்து நீக்கப்படும்.",
"removeRecentAccessibility": "{{repo}}-ஐச் சமீபத்திய பட்டியலிலிருந்து அகற்றவும்",
- "urlAccessibility": "GitHub இணைப்புக் கோரிக்கையின் URL",
- "clearLink": "இணைப்புக் கோரிக்கையின் இணைப்பை நீக்கவும்",
- "pasteLink": "இணைப்புக் கோரிக்கையின் இணைப்பை ஒட்டவும்",
+ "urlAccessibility": "இணைப்புக் கோரிக்கை URL-ஐ உள்ளிடவும்",
+ "urlPlaceholder": "இணைப்புக் கோரிக்கை URL",
+ "openAccessibility": "இணைப்புக் கோரிக்கையைத் திறக்கவும்",
+ "clearLink": "இணைப்பை அழிக்கவும்",
+ "pasteLink": "இணைப்புக் கோரிக்கை இணைப்பை ஒட்டவும்",
"open": "திறப்பு"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub இணைப்பைச் சரிபார்க்க முடியவில்லை.",
"checkFailedMessage": "இது ஏற்றப்படும் வரை உள்நுழைவு நிலை கிடைக்காது.",
+ "checkFailedTitleGitLab": "GitLab இணைப்பைச் சரிபார்க்க முடியவில்லை.",
+ "checkFailedTitleBitbucket": "Bitbucket இணைப்பைச் சரிபார்க்க முடியவில்லை.",
+ "providerCheckFailedMessage": "இது ஏற்றும் வரை இணைப்பு நிலை கிடைக்காது.",
"reconnectTitle": "GitHub உடன் மீண்டும் இணைக்கவும்",
"reconnectDescription": "உங்கள் GitHub இணைப்பு ரத்து செய்யப்பட்டது. மொபைலில் இணைப்புக் கோரிக்கைகளைத் தொடர்ந்து மதிப்பாய்வு செய்ய மீண்டும் இணைக்கவும்.",
- "description": "மொபைலில் இணைப்புக் கோரிக்கைகளை மதிப்பாய்வு செய்ய உங்கள் GitHub கணக்கை இணைக்கவும்."
+ "description": "மொபைலில் இணைப்புக் கோரிக்கைகளை மதிப்பாய்வு செய்ய உங்கள் GitHub கணக்கை இணைக்கவும்.",
+ "gitlabDescription": "மொபைலில் இணைப்புக் கோரிக்கைகளை மதிப்பாய்வு செய்ய உங்கள் GitLab கணக்கை இணைக்கவும்.",
+ "bitbucketDescription": "மொபைலில் இணைப்புக் கோரிக்கைகளை மதிப்பாய்வு செய்ய Bitbucket-ஐ இந்த நிறுவனத்துடன் இணைக்கவும்.",
+ "bitbucketOrgOnlyDescription": "இந்த நிறுவனத்தின் Bitbucket இணைப்புக் கோரிக்கைகளை மதிப்பாய்வு செய்ய உங்கள் சுயவிவரத்தில் ஒரு நிறுவனத்தைத் தேர்ந்தெடுக்கவும்."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub இணைப்பு காலாவதியானது.",
- "message": "உங்கள் GitHub இணைப்பு இனி செல்லுபடியாகாது. இணைப்பை மீண்டும் சரிபார்க்கவும் — தேவைப்பட்டால் மீண்டும் இணைக்கும்படி கேட்கப்படும்."
+ "message": "உங்கள் GitHub இணைப்பு இனி செல்லுபடியாகாது. இணைப்பை மீண்டும் சரிபார்க்கவும் — தேவைப்பட்டால் மீண்டும் இணைக்கும்படி கேட்கப்படும்.",
+ "gitlabTitle": "GitLab இணைப்பு காலாவதியானது.",
+ "bitbucketTitle": "Bitbucket இணைப்பு காலாவதியானது.",
+ "providerMessage": "உங்கள் {{provider}} இணைப்பு இனி செல்லுபடியாகாது. இணைப்பை மீண்டும் சரிபார்க்கவும் — தேவைப்பட்டால் மீண்டும் இணைக்கும்படி கேட்கப்படும்."
},
"eventChips": {
"comment": "கருத்து",
@@ -643,6 +679,21 @@
"files": "கோப்புகள்",
"discussion": "விவாதம்"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "இணைப்புக் கோரிக்கை",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "இணைப்புக் கோரிக்கையைப் பகிரவும்",
+ "viewOnProvider": "{{provider}}-இல் காண்க",
+ "mergeRequestUnavailable": "இணைப்புக் கோரிக்கை கிடைக்கவில்லை",
+ "unavailableDescription": "அது நீக்கப்பட்டிருக்கலாம், அல்லது அதற்கு அணுகல் உங்களுக்கு இல்லாமல் இருக்கலாம்.",
+ "accessDeniedMergeRequest": "இந்த இணைப்புக் கோரிக்கையைப் பார்க்க உங்களுக்கு அனுமதி இல்லை.",
+ "couldNotLoadMergeRequest": "இணைப்புக் கோரிக்கையை ஏற்ற முடியவில்லை.",
+ "discussionAccessDenied": "இந்த இணைப்புக் கோரிக்கையின் விவாதத்தைப் பார்க்க உங்களுக்கு அனுமதி இல்லை.",
+ "discussionUnavailableMessage": "இந்த இணைப்புக் கோரிக்கை அகற்றப்பட்டிருக்கலாம்.",
+ "noDiscussionDescription": "இந்த இணைப்புக் கோரிக்கையில் மதிப்பாய்வுக் கருத்துத் தொடர்களோ உரையாடல் கருத்துகளோ இல்லை.",
+ "noFilesChangedDescription": "இந்த இணைப்புக் கோரிக்கையில் கோப்பு மாற்றங்கள் எதுவும் இல்லை."
+ },
"fileStatus": {
"modified": "மாற்றப்பட்டது",
"renamed": "மறுபெயரிடப்பட்டது",
@@ -659,7 +710,7 @@
"emptyLine": "(காலி)"
},
"linkPasteClipboardEmpty": "கிளிப்போர்டு காலியாக உள்ளது.",
- "linkPasteNotAPullRequest": "இது GitHub இணைப்புக் கோரிக்கைக்கான இணைப்பு அல்ல.",
+ "linkPasteNotAPullRequest": "இது இணைப்புக் கோரிக்கை இணைப்பு அல்ல",
"announce": {
"commentPosted": "கருத்து இடுகையிடப்பட்டது",
"reviewSubmitted": "மதிப்பாய்வு சமர்ப்பிக்கப்பட்டது",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "இந்தக் கருத்தை இடுகையிட முடியாது. தேர்ந்தெடுத்த வரி மாறியிருக்கலாம் அல்லது PR புதுப்பிக்கப்பட்டிருக்கலாம்.",
"reviewNotSubmitted": "இந்த மதிப்பாய்வைத் தற்போதைய நிலையில் சமர்ப்பிக்க முடியாது. PR மாறியிருக்கலாம் அல்லது இது நீங்களே உருவாக்கிய இணைப்புக் கோரிக்கையாக இருக்கலாம்; அதை நீங்களே மதிப்பாய்வு செய்ய முடியாது.",
+ "reviewNotSubmittedTerm": "இந்த மதிப்பாய்வை இப்படியே சமர்ப்பிக்க முடியாது. {{term}} மாறியிருக்கலாம், அல்லது உங்கள் சொந்த {{term}}-ஐ நீங்களே மதிப்பாய்வு செய்ய முடியாது.",
"couldNotPostComment": "கருத்தை இடுகையிட முடியவில்லை.",
"couldNotSubmitReview": "மதிப்பாய்வைச் சமர்ப்பிக்க முடியவில்லை. உங்கள் இணைப்பைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்."
},
@@ -675,6 +727,7 @@
"couldNotReply": "பதிலளிக்க முடியவில்லை.",
"couldNotCompleteAction": "இந்தச் செயலை முடிக்க முடியவில்லை.",
"mergeResultDefaultError": "GitHub இணைப்பை முடிக்கவில்லை.",
+ "mergeResultNotCompleted": "{{term}} இணைக்கப்படவில்லை. அதன் நிலையைச் சரிபார்த்து மீண்டும் முயற்சிக்கவும்.",
"ambiguous": "உறுதிப்படுத்த முடியவில்லை — மீண்டும் முயற்சிக்கும் முன் PR-ஐச் சரிபார்க்கவும்.",
"persistenceFailed": "இந்தச் செயலைப் பதிவு செய்ய முடியவில்லை. பிறகு மீண்டும் முயற்சிக்கவும்.",
"forbidden": "அனுமதி இல்லை."
@@ -1988,11 +2041,31 @@
"retryConnection": "மீண்டும் இணைக்க முயற்சிக்கவும்"
},
"newSession": {
+ "recentlyUsed": "சமீபத்தில் பயன்படுத்தியவை",
+ "couldNotLoadGithubRepositories": "GitHub களஞ்சியங்களை ஏற்ற முடியவில்லை.",
+ "couldNotLoadGitlabRepositories": "GitLab களஞ்சியங்களை ஏற்ற முடியவில்லை.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket களஞ்சியங்களை ஏற்ற முடியவில்லை.",
"connectGithubDescription": "உலாவியில் GitHub-ஐ இணைக்கவும். பின்னர் களஞ்சியத்தைத் தேர்ந்தெடுக்க இங்கே திரும்பவும்.",
+ "connectGitlabDescription": "உலாவியில் GitLab-ஐ இணைக்கவும். பின்னர் களஞ்சியத்தைத் தேர்ந்தெடுக்க இங்கே திரும்பவும்.",
+ "connectBitbucketDescription": "உலாவியில் Bitbucket-ஐ இணைக்கவும். பின்னர் களஞ்சியத்தைத் தேர்ந்தெடுக்க இங்கே திரும்பவும்.",
"openGithub": "GitHub-ஐத் திறக்கவும்",
+ "openGitlab": "GitLab-ஐத் திறக்கவும்",
+ "openBitbucket": "Bitbucket-ஐத் திறக்கவும்",
"refreshRepositories": "களஞ்சியங்களைப் புதுப்பிக்கவும்",
"githubConnected": "GitHub இணைக்கப்பட்டது",
+ "gitlabConnected": "GitLab இணைக்கப்பட்டது",
"noRepositoriesVisible": "களஞ்சியங்கள் எதுவும் தெரியவில்லை. Kilo GitHub செயலிக்குக் களஞ்சியங்களை அணுக அனுமதி உள்ளதா எனச் சரிபார்த்துப் புதுப்பிக்கவும்.",
+ "noRepositoriesVisibleGitlab": "களஞ்சியங்கள் எதுவும் தெரியவில்லை. GitLab-இல் களஞ்சியங்களை அணுக அனுமதி உள்ளதா எனச் சரிபார்த்துப் புதுப்பிக்கவும்.",
+ "noRepositoriesVisibleBitbucket": "களஞ்சியங்கள் எதுவும் தெரியவில்லை. Bitbucket-இல் களஞ்சியங்களை அணுக அனுமதி உள்ளதா எனச் சரிபார்த்துப் புதுப்பிக்கவும்.",
+ "bitbucketOrganizationsOnly": "நிறுவனங்களுக்கு மட்டுமே Bitbucket கிடைக்கும்.",
+ "branchPickerTitle": "கிளையைத் தேர்ந்தெடுக்கவும்",
+ "branchDefault": "இயல்புநிலை",
+ "branchAccessibility": "கிளை: {{label}}",
+ "branchLoading": "கிளைகள் ஏற்றப்படுகின்றன",
+ "branchLoadError": "கிளைகளை ஏற்ற முடியவில்லை",
+ "branchUnavailable": "இந்தக் களஞ்சியத்திற்குக் கிளைகள் கிடைக்கவில்லை. வழங்குநருடன் உங்கள் அணுகலைச் சரிபார்த்து, பிறகு வேறு களஞ்சியத்தைத் தேர்ந்தெடுக்கவும்.",
+ "branchEmpty": "கிளைகள் எதுவும் இல்லை",
+ "branchPlaceholder": "ஒரு கிளையைத் தேர்ந்தெடுக்கவும்",
"runOnWithTarget": "இயக்கும் இடம்: {{target}}",
"environment": "சூழல்",
"couldNotLoadEnvironment": "உங்கள் சூழலை ஏற்ற முடியவில்லை.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "களஞ்சியங்களைப் புதுப்பிக்க முடியவில்லை. மீண்டும் முயற்சிக்கவும்.",
"discardDraftTitle": "வரைவை நீக்கவா?",
"discardDraftMessage": "உங்கள் வினவல் நீக்கப்படும்.",
+ "discardWithUploadsMessage": "உங்கள் வினவலும் அனுப்பிய செய்திகளில் இணைக்கப்படாத பதிவேற்றங்களும் நீக்கப்படும்.",
"discardFailed": "வரைவை நீக்க முடியவில்லை. மீண்டும் முயற்சிக்கவும்.",
"remoteHint": "உள்ளூரில் இயங்கும் kilo செயல்முறையைக் கட்டுப்படுத்த, உங்கள் கணினியில் `kilo remote` கட்டளையை அல்லது இயங்கும் CLI அமர்வில் `/remote` கட்டளையை இயக்கவும்.",
- "connectBitbucketDescription": "உலாவியில் Bitbucket-ஐ இணைக்கவும். பின்னர் களஞ்சியத்தைத் தேர்ந்தெடுக்க இங்கே திரும்பவும்.",
- "connectGitlabDescription": "உலாவியில் GitLab-ஐ இணைக்கவும். பின்னர் களஞ்சியத்தைத் தேர்ந்தெடுக்க இங்கே திரும்பவும்.",
- "couldNotLoadBitbucketRepositories": "Bitbucket களஞ்சியங்களை ஏற்ற முடியவில்லை.",
- "couldNotLoadGithubRepositories": "GitHub களஞ்சியங்களை ஏற்ற முடியவில்லை.",
- "couldNotLoadGitlabRepositories": "GitLab களஞ்சியங்களை ஏற்ற முடியவில்லை.",
- "gitlabConnected": "GitLab இணைக்கப்பட்டது",
- "noRepositoriesVisibleBitbucket": "களஞ்சியங்கள் எதுவும் தெரியவில்லை. Bitbucket-இல் களஞ்சியங்களை அணுக அனுமதி உள்ளதா எனச் சரிபார்த்துப் புதுப்பிக்கவும்.",
- "noRepositoriesVisibleGitlab": "களஞ்சியங்கள் எதுவும் தெரியவில்லை. GitLab-இல் களஞ்சியங்களை அணுக அனுமதி உள்ளதா எனச் சரிபார்த்துப் புதுப்பிக்கவும்.",
- "openBitbucket": "Bitbucket-ஐத் திறக்கவும்",
- "openGitlab": "GitLab-ஐத் திறக்கவும்",
- "recentlyUsed": "சமீபத்தில் பயன்படுத்தியவை",
- "cliCannotContinue": "இந்த CLI-இல் அமர்வைத் தொடர முடியாது. Cloud Agent அல்லது வேறொரு CLI-ஐத் தேர்ந்தெடுக்கவும்.",
"continueFrom": "{{title}} தொடரப்படுகிறது.",
- "importFailed": "இந்த அமர்வை இறக்குமதி செய்ய முடியவில்லை.",
"importingSession": "அமர்வு இறக்குமதி செய்யப்படுகிறது",
- "discardWithUploadsMessage": "உங்கள் வினவலும் அனுப்பிய செய்திகளில் இணைக்கப்படாத பதிவேற்றங்களும் நீக்கப்படும்."
+ "cliCannotContinue": "இந்த CLI-இல் அமர்வைத் தொடர முடியாது. Cloud Agent அல்லது வேறொரு CLI-ஐத் தேர்ந்தெடுக்கவும்.",
+ "importFailed": "இந்த அமர்வை இறக்குமதி செய்ய முடியவில்லை."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} கோப்பு புதுப்பிக்கப்பட்டது.",
diff --git a/apps/mobile/src/i18n/locales/te.json b/apps/mobile/src/i18n/locales/te.json
index 03920a5af7..f577295910 100644
--- a/apps/mobile/src/i18n/locales/te.json
+++ b/apps/mobile/src/i18n/locales/te.json
@@ -36,6 +36,7 @@
"cost": "ఖర్చు",
"discard": "విస్మరించండి",
"findings": "గుర్తించిన సమస్యలు",
+ "mergeRequest": "మెర్జ్ రిక్వెస్ట్",
"notConnected": "కనెక్ట్ కాలేదు",
"notifications": "నోటిఫికేషన్లు",
"pullRequest": "పుల్ రిక్వెస్ట్",
@@ -340,10 +341,17 @@
"emptyDiffRow": "మార్పుల పోలికలో ఖాళీ అడ్డు వరుస"
},
"connectionExpired": "GitHub కనెక్షన్ గడువు ముగిసింది.",
+ "capabilities": {
+ "banner": {
+ "title": "ఈ ప్రొవైడర్లో అందుబాటులో లేదు",
+ "accessibility": "ఈ ప్రొవైడర్లో అందుబాటులో లేదు: {{reason}}"
+ }
+ },
"merge": {
"merge": "మెర్జ్",
"mergeNow": "ఇప్పుడు మెర్జ్ చేయండి",
"mergePullRequest": "పుల్ రిక్వెస్ట్ మెర్జ్",
+ "mergeTermTitle": "{{term}} మెర్జ్",
"enableAutoMerge": "ఆటో-మెర్జ్ను ప్రారంభించండి",
"disableAutoMerge": "ఆటో-మెర్జ్ను నిలిపివేయండి",
"autoMergeOn": "ఆటో-మెర్జ్ ఆన్లో ఉంది",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "మెర్జ్ తర్వాత బ్రాంచ్ను తొలగించండి",
"noEnabledMethods": "ఈ రిపోజిటరీలో ఏ మెర్జ్ పద్ధతినీ ప్రారంభించలేదు. మెర్జ్, స్క్వాష్ లేదా రీబేస్ పద్ధతిని ప్రారంభించమని రిపోజిటరీ నిర్వాహకుడిని అడగండి.",
"confirmTitle": "పుల్ రిక్వెస్ట్ను మెర్జ్ చేయాలా?",
+ "confirmTitleTerm": "{{term}}ను మెర్జ్ చేయాలా?",
"confirmMessage": "దీనితో మీ మార్పులు బేస్ బ్రాంచ్లో మెర్జ్ అవుతాయి.",
"enableAutoMergeConfirmTitle": "ఆటో-మెర్జ్ను ప్రారంభించాలా?",
"enableAutoMergeConfirmMessage": "అవసరమైన తనిఖీలన్నీ విజయవంతమయ్యాక GitHub ఈ పుల్ రిక్వెస్ట్ను స్వయంచాలకంగా మెర్జ్ చేస్తుంది.",
+ "enableAutoMergeConfirmMessageTerm": "పైప్లైన్ విజయవంతమైన తర్వాత {{term}} ఆటోమేటిక్గా మెర్జ్ అవుతుంది.",
+ "enableAutoMergeDescriptionTerm": "పైప్లైన్ విజయవంతమైన తర్వాత GitLab ఈ {{term}}ను ఆటోమేటిక్గా మెర్జ్ చేస్తుంది.",
"forbidden": "ఈ పుల్ రిక్వెస్ట్ను మెర్జ్ చేయడానికి మీకు అనుమతి లేదు.",
"cannotMerge": "ఈ పుల్ రిక్వెస్ట్ను ప్రస్తుత స్థితిలో మెర్జ్ చేయలేము.",
"couldNotMerge": "పుల్ రిక్వెస్ట్ను మెర్జ్ చేయలేకపోయాము.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "ఇప్పటికే మెర్జ్ అయింది",
- "closed": "ఈ పుల్ రిక్వెస్ట్ మూసివేయబడింది"
+ "closed": "ఈ పుల్ రిక్వెస్ట్ మూసివేయబడింది",
+ "closedMergeRequest": "ఈ మెర్జ్ రిక్వెస్ట్ మూసివేయబడింది"
},
"partialSuccessBanner": {
"body": "బ్రాంచ్ను తొలగించలేకపోయాము: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ఈ పుల్ రిక్వెస్ట్ను ఇంకా మెర్జ్ చేయలేము",
"notMergeableDetail": "మెర్జ్ చేయగల స్థితిని GitHub {{state}}గా తెలిపింది."
},
+ "restrictions": {
+ "title": "మెర్జ్ పరిమితులు",
+ "approvalsRequired_one": "{{displayCount}} ఆమోదం అవసరం",
+ "approvalsRequired_other": "{{displayCount}} ఆమోదాలు అవసరం",
+ "pipelineMustSucceed": "మెర్జ్ చేసే ముందు పైప్లైన్ విజయవంతం కావాలి."
+ },
+ "providerBlocked": {
+ "failingPipeline": "చివరి కమిట్పై పైప్లైన్ విఫలమవుతోంది.",
+ "pendingPipeline": "చివరి కమిట్పై పైప్లైన్ ఇంకా నడుస్తోంది.",
+ "permission": "ఈ {{term}}ను మెర్జ్ చేయడానికి మీకు అనుమతి లేదు.",
+ "draft": "మెర్జ్ చేయడానికి ముందు {{term}}ను సమీక్షకు సిద్ధంగా ఉన్నట్లు గుర్తించండి."
+ },
"methodLabels": {
"merge": "మెర్జ్ కమిట్ను సృష్టించండి",
"squash": "స్క్వాష్ చేసి మెర్జ్ చేయండి",
@@ -448,6 +472,7 @@
"acceptTerms": "అంగీకరించండి",
"replyBadRequest": "ఈ ప్రత్యుత్తరాన్ని పోస్ట్ చేయలేము. చర్చలో మార్పులు జరిగి ఉండవచ్చు.",
"replyForbidden": "ఈ పుల్ రిక్వెస్ట్కు ప్రత్యుత్తరం ఇవ్వడానికి మీకు అనుమతి లేదు.",
+ "replyForbiddenTerm": "ఈ {{term}}కు ప్రత్యుత్తరం ఇవ్వడానికి మీకు అనుమతి లేదు.",
"moderation": {
"reportContent": {
"terminal": "ఈ వ్యాఖ్యపై ఫిర్యాదు చేయలేము.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "పుల్ రిక్వెస్ట్ను సమీక్షించండి",
"headLine": "{{counts}} · హెడ్ {{sha}}",
"entry": {
- "eyebrow": "URL ద్వారా పుల్ రిక్వెస్ట్ను తెరవండి.",
- "pastePrLink": "PR లింక్ను పేస్ట్ చేయండి",
- "noRecentPrs": "ఇటీవలి PRలు లేవు",
- "noRecentPrsDescription": "సమీక్ష ప్రారంభించడానికి పైన PR లింక్ను పేస్ట్ చేయండి — ఆ PR తదుపరిసారి ఇక్కడ కనిపిస్తుంది.",
+ "eyebrow": "URL ద్వారా పుల్ రిక్వెస్ట్ లేదా మెర్జ్ రిక్వెస్ట్ను తెరవండి",
+ "pastePrLink": "పుల్ రిక్వెస్ట్ లేదా మెర్జ్ రిక్వెస్ట్ లింక్ను పేస్ట్ చేయండి",
+ "noRecentPrs": "ఇటీవలి సమీక్షలు లేవు",
+ "noRecentPrsDescription": "సమీక్ష ప్రారంభించడానికి పైన లింక్ను పేస్ట్ చేయండి — తదుపరి సారి అది ఇక్కడ కనిపిస్తుంది.",
"couldNotLoad": "లోడ్ చేయలేకపోయాము.",
"removeFromRecentsTitle": "ఇటీవలి జాబితా నుంచి తీసివేయాలా?",
- "removeFromRecentsMessage": "ఈ పుల్ రిక్వెస్ట్ను మీ ఇటీవలి జాబితా నుంచి తీసివేస్తాము.",
+ "removeFromRecentsMessage": "ఈ సమీక్ష మీ ఇటీవలి జాబితా నుండి తొలగించబడుతుంది.",
"removeRecentAccessibility": "{{repo}}ను ఇటీవలి జాబితా నుంచి తీసివేయండి",
- "urlAccessibility": "GitHub పుల్ రిక్వెస్ట్ URL",
- "clearLink": "పుల్ రిక్వెస్ట్ లింక్ను తీసివేయండి",
- "pasteLink": "పుల్ రిక్వెస్ట్ లింక్ను పేస్ట్ చేయండి",
+ "urlAccessibility": "పుల్ రిక్వెస్ట్ లేదా మెర్జ్ రిక్వెస్ట్ URLను నమోదు చేయండి",
+ "urlPlaceholder": "పుల్ రిక్వెస్ట్ లేదా మెర్జ్ రిక్వెస్ట్ URL",
+ "openAccessibility": "పుల్ రిక్వెస్ట్ లేదా మెర్జ్ రిక్వెస్ట్ను తెరవండి",
+ "clearLink": "లింక్ను తొలగించండి",
+ "pasteLink": "పుల్ రిక్వెస్ట్ లేదా మెర్జ్ రిక్వెస్ట్ లింక్ను పేస్ట్ చేయండి",
"open": "ఓపెన్"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub కనెక్షన్ను తనిఖీ చేయలేకపోయాము.",
"checkFailedMessage": "ఇది లోడ్ అయ్యే వరకు సైన్ ఇన్ స్థితిని తెలుసుకోలేము.",
+ "checkFailedTitleGitLab": "GitLab కనెక్షన్ను తనిఖీ చేయలేకపోయాము.",
+ "checkFailedTitleBitbucket": "Bitbucket కనెక్షన్ను తనిఖీ చేయలేకపోయాము.",
+ "providerCheckFailedMessage": "ఇది లోడ్ అయ్యే వరకు కనెక్షన్ స్థితి అందుబాటులో ఉండదు.",
"reconnectTitle": "GitHubకు మళ్లీ కనెక్షన్",
"reconnectDescription": "మీ GitHub కనెక్షన్ అనుమతిని రద్దు చేశారు. మొబైల్లో పుల్ రిక్వెస్ట్లను సమీక్షించడం కొనసాగించడానికి మళ్లీ కనెక్ట్ చేయండి.",
- "description": "మొబైల్లో పుల్ రిక్వెస్ట్లను సమీక్షించడానికి మీ GitHub ఖాతాను కనెక్ట్ చేయండి."
+ "description": "మొబైల్లో పుల్ రిక్వెస్ట్లను సమీక్షించడానికి మీ GitHub ఖాతాను కనెక్ట్ చేయండి.",
+ "gitlabDescription": "మొబైల్లో మెర్జ్ రిక్వెస్ట్లను సమీక్షించడానికి మీ GitLab ఖాతాను కనెక్ట్ చేయండి.",
+ "bitbucketDescription": "మొబైల్లో పుల్ రిక్వెస్ట్లను సమీక్షించడానికి ఈ సంస్థను Bitbucketకు కనెక్ట్ చేయండి.",
+ "bitbucketOrgOnlyDescription": "దాని Bitbucket పుల్ రిక్వెస్ట్లను సమీక్షించడానికి మీ ప్రొఫైల్లో సంస్థను ఎంచుకోండి."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub కనెక్షన్ గడువు ముగిసింది.",
- "message": "మీ GitHub కనెక్షన్ ఇక చెల్లదు. కనెక్షన్ను మళ్లీ తనిఖీ చేయండి — అవసరమైతే మళ్లీ కనెక్ట్ చేయమని అడుగుతాము."
+ "message": "మీ GitHub కనెక్షన్ ఇక చెల్లదు. కనెక్షన్ను మళ్లీ తనిఖీ చేయండి — అవసరమైతే మళ్లీ కనెక్ట్ చేయమని అడుగుతాము.",
+ "gitlabTitle": "GitLab కనెక్షన్ గడువు ముగిసింది.",
+ "bitbucketTitle": "Bitbucket కనెక్షన్ గడువు ముగిసింది.",
+ "providerMessage": "మీ {{provider}} కనెక్షన్ ఇక చెల్లదు. కనెక్షన్ను మళ్లీ తనిఖీ చేయండి — అవసరమైతే మళ్లీ కనెక్ట్ చేయమని అడుగుతాము."
},
"eventChips": {
"comment": "వ్యాఖ్య",
@@ -643,6 +679,21 @@
"files": "ఫైళ్లు",
"discussion": "చర్చ"
},
+ "terms": {
+ "pullRequest": "పుల్ రిక్వెస్ట్",
+ "mergeRequest": "మెర్జ్ రిక్వెస్ట్",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "మెర్జ్ రిక్వెస్ట్ను పంచుకోండి",
+ "viewOnProvider": "{{provider}}పై చూడండి",
+ "mergeRequestUnavailable": "మెర్జ్ రిక్వెస్ట్ అందుబాటులో లేదు",
+ "unavailableDescription": "అది తొలగించబడి ఉండవచ్చు, లేదా మీకు దానికి యాక్సెస్ ఉండకపోవచ్చు.",
+ "accessDeniedMergeRequest": "ఈ మెర్జ్ రిక్వెస్ట్ను చూడటానికి మీకు అనుమతి లేదు.",
+ "couldNotLoadMergeRequest": "మెర్జ్ రిక్వెస్ట్ను లోడ్ చేయలేకపోయాము.",
+ "discussionAccessDenied": "ఈ మెర్జ్ రిక్వెస్ట్ చర్చను చూడటానికి మీకు అనుమతి లేదు.",
+ "discussionUnavailableMessage": "ఈ మెర్జ్ రిక్వెస్ట్ తీసివేయబడి ఉండవచ్చు.",
+ "noDiscussionDescription": "ఈ మెర్జ్ రిక్వెస్ట్పై సమీక్ష చర్చలు లేదా సంభాషణలో వ్యాఖ్యలు లేవు.",
+ "noFilesChangedDescription": "ఈ మెర్జ్ రిక్వెస్ట్లో ఏ ఫైల్లోనూ మార్పులు లేవు."
+ },
"fileStatus": {
"modified": "సవరించబడింది",
"renamed": "పేరు మార్చబడింది",
@@ -659,7 +710,7 @@
"emptyLine": "(ఖాళీ)"
},
"linkPasteClipboardEmpty": "క్లిప్బోర్డ్ ఖాళీగా ఉంది.",
- "linkPasteNotAPullRequest": "ఇది GitHub పుల్ రిక్వెస్ట్ లింక్ కాదు.",
+ "linkPasteNotAPullRequest": "ఇది పుల్ రిక్వెస్ట్ లేదా మెర్జ్ రిక్వెస్ట్ లింక్ కాదు",
"announce": {
"commentPosted": "వ్యాఖ్య పోస్ట్ చేయబడింది",
"reviewSubmitted": "సమీక్ష సమర్పించబడింది",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ఈ వ్యాఖ్యను పోస్ట్ చేయలేము. ఎంచుకున్న పంక్తి మారి ఉండవచ్చు లేదా PRను నవీకరించి ఉండవచ్చు.",
"reviewNotSubmitted": "ఈ సమీక్షను ప్రస్తుత స్థితిలో సమర్పించలేము. PRలో మార్పులు జరిగి ఉండవచ్చు లేదా ఇది మీ స్వంత పుల్ రిక్వెస్ట్ కావచ్చు, దాన్ని మీరే సమీక్షించలేరు.",
+ "reviewNotSubmittedTerm": "ఈ సమీక్షను అలాగే సమర్పించలేము. {{term}} మారి ఉండవచ్చు, లేదా మీ స్వంత {{term}}ను మీరు సమీక్షించలేరు.",
"couldNotPostComment": "వ్యాఖ్యను పోస్ట్ చేయలేకపోయాము.",
"couldNotSubmitReview": "సమీక్షను సమర్పించలేకపోయాము. మీ కనెక్షన్ను తనిఖీ చేసి మళ్లీ ప్రయత్నించండి."
},
@@ -675,6 +727,7 @@
"couldNotReply": "బదులు పంపలేకపోయాం.",
"couldNotCompleteAction": "ఈ చర్యను పూర్తి చేయలేకపోయాము.",
"mergeResultDefaultError": "GitHub మెర్జ్ను పూర్తి చేయలేదు.",
+ "mergeResultNotCompleted": "{{term}} మెర్జ్ కాలేదు. దాని స్థితిని తనిఖీ చేసి మళ్లీ ప్రయత్నించండి.",
"ambiguous": "నిర్ధారించలేకపోయాము — మళ్లీ ప్రయత్నించే ముందు PRని తనిఖీ చేయండి.",
"persistenceFailed": "ఈ చర్యను నమోదు చేయలేకపోయాము. తర్వాత మళ్లీ ప్రయత్నించండి.",
"forbidden": "ఈ చర్యకు అనుమతి లేదు."
@@ -1988,11 +2041,31 @@
"retryConnection": "కనెక్ట్ చేయడానికి మళ్లీ ప్రయత్నించండి"
},
"newSession": {
+ "recentlyUsed": "ఇటీవల ఉపయోగించినవి",
+ "couldNotLoadGithubRepositories": "GitHub రిపోజిటరీలను లోడ్ చేయలేకపోయాము.",
+ "couldNotLoadGitlabRepositories": "GitLab రిపోజిటరీలను లోడ్ చేయలేకపోయాము.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket రిపోజిటరీలను లోడ్ చేయలేకపోయాము.",
"connectGithubDescription": "మీ బ్రౌజర్లో GitHubను కనెక్ట్ చేయండి. తర్వాత రిపోజిటరీని ఎంచుకోవడానికి ఇక్కడికి తిరిగి రండి.",
+ "connectGitlabDescription": "మీ బ్రౌజర్లో GitLabను కనెక్ట్ చేయండి. తర్వాత రిపోజిటరీని ఎంచుకోవడానికి ఇక్కడికి తిరిగి రండి.",
+ "connectBitbucketDescription": "మీ బ్రౌజర్లో Bitbucketను కనెక్ట్ చేయండి. తర్వాత రిపోజిటరీని ఎంచుకోవడానికి ఇక్కడికి తిరిగి రండి.",
"openGithub": "GitHub తెరవండి",
+ "openGitlab": "GitLab తెరవండి",
+ "openBitbucket": "Bitbucket తెరవండి",
"refreshRepositories": "రిపోజిటరీలను రిఫ్రెష్ చేయండి",
"githubConnected": "GitHub కనెక్ట్ అయింది",
+ "gitlabConnected": "GitLab కనెక్ట్ అయింది",
"noRepositoriesVisible": "రిపోజిటరీలు కనిపించడం లేదు. Kilo GitHub యాప్కు రిపోజిటరీలను యాక్సెస్ చేసే అనుమతి ఉందో తనిఖీ చేసి, రిఫ్రెష్ చేయండి.",
+ "noRepositoriesVisibleGitlab": "రిపోజిటరీలు కనిపించడం లేదు. GitLabలో రిపోజిటరీలను యాక్సెస్ చేసే అనుమతులను తనిఖీ చేసి, రిఫ్రెష్ చేయండి.",
+ "noRepositoriesVisibleBitbucket": "రిపోజిటరీలు కనిపించడం లేదు. Bitbucketలో రిపోజిటరీలను యాక్సెస్ చేసే అనుమతులను తనిఖీ చేసి, రిఫ్రెష్ చేయండి.",
+ "bitbucketOrganizationsOnly": "Bitbucket సంస్థలకు మాత్రమే అందుబాటులో ఉంటుంది.",
+ "branchPickerTitle": "బ్రాంచ్ను ఎంచుకోండి",
+ "branchDefault": "డిఫాల్ట్",
+ "branchAccessibility": "బ్రాంచ్: {{label}}",
+ "branchLoading": "బ్రాంచ్లు లోడ్ అవుతున్నాయి",
+ "branchLoadError": "బ్రాంచ్లను లోడ్ చేయలేకపోయాము",
+ "branchUnavailable": "ఈ రిపొజిటరీ కోసం బ్రాంచ్లు అందుబాటులో లేవు. ప్రొవైడర్ వద్ద మీ యాక్సెస్ను తనిఖీ చేసి, వేరే రిపొజిటరీని ఎంచుకోండి.",
+ "branchEmpty": "బ్రాంచ్లు అందుబాటులో లేవు",
+ "branchPlaceholder": "బ్రాంచ్ను ఎంచుకోండి",
"runOnWithTarget": "అమలు చేసే చోటు: {{target}}",
"environment": "పని వాతావరణం",
"couldNotLoadEnvironment": "మీ పని వాతావరణాన్ని లోడ్ చేయలేకపోయాము.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "రిపోజిటరీలను రిఫ్రెష్ చేయలేకపోయాము. మళ్లీ ప్రయత్నించండి.",
"discardDraftTitle": "చిత్తుప్రతిని తొలగించాలా?",
"discardDraftMessage": "మీ ప్రాంప్ట్ తొలగిపోతుంది.",
+ "discardWithUploadsMessage": "మీ ప్రాంప్ట్తో పాటు, అప్లోడ్ చేసి ఇంకా ఉపయోగించని ఫైళ్లు కూడా తొలగిపోతాయి.",
"discardFailed": "చిత్తుప్రతిని తొలగించలేకపోయాము. మళ్లీ ప్రయత్నించండి.",
"remoteHint": "స్థానిక kilo ప్రాసెస్ను నియంత్రించడానికి మీ కంప్యూటర్లో `kilo remote` అమలు చేయండి లేదా నడుస్తున్న CLI సెషన్లో `/remote` అమలు చేయండి.",
- "connectBitbucketDescription": "మీ బ్రౌజర్లో Bitbucketను కనెక్ట్ చేయండి. తర్వాత రిపోజిటరీని ఎంచుకోవడానికి ఇక్కడికి తిరిగి రండి.",
- "connectGitlabDescription": "మీ బ్రౌజర్లో GitLabను కనెక్ట్ చేయండి. తర్వాత రిపోజిటరీని ఎంచుకోవడానికి ఇక్కడికి తిరిగి రండి.",
- "couldNotLoadBitbucketRepositories": "Bitbucket రిపోజిటరీలను లోడ్ చేయలేకపోయాము.",
- "couldNotLoadGithubRepositories": "GitHub రిపోజిటరీలను లోడ్ చేయలేకపోయాము.",
- "couldNotLoadGitlabRepositories": "GitLab రిపోజిటరీలను లోడ్ చేయలేకపోయాము.",
- "gitlabConnected": "GitLab కనెక్ట్ అయింది",
- "noRepositoriesVisibleBitbucket": "రిపోజిటరీలు కనిపించడం లేదు. Bitbucketలో రిపోజిటరీలను యాక్సెస్ చేసే అనుమతులను తనిఖీ చేసి, రిఫ్రెష్ చేయండి.",
- "noRepositoriesVisibleGitlab": "రిపోజిటరీలు కనిపించడం లేదు. GitLabలో రిపోజిటరీలను యాక్సెస్ చేసే అనుమతులను తనిఖీ చేసి, రిఫ్రెష్ చేయండి.",
- "openBitbucket": "Bitbucket తెరవండి",
- "openGitlab": "GitLab తెరవండి",
- "recentlyUsed": "ఇటీవల ఉపయోగించినవి",
"continueFrom": "{{title}}ను కొనసాగిస్తోంది.",
"importingSession": "సెషన్ను దిగుమతి చేస్తోంది",
"cliCannotContinue": "ఈ CLIతో సెషన్ను కొనసాగించడం సాధ్యం కాదు. Cloud Agent లేదా మరో CLIను ఎంచుకోండి.",
- "importFailed": "ఈ సెషన్ను దిగుమతి చేయలేకపోయాము.",
- "discardWithUploadsMessage": "మీ ప్రాంప్ట్తో పాటు, అప్లోడ్ చేసి ఇంకా ఉపయోగించని ఫైళ్లు కూడా తొలగిపోతాయి."
+ "importFailed": "ఈ సెషన్ను దిగుమతి చేయలేకపోయాము."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} ఫైల్ను నవీకరించాము.",
diff --git a/apps/mobile/src/i18n/locales/th.json b/apps/mobile/src/i18n/locales/th.json
index 18e056e780..7cfaf6e2b4 100644
--- a/apps/mobile/src/i18n/locales/th.json
+++ b/apps/mobile/src/i18n/locales/th.json
@@ -36,6 +36,7 @@
"cost": "ค่าใช้จ่าย",
"discard": "ทิ้ง",
"findings": "ข้อค้นพบ",
+ "mergeRequest": "merge request",
"notConnected": "ยังไม่เชื่อมต่อ",
"notifications": "การแจ้งเตือน",
"pullRequest": "พูลรีเควสต์",
@@ -340,10 +341,17 @@
"emptyDiffRow": "แถวว่างในส่วนต่าง"
},
"connectionExpired": "การเชื่อมต่อ GitHub หมดอายุแล้ว",
+ "capabilities": {
+ "banner": {
+ "title": "ไม่พร้อมใช้งานในผู้ให้บริการนี้",
+ "accessibility": "ไม่พร้อมใช้งานในผู้ให้บริการนี้: {{reason}}"
+ }
+ },
"merge": {
"merge": "ผสาน",
"mergeNow": "รวมตอนนี้",
"mergePullRequest": "รวม PR",
+ "mergeTermTitle": "รวม {{term}}",
"enableAutoMerge": "เปิดใช้งานการรวมอัตโนมัติ",
"disableAutoMerge": "ปิดใช้งานการรวมอัตโนมัติ",
"autoMergeOn": "เปิดการรวมอัตโนมัติแล้ว",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "ลบบรานช์หลังรวม",
"noEnabledMethods": "รีโพซิทอรีนี้ยังไม่ได้เปิดใช้วิธีการรวมใดเลย ขอให้ผู้ดูแลรีโพซิทอรีเปิดใช้การรวมแบบปกติ สควอช หรือรีเบส",
"confirmTitle": "รวม PR นี้หรือไม่?",
+ "confirmTitleTerm": "รวม {{term}} นี้หรือไม่?",
"confirmMessage": "การดำเนินการนี้จะรวมการเปลี่ยนแปลงของคุณเข้ากับบรานช์ปลายทาง",
"enableAutoMergeConfirmTitle": "เปิดการรวมอัตโนมัติหรือไม่?",
"enableAutoMergeConfirmMessage": "GitHub จะรวม PR นี้โดยอัตโนมัติเมื่อผ่านการตรวจสอบที่บังคับทั้งหมด",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} จะถูกรวมโดยอัตโนมัติเมื่อไปป์ไลน์สำเร็จ",
+ "enableAutoMergeDescriptionTerm": "GitLab จะรวม {{term}} นี้โดยอัตโนมัติเมื่อไปป์ไลน์สำเร็จ",
"forbidden": "คุณไม่มีสิทธิ์รวม PR นี้",
"cannotMerge": "ยังรวม PR นี้ในสถานะปัจจุบันไม่ได้",
"couldNotMerge": "ไม่สามารถรวม PR ได้",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "รวมแล้ว",
- "closed": "PR นี้ปิดแล้ว"
+ "closed": "PR นี้ปิดแล้ว",
+ "closedMergeRequest": "Merge request นี้ปิดแล้ว"
},
"partialSuccessBanner": {
"body": "ไม่สามารถลบบรานช์ได้: {{reason}}",
@@ -401,6 +413,18 @@
"notMergeableTitle": "ยังรวม PR นี้ไม่ได้",
"notMergeableDetail": "GitHub รายงานสถานะการรวมเป็น {{state}}"
},
+ "restrictions": {
+ "title": "ข้อจำกัดการรวม",
+ "approvalsRequired_one": "ต้องมีการอนุมัติ {{displayCount}} ครั้ง",
+ "approvalsRequired_other": "ต้องมีการอนุมัติ {{displayCount}} ครั้ง",
+ "pipelineMustSucceed": "ไปป์ไลน์ต้องสำเร็จก่อนการรวม"
+ },
+ "providerBlocked": {
+ "failingPipeline": "ไปป์ไลน์ล้มเหลวในการคอมมิตล่าสุด",
+ "pendingPipeline": "ไปป์ไลน์ยังทำงานอยู่ในการคอมมิตล่าสุด",
+ "permission": "คุณไม่มีสิทธิ์รวม {{term}} นี้",
+ "draft": "ทำเครื่องหมาย {{term}} ว่าพร้อมรีวิวก่อนรวม"
+ },
"methodLabels": {
"merge": "สร้างคอมมิตการรวม",
"squash": "สควอชแล้วรวม",
@@ -448,6 +472,7 @@
"acceptTerms": "ยอมรับ",
"replyBadRequest": "ไม่สามารถโพสต์การตอบกลับนี้ได้ เธรดอาจมีการเปลี่ยนแปลง",
"replyForbidden": "คุณไม่มีสิทธิ์ตอบกลับใน PR นี้",
+ "replyForbiddenTerm": "คุณไม่มีสิทธิ์ตอบกลับใน {{term}} นี้",
"moderation": {
"reportContent": {
"terminal": "ไม่สามารถรายงานความคิดเห็นนี้ได้",
@@ -508,17 +533,19 @@
"reviewPullRequest": "รีวิว PR",
"headLine": "{{counts}} · คอมมิตล่าสุด {{sha}}",
"entry": {
- "eyebrow": "เปิด PR ด้วย URL",
- "pastePrLink": "วางลิงก์ PR",
- "noRecentPrs": "ยังไม่มี PR ที่เปิดล่าสุด",
- "noRecentPrsDescription": "วางลิงก์ PR ด้านบนเพื่อเริ่มรีวิว ครั้งต่อไป PR นี้จะแสดงที่นี่",
+ "eyebrow": "เปิดพูลรีเควสต์หรือ merge request ด้วย URL",
+ "pastePrLink": "วางลิงก์พูลรีเควสต์หรือ merge request",
+ "noRecentPrs": "ยังไม่มีรีวิวล่าสุด",
+ "noRecentPrsDescription": "วางลิงก์ด้านบนเพื่อเริ่มรีวิว ครั้งต่อไปจะแสดงที่นี่",
"couldNotLoad": "ไม่สามารถโหลดได้",
"removeFromRecentsTitle": "ลบออกจากรายการล่าสุดหรือไม่?",
- "removeFromRecentsMessage": "PR นี้จะถูกลบออกจากรายการล่าสุดของคุณ",
+ "removeFromRecentsMessage": "รีวิวนนี้จะถูกลบออกจากรายการล่าสุดของคุณ",
"removeRecentAccessibility": "ลบ {{repo}} ออกจากรายการล่าสุด",
- "urlAccessibility": "URL ของ PR บน GitHub",
- "clearLink": "ล้างลิงก์ PR",
- "pasteLink": "วางลิงก์ PR",
+ "urlAccessibility": "กรอก URL ของพูลรีเควสต์หรือ merge request",
+ "urlPlaceholder": "URL ของพูลรีเควสต์หรือ merge request",
+ "openAccessibility": "เปิดพูลรีเควสต์หรือ merge request",
+ "clearLink": "ล้างลิงก์",
+ "pasteLink": "วางลิงก์พูลรีเควสต์หรือ merge request",
"open": "เปิด"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "ไม่สามารถตรวจสอบการเชื่อมต่อ GitHub ได้",
"checkFailedMessage": "ยังตรวจสอบสถานะการเข้าสู่ระบบไม่ได้จนกว่าจะโหลดข้อมูลเสร็จ",
+ "checkFailedTitleGitLab": "ไม่สามารถตรวจสอบการเชื่อมต่อ GitLab ได้",
+ "checkFailedTitleBitbucket": "ไม่สามารถตรวจสอบการเชื่อมต่อ Bitbucket ได้",
+ "providerCheckFailedMessage": "สถานะการเชื่อมต่อไม่พร้อมใช้งานจนกว่าจะโหลดเสร็จ",
"reconnectTitle": "เชื่อมต่อ GitHub ใหม่",
"reconnectDescription": "การเชื่อมต่อ GitHub ของคุณถูกเพิกถอน เชื่อมต่อใหม่เพื่อรีวิว PR บนมือถือต่อ",
- "description": "เชื่อมต่อบัญชี GitHub ของคุณเพื่อรีวิว PR บนมือถือ"
+ "description": "เชื่อมต่อบัญชี GitHub ของคุณเพื่อรีวิว PR บนมือถือ",
+ "gitlabDescription": "เชื่อมต่อบัญชี GitLab ของคุณเพื่อรีวิว merge request บนมือถือ",
+ "bitbucketDescription": "เชื่อมต่อ Bitbucket กับองค์กรนี้เพื่อรีวิวพูลรีเควสต์บนมือถือ",
+ "bitbucketOrgOnlyDescription": "เลือกองค์กรในโปรไฟล์ของคุณเพื่อรีวิวพูลรีเควสต์ Bitbucket ขององค์กรนั้น"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "การเชื่อมต่อ GitHub หมดอายุแล้ว",
- "message": "การเชื่อมต่อ GitHub ของคุณใช้ไม่ได้แล้ว ตรวจสอบการเชื่อมต่ออีกครั้ง หากจำเป็น ระบบจะแจ้งให้เชื่อมต่อใหม่"
+ "message": "การเชื่อมต่อ GitHub ของคุณใช้ไม่ได้แล้ว ตรวจสอบการเชื่อมต่ออีกครั้ง หากจำเป็น ระบบจะแจ้งให้เชื่อมต่อใหม่",
+ "gitlabTitle": "การเชื่อมต่อ GitLab หมดอายุแล้ว",
+ "bitbucketTitle": "การเชื่อมต่อ Bitbucket หมดอายุแล้ว",
+ "providerMessage": "การเชื่อมต่อ {{provider}} ของคุณใช้ไม่ได้แล้ว ตรวจสอบการเชื่อมต่ออีกครั้ง หากจำเป็น ระบบจะแจ้งให้เชื่อมต่อใหม่"
},
"eventChips": {
"comment": "แสดงความคิดเห็น",
@@ -643,6 +679,21 @@
"files": "ไฟล์",
"discussion": "การสนทนา"
},
+ "terms": {
+ "pullRequest": "พูลรีเควสต์",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "แชร์ merge request",
+ "viewOnProvider": "ดูบน {{provider}}",
+ "mergeRequestUnavailable": "เปิด merge request ไม่ได้",
+ "unavailableDescription": "อาจถูกลบไปแล้ว หรือคุณอาจไม่มีสิทธิ์เข้าถึง",
+ "accessDeniedMergeRequest": "คุณไม่มีสิทธิ์ดู merge request นี้",
+ "couldNotLoadMergeRequest": "ไม่สามารถโหลด merge request ได้",
+ "discussionAccessDenied": "คุณไม่มีสิทธิ์ดูการสนทนาของ merge request นี้",
+ "discussionUnavailableMessage": "Merge request นี้อาจถูกลบไปแล้ว",
+ "noDiscussionDescription": "Merge request นี้ยังไม่มีเธรดรีวิวหรือความคิดเห็นในการสนทนา",
+ "noFilesChangedDescription": "Merge request นี้ไม่มีการเปลี่ยนแปลงไฟล์"
+ },
"fileStatus": {
"modified": "แก้ไขแล้ว",
"renamed": "เปลี่ยนชื่อแล้ว",
@@ -659,7 +710,7 @@
"emptyLine": "(ว่าง)"
},
"linkPasteClipboardEmpty": "คลิปบอร์ดว่างเปล่า",
- "linkPasteNotAPullRequest": "ลิงก์นี้ไม่ใช่ PR บน GitHub",
+ "linkPasteNotAPullRequest": "ไม่ใช่ลิงก์พูลรีเควสต์หรือ merge request",
"announce": {
"commentPosted": "โพสต์ความคิดเห็นแล้ว",
"reviewSubmitted": "ส่งรีวิวแล้ว",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "ไม่สามารถโพสต์ความคิดเห็นนี้ได้ บรรทัดที่เลือกอาจมีการเปลี่ยนแปลง หรือ PR อาจได้รับการอัปเดตแล้ว",
"reviewNotSubmitted": "ยังส่งรีวิวนี้ไม่ได้ PR อาจมีการเปลี่ยนแปลง หรือเป็น PR ของคุณเองซึ่งคุณรีวิวไม่ได้",
+ "reviewNotSubmittedTerm": "ส่งรีวิวนี้ตามที่เป็นอยู่ไม่ได้ {{term}}อาจเปลี่ยนไปแล้ว หรือคุณรีวิว{{term}}ของตัวเองไม่ได้",
"couldNotPostComment": "ไม่สามารถโพสต์ความคิดเห็นได้",
"couldNotSubmitReview": "ไม่สามารถส่งรีวิวได้ ตรวจสอบการเชื่อมต่อของคุณแล้วลองอีกครั้ง"
},
@@ -675,6 +727,7 @@
"couldNotReply": "ไม่สามารถตอบกลับได้",
"couldNotCompleteAction": "ดำเนินการไม่สำเร็จ",
"mergeResultDefaultError": "GitHub รวมไม่สำเร็จ",
+ "mergeResultNotCompleted": "{{term}} ยังไม่ถูกรวม ตรวจสอบสถานะแล้วลองอีกครั้ง",
"ambiguous": "ยืนยันผลไม่ได้ — ตรวจสอบ PR ก่อนลองอีกครั้ง",
"persistenceFailed": "เราไม่สามารถบันทึกการดำเนินการนี้ได้ โปรดลองอีกครั้งในภายหลัง",
"forbidden": "ไม่มีสิทธิ์ดำเนินการ"
@@ -1988,11 +2041,31 @@
"retryConnection": "ลองเชื่อมต่อใหม่"
},
"newSession": {
+ "recentlyUsed": "ที่ใช้ล่าสุด",
+ "couldNotLoadGithubRepositories": "ไม่สามารถโหลดคลังโค้ดจาก GitHub ได้",
+ "couldNotLoadGitlabRepositories": "ไม่สามารถโหลดคลังโค้ดจาก GitLab ได้",
+ "couldNotLoadBitbucketRepositories": "ไม่สามารถโหลดคลังโค้ดจาก Bitbucket ได้",
"connectGithubDescription": "เชื่อมต่อ GitHub ในเบราว์เซอร์ แล้วกลับมาเลือกคลังโค้ดที่นี่",
+ "connectGitlabDescription": "เชื่อมต่อ GitLab ในเบราว์เซอร์ แล้วกลับมาเลือกคลังโค้ดที่นี่",
+ "connectBitbucketDescription": "เชื่อมต่อ Bitbucket ในเบราว์เซอร์ แล้วกลับมาเลือกคลังโค้ดที่นี่",
"openGithub": "เปิด GitHub",
+ "openGitlab": "เปิด GitLab",
+ "openBitbucket": "เปิด Bitbucket",
"refreshRepositories": "รีเฟรชรายการคลังโค้ด",
"githubConnected": "เชื่อมต่อ GitHub แล้ว",
+ "gitlabConnected": "เชื่อมต่อ GitLab แล้ว",
"noRepositoriesVisible": "ไม่พบคลังโค้ด ตรวจสอบสิทธิ์เข้าถึงคลังโค้ดของแอป Kilo บน GitHub แล้วรีเฟรช",
+ "noRepositoriesVisibleGitlab": "ไม่พบคลังโค้ด ตรวจสอบสิทธิ์เข้าถึงคลังโค้ดบน GitLab แล้วรีเฟรช",
+ "noRepositoriesVisibleBitbucket": "ไม่พบคลังโค้ด ตรวจสอบสิทธิ์เข้าถึงคลังโค้ดบน Bitbucket แล้วรีเฟรช",
+ "bitbucketOrganizationsOnly": "Bitbucket พร้อมใช้งานสำหรับองค์กรเท่านั้น",
+ "branchPickerTitle": "เลือกบรานช์",
+ "branchDefault": "ค่าเริ่มต้น",
+ "branchAccessibility": "บรานช์: {{label}}",
+ "branchLoading": "กำลังโหลดบรานช์",
+ "branchLoadError": "โหลดบรานช์ไม่ได้",
+ "branchUnavailable": "ไม่มีบรานช์พร้อมใช้งานสำหรับคลังโค้ดนี้ ตรวจสอบสิทธิ์การเข้าถึงของคุณกับผู้ให้บริการ แล้วเลือกคลังโค้ดอื่น",
+ "branchEmpty": "ไม่มีบรานช์พร้อมใช้งาน",
+ "branchPlaceholder": "เลือกบรานช์หนึ่ง",
"runOnWithTarget": "รันบน: {{target}}",
"environment": "สภาพแวดล้อม",
"couldNotLoadEnvironment": "ไม่สามารถโหลดสภาพแวดล้อมของคุณได้",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "ไม่สามารถรีเฟรชรายการคลังโค้ดได้ กรุณาลองอีกครั้ง",
"discardDraftTitle": "ทิ้งฉบับร่างหรือไม่?",
"discardDraftMessage": "พรอมต์ที่คุณเขียนไว้จะหายไป",
+ "discardWithUploadsMessage": "พรอมต์และไฟล์ที่อัปโหลดไว้แต่ยังไม่ได้ใช้จะถูกลบ",
"discardFailed": "ไม่สามารถทิ้งฉบับร่างได้ กรุณาลองอีกครั้ง",
"remoteHint": "รัน `kilo remote` บนคอมพิวเตอร์ หรือ `/remote` ในเซสชัน CLI ที่กำลังทำงาน เพื่อควบคุมโปรเซส kilo บนเครื่องนั้น",
- "connectBitbucketDescription": "เชื่อมต่อ Bitbucket ในเบราว์เซอร์ แล้วกลับมาเลือกคลังโค้ดที่นี่",
- "connectGitlabDescription": "เชื่อมต่อ GitLab ในเบราว์เซอร์ แล้วกลับมาเลือกคลังโค้ดที่นี่",
- "couldNotLoadBitbucketRepositories": "ไม่สามารถโหลดคลังโค้ดจาก Bitbucket ได้",
- "couldNotLoadGithubRepositories": "ไม่สามารถโหลดคลังโค้ดจาก GitHub ได้",
- "couldNotLoadGitlabRepositories": "ไม่สามารถโหลดคลังโค้ดจาก GitLab ได้",
- "gitlabConnected": "เชื่อมต่อ GitLab แล้ว",
- "noRepositoriesVisibleBitbucket": "ไม่พบคลังโค้ด ตรวจสอบสิทธิ์เข้าถึงคลังโค้ดบน Bitbucket แล้วรีเฟรช",
- "noRepositoriesVisibleGitlab": "ไม่พบคลังโค้ด ตรวจสอบสิทธิ์เข้าถึงคลังโค้ดบน GitLab แล้วรีเฟรช",
- "openBitbucket": "เปิด Bitbucket",
- "openGitlab": "เปิด GitLab",
- "recentlyUsed": "ที่ใช้ล่าสุด",
"continueFrom": "กำลังทำงานต่อจาก {{title}}",
"importingSession": "กำลังนำเข้าเซสชัน",
"cliCannotContinue": "CLI นี้ไม่สามารถทำงานต่อจากเซสชันเดิมได้ เลือก Cloud Agent หรือ CLI อื่น",
- "importFailed": "ไม่สามารถนำเข้าเซสชันนี้ได้",
- "discardWithUploadsMessage": "พรอมต์และไฟล์ที่อัปโหลดไว้แต่ยังไม่ได้ใช้จะถูกลบ"
+ "importFailed": "ไม่สามารถนำเข้าเซสชันนี้ได้"
},
"partRenderer": {
"updatedFileCount_one": "อัปเดตไฟล์แล้ว {{displayCount}} ไฟล์",
diff --git a/apps/mobile/src/i18n/locales/tr.json b/apps/mobile/src/i18n/locales/tr.json
index 3b1bf98e65..370b99d7f5 100644
--- a/apps/mobile/src/i18n/locales/tr.json
+++ b/apps/mobile/src/i18n/locales/tr.json
@@ -4,6 +4,8 @@
"done": "Bitti",
"retry": "Tekrar dene",
"tryAgain": "Tekrar dene",
+ "continue": "Devam et",
+ "notNow": "Şimdi değil",
"language": "Dil",
"device": "Cihaz",
"share": "{{title}} öğesini paylaş",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "Panoya kopyalanamadı.",
"required": "zorunlu",
"error": "hata: {{error}}",
- "notNow": "Şimdi değil",
- "continue": "Devam et",
"back": "Geri",
"somethingWentWrong": "Bir sorun oluştu.",
"couldNotOpen": "{{label}} açılamadı.",
@@ -36,6 +36,7 @@
"cost": "Maliyet",
"discard": "Vazgeç",
"findings": "Bulgular",
+ "mergeRequest": "birleştirme isteği",
"notConnected": "Bağlı değil",
"notifications": "Bildirimler",
"pullRequest": "çekme isteği",
@@ -1557,11 +1558,31 @@
"retryConnection": "Yeniden bağlanmayı dene"
},
"newSession": {
+ "recentlyUsed": "Son kullanılanlar",
+ "couldNotLoadGithubRepositories": "GitHub depoları yüklenemedi.",
+ "couldNotLoadGitlabRepositories": "GitLab depoları yüklenemedi.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket depoları yüklenemedi.",
"connectGithubDescription": "Tarayıcında GitHub hesabını bağla, ardından bir depo seçmek için buraya dön.",
+ "connectGitlabDescription": "Tarayıcında GitLab hesabını bağla, ardından bir depo seçmek için buraya dön.",
+ "connectBitbucketDescription": "Tarayıcında Bitbucket hesabını bağla, ardından bir depo seçmek için buraya dön.",
"openGithub": "GitHub'ı aç",
+ "openGitlab": "GitLab'ı aç",
+ "openBitbucket": "Bitbucket'ı aç",
"refreshRepositories": "Depoları yenile",
"githubConnected": "GitHub bağlı",
+ "gitlabConnected": "GitLab bağlı",
"noRepositoriesVisible": "Hiçbir depo görünmüyor. Kilo GitHub uygulamasının depo erişim izinlerini kontrol et, ardından listeyi yenile.",
+ "noRepositoriesVisibleGitlab": "Hiçbir depo görünmüyor. GitLab depo erişim izinlerini kontrol et, ardından listeyi yenile.",
+ "noRepositoriesVisibleBitbucket": "Hiçbir depo görünmüyor. Bitbucket depo erişim izinlerini kontrol et, ardından listeyi yenile.",
+ "bitbucketOrganizationsOnly": "Bitbucket yalnızca kuruluşlar için kullanılabilir.",
+ "branchPickerTitle": "Dal seç",
+ "branchDefault": "Varsayılan",
+ "branchAccessibility": "Dal: {{label}}",
+ "branchLoading": "Dallar yükleniyor",
+ "branchLoadError": "Dallar yüklenemedi",
+ "branchUnavailable": "Bu depo için dal kullanılamıyor. Sağlayıcıdaki erişimini kontrol et, ardından başka bir depo seç.",
+ "branchEmpty": "Kullanılabilir dal yok",
+ "branchPlaceholder": "Bir dal seç",
"runOnWithTarget": "Çalıştırma yeri: {{target}}",
"environment": "Ortam",
"couldNotLoadEnvironment": "Ortamın yüklenemedi.",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "Bekleyen oturumlar okunamadı. Tekrar dene.",
"failedToCreate": "Oturum oluşturulamadı.",
"couldNotRefreshRepositories": "Depolar yenilenemedi. Tekrar dene.",
- "discardDraftMessage": "İstemin silinecek.",
"discardDraftTitle": "Taslak silinsin mi?",
+ "discardDraftMessage": "İstemin silinecek.",
+ "discardWithUploadsMessage": "İstemin ve henüz bir mesaja eklenmemiş tüm yüklemeler silinecek.",
"discardFailed": "Taslak silinemedi. Tekrar dene.",
"remoteHint": "Yerel bir kilo sürecini kontrol etmek için bilgisayarında `kilo remote` komutunu veya çalışan bir CLI oturumunda `/remote` komutunu çalıştır.",
- "connectBitbucketDescription": "Tarayıcında Bitbucket hesabını bağla, ardından bir depo seçmek için buraya dön.",
- "connectGitlabDescription": "Tarayıcında GitLab hesabını bağla, ardından bir depo seçmek için buraya dön.",
- "couldNotLoadBitbucketRepositories": "Bitbucket depoları yüklenemedi.",
- "couldNotLoadGithubRepositories": "GitHub depoları yüklenemedi.",
- "couldNotLoadGitlabRepositories": "GitLab depoları yüklenemedi.",
- "gitlabConnected": "GitLab bağlı",
- "noRepositoriesVisibleBitbucket": "Hiçbir depo görünmüyor. Bitbucket depo erişim izinlerini kontrol et, ardından listeyi yenile.",
- "noRepositoriesVisibleGitlab": "Hiçbir depo görünmüyor. GitLab depo erişim izinlerini kontrol et, ardından listeyi yenile.",
- "openBitbucket": "Bitbucket'ı aç",
- "openGitlab": "GitLab'ı aç",
- "recentlyUsed": "Son kullanılanlar",
"continueFrom": "{{title}} oturumuna devam ediliyor.",
"importingSession": "Oturum içe aktarılıyor",
"cliCannotContinue": "Bu CLI bir oturuma devam etmeyi desteklemiyor. Cloud Agent veya başka bir CLI seç.",
- "importFailed": "Bu oturum içe aktarılamadı.",
- "discardWithUploadsMessage": "İstemin ve henüz bir mesaja eklenmemiş tüm yüklemeler silinecek."
+ "importFailed": "Bu oturum içe aktarılamadı."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} dosya güncellendi.",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "Yükleme kaynağının belirlenmesine izin verilsin mi?"
},
"prReview": {
+ "pullRequestUnavailable": "Çekme isteği kullanılamıyor",
+ "pullRequestUnavailableDescription": "Bu PR açılamıyor. Silinmiş olabilir, depo özel olabilir veya depoda Kilo GitHub uygulaması kurulu olmayabilir.",
"accessDeniedDescription": "Bu çekme isteğini görüntüleme iznin yok.",
- "checkConnection": "Bağlantıyı kontrol et",
- "checks": {
- "checksCount": "{{displayCount}} kontrol",
- "couldNotLoad": "Kontroller yüklenemedi.",
- "failed": "{{displayCount}} başarısız",
- "noAccess": "Bu deponun kontrollerine erişimin yok.",
- "noChecksReported": "Kontrol bildirilmedi",
- "notAvailable": "Kontroller henüz kullanılamıyor. Son işleme henüz işlenmemiş olabilir veya kaynak depoda Kilo GitHub uygulaması kurulu olmayabilir.",
- "openDetails": "{{name}} ayrıntılarını aç",
- "passed": "{{displayCount}} başarılı",
- "pending": "{{displayCount}} bekliyor",
- "retryChecks": "Kontrolleri tekrar dene",
- "skipped": "{{displayCount}} atlandı",
- "title": "Kontroller",
- "viewOnGitHub": "PR'ı GitHub'da görüntüle",
- "checkDetails": "kontrol ayrıntıları"
- },
- "composer": {
- "addTitle": "Yorum ekleme",
- "addToReview": "İncelemeye ekle",
- "comment": "Yorum",
- "commentBody": "Yorum metni",
- "commentBodyPlaceholder": "Yorumun",
- "commentNow": "Şimdi yorum yap",
- "discardMessage": "Taslağın silinecek.",
- "discardTitle": "Yorumdan vazgeçilsin mi?",
- "editTitle": "Yorum düzenleme",
- "insertSuggestion": "Öneri ekle",
- "insertSuggestionA11y": "Kod önerisi ekle",
- "loadFailedTitle": "Yorum alanı yüklenemedi.",
- "ok": "TAMAM",
- "unavailableMessage": "Gönderilmeyi bekleyen bu yorum zaten silindi veya gönderildi.",
- "unavailableTitle": "Yorum kullanılamıyor",
- "bodyEmpty": "Yorum metni boş olamaz.",
- "suggestionsOnlyAddedLines": "Öneriler yalnızca eklenen satırlara uygulanır.",
- "tapDiffLineToSuggest": "Önerileri etkinleştirmek için bir fark satırına dokun."
- },
- "connect": {
- "checkFailedMessage": "Yükleme tamamlanana kadar oturum açma durumu gösterilemiyor.",
- "checkFailedTitle": "GitHub bağlantısı kontrol edilemedi.",
- "description": "Mobilde çekme isteklerini incelemek için GitHub hesabını bağla.",
- "reconnectDescription": "GitHub bağlantının izni kaldırıldı. Mobilde çekme isteklerini incelemeye devam etmek için yeniden bağlan.",
- "reconnectTitle": "GitHub'a yeniden bağlan"
- },
- "connectionExpired": "GitHub bağlantısının süresi doldu.",
- "couldNotLoadPullRequest": "Çekme isteği yüklenemedi.",
- "couldNotOpenGitHubAppSettings": "GitHub uygulaması ayarları açılamadı.",
- "description": "Açıklama",
- "discussion": {
- "acceptTerms": "Kabul et",
- "accessDeniedMessage": "Bu PR'ın tartışmasını görüntüleme iznin yok.",
- "addReaction": "Tepki ekle",
- "block": "Engelle",
- "blockedUser": "{{login}} engellendi",
- "collapseThread": "Yorum dizisini daralt",
- "commentActions": "Yorum işlemleri",
- "comment": "{{displayCount}} yorum",
- "comment_other": "{{displayCount}} yorum",
- "couldNotLoad": "Tartışma yüklenemedi.",
- "couldNotLoadMore": "Daha fazla yorum yüklenemedi.",
- "loadMoreComments": "Daha fazla yorum yükle",
- "loading": "Tartışma yükleniyor",
- "moderation": {
- "block": {
- "retryable": "Bu kullanıcı engellenemedi. Bağlantını kontrol et ve tekrar dene.",
- "terminal": "Bu kullanıcı engellenemez."
- },
- "mute": {
- "retryable": "Bu kullanıcı sessize alınamadı. Bağlantını kontrol et ve tekrar dene.",
- "terminal": "Bu kullanıcı sessize alınamaz."
- },
- "reportContent": {
- "retryable": "Bu yorum bildirilemedi. Bağlantını kontrol et ve tekrar dene.",
- "terminal": "Bu yorum bildirilemez."
- },
- "reportUser": {
- "retryable": "Bu kullanıcı bildirilemedi. Bağlantını kontrol et ve tekrar dene.",
- "terminal": "Bu kullanıcı bildirilemez."
- }
- },
- "moreLinesAbove": "… yukarıda {{displayCount}} satır daha var.",
- "mute": "Sessize al",
- "mutedUser": "{{login}} sessize alındı",
- "noDiscussion": "Henüz tartışma yok",
- "noDiscussionDescription": "Bu çekme isteğinde henüz inceleme yorumu veya genel yorum yok.",
- "comment_one": "1 yorum",
- "outdated": "Güncel değil",
- "quotedDiffSnippet": "Alıntılanan fark parçası",
- "reactionPill": "{{emoji}} tepkisi, {{displayCount}} {{countLabel}}",
- "reaction": "tepki",
- "reaction_other": "tepki",
- "reaction_one": "tepki",
- "replyBadRequest": "Bu yanıt gönderilemiyor. Yorum dizisi değişmiş olabilir.",
- "replyBody": "Yanıt metni",
- "replyForbidden": "Bu çekme isteğine yanıt verme iznin yok.",
- "replyPlaceholder": "Yanıtın…",
- "reportContent": "İçeriği bildir",
- "reportUser": "Kullanıcıyı bildir",
- "resolveThread": "Yorum dizisini çözüldü olarak işaretle",
- "resolved": "Çözüldü",
- "retryLoadingMore": "Daha fazla yorumu yüklemeyi tekrar dene",
- "reviewFiles": "Dosyaları incele",
- "startedRelative": " · {{relative}} başlatıldı",
- "submitReply": "Yanıtı gönder",
- "termsAcceptRetry": "Koşullar kabul edilemedi. Bağlantını kontrol et ve tekrar dene.",
- "termsCopy": "Gönderi paylaşmak için en az 13 yaşında olmalısın.",
- "termsTitle": "Hizmet koşulları",
- "threadAccessibilityLabel": "Yorum dizisi: {{anchorLabel}}",
- "unavailable": "Tartışma kullanılamıyor.",
- "unavailableMessage": "Bu çekme isteği kaldırılmış olabilir.",
- "unresolveThread": "Yorum dizisini çözülmedi olarak işaretle",
- "viewTerms": "Koşulları görüntüle",
- "termsAcceptRequired": "Gönderi paylaşmak için hizmet koşullarını kabul etmelisin.",
- "termsCheckRetryCopy": "Hizmet koşulları kontrol edilemedi. Bağlantını kontrol et ve tekrar dene.",
- "termsOutdatedCopy": "Hizmet koşulları değişti. Son sürümü kabul etmek için bu ekranı yeniden aç.",
- "reactions": {
- "thumbsUp": "Beğeni",
- "thumbsDown": "Beğenmeme",
- "laugh": "Gülme",
- "hooray": "Yaşasın",
- "confused": "Kafası karışık",
- "heart": "Kalp",
- "rocket": "Roket",
- "eyes": "Gözler"
- },
- "anchor": {
- "fileCommentOnPath": "{{path}} dosyası hakkında yorum",
- "fileComment": "Dosya yorumu",
- "outdatedOnPathLines": "{{path}} · {{lines}} · Güncel değil",
- "outdatedOnLines": "{{lines}} · Güncel değil",
- "outdatedOnPath": "{{path}} · Güncel değil"
- },
- "deletedUser": "silinen kullanıcı"
- },
- "entry": {
- "clearLink": "Çekme isteği bağlantısını temizle",
- "couldNotLoad": "Yüklenemedi.",
- "eyebrow": "URL ile bir çekme isteği aç.",
- "noRecentPrs": "Son açılan PR yok",
- "noRecentPrsDescription": "İnceleme başlatmak için yukarıya bir PR bağlantısı yapıştır. Bir dahaki sefere burada görünecek.",
- "open": "Açık",
- "pasteLink": "Çekme isteği bağlantısını yapıştır",
- "pastePrLink": "Bir PR bağlantısı yapıştır",
- "removeFromRecentsMessage": "Bu çekme isteği son kullanılanlar listenden kaldırılacak.",
- "removeFromRecentsTitle": "Son kullanılanlardan kaldırılsın mı?",
- "removeRecentAccessibility": "{{repo}} öğesini son kullanılanlardan kaldır",
- "urlAccessibility": "GitHub çekme isteği URL'si"
- },
- "eventChips": {
- "comment": "Yorum",
- "label": "İnceleme türü",
- "requestChanges": "Değişiklik iste"
- },
+ "noFilesChanged": "Değişen dosya yok",
+ "noFilesChangedDescription": "Bu çekme isteğinde dosya değişikliği yok.",
"fileList": {
"filesList": "Dosya listesi",
"filesViewed": "Dosyalar · {{viewed}}/{{total}} görüntülendi",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "Seçili satırlara yorum yap",
"finishReview": "İncelemeyi tamamla"
},
- "headLine": "{{counts}} · son işleme {{sha}}",
"hunkRows": {
"contextUnavailable": "Bu referansta bağlam kullanılamıyor.",
"expandAll": "Tümünü genişlet",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "Bağlamı yüklemeyi tekrar dene",
"retryLoadingNextPage": "Sonraki sayfayı yüklemeyi tekrar dene"
},
- "inbox": {
- "couldNotLoad": "Gelen kutusu yüklenemedi.",
- "loading": "Gelen kutusu yükleniyor",
- "noReviewRequests": "İnceleme isteği yok",
- "noReviewRequestsDescription": "İncelemeni bekleyen çekme istekleri burada görünür. Yukarıya herhangi bir PR bağlantısı da yapıştırabilirsin.",
- "title": "Gelen kutusu"
+ "sideBySide": {
+ "emptyDiffColumn": "boş fark sütunu",
+ "emptyDiffRow": "Boş fark satırı",
+ "newOnly": "Yalnızca yeni: {{text}}",
+ "noNewlineAtEndOfFile": "⚠️ dosyanın sonunda yeni satır yok.",
+ "oldNew": "Eski: {{old}} | Yeni: {{new}}",
+ "oldOnly": "Yalnızca eski: {{text}}"
+ },
+ "connectionExpired": "GitHub bağlantısının süresi doldu.",
+ "capabilities": {
+ "banner": {
+ "title": "Bu sağlayıcıda kullanılamıyor",
+ "accessibility": "Bu sağlayıcıda kullanılamıyor: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Kilo GitHub uygulamasını yükle",
"merge": {
- "autoMergeDescription": "Gerekli tüm kontroller başarılı olduğunda GitHub bu çekme isteğini otomatik olarak birleştirir (yöntem: {{method}}).",
+ "merge": "Birleştirme",
+ "mergeNow": "Şimdi birleştir",
+ "mergePullRequest": "Çekme isteğini birleştirme",
+ "mergeTermTitle": "{{term}}ni birleştirme",
+ "enableAutoMerge": "Otomatik birleştirmeyi aç",
+ "disableAutoMerge": "Otomatik birleştirmeyi kapat",
"autoMergeOn": "Otomatik birleştirme açık",
- "blockedTitle": "Birleştirmeyi engelleyen nedenler",
- "cannotMerge": "Bu çekme isteği bu hâliyle birleştirilemez.",
+ "autoMergeDescription": "Gerekli tüm kontroller başarılı olduğunda GitHub bu çekme isteğini otomatik olarak birleştirir (yöntem: {{method}}).",
"checking": "Birleştirme durumu kontrol ediliyor…",
+ "couldNotDetermine": "Birleştirmenin mümkün olup olmadığı belirlenemedi.",
+ "refreshMergeability": "Birleştirme durumunu yenile",
+ "blockedTitle": "Birleştirmeyi engelleyen nedenler",
+ "updateBranch": "Dalı güncelle",
+ "updateBranchFromBase": "Dalı hedef daldaki değişikliklerle güncelle",
+ "methodLabel": "Yöntem",
+ "commitTitle": "İşleme başlığı",
"commitMessage": "İşleme mesajı",
"commitMessagePlaceholder": "Birleştirme işlemesi için isteğe bağlı açıklama",
- "commitTitle": "İşleme başlığı",
- "confirmMessage": "Değişikliklerin hedef dala birleştirilecek.",
- "confirmTitle": "Çekme isteği birleştirilsin mi?",
- "couldNotDetermine": "Birleştirmenin mümkün olup olmadığı belirlenemedi.",
- "couldNotMerge": "Çekme isteği birleştirilemedi.",
"deleteBranch": "Dalı sil",
"deleteBranchAfterMerge": "Birleştirmeden sonra dalı sil",
- "disableAutoMerge": "Otomatik birleştirmeyi kapat",
- "enableAutoMerge": "Otomatik birleştirmeyi aç",
- "enableAutoMergeConfirmMessage": "Gerekli tüm kontroller başarılı olduğunda GitHub bu çekme isteğini otomatik olarak birleştirir.",
+ "noEnabledMethods": "Bu depoda etkin bir birleştirme yöntemi yok. Bir depo yöneticisinden birleştirme, sıkıştırma veya yeniden temellendirme yöntemlerinden birini etkinleştirmesini iste.",
+ "confirmTitle": "Çekme isteği birleştirilsin mi?",
+ "confirmTitleTerm": "{{term}} birleştirilsin mi?",
+ "confirmMessage": "Değişikliklerin hedef dala birleştirilecek.",
"enableAutoMergeConfirmTitle": "Otomatik birleştirme açılsın mı?",
+ "enableAutoMergeConfirmMessage": "Gerekli tüm kontroller başarılı olduğunda GitHub bu çekme isteğini otomatik olarak birleştirir.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}}, pipeline başarılı olduğunda otomatik olarak birleştirilir.",
+ "enableAutoMergeDescriptionTerm": "GitLab, pipeline başarılı olduğunda bu {{term}}ni otomatik olarak birleştirir.",
"forbidden": "Bu çekme isteğini birleştirme iznin yok.",
- "loadFailedTitle": "Birleştirme seçenekleri yüklenemedi.",
- "merge": "Birleştirme",
- "mergeNow": "Şimdi birleştir",
- "mergePullRequest": "Çekme isteğini birleştirme",
- "methodLabel": "Yöntem",
+ "cannotMerge": "Bu çekme isteği bu hâliyle birleştirilemez.",
+ "couldNotMerge": "Çekme isteği birleştirilemedi.",
"methods": {
"merge": "Birleştirme",
"rebase": "Yeniden temellendirme",
"squash": "Sıkıştırma"
},
- "noEnabledMethods": "Bu depoda etkin bir birleştirme yöntemi yok. Bir depo yöneticisinden birleştirme, sıkıştırma veya yeniden temellendirme yöntemlerinden birini etkinleştirmesini iste.",
+ "terminal": {
+ "alreadyMerged": "Zaten birleştirildi",
+ "closed": "Bu çekme isteği kapalı",
+ "closedMergeRequest": "Bu birleştirme isteği kapalı"
+ },
"partialSuccessBanner": {
"accessibility": "Birleştirildi. Dal silinemedi: {{reason}}",
"body": "Dal silinemedi: {{reason}}."
},
- "refreshMergeability": "Birleştirme durumunu yenile",
- "terminal": {
- "alreadyMerged": "Zaten birleştirildi",
- "closed": "Bu çekme isteği kapalı"
- },
- "updateBranch": "Dalı güncelle",
- "updateBranchFromBase": "Dalı hedef daldaki değişikliklerle güncelle",
+ "loadFailedTitle": "Birleştirme seçenekleri yüklenemedi.",
"blocked": {
"unknownStateTitle": "GitHub henüz birleştirmenin mümkün olduğunu bildirmedi",
"unknownStateDetail": "Biraz sonra genel bakışı yenilemeyi dene.",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "Bu çekme isteği henüz birleştirilemiyor",
"notMergeableDetail": "GitHub, birleştirme durumunu {{state}} olarak bildirdi."
},
+ "restrictions": {
+ "title": "Birleştirme kısıtlamaları",
+ "approvalsRequired_one": "{{displayCount}} onay gerekli",
+ "approvalsRequired_other": "{{displayCount}} onay gerekli",
+ "pipelineMustSucceed": "Birleştirmeden önce pipeline'ın başarılı olması gerekir."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline en son işlemde başarısız oluyor.",
+ "pendingPipeline": "Pipeline en son işlemde hâlâ çalışıyor.",
+ "permission": "Bu {{term}}ni birleştirme iznin yok.",
+ "draft": "Birleştirmeden önce {{term}}ni incelemeye hazır olarak işaretle."
+ },
"methodLabels": {
"merge": "Birleştirme işlemesi oluştur",
"squash": "Sıkıştır ve birleştir",
@@ -2623,9 +2507,204 @@
"rebase": "Bu daldaki tüm işlemeleri birleştirme işlemesi oluşturmadan hedef dalın üzerine yeniden uygula."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Yorum dizisi: {{anchorLabel}}",
+ "collapseThread": "Yorum dizisini daralt",
+ "resolveThread": "Yorum dizisini çözüldü olarak işaretle",
+ "unresolveThread": "Yorum dizisini çözülmedi olarak işaretle",
+ "resolved": "Çözüldü",
+ "outdated": "Güncel değil",
+ "comment_one": "1 yorum",
+ "comment": "{{displayCount}} yorum",
+ "comment_other": "{{displayCount}} yorum",
+ "startedRelative": " · {{relative}} başlatıldı",
+ "couldNotLoadMore": "Daha fazla yorum yüklenemedi.",
+ "retryLoadingMore": "Daha fazla yorumu yüklemeyi tekrar dene",
+ "loadMoreComments": "Daha fazla yorum yükle",
+ "addReaction": "Tepki ekle",
+ "reactionPill": "{{emoji}} tepkisi, {{displayCount}} {{countLabel}}",
+ "reaction_one": "tepki",
+ "reaction": "tepki",
+ "reaction_other": "tepki",
+ "commentActions": "Yorum işlemleri",
+ "reportContent": "İçeriği bildir",
+ "reportUser": "Kullanıcıyı bildir",
+ "mute": "Sessize al",
+ "block": "Engelle",
+ "blockedUser": "{{login}} engellendi",
+ "mutedUser": "{{login}} sessize alındı",
+ "replyPlaceholder": "Yanıtın…",
+ "replyBody": "Yanıt metni",
+ "submitReply": "Yanıtı gönder",
+ "termsTitle": "Hizmet koşulları",
+ "termsCopy": "Gönderi paylaşmak için en az 13 yaşında olmalısın.",
+ "termsAcceptRetry": "Koşullar kabul edilemedi. Bağlantını kontrol et ve tekrar dene.",
+ "viewTerms": "Koşulları görüntüle",
+ "acceptTerms": "Kabul et",
+ "replyBadRequest": "Bu yanıt gönderilemiyor. Yorum dizisi değişmiş olabilir.",
+ "replyForbidden": "Bu çekme isteğine yanıt verme iznin yok.",
+ "replyForbiddenTerm": "Bu {{term}}ne yanıt verme iznin yok.",
+ "moderation": {
+ "block": {
+ "retryable": "Bu kullanıcı engellenemedi. Bağlantını kontrol et ve tekrar dene.",
+ "terminal": "Bu kullanıcı engellenemez."
+ },
+ "mute": {
+ "retryable": "Bu kullanıcı sessize alınamadı. Bağlantını kontrol et ve tekrar dene.",
+ "terminal": "Bu kullanıcı sessize alınamaz."
+ },
+ "reportContent": {
+ "retryable": "Bu yorum bildirilemedi. Bağlantını kontrol et ve tekrar dene.",
+ "terminal": "Bu yorum bildirilemez."
+ },
+ "reportUser": {
+ "retryable": "Bu kullanıcı bildirilemedi. Bağlantını kontrol et ve tekrar dene.",
+ "terminal": "Bu kullanıcı bildirilemez."
+ }
+ },
+ "accessDeniedMessage": "Bu PR'ın tartışmasını görüntüleme iznin yok.",
+ "unavailable": "Tartışma kullanılamıyor.",
+ "unavailableMessage": "Bu çekme isteği kaldırılmış olabilir.",
+ "couldNotLoad": "Tartışma yüklenemedi.",
+ "loading": "Tartışma yükleniyor",
+ "noDiscussion": "Henüz tartışma yok",
+ "noDiscussionDescription": "Bu çekme isteğinde henüz inceleme yorumu veya genel yorum yok.",
+ "reviewFiles": "Dosyaları incele",
+ "quotedDiffSnippet": "Alıntılanan fark parçası",
+ "moreLinesAbove": "… yukarıda {{displayCount}} satır daha var.",
+ "termsAcceptRequired": "Gönderi paylaşmak için hizmet koşullarını kabul etmelisin.",
+ "termsOutdatedCopy": "Hizmet koşulları değişti. Son sürümü kabul etmek için bu ekranı yeniden aç.",
+ "termsCheckRetryCopy": "Hizmet koşulları kontrol edilemedi. Bağlantını kontrol et ve tekrar dene.",
+ "reactions": {
+ "thumbsUp": "Beğeni",
+ "thumbsDown": "Beğenmeme",
+ "laugh": "Gülme",
+ "hooray": "Yaşasın",
+ "confused": "Kafası karışık",
+ "heart": "Kalp",
+ "rocket": "Roket",
+ "eyes": "Gözler"
+ },
+ "anchor": {
+ "fileCommentOnPath": "{{path}} dosyası hakkında yorum",
+ "fileComment": "Dosya yorumu",
+ "outdatedOnPathLines": "{{path}} · {{lines}} · Güncel değil",
+ "outdatedOnLines": "{{lines}} · Güncel değil",
+ "outdatedOnPath": "{{path}} · Güncel değil"
+ },
+ "deletedUser": "silinen kullanıcı"
+ },
+ "couldNotOpenGitHubAppSettings": "GitHub uygulaması ayarları açılamadı.",
+ "installKiloGitHubApp": "Kilo GitHub uygulamasını yükle",
+ "checkConnection": "Bağlantıyı kontrol et",
+ "couldNotLoadPullRequest": "Çekme isteği yüklenemedi.",
+ "description": "Açıklama",
"noDescriptionProvided": "Açıklama eklenmemiş.",
- "noFilesChanged": "Değişen dosya yok",
- "noFilesChangedDescription": "Bu çekme isteğinde dosya değişikliği yok.",
+ "review": "İnceleme",
+ "reviewPullRequest": "Çekme isteğini incele",
+ "headLine": "{{counts}} · son işleme {{sha}}",
+ "entry": {
+ "eyebrow": "URL ile bir çekme isteği veya birleştirme isteği aç",
+ "pastePrLink": "Bir çekme isteği veya birleştirme isteği bağlantısı yapıştır",
+ "noRecentPrs": "Son inceleme yok",
+ "noRecentPrsDescription": "İnceleme başlatmak için yukarıya bir bağlantı yapıştır — bir dahaki sefere burada görünecek.",
+ "couldNotLoad": "Yüklenemedi.",
+ "removeFromRecentsTitle": "Son kullanılanlardan kaldırılsın mı?",
+ "removeFromRecentsMessage": "Bu inceleme son kullanılanlardan kaldırılacak.",
+ "removeRecentAccessibility": "{{repo}} öğesini son kullanılanlardan kaldır",
+ "urlAccessibility": "Bir çekme isteği veya birleştirme isteği URL'si gir",
+ "urlPlaceholder": "Çekme isteği veya birleştirme isteği URL'si",
+ "openAccessibility": "Çekme isteği veya birleştirme isteği aç",
+ "clearLink": "Bağlantıyı temizle",
+ "pasteLink": "Çekme isteği veya birleştirme isteği bağlantısını yapıştır",
+ "open": "Açık"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} kontrol",
+ "couldNotLoad": "Kontroller yüklenemedi.",
+ "failed": "{{displayCount}} başarısız",
+ "noAccess": "Bu deponun kontrollerine erişimin yok.",
+ "noChecksReported": "Kontrol bildirilmedi",
+ "notAvailable": "Kontroller henüz kullanılamıyor. Son işleme henüz işlenmemiş olabilir veya kaynak depoda Kilo GitHub uygulaması kurulu olmayabilir.",
+ "openDetails": "{{name}} ayrıntılarını aç",
+ "passed": "{{displayCount}} başarılı",
+ "pending": "{{displayCount}} bekliyor",
+ "retryChecks": "Kontrolleri tekrar dene",
+ "skipped": "{{displayCount}} atlandı",
+ "title": "Kontroller",
+ "viewOnGitHub": "PR'ı GitHub'da görüntüle",
+ "checkDetails": "kontrol ayrıntıları"
+ },
+ "inbox": {
+ "couldNotLoad": "Gelen kutusu yüklenemedi.",
+ "loading": "Gelen kutusu yükleniyor",
+ "noReviewRequests": "İnceleme isteği yok",
+ "noReviewRequestsDescription": "İncelemeni bekleyen çekme istekleri burada görünür. Yukarıya herhangi bir PR bağlantısı da yapıştırabilirsin.",
+ "title": "Gelen kutusu"
+ },
+ "composer": {
+ "addTitle": "Yorum ekleme",
+ "addToReview": "İncelemeye ekle",
+ "comment": "Yorum",
+ "commentBody": "Yorum metni",
+ "commentBodyPlaceholder": "Yorumun",
+ "commentNow": "Şimdi yorum yap",
+ "discardMessage": "Taslağın silinecek.",
+ "discardTitle": "Yorumdan vazgeçilsin mi?",
+ "editTitle": "Yorum düzenleme",
+ "insertSuggestion": "Öneri ekle",
+ "insertSuggestionA11y": "Kod önerisi ekle",
+ "loadFailedTitle": "Yorum alanı yüklenemedi.",
+ "ok": "TAMAM",
+ "unavailableMessage": "Gönderilmeyi bekleyen bu yorum zaten silindi veya gönderildi.",
+ "unavailableTitle": "Yorum kullanılamıyor",
+ "bodyEmpty": "Yorum metni boş olamaz.",
+ "suggestionsOnlyAddedLines": "Öneriler yalnızca eklenen satırlara uygulanır.",
+ "tapDiffLineToSuggest": "Önerileri etkinleştirmek için bir fark satırına dokun."
+ },
+ "connect": {
+ "checkFailedTitle": "GitHub bağlantısı kontrol edilemedi.",
+ "checkFailedMessage": "Yükleme tamamlanana kadar oturum açma durumu gösterilemiyor.",
+ "checkFailedTitleGitLab": "GitLab bağlantısı kontrol edilemedi.",
+ "checkFailedTitleBitbucket": "Bitbucket bağlantısı kontrol edilemedi.",
+ "providerCheckFailedMessage": "Bağlantı durumu, yüklenene kadar kullanılamıyor.",
+ "reconnectTitle": "GitHub'a yeniden bağlan",
+ "reconnectDescription": "GitHub bağlantının izni kaldırıldı. Mobilde çekme isteklerini incelemeye devam etmek için yeniden bağlan.",
+ "description": "Mobilde çekme isteklerini incelemek için GitHub hesabını bağla.",
+ "gitlabDescription": "Mobilde birleştirme isteklerini gözden geçirmek için GitLab hesabını bağla.",
+ "bitbucketDescription": "Mobilde çekme isteklerini gözden geçirmek için Bitbucket'ı bu kuruluşla bağla.",
+ "bitbucketOrgOnlyDescription": "Profilində bir kuruluş seç ve onun Bitbucket çekme isteklerini gözden geçir."
+ },
+ "screen": {
+ "shareA11y": "Çekme isteğini paylaş",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Bu yorum inceleme kuyruğundan kaldırılacak.",
+ "deletePendingTitle": "Bekleyen yorum silinsin mi?",
+ "loadFailedTitle": "İnceleme gönderme ekranı yüklenemedi.",
+ "pendingComment": "bekleyen yorum",
+ "pendingComment_other": "bekleyen yorum",
+ "pendingComment_one": "bekleyen yorum",
+ "summaryOptional": "Özet (isteğe bağlı)",
+ "partialPostedMessage": "{{displayFreshCount}} yorum gönderildi. {{displayStaleCount}} yorum eski bir işlemeyle ilgili olduğu için kuyrukta kaldı.",
+ "submitCountOfTotal": "{{displayTotalCount}} yorumun {{displayFreshCount}} tanesini gönder",
+ "submitReview": "İncelemeyi gönder",
+ "blockedRequestChanges": "Değişiklik istemek için bir özet veya en az bir yorum ekle.",
+ "blockedComment": "İncelemeni yorum olarak göndermek için bir özet veya en az bir yorum ekle."
+ },
+ "reconnectNotice": {
+ "title": "GitHub bağlantısının süresi doldu.",
+ "message": "GitHub bağlantın artık geçerli değil. Bağlantını tekrar kontrol et. Gerekirse yeniden bağlanman istenecek.",
+ "gitlabTitle": "GitLab bağlantısının süresi doldu.",
+ "bitbucketTitle": "Bitbucket bağlantısının süresi doldu.",
+ "providerMessage": "{{provider}} bağlantın artık geçerli değil. Bağlantını tekrar kontrol et. Gerekirse yeniden bağlanman istenecek."
+ },
+ "eventChips": {
+ "comment": "Yorum",
+ "label": "İnceleme türü",
+ "requestChanges": "Değişiklik iste"
+ },
"overview": {
"commit": "değişiklik kaydı",
"commit_other": "değişiklik kaydı",
@@ -2666,39 +2745,25 @@
"summaryA11y": "İnceleme özeti",
"summaryPlaceholder": "İnceleme için isteğe bağlı özet"
},
- "pullRequestUnavailable": "Çekme isteği kullanılamıyor",
- "pullRequestUnavailableDescription": "Bu PR açılamıyor. Silinmiş olabilir, depo özel olabilir veya depoda Kilo GitHub uygulaması kurulu olmayabilir.",
- "reconnectNotice": {
- "message": "GitHub bağlantın artık geçerli değil. Bağlantını tekrar kontrol et. Gerekirse yeniden bağlanman istenecek.",
- "title": "GitHub bağlantısının süresi doldu."
- },
- "review": "İnceleme",
- "reviewPullRequest": "Çekme isteğini incele",
- "screen": {
- "shareA11y": "Çekme isteğini paylaş",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "boş fark sütunu",
- "emptyDiffRow": "Boş fark satırı",
- "newOnly": "Yalnızca yeni: {{text}}",
- "noNewlineAtEndOfFile": "⚠️ dosyanın sonunda yeni satır yok.",
- "oldNew": "Eski: {{old}} | Yeni: {{new}}",
- "oldOnly": "Yalnızca eski: {{text}}"
+ "tabs": {
+ "discussion": "Tartışma",
+ "files": "Dosya",
+ "overview": "Genel bakış"
},
- "submit": {
- "deletePendingMessage": "Bu yorum inceleme kuyruğundan kaldırılacak.",
- "deletePendingTitle": "Bekleyen yorum silinsin mi?",
- "loadFailedTitle": "İnceleme gönderme ekranı yüklenemedi.",
- "pendingComment": "bekleyen yorum",
- "pendingComment_other": "bekleyen yorum",
- "pendingComment_one": "bekleyen yorum",
- "summaryOptional": "Özet (isteğe bağlı)",
- "partialPostedMessage": "{{displayFreshCount}} yorum gönderildi. {{displayStaleCount}} yorum eski bir işlemeyle ilgili olduğu için kuyrukta kaldı.",
- "submitCountOfTotal": "{{displayTotalCount}} yorumun {{displayFreshCount}} tanesini gönder",
- "submitReview": "İncelemeyi gönder",
- "blockedRequestChanges": "Değişiklik istemek için bir özet veya en az bir yorum ekle.",
- "blockedComment": "İncelemeni yorum olarak göndermek için bir özet veya en az bir yorum ekle."
+ "terms": {
+ "pullRequest": "Çekme isteği",
+ "mergeRequest": "Birleştirme isteği",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Birleştirme isteğini paylaş",
+ "viewOnProvider": "{{provider}} üzerinde görüntüle",
+ "mergeRequestUnavailable": "Birleştirme isteği kullanılamıyor",
+ "unavailableDescription": "Silinmiş olabilir veya buna erişim izinlerin olmayabilir.",
+ "accessDeniedMergeRequest": "Bu birleştirme isteğini görüntüleme iznin yok.",
+ "couldNotLoadMergeRequest": "Birleştirme isteği yüklenemedi.",
+ "discussionAccessDenied": "Bu birleştirme isteğinin tartışmasını görüntüleme iznin yok.",
+ "discussionUnavailableMessage": "Bu birleştirme isteği kaldırılmış olabilir.",
+ "noDiscussionDescription": "Bu birleştirme isteğinde henüz inceleme yorumu veya genel yorum yok.",
+ "noFilesChangedDescription": "Bu birleştirme isteğinde dosya değişikliği yok."
},
"fileStatus": {
"changed": "Değiştirildi",
@@ -2706,11 +2771,6 @@
"modified": "Değiştirildi",
"renamed": "Yeniden adlandırıldı"
},
- "tabs": {
- "discussion": "Tartışma",
- "files": "Dosya",
- "overview": "Genel bakış"
- },
"diff": {
"selectedTapToChange": "{{label}} seçili, seçimi değiştirmek için dokun",
"tapToComment": "{{label}}, yorum yapmak için dokun",
@@ -2721,7 +2781,7 @@
"emptyLine": "(boş)"
},
"linkPasteClipboardEmpty": "Pano boş.",
- "linkPasteNotAPullRequest": "Bu bir GitHub çekme isteği bağlantısı değil.",
+ "linkPasteNotAPullRequest": "Bu bir çekme isteği veya birleştirme isteği bağlantısı değil",
"announce": {
"commentPosted": "Yorum gönderildi",
"reviewSubmitted": "İnceleme gönderildi",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "Bu yorum gönderilemiyor. Seçili satır değişmiş ya da PR güncellenmiş olabilir.",
"reviewNotSubmitted": "Bu inceleme bu hâliyle gönderilemiyor. PR değişmiş olabilir veya kendi çekme isteğini incelemeye çalışıyor olabilirsin.",
+ "reviewNotSubmittedTerm": "Bu inceleme olduğu gibi gönderilemez. {{term}} değişmiş olabilir veya kendi {{term}}ni gözden geçiremezsin.",
"couldNotPostComment": "Yorum gönderilemedi.",
"couldNotSubmitReview": "İnceleme gönderilemedi. Bağlantını kontrol et ve tekrar dene."
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "Yanıt verilemedi.",
"couldNotCompleteAction": "Bu işlem tamamlanamadı.",
"mergeResultDefaultError": "GitHub birleştirmeyi tamamlamadı.",
+ "mergeResultNotCompleted": "{{term}} birleştirilmedi. Durumunu kontrol et ve tekrar dene.",
"ambiguous": "İşlemin sonucu doğrulanamadı. Tekrar denemeden önce PR'ı kontrol et.",
"persistenceFailed": "Bu işlemi kaydedemedik. Lütfen daha sonra tekrar dene.",
"forbidden": "Bu işlem için iznin yok."
diff --git a/apps/mobile/src/i18n/locales/uk.json b/apps/mobile/src/i18n/locales/uk.json
index 71d8316cca..6d839c7e8a 100644
--- a/apps/mobile/src/i18n/locales/uk.json
+++ b/apps/mobile/src/i18n/locales/uk.json
@@ -4,6 +4,8 @@
"done": "Готово",
"retry": "Повторити",
"tryAgain": "Спробувати ще раз",
+ "continue": "Продовжити",
+ "notNow": "Не зараз",
"language": "Мова",
"device": "Пристрій",
"share": "Поділитися: {{title}}",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "Не вдалося скопіювати в буфер обміну.",
"required": "обов'язково",
"error": "помилка: {{error}}",
- "notNow": "Не зараз",
- "continue": "Продовжити",
"back": "Назад",
"somethingWentWrong": "Сталася помилка.",
"couldNotOpen": "Не вдалося відкрити {{label}}.",
@@ -36,6 +36,7 @@
"cost": "Вартість",
"discard": "Відкинути",
"findings": "Виявлені проблеми",
+ "mergeRequest": "merge-запит",
"notConnected": "Не підключено",
"notifications": "Сповіщення",
"pullRequest": "запит на злиття",
@@ -1575,11 +1576,31 @@
"retryConnection": "Повторити підключення"
},
"newSession": {
+ "recentlyUsed": "Нещодавно використані",
+ "couldNotLoadGithubRepositories": "Не вдалося завантажити репозиторії GitHub.",
+ "couldNotLoadGitlabRepositories": "Не вдалося завантажити репозиторії GitLab.",
+ "couldNotLoadBitbucketRepositories": "Не вдалося завантажити репозиторії Bitbucket.",
"connectGithubDescription": "Підключіть GitHub у браузері, а потім поверніться сюди, щоб вибрати репозиторій.",
+ "connectGitlabDescription": "Підключіть GitLab у браузері, а потім поверніться сюди, щоб вибрати репозиторій.",
+ "connectBitbucketDescription": "Підключіть Bitbucket у браузері, а потім поверніться сюди, щоб вибрати репозиторій.",
"openGithub": "Відкрити GitHub",
+ "openGitlab": "Відкрити GitLab",
+ "openBitbucket": "Відкрити Bitbucket",
"refreshRepositories": "Оновити список репозиторіїв",
"githubConnected": "GitHub підключено",
+ "gitlabConnected": "GitLab підключено",
"noRepositoriesVisible": "Репозиторії не відображаються. Перевірте доступ застосунку Kilo до репозиторіїв GitHub, а потім оновіть список.",
+ "noRepositoriesVisibleGitlab": "Репозиторії не відображаються. Перевірте доступ до репозиторіїв GitLab, а потім оновіть список.",
+ "noRepositoriesVisibleBitbucket": "Репозиторії не відображаються. Перевірте доступ до репозиторіїв Bitbucket, а потім оновіть список.",
+ "bitbucketOrganizationsOnly": "Bitbucket доступний лише для організацій.",
+ "branchPickerTitle": "Вибрати гілку",
+ "branchDefault": "Типова",
+ "branchAccessibility": "Гілка: {{label}}",
+ "branchLoading": "Завантаження гілок",
+ "branchLoadError": "Не вдалося завантажити гілки",
+ "branchUnavailable": "Гілки недоступні для цього репозиторію. Перевірте доступ у провайдера, потім виберіть інший репозиторій.",
+ "branchEmpty": "Немає доступних гілок",
+ "branchPlaceholder": "Виберіть гілку",
"runOnWithTarget": "Середовище запуску: {{target}}",
"environment": "Середовище",
"couldNotLoadEnvironment": "Не вдалося завантажити ваше середовище.",
@@ -1598,26 +1619,15 @@
"couldNotReadPendingSessions": "Не вдалося прочитати дані сеансів у черзі. Спробуйте ще раз.",
"failedToCreate": "Не вдалося створити сеанс.",
"couldNotRefreshRepositories": "Не вдалося оновити список репозиторіїв. Спробуйте ще раз.",
- "discardDraftMessage": "Ваш запит буде втрачено.",
"discardDraftTitle": "Видалити чернетку?",
+ "discardDraftMessage": "Ваш запит буде втрачено.",
+ "discardWithUploadsMessage": "Ваш запит і всі завантажені файли, не прикріплені до надісланих повідомлень, буде видалено.",
"discardFailed": "Не вдалося видалити чернетку. Спробуйте ще раз.",
"remoteHint": "Виконайте `kilo remote` на своєму комп'ютері або `/remote` у запущеному сеансі CLI, щоб керувати локальним процесом kilo.",
- "connectBitbucketDescription": "Підключіть Bitbucket у браузері, а потім поверніться сюди, щоб вибрати репозиторій.",
- "connectGitlabDescription": "Підключіть GitLab у браузері, а потім поверніться сюди, щоб вибрати репозиторій.",
- "couldNotLoadBitbucketRepositories": "Не вдалося завантажити репозиторії Bitbucket.",
- "couldNotLoadGithubRepositories": "Не вдалося завантажити репозиторії GitHub.",
- "couldNotLoadGitlabRepositories": "Не вдалося завантажити репозиторії GitLab.",
- "gitlabConnected": "GitLab підключено",
- "noRepositoriesVisibleBitbucket": "Репозиторії не відображаються. Перевірте доступ до репозиторіїв Bitbucket, а потім оновіть список.",
- "noRepositoriesVisibleGitlab": "Репозиторії не відображаються. Перевірте доступ до репозиторіїв GitLab, а потім оновіть список.",
- "openBitbucket": "Відкрити Bitbucket",
- "openGitlab": "Відкрити GitLab",
- "recentlyUsed": "Нещодавно використані",
- "cliCannotContinue": "Цей CLI не підтримує продовження сеансів. Виберіть Cloud Agent або інший CLI.",
"continueFrom": "Продовжується сеанс «{{title}}».",
- "importFailed": "Не вдалося імпортувати цей сеанс.",
"importingSession": "Імпортування сеансу",
- "discardWithUploadsMessage": "Ваш запит і всі завантажені файли, не прикріплені до надісланих повідомлень, буде видалено."
+ "cliCannotContinue": "Цей CLI не підтримує продовження сеансів. Виберіть Cloud Agent або інший CLI.",
+ "importFailed": "Не вдалося імпортувати цей сеанс."
},
"partRenderer": {
"updatedFileCount_one": "Оновлено {{displayCount}} файл.",
@@ -2340,164 +2350,11 @@
"installAttributionPromptTitle": "Дозволити визначення джерела встановлення?"
},
"prReview": {
+ "pullRequestUnavailable": "Запит на злиття недоступний",
+ "pullRequestUnavailableDescription": "Не вдалося відкрити цей PR. Можливо, його видалено, репозиторій приватний або для нього не встановлено застосунок Kilo для GitHub.",
"accessDeniedDescription": "У вас немає дозволу на перегляд цього запиту на злиття.",
- "checkConnection": "Перевірити з’єднання",
- "checks": {
- "checksCount": "перевірок: {{displayCount}}",
- "couldNotLoad": "Не вдалося завантажити перевірки.",
- "failed": "з помилками: {{displayCount}}",
- "noAccess": "У вас немає доступу до перевірок цього репозиторію.",
- "noChecksReported": "Немає даних про перевірки",
- "notAvailable": "Перевірки ще недоступні. Можливо, останній коміт ще не оброблено або застосунок Kilo для GitHub не встановлено у вихідному репозиторії.",
- "openDetails": "Відкрити відомості про {{name}}",
- "passed": "успішно: {{displayCount}}",
- "pending": "в очікуванні: {{displayCount}}",
- "retryChecks": "Повторити перевірки",
- "skipped": "пропущено: {{displayCount}}",
- "title": "Перевірки",
- "viewOnGitHub": "Переглянути PR на GitHub",
- "checkDetails": "відомості про перевірку"
- },
- "composer": {
- "addTitle": "Новий коментар",
- "addToReview": "Додати до перевірки коду",
- "comment": "Коментувати",
- "commentBody": "Текст коментаря",
- "commentBodyPlaceholder": "Ваш коментар",
- "commentNow": "Прокоментувати зараз",
- "discardMessage": "Вашу чернетку буде втрачено.",
- "discardTitle": "Скасувати зміни в коментарі?",
- "editTitle": "Редагування коментаря",
- "insertSuggestion": "Вставити пропозицію",
- "insertSuggestionA11y": "Вставити пропозицію зміни коду",
- "loadFailedTitle": "Не вдалося завантажити редактор коментарів.",
- "ok": "ГАРАЗД",
- "unavailableMessage": "Цей ненадісланий коментар уже видалено або надіслано.",
- "unavailableTitle": "Коментар недоступний",
- "bodyEmpty": "Текст коментаря не може бути порожнім.",
- "suggestionsOnlyAddedLines": "Пропозиції застосовуються лише до доданих рядків.",
- "tapDiffLineToSuggest": "Торкніться рядка змін, щоб увімкнути пропозиції."
- },
- "connect": {
- "checkFailedMessage": "Статус входу стане доступним після завантаження даних.",
- "checkFailedTitle": "Не вдалося перевірити підключення до GitHub.",
- "description": "Підключіть обліковий запис GitHub, щоб перевіряти запити на злиття в мобільному застосунку.",
- "reconnectDescription": "Доступ до GitHub відкликано. Підключіться знову, щоб і далі перевіряти запити на злиття в мобільному застосунку.",
- "reconnectTitle": "Підключити GitHub знову"
- },
- "connectionExpired": "Термін дії підключення до GitHub минув.",
- "couldNotLoadPullRequest": "Не вдалося завантажити запит на злиття.",
- "couldNotOpenGitHubAppSettings": "Не вдалося відкрити налаштування застосунку GitHub.",
- "description": "Опис",
- "discussion": {
- "acceptTerms": "Прийняти",
- "accessDeniedMessage": "У вас немає дозволу переглядати обговорення цього PR.",
- "addReaction": "Додати реакцію",
- "block": "Заблокувати",
- "blockedUser": "Заблоковано {{login}}",
- "collapseThread": "Згорнути обговорення",
- "commentActions": "Дії з коментарем",
- "comment": "Коментарів: {{displayCount}}",
- "comment_other": "Коментарів: {{displayCount}}",
- "couldNotLoad": "Не вдалося завантажити обговорення.",
- "couldNotLoadMore": "Не вдалося завантажити наступні коментарі.",
- "loadMoreComments": "Завантажити ще коментарі",
- "loading": "Завантаження обговорення",
- "moderation": {
- "block": {
- "retryable": "Не вдалося заблокувати цього користувача. Перевірте з'єднання та спробуйте ще раз.",
- "terminal": "Цього користувача не можна заблокувати."
- },
- "mute": {
- "retryable": "Не вдалося додати цього користувача до ігнорованих. Перевірте з'єднання та спробуйте ще раз.",
- "terminal": "Цього користувача неможливо додати до ігнорованих."
- },
- "reportContent": {
- "retryable": "Не вдалося поскаржитися на цей коментар. Перевірте з'єднання та спробуйте ще раз.",
- "terminal": "На цей коментар не можна поскаржитися."
- },
- "reportUser": {
- "retryable": "Не вдалося поскаржитися на цього користувача. Перевірте з'єднання та спробуйте ще раз.",
- "terminal": "На цього користувача не можна поскаржитися."
- }
- },
- "moreLinesAbove": "… Вище є додаткові рядки: {{displayCount}}.",
- "mute": "Ігнорувати",
- "mutedUser": "Користувача {{login}} додано до ігнорованих",
- "noDiscussion": "Обговорень ще немає",
- "noDiscussionDescription": "У цьому запиті на злиття ще немає обговорень коду чи загальних коментарів.",
- "comment_one": "1 коментар",
- "outdated": "Застаріло",
- "quotedDiffSnippet": "Цитований фрагмент змін",
- "reactionPill": "реакція {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "реакції",
- "reaction_other": "реакції",
- "reaction_one": "реакція",
- "replyBadRequest": "Цю відповідь неможливо опублікувати. Можливо, обговорення змінилося.",
- "replyBody": "Текст відповіді",
- "replyForbidden": "У вас немає дозволу відповідати в цьому запиті на злиття.",
- "replyPlaceholder": "Ваша відповідь…",
- "reportContent": "Поскаржитися на вміст",
- "reportUser": "Поскаржитися на користувача",
- "resolveThread": "Завершити обговорення",
- "resolved": "Завершено",
- "retryLoadingMore": "Повторити завантаження наступних коментарів",
- "reviewFiles": "Перевірити файли",
- "startedRelative": " · розпочато {{relative}}",
- "submitReply": "Надіслати відповідь",
- "termsAcceptRetry": "Не вдалося прийняти умови. Перевірте з'єднання та спробуйте ще раз.",
- "termsCopy": "Публікувати дописи можна з 13 років.",
- "termsTitle": "Умови надання послуг",
- "threadAccessibilityLabel": "Обговорення {{anchorLabel}}",
- "unavailable": "Обговорення недоступне.",
- "unavailableMessage": "Можливо, цей запит на злиття видалено.",
- "unresolveThread": "Відновити обговорення",
- "viewTerms": "Переглянути умови",
- "termsAcceptRequired": "Щоб публікувати дописи, потрібно прийняти умови надання послуг.",
- "termsCheckRetryCopy": "Не вдалося перевірити умови надання послуг. Перевірте з'єднання та спробуйте ще раз.",
- "termsOutdatedCopy": "Умови надання послуг змінилися. Відкрийте цей екран знову, щоб прийняти останню версію.",
- "comment_few": "{{displayCount}} коментарі",
- "comment_many": "{{displayCount}} коментарів",
- "reaction_few": "реакції",
- "reaction_many": "реакцій",
- "reactions": {
- "thumbsUp": "Великий палець угору",
- "thumbsDown": "Великий палець униз",
- "laugh": "Сміх",
- "hooray": "Ура",
- "confused": "Збентеження",
- "heart": "Серце",
- "rocket": "Ракета",
- "eyes": "Очі"
- },
- "anchor": {
- "fileCommentOnPath": "Коментар до файлу {{path}}",
- "fileComment": "Коментар до файлу",
- "outdatedOnPathLines": "Неактуально: {{path}}, {{lines}}",
- "outdatedOnLines": "Неактуально: {{lines}}",
- "outdatedOnPath": "Неактуально: {{path}}"
- },
- "deletedUser": "видалений користувач"
- },
- "entry": {
- "clearLink": "Очистити посилання на запит на злиття",
- "couldNotLoad": "Не вдалося завантажити дані.",
- "eyebrow": "Відкрийте запит на злиття за URL-адресою.",
- "noRecentPrs": "Нещодавніх PR немає",
- "noRecentPrsDescription": "Вставте посилання на PR вище, щоб почати перевірку коду. Наступного разу цей PR з'явиться тут.",
- "open": "Відкрити",
- "pasteLink": "Вставити посилання на запит на злиття",
- "pastePrLink": "Вставити посилання на PR",
- "removeFromRecentsMessage": "Цей запит на злиття буде видалено зі списку нещодавніх.",
- "removeFromRecentsTitle": "Видалити з нещодавніх?",
- "removeRecentAccessibility": "Видалити {{repo}} з нещодавніх",
- "urlAccessibility": "URL-адреса запиту на злиття на GitHub"
- },
- "eventChips": {
- "comment": "Коментувати",
- "label": "Результат перевірки коду",
- "requestChanges": "Запит на зміни"
- },
+ "noFilesChanged": "Немає змінених файлів",
+ "noFilesChangedDescription": "У цьому запиті на злиття немає змін у файлах.",
"fileList": {
"filesList": "Список файлів",
"filesViewed": "Файли · переглянуто {{viewed}} з {{total}}",
@@ -2542,7 +2399,6 @@
"commentOnSelectedLines": "Прокоментувати виділені рядки",
"finishReview": "Завершити перевірку коду"
},
- "headLine": "{{counts}} · останній коміт: {{sha}}",
"hunkRows": {
"contextUnavailable": "Контекст недоступний для цієї версії.",
"expandAll": "Розгорнути все",
@@ -2579,56 +2435,68 @@
"fileLoadedOfTotalCount_few": "Завантажено {{displayCount}} файли з {{total}}",
"fileLoadedOfTotalCount_many": "Завантажено {{displayCount}} файлів з {{total}}"
},
- "inbox": {
- "couldNotLoad": "Не вдалося завантажити вхідні запити.",
- "loading": "Завантаження вхідних",
- "noReviewRequests": "Немає запитів на перевірку коду",
- "noReviewRequestsDescription": "Тут з'являються запити на злиття, у яких ви маєте перевірити код. Ви також можете вставити вище посилання на будь-який PR.",
- "title": "Вхідні"
+ "sideBySide": {
+ "emptyDiffColumn": "порожній стовпець змін",
+ "emptyDiffRow": "Порожній рядок змін",
+ "newOnly": "Лише в новій версії: {{text}}",
+ "noNewlineAtEndOfFile": "наприкінці файлу немає символу нового рядка.",
+ "oldNew": "Попередня версія: {{old}} | Нова версія: {{new}}",
+ "oldOnly": "Лише в попередній версії: {{text}}"
+ },
+ "connectionExpired": "Термін дії підключення до GitHub минув.",
+ "capabilities": {
+ "banner": {
+ "title": "Недоступно в цього провайдера",
+ "accessibility": "Недоступно в цього провайдера: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Установити застосунок Kilo для GitHub",
"merge": {
- "autoMergeDescription": "GitHub автоматично виконає злиття цього запиту, коли всі обов'язкові перевірки завершаться успішно (спосіб: {{method}}).",
+ "merge": "Злиття",
+ "mergeNow": "Виконати злиття",
+ "mergePullRequest": "Злиття запиту",
+ "mergeTermTitle": "Злити {{term}}",
+ "enableAutoMerge": "Увімкнути автоматичне злиття",
+ "disableAutoMerge": "Вимкнути автоматичне злиття",
"autoMergeOn": "Автоматичне злиття ввімкнено",
- "blockedTitle": "Що перешкоджає злиттю",
- "cannotMerge": "Цей запит поки не можна злити без додаткових змін.",
+ "autoMergeDescription": "GitHub автоматично виконає злиття цього запиту, коли всі обов'язкові перевірки завершаться успішно (спосіб: {{method}}).",
"checking": "Перевірка можливості злиття…",
+ "couldNotDetermine": "Не вдалося визначити можливість злиття.",
+ "refreshMergeability": "Повторно перевірити можливість злиття",
+ "blockedTitle": "Що перешкоджає злиттю",
+ "updateBranch": "Оновити гілку",
+ "updateBranchFromBase": "Оновити гілку змінами з базової гілки",
+ "methodLabel": "Спосіб злиття",
+ "commitTitle": "Заголовок коміту",
"commitMessage": "Повідомлення коміту",
"commitMessagePlaceholder": "Необов'язковий опис коміту злиття",
- "commitTitle": "Заголовок коміту",
- "confirmMessage": "Ваші зміни буде злито в базову гілку.",
- "confirmTitle": "Виконати злиття запиту?",
- "couldNotDetermine": "Не вдалося визначити можливість злиття.",
- "couldNotMerge": "Не вдалося виконати злиття запиту.",
"deleteBranch": "Видалити гілку",
"deleteBranchAfterMerge": "Видалити гілку після злиття",
- "disableAutoMerge": "Вимкнути автоматичне злиття",
- "enableAutoMerge": "Увімкнути автоматичне злиття",
- "enableAutoMergeConfirmMessage": "GitHub автоматично виконає злиття цього запиту, коли всі обов'язкові перевірки завершаться успішно.",
+ "noEnabledMethods": "У цьому репозиторії не ввімкнено жодного способу злиття. Попросіть адміністратора ввімкнути злиття зі створенням коміту злиття, об'єднанням комітів або перебазуванням.",
+ "confirmTitle": "Виконати злиття запиту?",
+ "confirmTitleTerm": "Злити {{term}}?",
+ "confirmMessage": "Ваші зміни буде злито в базову гілку.",
"enableAutoMergeConfirmTitle": "Увімкнути автоматичне злиття?",
+ "enableAutoMergeConfirmMessage": "GitHub автоматично виконає злиття цього запиту, коли всі обов'язкові перевірки завершаться успішно.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} буде автоматично злито після успішного виконання конвеєра.",
+ "enableAutoMergeDescriptionTerm": "GitLab автоматично злить цей {{term}} після успішного виконання конвеєра.",
"forbidden": "У вас немає дозволу на злиття цього запиту.",
- "loadFailedTitle": "Не вдалося завантажити параметри злиття.",
- "merge": "Злиття",
- "mergeNow": "Виконати злиття",
- "mergePullRequest": "Злиття запиту",
- "methodLabel": "Спосіб злиття",
+ "cannotMerge": "Цей запит поки не можна злити без додаткових змін.",
+ "couldNotMerge": "Не вдалося виконати злиття запиту.",
"methods": {
"merge": "Злиття",
"rebase": "Перебазування",
"squash": "Об'єднання"
},
- "noEnabledMethods": "У цьому репозиторії не ввімкнено жодного способу злиття. Попросіть адміністратора ввімкнути злиття зі створенням коміту злиття, об'єднанням комітів або перебазуванням.",
+ "terminal": {
+ "alreadyMerged": "Уже злито",
+ "closed": "Цей запит на злиття закрито",
+ "closedMergeRequest": "Цей merge-запит закрито"
+ },
"partialSuccessBanner": {
"accessibility": "Злито. Не вдалося видалити гілку: {{reason}}",
"body": "Не вдалося видалити гілку: {{reason}}."
},
- "refreshMergeability": "Повторно перевірити можливість злиття",
- "terminal": {
- "alreadyMerged": "Уже злито",
- "closed": "Цей запит на злиття закрито"
- },
- "updateBranch": "Оновити гілку",
- "updateBranchFromBase": "Оновити гілку змінами з базової гілки",
+ "loadFailedTitle": "Не вдалося завантажити параметри злиття.",
"blocked": {
"unknownStateTitle": "GitHub не повідомив про можливість злиття",
"unknownStateDetail": "Спробуйте оновити огляд трохи згодом.",
@@ -2648,6 +2516,20 @@
"notMergeableTitle": "Цей запит ще не можна злити",
"notMergeableDetail": "GitHub повідомив про такий стан готовності до злиття: {{state}}."
},
+ "restrictions": {
+ "title": "Обмеження на злиття",
+ "approvalsRequired_one": "Потрібне {{displayCount}} затвердження",
+ "approvalsRequired_other": "Потрібно {{displayCount}} затверджень",
+ "pipelineMustSucceed": "Перед злиттям конвеєр має завершитися успішно.",
+ "approvalsRequired_many": "Потрібно {{displayCount}} затверджень",
+ "approvalsRequired_few": "Потрібні {{displayCount}} затвердження"
+ },
+ "providerBlocked": {
+ "failingPipeline": "Конвеєр завершується помилкою на останньому коміті.",
+ "pendingPipeline": "Конвеєр ще виконується на останньому коміті.",
+ "permission": "У вас немає дозволу на злиття {{term}}.",
+ "draft": "Перед злиттям переведіть {{term}} у стан готовності до рев'ю."
+ },
"methodLabels": {
"merge": "Створити коміт злиття",
"squash": "Об'єднати коміти та виконати злиття",
@@ -2659,9 +2541,210 @@
"rebase": "Усі коміти з цієї гілки буде повторно застосовано до базової гілки без створення коміту злиття."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Обговорення {{anchorLabel}}",
+ "collapseThread": "Згорнути обговорення",
+ "resolveThread": "Завершити обговорення",
+ "unresolveThread": "Відновити обговорення",
+ "resolved": "Завершено",
+ "outdated": "Застаріло",
+ "comment_one": "1 коментар",
+ "comment": "Коментарів: {{displayCount}}",
+ "comment_other": "Коментарів: {{displayCount}}",
+ "startedRelative": " · розпочато {{relative}}",
+ "couldNotLoadMore": "Не вдалося завантажити наступні коментарі.",
+ "retryLoadingMore": "Повторити завантаження наступних коментарів",
+ "loadMoreComments": "Завантажити ще коментарі",
+ "addReaction": "Додати реакцію",
+ "reactionPill": "реакція {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "реакція",
+ "reaction": "реакції",
+ "reaction_other": "реакції",
+ "commentActions": "Дії з коментарем",
+ "reportContent": "Поскаржитися на вміст",
+ "reportUser": "Поскаржитися на користувача",
+ "mute": "Ігнорувати",
+ "block": "Заблокувати",
+ "blockedUser": "Заблоковано {{login}}",
+ "mutedUser": "Користувача {{login}} додано до ігнорованих",
+ "replyPlaceholder": "Ваша відповідь…",
+ "replyBody": "Текст відповіді",
+ "submitReply": "Надіслати відповідь",
+ "termsTitle": "Умови надання послуг",
+ "termsCopy": "Публікувати дописи можна з 13 років.",
+ "termsAcceptRetry": "Не вдалося прийняти умови. Перевірте з'єднання та спробуйте ще раз.",
+ "viewTerms": "Переглянути умови",
+ "acceptTerms": "Прийняти",
+ "replyBadRequest": "Цю відповідь неможливо опублікувати. Можливо, обговорення змінилося.",
+ "replyForbidden": "У вас немає дозволу відповідати в цьому запиті на злиття.",
+ "replyForbiddenTerm": "У вас немає дозволу відповідати в {{term}}.",
+ "moderation": {
+ "block": {
+ "retryable": "Не вдалося заблокувати цього користувача. Перевірте з'єднання та спробуйте ще раз.",
+ "terminal": "Цього користувача не можна заблокувати."
+ },
+ "mute": {
+ "retryable": "Не вдалося додати цього користувача до ігнорованих. Перевірте з'єднання та спробуйте ще раз.",
+ "terminal": "Цього користувача неможливо додати до ігнорованих."
+ },
+ "reportContent": {
+ "retryable": "Не вдалося поскаржитися на цей коментар. Перевірте з'єднання та спробуйте ще раз.",
+ "terminal": "На цей коментар не можна поскаржитися."
+ },
+ "reportUser": {
+ "retryable": "Не вдалося поскаржитися на цього користувача. Перевірте з'єднання та спробуйте ще раз.",
+ "terminal": "На цього користувача не можна поскаржитися."
+ }
+ },
+ "accessDeniedMessage": "У вас немає дозволу переглядати обговорення цього PR.",
+ "unavailable": "Обговорення недоступне.",
+ "unavailableMessage": "Можливо, цей запит на злиття видалено.",
+ "couldNotLoad": "Не вдалося завантажити обговорення.",
+ "loading": "Завантаження обговорення",
+ "noDiscussion": "Обговорень ще немає",
+ "noDiscussionDescription": "У цьому запиті на злиття ще немає обговорень коду чи загальних коментарів.",
+ "reviewFiles": "Перевірити файли",
+ "quotedDiffSnippet": "Цитований фрагмент змін",
+ "moreLinesAbove": "… Вище є додаткові рядки: {{displayCount}}.",
+ "termsAcceptRequired": "Щоб публікувати дописи, потрібно прийняти умови надання послуг.",
+ "termsOutdatedCopy": "Умови надання послуг змінилися. Відкрийте цей екран знову, щоб прийняти останню версію.",
+ "termsCheckRetryCopy": "Не вдалося перевірити умови надання послуг. Перевірте з'єднання та спробуйте ще раз.",
+ "reactions": {
+ "thumbsUp": "Великий палець угору",
+ "thumbsDown": "Великий палець униз",
+ "laugh": "Сміх",
+ "hooray": "Ура",
+ "confused": "Збентеження",
+ "heart": "Серце",
+ "rocket": "Ракета",
+ "eyes": "Очі"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Коментар до файлу {{path}}",
+ "fileComment": "Коментар до файлу",
+ "outdatedOnPathLines": "Неактуально: {{path}}, {{lines}}",
+ "outdatedOnLines": "Неактуально: {{lines}}",
+ "outdatedOnPath": "Неактуально: {{path}}"
+ },
+ "deletedUser": "видалений користувач",
+ "comment_few": "{{displayCount}} коментарі",
+ "comment_many": "{{displayCount}} коментарів",
+ "reaction_few": "реакції",
+ "reaction_many": "реакцій"
+ },
+ "couldNotOpenGitHubAppSettings": "Не вдалося відкрити налаштування застосунку GitHub.",
+ "installKiloGitHubApp": "Установити застосунок Kilo для GitHub",
+ "checkConnection": "Перевірити з’єднання",
+ "couldNotLoadPullRequest": "Не вдалося завантажити запит на злиття.",
+ "description": "Опис",
"noDescriptionProvided": "Опису немає.",
- "noFilesChanged": "Немає змінених файлів",
- "noFilesChangedDescription": "У цьому запиті на злиття немає змін у файлах.",
+ "review": "Перевірка",
+ "reviewPullRequest": "Перевірити запит на злиття",
+ "headLine": "{{counts}} · останній коміт: {{sha}}",
+ "entry": {
+ "eyebrow": "Відкрийте запит на злиття або merge-запит за URL",
+ "pastePrLink": "Вставте посилання на запит на злиття або merge-запит",
+ "noRecentPrs": "Немає нещодавніх рев'ю",
+ "noRecentPrsDescription": "Щоб розпочати рев'ю, вставте посилання вище — наступного разу воно з'явиться тут.",
+ "couldNotLoad": "Не вдалося завантажити дані.",
+ "removeFromRecentsTitle": "Видалити з нещодавніх?",
+ "removeFromRecentsMessage": "Це рев'ю буде видалено зі списку нещодавніх.",
+ "removeRecentAccessibility": "Видалити {{repo}} з нещодавніх",
+ "urlAccessibility": "Введіть URL запиту на злиття або merge-запиту",
+ "urlPlaceholder": "URL запиту на злиття або merge-запиту",
+ "openAccessibility": "Відкрити запит на злиття або merge-запит",
+ "clearLink": "Очистити посилання",
+ "pasteLink": "Вставити посилання на запит на злиття або merge-запит",
+ "open": "Відкрити"
+ },
+ "checks": {
+ "checksCount": "перевірок: {{displayCount}}",
+ "couldNotLoad": "Не вдалося завантажити перевірки.",
+ "failed": "з помилками: {{displayCount}}",
+ "noAccess": "У вас немає доступу до перевірок цього репозиторію.",
+ "noChecksReported": "Немає даних про перевірки",
+ "notAvailable": "Перевірки ще недоступні. Можливо, останній коміт ще не оброблено або застосунок Kilo для GitHub не встановлено у вихідному репозиторії.",
+ "openDetails": "Відкрити відомості про {{name}}",
+ "passed": "успішно: {{displayCount}}",
+ "pending": "в очікуванні: {{displayCount}}",
+ "retryChecks": "Повторити перевірки",
+ "skipped": "пропущено: {{displayCount}}",
+ "title": "Перевірки",
+ "viewOnGitHub": "Переглянути PR на GitHub",
+ "checkDetails": "відомості про перевірку"
+ },
+ "inbox": {
+ "couldNotLoad": "Не вдалося завантажити вхідні запити.",
+ "loading": "Завантаження вхідних",
+ "noReviewRequests": "Немає запитів на перевірку коду",
+ "noReviewRequestsDescription": "Тут з'являються запити на злиття, у яких ви маєте перевірити код. Ви також можете вставити вище посилання на будь-який PR.",
+ "title": "Вхідні"
+ },
+ "composer": {
+ "addTitle": "Новий коментар",
+ "addToReview": "Додати до перевірки коду",
+ "comment": "Коментувати",
+ "commentBody": "Текст коментаря",
+ "commentBodyPlaceholder": "Ваш коментар",
+ "commentNow": "Прокоментувати зараз",
+ "discardMessage": "Вашу чернетку буде втрачено.",
+ "discardTitle": "Скасувати зміни в коментарі?",
+ "editTitle": "Редагування коментаря",
+ "insertSuggestion": "Вставити пропозицію",
+ "insertSuggestionA11y": "Вставити пропозицію зміни коду",
+ "loadFailedTitle": "Не вдалося завантажити редактор коментарів.",
+ "ok": "ГАРАЗД",
+ "unavailableMessage": "Цей ненадісланий коментар уже видалено або надіслано.",
+ "unavailableTitle": "Коментар недоступний",
+ "bodyEmpty": "Текст коментаря не може бути порожнім.",
+ "suggestionsOnlyAddedLines": "Пропозиції застосовуються лише до доданих рядків.",
+ "tapDiffLineToSuggest": "Торкніться рядка змін, щоб увімкнути пропозиції."
+ },
+ "connect": {
+ "checkFailedTitle": "Не вдалося перевірити підключення до GitHub.",
+ "checkFailedMessage": "Статус входу стане доступним після завантаження даних.",
+ "checkFailedTitleGitLab": "Не вдалося перевірити підключення до GitLab",
+ "checkFailedTitleBitbucket": "Не вдалося перевірити підключення до Bitbucket",
+ "providerCheckFailedMessage": "Стан підключення недоступний, доки це завантажиться.",
+ "reconnectTitle": "Підключити GitHub знову",
+ "reconnectDescription": "Доступ до GitHub відкликано. Підключіться знову, щоб і далі перевіряти запити на злиття в мобільному застосунку.",
+ "description": "Підключіть обліковий запис GitHub, щоб перевіряти запити на злиття в мобільному застосунку.",
+ "gitlabDescription": "Підключіть обліковий запис GitLab, щоб переглядати merge-запити з мобільного.",
+ "bitbucketDescription": "Підключіть Bitbucket до цієї організації, щоб переглядати запити на злиття з мобільного.",
+ "bitbucketOrgOnlyDescription": "Виберіть організацію у профілі, щоб переглядати її запити на злиття Bitbucket."
+ },
+ "screen": {
+ "shareA11y": "Поділитися запитом на злиття",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Цей коментар буде видалено з черги коментарів для перевірки коду.",
+ "deletePendingTitle": "Видалити ненадісланий коментар?",
+ "loadFailedTitle": "Не вдалося завантажити форму надсилання результату перевірки коду.",
+ "pendingComment": "ненадісланого коментаря",
+ "pendingComment_other": "ненадісланого коментаря",
+ "pendingComment_one": "ненадісланий коментар",
+ "summaryOptional": "Підсумок (необов'язково)",
+ "partialPostedMessage": "Опубліковано коментарів: {{displayFreshCount}}. У черзі залишилися коментарі до попереднього коміту: {{displayStaleCount}}.",
+ "submitCountOfTotal": "Надіслати {{displayFreshCount}} із {{displayTotalCount}} коментарів",
+ "submitReview": "Надіслати результати перевірки",
+ "pendingComment_few": "ненадіслані коментарі",
+ "pendingComment_many": "ненадісланих коментарів",
+ "blockedRequestChanges": "Додайте підсумок або принаймні один коментар, щоб подати запит на зміни.",
+ "blockedComment": "Додайте підсумок або принаймні один коментар, щоб надіслати результат перевірки коду з коментарями."
+ },
+ "reconnectNotice": {
+ "title": "Термін дії підключення до GitHub минув.",
+ "message": "Підключення до GitHub більше не діє. Перевірте його стан — за потреби застосунок запропонує підключитися знову.",
+ "gitlabTitle": "Термін дії підключення до GitLab минув",
+ "bitbucketTitle": "Термін дії підключення до Bitbucket минув",
+ "providerMessage": "Ваше підключення до {{provider}} більше не є дійсним. Перевірте підключення ще раз — за потреби вам запропонують підключитися знову."
+ },
+ "eventChips": {
+ "comment": "Коментувати",
+ "label": "Результат перевірки коду",
+ "requestChanges": "Запит на зміни"
+ },
"overview": {
"commit": "коміту",
"commit_other": "коміту",
@@ -2706,41 +2789,25 @@
"summaryA11y": "Підсумок перевірки коду",
"summaryPlaceholder": "Підсумок перевірки коду (необов'язково)"
},
- "pullRequestUnavailable": "Запит на злиття недоступний",
- "pullRequestUnavailableDescription": "Не вдалося відкрити цей PR. Можливо, його видалено, репозиторій приватний або для нього не встановлено застосунок Kilo для GitHub.",
- "reconnectNotice": {
- "message": "Підключення до GitHub більше не діє. Перевірте його стан — за потреби застосунок запропонує підключитися знову.",
- "title": "Термін дії підключення до GitHub минув."
- },
- "review": "Перевірка",
- "reviewPullRequest": "Перевірити запит на злиття",
- "screen": {
- "shareA11y": "Поділитися запитом на злиття",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "порожній стовпець змін",
- "emptyDiffRow": "Порожній рядок змін",
- "newOnly": "Лише в новій версії: {{text}}",
- "noNewlineAtEndOfFile": "наприкінці файлу немає символу нового рядка.",
- "oldNew": "Попередня версія: {{old}} | Нова версія: {{new}}",
- "oldOnly": "Лише в попередній версії: {{text}}"
+ "tabs": {
+ "discussion": "Обговорення",
+ "files": "Файли",
+ "overview": "Огляд"
},
- "submit": {
- "deletePendingMessage": "Цей коментар буде видалено з черги коментарів для перевірки коду.",
- "deletePendingTitle": "Видалити ненадісланий коментар?",
- "loadFailedTitle": "Не вдалося завантажити форму надсилання результату перевірки коду.",
- "pendingComment": "ненадісланого коментаря",
- "pendingComment_other": "ненадісланого коментаря",
- "pendingComment_one": "ненадісланий коментар",
- "summaryOptional": "Підсумок (необов'язково)",
- "partialPostedMessage": "Опубліковано коментарів: {{displayFreshCount}}. У черзі залишилися коментарі до попереднього коміту: {{displayStaleCount}}.",
- "submitCountOfTotal": "Надіслати {{displayFreshCount}} із {{displayTotalCount}} коментарів",
- "submitReview": "Надіслати результати перевірки",
- "pendingComment_few": "ненадіслані коментарі",
- "pendingComment_many": "ненадісланих коментарів",
- "blockedRequestChanges": "Додайте підсумок або принаймні один коментар, щоб подати запит на зміни.",
- "blockedComment": "Додайте підсумок або принаймні один коментар, щоб надіслати результат перевірки коду з коментарями."
+ "terms": {
+ "pullRequest": "Запит на злиття",
+ "mergeRequest": "Merge-запит",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Поділитися merge-запитом",
+ "viewOnProvider": "Відкрити в {{provider}}",
+ "mergeRequestUnavailable": "Merge-запит недоступний",
+ "unavailableDescription": "Можливо, його було видалено або в вас немає до нього доступу.",
+ "accessDeniedMergeRequest": "У вас немає дозволу переглядати цей merge-запит.",
+ "couldNotLoadMergeRequest": "Не вдалося завантажити merge-запит",
+ "discussionAccessDenied": "У вас немає дозволу переглядати обговорення цього merge-запиту.",
+ "discussionUnavailableMessage": "Цей merge-запит міг бути видалений.",
+ "noDiscussionDescription": "У цьому merge-запиті немає гілок рев'ю чи коментарів розмови.",
+ "noFilesChangedDescription": "У цьому merge-запиті немає змін файлів."
},
"fileStatus": {
"changed": "Змінено",
@@ -2748,11 +2815,6 @@
"modified": "Змінено",
"renamed": "Перейменовано"
},
- "tabs": {
- "discussion": "Обговорення",
- "files": "Файли",
- "overview": "Огляд"
- },
"diff": {
"selectedTapToChange": "Виділено {{label}}, торкніться, щоб змінити виділення",
"tapToComment": "{{label}}, торкніться, щоб додати коментар",
@@ -2763,7 +2825,7 @@
"emptyLine": "(порожньо)"
},
"linkPasteClipboardEmpty": "Буфер обміну порожній.",
- "linkPasteNotAPullRequest": "Це не посилання на запит на злиття на GitHub.",
+ "linkPasteNotAPullRequest": "Це не посилання на запит на злиття або merge-запит",
"announce": {
"commentPosted": "Коментар опубліковано",
"reviewSubmitted": "Результат перевірки коду надіслано",
@@ -2772,6 +2834,7 @@
"mutationError": {
"commentNotPosted": "Цей коментар неможливо опублікувати. Можливо, виділений рядок змінився або PR було оновлено.",
"reviewNotSubmitted": "Цей результат перевірки коду неможливо надіслати в поточному вигляді. Можливо, PR змінився або ви намагаєтеся перевірити власний запит на злиття.",
+ "reviewNotSubmittedTerm": "Це рев'ю неможливо надіслати як є. {{term}} міг змінитися, або ви не можете ревіювати власний {{term}}.",
"couldNotPostComment": "Не вдалося опублікувати коментар.",
"couldNotSubmitReview": "Не вдалося надіслати результат перевірки коду. Перевірте з'єднання та спробуйте ще раз."
},
@@ -2779,6 +2842,7 @@
"couldNotReply": "Не вдалося відповісти.",
"couldNotCompleteAction": "Не вдалося виконати цю дію.",
"mergeResultDefaultError": "GitHub не завершив злиття.",
+ "mergeResultNotCompleted": "{{term}} не було злито. Перевірте його стан і спробуйте ще раз.",
"ambiguous": "Не вдалося підтвердити — перевірте PR, перш ніж повторювати спробу.",
"persistenceFailed": "Не вдалося зафіксувати цю дію. Спробуйте ще раз пізніше.",
"forbidden": "Доступ заборонено."
diff --git a/apps/mobile/src/i18n/locales/ur.json b/apps/mobile/src/i18n/locales/ur.json
index 442cf52909..84a5694632 100644
--- a/apps/mobile/src/i18n/locales/ur.json
+++ b/apps/mobile/src/i18n/locales/ur.json
@@ -36,6 +36,7 @@
"cost": "لاگت",
"discard": "ضائع کریں",
"findings": "شناخت شدہ مسائل",
+ "mergeRequest": "مرج ریکویسٹ",
"notConnected": "منسلک نہیں",
"notifications": "اطلاعات",
"pullRequest": "پل ریکویسٹ",
@@ -340,10 +341,17 @@
"emptyDiffRow": "تبدیلیوں کے موازنے کی خالی قطار"
},
"connectionExpired": "GitHub سے کنکشن کی مدت ختم ہو گئی۔",
+ "capabilities": {
+ "banner": {
+ "title": "اس پرووائیڈر پر دستیاب نہیں",
+ "accessibility": "اس پرووائیڈر پر دستیاب نہیں: {{reason}}"
+ }
+ },
"merge": {
"merge": "مرج",
"mergeNow": "ابھی مرج کریں",
"mergePullRequest": "پل ریکویسٹ کا مرج",
+ "mergeTermTitle": "{{term}} کا مرج",
"enableAutoMerge": "خودکار مرج فعال کریں",
"disableAutoMerge": "خودکار مرج غیر فعال کریں",
"autoMergeOn": "خودکار مرج فعال ہے",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "مرج کے بعد برانچ حذف کریں",
"noEnabledMethods": "اس ریپوزٹری میں مرج کا کوئی طریقہ فعال نہیں ہے۔ ریپوزٹری کے منتظم سے مرج، اسکواش یا ریبیس کا طریقہ فعال کرنے کو کہیں۔",
"confirmTitle": "پل ریکویسٹ مرج کریں؟",
+ "confirmTitleTerm": "{{term}} مرج کریں؟",
"confirmMessage": "اس سے آپ کی تبدیلیاں بنیادی برانچ میں مرج ہو جائیں گی۔",
"enableAutoMergeConfirmTitle": "خودکار مرج فعال کریں؟",
"enableAutoMergeConfirmMessage": "تمام ضروری جانچیں کامیاب ہونے پر GitHub اس پل ریکویسٹ کو خود بخود مرج کر دے گا۔",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} پائپ لائن کے کامیاب ہوتے ہی خودکار طور پر مرج ہو جائے گا۔",
+ "enableAutoMergeDescriptionTerm": "GitLab یہ {{term}} پائپ لائن کے کامیاب ہوتے ہی خودکار طور پر مرج کر دیتا ہے۔",
"forbidden": "آپ کو اس پل ریکویسٹ کو مرج کرنے کی اجازت نہیں ہے۔",
"cannotMerge": "یہ پل ریکویسٹ اپنی موجودہ حالت میں مرج نہیں ہو سکتی۔",
"couldNotMerge": "پل ریکویسٹ مرج نہیں ہو سکی۔",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "پہلے ہی مرج شدہ",
- "closed": "یہ پل ریکویسٹ بند ہے"
+ "closed": "یہ پل ریکویسٹ بند ہے",
+ "closedMergeRequest": "یہ مرج ریکویسٹ بند ہے"
},
"partialSuccessBanner": {
"body": "برانچ حذف نہیں ہو سکی: {{reason}}۔",
@@ -401,6 +413,18 @@
"notMergeableTitle": "یہ پل ریکویسٹ ابھی مرج نہیں ہو سکتی",
"notMergeableDetail": "GitHub کے مطابق مرج کی حالت {{state}} ہے۔"
},
+ "restrictions": {
+ "title": "مرج پابندیاں",
+ "approvalsRequired_one": "{{displayCount}} منظوری درکار ہے",
+ "approvalsRequired_other": "{{displayCount}} منظوری درکار ہیں",
+ "pipelineMustSucceed": "مرج سے پہلے پائپ لائن کا کامیاب ہونا ضروری ہے۔"
+ },
+ "providerBlocked": {
+ "failingPipeline": "پائپ لائن آخری کمٹ پر ناکام ہو رہی ہے۔",
+ "pendingPipeline": "پائپ لائن آخری کمٹ پر ابھی چل رہی ہے۔",
+ "permission": "آپ کو اس {{term}} کو مرج کرنے کی اجازت نہیں ہے۔",
+ "draft": "مرج کرنے سے پہلے {{term}} پر جائزے کے لیے تیار ہونے کا نشان لگائیں۔"
+ },
"methodLabels": {
"merge": "مرج کمیٹ بنائیں",
"squash": "اسکواش اور مرج کریں",
@@ -448,6 +472,7 @@
"acceptTerms": "قبول کریں",
"replyBadRequest": "یہ جواب پوسٹ نہیں ہو سکتا۔ شاید تھریڈ تبدیل ہو گیا ہے۔",
"replyForbidden": "آپ کو اس پل ریکویسٹ پر جواب دینے کی اجازت نہیں ہے۔",
+ "replyForbiddenTerm": "آپ کو اس {{term}} پر جواب دینے کی اجازت نہیں ہے۔",
"moderation": {
"reportContent": {
"terminal": "اس تبصرے کی شکایت نہیں کی جا سکتی۔",
@@ -508,17 +533,19 @@
"reviewPullRequest": "پل ریکویسٹ کا جائزہ لیں",
"headLine": "{{counts}} · ہیڈ {{sha}}",
"entry": {
- "eyebrow": "URL کے ذریعے پل ریکویسٹ کھولیں۔",
- "pastePrLink": "PR کا لنک چسپاں کریں",
- "noRecentPrs": "کوئی حالیہ PR نہیں",
- "noRecentPrsDescription": "جائزہ شروع کرنے کے لیے اوپر PR کا لنک چسپاں کریں — یہ اگلی بار یہاں دکھائی دے گی۔",
+ "eyebrow": "URL کے ذریعے پل ریکویسٹ یا مرج ریکویسٹ کھولیں۔",
+ "pastePrLink": "پل ریکویسٹ یا مرج ریکویسٹ کا لنک چسپاں کریں",
+ "noRecentPrs": "کوئی حالیہ جائزہ نہیں",
+ "noRecentPrsDescription": "جائزہ شروع کرنے کے لیے اوپر ایک لنک چسپاں کریں — یہ اگلی بار یہاں دکھائی دے گا۔",
"couldNotLoad": "لوڈ نہیں ہو سکا۔",
"removeFromRecentsTitle": "حالیہ فہرست سے ہٹائیں؟",
- "removeFromRecentsMessage": "یہ پل ریکویسٹ آپ کی حالیہ فہرست سے ہٹا دی جائے گی۔",
+ "removeFromRecentsMessage": "یہ جائزہ آپ کی حالیہ فہرست سے ہٹا دیا جائے گا۔",
"removeRecentAccessibility": "{{repo}} کو حالیہ فہرست سے ہٹائیں",
- "urlAccessibility": "GitHub پل ریکویسٹ کا URL",
- "clearLink": "پل ریکویسٹ کا لنک صاف کریں",
- "pasteLink": "پل ریکویسٹ کا لنک چسپاں کریں",
+ "urlAccessibility": "پل ریکویسٹ یا مرج ریکویسٹ کا URL درج کریں",
+ "urlPlaceholder": "پل ریکویسٹ یا مرج ریکویسٹ کا URL",
+ "openAccessibility": "پل ریکویسٹ یا مرج ریکویسٹ کھولیں",
+ "clearLink": "لنک صاف کریں",
+ "pasteLink": "پل ریکویسٹ یا مرج ریکویسٹ کا لنک چسپاں کریں",
"open": "کھولیں"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub کنکشن چیک نہیں ہو سکا۔",
"checkFailedMessage": "جب تک یہ لوڈ نہیں ہوتا، سائن ان کی حالت دستیاب نہیں ہوگی۔",
+ "checkFailedTitleGitLab": "GitLab کنکشن چیک نہیں ہو سکا۔",
+ "checkFailedTitleBitbucket": "Bitbucket کنکشن چیک نہیں ہو سکا۔",
+ "providerCheckFailedMessage": "لوڈ ہونے تک کنکشن کی حالت دستیاب نہیں۔",
"reconnectTitle": "GitHub سے دوبارہ رابطہ",
"reconnectDescription": "آپ کا GitHub کنکشن منسوخ کر دیا گیا ہے۔ موبائل پر پل ریکویسٹ کا جائزہ جاری رکھنے کے لیے اسے دوبارہ منسلک کریں۔",
- "description": "موبائل پر پل ریکویسٹ کا جائزہ لینے کے لیے اپنا GitHub اکاؤنٹ منسلک کریں۔"
+ "description": "موبائل پر پل ریکویسٹ کا جائزہ لینے کے لیے اپنا GitHub اکاؤنٹ منسلک کریں۔",
+ "gitlabDescription": "موبائل پر مرج ریکویسٹس کا جائزہ لینے کے لیے اپنا GitLab اکاؤنٹ منسلک کریں۔",
+ "bitbucketDescription": "موبائل پر پل ریکویسٹس کا جائزہ لینے کے لیے Bitbucket کو اس تنظیم سے منسلک کریں۔",
+ "bitbucketOrgOnlyDescription": "اپنے پروفائل میں ایک تنظیم منتخب کریں تاکہ اس کی Bitbucket پل ریکویسٹس کا جائزہ لیا جا سکے۔"
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub سے کنکشن کی مدت ختم ہو گئی۔",
- "message": "آپ کا GitHub کنکشن اب قابل استعمال نہیں ہے۔ کنکشن دوبارہ چیک کریں — ضرورت پڑی تو آپ سے دوبارہ منسلک کرنے کو کہا جائے گا۔"
+ "message": "آپ کا GitHub کنکشن اب قابل استعمال نہیں ہے۔ کنکشن دوبارہ چیک کریں — ضرورت پڑی تو آپ سے دوبارہ منسلک کرنے کو کہا جائے گا۔",
+ "gitlabTitle": "GitLab سے کنکشن کی مدت ختم ہو گئی۔",
+ "bitbucketTitle": "Bitbucket سے کنکشن کی مدت ختم ہو گئی۔",
+ "providerMessage": "آپ کا {{provider}} کنکشن اب قابل استعمال نہیں ہے۔ کنکشن دوبارہ چیک کریں — ضرورت پڑی تو آپ سے دوبارہ منسلک کرنے کو کہا جائے گا۔"
},
"eventChips": {
"comment": "تبصرہ",
@@ -643,6 +679,21 @@
"files": "فائلیں",
"discussion": "گفتگو"
},
+ "terms": {
+ "pullRequest": "پل ریکویسٹ",
+ "mergeRequest": "مرج ریکویسٹ",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "مرج ریکویسٹ شیئر کریں",
+ "viewOnProvider": "{{provider}} پر دیکھیں",
+ "mergeRequestUnavailable": "مرج ریکویسٹ دستیاب نہیں",
+ "unavailableDescription": "ہو سکتا ہے یہ حذف کر دی گئی ہو، یا ہو سکتا ہے آپ کو اس تک رسائی نہ ہو۔",
+ "accessDeniedMergeRequest": "آپ کو اس مرج ریکویسٹ کو دیکھنے کی اجازت نہیں ہے۔",
+ "couldNotLoadMergeRequest": "مرج ریکویسٹ لوڈ نہیں ہو سکی۔",
+ "discussionAccessDenied": "آپ کو اس مرج ریکویسٹ کی گفتگو دیکھنے کی اجازت نہیں ہے۔",
+ "discussionUnavailableMessage": "ممکن ہے یہ مرج ریکویسٹ ہٹا دی گئی ہو۔",
+ "noDiscussionDescription": "اس مرج ریکویسٹ پر ابھی جائزے کا کوئی تھریڈ یا گفتگو کا کوئی تبصرہ نہیں ہے۔",
+ "noFilesChangedDescription": "اس مرج ریکویسٹ میں کسی فائل میں تبدیلی نہیں کی گئی۔"
+ },
"fileStatus": {
"modified": "ترمیم شدہ",
"renamed": "نام تبدیل",
@@ -659,7 +710,7 @@
"emptyLine": "(خالی)"
},
"linkPasteClipboardEmpty": "کلپ بورڈ خالی ہے۔",
- "linkPasteNotAPullRequest": "یہ GitHub پل ریکویسٹ کا لنک نہیں ہے۔",
+ "linkPasteNotAPullRequest": "یہ پل ریکویسٹ یا مرج ریکویسٹ کا لنک نہیں ہے۔",
"announce": {
"commentPosted": "تبصرہ پوسٹ ہو گیا",
"reviewSubmitted": "جائزہ جمع ہو گیا",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "یہ تبصرہ پوسٹ نہیں کیا جا سکتا۔ ممکن ہے منتخب سطر بدل گئی ہو یا PR اپ ڈیٹ ہو گئی ہو۔",
"reviewNotSubmitted": "یہ جائزہ اپنی موجودہ صورت میں جمع نہیں ہو سکتا۔ ممکن ہے PR بدل گئی ہو یا یہ آپ کی اپنی پل ریکویسٹ ہو، جس کا آپ جائزہ نہیں لے سکتے۔",
+ "reviewNotSubmittedTerm": "اس جائزے کو یونہی جمع نہیں کیا جا سکتا۔ ہو سکتا ہے {{term}} بدل گیا ہو، یا آپ اپنا خود {{term}} کا جائزہ نہیں لے سکتے۔",
"couldNotPostComment": "تبصرہ پوسٹ نہیں ہو سکا۔",
"couldNotSubmitReview": "جائزہ جمع نہیں ہو سکا۔ اپنا کنکشن چیک کریں اور دوبارہ کوشش کریں۔"
},
@@ -675,6 +727,7 @@
"couldNotReply": "جواب نہیں بھیجا جا سکا۔",
"couldNotCompleteAction": "یہ کارروائی مکمل نہیں ہو سکی۔",
"mergeResultDefaultError": "GitHub نے مرج مکمل نہیں کیا۔",
+ "mergeResultNotCompleted": "{{term}} مرج نہیں ہوا۔ اس کی حالت چیک کریں اور دوبارہ کوشش کریں۔",
"ambiguous": "تصدیق نہیں ہو سکی — دوبارہ کوشش کرنے سے پہلے PR چیک کریں۔",
"persistenceFailed": "ہم اس کارروائی کو ریکارڈ نہیں کر سکے۔ براہ کرم بعد میں دوبارہ کوشش کریں۔",
"forbidden": "اس کارروائی کی اجازت نہیں ہے۔"
@@ -1988,11 +2041,31 @@
"retryConnection": "کنکشن دوبارہ قائم کرنے کی کوشش کریں"
},
"newSession": {
+ "recentlyUsed": "حال ہی میں استعمال شدہ",
+ "couldNotLoadGithubRepositories": "GitHub کی ریپوزٹریاں لوڈ نہیں ہو سکیں۔",
+ "couldNotLoadGitlabRepositories": "GitLab کی ریپوزٹریاں لوڈ نہیں ہو سکیں۔",
+ "couldNotLoadBitbucketRepositories": "Bitbucket کی ریپوزٹریاں لوڈ نہیں ہو سکیں۔",
"connectGithubDescription": "اپنے براؤزر میں GitHub کو منسلک کریں، پھر ریپوزٹری منتخب کرنے کے لیے یہاں واپس آئیں۔",
+ "connectGitlabDescription": "اپنے براؤزر میں GitLab کو منسلک کریں، پھر ریپوزٹری منتخب کرنے کے لیے یہاں واپس آئیں۔",
+ "connectBitbucketDescription": "اپنے براؤزر میں Bitbucket کو منسلک کریں، پھر ریپوزٹری منتخب کرنے کے لیے یہاں واپس آئیں۔",
"openGithub": "GitHub کھولیں",
+ "openGitlab": "GitLab کھولیں",
+ "openBitbucket": "Bitbucket کھولیں",
"refreshRepositories": "ریپوزٹریوں کی فہرست تازہ کریں",
"githubConnected": "GitHub منسلک",
+ "gitlabConnected": "GitLab منسلک",
"noRepositoriesVisible": "کوئی ریپوزٹری نظر نہیں آ رہی۔ چیک کریں کہ Kilo کی GitHub ایپ کو ریپوزٹریوں تک رسائی حاصل ہے، پھر فہرست تازہ کریں۔",
+ "noRepositoriesVisibleGitlab": "کوئی ریپوزٹری نظر نہیں آ رہی۔ GitLab کے لیے ریپوزٹریوں تک رسائی چیک کریں، پھر فہرست تازہ کریں۔",
+ "noRepositoriesVisibleBitbucket": "کوئی ریپوزٹری نظر نہیں آ رہی۔ Bitbucket کے لیے ریپوزٹریوں تک رسائی چیک کریں، پھر فہرست تازہ کریں۔",
+ "bitbucketOrganizationsOnly": "Bitbucket صرف تنظیموں کے لیے دستیاب ہے۔",
+ "branchPickerTitle": "برانچ منتخب کریں",
+ "branchDefault": "ڈیفالٹ",
+ "branchAccessibility": "برانچ: {{label}}",
+ "branchLoading": "برانچز لوڈ ہو رہی ہیں",
+ "branchLoadError": "برانچز لوڈ نہیں ہو سکیں",
+ "branchUnavailable": "اس ریپوزٹری کے لیے برانچز دستیاب نہیں ہیں۔ پرووائیڈر کے ساتھ اپنی رسائی چیک کریں، پھر کوئی دوسری ریپوزٹری منتخب کریں۔",
+ "branchEmpty": "کوئی برانچ دستیاب نہیں",
+ "branchPlaceholder": "ایک برانچ منتخب کریں",
"runOnWithTarget": "{{target}} پر چلائیں",
"environment": "ماحول",
"couldNotLoadEnvironment": "آپ کا ماحول لوڈ نہیں ہو سکا۔",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "ریپوزٹریوں کی فہرست تازہ نہیں ہو سکی۔ دوبارہ کوشش کریں۔",
"discardDraftTitle": "مسودہ حذف کریں؟",
"discardDraftMessage": "آپ کا پرامپٹ ضائع ہو جائے گا۔",
+ "discardWithUploadsMessage": "آپ کا پرامپٹ اور اپ لوڈ کی گئی وہ فائلیں حذف ہو جائیں گی جو کسی بھیجے گئے پیغام سے منسلک نہیں ہیں۔",
"discardFailed": "مسودہ حذف نہیں ہو سکا۔ دوبارہ کوشش کریں۔",
"remoteHint": "مقامی kilo پراسیس کو کنٹرول کرنے کے لیے اپنے کمپیوٹر پر `kilo remote` یا چلتے ہوئے CLI سیشن میں `/remote` چلائیں۔",
- "connectBitbucketDescription": "اپنے براؤزر میں Bitbucket کو منسلک کریں، پھر ریپوزٹری منتخب کرنے کے لیے یہاں واپس آئیں۔",
- "connectGitlabDescription": "اپنے براؤزر میں GitLab کو منسلک کریں، پھر ریپوزٹری منتخب کرنے کے لیے یہاں واپس آئیں۔",
- "couldNotLoadBitbucketRepositories": "Bitbucket کی ریپوزٹریاں لوڈ نہیں ہو سکیں۔",
- "couldNotLoadGithubRepositories": "GitHub کی ریپوزٹریاں لوڈ نہیں ہو سکیں۔",
- "couldNotLoadGitlabRepositories": "GitLab کی ریپوزٹریاں لوڈ نہیں ہو سکیں۔",
- "gitlabConnected": "GitLab منسلک",
- "noRepositoriesVisibleBitbucket": "کوئی ریپوزٹری نظر نہیں آ رہی۔ Bitbucket کے لیے ریپوزٹریوں تک رسائی چیک کریں، پھر فہرست تازہ کریں۔",
- "noRepositoriesVisibleGitlab": "کوئی ریپوزٹری نظر نہیں آ رہی۔ GitLab کے لیے ریپوزٹریوں تک رسائی چیک کریں، پھر فہرست تازہ کریں۔",
- "openBitbucket": "Bitbucket کھولیں",
- "openGitlab": "GitLab کھولیں",
- "recentlyUsed": "حال ہی میں استعمال شدہ",
"continueFrom": "{{title}} جاری رکھا جا رہا ہے۔",
"importingSession": "سیشن درآمد ہو رہا ہے",
"cliCannotContinue": "یہ CLI سیشن جاری نہیں رکھ سکتا۔ Cloud Agent یا کوئی اور CLI منتخب کریں۔",
- "importFailed": "یہ سیشن درآمد نہیں ہو سکا۔",
- "discardWithUploadsMessage": "آپ کا پرامپٹ اور اپ لوڈ کی گئی وہ فائلیں حذف ہو جائیں گی جو کسی بھیجے گئے پیغام سے منسلک نہیں ہیں۔"
+ "importFailed": "یہ سیشن درآمد نہیں ہو سکا۔"
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} فائل اپ ڈیٹ ہو گئی ہے۔",
diff --git a/apps/mobile/src/i18n/locales/uz.json b/apps/mobile/src/i18n/locales/uz.json
index a74b8b622f..f67407985f 100644
--- a/apps/mobile/src/i18n/locales/uz.json
+++ b/apps/mobile/src/i18n/locales/uz.json
@@ -36,6 +36,7 @@
"cost": "Xarajat",
"discard": "Bekor qilish",
"findings": "Aniqlangan muammolar",
+ "mergeRequest": "merge so‘rovi",
"notConnected": "Ulanmagan",
"notifications": "Bildirishnomalar",
"pullRequest": "pR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Farqlar jadvalidagi bo'sh qator"
},
"connectionExpired": "GitHub bilan ulanish muddati tugadi.",
+ "capabilities": {
+ "banner": {
+ "title": "Ushbu provayderda mavjud emas",
+ "accessibility": "Ushbu provayderda mavjud emas: {{reason}}"
+ }
+ },
"merge": {
"merge": "Birlashtirish",
"mergeNow": "Hozir birlashtirish",
"mergePullRequest": "PRni birlashtirish",
+ "mergeTermTitle": "{{term}}ni birlashtirish",
"enableAutoMerge": "Avtomatik birlashtirishni yoqish",
"disableAutoMerge": "Avtomatik birlashtirishni o'chirish",
"autoMergeOn": "Avtomatik birlashtirish yoqilgan",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Birlashtirishdan keyin tarmoqni o'chirish",
"noEnabledMethods": "Bu omborda hech bir birlashtirish usuli yoqilmagan. Ombor administratoridan oddiy birlashtirish, kommitlarni jamlash yoki asosni almashtirish usulini yoqishni so'rang.",
"confirmTitle": "PR birlashtirilsinmi?",
+ "confirmTitleTerm": "{{term}} birlashtirilsinmi?",
"confirmMessage": "O'zgarishlaringiz asosiy tarmoqqa birlashtiriladi.",
"enableAutoMergeConfirmTitle": "Avtomatik birlashtirish yoqilsinmi?",
"enableAutoMergeConfirmMessage": "Barcha majburiy tekshiruvlar muvaffaqiyatli yakunlangach, GitHub bu PRni avtomatik birlashtiradi.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} pipeline muvaffaqiyatli bo‘lgach, avtomatik birlashtiriladi.",
+ "enableAutoMergeDescriptionTerm": "GitLab pipeline muvaffaqiyatli bo‘lgach, ushbu {{term}}ni avtomatik birlashtiradi.",
"forbidden": "Bu PRni birlashtirishga ruxsatingiz yo'q.",
"cannotMerge": "Bu PRni hozirgi holatida birlashtirib bo'lmaydi.",
"couldNotMerge": "PRni birlashtirib bo'lmadi.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Allaqachon birlashtirilgan",
- "closed": "Bu PR yopilgan"
+ "closed": "Bu PR yopilgan",
+ "closedMergeRequest": "Bu merge so‘rovi yopilgan"
},
"partialSuccessBanner": {
"body": "Tarmoqni o'chirib bo'lmadi: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Bu PRni hali birlashtirib bo'lmaydi",
"notMergeableDetail": "GitHub birlashtirish imkoniyati uchun quyidagi holatni bildirdi: {{state}}."
},
+ "restrictions": {
+ "title": "Birlashtirish cheklovlari",
+ "approvalsRequired_one": "{{displayCount}} tasdiq talab qilinadi",
+ "approvalsRequired_other": "{{displayCount}} tasdiq talab qilinadi",
+ "pipelineMustSucceed": "Birlashtirishdan oldin pipeline muvaffaqiyatli bo‘lishi kerak."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline oxirgi kommitda xato bermoqda.",
+ "pendingPipeline": "Pipeline oxirgi kommitda hali ishlayapti.",
+ "permission": "Bu {{term}}ni birlashtirishga ruxsatingiz yo‘q.",
+ "draft": "Birlashtirishdan oldin {{term}}ni ko‘rib chiqishga tayyor deb belgilang."
+ },
"methodLabels": {
"merge": "Birlashtirish kommitini yaratish",
"squash": "Kommitlarni jamlab birlashtirish",
@@ -448,6 +472,7 @@
"acceptTerms": "Qabul qilish",
"replyBadRequest": "Bu javobni joylab bo'lmaydi. Izohlar zanjiri o'zgargan bo'lishi mumkin.",
"replyForbidden": "Bu PRga javob yozishga ruxsatingiz yo'q.",
+ "replyForbiddenTerm": "Bu {{term}}ga javob yozishga ruxsatingiz yo‘q.",
"moderation": {
"reportContent": {
"terminal": "Bu izoh ustidan shikoyat qilib bo'lmaydi.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "PRni ko'rib chiqish",
"headLine": "{{counts}} · oxirgi kommit: {{sha}}",
"entry": {
- "eyebrow": "PRni URL orqali oching.",
- "pastePrLink": "PR havolasini joylashtirish",
- "noRecentPrs": "Oxirgi PRlar yo'q",
- "noRecentPrsDescription": "Ko'rib chiqishni boshlash uchun yuqoriga PR havolasini joylashtiring — keyingi safar u shu yerda ko'rinadi.",
+ "eyebrow": "PR yoki merge so‘rovini URL orqali oching",
+ "pastePrLink": "PR yoki merge so‘rovi havolasini joylashtirish",
+ "noRecentPrs": "Oxirgi ko‘rib chiqishlar yo‘q",
+ "noRecentPrsDescription": "Ko‘rib chiqishni boshlash uchun yuqoriga havolani joylashtiring — keyingi safar u shu yerda ko‘rinadi.",
"couldNotLoad": "Yuklab bo'lmadi.",
"removeFromRecentsTitle": "Oxirgilar ro'yxatidan olib tashlansinmi?",
- "removeFromRecentsMessage": "Bu PR oxirgilar ro'yxatidan olib tashlanadi.",
+ "removeFromRecentsMessage": "Bu ko‘rib chiqish oxirgilar ro‘yxatidan olib tashlanadi.",
"removeRecentAccessibility": "{{repo}}ni oxirgilar ro'yxatidan olib tashlash",
- "urlAccessibility": "GitHubdagi PRning URL manzili",
- "clearLink": "PR havolasini tozalash",
- "pasteLink": "PR havolasini joylashtirish",
+ "urlAccessibility": "PR yoki merge so‘rovi URL manzilini kiriting",
+ "urlPlaceholder": "PR yoki merge so‘rovi URL manzili",
+ "openAccessibility": "PR yoki merge so‘rovini ochish",
+ "clearLink": "Havolani tozalash",
+ "pasteLink": "PR yoki merge so‘rovi havolasini joylashtirish",
"open": "Ochiq"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "GitHub ulanishini tekshirib bo'lmadi.",
"checkFailedMessage": "Bu ma'lumot yuklanmaguncha hisobga kirish holatini aniqlab bo'lmaydi.",
+ "checkFailedTitleGitLab": "GitLab ulanishini tekshirib bo'lmadi.",
+ "checkFailedTitleBitbucket": "Bitbucket ulanishini tekshirib bo'lmadi.",
+ "providerCheckFailedMessage": "Yuklanmaguncha ulanish holati mavjud emas.",
"reconnectTitle": "GitHubga qayta ulanish",
"reconnectDescription": "GitHub ulanishingiz bekor qilingan. Mobil qurilmada PRlarni ko'rib chiqishni davom ettirish uchun qayta ulaning.",
- "description": "Mobil qurilmada PRlarni ko'rib chiqish uchun GitHub hisobingizni ulang."
+ "description": "Mobil qurilmada PRlarni ko'rib chiqish uchun GitHub hisobingizni ulang.",
+ "gitlabDescription": "Telefonda merge so‘rovlarini ko‘rib chiqish uchun GitLab hisobingizni ulang.",
+ "bitbucketDescription": "Telefonda PRlarni ko‘rib chiqish uchun Bitbucketni ushbu tashkilotga ulang.",
+ "bitbucketOrgOnlyDescription": "Profilida tashkilot tanlang va uning Bitbucket PRlarini ko‘rib chiqing."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "GitHub bilan ulanish muddati tugadi.",
- "message": "GitHub ulanishingiz endi amal qilmaydi. Ulanishingizni qayta tekshiring — kerak bo'lsa, qayta ulanish so'raladi."
+ "message": "GitHub ulanishingiz endi amal qilmaydi. Ulanishingizni qayta tekshiring — kerak bo'lsa, qayta ulanish so'raladi.",
+ "gitlabTitle": "GitLab bilan ulanish muddati tugadi.",
+ "bitbucketTitle": "Bitbucket bilan ulanish muddati tugadi.",
+ "providerMessage": "{{provider}} ulanishingiz endi amal qilmaydi. Ulanishingizni qayta tekshiring — kerak bo'lsa, qayta ulanish so'raladi."
},
"eventChips": {
"comment": "Izoh",
@@ -643,6 +679,21 @@
"files": "Fayl",
"discussion": "Muhokama"
},
+ "terms": {
+ "pullRequest": "PR",
+ "mergeRequest": "Merge so‘rovi",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Merge so‘rovini ulashish",
+ "viewOnProvider": "{{provider}}da ko'rish",
+ "mergeRequestUnavailable": "Merge so‘rovi mavjud emas",
+ "unavailableDescription": "Ehtimol u o‘chirilgan yoki unga kirish huquqingiz yo‘q.",
+ "accessDeniedMergeRequest": "Bu merge so‘rovini ko‘rishga ruxsatingiz yo‘q.",
+ "couldNotLoadMergeRequest": "Merge so‘rovini yuklab bo‘lmadi.",
+ "discussionAccessDenied": "Bu merge so‘rovi muhokamasini ko‘rishga ruxsatingiz yo‘q.",
+ "discussionUnavailableMessage": "Bu merge so‘rovi o‘chirilgan bo‘lishi mumkin.",
+ "noDiscussionDescription": "Bu merge so‘rovida ko‘rib chiqishga oid izohlar zanjiri ham, umumiy izohlar ham yo‘q.",
+ "noFilesChangedDescription": "Bu merge so‘rovida hech bir fayl o‘zgarmagan."
+ },
"fileStatus": {
"modified": "O'zgartirildi",
"renamed": "Nomi o'zgartirildi",
@@ -659,7 +710,7 @@
"emptyLine": "(bo‘sh)"
},
"linkPasteClipboardEmpty": "Nusxalash buferi bo'sh.",
- "linkPasteNotAPullRequest": "Bu GitHubdagi PR havolasi emas.",
+ "linkPasteNotAPullRequest": "Bu PR yoki merge so‘rovi havolasi emas",
"announce": {
"commentPosted": "Izoh joylashtirildi",
"reviewSubmitted": "Ko'rib chiqish natijasi yuborildi",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "Bu izohni joylashtirib bo'lmaydi. Tanlangan qator o'zgargan yoki PR yangilangan bo'lishi mumkin.",
"reviewNotSubmitted": "Ko'rib chiqish natijasini hozirgi holatida yuborib bo'lmaydi. PR o'zgargan bo'lishi mumkin yoki siz o'zingiz ochgan PRni ko'rib chiqishga urinyapsiz.",
+ "reviewNotSubmittedTerm": "Ushbu ko'rib chiqish hozirgi holatida yuborilmaydi. {{term}} o'zgargan bo'lishi mumkin yoki o'zingiz yaratgan {{term}}ni ko'rib chiqa olmaysiz.",
"couldNotPostComment": "Izoh joylashtirib bo'lmadi.",
"couldNotSubmitReview": "Ko'rib chiqish natijasini yuborib bo'lmadi. Internetga ulanishni tekshiring va qayta urinib ko'ring."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Javob yuborib bo‘lmadi.",
"couldNotCompleteAction": "Bu amalni yakunlab bo'lmadi.",
"mergeResultDefaultError": "GitHub birlashtirishni yakunlamadi.",
+ "mergeResultNotCompleted": "{{term}} birlashtirilmadi. Holatini tekshiring va qayta urinib ko‘ring.",
"ambiguous": "Amal natijasini tasdiqlab bo'lmadi — qayta urinishdan oldin PRni tekshiring.",
"persistenceFailed": "Bu amalni qayd etib bo'lmadi. Keyinroq qayta urinib ko'ring.",
"forbidden": "Bu amalni bajarishga ruxsat yo'q."
@@ -1988,11 +2041,31 @@
"retryConnection": "Qayta ulanish"
},
"newSession": {
+ "recentlyUsed": "Yaqinda ishlatilgan",
+ "couldNotLoadGithubRepositories": "GitHub repozitoriyalarini yuklab bo'lmadi.",
+ "couldNotLoadGitlabRepositories": "GitLab repozitoriyalarini yuklab bo'lmadi.",
+ "couldNotLoadBitbucketRepositories": "Bitbucket repozitoriyalarini yuklab bo'lmadi.",
"connectGithubDescription": "Brauzerda GitHub hisobingizni ulang, so'ng repozitoriya tanlash uchun bu yerga qayting.",
+ "connectGitlabDescription": "Brauzerda GitLab hisobingizni ulang, so'ng repozitoriya tanlash uchun bu yerga qayting.",
+ "connectBitbucketDescription": "Brauzerda Bitbucket hisobingizni ulang, so'ng repozitoriya tanlash uchun bu yerga qayting.",
"openGithub": "GitHub saytini ochish",
+ "openGitlab": "GitLab saytini ochish",
+ "openBitbucket": "Bitbucket saytini ochish",
"refreshRepositories": "Repozitoriyalarni yangilash",
"githubConnected": "GitHub ulandi",
+ "gitlabConnected": "GitLab ulandi",
"noRepositoriesVisible": "Repozitoriyalar ko'rinmayapti. Kilo GitHub ilovasining repozitoriyalarga kirish ruxsatlarini tekshiring, so'ng ro'yxatni yangilang.",
+ "noRepositoriesVisibleGitlab": "Repozitoriyalar ko'rinmayapti. GitLab repozitoriyalariga kirish ruxsatlarini tekshiring, so'ng ro'yxatni yangilang.",
+ "noRepositoriesVisibleBitbucket": "Repozitoriyalar ko'rinmayapti. Bitbucket repozitoriyalariga kirish ruxsatlarini tekshiring, so'ng ro'yxatni yangilang.",
+ "bitbucketOrganizationsOnly": "Bitbucket faqat tashkilotlar uchun mavjud.",
+ "branchPickerTitle": "Tarmoqni tanlash",
+ "branchDefault": "Standart",
+ "branchAccessibility": "Tarmoq: {{label}}",
+ "branchLoading": "Tarmoqlar yuklanmoqda",
+ "branchLoadError": "Tarmoqlarni yuklab bo‘lmadi",
+ "branchUnavailable": "Ushbu repozitoriy uchun tarmoqlar mavjud emas. Provayderdagi kirish huquqingizni tekshiring, so‘ng boshqa repozitoriy tanlang.",
+ "branchEmpty": "Mavjud tarmoqlar yo‘q",
+ "branchPlaceholder": "Tarmoq tanlang",
"runOnWithTarget": "Ishga tushirish muhiti: {{target}}",
"environment": "Muhit",
"couldNotLoadEnvironment": "Muhitingizni yuklab bo'lmadi.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Repozitoriyalarni yangilab bo'lmadi. Iltimos, qayta urinib ko'ring.",
"discardDraftTitle": "Qoralama bekor qilinsinmi?",
"discardDraftMessage": "Yozgan so'rovingiz yo'qoladi.",
+ "discardWithUploadsMessage": "So'rovingiz va hali hech bir xabarga biriktirilmagan yuklangan fayllar o'chiriladi.",
"discardFailed": "Qoralamani bekor qilib bo'lmadi. Iltimos, qayta urinib ko'ring.",
"remoteHint": "Kompyuteringizdagi kilo jarayonini boshqarish uchun `kilo remote` buyrug'ini yoki ishlayotgan CLI sessiyasida `/remote` buyrug'ini bajaring.",
- "connectBitbucketDescription": "Brauzerda Bitbucket hisobingizni ulang, so'ng repozitoriya tanlash uchun bu yerga qayting.",
- "connectGitlabDescription": "Brauzerda GitLab hisobingizni ulang, so'ng repozitoriya tanlash uchun bu yerga qayting.",
- "couldNotLoadBitbucketRepositories": "Bitbucket repozitoriyalarini yuklab bo'lmadi.",
- "couldNotLoadGithubRepositories": "GitHub repozitoriyalarini yuklab bo'lmadi.",
- "couldNotLoadGitlabRepositories": "GitLab repozitoriyalarini yuklab bo'lmadi.",
- "gitlabConnected": "GitLab ulandi",
- "noRepositoriesVisibleBitbucket": "Repozitoriyalar ko'rinmayapti. Bitbucket repozitoriyalariga kirish ruxsatlarini tekshiring, so'ng ro'yxatni yangilang.",
- "noRepositoriesVisibleGitlab": "Repozitoriyalar ko'rinmayapti. GitLab repozitoriyalariga kirish ruxsatlarini tekshiring, so'ng ro'yxatni yangilang.",
- "openBitbucket": "Bitbucket saytini ochish",
- "openGitlab": "GitLab saytini ochish",
- "recentlyUsed": "Yaqinda ishlatilgan",
"continueFrom": "{{title}} sessiyasi davom ettirilmoqda.",
"importingSession": "Sessiya import qilinmoqda",
"cliCannotContinue": "Bu CLI sessiyani davom ettira olmaydi. Cloud Agent xizmatini yoki boshqa CLI dasturini tanlang.",
- "importFailed": "Bu sessiyani import qilib bo'lmadi.",
- "discardWithUploadsMessage": "So'rovingiz va hali hech bir xabarga biriktirilmagan yuklangan fayllar o'chiriladi."
+ "importFailed": "Bu sessiyani import qilib bo'lmadi."
},
"partRenderer": {
"updatedFileCount_one": "{{displayCount}} ta fayl yangilandi.",
diff --git a/apps/mobile/src/i18n/locales/vi.json b/apps/mobile/src/i18n/locales/vi.json
index 48be1532c7..d2e05d92ab 100644
--- a/apps/mobile/src/i18n/locales/vi.json
+++ b/apps/mobile/src/i18n/locales/vi.json
@@ -4,6 +4,8 @@
"done": "Xong",
"retry": "Thử lại",
"tryAgain": "Thử lại",
+ "continue": "Tiếp tục",
+ "notNow": "Để sau",
"language": "Ngôn ngữ",
"device": "Thiết bị",
"share": "Chia sẻ {{title}}",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "Không thể sao chép vào bộ nhớ tạm.",
"required": "bắt buộc",
"error": "lỗi: {{error}}",
- "notNow": "Để sau",
- "continue": "Tiếp tục",
"back": "Quay lại",
"somethingWentWrong": "Đã xảy ra lỗi.",
"couldNotOpen": "Không thể mở {{label}}.",
@@ -36,6 +36,7 @@
"cost": "Chi phí",
"discard": "Hủy bỏ",
"findings": "Vấn đề",
+ "mergeRequest": "merge request",
"notConnected": "Chưa kết nối",
"notifications": "Thông báo",
"pullRequest": "yêu cầu hợp nhất",
@@ -1557,11 +1558,31 @@
"retryConnection": "Thử kết nối lại"
},
"newSession": {
+ "recentlyUsed": "Đã dùng gần đây",
+ "couldNotLoadGithubRepositories": "Không thể tải danh sách kho mã GitHub.",
+ "couldNotLoadGitlabRepositories": "Không thể tải danh sách kho mã GitLab.",
+ "couldNotLoadBitbucketRepositories": "Không thể tải danh sách kho mã Bitbucket.",
"connectGithubDescription": "Kết nối GitHub trong trình duyệt, rồi quay lại đây để chọn kho mã.",
+ "connectGitlabDescription": "Kết nối GitLab trong trình duyệt, rồi quay lại đây để chọn kho mã.",
+ "connectBitbucketDescription": "Kết nối Bitbucket trong trình duyệt, rồi quay lại đây để chọn kho mã.",
"openGithub": "Mở GitHub",
+ "openGitlab": "Mở GitLab",
+ "openBitbucket": "Mở Bitbucket",
"refreshRepositories": "Làm mới danh sách kho mã",
"githubConnected": "Đã kết nối GitHub",
+ "gitlabConnected": "Đã kết nối GitLab",
"noRepositoriesVisible": "Không thấy kho mã nào. Hãy kiểm tra quyền truy cập kho mã của ứng dụng Kilo trên GitHub, rồi làm mới danh sách.",
+ "noRepositoriesVisibleGitlab": "Không thấy kho mã nào. Hãy kiểm tra quyền truy cập kho mã trên GitLab, rồi làm mới danh sách.",
+ "noRepositoriesVisibleBitbucket": "Không thấy kho mã nào. Hãy kiểm tra quyền truy cập kho mã trên Bitbucket, rồi làm mới danh sách.",
+ "bitbucketOrganizationsOnly": "Bitbucket chỉ khả dụng cho các tổ chức.",
+ "branchPickerTitle": "Chọn nhánh",
+ "branchDefault": "Mặc định",
+ "branchAccessibility": "Nhánh: {{label}}",
+ "branchLoading": "Đang tải các nhánh",
+ "branchLoadError": "Không tải được các nhánh",
+ "branchUnavailable": "Không có nhánh khả dụng cho kho mã nguồn này. Kiểm tra quyền truy cập của bạn với nhà cung cấp, rồi chọn kho mã nguồn khác.",
+ "branchEmpty": "Không có nhánh khả dụng",
+ "branchPlaceholder": "Chọn một nhánh",
"runOnWithTarget": "Chạy trên: {{target}}",
"environment": "Môi trường",
"couldNotLoadEnvironment": "Không thể tải môi trường của bạn.",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "Không thể đọc danh sách phiên đang chờ. Vui lòng thử lại.",
"failedToCreate": "Không thể tạo phiên.",
"couldNotRefreshRepositories": "Không thể làm mới danh sách kho mã. Vui lòng thử lại.",
- "discardDraftMessage": "Nội dung yêu cầu của bạn sẽ bị mất.",
"discardDraftTitle": "Hủy bản nháp?",
+ "discardDraftMessage": "Nội dung yêu cầu của bạn sẽ bị mất.",
+ "discardWithUploadsMessage": "Nội dung yêu cầu và các tệp đã tải lên nhưng chưa gắn với tin nhắn đã gửi sẽ bị xóa.",
"discardFailed": "Không thể hủy bản nháp. Vui lòng thử lại.",
"remoteHint": "Chạy `kilo remote` trên máy tính hoặc `/remote` trong phiên CLI đang chạy để điều khiển tiến trình kilo trên máy.",
- "connectBitbucketDescription": "Kết nối Bitbucket trong trình duyệt, rồi quay lại đây để chọn kho mã.",
- "connectGitlabDescription": "Kết nối GitLab trong trình duyệt, rồi quay lại đây để chọn kho mã.",
- "couldNotLoadBitbucketRepositories": "Không thể tải danh sách kho mã Bitbucket.",
- "couldNotLoadGithubRepositories": "Không thể tải danh sách kho mã GitHub.",
- "couldNotLoadGitlabRepositories": "Không thể tải danh sách kho mã GitLab.",
- "gitlabConnected": "Đã kết nối GitLab",
- "noRepositoriesVisibleBitbucket": "Không thấy kho mã nào. Hãy kiểm tra quyền truy cập kho mã trên Bitbucket, rồi làm mới danh sách.",
- "noRepositoriesVisibleGitlab": "Không thấy kho mã nào. Hãy kiểm tra quyền truy cập kho mã trên GitLab, rồi làm mới danh sách.",
- "openBitbucket": "Mở Bitbucket",
- "openGitlab": "Mở GitLab",
- "recentlyUsed": "Đã dùng gần đây",
"continueFrom": "Đang tiếp tục phiên {{title}}.",
"importingSession": "Đang nhập phiên",
"cliCannotContinue": "CLI này không hỗ trợ tiếp tục phiên. Hãy chọn Cloud Agent hoặc CLI khác.",
- "importFailed": "Không thể nhập phiên này.",
- "discardWithUploadsMessage": "Nội dung yêu cầu và các tệp đã tải lên nhưng chưa gắn với tin nhắn đã gửi sẽ bị xóa."
+ "importFailed": "Không thể nhập phiên này."
},
"partRenderer": {
"updatedFileCount_one": "Đã cập nhật {{displayCount}} tệp.",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "Cho phép xác định nguồn cài đặt?"
},
"prReview": {
+ "pullRequestUnavailable": "Không thể truy cập PR",
+ "pullRequestUnavailableDescription": "Không thể mở PR này. Có thể PR đã bị xóa, kho lưu trữ ở chế độ riêng tư hoặc ứng dụng Kilo trên GitHub chưa được cài đặt cho kho lưu trữ này.",
"accessDeniedDescription": "Bạn không có quyền xem PR này.",
- "checkConnection": "Kiểm tra kết nối",
- "checks": {
- "checksCount": "{{displayCount}} bước kiểm tra",
- "couldNotLoad": "Không thể tải các bước kiểm tra.",
- "failed": "{{displayCount}} không đạt",
- "noAccess": "Bạn không có quyền xem các bước kiểm tra của kho lưu trữ này.",
- "noChecksReported": "Chưa có thông tin kiểm tra",
- "notAvailable": "Chưa có thông tin kiểm tra. Có thể bản ghi mới nhất chưa được xử lý hoặc ứng dụng Kilo trên GitHub chưa được cài đặt cho kho lưu trữ nguồn.",
- "openDetails": "Mở chi tiết {{name}}",
- "passed": "{{displayCount}} đạt",
- "pending": "{{displayCount}} đang chờ",
- "retryChecks": "Thử lại các bước kiểm tra",
- "skipped": "{{displayCount}} đã bỏ qua",
- "title": "Các bước kiểm tra",
- "viewOnGitHub": "Xem PR trên GitHub",
- "checkDetails": "chi tiết bước kiểm tra"
- },
- "composer": {
- "addTitle": "Thêm bình luận",
- "addToReview": "Thêm vào bản đánh giá",
- "comment": "Bình luận",
- "commentBody": "Nội dung bình luận",
- "commentBodyPlaceholder": "Nội dung bình luận…",
- "commentNow": "Bình luận ngay",
- "discardMessage": "Bản nháp của bạn sẽ bị mất.",
- "discardTitle": "Hủy bình luận?",
- "editTitle": "Chỉnh sửa bình luận",
- "insertSuggestion": "Chèn đề xuất",
- "insertSuggestionA11y": "Chèn đề xuất sửa mã",
- "loadFailedTitle": "Không thể tải trình soạn bình luận.",
- "ok": "OK",
- "unavailableMessage": "Bình luận chờ gửi này đã bị xóa hoặc đã được gửi.",
- "unavailableTitle": "Không thể truy cập bình luận",
- "bodyEmpty": "Nội dung bình luận không được để trống.",
- "suggestionsOnlyAddedLines": "Đề xuất chỉ áp dụng cho các dòng mới thêm.",
- "tapDiffLineToSuggest": "Chạm vào một dòng trong bản so sánh để bật đề xuất."
- },
- "connect": {
- "checkFailedMessage": "Chưa thể xác định trạng thái đăng nhập cho đến khi tải xong dữ liệu.",
- "checkFailedTitle": "Không thể kiểm tra kết nối GitHub.",
- "description": "Kết nối tài khoản GitHub của bạn để đánh giá PR trên thiết bị di động.",
- "reconnectDescription": "Quyền kết nối với GitHub của bạn đã bị thu hồi. Kết nối lại để tiếp tục đánh giá PR trên thiết bị di động.",
- "reconnectTitle": "Kết nối lại GitHub"
- },
- "connectionExpired": "Kết nối GitHub đã hết hạn.",
- "couldNotLoadPullRequest": "Không thể tải PR.",
- "couldNotOpenGitHubAppSettings": "Không thể mở cài đặt ứng dụng GitHub.",
- "description": "Mô tả",
- "discussion": {
- "acceptTerms": "Chấp nhận",
- "accessDeniedMessage": "Bạn không có quyền xem thảo luận của PR này.",
- "addReaction": "Thêm cảm xúc",
- "block": "Chặn",
- "blockedUser": "Đã chặn {{login}}",
- "collapseThread": "Thu gọn chuỗi thảo luận",
- "commentActions": "Thao tác với bình luận",
- "comment": "{{displayCount}} bình luận",
- "comment_other": "{{displayCount}} bình luận",
- "couldNotLoad": "Không thể tải phần thảo luận.",
- "couldNotLoadMore": "Không thể tải thêm bình luận.",
- "loadMoreComments": "Tải thêm bình luận",
- "loading": "Đang tải thảo luận",
- "moderation": {
- "block": {
- "retryable": "Không thể chặn người dùng này. Kiểm tra kết nối và thử lại.",
- "terminal": "Không thể chặn người dùng này."
- },
- "mute": {
- "retryable": "Không thể tắt tiếng người dùng này. Kiểm tra kết nối và thử lại.",
- "terminal": "Không thể tắt tiếng người dùng này."
- },
- "reportContent": {
- "retryable": "Không thể báo cáo bình luận này. Kiểm tra kết nối và thử lại.",
- "terminal": "Không thể báo cáo bình luận này."
- },
- "reportUser": {
- "retryable": "Không thể báo cáo người dùng này. Kiểm tra kết nối và thử lại.",
- "terminal": "Không thể báo cáo người dùng này."
- }
- },
- "moreLinesAbove": "… Còn {{displayCount}} dòng ở trên.",
- "mute": "Tắt tiếng",
- "mutedUser": "Đã tắt tiếng {{login}}",
- "noDiscussion": "Chưa có thảo luận",
- "noDiscussionDescription": "PR này chưa có chuỗi thảo luận đánh giá hay bình luận nào.",
- "comment_one": "1 bình luận",
- "outdated": "Lỗi thời",
- "quotedDiffSnippet": "Đoạn trích từ bản so sánh",
- "reactionPill": "Cảm xúc {{emoji}}, {{displayCount}} {{countLabel}}",
- "reaction": "biểu cảm",
- "reaction_other": "biểu cảm",
- "reaction_one": "cảm xúc",
- "replyBadRequest": "Không thể đăng câu trả lời này. Chuỗi thảo luận có thể đã thay đổi.",
- "replyBody": "Nội dung trả lời",
- "replyForbidden": "Bạn không có quyền trả lời trong PR này.",
- "replyPlaceholder": "Trả lời…",
- "reportContent": "Báo cáo nội dung",
- "reportUser": "Báo cáo người dùng",
- "resolveThread": "Đánh dấu chuỗi thảo luận là đã giải quyết",
- "resolved": "Đã giải quyết",
- "retryLoadingMore": "Thử tải thêm bình luận",
- "reviewFiles": "Đánh giá tệp",
- "startedRelative": " · bắt đầu {{relative}}",
- "submitReply": "Gửi câu trả lời",
- "termsAcceptRetry": "Không thể ghi nhận việc chấp nhận điều khoản. Kiểm tra kết nối rồi thử lại.",
- "termsCopy": "Bạn phải từ 13 tuổi trở lên mới được đăng nội dung.",
- "termsTitle": "Điều khoản dịch vụ",
- "threadAccessibilityLabel": "Chuỗi thảo luận {{anchorLabel}}",
- "unavailable": "Không thể truy cập phần thảo luận.",
- "unavailableMessage": "PR này có thể đã bị xóa.",
- "unresolveThread": "Mở lại chuỗi thảo luận",
- "viewTerms": "Xem điều khoản",
- "termsAcceptRequired": "Bạn phải chấp nhận điều khoản dịch vụ mới được đăng nội dung.",
- "termsCheckRetryCopy": "Không thể kiểm tra Điều khoản dịch vụ. Kiểm tra kết nối và thử lại.",
- "termsOutdatedCopy": "Điều khoản dịch vụ đã thay đổi. Mở lại màn hình này để chấp nhận phiên bản mới nhất.",
- "reactions": {
- "thumbsUp": "Thích",
- "thumbsDown": "Không thích",
- "laugh": "Cười",
- "hooray": "Hoan hô",
- "confused": "Bối rối",
- "heart": "Trái tim",
- "rocket": "Tên lửa",
- "eyes": "Đôi mắt"
- },
- "anchor": {
- "fileCommentOnPath": "Bình luận về tệp {{path}}",
- "fileComment": "Bình luận về tệp",
- "outdatedOnPathLines": "Không còn cập nhật tại {{path}} {{lines}}",
- "outdatedOnLines": "Không còn cập nhật tại {{lines}}",
- "outdatedOnPath": "Không còn cập nhật tại {{path}}"
- },
- "deletedUser": "người dùng đã bị xóa"
- },
- "entry": {
- "clearLink": "Xóa liên kết PR",
- "couldNotLoad": "Không thể tải dữ liệu.",
- "eyebrow": "Mở PR bằng URL.",
- "noRecentPrs": "Chưa có PR gần đây",
- "noRecentPrsDescription": "Dán liên kết PR ở trên để bắt đầu đánh giá. PR sẽ xuất hiện ở đây vào lần sau.",
- "open": "Mở",
- "pasteLink": "Dán liên kết PR",
- "pastePrLink": "Dán liên kết PR",
- "removeFromRecentsMessage": "PR này sẽ được xóa khỏi danh sách gần đây của bạn.",
- "removeFromRecentsTitle": "Xóa khỏi mục gần đây?",
- "removeRecentAccessibility": "Xóa {{repo}} khỏi mục gần đây",
- "urlAccessibility": "URL của PR trên GitHub"
- },
- "eventChips": {
- "comment": "Bình luận",
- "label": "Hình thức đánh giá",
- "requestChanges": "Yêu cầu thay đổi"
- },
+ "noFilesChanged": "Không có tệp nào thay đổi",
+ "noFilesChangedDescription": "PR này không có tệp nào thay đổi.",
"fileList": {
"filesList": "Danh sách tệp",
"filesViewed": "Tệp · Đã xem {{viewed}}/{{total}}",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "Bình luận về các dòng đã chọn",
"finishReview": "Hoàn tất đánh giá"
},
- "headLine": "{{counts}} · bản ghi mới nhất {{sha}}",
"hunkRows": {
"contextUnavailable": "Không có các dòng ngữ cảnh tại tham chiếu này.",
"expandAll": "Mở rộng tất cả",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "Thử tải lại các dòng ngữ cảnh",
"retryLoadingNextPage": "Thử tải lại trang tiếp theo"
},
- "inbox": {
- "couldNotLoad": "Không thể tải hộp thư đến.",
- "loading": "Đang tải hộp thư đến",
- "noReviewRequests": "Chưa có yêu cầu đánh giá",
- "noReviewRequestsDescription": "Các PR đang chờ bạn đánh giá sẽ xuất hiện ở đây. Bạn vẫn có thể dán liên kết của bất kỳ PR nào ở trên.",
- "title": "Hộp thư đến"
+ "sideBySide": {
+ "emptyDiffColumn": "cột so sánh trống",
+ "emptyDiffRow": "Dòng so sánh trống",
+ "newOnly": "Chỉ có ở bản mới: {{text}}",
+ "noNewlineAtEndOfFile": "không có ký tự xuống dòng ở cuối tệp.",
+ "oldNew": "Cũ: {{old}} | Mới: {{new}}",
+ "oldOnly": "Chỉ có ở bản cũ: {{text}}"
+ },
+ "connectionExpired": "Kết nối GitHub đã hết hạn.",
+ "capabilities": {
+ "banner": {
+ "title": "Không khả dụng trên nhà cung cấp này",
+ "accessibility": "Không khả dụng trên nhà cung cấp này: {{reason}}"
+ }
},
- "installKiloGitHubApp": "Cài đặt ứng dụng Kilo trên GitHub",
"merge": {
- "autoMergeDescription": "GitHub sẽ tự động hợp nhất PR này khi tất cả các bước kiểm tra bắt buộc đều đạt yêu cầu (phương thức: {{method}}).",
+ "merge": "Hợp nhất",
+ "mergeNow": "Hợp nhất ngay",
+ "mergePullRequest": "Hợp nhất PR",
+ "mergeTermTitle": "Hợp nhất {{term}}",
+ "enableAutoMerge": "Bật tự động hợp nhất",
+ "disableAutoMerge": "Tắt tự động hợp nhất",
"autoMergeOn": "Đã bật tự động hợp nhất",
- "blockedTitle": "Lý do chưa thể hợp nhất",
- "cannotMerge": "Không thể hợp nhất PR này ở trạng thái hiện tại.",
+ "autoMergeDescription": "GitHub sẽ tự động hợp nhất PR này khi tất cả các bước kiểm tra bắt buộc đều đạt yêu cầu (phương thức: {{method}}).",
"checking": "Đang kiểm tra khả năng hợp nhất…",
+ "couldNotDetermine": "Không thể xác định khả năng hợp nhất.",
+ "refreshMergeability": "Kiểm tra lại khả năng hợp nhất",
+ "blockedTitle": "Lý do chưa thể hợp nhất",
+ "updateBranch": "Cập nhật nhánh",
+ "updateBranchFromBase": "Cập nhật nhánh từ nhánh đích",
+ "methodLabel": "Phương thức",
+ "commitTitle": "Tiêu đề bản ghi",
"commitMessage": "Thông điệp bản ghi",
"commitMessagePlaceholder": "Mô tả bản ghi hợp nhất (không bắt buộc)",
- "commitTitle": "Tiêu đề bản ghi",
- "confirmMessage": "Thao tác này sẽ hợp nhất các thay đổi của bạn vào nhánh đích.",
- "confirmTitle": "Hợp nhất PR?",
- "couldNotDetermine": "Không thể xác định khả năng hợp nhất.",
- "couldNotMerge": "Không thể hợp nhất PR.",
"deleteBranch": "Xóa nhánh",
"deleteBranchAfterMerge": "Xóa nhánh sau khi hợp nhất",
- "disableAutoMerge": "Tắt tự động hợp nhất",
- "enableAutoMerge": "Bật tự động hợp nhất",
- "enableAutoMergeConfirmMessage": "GitHub sẽ tự động hợp nhất PR này khi tất cả các bước kiểm tra bắt buộc đều đạt yêu cầu.",
+ "noEnabledMethods": "Kho lưu trữ này chưa bật phương thức hợp nhất nào. Hãy nhờ quản trị viên bật phương thức tạo bản ghi hợp nhất, gộp bản ghi hoặc chuyển gốc.",
+ "confirmTitle": "Hợp nhất PR?",
+ "confirmTitleTerm": "Hợp nhất {{term}}?",
+ "confirmMessage": "Thao tác này sẽ hợp nhất các thay đổi của bạn vào nhánh đích.",
"enableAutoMergeConfirmTitle": "Bật tự động hợp nhất?",
+ "enableAutoMergeConfirmMessage": "GitHub sẽ tự động hợp nhất PR này khi tất cả các bước kiểm tra bắt buộc đều đạt yêu cầu.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} sẽ được hợp nhất tự động khi pipeline thành công.",
+ "enableAutoMergeDescriptionTerm": "GitLab sẽ tự động hợp nhất {{term}} này khi pipeline thành công.",
"forbidden": "Bạn không có quyền hợp nhất PR này.",
- "loadFailedTitle": "Không thể tải các tùy chọn hợp nhất.",
- "merge": "Hợp nhất",
- "mergeNow": "Hợp nhất ngay",
- "mergePullRequest": "Hợp nhất PR",
- "methodLabel": "Phương thức",
+ "cannotMerge": "Không thể hợp nhất PR này ở trạng thái hiện tại.",
+ "couldNotMerge": "Không thể hợp nhất PR.",
"methods": {
"merge": "Hợp nhất",
"rebase": "Chuyển gốc",
"squash": "Gộp bản ghi"
},
- "noEnabledMethods": "Kho lưu trữ này chưa bật phương thức hợp nhất nào. Hãy nhờ quản trị viên bật phương thức tạo bản ghi hợp nhất, gộp bản ghi hoặc chuyển gốc.",
+ "terminal": {
+ "alreadyMerged": "Đã hợp nhất",
+ "closed": "PR này đã đóng",
+ "closedMergeRequest": "Merge request này đã đóng"
+ },
"partialSuccessBanner": {
"accessibility": "Đã hợp nhất. Không thể xóa nhánh: {{reason}}",
"body": "Không thể xóa nhánh: {{reason}}."
},
- "refreshMergeability": "Kiểm tra lại khả năng hợp nhất",
- "terminal": {
- "alreadyMerged": "Đã hợp nhất",
- "closed": "PR này đã đóng"
- },
- "updateBranch": "Cập nhật nhánh",
- "updateBranchFromBase": "Cập nhật nhánh từ nhánh đích",
+ "loadFailedTitle": "Không thể tải các tùy chọn hợp nhất.",
"blocked": {
"unknownStateTitle": "GitHub chưa xác nhận có thể hợp nhất",
"unknownStateDetail": "Đợi một lát rồi thử làm mới phần tổng quan.",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "Chưa thể hợp nhất PR này",
"notMergeableDetail": "GitHub đã báo cáo trạng thái hợp nhất là {{state}}."
},
+ "restrictions": {
+ "title": "Hạn chế hợp nhất",
+ "approvalsRequired_one": "Cần {{displayCount}} phê duyệt",
+ "approvalsRequired_other": "Cần {{displayCount}} phê duyệt",
+ "pipelineMustSucceed": "Pipeline phải thành công trước khi hợp nhất."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline đang thất bại ở bản ghi mới nhất.",
+ "pendingPipeline": "Pipeline vẫn đang chạy ở bản ghi mới nhất.",
+ "permission": "Bạn không có quyền hợp nhất {{term}} này.",
+ "draft": "Đánh dấu {{term}} là sẵn sàng để đánh giá trước khi hợp nhất."
+ },
"methodLabels": {
"merge": "Tạo bản ghi hợp nhất",
"squash": "Gộp bản ghi và hợp nhất",
@@ -2623,9 +2507,204 @@
"rebase": "Áp dụng lại lần lượt các bản ghi từ nhánh này lên nhánh đích mà không tạo bản ghi hợp nhất."
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "Chuỗi thảo luận {{anchorLabel}}",
+ "collapseThread": "Thu gọn chuỗi thảo luận",
+ "resolveThread": "Đánh dấu chuỗi thảo luận là đã giải quyết",
+ "unresolveThread": "Mở lại chuỗi thảo luận",
+ "resolved": "Đã giải quyết",
+ "outdated": "Lỗi thời",
+ "comment_one": "1 bình luận",
+ "comment": "{{displayCount}} bình luận",
+ "comment_other": "{{displayCount}} bình luận",
+ "startedRelative": " · bắt đầu {{relative}}",
+ "couldNotLoadMore": "Không thể tải thêm bình luận.",
+ "retryLoadingMore": "Thử tải thêm bình luận",
+ "loadMoreComments": "Tải thêm bình luận",
+ "addReaction": "Thêm cảm xúc",
+ "reactionPill": "Cảm xúc {{emoji}}, {{displayCount}} {{countLabel}}",
+ "reaction_one": "cảm xúc",
+ "reaction": "biểu cảm",
+ "reaction_other": "biểu cảm",
+ "commentActions": "Thao tác với bình luận",
+ "reportContent": "Báo cáo nội dung",
+ "reportUser": "Báo cáo người dùng",
+ "mute": "Tắt tiếng",
+ "block": "Chặn",
+ "blockedUser": "Đã chặn {{login}}",
+ "mutedUser": "Đã tắt tiếng {{login}}",
+ "replyPlaceholder": "Trả lời…",
+ "replyBody": "Nội dung trả lời",
+ "submitReply": "Gửi câu trả lời",
+ "termsTitle": "Điều khoản dịch vụ",
+ "termsCopy": "Bạn phải từ 13 tuổi trở lên mới được đăng nội dung.",
+ "termsAcceptRetry": "Không thể ghi nhận việc chấp nhận điều khoản. Kiểm tra kết nối rồi thử lại.",
+ "viewTerms": "Xem điều khoản",
+ "acceptTerms": "Chấp nhận",
+ "replyBadRequest": "Không thể đăng câu trả lời này. Chuỗi thảo luận có thể đã thay đổi.",
+ "replyForbidden": "Bạn không có quyền trả lời trong PR này.",
+ "replyForbiddenTerm": "Bạn không có quyền trả lời trong {{term}} này.",
+ "moderation": {
+ "block": {
+ "retryable": "Không thể chặn người dùng này. Kiểm tra kết nối và thử lại.",
+ "terminal": "Không thể chặn người dùng này."
+ },
+ "mute": {
+ "retryable": "Không thể tắt tiếng người dùng này. Kiểm tra kết nối và thử lại.",
+ "terminal": "Không thể tắt tiếng người dùng này."
+ },
+ "reportContent": {
+ "retryable": "Không thể báo cáo bình luận này. Kiểm tra kết nối và thử lại.",
+ "terminal": "Không thể báo cáo bình luận này."
+ },
+ "reportUser": {
+ "retryable": "Không thể báo cáo người dùng này. Kiểm tra kết nối và thử lại.",
+ "terminal": "Không thể báo cáo người dùng này."
+ }
+ },
+ "accessDeniedMessage": "Bạn không có quyền xem thảo luận của PR này.",
+ "unavailable": "Không thể truy cập phần thảo luận.",
+ "unavailableMessage": "PR này có thể đã bị xóa.",
+ "couldNotLoad": "Không thể tải phần thảo luận.",
+ "loading": "Đang tải thảo luận",
+ "noDiscussion": "Chưa có thảo luận",
+ "noDiscussionDescription": "PR này chưa có chuỗi thảo luận đánh giá hay bình luận nào.",
+ "reviewFiles": "Đánh giá tệp",
+ "quotedDiffSnippet": "Đoạn trích từ bản so sánh",
+ "moreLinesAbove": "… Còn {{displayCount}} dòng ở trên.",
+ "termsAcceptRequired": "Bạn phải chấp nhận điều khoản dịch vụ mới được đăng nội dung.",
+ "termsOutdatedCopy": "Điều khoản dịch vụ đã thay đổi. Mở lại màn hình này để chấp nhận phiên bản mới nhất.",
+ "termsCheckRetryCopy": "Không thể kiểm tra Điều khoản dịch vụ. Kiểm tra kết nối và thử lại.",
+ "reactions": {
+ "thumbsUp": "Thích",
+ "thumbsDown": "Không thích",
+ "laugh": "Cười",
+ "hooray": "Hoan hô",
+ "confused": "Bối rối",
+ "heart": "Trái tim",
+ "rocket": "Tên lửa",
+ "eyes": "Đôi mắt"
+ },
+ "anchor": {
+ "fileCommentOnPath": "Bình luận về tệp {{path}}",
+ "fileComment": "Bình luận về tệp",
+ "outdatedOnPathLines": "Không còn cập nhật tại {{path}} {{lines}}",
+ "outdatedOnLines": "Không còn cập nhật tại {{lines}}",
+ "outdatedOnPath": "Không còn cập nhật tại {{path}}"
+ },
+ "deletedUser": "người dùng đã bị xóa"
+ },
+ "couldNotOpenGitHubAppSettings": "Không thể mở cài đặt ứng dụng GitHub.",
+ "installKiloGitHubApp": "Cài đặt ứng dụng Kilo trên GitHub",
+ "checkConnection": "Kiểm tra kết nối",
+ "couldNotLoadPullRequest": "Không thể tải PR.",
+ "description": "Mô tả",
"noDescriptionProvided": "Chưa có mô tả.",
- "noFilesChanged": "Không có tệp nào thay đổi",
- "noFilesChangedDescription": "PR này không có tệp nào thay đổi.",
+ "review": "Rà soát",
+ "reviewPullRequest": "Đánh giá PR",
+ "headLine": "{{counts}} · bản ghi mới nhất {{sha}}",
+ "entry": {
+ "eyebrow": "Mở PR hoặc merge request bằng URL",
+ "pastePrLink": "Dán liên kết PR hoặc merge request",
+ "noRecentPrs": "Chưa có đánh giá gần đây",
+ "noRecentPrsDescription": "Dán liên kết ở trên để bắt đầu đánh giá — lần sau nó sẽ xuất hiện ở đây.",
+ "couldNotLoad": "Không thể tải dữ liệu.",
+ "removeFromRecentsTitle": "Xóa khỏi mục gần đây?",
+ "removeFromRecentsMessage": "Đánh giá này sẽ được xóa khỏi danh sách gần đây của bạn.",
+ "removeRecentAccessibility": "Xóa {{repo}} khỏi mục gần đây",
+ "urlAccessibility": "Nhập URL của PR hoặc merge request",
+ "urlPlaceholder": "URL của PR hoặc merge request",
+ "openAccessibility": "Mở PR hoặc merge request",
+ "clearLink": "Xóa liên kết",
+ "pasteLink": "Dán liên kết PR hoặc merge request",
+ "open": "Mở"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} bước kiểm tra",
+ "couldNotLoad": "Không thể tải các bước kiểm tra.",
+ "failed": "{{displayCount}} không đạt",
+ "noAccess": "Bạn không có quyền xem các bước kiểm tra của kho lưu trữ này.",
+ "noChecksReported": "Chưa có thông tin kiểm tra",
+ "notAvailable": "Chưa có thông tin kiểm tra. Có thể bản ghi mới nhất chưa được xử lý hoặc ứng dụng Kilo trên GitHub chưa được cài đặt cho kho lưu trữ nguồn.",
+ "openDetails": "Mở chi tiết {{name}}",
+ "passed": "{{displayCount}} đạt",
+ "pending": "{{displayCount}} đang chờ",
+ "retryChecks": "Thử lại các bước kiểm tra",
+ "skipped": "{{displayCount}} đã bỏ qua",
+ "title": "Các bước kiểm tra",
+ "viewOnGitHub": "Xem PR trên GitHub",
+ "checkDetails": "chi tiết bước kiểm tra"
+ },
+ "inbox": {
+ "couldNotLoad": "Không thể tải hộp thư đến.",
+ "loading": "Đang tải hộp thư đến",
+ "noReviewRequests": "Chưa có yêu cầu đánh giá",
+ "noReviewRequestsDescription": "Các PR đang chờ bạn đánh giá sẽ xuất hiện ở đây. Bạn vẫn có thể dán liên kết của bất kỳ PR nào ở trên.",
+ "title": "Hộp thư đến"
+ },
+ "composer": {
+ "addTitle": "Thêm bình luận",
+ "addToReview": "Thêm vào bản đánh giá",
+ "comment": "Bình luận",
+ "commentBody": "Nội dung bình luận",
+ "commentBodyPlaceholder": "Nội dung bình luận…",
+ "commentNow": "Bình luận ngay",
+ "discardMessage": "Bản nháp của bạn sẽ bị mất.",
+ "discardTitle": "Hủy bình luận?",
+ "editTitle": "Chỉnh sửa bình luận",
+ "insertSuggestion": "Chèn đề xuất",
+ "insertSuggestionA11y": "Chèn đề xuất sửa mã",
+ "loadFailedTitle": "Không thể tải trình soạn bình luận.",
+ "ok": "OK",
+ "unavailableMessage": "Bình luận chờ gửi này đã bị xóa hoặc đã được gửi.",
+ "unavailableTitle": "Không thể truy cập bình luận",
+ "bodyEmpty": "Nội dung bình luận không được để trống.",
+ "suggestionsOnlyAddedLines": "Đề xuất chỉ áp dụng cho các dòng mới thêm.",
+ "tapDiffLineToSuggest": "Chạm vào một dòng trong bản so sánh để bật đề xuất."
+ },
+ "connect": {
+ "checkFailedTitle": "Không thể kiểm tra kết nối GitHub.",
+ "checkFailedMessage": "Chưa thể xác định trạng thái đăng nhập cho đến khi tải xong dữ liệu.",
+ "checkFailedTitleGitLab": "Không thể kiểm tra kết nối GitLab.",
+ "checkFailedTitleBitbucket": "Không thể kiểm tra kết nối Bitbucket.",
+ "providerCheckFailedMessage": "Trạng thái kết nối chưa khả dụng cho đến khi tải xong.",
+ "reconnectTitle": "Kết nối lại GitHub",
+ "reconnectDescription": "Quyền kết nối với GitHub của bạn đã bị thu hồi. Kết nối lại để tiếp tục đánh giá PR trên thiết bị di động.",
+ "description": "Kết nối tài khoản GitHub của bạn để đánh giá PR trên thiết bị di động.",
+ "gitlabDescription": "Kết nối tài khoản GitLab để xem merge request trên thiết bị di động.",
+ "bitbucketDescription": "Kết nối Bitbucket với tổ chức này để xem PR trên thiết bị di động.",
+ "bitbucketOrgOnlyDescription": "Chọn một tổ chức trong hồ sơ của bạn để xem các PR Bitbucket của tổ chức đó."
+ },
+ "screen": {
+ "shareA11y": "Chia sẻ PR",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "Bình luận này sẽ được xóa khỏi danh sách chờ gửi của bản đánh giá.",
+ "deletePendingTitle": "Xóa bình luận chờ gửi?",
+ "loadFailedTitle": "Không thể tải màn hình gửi đánh giá.",
+ "pendingComment": "bình luận chưa gửi",
+ "pendingComment_other": "bình luận chưa gửi",
+ "pendingComment_one": "bình luận chờ gửi",
+ "summaryOptional": "Tóm tắt (tùy chọn)",
+ "partialPostedMessage": "Đã đăng {{displayFreshCount}} bình luận. Còn {{displayStaleCount}} bình luận gắn với bản ghi cũ hơn được giữ lại trong danh sách chờ gửi.",
+ "submitCountOfTotal": "Gửi {{displayFreshCount}} trong {{displayTotalCount}} bình luận",
+ "submitReview": "Gửi kết quả rà soát",
+ "blockedRequestChanges": "Thêm tóm tắt hoặc ít nhất một bình luận để yêu cầu thay đổi.",
+ "blockedComment": "Thêm tóm tắt hoặc ít nhất một bình luận để gửi bản đánh giá dưới dạng bình luận."
+ },
+ "reconnectNotice": {
+ "title": "Kết nối GitHub đã hết hạn.",
+ "message": "Kết nối GitHub của bạn không còn hợp lệ. Kiểm tra lại kết nối — bạn sẽ được nhắc kết nối lại nếu cần.",
+ "gitlabTitle": "Kết nối GitLab đã hết hạn.",
+ "bitbucketTitle": "Kết nối Bitbucket đã hết hạn.",
+ "providerMessage": "Kết nối {{provider}} của bạn không còn hợp lệ. Kiểm tra lại kết nối — bạn sẽ được nhắc kết nối lại nếu cần."
+ },
+ "eventChips": {
+ "comment": "Bình luận",
+ "label": "Hình thức đánh giá",
+ "requestChanges": "Yêu cầu thay đổi"
+ },
"overview": {
"commit": "commit",
"commit_other": "commit",
@@ -2666,39 +2745,25 @@
"summaryA11y": "Tóm tắt đánh giá",
"summaryPlaceholder": "Tóm tắt đánh giá (không bắt buộc)"
},
- "pullRequestUnavailable": "Không thể truy cập PR",
- "pullRequestUnavailableDescription": "Không thể mở PR này. Có thể PR đã bị xóa, kho lưu trữ ở chế độ riêng tư hoặc ứng dụng Kilo trên GitHub chưa được cài đặt cho kho lưu trữ này.",
- "reconnectNotice": {
- "message": "Kết nối GitHub của bạn không còn hợp lệ. Kiểm tra lại kết nối — bạn sẽ được nhắc kết nối lại nếu cần.",
- "title": "Kết nối GitHub đã hết hạn."
- },
- "review": "Rà soát",
- "reviewPullRequest": "Đánh giá PR",
- "screen": {
- "shareA11y": "Chia sẻ PR",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "cột so sánh trống",
- "emptyDiffRow": "Dòng so sánh trống",
- "newOnly": "Chỉ có ở bản mới: {{text}}",
- "noNewlineAtEndOfFile": "không có ký tự xuống dòng ở cuối tệp.",
- "oldNew": "Cũ: {{old}} | Mới: {{new}}",
- "oldOnly": "Chỉ có ở bản cũ: {{text}}"
+ "tabs": {
+ "discussion": "Thảo luận",
+ "files": "Tệp",
+ "overview": "Tổng quan"
},
- "submit": {
- "deletePendingMessage": "Bình luận này sẽ được xóa khỏi danh sách chờ gửi của bản đánh giá.",
- "deletePendingTitle": "Xóa bình luận chờ gửi?",
- "loadFailedTitle": "Không thể tải màn hình gửi đánh giá.",
- "pendingComment": "bình luận chưa gửi",
- "pendingComment_other": "bình luận chưa gửi",
- "pendingComment_one": "bình luận chờ gửi",
- "summaryOptional": "Tóm tắt (tùy chọn)",
- "partialPostedMessage": "Đã đăng {{displayFreshCount}} bình luận. Còn {{displayStaleCount}} bình luận gắn với bản ghi cũ hơn được giữ lại trong danh sách chờ gửi.",
- "submitCountOfTotal": "Gửi {{displayFreshCount}} trong {{displayTotalCount}} bình luận",
- "submitReview": "Gửi kết quả rà soát",
- "blockedRequestChanges": "Thêm tóm tắt hoặc ít nhất một bình luận để yêu cầu thay đổi.",
- "blockedComment": "Thêm tóm tắt hoặc ít nhất một bình luận để gửi bản đánh giá dưới dạng bình luận."
+ "terms": {
+ "pullRequest": "Yêu cầu hợp nhất",
+ "mergeRequest": "Merge request",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Chia sẻ merge request",
+ "viewOnProvider": "Xem trên {{provider}}",
+ "mergeRequestUnavailable": "Không thể truy cập merge request",
+ "unavailableDescription": "Có thể nó đã bị xóa, hoặc bạn không có quyền truy cập.",
+ "accessDeniedMergeRequest": "Bạn không có quyền xem merge request này.",
+ "couldNotLoadMergeRequest": "Không thể tải merge request.",
+ "discussionAccessDenied": "Bạn không có quyền xem thảo luận của merge request này.",
+ "discussionUnavailableMessage": "Merge request này có thể đã bị xóa.",
+ "noDiscussionDescription": "Merge request này chưa có chuỗi thảo luận đánh giá hay bình luận nào.",
+ "noFilesChangedDescription": "Merge request này không có tệp nào thay đổi."
},
"fileStatus": {
"changed": "Đã thay đổi",
@@ -2706,11 +2771,6 @@
"modified": "Đã sửa đổi",
"renamed": "Đã đổi tên"
},
- "tabs": {
- "discussion": "Thảo luận",
- "files": "Tệp",
- "overview": "Tổng quan"
- },
"diff": {
"selectedTapToChange": "Đã chọn {{label}}, chạm để đổi lựa chọn",
"tapToComment": "{{label}}, chạm để bình luận",
@@ -2721,7 +2781,7 @@
"emptyLine": "(trống)"
},
"linkPasteClipboardEmpty": "Bộ nhớ tạm trống.",
- "linkPasteNotAPullRequest": "Đây không phải là liên kết PR trên GitHub.",
+ "linkPasteNotAPullRequest": "Đây không phải là liên kết PR hoặc merge request",
"announce": {
"commentPosted": "Đã đăng bình luận",
"reviewSubmitted": "Đã gửi đánh giá",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "Không thể đăng bình luận này. Dòng đã chọn có thể đã thay đổi hoặc PR có thể đã được cập nhật.",
"reviewNotSubmitted": "Không thể gửi bản đánh giá này ở trạng thái hiện tại. Có thể PR đã thay đổi hoặc đây là PR của bạn nên bạn không thể tự đánh giá.",
+ "reviewNotSubmittedTerm": "Không thể gửi đánh giá này ở trạng thái hiện tại. {{term}} có thể đã thay đổi, hoặc bạn không thể đánh giá {{term}} của chính mình.",
"couldNotPostComment": "Không thể đăng bình luận.",
"couldNotSubmitReview": "Không thể gửi đánh giá. Kiểm tra kết nối và thử lại."
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "Không thể trả lời.",
"couldNotCompleteAction": "Không thể hoàn tất thao tác này.",
"mergeResultDefaultError": "GitHub chưa hoàn tất việc hợp nhất.",
+ "mergeResultNotCompleted": "{{term}} chưa được hợp nhất. Kiểm tra trạng thái và thử lại.",
"ambiguous": "Không thể xác nhận — hãy kiểm tra PR trước khi thử lại.",
"persistenceFailed": "Không thể ghi nhận thao tác này. Vui lòng thử lại sau.",
"forbidden": "Bạn không có quyền thực hiện thao tác này."
diff --git a/apps/mobile/src/i18n/locales/yo.json b/apps/mobile/src/i18n/locales/yo.json
index c7b5838518..a059fe6ff4 100644
--- a/apps/mobile/src/i18n/locales/yo.json
+++ b/apps/mobile/src/i18n/locales/yo.json
@@ -36,6 +36,7 @@
"cost": "Iye owó",
"discard": "Jù sílẹ̀",
"findings": "Àwọn àwárí",
+ "mergeRequest": "ìbéèrè ìṣọ̀kan",
"notConnected": "Kò sopọ̀",
"notifications": "Àwọn ìfitónilétí",
"pullRequest": "ìbéèrè àkópọ̀",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Ìlà ìyàtọ̀ tó ṣófo"
},
"connectionExpired": "Àkókò ìsopọ̀ GitHub ti parí.",
+ "capabilities": {
+ "banner": {
+ "title": "Kò sí lórí olùpèsè yìí",
+ "accessibility": "Kò sí lórí olùpèsè yìí: {{reason}}"
+ }
+ },
"merge": {
"merge": "Àkópọ̀",
"mergeNow": "Dà pọ̀ báyìí",
"mergePullRequest": "Ìdàpọ̀ ìbéèrè ìṣọ̀kan",
+ "mergeTermTitle": "Da {{term}} pọ̀",
"enableAutoMerge": "Tan ìdàpọ̀ aládàáṣiṣẹ́",
"disableAutoMerge": "Pa ìdàpọ̀ aládàáṣiṣẹ́",
"autoMergeOn": "Ìdàpọ̀ aládàáṣiṣẹ́ ti wà ní títàn",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Pa ẹ̀ka rẹ́ lẹ́yìn ìdàpọ̀",
"noEnabledMethods": "Kò sí ọ̀nà ìdàpọ̀ tí a ti mú ṣiṣẹ́ nínú ibi ìpamọ́ yìí. Béèrè lọ́wọ́ alábòójútó ibi ìpamọ́ láti mú ìdàpọ̀, ìṣàkópọ̀ sí ọ̀kan, tàbí ìyípadà ìpìlẹ̀ ṣiṣẹ́.",
"confirmTitle": "Da ìbéèrè ìṣọ̀kan pọ̀?",
+ "confirmTitleTerm": "Da {{term}} pọ̀?",
"confirmMessage": "Èyí yóò da àwọn ìyípadà rẹ pọ̀ mọ́ ẹ̀ka ìpìlẹ̀.",
"enableAutoMergeConfirmTitle": "Tan ìdàpọ̀ aládàáṣiṣẹ́?",
"enableAutoMergeConfirmMessage": "GitHub yóò da ìbéèrè ìṣọ̀kan yìí pọ̀ fúnra rẹ̀ nígbà tí gbogbo àyẹ̀wò tí a nílò bá yọrí sí rere.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} yóò darapọ̀ fúnra rẹ̀ nígbà tí pipeline rẹ̀ bá ṣé.",
+ "enableAutoMergeDescriptionTerm": "GitLab yóò darapọ̀ {{term}} yìí fúnra rẹ̀ nígbà tí pipeline rẹ̀ bá ṣé.",
"forbidden": "O kò ní àṣẹ láti da ìbéèrè ìṣọ̀kan yìí pọ̀.",
"cannotMerge": "A kò lè da ìbéèrè ìṣọ̀kan yìí pọ̀ bí ó ṣe wà.",
"couldNotMerge": "A kò lè da ìbéèrè ìṣọ̀kan pọ̀.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "A ti dà á pọ̀ tẹ́lẹ̀",
- "closed": "A ti ti ìbéèrè ìṣọ̀kan yìí pa"
+ "closed": "A ti ti ìbéèrè ìṣọ̀kan yìí pa",
+ "closedMergeRequest": "A ti ti ìbéèrè ìṣọ̀kan yìí pa"
},
"partialSuccessBanner": {
"body": "A kò lè pa ẹ̀ka náà rẹ́: {{reason}}",
@@ -401,6 +413,18 @@
"notMergeableTitle": "A kò lè da ìbéèrè ìṣọ̀kan yìí pọ̀ síbẹ̀",
"notMergeableDetail": "GitHub sọ pé ipò ìdàpọ̀ náà jẹ́ {{state}}."
},
+ "restrictions": {
+ "title": "Àwọn ìdènà ìdàpọ̀",
+ "approvalsRequired_one": "Ìfọwọ́sí {{displayCount}} ni a nílò",
+ "approvalsRequired_other": "Ìfọwọ́sí {{displayCount}} ni a nílò",
+ "pipelineMustSucceed": "Pipeline gbọ́dọ̀ ṣé kí ìdàpọ̀ tó wáyé."
+ },
+ "providerBlocked": {
+ "failingPipeline": "Pipeline ń kùnà lórí ìfipamọ́ àyípadà tuntun jù.",
+ "pendingPipeline": "Pipeline ṣì ń ṣiṣẹ́ lórí ìfipamọ́ àyípadà tuntun jù.",
+ "permission": "O kò ní àṣẹ láti da {{term}} yìí pọ̀.",
+ "draft": "Sàmì sí {{term}} náà pé ó ti ṣe tán fún àtúnyẹ̀wò kí o tó dà á pọ̀."
+ },
"methodLabels": {
"merge": "Ṣẹ̀dá àkọsílẹ̀ ìdàpọ̀",
"squash": "Ṣàkópọ̀ sí ọ̀kan, kí o sì dà á pọ̀",
@@ -448,6 +472,7 @@
"acceptTerms": "Gba",
"replyBadRequest": "A kò lè fi ìdáhùn yìí ránṣẹ́. Ọ̀wọ́ ìjíròrò náà lè ti yí padà.",
"replyForbidden": "O kò ní àṣẹ láti dáhùn sí ìbéèrè ìṣọ̀kan yìí.",
+ "replyForbiddenTerm": "O kò ní àṣẹ láti dáhùn sí {{term}} yìí.",
"moderation": {
"reportContent": {
"terminal": "A kò lè fi ẹ̀sùn àsọyé yìí hàn.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Ṣe àtúnyẹ̀wò ìbéèrè ìṣọ̀kan",
"headLine": "{{counts}} · àkọsílẹ̀ ìyípadà tuntun {{sha}}",
"entry": {
- "eyebrow": "Ṣí ìbéèrè ìṣọ̀kan nípasẹ̀ URL.",
- "pastePrLink": "Lẹ ọ̀nà àsopọ̀ PR mọ́",
- "noRecentPrs": "Kò sí PR àìpẹ́",
- "noRecentPrsDescription": "Lẹ ọ̀nà àsopọ̀ PR mọ́ lókè láti bẹ̀rẹ̀ àtúnyẹ̀wò — yóò hàn níbí nígbà tó kàn.",
+ "eyebrow": "Ṣí ìbéèrè àkópọ̀ tàbí ìbéèrè ìṣọ̀kan nípa URL",
+ "pastePrLink": "Lẹ̀ mọ́ ọ̀nà àsopọ̀ ìbéèrè àkópọ̀ tàbí ìbéèrè ìṣọ̀kan",
+ "noRecentPrs": "Kò sí àtúnyẹ̀wò àìpẹ́",
+ "noRecentPrsDescription": "Lẹ̀ mọ́ ọ̀nà àsopọ̀ lókè láti bẹ̀rẹ̀ àtúnyẹ̀wò — yóò fara hàn níbí nígbà mìíràn.",
"couldNotLoad": "A kò lè ṣàkójọ rẹ̀.",
"removeFromRecentsTitle": "Yọ kúrò nínú àkójọ àìpẹ́?",
- "removeFromRecentsMessage": "A ó yọ ìbéèrè ìṣọ̀kan yìí kúrò nínú àkójọ àìpẹ́ rẹ.",
+ "removeFromRecentsMessage": "A ó yọ àtúnyẹ̀wò yìí kúrò nínú àwọn àìpẹ́ rẹ.",
"removeRecentAccessibility": "Yọ {{repo}} kúrò nínú àkójọ àìpẹ́",
- "urlAccessibility": "URL ìbéèrè ìṣọ̀kan GitHub",
- "clearLink": "Nu ọ̀nà àsopọ̀ ìbéèrè ìṣọ̀kan kúrò",
- "pasteLink": "Lẹ ọ̀nà àsopọ̀ ìbéèrè ìṣọ̀kan mọ́",
+ "urlAccessibility": "Ṣàfihàn URL ìbéèrè àkópọ̀ tàbí ìbérè ìṣọ̀kan",
+ "urlPlaceholder": "URL ìbéèrè àkópọ̀ tàbí ìbéèrè ìṣọ̀kan",
+ "openAccessibility": "Ṣí ìbéèrè àkópọ̀ tàbí ìbéèrè ìṣọ̀kan",
+ "clearLink": "Pa ọ̀nà àsopọ̀ rẹ́",
+ "pasteLink": "Lẹ̀ mọ́ ọ̀nà àsopọ̀ ìbéèrè àkópọ̀ tàbí ìbéèrè ìṣọ̀kan",
"open": "Ṣí"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "A kò lè ṣàyẹ̀wò àsopọ̀ GitHub.",
"checkFailedMessage": "A kò lè fi ipò ìwọlé hàn títí èyí yóò fi ṣàkójọ tán.",
+ "checkFailedTitleGitLab": "A kò lè ṣàyẹ̀wò àsopọ̀ GitLab.",
+ "checkFailedTitleBitbucket": "A kò lè ṣàyẹ̀wò àsopọ̀ Bitbucket.",
+ "providerCheckFailedMessage": "Ipò ìsopọ̀ kò wà títí èyí yóò fi gbé wọlé.",
"reconnectTitle": "Àtúnsopọ̀ GitHub",
"reconnectDescription": "A ti fagilé àsopọ̀ GitHub rẹ. Tún sopọ̀ láti máa ṣe àtúnyẹ̀wò àwọn ìbéèrè ìṣọ̀kan lórí fóònù.",
- "description": "So àkọọ́lẹ̀ GitHub rẹ pọ̀ láti ṣe àtúnyẹ̀wò àwọn ìbéèrè ìṣọ̀kan lórí fóònù."
+ "description": "So àkọọ́lẹ̀ GitHub rẹ pọ̀ láti ṣe àtúnyẹ̀wò àwọn ìbéèrè ìṣọ̀kan lórí fóònù.",
+ "gitlabDescription": "So àkọọ́lẹ̀ GitLab rẹ pọ̀ láti ṣàtúnyẹ̀wò àwọn ìbéèrè ìṣọ̀kan lórí fónù.",
+ "bitbucketDescription": "So Bitbucket pọ̀ mọ́ àjọ yìí láti ṣàtúnyẹ̀wò àwọn ìbéèrè àkópọ̀ lórí fónù.",
+ "bitbucketOrgOnlyDescription": "Yan àjọ kan nínú àlàyé ara ẹni rẹ láti ṣàtúnyẹ̀wò àwọn ìbéèrè àkópọ̀ Bitbucket rẹ̀."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Àkókò ìsopọ̀ GitHub ti parí.",
- "message": "Àsopọ̀ GitHub rẹ kò wúlò mọ́. Tún ṣàyẹ̀wò àsopọ̀ rẹ — a ó ní kí o tún sopọ̀ bí ó bá yẹ."
+ "message": "Àsopọ̀ GitHub rẹ kò wúlò mọ́. Tún ṣàyẹ̀wò àsopọ̀ rẹ — a ó ní kí o tún sopọ̀ bí ó bá yẹ.",
+ "gitlabTitle": "Àkókò ìsopọ̀ GitLab ti parí.",
+ "bitbucketTitle": "Àkókò ìsopọ̀ Bitbucket ti parí.",
+ "providerMessage": "Àsopọ̀ {{provider}} rẹ kò wúlò mọ́. Tún ṣàyẹ̀wò àsopọ̀ rẹ — a ó ní kí o tún sopọ̀ bí ó bá yẹ."
},
"eventChips": {
"comment": "Àsọyé",
@@ -643,6 +679,21 @@
"files": "Fáìlì",
"discussion": "Ìjíròrò"
},
+ "terms": {
+ "pullRequest": "Ìbéèrè àkópọ̀",
+ "mergeRequest": "Ìbéèrè ìṣọ̀kan",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Pín ìbéèrè ìṣọ̀kan",
+ "viewOnProvider": "Wò ó lórí {{provider}}",
+ "mergeRequestUnavailable": "Ìbéèrè ìṣọ̀kan kò sí",
+ "unavailableDescription": "Ó lè jẹ́ pé a ti pa á rẹ́, tàbí kí o má ní àṣẹ rẹ̀.",
+ "accessDeniedMergeRequest": "O kò ní àṣẹ láti wo ìbéèrè ìṣọ̀kan yìí.",
+ "couldNotLoadMergeRequest": "A kò lè ṣàkójọ ìbéèrè ìṣọ̀kan.",
+ "discussionAccessDenied": "O kò ní àṣẹ láti wo ìjíròrò ìbéèrè ìṣọ̀kan yìí.",
+ "discussionUnavailableMessage": "Ó lè jẹ́ pé a ti yọ ìbéèrè ìṣọ̀kan yìí kúrò.",
+ "noDiscussionDescription": "Kò sí ọ̀wọ́ àtúnyẹ̀wò tàbí àsọyé ìjíròrò lórí ìbéèrè ìṣọ̀kan yìí.",
+ "noFilesChangedDescription": "Kò sí ìyípadà sí fáìlì kankan nínú ìbéèrè ìṣọ̀kan yìí."
+ },
"fileStatus": {
"modified": "A ti yí padà",
"renamed": "A ti sọ lórúkọ tuntun",
@@ -659,7 +710,7 @@
"emptyLine": "(ṣofo)"
},
"linkPasteClipboardEmpty": "Àtẹ àdàkọ ṣófo.",
- "linkPasteNotAPullRequest": "Èyí kì í ṣe ọ̀nà àsopọ̀ ìbéèrè ìṣọ̀kan GitHub.",
+ "linkPasteNotAPullRequest": "Kì í ṣe ọ̀nà àsopọ̀ ìbéèrè àkópọ̀ tàbí ìbéèrè ìṣọ̀kan",
"announce": {
"commentPosted": "A ti fi àsọyé ránṣẹ́",
"reviewSubmitted": "A ti fi àtúnyẹ̀wò ránṣẹ́",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "A kò lè fi àsọyé yìí ránṣẹ́. Ìlà tí a yàn lè ti yí padà, tàbí a lè ti ṣe ìmúdójúìwọ̀n PR náà.",
"reviewNotSubmitted": "A kò lè fi àtúnyẹ̀wò yìí ránṣẹ́ bí ó ṣe wà. PR náà lè ti yí padà, tàbí o kò lè ṣe àtúnyẹ̀wò ìbéèrè ìṣọ̀kan tìrẹ.",
+ "reviewNotSubmittedTerm": "Kò ṣeé fi àtúnyẹ̀wò yìí ránṣẹ́ gẹ́gẹ́ bí ó ṣe wà. Ó lè jẹ́ pé {{term}} ti yí padà, tàbí kò lè ṣàtúnyẹ̀wò {{term}} tirẹ.",
"couldNotPostComment": "A kò lè fi àsọyé ránṣẹ́.",
"couldNotSubmitReview": "A kò lè fi àtúnyẹ̀wò ránṣẹ́. Ṣàyẹ̀wò àsopọ̀ rẹ kí o tún gbìyànjú."
},
@@ -675,6 +727,7 @@
"couldNotReply": "A kò lè fi èsì ránṣẹ́.",
"couldNotCompleteAction": "A kò lè parí ìgbésẹ̀ yìí.",
"mergeResultDefaultError": "GitHub kò parí ìdàpọ̀ náà.",
+ "mergeResultNotCompleted": "A kò darapọ̀ {{term}}. Ṣàyẹ̀wò ipò rẹ̀, tún sì gbìyànjú.",
"ambiguous": "A kò lè jẹ́rìí sí i — ṣàyẹ̀wò PR náà kí o tó tún gbìyànjú.",
"persistenceFailed": "A kò lè ṣe àkọsílẹ̀ ìgbésẹ̀ yìí. Jọ̀wọ́ tún gbìyànjú nígbà mìíràn.",
"forbidden": "A kò gbà á láàyè."
@@ -1988,11 +2041,31 @@
"retryConnection": "Gbìyànjú láti tún sopọ̀"
},
"newSession": {
+ "recentlyUsed": "Tí a lò láìpẹ́",
+ "couldNotLoadGithubRepositories": "A kò lè gbé àwọn ibi ìpamọ́ kóòdù GitHub wọlé.",
+ "couldNotLoadGitlabRepositories": "A kò lè gbé àwọn ibi ìpamọ́ kóòdù GitLab wọlé.",
+ "couldNotLoadBitbucketRepositories": "A kò lè gbé àwọn ibi ìpamọ́ kóòdù Bitbucket wọlé.",
"connectGithubDescription": "So GitHub pọ̀ nínú aṣàwákiri rẹ, lẹ́yìn náà padà síbí láti yan ibi ìpamọ́ kóòdù.",
+ "connectGitlabDescription": "So GitLab pọ̀ nínú aṣàwákiri rẹ, lẹ́yìn náà padà síbí láti yan ibi ìpamọ́ kóòdù.",
+ "connectBitbucketDescription": "So Bitbucket pọ̀ nínú aṣàwákiri rẹ, lẹ́yìn náà padà síbí láti yan ibi ìpamọ́ kóòdù.",
"openGithub": "Ṣí GitHub",
+ "openGitlab": "Ṣí GitLab",
+ "openBitbucket": "Ṣí Bitbucket",
"refreshRepositories": "Tún àwọn ibi ìpamọ́ kóòdù gbé wọlé",
"githubConnected": "GitHub ti sopọ̀",
+ "gitlabConnected": "GitLab ti sopọ̀",
"noRepositoriesVisible": "Kò sí ibi ìpamọ́ kóòdù tó hàn. Ṣàyẹ̀wò àṣẹ ìwọlé sí ibi ìpamọ́ kóòdù fún ohun èlò Kilo lórí GitHub, lẹ́yìn náà tún àkójọ náà gbé wọlé.",
+ "noRepositoriesVisibleGitlab": "Kò sí ibi ìpamọ́ kóòdù tó hàn. Ṣàyẹ̀wò àṣẹ ìwọlé sí ibi ìpamọ́ kóòdù fún GitLab, lẹ́yìn náà tún àkójọ náà gbé wọlé.",
+ "noRepositoriesVisibleBitbucket": "Kò sí ibi ìpamọ́ kóòdù tó hàn. Ṣàyẹ̀wò àṣẹ ìwọlé sí ibi ìpamọ́ kóòdù fún Bitbucket, lẹ́yìn náà tún àkójọ náà gbé wọlé.",
+ "bitbucketOrganizationsOnly": "Bitbucket wà fún àwọn àjọ ṣoṣo.",
+ "branchPickerTitle": "Yan ẹ̀ka",
+ "branchDefault": "Ìpìlẹ̀",
+ "branchAccessibility": "Ẹ̀ka: {{label}}",
+ "branchLoading": "Ń gbé àwọn ẹ̀ka wọlé",
+ "branchLoadError": "A kò lè gbé àwọn ẹ̀ka wọlé",
+ "branchUnavailable": "Àwọn ẹ̀ka kò sí fún ibi ìpamọ́ kóòdù yìí. Ṣàyẹ̀wò àṣẹ rẹ pẹ̀lú olùpèsè, lẹ́yìn náà yan ibi ìpamọ́ kóòdù mìíràn.",
+ "branchEmpty": "Kò sí ẹ̀ka kankan",
+ "branchPlaceholder": "Yan ẹ̀ka kan",
"runOnWithTarget": "Ṣiṣẹ́ lórí: {{target}}",
"environment": "Àyíká iṣẹ́",
"couldNotLoadEnvironment": "A kò lè gbé àyíká iṣẹ́ rẹ wọlé.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "A kò lè tún àwọn ibi ìpamọ́ kóòdù gbé wọlé. Jọ̀wọ́ gbìyànjú lẹ́ẹ̀kan sí i.",
"discardDraftTitle": "Pa àkọ́kọ́ ìkọ̀wé rẹ́?",
"discardDraftMessage": "Ọ̀rọ̀ ìtọ́ni rẹ yóò sọnù.",
+ "discardWithUploadsMessage": "A ó pa ọ̀rọ̀ ìtọ́ni rẹ àti àwọn fáìlì tí o ti gbé sókè tí kò tíì ní ìfiránṣẹ́ tí a so wọ́n mọ́ rẹ́.",
"discardFailed": "A kò lè pa àkọ́kọ́ ìkọ̀wé náà rẹ́. Jọ̀wọ́ gbìyànjú lẹ́ẹ̀kan sí i.",
"remoteHint": "Ṣiṣẹ́ `kilo remote` lórí kọ̀ǹpútà rẹ, tàbí `/remote` nínú ìgbà iṣẹ́ CLI tó ń lọ, láti ṣàkóso ìṣiṣẹ́ kilo lórí kọ̀ǹpútà rẹ.",
- "connectBitbucketDescription": "So Bitbucket pọ̀ nínú aṣàwákiri rẹ, lẹ́yìn náà padà síbí láti yan ibi ìpamọ́ kóòdù.",
- "connectGitlabDescription": "So GitLab pọ̀ nínú aṣàwákiri rẹ, lẹ́yìn náà padà síbí láti yan ibi ìpamọ́ kóòdù.",
- "couldNotLoadBitbucketRepositories": "A kò lè gbé àwọn ibi ìpamọ́ kóòdù Bitbucket wọlé.",
- "couldNotLoadGithubRepositories": "A kò lè gbé àwọn ibi ìpamọ́ kóòdù GitHub wọlé.",
- "couldNotLoadGitlabRepositories": "A kò lè gbé àwọn ibi ìpamọ́ kóòdù GitLab wọlé.",
- "gitlabConnected": "GitLab ti sopọ̀",
- "noRepositoriesVisibleBitbucket": "Kò sí ibi ìpamọ́ kóòdù tó hàn. Ṣàyẹ̀wò àṣẹ ìwọlé sí ibi ìpamọ́ kóòdù fún Bitbucket, lẹ́yìn náà tún àkójọ náà gbé wọlé.",
- "noRepositoriesVisibleGitlab": "Kò sí ibi ìpamọ́ kóòdù tó hàn. Ṣàyẹ̀wò àṣẹ ìwọlé sí ibi ìpamọ́ kóòdù fún GitLab, lẹ́yìn náà tún àkójọ náà gbé wọlé.",
- "openBitbucket": "Ṣí Bitbucket",
- "openGitlab": "Ṣí GitLab",
- "recentlyUsed": "Tí a lò láìpẹ́",
"continueFrom": "A ń tẹ̀síwájú pẹ̀lú {{title}}.",
"importingSession": "Ń gbé ìgbà iṣẹ́ wọlé",
"cliCannotContinue": "CLI yìí kò lè tẹ̀síwájú pẹ̀lú ìgbà iṣẹ́ kan. Yan Cloud Agent tàbí CLI mìíràn.",
- "importFailed": "A kò lè gbé ìgbà iṣẹ́ yìí wọlé.",
- "discardWithUploadsMessage": "A ó pa ọ̀rọ̀ ìtọ́ni rẹ àti àwọn fáìlì tí o ti gbé sókè tí kò tíì ní ìfiránṣẹ́ tí a so wọ́n mọ́ rẹ́."
+ "importFailed": "A kò lè gbé ìgbà iṣẹ́ yìí wọlé."
},
"partRenderer": {
"updatedFileCount_one": "A ti ṣe ìmúdójúìwọ̀n fáìlì {{displayCount}}.",
diff --git a/apps/mobile/src/i18n/locales/zh-Hans.json b/apps/mobile/src/i18n/locales/zh-Hans.json
index 1249eff697..6494f76c3c 100644
--- a/apps/mobile/src/i18n/locales/zh-Hans.json
+++ b/apps/mobile/src/i18n/locales/zh-Hans.json
@@ -4,6 +4,8 @@
"done": "完成",
"retry": "重试",
"tryAgain": "再试一次",
+ "continue": "继续",
+ "notNow": "暂时不用",
"language": "语言",
"device": "设备",
"share": "分享 {{title}}",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "无法复制到剪贴板。",
"required": "必填",
"error": "错误:{{error}}",
- "notNow": "暂时不用",
- "continue": "继续",
"back": "返回",
"somethingWentWrong": "出了点问题。",
"couldNotOpen": "无法打开 {{label}}。",
@@ -36,6 +36,7 @@
"cost": "费用",
"discard": "放弃",
"findings": "问题",
+ "mergeRequest": "合并请求",
"notConnected": "未连接",
"notifications": "通知",
"pullRequest": "拉取请求",
@@ -1557,11 +1558,31 @@
"retryConnection": "重新连接"
},
"newSession": {
+ "recentlyUsed": "最近使用",
+ "couldNotLoadGithubRepositories": "无法加载 GitHub 仓库。",
+ "couldNotLoadGitlabRepositories": "无法加载 GitLab 仓库。",
+ "couldNotLoadBitbucketRepositories": "无法加载 Bitbucket 仓库。",
"connectGithubDescription": "在浏览器中连接 GitHub,然后返回此处选择仓库。",
+ "connectGitlabDescription": "在浏览器中连接 GitLab,然后返回此处选择仓库。",
+ "connectBitbucketDescription": "在浏览器中连接 Bitbucket,然后返回此处选择仓库。",
"openGithub": "打开 GitHub",
+ "openGitlab": "打开 GitLab",
+ "openBitbucket": "打开 Bitbucket",
"refreshRepositories": "刷新仓库",
"githubConnected": "GitHub 已连接",
+ "gitlabConnected": "GitLab 已连接",
"noRepositoriesVisible": "未显示任何仓库。请检查 Kilo GitHub 应用的仓库访问权限,然后刷新。",
+ "noRepositoriesVisibleGitlab": "未显示任何仓库。请检查 GitLab 的仓库访问权限,然后刷新。",
+ "noRepositoriesVisibleBitbucket": "未显示任何仓库。请检查 Bitbucket 的仓库访问权限,然后刷新。",
+ "bitbucketOrganizationsOnly": "Bitbucket 仅对组织可用。",
+ "branchPickerTitle": "选择分支",
+ "branchDefault": "默认",
+ "branchAccessibility": "分支: {{label}}",
+ "branchLoading": "正在加载分支",
+ "branchLoadError": "无法加载分支",
+ "branchUnavailable": "此仓库没有可用的分支。检查你在提供商处的访问权限,然后选择另一个仓库。",
+ "branchEmpty": "没有可用的分支",
+ "branchPlaceholder": "选择一个分支",
"runOnWithTarget": "运行位置:{{target}}",
"environment": "环境",
"couldNotLoadEnvironment": "无法加载你的环境。",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "无法读取待处理的会话。请重试。",
"failedToCreate": "创建会话失败。",
"couldNotRefreshRepositories": "无法刷新仓库。请重试。",
- "discardDraftMessage": "你输入的提示词将丢失。",
"discardDraftTitle": "丢弃草稿?",
+ "discardDraftMessage": "你输入的提示词将丢失。",
+ "discardWithUploadsMessage": "你输入的提示词和已上传但尚未用于发送消息的文件将被删除。",
"discardFailed": "无法丢弃草稿。请重试。",
"remoteHint": "在电脑上运行 `kilo remote`,或在正在运行的 CLI 会话中执行 `/remote`,即可控制本地 kilo 进程。",
- "connectBitbucketDescription": "在浏览器中连接 Bitbucket,然后返回此处选择仓库。",
- "connectGitlabDescription": "在浏览器中连接 GitLab,然后返回此处选择仓库。",
- "couldNotLoadBitbucketRepositories": "无法加载 Bitbucket 仓库。",
- "couldNotLoadGithubRepositories": "无法加载 GitHub 仓库。",
- "couldNotLoadGitlabRepositories": "无法加载 GitLab 仓库。",
- "gitlabConnected": "GitLab 已连接",
- "noRepositoriesVisibleBitbucket": "未显示任何仓库。请检查 Bitbucket 的仓库访问权限,然后刷新。",
- "noRepositoriesVisibleGitlab": "未显示任何仓库。请检查 GitLab 的仓库访问权限,然后刷新。",
- "openBitbucket": "打开 Bitbucket",
- "openGitlab": "打开 GitLab",
- "recentlyUsed": "最近使用",
"continueFrom": "正在继续会话“{{title}}”。",
"importingSession": "正在导入会话",
"cliCannotContinue": "此 CLI 无法继续会话。请选择 Cloud Agent 或其他 CLI。",
- "importFailed": "无法导入此会话。",
- "discardWithUploadsMessage": "你输入的提示词和已上传但尚未用于发送消息的文件将被删除。"
+ "importFailed": "无法导入此会话。"
},
"partRenderer": {
"updatedFileCount_one": "已更新 {{displayCount}} 个文件。",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "允许安装归因?"
},
"prReview": {
+ "pullRequestUnavailable": "无法打开拉取请求",
+ "pullRequestUnavailableDescription": "无法打开此 PR。可能是 PR 已被删除、仓库为私有仓库,或仓库尚未安装 Kilo GitHub 应用。",
"accessDeniedDescription": "你无权查看此拉取请求。",
- "checkConnection": "检查连接",
- "checks": {
- "checksCount": "{{displayCount}} 项检查",
- "couldNotLoad": "无法加载检查结果。",
- "failed": "{{displayCount}} 项失败",
- "noAccess": "你无权查看此仓库的检查结果。",
- "noChecksReported": "暂无检查结果",
- "notAvailable": "暂时无法查看检查结果。可能是最新提交尚未处理,或源仓库尚未安装 Kilo GitHub 应用。",
- "openDetails": "查看 {{name}} 的详情",
- "passed": "{{displayCount}} 项通过",
- "pending": "{{displayCount}} 项待处理",
- "retryChecks": "重新加载检查结果",
- "skipped": "{{displayCount}} 项已跳过",
- "title": "检查",
- "viewOnGitHub": "在 GitHub 上查看 PR",
- "checkDetails": "检查详情"
- },
- "composer": {
- "addTitle": "添加评论",
- "addToReview": "添加到审查",
- "comment": "评论",
- "commentBody": "评论内容",
- "commentBodyPlaceholder": "评论内容",
- "commentNow": "立即评论",
- "discardMessage": "放弃后,草稿将丢失。",
- "discardTitle": "放弃评论?",
- "editTitle": "编辑评论",
- "insertSuggestion": "插入建议",
- "insertSuggestionA11y": "插入代码建议",
- "loadFailedTitle": "无法加载评论编辑器。",
- "ok": "确定",
- "unavailableMessage": "这条待提交的评论已被删除或提交。",
- "unavailableTitle": "评论已不可用",
- "bodyEmpty": "评论内容不能为空。",
- "suggestionsOnlyAddedLines": "建议仅适用于新增的行。",
- "tapDiffLineToSuggest": "点按差异中的一行,即可添加代码建议。"
- },
- "connect": {
- "checkFailedMessage": "加载完成前,无法确认登录状态。",
- "checkFailedTitle": "无法检查 GitHub 连接。",
- "description": "连接 GitHub 账号,即可在手机上审查拉取请求。",
- "reconnectDescription": "GitHub 连接授权已被撤销。请重新连接,继续在手机上审查拉取请求。",
- "reconnectTitle": "重新连接 GitHub"
- },
- "connectionExpired": "GitHub 连接已过期。",
- "couldNotLoadPullRequest": "无法加载拉取请求。",
- "couldNotOpenGitHubAppSettings": "无法打开 GitHub 应用设置。",
- "description": "描述",
- "discussion": {
- "acceptTerms": "同意",
- "accessDeniedMessage": "你无权查看此 PR 的讨论。",
- "addReaction": "添加表情回应",
- "block": "阻止",
- "blockedUser": "已屏蔽 {{login}}",
- "collapseThread": "折叠讨论串",
- "commentActions": "评论操作",
- "comment": "{{displayCount}} 条评论",
- "comment_other": "{{displayCount}} 条评论",
- "couldNotLoad": "无法加载讨论。",
- "couldNotLoadMore": "无法加载更多评论。",
- "loadMoreComments": "加载更多评论",
- "loading": "正在加载讨论",
- "moderation": {
- "block": {
- "retryable": "屏蔽此用户失败。请检查网络连接后重试。",
- "terminal": "无法屏蔽此用户。"
- },
- "mute": {
- "retryable": "将此用户静音失败。请检查网络连接后重试。",
- "terminal": "无法静音此用户。"
- },
- "reportContent": {
- "retryable": "举报此评论失败。请检查网络连接后重试。",
- "terminal": "无法举报此评论。"
- },
- "reportUser": {
- "retryable": "举报此用户失败。请检查网络连接后重试。",
- "terminal": "无法举报此用户。"
- }
- },
- "moreLinesAbove": "上方还有 {{displayCount}} 行。",
- "mute": "静音",
- "mutedUser": "已静音 {{login}}",
- "noDiscussion": "暂无讨论",
- "noDiscussionDescription": "此拉取请求暂无审查讨论串或评论。",
- "comment_one": "1 条评论",
- "outdated": "已过时",
- "quotedDiffSnippet": "引用的差异片段",
- "reactionPill": "{{emoji}} 表情回应,{{displayCount}} {{countLabel}}",
- "reaction": "表情回应",
- "reaction_other": "表情回应",
- "reaction_one": "个表情回应",
- "replyBadRequest": "无法发布此回复。讨论串可能已发生变化。",
- "replyBody": "回复正文",
- "replyForbidden": "你无权回复此拉取请求。",
- "replyPlaceholder": "回复…",
- "reportContent": "举报内容",
- "reportUser": "举报用户",
- "resolveThread": "将讨论串标记为已解决",
- "resolved": "已解决",
- "retryLoadingMore": "重新加载更多评论",
- "reviewFiles": "审查文件",
- "startedRelative": " · {{relative}}发起",
- "submitReply": "提交回复",
- "termsAcceptRetry": "未能确认同意服务条款。请检查网络连接后重试。",
- "termsCopy": "年满 13 岁才能发布内容。",
- "termsTitle": "服务条款",
- "threadAccessibilityLabel": "讨论串 {{anchorLabel}}",
- "unavailable": "无法查看讨论。",
- "unavailableMessage": "此拉取请求可能已被删除。",
- "unresolveThread": "将讨论串标记为未解决",
- "viewTerms": "查看服务条款",
- "termsAcceptRequired": "同意服务条款后才能发布内容。",
- "termsCheckRetryCopy": "无法检查服务条款。请检查网络连接后重试。",
- "termsOutdatedCopy": "服务条款已更新。请重新打开此页面,同意最新版本。",
- "reactions": {
- "thumbsUp": "赞",
- "thumbsDown": "踩",
- "laugh": "大笑",
- "hooray": "欢呼",
- "confused": "困惑",
- "heart": "爱心",
- "rocket": "火箭",
- "eyes": "眼睛"
- },
- "anchor": {
- "fileCommentOnPath": "文件 {{path}} 的评论",
- "fileComment": "文件评论",
- "outdatedOnPathLines": "{{path}} {{lines}}(已过时)",
- "outdatedOnLines": "{{lines}}(已过时)",
- "outdatedOnPath": "{{path}}(已过时)"
- },
- "deletedUser": "已删除的用户"
- },
- "entry": {
- "clearLink": "清除拉取请求链接",
- "couldNotLoad": "无法加载。",
- "eyebrow": "通过 URL 打开拉取请求。",
- "noRecentPrs": "暂无最近查看的 PR",
- "noRecentPrsDescription": "在上方粘贴 PR 链接即可开始审查,下次就能在这里找到它。",
- "open": "开启",
- "pasteLink": "粘贴拉取请求链接",
- "pastePrLink": "粘贴 PR 链接",
- "removeFromRecentsMessage": "此拉取请求将从你的最近记录中移除。",
- "removeFromRecentsTitle": "从最近记录中移除?",
- "removeRecentAccessibility": "从最近记录中移除 {{repo}}",
- "urlAccessibility": "GitHub 拉取请求 URL"
- },
- "eventChips": {
- "comment": "评论",
- "label": "审查类型",
- "requestChanges": "要求更改"
- },
+ "noFilesChanged": "没有文件变更",
+ "noFilesChangedDescription": "此拉取请求不包含文件变更。",
"fileList": {
"filesList": "文件列表",
"filesViewed": "文件 · 已查看 {{viewed}}/{{total}}",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "对所选行发表评论",
"finishReview": "完成审查"
},
- "headLine": "{{counts}} · 最新提交 {{sha}}",
"hunkRows": {
"contextUnavailable": "无法获取此引用对应的上下文。",
"expandAll": "全部展开",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "重新加载上下文",
"retryLoadingNextPage": "重新加载下一页"
},
- "inbox": {
- "couldNotLoad": "无法加载收件箱。",
- "loading": "正在加载收件箱",
- "noReviewRequests": "暂无审查请求",
- "noReviewRequestsDescription": "等待你审查的拉取请求会显示在这里。你也可以在上方粘贴任意 PR 链接。",
- "title": "收件箱"
+ "sideBySide": {
+ "emptyDiffColumn": "空差异列",
+ "emptyDiffRow": "空差异行",
+ "newOnly": "仅新内容:{{text}}",
+ "noNewlineAtEndOfFile": "⚠️ 文件末尾没有换行符",
+ "oldNew": "旧内容:{{old}};新内容:{{new}}",
+ "oldOnly": "仅旧内容:{{text}}"
+ },
+ "connectionExpired": "GitHub 连接已过期。",
+ "capabilities": {
+ "banner": {
+ "title": "此提供商不支持",
+ "accessibility": "此提供商不支持: {{reason}}"
+ }
},
- "installKiloGitHubApp": "安装 Kilo GitHub 应用",
"merge": {
- "autoMergeDescription": "所有必需检查通过后,GitHub 会自动合并此拉取请求(合并方式:{{method}})。",
+ "merge": "合并",
+ "mergeNow": "立即合并",
+ "mergePullRequest": "合并拉取请求",
+ "mergeTermTitle": "合并{{term}}",
+ "enableAutoMerge": "开启自动合并",
+ "disableAutoMerge": "关闭自动合并",
"autoMergeOn": "自动合并已开启",
- "blockedTitle": "暂时无法合并的原因",
- "cannotMerge": "此拉取请求目前无法合并。",
+ "autoMergeDescription": "所有必需检查通过后,GitHub 会自动合并此拉取请求(合并方式:{{method}})。",
"checking": "正在检查是否可以合并…",
+ "couldNotDetermine": "无法确定是否可以合并。",
+ "refreshMergeability": "重新检查是否可以合并",
+ "blockedTitle": "暂时无法合并的原因",
+ "updateBranch": "更新分支",
+ "updateBranchFromBase": "用基础分支的最新内容更新当前分支",
+ "methodLabel": "合并方式",
+ "commitTitle": "提交标题",
"commitMessage": "提交说明",
"commitMessagePlaceholder": "合并提交说明(可选)",
- "commitTitle": "提交标题",
- "confirmMessage": "这会将你的更改合并到基础分支。",
- "confirmTitle": "合并拉取请求?",
- "couldNotDetermine": "无法确定是否可以合并。",
- "couldNotMerge": "无法合并拉取请求。",
"deleteBranch": "删除分支",
"deleteBranchAfterMerge": "合并后删除分支",
- "disableAutoMerge": "关闭自动合并",
- "enableAutoMerge": "开启自动合并",
- "enableAutoMergeConfirmMessage": "所有必需检查通过后,GitHub 会自动合并此拉取请求。",
+ "noEnabledMethods": "此仓库尚未启用任何合并方式。请联系仓库管理员启用普通合并、压缩合并或变基合并。",
+ "confirmTitle": "合并拉取请求?",
+ "confirmTitleTerm": "合并{{term}}?",
+ "confirmMessage": "这会将你的更改合并到基础分支。",
"enableAutoMergeConfirmTitle": "开启自动合并?",
+ "enableAutoMergeConfirmMessage": "所有必需检查通过后,GitHub 会自动合并此拉取请求。",
+ "enableAutoMergeConfirmMessageTerm": "流水线成功后,{{term}}将自动合并。",
+ "enableAutoMergeDescriptionTerm": "流水线成功后,GitLab 会自动合并此{{term}}。",
"forbidden": "你无权合并此拉取请求。",
- "loadFailedTitle": "无法加载合并选项。",
- "merge": "合并",
- "mergeNow": "立即合并",
- "mergePullRequest": "合并拉取请求",
- "methodLabel": "合并方式",
+ "cannotMerge": "此拉取请求目前无法合并。",
+ "couldNotMerge": "无法合并拉取请求。",
"methods": {
"merge": "合并",
"rebase": "变基",
"squash": "压缩合并"
},
- "noEnabledMethods": "此仓库尚未启用任何合并方式。请联系仓库管理员启用普通合并、压缩合并或变基合并。",
+ "terminal": {
+ "alreadyMerged": "已合并",
+ "closed": "此拉取请求已关闭",
+ "closedMergeRequest": "此合并请求已关闭"
+ },
"partialSuccessBanner": {
"accessibility": "已合并。无法删除分支:{{reason}}",
"body": "无法删除分支:{{reason}}。"
},
- "refreshMergeability": "重新检查是否可以合并",
- "terminal": {
- "alreadyMerged": "已合并",
- "closed": "此拉取请求已关闭"
- },
- "updateBranch": "更新分支",
- "updateBranchFromBase": "用基础分支的最新内容更新当前分支",
+ "loadFailedTitle": "无法加载合并选项。",
"blocked": {
"unknownStateTitle": "GitHub 尚未返回合并状态",
"unknownStateDetail": "请稍后刷新概览。",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "此拉取请求暂时无法合并",
"notMergeableDetail": "GitHub 返回的合并状态为 {{state}}。"
},
+ "restrictions": {
+ "title": "合并限制",
+ "approvalsRequired_one": "需要 {{displayCount}} 个批准",
+ "approvalsRequired_other": "需要 {{displayCount}} 个批准",
+ "pipelineMustSucceed": "合并前流水线必须成功。"
+ },
+ "providerBlocked": {
+ "failingPipeline": "流水线在最新提交上失败。",
+ "pendingPipeline": "流水线在最新提交上仍在运行。",
+ "permission": "你无权合并此{{term}}。",
+ "draft": "合并前,请将{{term}}标记为可供审查。"
+ },
"methodLabels": {
"merge": "创建合并提交",
"squash": "压缩合并",
@@ -2623,9 +2507,204 @@
"rebase": "不创建合并提交,将此分支的所有提交重放到基础分支上。"
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "讨论串 {{anchorLabel}}",
+ "collapseThread": "折叠讨论串",
+ "resolveThread": "将讨论串标记为已解决",
+ "unresolveThread": "将讨论串标记为未解决",
+ "resolved": "已解决",
+ "outdated": "已过时",
+ "comment_one": "1 条评论",
+ "comment": "{{displayCount}} 条评论",
+ "comment_other": "{{displayCount}} 条评论",
+ "startedRelative": " · {{relative}}发起",
+ "couldNotLoadMore": "无法加载更多评论。",
+ "retryLoadingMore": "重新加载更多评论",
+ "loadMoreComments": "加载更多评论",
+ "addReaction": "添加表情回应",
+ "reactionPill": "{{emoji}} 表情回应,{{displayCount}} {{countLabel}}",
+ "reaction_one": "个表情回应",
+ "reaction": "表情回应",
+ "reaction_other": "表情回应",
+ "commentActions": "评论操作",
+ "reportContent": "举报内容",
+ "reportUser": "举报用户",
+ "mute": "静音",
+ "block": "阻止",
+ "blockedUser": "已屏蔽 {{login}}",
+ "mutedUser": "已静音 {{login}}",
+ "replyPlaceholder": "回复…",
+ "replyBody": "回复正文",
+ "submitReply": "提交回复",
+ "termsTitle": "服务条款",
+ "termsCopy": "年满 13 岁才能发布内容。",
+ "termsAcceptRetry": "未能确认同意服务条款。请检查网络连接后重试。",
+ "viewTerms": "查看服务条款",
+ "acceptTerms": "同意",
+ "replyBadRequest": "无法发布此回复。讨论串可能已发生变化。",
+ "replyForbidden": "你无权回复此拉取请求。",
+ "replyForbiddenTerm": "你无权回复此{{term}}。",
+ "moderation": {
+ "block": {
+ "retryable": "屏蔽此用户失败。请检查网络连接后重试。",
+ "terminal": "无法屏蔽此用户。"
+ },
+ "mute": {
+ "retryable": "将此用户静音失败。请检查网络连接后重试。",
+ "terminal": "无法静音此用户。"
+ },
+ "reportContent": {
+ "retryable": "举报此评论失败。请检查网络连接后重试。",
+ "terminal": "无法举报此评论。"
+ },
+ "reportUser": {
+ "retryable": "举报此用户失败。请检查网络连接后重试。",
+ "terminal": "无法举报此用户。"
+ }
+ },
+ "accessDeniedMessage": "你无权查看此 PR 的讨论。",
+ "unavailable": "无法查看讨论。",
+ "unavailableMessage": "此拉取请求可能已被删除。",
+ "couldNotLoad": "无法加载讨论。",
+ "loading": "正在加载讨论",
+ "noDiscussion": "暂无讨论",
+ "noDiscussionDescription": "此拉取请求暂无审查讨论串或评论。",
+ "reviewFiles": "审查文件",
+ "quotedDiffSnippet": "引用的差异片段",
+ "moreLinesAbove": "上方还有 {{displayCount}} 行。",
+ "termsAcceptRequired": "同意服务条款后才能发布内容。",
+ "termsOutdatedCopy": "服务条款已更新。请重新打开此页面,同意最新版本。",
+ "termsCheckRetryCopy": "无法检查服务条款。请检查网络连接后重试。",
+ "reactions": {
+ "thumbsUp": "赞",
+ "thumbsDown": "踩",
+ "laugh": "大笑",
+ "hooray": "欢呼",
+ "confused": "困惑",
+ "heart": "爱心",
+ "rocket": "火箭",
+ "eyes": "眼睛"
+ },
+ "anchor": {
+ "fileCommentOnPath": "文件 {{path}} 的评论",
+ "fileComment": "文件评论",
+ "outdatedOnPathLines": "{{path}} {{lines}}(已过时)",
+ "outdatedOnLines": "{{lines}}(已过时)",
+ "outdatedOnPath": "{{path}}(已过时)"
+ },
+ "deletedUser": "已删除的用户"
+ },
+ "couldNotOpenGitHubAppSettings": "无法打开 GitHub 应用设置。",
+ "installKiloGitHubApp": "安装 Kilo GitHub 应用",
+ "checkConnection": "检查连接",
+ "couldNotLoadPullRequest": "无法加载拉取请求。",
+ "description": "描述",
"noDescriptionProvided": "未提供描述。",
- "noFilesChanged": "没有文件变更",
- "noFilesChangedDescription": "此拉取请求不包含文件变更。",
+ "review": "审查",
+ "reviewPullRequest": "审查拉取请求",
+ "headLine": "{{counts}} · 最新提交 {{sha}}",
+ "entry": {
+ "eyebrow": "通过 URL 打开拉取请求或合并请求",
+ "pastePrLink": "粘贴拉取请求或合并请求链接",
+ "noRecentPrs": "暂无最近审查",
+ "noRecentPrsDescription": "在上方粘贴链接即可开始审查,下次就能在这里找到它。",
+ "couldNotLoad": "无法加载。",
+ "removeFromRecentsTitle": "从最近记录中移除?",
+ "removeFromRecentsMessage": "此审查将从你的最近记录中移除。",
+ "removeRecentAccessibility": "从最近记录中移除 {{repo}}",
+ "urlAccessibility": "输入拉取请求或合并请求 URL",
+ "urlPlaceholder": "拉取请求或合并请求 URL",
+ "openAccessibility": "打开拉取请求或合并请求",
+ "clearLink": "清除链接",
+ "pasteLink": "粘贴拉取请求或合并请求链接",
+ "open": "开启"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} 项检查",
+ "couldNotLoad": "无法加载检查结果。",
+ "failed": "{{displayCount}} 项失败",
+ "noAccess": "你无权查看此仓库的检查结果。",
+ "noChecksReported": "暂无检查结果",
+ "notAvailable": "暂时无法查看检查结果。可能是最新提交尚未处理,或源仓库尚未安装 Kilo GitHub 应用。",
+ "openDetails": "查看 {{name}} 的详情",
+ "passed": "{{displayCount}} 项通过",
+ "pending": "{{displayCount}} 项待处理",
+ "retryChecks": "重新加载检查结果",
+ "skipped": "{{displayCount}} 项已跳过",
+ "title": "检查",
+ "viewOnGitHub": "在 GitHub 上查看 PR",
+ "checkDetails": "检查详情"
+ },
+ "inbox": {
+ "couldNotLoad": "无法加载收件箱。",
+ "loading": "正在加载收件箱",
+ "noReviewRequests": "暂无审查请求",
+ "noReviewRequestsDescription": "等待你审查的拉取请求会显示在这里。你也可以在上方粘贴任意 PR 链接。",
+ "title": "收件箱"
+ },
+ "composer": {
+ "addTitle": "添加评论",
+ "addToReview": "添加到审查",
+ "comment": "评论",
+ "commentBody": "评论内容",
+ "commentBodyPlaceholder": "评论内容",
+ "commentNow": "立即评论",
+ "discardMessage": "放弃后,草稿将丢失。",
+ "discardTitle": "放弃评论?",
+ "editTitle": "编辑评论",
+ "insertSuggestion": "插入建议",
+ "insertSuggestionA11y": "插入代码建议",
+ "loadFailedTitle": "无法加载评论编辑器。",
+ "ok": "确定",
+ "unavailableMessage": "这条待提交的评论已被删除或提交。",
+ "unavailableTitle": "评论已不可用",
+ "bodyEmpty": "评论内容不能为空。",
+ "suggestionsOnlyAddedLines": "建议仅适用于新增的行。",
+ "tapDiffLineToSuggest": "点按差异中的一行,即可添加代码建议。"
+ },
+ "connect": {
+ "checkFailedTitle": "无法检查 GitHub 连接。",
+ "checkFailedMessage": "加载完成前,无法确认登录状态。",
+ "checkFailedTitleGitLab": "无法检查 GitLab 连接。",
+ "checkFailedTitleBitbucket": "无法检查 Bitbucket 连接。",
+ "providerCheckFailedMessage": "加载完成前无法获取连接状态。",
+ "reconnectTitle": "重新连接 GitHub",
+ "reconnectDescription": "GitHub 连接授权已被撤销。请重新连接,继续在手机上审查拉取请求。",
+ "description": "连接 GitHub 账号,即可在手机上审查拉取请求。",
+ "gitlabDescription": "连接你的 GitLab 账户,以便在移动端审查合并请求。",
+ "bitbucketDescription": "将 Bitbucket 连接到此组织,以便在移动端审查拉取请求。",
+ "bitbucketOrgOnlyDescription": "在你的个人资料中选择一个组织,以审查其 Bitbucket 拉取请求。"
+ },
+ "screen": {
+ "shareA11y": "分享拉取请求",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "此评论将从审查队列中移除。",
+ "deletePendingTitle": "删除待提交的评论?",
+ "loadFailedTitle": "无法加载审查提交页面。",
+ "pendingComment": "条待提交评论",
+ "pendingComment_other": "条待提交评论",
+ "pendingComment_one": "条待提交的评论",
+ "summaryOptional": "总结(可选)",
+ "partialPostedMessage": "已发布 {{displayFreshCount}} 条评论。另有 {{displayStaleCount}} 条评论针对旧提交,仍保留在你的队列中。",
+ "submitCountOfTotal": "提交 {{displayTotalCount}} 条评论中的 {{displayFreshCount}} 条",
+ "submitReview": "提交审查意见",
+ "blockedRequestChanges": "请填写总结或添加至少一条评论,才能要求更改。",
+ "blockedComment": "请填写总结或添加至少一条评论,才能提交评论类型的审查。"
+ },
+ "reconnectNotice": {
+ "title": "GitHub 连接已过期。",
+ "message": "GitHub 连接已失效。请重新检查连接;如需重新连接,系统会提示你。",
+ "gitlabTitle": "GitLab 连接已过期。",
+ "bitbucketTitle": "Bitbucket 连接已过期。",
+ "providerMessage": "{{provider}} 连接已失效。请重新检查连接;如需重新连接,系统会提示你。"
+ },
+ "eventChips": {
+ "comment": "评论",
+ "label": "审查类型",
+ "requestChanges": "要求更改"
+ },
"overview": {
"commit": "提交",
"commit_other": "提交",
@@ -2666,39 +2745,25 @@
"summaryA11y": "审查总结",
"summaryPlaceholder": "审查总结(可选)"
},
- "pullRequestUnavailable": "无法打开拉取请求",
- "pullRequestUnavailableDescription": "无法打开此 PR。可能是 PR 已被删除、仓库为私有仓库,或仓库尚未安装 Kilo GitHub 应用。",
- "reconnectNotice": {
- "message": "GitHub 连接已失效。请重新检查连接;如需重新连接,系统会提示你。",
- "title": "GitHub 连接已过期。"
- },
- "review": "审查",
- "reviewPullRequest": "审查拉取请求",
- "screen": {
- "shareA11y": "分享拉取请求",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "空差异列",
- "emptyDiffRow": "空差异行",
- "newOnly": "仅新内容:{{text}}",
- "noNewlineAtEndOfFile": "⚠️ 文件末尾没有换行符",
- "oldNew": "旧内容:{{old}};新内容:{{new}}",
- "oldOnly": "仅旧内容:{{text}}"
+ "tabs": {
+ "discussion": "讨论",
+ "files": "文件",
+ "overview": "概览"
},
- "submit": {
- "deletePendingMessage": "此评论将从审查队列中移除。",
- "deletePendingTitle": "删除待提交的评论?",
- "loadFailedTitle": "无法加载审查提交页面。",
- "pendingComment": "条待提交评论",
- "pendingComment_other": "条待提交评论",
- "pendingComment_one": "条待提交的评论",
- "summaryOptional": "总结(可选)",
- "partialPostedMessage": "已发布 {{displayFreshCount}} 条评论。另有 {{displayStaleCount}} 条评论针对旧提交,仍保留在你的队列中。",
- "submitCountOfTotal": "提交 {{displayTotalCount}} 条评论中的 {{displayFreshCount}} 条",
- "submitReview": "提交审查意见",
- "blockedRequestChanges": "请填写总结或添加至少一条评论,才能要求更改。",
- "blockedComment": "请填写总结或添加至少一条评论,才能提交评论类型的审查。"
+ "terms": {
+ "pullRequest": "拉取请求",
+ "mergeRequest": "合并请求",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "分享合并请求",
+ "viewOnProvider": "在 {{provider}} 上查看",
+ "mergeRequestUnavailable": "无法打开合并请求",
+ "unavailableDescription": "它可能已被删除,或者你可能没有访问权限。",
+ "accessDeniedMergeRequest": "你无权查看此合并请求。",
+ "couldNotLoadMergeRequest": "无法加载合并请求。",
+ "discussionAccessDenied": "你无权查看此合并请求的讨论。",
+ "discussionUnavailableMessage": "此合并请求可能已被删除。",
+ "noDiscussionDescription": "此合并请求暂无审查讨论串或评论。",
+ "noFilesChangedDescription": "此合并请求不包含文件变更。"
},
"fileStatus": {
"changed": "已更改",
@@ -2706,11 +2771,6 @@
"modified": "已修改",
"renamed": "已重命名"
},
- "tabs": {
- "discussion": "讨论",
- "files": "文件",
- "overview": "概览"
- },
"diff": {
"selectedTapToChange": "已选择 {{label}},点按更改选择",
"tapToComment": "{{label}},点按发表评论",
@@ -2721,7 +2781,7 @@
"emptyLine": "(空)"
},
"linkPasteClipboardEmpty": "剪贴板为空。",
- "linkPasteNotAPullRequest": "这不是 GitHub 拉取请求链接。",
+ "linkPasteNotAPullRequest": "不是拉取请求或合并请求链接",
"announce": {
"commentPosted": "评论已发布",
"reviewSubmitted": "审查已提交",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "无法发布此评论。所选行可能已更改,或 PR 可能已更新。",
"reviewNotSubmitted": "当前无法提交此审查。可能是 PR 已有更新,或你正在审查自己创建的拉取请求。",
+ "reviewNotSubmittedTerm": "此审查无法按现状提交。{{term}}可能已变更,或者你不能审查自己的{{term}}。",
"couldNotPostComment": "无法发布评论。",
"couldNotSubmitReview": "无法提交审查。请检查网络连接后重试。"
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "无法回复。",
"couldNotCompleteAction": "无法完成此操作。",
"mergeResultDefaultError": "GitHub 未完成合并。",
+ "mergeResultNotCompleted": "{{term}}未合并。检查其状态后重试。",
"ambiguous": "无法确认操作结果,请先检查 PR 再重试。",
"persistenceFailed": "无法记录此操作。请稍后重试。",
"forbidden": "无权执行此操作。"
diff --git a/apps/mobile/src/i18n/locales/zh-Hant.json b/apps/mobile/src/i18n/locales/zh-Hant.json
index 69204fa5aa..c49f364aba 100644
--- a/apps/mobile/src/i18n/locales/zh-Hant.json
+++ b/apps/mobile/src/i18n/locales/zh-Hant.json
@@ -4,6 +4,8 @@
"done": "完成",
"retry": "再試一次",
"tryAgain": "再試一次",
+ "continue": "繼續",
+ "notNow": "稍後再說",
"language": "語言",
"device": "裝置",
"share": "分享 {{title}}",
@@ -21,8 +23,6 @@
"couldNotCopyToClipboard": "無法複製到剪貼簿。",
"required": "必填",
"error": "錯誤:{{error}}",
- "notNow": "稍後再說",
- "continue": "繼續",
"back": "返回",
"somethingWentWrong": "發生錯誤。",
"couldNotOpen": "無法開啟 {{label}}。",
@@ -36,6 +36,7 @@
"cost": "費用",
"discard": "捨棄",
"findings": "問題",
+ "mergeRequest": "合併請求",
"notConnected": "未連結",
"notifications": "通知",
"pullRequest": "提取要求",
@@ -1557,11 +1558,31 @@
"retryConnection": "重新連線"
},
"newSession": {
+ "recentlyUsed": "最近使用",
+ "couldNotLoadGithubRepositories": "無法載入 GitHub 儲存庫。",
+ "couldNotLoadGitlabRepositories": "無法載入 GitLab 儲存庫。",
+ "couldNotLoadBitbucketRepositories": "無法載入 Bitbucket 儲存庫。",
"connectGithubDescription": "請在瀏覽器中連結 GitHub,再回到這裡選取儲存庫。",
+ "connectGitlabDescription": "請在瀏覽器中連結 GitLab,再回到這裡選取儲存庫。",
+ "connectBitbucketDescription": "請在瀏覽器中連結 Bitbucket,再回到這裡選取儲存庫。",
"openGithub": "開啟 GitHub",
+ "openGitlab": "開啟 GitLab",
+ "openBitbucket": "開啟 Bitbucket",
"refreshRepositories": "重新整理儲存庫",
"githubConnected": "已連結 GitHub",
+ "gitlabConnected": "已連結 GitLab",
"noRepositoriesVisible": "沒有可顯示的儲存庫。請檢查 Kilo GitHub 應用程式的儲存庫存取權限,再重新整理。",
+ "noRepositoriesVisibleGitlab": "沒有可顯示的儲存庫。請檢查 GitLab 的儲存庫存取權限,再重新整理。",
+ "noRepositoriesVisibleBitbucket": "沒有可顯示的儲存庫。請檢查 Bitbucket 的儲存庫存取權限,再重新整理。",
+ "bitbucketOrganizationsOnly": "Bitbucket 僅供組織使用。",
+ "branchPickerTitle": "選取分支",
+ "branchDefault": "預設",
+ "branchAccessibility": "分支: {{label}}",
+ "branchLoading": "正在載入分支",
+ "branchLoadError": "無法載入分支",
+ "branchUnavailable": "此存放庫沒有可用的分支。檢查你在供應商處的存取權限,然後選取另一個存放庫。",
+ "branchEmpty": "沒有可用的分支",
+ "branchPlaceholder": "選取一個分支",
"runOnWithTarget": "執行環境:{{target}}",
"environment": "環境",
"couldNotLoadEnvironment": "無法載入你的環境。",
@@ -1580,26 +1601,15 @@
"couldNotReadPendingSessions": "無法讀取待處理的工作階段。請再試一次。",
"failedToCreate": "無法建立工作階段。",
"couldNotRefreshRepositories": "無法重新整理儲存庫。請再試一次。",
- "discardDraftMessage": "你輸入的提示詞將不會保留。",
"discardDraftTitle": "捨棄草稿?",
+ "discardDraftMessage": "你輸入的提示詞將不會保留。",
+ "discardWithUploadsMessage": "你輸入的提示詞與尚未附加至已傳送訊息的上傳檔案都會刪除。",
"discardFailed": "無法捨棄草稿。請再試一次。",
"remoteHint": "在電腦上執行 `kilo remote`,或在執行中的 CLI 工作階段執行 `/remote`,即可控制本機的 kilo 程序。",
- "connectBitbucketDescription": "請在瀏覽器中連結 Bitbucket,再回到這裡選取儲存庫。",
- "connectGitlabDescription": "請在瀏覽器中連結 GitLab,再回到這裡選取儲存庫。",
- "couldNotLoadBitbucketRepositories": "無法載入 Bitbucket 儲存庫。",
- "couldNotLoadGithubRepositories": "無法載入 GitHub 儲存庫。",
- "couldNotLoadGitlabRepositories": "無法載入 GitLab 儲存庫。",
- "gitlabConnected": "已連結 GitLab",
- "noRepositoriesVisibleBitbucket": "沒有可顯示的儲存庫。請檢查 Bitbucket 的儲存庫存取權限,再重新整理。",
- "noRepositoriesVisibleGitlab": "沒有可顯示的儲存庫。請檢查 GitLab 的儲存庫存取權限,再重新整理。",
- "openBitbucket": "開啟 Bitbucket",
- "openGitlab": "開啟 GitLab",
- "recentlyUsed": "最近使用",
"continueFrom": "正在接續 {{title}}。",
"importingSession": "匯入工作階段中",
"cliCannotContinue": "此 CLI 無法繼續工作階段。請選擇 Cloud Agent 或其他 CLI。",
- "importFailed": "無法匯入此工作階段。",
- "discardWithUploadsMessage": "你輸入的提示詞與尚未附加至已傳送訊息的上傳檔案都會刪除。"
+ "importFailed": "無法匯入此工作階段。"
},
"partRenderer": {
"updatedFileCount_one": "已更新 {{displayCount}} 個檔案。",
@@ -2312,160 +2322,11 @@
"installAttributionPromptTitle": "允許追蹤安裝來源?"
},
"prReview": {
+ "pullRequestUnavailable": "無法開啟提取請求",
+ "pullRequestUnavailableDescription": "無法開啟此 PR。可能是 PR 已刪除、存放庫設為私人,或存放庫尚未安裝 Kilo GitHub App。",
"accessDeniedDescription": "你沒有權限檢視此提取請求。",
- "checkConnection": "檢查連線",
- "checks": {
- "checksCount": "{{displayCount}} 項檢查",
- "couldNotLoad": "無法載入檢查。",
- "failed": "{{displayCount}} 項失敗",
- "noAccess": "你沒有權限檢視此存放庫的檢查結果。",
- "noChecksReported": "尚無檢查結果",
- "notAvailable": "目前尚無檢查結果。可能是來源分支的最新提交尚未處理,或來源存放庫尚未安裝 Kilo GitHub App。",
- "openDetails": "開啟 {{name}} 的詳細資料",
- "passed": "{{displayCount}} 項通過",
- "pending": "{{displayCount}} 項待處理",
- "retryChecks": "重試檢查",
- "skipped": "{{displayCount}} 項略過",
- "title": "檢查",
- "viewOnGitHub": "在 GitHub 上檢視 PR",
- "checkDetails": "檢查詳細資料"
- },
- "composer": {
- "addTitle": "新增留言",
- "addToReview": "加入審查",
- "comment": "留言",
- "commentBody": "留言內容",
- "commentBodyPlaceholder": "留言內容",
- "commentNow": "立即留言",
- "discardMessage": "你的草稿將不會保留。",
- "discardTitle": "要捨棄留言嗎?",
- "editTitle": "編輯留言",
- "insertSuggestion": "插入建議",
- "insertSuggestionA11y": "插入程式碼建議",
- "loadFailedTitle": "無法載入留言編輯器。",
- "ok": "確定",
- "unavailableMessage": "此待送出留言已刪除或送出。",
- "unavailableTitle": "留言已無法編輯",
- "bodyEmpty": "留言內容不可為空白。",
- "suggestionsOnlyAddedLines": "建議僅適用於新增的行。",
- "tapDiffLineToSuggest": "點一下差異中的任一行,即可啟用建議功能。"
- },
- "connect": {
- "checkFailedMessage": "載入完成前,無法確認登入狀態。",
- "checkFailedTitle": "無法檢查 GitHub 連線。",
- "description": "連結你的 GitHub 帳戶,即可在行動裝置上審查提取請求。",
- "reconnectDescription": "你的 GitHub 連線授權已撤銷。請重新連線,以繼續在行動裝置上審查提取請求。",
- "reconnectTitle": "重新連線至 GitHub"
- },
- "connectionExpired": "GitHub 連線已過期。",
- "couldNotLoadPullRequest": "無法載入提取請求。",
- "couldNotOpenGitHubAppSettings": "無法開啟 GitHub 應用程式設定。",
- "description": "說明",
- "discussion": {
- "acceptTerms": "同意",
- "accessDeniedMessage": "你沒有權限檢視此 PR 的討論。",
- "addReaction": "新增表情反應",
- "block": "封鎖",
- "blockedUser": "已封鎖 {{login}}",
- "collapseThread": "收合討論串",
- "commentActions": "留言操作",
- "comment": "{{displayCount}} 則留言",
- "comment_other": "{{displayCount}} 則留言",
- "couldNotLoad": "無法載入討論。",
- "couldNotLoadMore": "無法載入更多留言。",
- "loadMoreComments": "載入更多留言",
- "loading": "正在載入討論",
- "moderation": {
- "block": {
- "retryable": "無法封鎖此使用者。請檢查連線後再試一次。",
- "terminal": "無法封鎖此使用者。"
- },
- "mute": {
- "retryable": "無法將此使用者設為靜音。請檢查連線後再試一次。",
- "terminal": "無法將此使用者設為靜音。"
- },
- "reportContent": {
- "retryable": "無法檢舉此留言。請檢查連線後再試一次。",
- "terminal": "無法檢舉此留言。"
- },
- "reportUser": {
- "retryable": "無法檢舉此使用者。請檢查連線後再試一次。",
- "terminal": "無法檢舉此使用者。"
- }
- },
- "moreLinesAbove": "…上方還有 {{displayCount}} 行。",
- "mute": "靜音",
- "mutedUser": "已將 {{login}} 設為靜音",
- "noDiscussion": "尚無討論",
- "noDiscussionDescription": "此提取請求尚無審查討論串或留言。",
- "comment_one": "1 則留言",
- "outdated": "已過時",
- "quotedDiffSnippet": "引用的差異片段",
- "reactionPill": "{{emoji}} 表情反應,共 {{displayCount}} {{countLabel}}",
- "reaction": "表情回應",
- "reaction_other": "表情回應",
- "reaction_one": "個表情反應",
- "replyBadRequest": "無法發佈此回覆。討論串可能已變更。",
- "replyBody": "回覆內容",
- "replyForbidden": "你沒有權限回覆此提取請求。",
- "replyPlaceholder": "回覆…",
- "reportContent": "檢舉內容",
- "reportUser": "檢舉使用者",
- "resolveThread": "將討論串標記為已解決",
- "resolved": "已解決",
- "retryLoadingMore": "重新載入更多留言",
- "reviewFiles": "審查檔案",
- "startedRelative": " · {{relative}}開始",
- "submitReply": "送出回覆",
- "termsAcceptRetry": "同意服務條款時發生錯誤。請檢查連線後再試一次。",
- "termsCopy": "你必須年滿 13 歲才能發佈內容。",
- "termsTitle": "服務條款",
- "threadAccessibilityLabel": "討論串 {{anchorLabel}}",
- "unavailable": "無法開啟討論。",
- "unavailableMessage": "此提取請求可能已移除。",
- "unresolveThread": "將討論串標記為未解決",
- "viewTerms": "檢視條款",
- "termsAcceptRequired": "你必須同意服務條款才能發佈內容。",
- "termsCheckRetryCopy": "無法檢查服務條款。請檢查連線後再試一次。",
- "termsOutdatedCopy": "服務條款已更新。請重新開啟此畫面,同意最新版本的條款。",
- "reactions": {
- "thumbsUp": "讚",
- "thumbsDown": "倒讚",
- "laugh": "大笑",
- "hooray": "歡呼",
- "confused": "困惑",
- "heart": "愛心",
- "rocket": "火箭",
- "eyes": "眼睛"
- },
- "anchor": {
- "fileCommentOnPath": "{{path}} 的檔案留言",
- "fileComment": "檔案留言",
- "outdatedOnPathLines": "{{path}} {{lines}} 的留言已過時",
- "outdatedOnLines": "{{lines}} 的留言已過時",
- "outdatedOnPath": "{{path}} 的留言已過時"
- },
- "deletedUser": "已刪除的使用者"
- },
- "entry": {
- "clearLink": "清除提取請求連結",
- "couldNotLoad": "無法載入。",
- "eyebrow": "透過 URL 開啟提取請求。",
- "noRecentPrs": "尚無最近開啟的 PR",
- "noRecentPrsDescription": "在上方貼上 PR 連結即可開始審查,下次就會在這裡看到這個 PR。",
- "open": "開啟",
- "pasteLink": "貼上提取請求連結",
- "pastePrLink": "貼上 PR 連結",
- "removeFromRecentsMessage": "此提取請求將從你的最近項目中移除。",
- "removeFromRecentsTitle": "要從最近項目移除嗎?",
- "removeRecentAccessibility": "從最近項目移除 {{repo}}",
- "urlAccessibility": "GitHub 提取請求 URL"
- },
- "eventChips": {
- "comment": "留言",
- "label": "審查類型",
- "requestChanges": "要求變更"
- },
+ "noFilesChanged": "沒有檔案變更",
+ "noFilesChangedDescription": "此提取請求沒有檔案變更。",
"fileList": {
"filesList": "檔案清單",
"filesViewed": "檔案 · 已檢視 {{viewed}} / {{total}}",
@@ -2510,7 +2371,6 @@
"commentOnSelectedLines": "對選取的行留言",
"finishReview": "完成審查"
},
- "headLine": "{{counts}} · 最新提交 {{sha}}",
"hunkRows": {
"contextUnavailable": "無法取得此參照的前後文。",
"expandAll": "全部展開",
@@ -2543,56 +2403,68 @@
"retryLoadingContext": "重新載入前後文",
"retryLoadingNextPage": "重新載入下一頁"
},
- "inbox": {
- "couldNotLoad": "無法載入收件匣。",
- "loading": "正在載入收件匣",
- "noReviewRequests": "尚無審查請求",
- "noReviewRequestsDescription": "等待你審查的提取請求會顯示在這裡。你也可以在上方貼上任何 PR 連結。",
- "title": "收件匣"
+ "sideBySide": {
+ "emptyDiffColumn": "空白差異欄",
+ "emptyDiffRow": "空白差異列",
+ "newOnly": "僅新版有:{{text}}",
+ "noNewlineAtEndOfFile": "⚠️ 檔案結尾沒有換行",
+ "oldNew": "舊版:{{old}} | 新版:{{new}}",
+ "oldOnly": "僅舊版有:{{text}}"
+ },
+ "connectionExpired": "GitHub 連線已過期。",
+ "capabilities": {
+ "banner": {
+ "title": "此供應商不支援",
+ "accessibility": "此供應商不支援: {{reason}}"
+ }
},
- "installKiloGitHubApp": "安裝 Kilo GitHub App",
"merge": {
- "autoMergeDescription": "所有必要檢查通過後,GitHub 會自動合併此提取請求(合併方式:{{method}})。",
+ "merge": "合併",
+ "mergeNow": "立即合併",
+ "mergePullRequest": "合併提取請求",
+ "mergeTermTitle": "合併{{term}}",
+ "enableAutoMerge": "啟用自動合併",
+ "disableAutoMerge": "停用自動合併",
"autoMergeOn": "已啟用自動合併",
- "blockedTitle": "目前無法合併的原因",
- "cannotMerge": "此提取請求目前無法合併。",
+ "autoMergeDescription": "所有必要檢查通過後,GitHub 會自動合併此提取請求(合併方式:{{method}})。",
"checking": "正在檢查可否合併…",
+ "couldNotDetermine": "無法判斷可否合併。",
+ "refreshMergeability": "重新整理合併狀態",
+ "blockedTitle": "目前無法合併的原因",
+ "updateBranch": "更新分支",
+ "updateBranchFromBase": "以基礎分支的內容更新此分支",
+ "methodLabel": "合併方式",
+ "commitTitle": "提交標題",
"commitMessage": "提交訊息",
"commitMessagePlaceholder": "合併提交的說明(非必填)",
- "commitTitle": "提交標題",
- "confirmMessage": "這會將你的變更合併到基礎分支。",
- "confirmTitle": "要合併提取請求嗎?",
- "couldNotDetermine": "無法判斷可否合併。",
- "couldNotMerge": "無法合併提取請求。",
"deleteBranch": "刪除分支",
"deleteBranchAfterMerge": "合併後刪除分支",
- "disableAutoMerge": "停用自動合併",
- "enableAutoMerge": "啟用自動合併",
- "enableAutoMergeConfirmMessage": "所有必要檢查通過後,GitHub 會自動合併此提取請求。",
+ "noEnabledMethods": "此存放庫未啟用任何合併方式。請存放庫管理員啟用一般合併、壓縮合併或變基合併。",
+ "confirmTitle": "要合併提取請求嗎?",
+ "confirmTitleTerm": "要合併{{term}}嗎?",
+ "confirmMessage": "這會將你的變更合併到基礎分支。",
"enableAutoMergeConfirmTitle": "要啟用自動合併嗎?",
+ "enableAutoMergeConfirmMessage": "所有必要檢查通過後,GitHub 會自動合併此提取請求。",
+ "enableAutoMergeConfirmMessageTerm": "管線成功後,{{term}}將自動合併。",
+ "enableAutoMergeDescriptionTerm": "管線成功後,GitLab 會自動合併此{{term}}。",
"forbidden": "你沒有權限合併此提取請求。",
- "loadFailedTitle": "無法載入合併選項。",
- "merge": "合併",
- "mergeNow": "立即合併",
- "mergePullRequest": "合併提取請求",
- "methodLabel": "合併方式",
+ "cannotMerge": "此提取請求目前無法合併。",
+ "couldNotMerge": "無法合併提取請求。",
"methods": {
"merge": "合併",
"rebase": "變基",
"squash": "壓縮"
},
- "noEnabledMethods": "此存放庫未啟用任何合併方式。請存放庫管理員啟用一般合併、壓縮合併或變基合併。",
+ "terminal": {
+ "alreadyMerged": "已合併",
+ "closed": "此提取請求已關閉",
+ "closedMergeRequest": "此合併請求已關閉"
+ },
"partialSuccessBanner": {
"accessibility": "已合併。無法刪除分支:{{reason}}",
"body": "無法刪除分支:{{reason}}。"
},
- "refreshMergeability": "重新整理合併狀態",
- "terminal": {
- "alreadyMerged": "已合併",
- "closed": "此提取請求已關閉"
- },
- "updateBranch": "更新分支",
- "updateBranchFromBase": "以基礎分支的內容更新此分支",
+ "loadFailedTitle": "無法載入合併選項。",
"blocked": {
"unknownStateTitle": "GitHub 尚未確認是否可合併",
"unknownStateDetail": "請稍後再重新整理總覽。",
@@ -2612,6 +2484,18 @@
"notMergeableTitle": "此提取請求尚無法合併",
"notMergeableDetail": "GitHub 回報的合併狀態為 {{state}}。"
},
+ "restrictions": {
+ "title": "合併限制",
+ "approvalsRequired_one": "需要 {{displayCount}} 個核准",
+ "approvalsRequired_other": "需要 {{displayCount}} 個核准",
+ "pipelineMustSucceed": "合併前管線必須成功。"
+ },
+ "providerBlocked": {
+ "failingPipeline": "管線在最新提交上失敗。",
+ "pendingPipeline": "管線在最新提交上仍在執行。",
+ "permission": "你沒有權限合併此{{term}}。",
+ "draft": "合併前,請先將{{term}}標記為可供審查。"
+ },
"methodLabels": {
"merge": "建立合併提交",
"squash": "壓縮並合併",
@@ -2623,9 +2507,204 @@
"rebase": "將此分支的所有提交依序重新套用到基礎分支,不另建合併提交。"
}
},
+ "discussion": {
+ "threadAccessibilityLabel": "討論串 {{anchorLabel}}",
+ "collapseThread": "收合討論串",
+ "resolveThread": "將討論串標記為已解決",
+ "unresolveThread": "將討論串標記為未解決",
+ "resolved": "已解決",
+ "outdated": "已過時",
+ "comment_one": "1 則留言",
+ "comment": "{{displayCount}} 則留言",
+ "comment_other": "{{displayCount}} 則留言",
+ "startedRelative": " · {{relative}}開始",
+ "couldNotLoadMore": "無法載入更多留言。",
+ "retryLoadingMore": "重新載入更多留言",
+ "loadMoreComments": "載入更多留言",
+ "addReaction": "新增表情反應",
+ "reactionPill": "{{emoji}} 表情反應,共 {{displayCount}} {{countLabel}}",
+ "reaction_one": "個表情反應",
+ "reaction": "表情回應",
+ "reaction_other": "表情回應",
+ "commentActions": "留言操作",
+ "reportContent": "檢舉內容",
+ "reportUser": "檢舉使用者",
+ "mute": "靜音",
+ "block": "封鎖",
+ "blockedUser": "已封鎖 {{login}}",
+ "mutedUser": "已將 {{login}} 設為靜音",
+ "replyPlaceholder": "回覆…",
+ "replyBody": "回覆內容",
+ "submitReply": "送出回覆",
+ "termsTitle": "服務條款",
+ "termsCopy": "你必須年滿 13 歲才能發佈內容。",
+ "termsAcceptRetry": "同意服務條款時發生錯誤。請檢查連線後再試一次。",
+ "viewTerms": "檢視條款",
+ "acceptTerms": "同意",
+ "replyBadRequest": "無法發佈此回覆。討論串可能已變更。",
+ "replyForbidden": "你沒有權限回覆此提取請求。",
+ "replyForbiddenTerm": "你沒有權限回覆此{{term}}。",
+ "moderation": {
+ "block": {
+ "retryable": "無法封鎖此使用者。請檢查連線後再試一次。",
+ "terminal": "無法封鎖此使用者。"
+ },
+ "mute": {
+ "retryable": "無法將此使用者設為靜音。請檢查連線後再試一次。",
+ "terminal": "無法將此使用者設為靜音。"
+ },
+ "reportContent": {
+ "retryable": "無法檢舉此留言。請檢查連線後再試一次。",
+ "terminal": "無法檢舉此留言。"
+ },
+ "reportUser": {
+ "retryable": "無法檢舉此使用者。請檢查連線後再試一次。",
+ "terminal": "無法檢舉此使用者。"
+ }
+ },
+ "accessDeniedMessage": "你沒有權限檢視此 PR 的討論。",
+ "unavailable": "無法開啟討論。",
+ "unavailableMessage": "此提取請求可能已移除。",
+ "couldNotLoad": "無法載入討論。",
+ "loading": "正在載入討論",
+ "noDiscussion": "尚無討論",
+ "noDiscussionDescription": "此提取請求尚無審查討論串或留言。",
+ "reviewFiles": "審查檔案",
+ "quotedDiffSnippet": "引用的差異片段",
+ "moreLinesAbove": "…上方還有 {{displayCount}} 行。",
+ "termsAcceptRequired": "你必須同意服務條款才能發佈內容。",
+ "termsOutdatedCopy": "服務條款已更新。請重新開啟此畫面,同意最新版本的條款。",
+ "termsCheckRetryCopy": "無法檢查服務條款。請檢查連線後再試一次。",
+ "reactions": {
+ "thumbsUp": "讚",
+ "thumbsDown": "倒讚",
+ "laugh": "大笑",
+ "hooray": "歡呼",
+ "confused": "困惑",
+ "heart": "愛心",
+ "rocket": "火箭",
+ "eyes": "眼睛"
+ },
+ "anchor": {
+ "fileCommentOnPath": "{{path}} 的檔案留言",
+ "fileComment": "檔案留言",
+ "outdatedOnPathLines": "{{path}} {{lines}} 的留言已過時",
+ "outdatedOnLines": "{{lines}} 的留言已過時",
+ "outdatedOnPath": "{{path}} 的留言已過時"
+ },
+ "deletedUser": "已刪除的使用者"
+ },
+ "couldNotOpenGitHubAppSettings": "無法開啟 GitHub 應用程式設定。",
+ "installKiloGitHubApp": "安裝 Kilo GitHub App",
+ "checkConnection": "檢查連線",
+ "couldNotLoadPullRequest": "無法載入提取請求。",
+ "description": "說明",
"noDescriptionProvided": "未提供說明。",
- "noFilesChanged": "沒有檔案變更",
- "noFilesChangedDescription": "此提取請求沒有檔案變更。",
+ "review": "審查",
+ "reviewPullRequest": "審查提取請求",
+ "headLine": "{{counts}} · 最新提交 {{sha}}",
+ "entry": {
+ "eyebrow": "透過 URL 開啟提取請求或合併請求",
+ "pastePrLink": "貼上提取請求或合併請求連結",
+ "noRecentPrs": "尚無最近審查",
+ "noRecentPrsDescription": "在上方貼上連結即可開始審查,下次就會在這裡看到。",
+ "couldNotLoad": "無法載入。",
+ "removeFromRecentsTitle": "要從最近項目移除嗎?",
+ "removeFromRecentsMessage": "此審查將從你的最近項目中移除。",
+ "removeRecentAccessibility": "從最近項目移除 {{repo}}",
+ "urlAccessibility": "輸入提取請求或合併請求 URL",
+ "urlPlaceholder": "提取請求或合併請求 URL",
+ "openAccessibility": "開啟提取請求或合併請求",
+ "clearLink": "清除連結",
+ "pasteLink": "貼上提取請求或合併請求連結",
+ "open": "開啟"
+ },
+ "checks": {
+ "checksCount": "{{displayCount}} 項檢查",
+ "couldNotLoad": "無法載入檢查。",
+ "failed": "{{displayCount}} 項失敗",
+ "noAccess": "你沒有權限檢視此存放庫的檢查結果。",
+ "noChecksReported": "尚無檢查結果",
+ "notAvailable": "目前尚無檢查結果。可能是來源分支的最新提交尚未處理,或來源存放庫尚未安裝 Kilo GitHub App。",
+ "openDetails": "開啟 {{name}} 的詳細資料",
+ "passed": "{{displayCount}} 項通過",
+ "pending": "{{displayCount}} 項待處理",
+ "retryChecks": "重試檢查",
+ "skipped": "{{displayCount}} 項略過",
+ "title": "檢查",
+ "viewOnGitHub": "在 GitHub 上檢視 PR",
+ "checkDetails": "檢查詳細資料"
+ },
+ "inbox": {
+ "couldNotLoad": "無法載入收件匣。",
+ "loading": "正在載入收件匣",
+ "noReviewRequests": "尚無審查請求",
+ "noReviewRequestsDescription": "等待你審查的提取請求會顯示在這裡。你也可以在上方貼上任何 PR 連結。",
+ "title": "收件匣"
+ },
+ "composer": {
+ "addTitle": "新增留言",
+ "addToReview": "加入審查",
+ "comment": "留言",
+ "commentBody": "留言內容",
+ "commentBodyPlaceholder": "留言內容",
+ "commentNow": "立即留言",
+ "discardMessage": "你的草稿將不會保留。",
+ "discardTitle": "要捨棄留言嗎?",
+ "editTitle": "編輯留言",
+ "insertSuggestion": "插入建議",
+ "insertSuggestionA11y": "插入程式碼建議",
+ "loadFailedTitle": "無法載入留言編輯器。",
+ "ok": "確定",
+ "unavailableMessage": "此待送出留言已刪除或送出。",
+ "unavailableTitle": "留言已無法編輯",
+ "bodyEmpty": "留言內容不可為空白。",
+ "suggestionsOnlyAddedLines": "建議僅適用於新增的行。",
+ "tapDiffLineToSuggest": "點一下差異中的任一行,即可啟用建議功能。"
+ },
+ "connect": {
+ "checkFailedTitle": "無法檢查 GitHub 連線。",
+ "checkFailedMessage": "載入完成前,無法確認登入狀態。",
+ "checkFailedTitleGitLab": "無法檢查 GitLab 連線。",
+ "checkFailedTitleBitbucket": "無法檢查 Bitbucket 連線。",
+ "providerCheckFailedMessage": "載入完成前無法取得連線狀態。",
+ "reconnectTitle": "重新連線至 GitHub",
+ "reconnectDescription": "你的 GitHub 連線授權已撤銷。請重新連線,以繼續在行動裝置上審查提取請求。",
+ "description": "連結你的 GitHub 帳戶,即可在行動裝置上審查提取請求。",
+ "gitlabDescription": "連結你的 GitLab 帳戶,以便在行動裝置上審查合併請求。",
+ "bitbucketDescription": "將 Bitbucket 連結到此組織,以便在行動裝置上審查提取請求。",
+ "bitbucketOrgOnlyDescription": "在你的個人資料中選取一個組織,以審查其 Bitbucket 提取請求。"
+ },
+ "screen": {
+ "shareA11y": "分享提取請求",
+ "title": "#{{number}}"
+ },
+ "submit": {
+ "deletePendingMessage": "此留言將從待送出的審查留言中移除。",
+ "deletePendingTitle": "要刪除待送出留言嗎?",
+ "loadFailedTitle": "無法載入審查送出畫面。",
+ "pendingComment": "則待送出的留言",
+ "pendingComment_other": "則待送出的留言",
+ "pendingComment_one": "則待送出留言",
+ "summaryOptional": "摘要(非必填)",
+ "partialPostedMessage": "已發佈 {{displayFreshCount}} 則留言。另有 {{displayStaleCount}} 則留言對應舊版提交,仍保留在待送出清單中。",
+ "submitCountOfTotal": "送出 {{displayTotalCount}} 則留言中的 {{displayFreshCount}} 則",
+ "submitReview": "送出審查",
+ "blockedRequestChanges": "請先填寫摘要或新增至少一則留言,才能要求變更。",
+ "blockedComment": "請先填寫摘要或新增至少一則留言,才能送出留言型審查。"
+ },
+ "reconnectNotice": {
+ "title": "GitHub 連線已過期。",
+ "message": "你的 GitHub 連線已失效。請重新檢查連線;如有需要,系統會提示你重新連線。",
+ "gitlabTitle": "GitLab 連線已過期。",
+ "bitbucketTitle": "Bitbucket 連線已過期。",
+ "providerMessage": "你的 {{provider}} 連線已失效。請重新檢查連線;如有需要,系統會提示你重新連線。"
+ },
+ "eventChips": {
+ "comment": "留言",
+ "label": "審查類型",
+ "requestChanges": "要求變更"
+ },
"overview": {
"commit": "提交",
"commit_other": "提交",
@@ -2666,39 +2745,25 @@
"summaryA11y": "審查摘要",
"summaryPlaceholder": "審查摘要(非必填)"
},
- "pullRequestUnavailable": "無法開啟提取請求",
- "pullRequestUnavailableDescription": "無法開啟此 PR。可能是 PR 已刪除、存放庫設為私人,或存放庫尚未安裝 Kilo GitHub App。",
- "reconnectNotice": {
- "message": "你的 GitHub 連線已失效。請重新檢查連線;如有需要,系統會提示你重新連線。",
- "title": "GitHub 連線已過期。"
- },
- "review": "審查",
- "reviewPullRequest": "審查提取請求",
- "screen": {
- "shareA11y": "分享提取請求",
- "title": "#{{number}}"
- },
- "sideBySide": {
- "emptyDiffColumn": "空白差異欄",
- "emptyDiffRow": "空白差異列",
- "newOnly": "僅新版有:{{text}}",
- "noNewlineAtEndOfFile": "⚠️ 檔案結尾沒有換行",
- "oldNew": "舊版:{{old}} | 新版:{{new}}",
- "oldOnly": "僅舊版有:{{text}}"
+ "tabs": {
+ "discussion": "討論",
+ "files": "檔案",
+ "overview": "總覽"
},
- "submit": {
- "deletePendingMessage": "此留言將從待送出的審查留言中移除。",
- "deletePendingTitle": "要刪除待送出留言嗎?",
- "loadFailedTitle": "無法載入審查送出畫面。",
- "pendingComment": "則待送出的留言",
- "pendingComment_other": "則待送出的留言",
- "pendingComment_one": "則待送出留言",
- "summaryOptional": "摘要(非必填)",
- "partialPostedMessage": "已發佈 {{displayFreshCount}} 則留言。另有 {{displayStaleCount}} 則留言對應舊版提交,仍保留在待送出清單中。",
- "submitCountOfTotal": "送出 {{displayTotalCount}} 則留言中的 {{displayFreshCount}} 則",
- "submitReview": "送出審查",
- "blockedRequestChanges": "請先填寫摘要或新增至少一則留言,才能要求變更。",
- "blockedComment": "請先填寫摘要或新增至少一則留言,才能送出留言型審查。"
+ "terms": {
+ "pullRequest": "提取要求",
+ "mergeRequest": "合併請求",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "分享合併請求",
+ "viewOnProvider": "在 {{provider}} 上檢視",
+ "mergeRequestUnavailable": "無法開啟合併請求",
+ "unavailableDescription": "它可能已被移除,或者你可能沒有存取權限。",
+ "accessDeniedMergeRequest": "你沒有權限檢視此合併請求。",
+ "couldNotLoadMergeRequest": "無法載入合併請求。",
+ "discussionAccessDenied": "你沒有權限檢視此合併請求的討論。",
+ "discussionUnavailableMessage": "此合併請求可能已移除。",
+ "noDiscussionDescription": "此合併請求尚無審查討論串或留言。",
+ "noFilesChangedDescription": "此合併請求沒有檔案變更。"
},
"fileStatus": {
"changed": "已變更",
@@ -2706,11 +2771,6 @@
"modified": "已修改",
"renamed": "已重新命名"
},
- "tabs": {
- "discussion": "討論",
- "files": "檔案",
- "overview": "總覽"
- },
"diff": {
"selectedTapToChange": "已選取 {{label}},點一下即可變更選取範圍",
"tapToComment": "{{label}},點一下即可留言",
@@ -2721,7 +2781,7 @@
"emptyLine": "(空白)"
},
"linkPasteClipboardEmpty": "剪貼簿沒有內容。",
- "linkPasteNotAPullRequest": "這不是 GitHub 提取請求連結。",
+ "linkPasteNotAPullRequest": "不是提取請求或合併請求連結",
"announce": {
"commentPosted": "留言已發佈",
"reviewSubmitted": "審查已送出",
@@ -2730,6 +2790,7 @@
"mutationError": {
"commentNotPosted": "無法發佈此留言。選取的行可能已變更,或 PR 已更新。",
"reviewNotSubmitted": "目前無法送出此審查。可能是 PR 已更新,或你正在審查自己的提取請求。",
+ "reviewNotSubmittedTerm": "此審查無法依現況提交。{{term}}可能已變更,或者你不能審查自己的{{term}}。",
"couldNotPostComment": "無法發佈留言。",
"couldNotSubmitReview": "無法送出審查。請檢查連線後再試一次。"
},
@@ -2737,6 +2798,7 @@
"couldNotReply": "無法回覆。",
"couldNotCompleteAction": "無法完成此操作。",
"mergeResultDefaultError": "GitHub 未完成合併。",
+ "mergeResultNotCompleted": "{{term}}未合併。檢查其狀態後重試。",
"ambiguous": "無法確認操作結果。請先檢查 PR,再試一次。",
"persistenceFailed": "無法記錄此操作。請稍後再試。",
"forbidden": "沒有執行此操作的權限。"
diff --git a/apps/mobile/src/i18n/locales/zu.json b/apps/mobile/src/i18n/locales/zu.json
index e7d45422bc..178c378ce6 100644
--- a/apps/mobile/src/i18n/locales/zu.json
+++ b/apps/mobile/src/i18n/locales/zu.json
@@ -36,6 +36,7 @@
"cost": "Izindleko",
"discard": "Lahla",
"findings": "Okutholakele",
+ "mergeRequest": "isicelo sokuhlanganisa",
"notConnected": "Ayixhunyiwe",
"notifications": "Izaziso",
"pullRequest": "i-PR",
@@ -340,10 +341,17 @@
"emptyDiffRow": "Umugqa womehluko ongenalutho"
},
"connectionExpired": "Ukuxhumana ne-GitHub kuphelelwe yisikhathi.",
+ "capabilities": {
+ "banner": {
+ "title": "Ayitholakali kulo mhlinzeki",
+ "accessibility": "Ayitholakali kulo mhlinzeki: {{reason}}"
+ }
+ },
"merge": {
"merge": "Ukuhlanganisa",
"mergeNow": "Hlanganisa manje",
"mergePullRequest": "Hlanganisa isicelo sokuhlanganisa",
+ "mergeTermTitle": "Hlanganisa {{term}}",
"enableAutoMerge": "Vula ukuhlanganisa okuzenzakalelayo",
"disableAutoMerge": "Vala ukuhlanganisa okuzenzakalelayo",
"autoMergeOn": "Ukuhlanganisa okuzenzakalelayo kuvuliwe",
@@ -362,9 +370,12 @@
"deleteBranchAfterMerge": "Susa igatsha ngemva kokuhlanganisa",
"noEnabledMethods": "Le nqolobane yekhodi ayinazo izindlela zokuhlanganisa ezivuliwe. Cela umphathi wayo avule ukuhlanganisa, ukuhlanganisa amarekhodi abe linye, noma ukubeka amarekhodi esisekelweni esisha.",
"confirmTitle": "Uyasihlanganisa isicelo sokuhlanganisa?",
+ "confirmTitleTerm": "Uyasihlanganisa {{term}}?",
"confirmMessage": "Lokhu kuzohlanganisa izinguquko zakho egatsheni eliyisisekelo.",
"enableAutoMergeConfirmTitle": "Uyavula ukuhlanganisa okuzenzakalelayo?",
"enableAutoMergeConfirmMessage": "I-GitHub izohlanganisa lesi sicelo sokuhlanganisa ngokuzenzakalelayo lapho zonke izihlolo ezidingekayo ziphumelela.",
+ "enableAutoMergeConfirmMessageTerm": "{{term}} luzohlanganiswa ngokuzenzakalelayo uma i-pipeline yaso iphumelela.",
+ "enableAutoMergeDescriptionTerm": "I-GitLab izohlanganisa {{term}} ngokuzenzakalelayo uma i-pipeline yaso iphumelela.",
"forbidden": "Awunayo imvume yokuhlanganisa lesi sicelo sokuhlanganisa.",
"cannotMerge": "Lesi sicelo sokuhlanganisa asikwazi ukuhlanganiswa njengoba sinjalo.",
"couldNotMerge": "Asikwazanga ukuhlanganisa isicelo sokuhlanganisa.",
@@ -375,7 +386,8 @@
},
"terminal": {
"alreadyMerged": "Sekuhlanganisiwe",
- "closed": "Lesi sicelo sokuhlanganisa sivaliwe"
+ "closed": "Lesi sicelo sokuhlanganisa sivaliwe",
+ "closedMergeRequest": "Lesi sicelo sokuhlanganisa sivaliwe"
},
"partialSuccessBanner": {
"body": "Asikwazanga ukususa igatsha: {{reason}}.",
@@ -401,6 +413,18 @@
"notMergeableTitle": "Lesi sicelo sokuhlanganisa asikakwazi ukuhlanganiswa",
"notMergeableDetail": "I-GitHub ibike isimo sokuhlanganiseka esingu-{{state}}."
},
+ "restrictions": {
+ "title": "Imikhawulo yokuhlanganisa",
+ "approvalsRequired_one": "Kudingeka imvume {{displayCount}}",
+ "approvalsRequired_other": "Kudingeka izimvume {{displayCount}}",
+ "pipelineMustSucceed": "I-pipeline kumele iphumelele ngaphambi kokuhlanganisa."
+ },
+ "providerBlocked": {
+ "failingPipeline": "I-pipeline iyehluleka kwi-commit yakamuva.",
+ "pendingPipeline": "I-pipeline isasebenza kwi-commit yakamuva.",
+ "permission": "Awunayo imvume yokuhlanganisa {{term}}.",
+ "draft": "Maka {{term}} njengesilungele ukubuyekezwa ngaphambi kokuhlanganisa."
+ },
"methodLabels": {
"merge": "Dala irekhodi lokuhlanganisa",
"squash": "Yenza irekhodi elilodwa bese uhlanganisa",
@@ -448,6 +472,7 @@
"acceptTerms": "Yamukela",
"replyBadRequest": "Le mpendulo ayikwazi ukuthunyelwa. Kungenzeka uchungechunge lwengxoxo lushintshile.",
"replyForbidden": "Awunayo imvume yokuphendula kulesi sicelo sokuhlanganisa.",
+ "replyForbiddenTerm": "Awunayo imvume yokuphendula ku-{{term}}.",
"moderation": {
"reportContent": {
"terminal": "La mazwana awakwazi ukubikwa.",
@@ -508,17 +533,19 @@
"reviewPullRequest": "Buyekeza isicelo sokuhlanganisa",
"headLine": "{{counts}} · irekhodi lakamuva {{sha}}",
"entry": {
- "eyebrow": "Vula isicelo sokuhlanganisa nge-URL.",
- "pastePrLink": "Namathisela isixhumanisi se-PR",
- "noRecentPrs": "Awekho ama-PR akamuva",
- "noRecentPrsDescription": "Namathisela isixhumanisi se-PR ngenhla ukuze uqale ukubuyekeza — i-PR izovela lapha ngokuzayo.",
+ "eyebrow": "Vula i-PR noma isicelo sokuhlanganisa nge-URL",
+ "pastePrLink": "Namathisela isixhumanisi se-PR noma sesicelo sokuhlanganisa",
+ "noRecentPrs": "Azikho izibuyekeza zakamuva",
+ "noRecentPrsDescription": "Namathisela isixhumanisi ngenhla ukuze uqale ukubuyekeza — sizovela lapha okwesinye isikhathi.",
"couldNotLoad": "Asikwazanga ukulayisha.",
"removeFromRecentsTitle": "Uyakususa kokusanda kubukwa?",
- "removeFromRecentsMessage": "Lesi sicelo sokuhlanganisa sizosuswa ohlwini lokusanda kubukwa.",
+ "removeFromRecentsMessage": "Lokhu kubuyekeza kuzosuswa ohlwini lwakho lwakamuva.",
"removeRecentAccessibility": "Susa {{repo}} ohlwini lokusanda kubukwa",
- "urlAccessibility": "I-URL yesicelo sokuhlanganisa se-GitHub",
- "clearLink": "Sula isixhumanisi sesicelo sokuhlanganisa",
- "pasteLink": "Namathisela isixhumanisi sesicelo sokuhlanganisa",
+ "urlAccessibility": "Faka i-URL ye-PR noma yesicelo sokuhlanganisa",
+ "urlPlaceholder": "I-URL ye-PR noma yesicelo sokuhlanganisa",
+ "openAccessibility": "Vula i-PR noma isicelo sokuhlanganisa",
+ "clearLink": "Sula isixhumanisi",
+ "pasteLink": "Namathisela isixhumanisi se-PR noma sesicelo sokuhlanganisa",
"open": "Vula"
},
"checks": {
@@ -567,9 +594,15 @@
"connect": {
"checkFailedTitle": "Asikwazanga ukuhlola ukuxhumana kwe-GitHub.",
"checkFailedMessage": "Isimo sokungena asitholakali kuze kuphele ukulayisha.",
+ "checkFailedTitleGitLab": "Asikwazanga ukuhlola ukuxhumana kwe-GitLab.",
+ "checkFailedTitleBitbucket": "Asikwazanga ukuhlola ukuxhumana kwe-Bitbucket.",
+ "providerCheckFailedMessage": "Isimo sokuxhumana asitholakali kuze kulayishwe lokhu.",
"reconnectTitle": "Xhuma kabusha i-GitHub",
"reconnectDescription": "Ukuxhumana kwakho kwe-GitHub kuhoxisiwe. Xhuma kabusha ukuze uqhubeke ubuyekeza izicelo zokuhlanganisa efonini.",
- "description": "Xhuma i-akhawunti yakho ye-GitHub ukuze ubuyekeze izicelo zokuhlanganisa efonini."
+ "description": "Xhuma i-akhawunti yakho ye-GitHub ukuze ubuyekeze izicelo zokuhlanganisa efonini.",
+ "gitlabDescription": "Xhuma i-akhawunti yakho ye-GitLab ukuze ubuyekeze izicelo zokuhlanganisa kufoni.",
+ "bitbucketDescription": "Xhuma i-Bitbucket kule nhlangano ukuze ubuyekeze ama-PR kufoni.",
+ "bitbucketOrgOnlyDescription": "Khetha inhlangano kuphrofayili yakho ukuze ubuyekeze ama-PR e-Bitbucket ayo."
},
"screen": {
"title": "#{{number}}",
@@ -591,7 +624,10 @@
},
"reconnectNotice": {
"title": "Ukuxhumana ne-GitHub kuphelelwe yisikhathi.",
- "message": "Ukuxhumana kwakho kwe-GitHub akusavumelekile. Bheka kabusha ukuxhumana kwakho — uzocelwa ukuthi uxhumane kabusha uma kudingeka."
+ "message": "Ukuxhumana kwakho kwe-GitHub akusavumelekile. Bheka kabusha ukuxhumana kwakho — uzocelwa ukuthi uxhumane kabusha uma kudingeka.",
+ "gitlabTitle": "Ukuxhumana ne-GitLab kuphelelwe yisikhathi.",
+ "bitbucketTitle": "Ukuxhumana ne-Bitbucket kuphelelwe yisikhathi.",
+ "providerMessage": "Ukuxhumana kwakho kwe-{{provider}} akusavumelekile. Bheka kabusha ukuxhumana kwakho — uzocelwa ukuthi uxhumane kabusha uma kudingeka."
},
"eventChips": {
"comment": "Phawula",
@@ -643,6 +679,21 @@
"files": "Amafayela",
"discussion": "Ingxoxo"
},
+ "terms": {
+ "pullRequest": "I-PR",
+ "mergeRequest": "Isicelo sokuhlanganisa",
+ "mergeRequestNumber": "!{{number}}",
+ "shareMergeRequest": "Yabelana ngesicelo sokuhlanganisa",
+ "viewOnProvider": "Buka ku-{{provider}}",
+ "mergeRequestUnavailable": "Isicelo sokuhlanganisa asitholakali",
+ "unavailableDescription": "Kungenzeka sisusiwe, noma awunayo imvume yokufinyelela kuso.",
+ "accessDeniedMergeRequest": "Awunayo imvume yokubuka lesi sicelo sokuhlanganisa.",
+ "couldNotLoadMergeRequest": "Asikwazanga ukulayisha isicelo sokuhlanganisa.",
+ "discussionAccessDenied": "Awunayo imvume yokubuka ingxoxo yalesi sicelo sokuhlanganisa.",
+ "discussionUnavailableMessage": "Kungenzeka lesi sicelo sokuhlanganisa sisusiwe.",
+ "noDiscussionDescription": "Azikho izingxoxo zokubuyekeza noma amazwana engxoxo kulesi sicelo sokuhlanganisa.",
+ "noFilesChangedDescription": "Lesi sicelo sokuhlanganisa asinazo izinguquko zamafayela."
+ },
"fileStatus": {
"modified": "Lishintshiwe",
"renamed": "Liqanjwe kabusha",
@@ -659,7 +710,7 @@
"emptyLine": "(okungenalutho)"
},
"linkPasteClipboardEmpty": "Ibhodi lokukopisha alinalutho.",
- "linkPasteNotAPullRequest": "Lesi akusona isixhumanisi sesicelo sokuhlanganisa se-GitHub.",
+ "linkPasteNotAPullRequest": "Lokhu akusiso isixhumanisi se-PR noma sesicelo sokuhlanganisa",
"announce": {
"commentPosted": "Amazwana athunyelwe",
"reviewSubmitted": "Ukubuyekeza kuthunyelwe",
@@ -668,6 +719,7 @@
"mutationError": {
"commentNotPosted": "La mazwana awakwazi ukuthunyelwa. Kungenzeka umugqa okhethiwe ushintshile noma i-PR ibuyekeziwe.",
"reviewNotSubmitted": "Lokhu kubuyekeza akukwazi ukuthunyelwa njengoba kunjalo. Kungenzeka i-PR ishintshile, noma awukwazi ukubuyekeza isicelo sakho sokuhlanganisa.",
+ "reviewNotSubmittedTerm": "Lokhu kubuyekeza akukwazi ukuthunyelwa kanjalo. Kungenzeka {{term}} kushintshe, noma awukwazi ukubuyekeza {{term}} wakho siqu.",
"couldNotPostComment": "Asikwazanga ukuthumela amazwana.",
"couldNotSubmitReview": "Asikwazanga ukuthumela ukubuyekeza. Hlola ukuxhumana kwakho bese uzama futhi."
},
@@ -675,6 +727,7 @@
"couldNotReply": "Asikwazanga ukuphendula.",
"couldNotCompleteAction": "Asikwazanga ukuqeda lesi senzo.",
"mergeResultDefaultError": "I-GitHub ayizange iqede ukuhlanganisa.",
+ "mergeResultNotCompleted": "{{term}} alihlanganisiwe. Bheka isimo salo bese uzama futhi.",
"ambiguous": "Asikwazanga ukuqinisekisa — hlola i-PR ngaphambi kokuzama futhi.",
"persistenceFailed": "Asikwazanga ukurekhoda lesi senzo. Sicela uzame futhi kamuva.",
"forbidden": "Lesi senzo asivunyelwe."
@@ -1988,11 +2041,31 @@
"retryConnection": "Zama ukuxhuma futhi"
},
"newSession": {
+ "recentlyUsed": "Okusetshenziswe muva nje",
+ "couldNotLoadGithubRepositories": "Asikwazanga ukulayisha izinqolobane zekhodi ze-GitHub.",
+ "couldNotLoadGitlabRepositories": "Asikwazanga ukulayisha izinqolobane zekhodi ze-GitLab.",
+ "couldNotLoadBitbucketRepositories": "Asikwazanga ukulayisha izinqolobane zekhodi ze-Bitbucket.",
"connectGithubDescription": "Xhuma i-GitHub esipheqululini sakho, bese ubuyela lapha ukuze ukhethe inqolobane yekhodi.",
+ "connectGitlabDescription": "Xhuma i-GitLab esipheqululini sakho, bese ubuyela lapha ukuze ukhethe inqolobane yekhodi.",
+ "connectBitbucketDescription": "Xhuma i-Bitbucket esipheqululini sakho, bese ubuyela lapha ukuze ukhethe inqolobane yekhodi.",
"openGithub": "Vula i-GitHub",
+ "openGitlab": "Vula i-GitLab",
+ "openBitbucket": "Vula i-Bitbucket",
"refreshRepositories": "Vuselela izinqolobane zekhodi",
"githubConnected": "I-GitHub ixhunyiwe",
+ "gitlabConnected": "I-GitLab ixhunyiwe",
"noRepositoriesVisible": "Azikho izinqolobane zekhodi ezibonakalayo. Hlola imvume yohlelo lokusebenza lwe-Kilo ku-GitHub yokufinyelela ezinqolobaneni zekhodi, bese uvuselela.",
+ "noRepositoriesVisibleGitlab": "Azikho izinqolobane zekhodi ezibonakalayo. Hlola imvume yokufinyelela ezinqolobaneni zekhodi ku-GitLab, bese uvuselela.",
+ "noRepositoriesVisibleBitbucket": "Azikho izinqolobane zekhodi ezibonakalayo. Hlola imvume yokufinyelela ezinqolobaneni zekhodi ku-Bitbucket, bese uvuselela.",
+ "bitbucketOrganizationsOnly": "I-Bitbucket itholakala ezinhlanganweni kuphela.",
+ "branchPickerTitle": "Khetha igatsha",
+ "branchDefault": "Okuzenzakalelayo",
+ "branchAccessibility": "Igatsha: {{label}}",
+ "branchLoading": "Kulayishwa amagatsha",
+ "branchLoadError": "Kwehlulekile ukulayisha amagatsha",
+ "branchUnavailable": "Amagatsha awatholakali kule nqolobane yekhodi. Hlola ukufinyelela kwakho kumhlinzeki, bese ukhetha enye inqolobane yekhodi.",
+ "branchEmpty": "Akukho gatsha elitholakalayo",
+ "branchPlaceholder": "Khetha igatsha",
"runOnWithTarget": "Qalisa ku: {{target}}",
"environment": "Indawo yokusebenza",
"couldNotLoadEnvironment": "Asikwazanga ukulayisha indawo yakho yokusebenza.",
@@ -2013,24 +2086,13 @@
"couldNotRefreshRepositories": "Asikwazanga ukuvuselela izinqolobane zekhodi. Sicela uzame futhi.",
"discardDraftTitle": "Uyafuna ukulahla okusalungiswa?",
"discardDraftMessage": "Isicelo sakho sizolahleka.",
+ "discardWithUploadsMessage": "Isicelo sakho namafayela alayishiwe anganamathiselwe emilayezweni ethunyelwe kuzosuswa.",
"discardFailed": "Asikwazanga ukulahla okusalungiswa. Sicela uzame futhi.",
"remoteHint": "Qalisa `kilo remote` kukhompyutha yakho, noma `/remote` eseshini ye-CLI esebenzayo, ukuze ulawule inqubo ye-kilo yasendaweni.",
- "connectBitbucketDescription": "Xhuma i-Bitbucket esipheqululini sakho, bese ubuyela lapha ukuze ukhethe inqolobane yekhodi.",
- "connectGitlabDescription": "Xhuma i-GitLab esipheqululini sakho, bese ubuyela lapha ukuze ukhethe inqolobane yekhodi.",
- "couldNotLoadBitbucketRepositories": "Asikwazanga ukulayisha izinqolobane zekhodi ze-Bitbucket.",
- "couldNotLoadGithubRepositories": "Asikwazanga ukulayisha izinqolobane zekhodi ze-GitHub.",
- "couldNotLoadGitlabRepositories": "Asikwazanga ukulayisha izinqolobane zekhodi ze-GitLab.",
- "gitlabConnected": "I-GitLab ixhunyiwe",
- "noRepositoriesVisibleBitbucket": "Azikho izinqolobane zekhodi ezibonakalayo. Hlola imvume yokufinyelela ezinqolobaneni zekhodi ku-Bitbucket, bese uvuselela.",
- "noRepositoriesVisibleGitlab": "Azikho izinqolobane zekhodi ezibonakalayo. Hlola imvume yokufinyelela ezinqolobaneni zekhodi ku-GitLab, bese uvuselela.",
- "openBitbucket": "Vula i-Bitbucket",
- "openGitlab": "Vula i-GitLab",
- "recentlyUsed": "Okusetshenziswe muva nje",
"continueFrom": "Kuqhutshekwa neseshini ethi {{title}}.",
"importingSession": "Iseshini iyangeniswa",
"cliCannotContinue": "Le CLI ayikwazi ukuqhubeka neseshini. Khetha i-Cloud Agent noma enye i-CLI.",
- "importFailed": "Asikwazanga ukungenisa le seshini.",
- "discardWithUploadsMessage": "Isicelo sakho namafayela alayishiwe anganamathiselwe emilayezweni ethunyelwe kuzosuswa."
+ "importFailed": "Asikwazanga ukungenisa le seshini."
},
"partRenderer": {
"updatedFileCount_one": "Kubuyekezwe ifayela eli-{{displayCount}}.",
diff --git a/apps/mobile/src/lib/intl-cache-hermes-surface.test.ts b/apps/mobile/src/lib/intl-cache-hermes-surface.test.ts
index 471579bc78..6f8b2af2ea 100644
--- a/apps/mobile/src/lib/intl-cache-hermes-surface.test.ts
+++ b/apps/mobile/src/lib/intl-cache-hermes-surface.test.ts
@@ -21,10 +21,11 @@ describe('Hermes Intl surface', () => {
vi.resetModules();
});
- // The formatters and i18next are imported inside the test, so their transform
- // runs on the test clock: under the parallel full-suite load this body takes
- // several seconds against the 5 s default (it formats all 86 languages), so
- // it carries its own budget. Same sizing as auth-context.test.tsx.
+ // Every supported language runs the full polyfill path and loads its locale
+ // data. That is the point of the guard, and it costs seconds on a loaded CI
+ // box — well past the 5s default. The formatters and i18next are imported
+ // inside the test, so their transform runs on the test clock too: this body
+ // carries its own budget. Same sizing as auth-context.test.tsx.
it(
'formats every supported language and pluralizes for i18next',
async () => {
diff --git a/apps/mobile/src/lib/picker-bridge.ts b/apps/mobile/src/lib/picker-bridge.ts
index 04dbbe3344..ee13ed4873 100644
--- a/apps/mobile/src/lib/picker-bridge.ts
+++ b/apps/mobile/src/lib/picker-bridge.ts
@@ -75,6 +75,20 @@ export type RepoPickerBridge = {
onSelect: (repo: string) => void;
};
+/**
+ * Bridge for the new-session branch picker. `onSelect` receives the picked
+ * branch NAME; the trigger's closure decides default-vs-override, so the
+ * route stays display-only.
+ */
+export type BranchPickerBridge = {
+ branches: string[];
+ /** The provider's default branch; its row carries the "Default" label. */
+ defaultBranch: string | null;
+ /** The branch the trigger row shows as selected (override or default). */
+ selectedBranch: string | null;
+ onSelect: (branch: string) => void;
+};
+
/** The complete normalized router row, including all advertised capabilities. */
export type InstancePickerInstance =
inferRouterOutputs['activeSessions']['listInstances']['instances'][number];
diff --git a/apps/mobile/src/lib/pr-review/diff/pr-diff-list-bottom-padding.test.ts b/apps/mobile/src/lib/pr-review/diff/pr-diff-list-bottom-padding.test.ts
deleted file mode 100644
index 32b8ebc26b..0000000000
--- a/apps/mobile/src/lib/pr-review/diff/pr-diff-list-bottom-padding.test.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { describe, expect, it } from 'vitest';
-
-import {
- PR_DIFF_FLOATING_ACTIONS_FALLBACK_HEIGHT,
- PR_DIFF_LIST_FOOTER_GAP,
- prDiffListBottomPadding,
-} from '@/lib/pr-review/diff/pr-diff-list-bottom-padding';
-
-const FALLBACK = PR_DIFF_FLOATING_ACTIONS_FALLBACK_HEIGHT + PR_DIFF_LIST_FOOTER_GAP;
-
-describe('prDiffListBottomPadding', () => {
- it('returns fallback + gap when barHeight is null', () => {
- expect(prDiffListBottomPadding(null)).toBe(120);
- });
-
- it('returns fallback + gap when barHeight is zero', () => {
- expect(prDiffListBottomPadding(0)).toBe(120);
- });
-
- it('returns fallback + gap when barHeight is negative', () => {
- expect(prDiffListBottomPadding(-5)).toBe(120);
- });
-
- it('returns rounded height + gap for a positive integer', () => {
- // 80 + 12
- expect(prDiffListBottomPadding(80)).toBe(92);
- });
-
- it('rounds a decimal height down to the nearest integer', () => {
- // round(71.2) + 12 = 71 + 12
- expect(prDiffListBottomPadding(71.2)).toBe(83);
- });
-
- it('rounds a decimal height up to the nearest integer', () => {
- // round(71.8) + 12 = 72 + 12
- expect(prDiffListBottomPadding(71.8)).toBe(84);
- });
-
- it('grows with a taller bar', () => {
- // 120 + 12
- expect(prDiffListBottomPadding(120)).toBe(132);
- // 200 + 12
- expect(prDiffListBottomPadding(200)).toBe(212);
- });
-
- it('has the correct exported constants', () => {
- expect(PR_DIFF_LIST_FOOTER_GAP).toBe(12);
- expect(PR_DIFF_FLOATING_ACTIONS_FALLBACK_HEIGHT).toBe(108);
- expect(FALLBACK).toBe(120);
- });
-});
diff --git a/apps/mobile/src/lib/pr-review/diff/pr-diff-list-bottom-padding.ts b/apps/mobile/src/lib/pr-review/diff/pr-diff-list-bottom-padding.ts
deleted file mode 100644
index b8a91a6c45..0000000000
--- a/apps/mobile/src/lib/pr-review/diff/pr-diff-list-bottom-padding.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-export const PR_DIFF_LIST_FOOTER_GAP = 12;
-export const PR_DIFF_FLOATING_ACTIONS_FALLBACK_HEIGHT = 108;
-
-/**
- * Returns the bottom padding for the diff FlashList so the last item clears
- * the floating action bar.
- *
- * When the bar height is unknown, zero, or negative the function returns
- * `FALLBACK_HEIGHT + GAP`. Otherwise it returns the rounded height plus
- * the gap.
- */
-export function prDiffListBottomPadding(floatingActionsHeight: number | null): number {
- if (floatingActionsHeight === null || floatingActionsHeight <= 0) {
- return PR_DIFF_FLOATING_ACTIONS_FALLBACK_HEIGHT + PR_DIFF_LIST_FOOTER_GAP;
- }
- return Math.round(floatingActionsHeight) + PR_DIFF_LIST_FOOTER_GAP;
-}
diff --git a/apps/mobile/src/lib/pr-review/diff/pr-review-file-list-state.ts b/apps/mobile/src/lib/pr-review/diff/pr-review-file-list-state.ts
index 81ce0c02b3..0b246d4b3f 100644
--- a/apps/mobile/src/lib/pr-review/diff/pr-review-file-list-state.ts
+++ b/apps/mobile/src/lib/pr-review/diff/pr-review-file-list-state.ts
@@ -24,28 +24,44 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { classifyPrReviewQueryState } from '@/lib/pr-review/classify-pr-review-query-state';
import { flattenFilePages } from '@/lib/pr-review/diff/dedupe-file-pages';
import { PR_REVIEW_MAX_PAGES } from '@/lib/pr-review/diff/pr-review-file-types';
-import { getViewedFiles, toggleViewedFile } from '@/lib/pr-review/viewed-files';
+import { buildPrFilesQueryOptions } from '@/lib/pr-review/provider-pr-queries';
+import {
+ githubPrRef,
+ type ProviderPrScope,
+ useProviderPrScope,
+} from '@/lib/pr-review/provider-pr-ref';
+import {
+ getViewedFiles,
+ toggleViewedFile,
+ type ViewedFilesRef,
+} from '@/lib/pr-review/viewed-files';
import { withInfiniteRetention } from '@/lib/query/infinite-retention';
import { useTRPC } from '@/lib/trpc';
/**
* Build the file-list infinite-query options. Kept as a pure builder so the
* retention bound is testable without mounting the hook.
+ *
+ * The provider is decided by `scope`; without one the caller is on the
+ * GitHub route and the options are the ones that route always used.
*/
export function buildPrReviewFileListQueryOptions(
trpc: ReturnType,
- args: { owner: string; repo: string; number: number; enabled: boolean }
+ args: {
+ owner: string;
+ repo: string;
+ number: number;
+ enabled: boolean;
+ scope?: ProviderPrScope;
+ }
) {
const { owner, repo, number, enabled } = args;
+ const scope = args.scope ?? {
+ ref: githubPrRef(owner, repo, number),
+ organizationId: null,
+ };
return withInfiniteRetention(
- trpc.githubPrReview.listFiles.infiniteQueryOptions(
- { owner, repo, number },
- {
- staleTime: 30_000,
- enabled,
- getNextPageParam: lastPage => lastPage.nextCursor ?? undefined,
- }
- ),
+ buildPrFilesQueryOptions(trpc, scope, enabled),
// Cap at the server's page ceiling so we never request page 61.
// 60 pages × 100/page = 6,000 files, which is well above the
// 3,000 truncation banner so fetch-to-completion still has
@@ -62,8 +78,9 @@ export function usePrReviewFileListQuery(args: {
}) {
const { owner, repo, number, enabled } = args;
const trpc = useTRPC();
+ const scope = useProviderPrScope({ owner, repo, number });
const query = useInfiniteQuery(
- buildPrReviewFileListQueryOptions(trpc, { owner, repo, number, enabled })
+ buildPrReviewFileListQueryOptions(trpc, { owner, repo, number, enabled, scope })
);
const errorState = query.error ? classifyPrReviewQueryState(query.error) : null;
@@ -87,12 +104,13 @@ export function usePrReviewFileListQuery(args: {
}
/**
- * Subscribes the viewed-files store for a specific PR (keyed by
- * `owner/repo#number` + `headSha`). Returns the current viewed path
- * set plus a `toggle` callback that flips a single path. The
- * underlying store is a single SecureStore key shared across all
- * PRs, so the hook re-reads on toggle rather than maintaining a
- * long-lived in-memory cache.
+ * Subscribes the viewed-files store for a specific PR (keyed by the ref's
+ * provider-scoped identity + `headSha`, so a GitLab MR and a same-numbered
+ * GitHub PR — or one project on two GitLab instances — never share a set;
+ * identity rule 17). Returns the current viewed path set plus a `toggle`
+ * callback that flips a single path. The underlying store is a single
+ * SecureStore key shared across all PRs, so the hook re-reads on toggle
+ * rather than maintaining a long-lived in-memory cache.
*/
// Module-level notifier so every mounted viewed-files hook (e.g. the diff list
// AND the file navigator sheet mounted over it) re-reads after any toggle,
@@ -105,15 +123,7 @@ function notifyViewedChange(): void {
}
}
-export function usePrReviewViewedFiles(
- ref: {
- owner: string;
- repo: string;
- number: number;
- },
- headSha: string
-) {
- const { owner, repo, number } = ref;
+export function usePrReviewViewedFiles(ref: ViewedFilesRef, headSha: string) {
const [paths, setPaths] = useState([]);
const [isLoading, setIsLoading] = useState(true);
@@ -123,7 +133,7 @@ export function usePrReviewViewedFiles(
async function load() {
try {
- const next = await getViewedFiles({ owner, repo, number }, headSha);
+ const next = await getViewedFiles(ref, headSha);
if (!cancelled) {
setPaths(next);
setIsLoading(false);
@@ -147,7 +157,7 @@ export function usePrReviewViewedFiles(
cancelled = true;
viewedChangeListeners.delete(onChange);
};
- }, [owner, repo, number, headSha]);
+ }, [ref, headSha]);
const toggle = useCallback(
async (path: string) => {
@@ -159,11 +169,11 @@ export function usePrReviewViewedFiles(
}
return [...previous, path];
});
- await toggleViewedFile({ owner, repo, number, headSha, path });
+ await toggleViewedFile({ ...ref, headSha, path });
// Notify other mounted instances (they re-read the durable store).
notifyViewedChange();
},
- [owner, repo, number, headSha]
+ [ref, headSha]
);
// Stabilize identities for downstream memos (`items`, `renderItem`). A fresh
diff --git a/apps/mobile/src/lib/pr-review/diff/use-pr-diff-context-loader.test.ts b/apps/mobile/src/lib/pr-review/diff/use-pr-diff-context-loader.test.ts
new file mode 100644
index 0000000000..8ed28bd49a
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/diff/use-pr-diff-context-loader.test.ts
@@ -0,0 +1,60 @@
+import { describe, expect, it, vi } from 'vitest';
+
+import { githubPrRef } from '@/lib/pr-review/provider-pr-ref';
+
+import { contextScopeForItem } from './use-pr-diff-context-loader';
+
+// The loader module reaches the real tRPC client through `@/lib/trpc`;
+// `contextScopeForItem` is pure, so only the module-load chain needs a mock.
+vi.mock('@/lib/trpc', () => ({ useTRPC: vi.fn() }));
+
+const fallback = { owner: 'octocat', repo: 'hello', headSha: 'headsha' };
+
+describe('contextScopeForItem', () => {
+ const github = { ref: githubPrRef('octocat', 'hello', 7), organizationId: null };
+
+ it('reads a GitHub cross-repo row from the row own repository', () => {
+ const target = contextScopeForItem(
+ github,
+ { owner: 'forker', repo: 'hello', ref: 'forksha' },
+ fallback
+ );
+ expect(target.scope.ref).toEqual(githubPrRef('forker', 'hello', 7));
+ expect(target.ref).toBe('forksha');
+ });
+
+ it('falls back to the screen repository and head sha when the row carries none', () => {
+ const target = contextScopeForItem(github, { owner: '', repo: '', ref: '' }, fallback);
+ expect(target.scope.ref).toEqual(githubPrRef('octocat', 'hello', 7));
+ expect(target.ref).toBe('headsha');
+ });
+
+ it('keeps a GitLab merge request on its own project', () => {
+ const scope = {
+ ref: { platform: 'gitlab' as const, projectPath: 'group/sub/repo', mrIid: 12 },
+ organizationId: null,
+ };
+ const target = contextScopeForItem(
+ scope,
+ { owner: 'forker', repo: 'hello', ref: '' },
+ fallback
+ );
+ expect(target.scope).toBe(scope);
+ expect(target.ref).toBe('headsha');
+ });
+
+ it('keeps a Bitbucket pull request on its own repository and organization', () => {
+ const scope = {
+ ref: { platform: 'bitbucket' as const, workspace: 'acme', repoSlug: 'api', prId: 42 },
+ organizationId: 'org-1',
+ };
+ const target = contextScopeForItem(
+ scope,
+ { owner: 'other', repo: 'other', ref: 'sha2' },
+ fallback
+ );
+ expect(target.scope.ref).toEqual(scope.ref);
+ expect(target.scope.organizationId).toBe('org-1');
+ expect(target.ref).toBe('sha2');
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/diff/use-pr-diff-context-loader.ts b/apps/mobile/src/lib/pr-review/diff/use-pr-diff-context-loader.ts
index 85d80dcfe3..44dc81cf0e 100644
--- a/apps/mobile/src/lib/pr-review/diff/use-pr-diff-context-loader.ts
+++ b/apps/mobile/src/lib/pr-review/diff/use-pr-diff-context-loader.ts
@@ -12,6 +12,13 @@ import {
setContextLines,
} from '@/lib/pr-review/diff/pr-diff-list-items';
import { buildContextWindow } from '@/lib/pr-review/diff/context-window';
+import { buildPrFileLinesQueryOptions } from '@/lib/pr-review/provider-pr-queries';
+import {
+ githubPrRef,
+ providerPrNumber,
+ type ProviderPrScope,
+ useProviderPrScope,
+} from '@/lib/pr-review/provider-pr-ref';
import { useTRPC } from '@/lib/trpc';
import { readTrpcErrorField } from '@/lib/trpc-error';
@@ -26,6 +33,38 @@ type UsePrDiffContextLoaderResult = {
) => void;
};
+/**
+ * The scope one expand-separator reads its context under.
+ *
+ * A GitHub diff row can point at another repository (a cross-repo head), so
+ * the row's own `owner`/`repo` win there. A GitLab merge request and a
+ * Bitbucket pull request are always one project, so the screen scope stands
+ * and only the git ref falls back to the head sha.
+ */
+export type PrDiffContextTarget = { scope: ProviderPrScope; ref: string };
+
+export function contextScopeForItem(
+ scope: ProviderPrScope,
+ itemRef: { owner: string; repo: string; ref: string },
+ fallback: { owner: string; repo: string; headSha: string }
+): PrDiffContextTarget {
+ const ref = itemRef.ref || fallback.headSha;
+ if (scope.ref.platform !== 'github') {
+ return { scope, ref };
+ }
+ return {
+ scope: {
+ ...scope,
+ ref: githubPrRef(
+ itemRef.owner || fallback.owner,
+ itemRef.repo || fallback.repo,
+ providerPrNumber(scope.ref)
+ ),
+ },
+ ref,
+ };
+}
+
export function usePrDiffContextLoader(args: {
owner: string;
repo: string;
@@ -34,6 +73,9 @@ export function usePrDiffContextLoader(args: {
const { owner, repo, headSha } = args;
const queryClient = useQueryClient();
const trpc = useTRPC();
+ // The loader has no PR number of its own; `getFileLines` is keyed by repo
+ // and git ref, so the number only matters as part of the provider identity.
+ const scope = useProviderPrScope({ owner, repo, number: 1 });
const [expandedContext, setExpandedContext] = useState<
Record>
>({});
@@ -64,20 +106,16 @@ export function usePrDiffContextLoader(args: {
status: 'loading',
})
);
+ const target = contextScopeForItem(scope, item.ref, { owner, repo, headSha });
void (async () => {
try {
const result = await queryClient.fetchQuery(
- trpc.githubPrReview.getFileLines.queryOptions(
- {
- owner: item.ref.owner || owner,
- repo: item.ref.repo || repo,
- ref: item.ref.ref || headSha,
- path: item.filePath,
- startLine,
- endLine,
- },
- { staleTime: 5 * 60_000, gcTime: 10 * 60_000 }
- )
+ buildPrFileLinesQueryOptions(trpc, target.scope, {
+ ref: target.ref,
+ path: item.filePath,
+ startLine,
+ endLine,
+ })
);
if (result.lines.length === 0) {
setExpandedContext(prev =>
@@ -113,7 +151,7 @@ export function usePrDiffContextLoader(args: {
}
})();
},
- [owner, repo, headSha, queryClient, trpc]
+ [owner, repo, headSha, queryClient, scope, trpc]
);
return { expandedContext, setExpandedContext, handleLoadContext };
diff --git a/apps/mobile/src/lib/pr-review/diff/use-pr-review-viewed-files.mounted.test.tsx b/apps/mobile/src/lib/pr-review/diff/use-pr-review-viewed-files.mounted.test.tsx
new file mode 100644
index 0000000000..070273ab07
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/diff/use-pr-review-viewed-files.mounted.test.tsx
@@ -0,0 +1,92 @@
+/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (same pattern as use-fetch-to-completion.mounted.test.tsx) */
+// s6 (identity rule 17): the viewed-files hook is provider-scoped end to
+// end. The store folds `providerPrRefKey` into the durable key only when it
+// receives the ref, so a GitLab MR and a same-numbered GitHub PR — or one
+// project on two GitLab instances — never share a viewed set. These tests
+// pin the hook's pass-through; the store's keying itself is covered in
+// `viewed-files.test.ts`.
+
+import { createElement } from 'react';
+import { act } from 'react-test-renderer';
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+
+import { usePrReviewViewedFiles } from '@/lib/pr-review/diff/pr-review-file-list-state';
+import { type ProviderPrRef } from '@/lib/pr-review/provider-pr-ref';
+import { renderWithProviders } from '@/test/render-with-providers';
+
+vi.mock('@/lib/trpc', () => ({
+ useTRPC: () => ({
+ githubPrReview: {
+ listFiles: {
+ infiniteQueryOptions: () => ({}),
+ },
+ },
+ }),
+}));
+
+const storeMocks = vi.hoisted(() => ({
+ getViewedFiles: vi.fn(),
+ toggleViewedFile: vi.fn(),
+}));
+
+vi.mock('@/lib/pr-review/viewed-files', () => storeMocks);
+
+const GITLAB_REF: ProviderPrRef = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ instanceHint: 'https://gitlab.example.com',
+};
+
+type ViewedRefArg = Parameters[0];
+
+type ProbeHolder = {
+ current: { isViewed: (path: string) => boolean; toggle: (path: string) => Promise } | null;
+};
+
+function Probe({ viewRef, holder }: { viewRef: ViewedRefArg; holder: ProbeHolder }) {
+ holder.current = usePrReviewViewedFiles(viewRef, 'sha-1');
+ return null;
+}
+
+async function mountProbe(viewRef: ViewedRefArg) {
+ const holder: ProbeHolder = { current: null };
+ await renderWithProviders(createElement(Probe, { viewRef, holder }));
+ await act(async () => {
+ await Promise.resolve();
+ });
+ if (!holder.current) {
+ throw new Error('probe did not render');
+ }
+ return holder.current;
+}
+
+beforeEach(() => {
+ storeMocks.getViewedFiles.mockReset().mockResolvedValue([] as string[]);
+ storeMocks.toggleViewedFile.mockReset().mockResolvedValue(undefined);
+});
+
+describe('usePrReviewViewedFiles provider refs (s6)', () => {
+ it('reads the viewed set under the provider ref, not the bare triple', async () => {
+ await mountProbe(GITLAB_REF);
+ expect(storeMocks.getViewedFiles).toHaveBeenCalledWith(GITLAB_REF, 'sha-1');
+ });
+
+ it('writes the toggle under the provider ref, folding the key identity', async () => {
+ const viewed = await mountProbe(GITLAB_REF);
+ await act(async () => {
+ await viewed.toggle('src/a.ts');
+ });
+ expect(storeMocks.toggleViewedFile).toHaveBeenCalledWith({
+ ...GITLAB_REF,
+ headSha: 'sha-1',
+ path: 'src/a.ts',
+ });
+ });
+
+ it('keeps the legacy GitHub triple working byte-for-byte', async () => {
+ const legacy = { owner: 'octocat', repo: 'hello-world', number: 7 };
+ await mountProbe(legacy);
+ expect(storeMocks.getViewedFiles).toHaveBeenCalledWith(legacy, 'sha-1');
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/discussion/use-pr-review-discussion-threads.ts b/apps/mobile/src/lib/pr-review/discussion/use-pr-review-discussion-threads.ts
index e176d04108..3d8963bbd6 100644
--- a/apps/mobile/src/lib/pr-review/discussion/use-pr-review-discussion-threads.ts
+++ b/apps/mobile/src/lib/pr-review/discussion/use-pr-review-discussion-threads.ts
@@ -26,27 +26,33 @@ import { useMemo } from 'react';
import { classifyPrReviewQueryState } from '@/lib/pr-review/classify-pr-review-query-state';
import { type ConversationComment } from '@/lib/pr-review/discussion/review-discussion-types';
+import {
+ buildPrThreadsQueryOptions,
+ normalizePrThreadsPages,
+} from '@/lib/pr-review/provider-pr-queries';
+import {
+ githubPrRef,
+ providerPrRefKey,
+ type ProviderPrScope,
+ useProviderPrScope,
+} from '@/lib/pr-review/provider-pr-ref';
import { withInfiniteRetention } from '@/lib/query/infinite-retention';
import { useTRPC } from '@/lib/trpc';
/**
* Build the discussion-threads infinite-query options. Kept as a pure builder
* so the retention bound is testable without mounting the hook.
+ *
+ * The provider is decided by `scope`; without one the caller is on the GitHub
+ * route and this is the `listReviewThreads` query that route always ran.
*/
export function buildPrReviewDiscussionThreadsQueryOptions(
trpc: ReturnType,
- args: { owner: string; repo: string; number: number }
+ args: { owner: string; repo: string; number: number; scope?: ProviderPrScope }
) {
const { owner, repo, number } = args;
- return withInfiniteRetention(
- trpc.githubPrReview.listReviewThreads.infiniteQueryOptions(
- { owner, repo, number },
- {
- staleTime: 15_000,
- getNextPageParam: lastPage => lastPage.nextCursor ?? undefined,
- }
- )
- );
+ const scope = args.scope ?? { ref: githubPrRef(owner, repo, number), organizationId: null };
+ return withInfiniteRetention(buildPrThreadsQueryOptions(trpc, scope));
}
/**
@@ -66,15 +72,12 @@ export function retainConversation(
return first && first.length > 0 ? first : retained;
}
-// Module-level retention store. Keyed by the PR identity so the retained
-// first-page conversation survives the tab's unmount/remount cycle, which
-// a component ref cannot.
+// Module-level retention store. Keyed by the provider ref so the retained
+// first-page conversation survives the tab's unmount/remount cycle (which a
+// component ref cannot) and so two same-named repositories on different
+// providers never share one entry.
const conversationRetention = new Map();
-function conversationRetentionKey(args: { owner: string; repo: string; number: number }): string {
- return `${args.owner}/${args.repo}#${args.number}`;
-}
-
/**
* Read and update the retained first-page conversation for one PR.
*
@@ -102,8 +105,9 @@ export function usePrReviewDiscussionThreads(args: {
}) {
const { owner, repo, number } = args;
const trpc = useTRPC();
+ const scope = useProviderPrScope({ owner, repo, number });
const query = useInfiniteQuery(
- buildPrReviewDiscussionThreadsQueryOptions(trpc, { owner, repo, number })
+ buildPrReviewDiscussionThreadsQueryOptions(trpc, { owner, repo, number, scope })
);
const hasLoadedPages = (query.data?.pages.length ?? 0) > 0;
@@ -119,18 +123,19 @@ export function usePrReviewDiscussionThreads(args: {
// the tab (full re-sort of the entire loaded set).
// Memoized so identity changes only when page data changes (RQ
// structural sharing keeps `pages` stable across unrelated re-renders).
- const pages = query.data?.pages;
- const threads = useMemo(() => (pages ?? []).flatMap(page => page.threads), [pages]);
+ // Provider pages arrive in the provider's own shape; normalizing here is
+ // what lets the tab render one list for all three providers.
+ const platform = scope.ref.platform;
+ const rawPages = query.data?.pages;
+ const pages = useMemo(() => normalizePrThreadsPages(platform, rawPages), [platform, rawPages]);
+ const threads = useMemo(() => pages.flatMap(page => page.threads), [pages]);
// Conversation comments live only on the first page. Retention trims the
// oldest page once the bound is exceeded, which would erase the comments if
// we read `pages[0]` directly. Keep the last non-empty conversation in a
// module-level store keyed by the PR identity so it survives both the trim
// and the tab's unmount/remount cycle.
- const conversation = retainConversationAcrossMounts(
- conversationRetentionKey({ owner, repo, number }),
- pages
- );
+ const conversation = retainConversationAcrossMounts(providerPrRefKey(scope.ref), pages);
return {
query,
diff --git a/apps/mobile/src/lib/pr-review/discussion/use-review-discussion-mutations.test.ts b/apps/mobile/src/lib/pr-review/discussion/use-review-discussion-mutations.test.ts
index dc26f01ad4..d95f5dc305 100644
--- a/apps/mobile/src/lib/pr-review/discussion/use-review-discussion-mutations.test.ts
+++ b/apps/mobile/src/lib/pr-review/discussion/use-review-discussion-mutations.test.ts
@@ -1,22 +1,32 @@
-// P1-A-08c wiring tests for `useReplyToCommentMutation`.
+// P1-A-08c + s6 wiring tests for the discussion mutations.
//
// Replies are NOT optimistic (per the S7b contract): the comment is
// appended only after the server confirms. These tests assert the HOOK
-// WIRING — `mutationFn` delegates to
-// `trpcClient.githubPrReview.replyToComment.mutate`, the hoisted operation
-// key is merged into the input, and the key rotation policy (real
+// WIRING — `mutationFn` delegates to the matching
+// `trpcClient...mutate`, the hoisted operation key is
+// merged into the input, and the key rotation policy (real
// `isPrMutationRetryable` + `mapPrOperationError`) runs inside
// `mutationFn`. Only `useHoistedOperationKey` is mocked (it holds React
// ref state that needs a mounted renderer, covered by
// `operation-key.mounted.test.tsx`).
-/* eslint-disable max-lines -- one file for the reply wiring, the resolve/unresolve/reaction generation guard + chainSave/scope serialization, and the real-MutationCache scope.id serialization suites */
+//
+// s6: the GitHub arms stay byte-identical. The provider arms route the
+// same intents through `providerReview.*` with the s1 provider identity
+// (GitLab keys fold `instanceHint`, Bitbucket folds `workspace`), reply
+// and resolve carry the ledger key, and the optimistic resolve flips the
+// provider-shaped cache (`resolved`, not `isResolved`). Reactions stay
+// GitHub-only: no provider exposes them through the seam.
+/* eslint-disable max-lines -- one file for the reply wiring, the resolve/unresolve/reaction generation guard + chainSave/scope serialization, the real-MutationCache scope.id serialization suite, and the s6 provider arms */
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import type * as OperationKeyModule from '@/lib/operation-key';
import type * as ReactQuery from '@tanstack/react-query';
import { prIntentFingerprint } from '@kilocode/app-shared/pr-review';
+import type * as ProviderPrRefModule from '@/lib/pr-review/provider-pr-ref';
+import { type ProviderPrRef, type ProviderPrTriple } from '@/lib/pr-review/provider-pr-ref';
import {
+ applyProviderResolveToggle,
useAddReactionMutation,
useRemoveReactionMutation,
useReplyToCommentMutation,
@@ -38,6 +48,20 @@ vi.mock('@/lib/operation-key', async importOriginal => {
return { ...actual, useHoistedOperationKey: () => hoistedKeys };
});
+// See the review-mutations test: the scope context hook is replaced by a
+// settable override so the hooks run without a renderer. No-arg calls
+// keep the pre-s6 GitHub fallback.
+let scopeOverride: { ref: ProviderPrRef; organizationId: string | null } | null = null;
+
+vi.mock('@/lib/pr-review/provider-pr-ref', async importOriginal => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ useProviderPrScope: (fallback: ProviderPrTriple) =>
+ scopeOverride ?? { ref: { platform: 'github', ...fallback }, organizationId: null },
+ };
+});
+
type MutationOptions = {
mutationFn?: (vars: unknown) => Promise;
onMutate?: (vars: unknown) => Promise | unknown;
@@ -60,6 +84,9 @@ let lastCapturedOptions: MutationOptions | null = null;
const replyMutateMock = vi.fn();
const resolveMutateMock = vi.fn();
const unresolveMutateMock = vi.fn();
+const providerReplyMutateMock = vi.fn();
+const providerResolveMutateMock = vi.fn();
+const providerUnresolveMutateMock = vi.fn();
const invalidateQueriesMock = vi.fn();
const cancelQueriesMock = vi.fn();
const getQueriesDataMock = vi.fn();
@@ -92,6 +119,9 @@ vi.mock('@/lib/trpc', () => ({
addReaction: { mutationOptions: (opts: MutationOptions) => opts },
removeReaction: { mutationOptions: (opts: MutationOptions) => opts },
},
+ providerReview: {
+ listDiscussions: { pathFilter: () => ['providerReview', 'listDiscussions'] },
+ },
}),
trpcClient: {
githubPrReview: {
@@ -102,6 +132,14 @@ vi.mock('@/lib/trpc', () => ({
// eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
unresolveThread: { mutate: (vars: unknown) => unresolveMutateMock(vars) },
},
+ providerReview: {
+ // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
+ replyToComment: { mutate: (vars: unknown) => providerReplyMutateMock(vars) },
+ // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
+ resolveThread: { mutate: (vars: unknown) => providerResolveMutateMock(vars) },
+ // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
+ unresolveThread: { mutate: (vars: unknown) => providerUnresolveMutateMock(vars) },
+ },
},
}));
@@ -109,6 +147,18 @@ vi.mock('sonner-native', () => ({
toast: { error: (msg: string) => toastErrorMock(msg) },
}));
+// Rolldown (Vitest's bundler) cannot parse React Native's Flow source.
+// The s6 provider helpers live in `use-pr-review-mutations`, which imports
+// `announcingToast` -> `announce.ts` -> `react-native`. Mock only the
+// symbols `announce.ts` imports so the module graph loads under Node.
+vi.mock('react-native', () => ({
+ AccessibilityInfo: {
+ announceForAccessibility: vi.fn(),
+ setAccessibilityFocus: vi.fn(),
+ },
+ findNodeHandle: vi.fn(() => null),
+}));
+
const REPLY_INPUT = {
owner: 'octocat',
repo: 'hello',
@@ -117,20 +167,58 @@ const REPLY_INPUT = {
body: 'good point',
};
+const GITLAB_REF: ProviderPrRef = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/app',
+ mrIid: 12,
+ instanceHint: 'https://gl.example.com',
+};
+
+const BITBUCKET_REF: ProviderPrRef = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'widgets',
+ prId: 77,
+};
+
+const GITLAB_IDENTITY = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/app',
+ mrIid: 12,
+ instanceHint: 'https://gl.example.com',
+ organizationId: 'org-9',
+};
+
+const BITBUCKET_IDENTITY = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'widgets',
+ prId: 77,
+ organizationId: 'org-9',
+};
+
+function resetMocks() {
+ lastCapturedOptions = null;
+ scopeOverride = null;
+ replyMutateMock.mockReset();
+ resolveMutateMock.mockReset();
+ unresolveMutateMock.mockReset();
+ providerReplyMutateMock.mockReset();
+ providerResolveMutateMock.mockReset();
+ providerUnresolveMutateMock.mockReset();
+ invalidateQueriesMock.mockReset();
+ cancelQueriesMock.mockReset();
+ getQueriesDataMock.mockReset();
+ setQueriesDataMock.mockReset();
+ setQueryDataMock.mockReset();
+ toastErrorMock.mockReset();
+ hoistedKeys.getKey.mockClear();
+ hoistedKeys.rotateKey.mockClear();
+}
+
describe('useReplyToCommentMutation (P1-A-08c wiring)', () => {
beforeEach(() => {
- lastCapturedOptions = null;
- replyMutateMock.mockReset();
- resolveMutateMock.mockReset();
- unresolveMutateMock.mockReset();
- invalidateQueriesMock.mockReset();
- cancelQueriesMock.mockReset();
- getQueriesDataMock.mockReset();
- setQueriesDataMock.mockReset();
- setQueryDataMock.mockReset();
- toastErrorMock.mockReset();
- hoistedKeys.getKey.mockClear();
- hoistedKeys.rotateKey.mockClear();
+ resetMocks();
});
afterEach(() => {
@@ -223,6 +311,64 @@ describe('useReplyToCommentMutation (P1-A-08c wiring)', () => {
});
});
+describe('useReplyToCommentMutation (s6 provider arms)', () => {
+ beforeEach(() => {
+ resetMocks();
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('gitlab: replies inside the discussion through providerReview.replyToComment', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ providerReplyMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useReplyToCommentMutation(GITLAB_REF);
+
+ await expect(
+ lastCapturedOptions?.mutationFn?.({ threadId: 'd-1', commentNodeId: 'c-1', body: 'ok' })
+ ).resolves.toEqual({ done: true, replayed: false });
+ expect(replyMutateMock).not.toHaveBeenCalled();
+ expect(providerReplyMutateMock).toHaveBeenCalledWith({
+ ...GITLAB_IDENTITY,
+ discussionId: 'd-1',
+ body: 'ok',
+ operationKey: 'hoisted-op-key',
+ });
+ // GitLab keys fold the instance hint and use the DISCUSSION id as the
+ // fingerprint commentId (mirrors the server's reply fingerprint input).
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"commentId":"d-1","body":"ok"}'
+ );
+ });
+
+ it('bitbucket: replies attach to the parent comment id, keyed by workspace', async () => {
+ scopeOverride = { ref: BITBUCKET_REF, organizationId: 'org-9' };
+ providerReplyMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useReplyToCommentMutation(BITBUCKET_REF);
+
+ await lastCapturedOptions?.mutationFn?.({ threadId: '9', commentNodeId: 'c-1', body: 'ok' });
+ expect(providerReplyMutateMock).toHaveBeenCalledWith({
+ ...BITBUCKET_IDENTITY,
+ commentId: 'c-1',
+ body: 'ok',
+ operationKey: 'hoisted-op-key',
+ });
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["bitbucket","acme","widgets",77],"commentId":"c-1","body":"ok"}'
+ );
+ });
+
+ it('onSettled invalidates the provider discussions cache', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ useReplyToCommentMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.onSettled?.();
+
+ expect(invalidateQueriesMock).toHaveBeenCalledWith(['providerReview', 'listDiscussions']);
+ });
+});
+
describe('reply_comment fingerprint (P1-A-08c changed-input)', () => {
it('stays stable for a retry of the same reply and rotates when the body or target changes', () => {
const original = prIntentFingerprint('reply_comment', REPLY_INPUT);
@@ -244,13 +390,7 @@ describe('reply_comment fingerprint (P1-A-08c changed-input)', () => {
describe('useResolveThreadMutation (generation guard + chainSave)', () => {
beforeEach(() => {
- lastCapturedOptions = null;
- resolveMutateMock.mockReset();
- cancelQueriesMock.mockReset();
- getQueriesDataMock.mockReset();
- setQueriesDataMock.mockReset();
- setQueryDataMock.mockReset();
- toastErrorMock.mockReset();
+ resetMocks();
});
it('wraps the tRPC call in chainSave keyed by threadId (rule 3) and adds no scope.id', async () => {
@@ -330,13 +470,127 @@ describe('useResolveThreadMutation (generation guard + chainSave)', () => {
});
});
+describe('useResolveThreadMutation / useUnresolveThreadMutation (s6 provider arms)', () => {
+ beforeEach(() => {
+ resetMocks();
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('gitlab: resolves by discussion id with the ledger key and instance-scoped fingerprint', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ providerResolveMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useResolveThreadMutation(GITLAB_REF);
+
+ await expect(lastCapturedOptions?.mutationFn?.({ threadId: 'd-1' })).resolves.toEqual({
+ done: true,
+ replayed: false,
+ });
+ expect(resolveMutateMock).not.toHaveBeenCalled();
+ expect(providerResolveMutateMock).toHaveBeenCalledWith({
+ ...GITLAB_IDENTITY,
+ discussionId: 'd-1',
+ operationKey: 'hoisted-op-key',
+ });
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"threadId":"d-1"}'
+ );
+ });
+
+ it('bitbucket: unresolves by thread id with the workspace-scoped fingerprint', async () => {
+ scopeOverride = { ref: BITBUCKET_REF, organizationId: 'org-9' };
+ providerUnresolveMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useUnresolveThreadMutation(BITBUCKET_REF);
+
+ await lastCapturedOptions?.mutationFn?.({ threadId: 'c-9' });
+ expect(providerUnresolveMutateMock).toHaveBeenCalledWith({
+ ...BITBUCKET_IDENTITY,
+ threadId: 'c-9',
+ operationKey: 'hoisted-op-key',
+ });
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["bitbucket","acme","widgets",77],"threadId":"c-9"}'
+ );
+ });
+
+ it('optimistically flips the provider-shaped cache (resolved, not isResolved) and rolls back on failure', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ providerResolveMutateMock.mockRejectedValueOnce(new Error('boom'));
+ useResolveThreadMutation(GITLAB_REF);
+ const opts = lastCapturedOptions;
+ if (!opts) {
+ throw new Error('resolve options not captured');
+ }
+
+ const cached = {
+ pages: [
+ {
+ threads: [
+ { threadId: 'd-1', resolved: false },
+ { threadId: 'd-2', resolved: false },
+ ],
+ nextCursor: null,
+ },
+ ],
+ };
+ getQueriesDataMock.mockReturnValueOnce([['k1', cached]]);
+ const context = await opts.onMutate?.({ threadId: 'd-1' });
+
+ const updater = setQueriesDataMock.mock.calls[0]?.[1] as (old: unknown) => typeof cached;
+ expect(updater(cached).pages[0]?.threads).toEqual([
+ { threadId: 'd-1', resolved: true },
+ { threadId: 'd-2', resolved: false },
+ ]);
+
+ setQueryDataMock.mockClear();
+ await expect(opts.mutationFn?.({ threadId: 'd-1' })).rejects.toBeInstanceOf(Error);
+ opts.onError?.(new Error('boom'), { threadId: 'd-1' }, context);
+ expect(setQueryDataMock).toHaveBeenCalledWith('k1', cached);
+ expect(toastErrorMock).toHaveBeenCalledWith('boom');
+ });
+
+ it('onSettled invalidates the provider discussions cache', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ useResolveThreadMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.onSettled?.();
+
+ expect(invalidateQueriesMock).toHaveBeenCalledWith(['providerReview', 'listDiscussions']);
+ });
+});
+
+describe('applyProviderResolveToggle (s6 optimistic reducer)', () => {
+ it('flips only the matching thread across every cached page', () => {
+ const pages = {
+ pages: [
+ { threads: [{ threadId: 'a', resolved: false }], nextCursor: 'p2' },
+ {
+ threads: [
+ { threadId: 'b', resolved: false },
+ { threadId: 'c', resolved: true },
+ ],
+ nextCursor: null,
+ },
+ ],
+ };
+ const next = applyProviderResolveToggle(pages, 'b', true);
+ expect(next?.pages[0]?.threads).toEqual([{ threadId: 'a', resolved: false }]);
+ expect(next?.pages[1]?.threads).toEqual([
+ { threadId: 'b', resolved: true },
+ { threadId: 'c', resolved: true },
+ ]);
+ });
+
+ it('passes an undefined cache through untouched', () => {
+ expect(applyProviderResolveToggle(undefined, 'b', true)).toBeUndefined();
+ });
+});
+
describe('useUnresolveThreadMutation (generation guard + chainSave)', () => {
beforeEach(() => {
- lastCapturedOptions = null;
- unresolveMutateMock.mockReset();
- getQueriesDataMock.mockReset();
- setQueryDataMock.mockReset();
- toastErrorMock.mockReset();
+ resetMocks();
});
it('wraps the tRPC call in chainSave keyed by threadId and adds no scope.id', async () => {
@@ -371,10 +625,7 @@ describe('useUnresolveThreadMutation (generation guard + chainSave)', () => {
describe('useAddReactionMutation (generation guard + scope.id)', () => {
beforeEach(() => {
- lastCapturedOptions = null;
- getQueriesDataMock.mockReset();
- setQueryDataMock.mockReset();
- toastErrorMock.mockReset();
+ resetMocks();
});
it('scopes the mutation per thread from the hook closure (rule 2)', () => {
@@ -401,10 +652,7 @@ describe('useAddReactionMutation (generation guard + scope.id)', () => {
describe('useRemoveReactionMutation (generation guard + scope.id)', () => {
beforeEach(() => {
- lastCapturedOptions = null;
- getQueriesDataMock.mockReset();
- setQueryDataMock.mockReset();
- toastErrorMock.mockReset();
+ resetMocks();
});
it('scopes the mutation per thread from the hook closure (rule 2)', () => {
diff --git a/apps/mobile/src/lib/pr-review/discussion/use-review-discussion-mutations.ts b/apps/mobile/src/lib/pr-review/discussion/use-review-discussion-mutations.ts
index 647d88ccd5..b605e12c84 100644
--- a/apps/mobile/src/lib/pr-review/discussion/use-review-discussion-mutations.ts
+++ b/apps/mobile/src/lib/pr-review/discussion/use-review-discussion-mutations.ts
@@ -1,4 +1,6 @@
-// Discussion-tab mutations for the PR review surface.
+/* eslint-disable max-lines -- the reply, resolve-toggle, and reaction suites share one mutation harness for the discussion seam */
+// Discussion-tab mutations for the PR review surface, s6: provider-aware
+// through the `providerReview` seam.
//
// - `replyToComment` — NOT optimistic (per S7b contract):
// the comment is appended only after the
@@ -11,20 +13,34 @@
//
// - `resolveThread` /
// `unresolveThread` — OPTIMISTIC. The reducer flips the
-// thread's `isResolved` in the cached
-// `listReviewThreads` infinite query,
-// snapshots the previous data in
-// `onMutate`, and rolls it back in
-// `onError`. `onSettled` invalidates the
-// path so a re-fetch reconciles with
-// the server's eventual state.
+// thread's resolved flag in the cached
+// threads infinite query (GitHub's
+// `listReviewThreads`, a provider's
+// `listDiscussions`), snapshots the
+// previous data in `onMutate`, and rolls
+// it back in `onError`. `onSettled`
+// invalidates the path so a re-fetch
+// reconciles with the server's eventual
+// state.
//
// - `addReaction` /
// `removeReaction` — OPTIMISTIC. Same pattern as resolve,
// but the reducer walks into a specific
// comment inside a specific thread to
// flip `count` + `viewerHasReacted`.
-// Invalidates on settle.
+// Invalidates on settle. GitHub-only:
+// no provider exposes reactions through
+// the seam (the capability flag gates
+// the affordance in `CommentRow`).
+//
+// Provider arms (s6): every hook takes an optional `ProviderPrRef`. The
+// discussion tree passes none and the hooks read the live provider scope
+// from context, so the non-provider surface keeps the exact GitHub-shaped
+// calls it made before. The thread id is provider-native on every arm
+// (`ProviderPrThread.threadId` is GitLab's discussion id and Bitbucket's
+// root-comment id verbatim), so `{threadId}` vars work unchanged; the
+// reply vars additionally carry the provider comment id (`nodeId`) for
+// Bitbucket, whose replies attach to a parent comment, not a thread.
//
// Why we do NOT coalesce these into the existing
// `useCreateReviewCommentMutation` / `useSubmitReviewMutation` hooks:
@@ -37,12 +53,22 @@ import { useMutation, useQueryClient } from '@tanstack/react-query';
import { toast } from 'sonner-native';
import { prIntentFingerprint } from '@kilocode/app-shared/pr-review';
+import { type ProviderPrRef } from '@kilocode/app-shared/provider-review';
import {
isLatestMutationGeneration,
nextMutationGeneration,
} from '@/lib/hooks/mutation-generations';
import { chainSave } from '@/lib/hooks/save-chain';
+import {
+ type ProviderPrScope,
+ providerPrTriple,
+ useProviderPrScope,
+} from '@/lib/pr-review/provider-pr-ref';
+import {
+ providerFingerprintInput,
+ providerWriteIdentity,
+} from '@/lib/pr-review/use-pr-review-mutations';
import { trpcClient, useTRPC } from '@/lib/trpc';
import { useHoistedOperationKey } from '@/lib/operation-key';
import {
@@ -58,28 +84,88 @@ import {
type ReviewThreadsInfiniteData,
} from './review-discussion-types';
-function useDiscussionKeys() {
- const trpc = useTRPC();
+/** One page of provider threads, at the runtime shape the read layer caches. */
+type ProviderThreadsPage = {
+ threads: { threadId: string; resolved: boolean }[];
+ nextCursor: string | null;
+};
+
+/** The infinite container the provider threads query caches the pages in. */
+type ProviderThreadsCache = {
+ pages: ProviderThreadsPage[];
+};
+
+/** Flip one provider thread's resolved flag across the cached pages. */
+export function applyProviderResolveToggle(
+ pages: { pages: T[] } | undefined,
+ threadId: string,
+ resolved: boolean
+): { pages: T[] } | undefined {
+ if (!pages) {
+ return pages;
+ }
return {
- listReviewThreadsPath: trpc.githubPrReview.listReviewThreads.pathFilter(),
+ ...pages,
+ pages: pages.pages.map(page =>
+ page.threads.some(thread => thread.threadId === threadId)
+ ? {
+ ...page,
+ threads: page.threads.map(thread =>
+ thread.threadId === threadId ? { ...thread, resolved } : thread
+ ),
+ }
+ : page
+ ),
};
}
+/**
+ * The scope the discussion write runs under. With an explicit ref the
+ * caller's organization (from the live provider scope) rides along; with
+ * none the GitHub-shaped fallback keeps the pre-s6 behavior byte-for-byte.
+ */
+function useDiscussionScope(ref?: ProviderPrRef): ProviderPrScope {
+ const scope = useProviderPrScope(
+ ref ? providerPrTriple(ref) : { owner: '', repo: '', number: 0 }
+ );
+ return ref ? { ref, organizationId: scope.organizationId } : scope;
+}
+
// Every discussion mutation snapshots the same procedure-wide
// `listReviewThreads` cache through its path filter, so one shared generation
// key guards all rollbacks across resolve/unresolve/reaction writes.
-const LIST_REVIEW_THREADS_GENERATION_KEY = 'githubPrReview.listReviewThreads';
+function useGithubDiscussionKeys() {
+ const trpc = useTRPC();
+ return {
+ threadsPath: trpc.githubPrReview.listReviewThreads.pathFilter(),
+ generationKey: 'githubPrReview.listReviewThreads',
+ };
+}
+
+function useDiscussionKeys(scope: ProviderPrScope) {
+ const trpc = useTRPC();
+ if (scope.ref.platform === 'github') {
+ return {
+ threadsPath: trpc.githubPrReview.listReviewThreads.pathFilter(),
+ generationKey: 'githubPrReview.listReviewThreads',
+ };
+ }
+ return {
+ threadsPath: trpc.providerReview.listDiscussions.pathFilter(),
+ generationKey: 'providerReview.listDiscussions',
+ };
+}
async function invalidateDiscussionCaches(
queryClient: ReturnType,
keys: ReturnType
): Promise {
- await queryClient.invalidateQueries(keys.listReviewThreadsPath);
+ await queryClient.invalidateQueries(keys.threadsPath);
}
// ── Reply (not optimistic) ────────────────────────────────────────────
-export type ReplyToCommentInput = {
+type ReplyToCommentInput = {
owner: string;
repo: string;
number: number;
@@ -87,18 +173,63 @@ export type ReplyToCommentInput = {
body: string;
};
-export function useReplyToCommentMutation() {
+/**
+ * The provider reply vars: `threadId` is the GitLab discussion id (GitLab
+ * replies land inside a discussion); `commentNodeId` is the provider
+ * comment id Bitbucket attaches a reply to. Both carry the provider-native
+ * string ids the read layer keeps in `threadId` / `nodeId`.
+ */
+type ProviderReplyVars = {
+ threadId: string;
+ commentNodeId: string;
+ body: string;
+};
+export type ReplyVars = ReplyToCommentInput | ProviderReplyVars;
+
+export function useReplyToCommentMutation(ref?: ProviderPrRef) {
const queryClient = useQueryClient();
- const keys = useDiscussionKeys();
+ const scope = useDiscussionScope(ref);
+ const keys = useDiscussionKeys(scope);
const { getKey, rotateKey } = useHoistedOperationKey();
return useMutation({
- mutationFn: async (input: ReplyToCommentInput) => {
+ mutationFn: async (input: ReplyVars) => {
try {
- const result = await trpcClient.githubPrReview.replyToComment.mutate({
- ...input,
- operationKey: getKey(prIntentFingerprint('reply_comment', input)),
- });
+ if (scope.ref.platform === 'github') {
+ const vars = input as ReplyToCommentInput;
+ const result = await trpcClient.githubPrReview.replyToComment.mutate({
+ ...vars,
+ operationKey: getKey(prIntentFingerprint('reply_comment', vars)),
+ });
+ rotateKey();
+ return result;
+ }
+ const vars = input as ProviderReplyVars;
+ const commentId = scope.ref.platform === 'gitlab' ? vars.threadId : vars.commentNodeId;
+ const operationKey = getKey(
+ prIntentFingerprint(
+ 'reply_comment',
+ providerFingerprintInput(scope.ref, { commentId, body: vars.body })
+ )
+ );
+ // One call per platform arm: a conditional spread inside a single
+ // literal would cross-multiply the identity union with the id
+ // union and hand the server gitlab+commentId shapes.
+ const identity = providerWriteIdentity(scope);
+ const result =
+ identity.platform === 'gitlab'
+ ? await trpcClient.providerReview.replyToComment.mutate({
+ ...identity,
+ discussionId: vars.threadId,
+ body: vars.body,
+ operationKey,
+ })
+ : await trpcClient.providerReview.replyToComment.mutate({
+ ...identity,
+ commentId: vars.commentNodeId,
+ body: vars.body,
+ operationKey,
+ });
rotateKey();
return result;
} catch (error) {
@@ -119,36 +250,77 @@ export function useReplyToCommentMutation() {
// ── Resolve / unresolve (optimistic) ──────────────────────────────────
-export function useResolveThreadMutation() {
+/**
+ * The optimistic resolve/unresolve write. The GitHub arm keeps the exact
+ * pre-s6 call (no operation key — the GitHub thread procedures are not
+ * ledgered); the provider arms ledger the write with the s1 provider
+ * fingerprint and flip the provider-shaped cache (`resolved`, not
+ * `isResolved`).
+ */
+function useResolveToggleMutation(
+ ref: ProviderPrRef | undefined,
+ resolved: boolean,
+ mutateGithub: (vars: { threadId: string }) => Promise
+) {
const queryClient = useQueryClient();
- const keys = useDiscussionKeys();
+ const scope = useDiscussionScope(ref);
+ const keys = useDiscussionKeys(scope);
+ const { getKey, rotateKey } = useHoistedOperationKey();
// onError policy: roll back the onMutate snapshot (latest generation only)
// and toast error.message.
return useMutation({
+ // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
mutationFn: (vars: { threadId: string }) =>
- // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
- chainSave(`pr-thread:${vars.threadId}`, () =>
- trpcClient.githubPrReview.resolveThread.mutate(vars)
+ // The GitHub arm keeps the pre-s6 chainSave key so its serialization is
+ // unchanged; provider keys fold the platform to stay disjoint.
+ chainSave(
+ scope.ref.platform === 'github'
+ ? `pr-thread:${vars.threadId}`
+ : `pr-thread:${scope.ref.platform}:${vars.threadId}`,
+ async () => {
+ if (scope.ref.platform === 'github') {
+ return mutateGithub(vars);
+ }
+ try {
+ const input = providerResolveInput(scope, {
+ threadId: vars.threadId,
+ resolve: resolved,
+ getKey,
+ });
+ const result = resolved
+ ? await trpcClient.providerReview.resolveThread.mutate(input)
+ : await trpcClient.providerReview.unresolveThread.mutate(input);
+ rotateKey();
+ return result;
+ } catch (error) {
+ if (!isPrMutationRetryable(error)) {
+ rotateKey();
+ }
+ throw mapPrOperationError(error, 'reply');
+ }
+ }
),
onMutate: async ({ threadId }) => {
- await queryClient.cancelQueries(keys.listReviewThreadsPath);
- const generation = nextMutationGeneration(LIST_REVIEW_THREADS_GENERATION_KEY);
- const previous = queryClient.getQueriesData(
- keys.listReviewThreadsPath
- );
- queryClient.setQueriesData(keys.listReviewThreadsPath, old =>
- applyResolveToggle(old, threadId, true)
+ await queryClient.cancelQueries(keys.threadsPath);
+ const generation = nextMutationGeneration(keys.generationKey);
+ if (scope.ref.platform === 'github') {
+ const previous = queryClient.getQueriesData(keys.threadsPath);
+ queryClient.setQueriesData(keys.threadsPath, old =>
+ applyResolveToggle(old, threadId, resolved)
+ );
+ return { previous, generation };
+ }
+ const previous = queryClient.getQueriesData(keys.threadsPath);
+ queryClient.setQueriesData(keys.threadsPath, old =>
+ applyProviderResolveToggle(old, threadId, resolved)
);
return { previous, generation };
},
onError: (error, _input, context) => {
- if (
- context?.previous &&
- isLatestMutationGeneration(LIST_REVIEW_THREADS_GENERATION_KEY, context.generation)
- ) {
+ if (context?.previous && isLatestMutationGeneration(keys.generationKey, context.generation)) {
for (const [key, data] of context.previous) {
- queryClient.setQueryData(key, data);
+ queryClient.setQueryData(key, data);
}
}
toast.error(error.message);
@@ -159,43 +331,44 @@ export function useResolveThreadMutation() {
});
}
-export function useUnresolveThreadMutation() {
- const queryClient = useQueryClient();
- const keys = useDiscussionKeys();
+/** The provider `resolveThread` / `unresolveThread` input for one thread. */
+function providerResolveInput(
+ scope: ProviderPrScope,
+ args: {
+ threadId: string;
+ resolve: boolean;
+ getKey: (fingerprint: string) => string;
+ }
+) {
+ const { threadId, resolve, getKey } = args;
+ const identity = providerWriteIdentity(scope);
+ const intent = resolve ? 'resolve_thread' : 'unresolve_thread';
+ // The fingerprint rides the platform-narrowed identity: its gitlab/
+ // bitbucket arms carry exactly the s1 ref fields the server hashes.
+ const fingerprint = providerFingerprintInput(identity, { threadId });
+ if (identity.platform === 'gitlab') {
+ return {
+ ...identity,
+ discussionId: threadId,
+ operationKey: getKey(prIntentFingerprint(intent, fingerprint)),
+ };
+ }
+ return {
+ ...identity,
+ threadId,
+ operationKey: getKey(prIntentFingerprint(intent, fingerprint)),
+ };
+}
- // onError policy: roll back the onMutate snapshot (latest generation only)
- // and toast error.message.
- return useMutation({
- mutationFn: (vars: { threadId: string }) =>
- // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
- chainSave(`pr-thread:${vars.threadId}`, () =>
- trpcClient.githubPrReview.unresolveThread.mutate(vars)
- ),
- onMutate: async ({ threadId }) => {
- await queryClient.cancelQueries(keys.listReviewThreadsPath);
- const generation = nextMutationGeneration(LIST_REVIEW_THREADS_GENERATION_KEY);
- const previous = queryClient.getQueriesData(
- keys.listReviewThreadsPath
- );
- queryClient.setQueriesData(keys.listReviewThreadsPath, old =>
- applyResolveToggle(old, threadId, false)
- );
- return { previous, generation };
- },
- onError: (error, _input, context) => {
- if (
- context?.previous &&
- isLatestMutationGeneration(LIST_REVIEW_THREADS_GENERATION_KEY, context.generation)
- ) {
- for (const [key, data] of context.previous) {
- queryClient.setQueryData(key, data);
- }
- }
- toast.error(error.message);
- },
- onSettled: async () => {
- await invalidateDiscussionCaches(queryClient, keys);
- },
+export function useResolveThreadMutation(ref?: ProviderPrRef) {
+ return useResolveToggleMutation(ref, true, async vars => {
+ await trpcClient.githubPrReview.resolveThread.mutate(vars);
+ });
+}
+
+export function useUnresolveThreadMutation(ref?: ProviderPrRef) {
+ return useResolveToggleMutation(ref, false, async vars => {
+ await trpcClient.githubPrReview.unresolveThread.mutate(vars);
});
}
@@ -208,7 +381,7 @@ export function useUnresolveThreadMutation() {
export function useAddReactionMutation(threadId: string) {
const trpc = useTRPC();
const queryClient = useQueryClient();
- const keys = useDiscussionKeys();
+ const keys = useGithubDiscussionKeys();
// onError policy: roll back the onMutate snapshot (latest generation only)
// and toast error.message.
@@ -216,12 +389,10 @@ export function useAddReactionMutation(threadId: string) {
trpc.githubPrReview.addReaction.mutationOptions({
// eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
onMutate: async ({ commentNodeId, content }) => {
- await queryClient.cancelQueries(keys.listReviewThreadsPath);
- const generation = nextMutationGeneration(LIST_REVIEW_THREADS_GENERATION_KEY);
- const previous = queryClient.getQueriesData(
- keys.listReviewThreadsPath
- );
- queryClient.setQueriesData(keys.listReviewThreadsPath, old =>
+ await queryClient.cancelQueries(keys.threadsPath);
+ const generation = nextMutationGeneration(keys.generationKey);
+ const previous = queryClient.getQueriesData(keys.threadsPath);
+ queryClient.setQueriesData(keys.threadsPath, old =>
applyReactionToggle({
data: old,
threadId,
@@ -234,7 +405,7 @@ export function useAddReactionMutation(threadId: string) {
onError: (error, _input, context) => {
if (
context?.previous &&
- isLatestMutationGeneration(LIST_REVIEW_THREADS_GENERATION_KEY, context.generation)
+ isLatestMutationGeneration(keys.generationKey, context.generation)
) {
for (const [key, data] of context.previous) {
queryClient.setQueryData(key, data);
@@ -256,7 +427,7 @@ export function useAddReactionMutation(threadId: string) {
export function useRemoveReactionMutation(threadId: string) {
const trpc = useTRPC();
const queryClient = useQueryClient();
- const keys = useDiscussionKeys();
+ const keys = useGithubDiscussionKeys();
// onError policy: roll back the onMutate snapshot (latest generation only)
// and toast error.message.
@@ -264,12 +435,10 @@ export function useRemoveReactionMutation(threadId: string) {
trpc.githubPrReview.removeReaction.mutationOptions({
// eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
onMutate: async ({ commentNodeId, content }) => {
- await queryClient.cancelQueries(keys.listReviewThreadsPath);
- const generation = nextMutationGeneration(LIST_REVIEW_THREADS_GENERATION_KEY);
- const previous = queryClient.getQueriesData(
- keys.listReviewThreadsPath
- );
- queryClient.setQueriesData(keys.listReviewThreadsPath, old =>
+ await queryClient.cancelQueries(keys.threadsPath);
+ const generation = nextMutationGeneration(keys.generationKey);
+ const previous = queryClient.getQueriesData(keys.threadsPath);
+ queryClient.setQueriesData(keys.threadsPath, old =>
applyReactionToggle({
data: old,
threadId,
@@ -282,7 +451,7 @@ export function useRemoveReactionMutation(threadId: string) {
onError: (error, _input, context) => {
if (
context?.previous &&
- isLatestMutationGeneration(LIST_REVIEW_THREADS_GENERATION_KEY, context.generation)
+ isLatestMutationGeneration(keys.generationKey, context.generation)
) {
for (const [key, data] of context.previous) {
queryClient.setQueryData(key, data);
diff --git a/apps/mobile/src/lib/pr-review/merge/use-pr-merge-mutations.test.ts b/apps/mobile/src/lib/pr-review/merge/use-pr-merge-mutations.test.ts
index 9f9d5fc516..7aa960aae5 100644
--- a/apps/mobile/src/lib/pr-review/merge/use-pr-merge-mutations.test.ts
+++ b/apps/mobile/src/lib/pr-review/merge/use-pr-merge-mutations.test.ts
@@ -1,4 +1,6 @@
-// P0-B-08 wiring tests for `useMergePullRequestMutation`.
+/* eslint-disable max-lines -- the merge and auto-merge suites share one mock harness for the merge seam */
+// P0-B-08 + s6 wiring tests for `useMergePullRequestMutation` and the
+// auto-merge hooks.
//
// The pure gate / store / error class are covered by their own unit
// tests. These tests assert the WIRING: the hook's `mutationFn`
@@ -11,13 +13,24 @@
// input and the key rotation policy (real `isPrMutationRetryable`) runs
// inside `mutationFn`; only `useHoistedOperationKey` is mocked (it holds
// React ref state that needs a mounted renderer).
+//
+// s6: the provider arms route the same intents through
+// `providerReview.*` with the s1 provider identity, normalize the
+// `{done, replayed}` answer onto the gate's result shape (a `done:
+// false` never celebrates, with provider wording), and fence every
+// merge/auto-merge write on `expectedHeadSha`. Auto-merge is
+// GitLab-only: the server answers Bitbucket with `{supported: false,
+// reason}` and the hook must NOT announce a success for it.
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import type * as OperationKeyModule from '@/lib/operation-key';
+import type * as AnnounceModule from '@/lib/a11y/announce';
import { classifyPrReviewMutationError } from '@/lib/pr-review/classify-pr-review-query-state';
import { prIntentFingerprint } from '@kilocode/app-shared/pr-review';
-import { useMergePullRequestMutation } from './use-pr-merge-mutations';
+import type * as ProviderPrRefModule from '@/lib/pr-review/provider-pr-ref';
+import { type ProviderPrRef, type ProviderPrTriple } from '@/lib/pr-review/provider-pr-ref';
+import { useEnableAutoMergeMutation, useMergePullRequestMutation } from './use-pr-merge-mutations';
import { MergeNotCompletedError } from './merge-result-error';
const hoistedKeys = vi.hoisted(() => ({
@@ -25,6 +38,8 @@ const hoistedKeys = vi.hoisted(() => ({
rotateKey: vi.fn(),
}));
+const announceMock = vi.hoisted(() => ({ announceForA11y: vi.fn() }));
+
vi.mock('expo-crypto', () => ({
randomUUID: () => 'not-used',
}));
@@ -34,14 +49,35 @@ vi.mock('@/lib/operation-key', async importOriginal => {
return { ...actual, useHoistedOperationKey: () => hoistedKeys };
});
+vi.mock('@/lib/a11y/announce', async importOriginal => {
+ const actual = await importOriginal();
+ return { ...actual, announceForA11y: (message: string) => announceMock.announceForA11y(message) };
+});
+
+// See the review-mutations test: the scope context hook is replaced by a
+// settable override so the hooks run without a renderer.
+let scopeOverride: { ref: ProviderPrRef; organizationId: string | null } | null = null;
+
+vi.mock('@/lib/pr-review/provider-pr-ref', async importOriginal => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ useProviderPrScope: (fallback: ProviderPrTriple) =>
+ scopeOverride ?? { ref: { platform: 'github', ...fallback }, organizationId: null },
+ };
+});
+
type MutationOptions = {
mutationFn?: (vars: unknown) => Promise;
+ onSuccess?: (data: unknown) => void;
onError?: (error: unknown) => void;
- onSettled?: (data: unknown, error: unknown, vars: unknown) => Promise | void;
+ onSettled?: (data?: unknown, error?: unknown, vars?: unknown) => Promise | void;
};
let lastCapturedOptions: MutationOptions | null = null;
const mutateMock = vi.fn();
+const providerMergeMutateMock = vi.fn();
+const providerEnableAutoMergeMutateMock = vi.fn();
const invalidateQueriesMock = vi.fn();
const toastErrorMock = vi.fn();
@@ -64,12 +100,23 @@ vi.mock('@/lib/trpc', () => ({
listChecks: { pathFilter: () => ['githubPrReview', 'listChecks'] },
listFiles: { pathFilter: () => ['githubPrReview', 'listFiles'] },
},
+ providerReview: {
+ getPullRequest: { queryKey: () => ['providerReview', 'getPullRequest'] },
+ listChecks: { pathFilter: () => ['providerReview', 'listChecks'] },
+ listFiles: { pathFilter: () => ['providerReview', 'listFiles'] },
+ },
}),
trpcClient: {
githubPrReview: {
// eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
mergePullRequest: { mutate: (vars: unknown) => mutateMock(vars) },
},
+ providerReview: {
+ // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
+ mergePullRequest: { mutate: (vars: unknown) => providerMergeMutateMock(vars) },
+ // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
+ enableAutoMerge: { mutate: (vars: unknown) => providerEnableAutoMergeMutateMock(vars) },
+ },
},
}));
@@ -99,14 +146,60 @@ const INPUT = {
expectedHeadSha: 'a'.repeat(40),
};
+const GITLAB_REF: ProviderPrRef = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/app',
+ mrIid: 12,
+ instanceHint: 'https://gl.example.com',
+};
+
+const BITBUCKET_REF: ProviderPrRef = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'widgets',
+ prId: 77,
+};
+
+const GITLAB_IDENTITY = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/app',
+ mrIid: 12,
+ instanceHint: 'https://gl.example.com',
+ organizationId: 'org-9',
+};
+
+const BITBUCKET_IDENTITY = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'widgets',
+ prId: 77,
+ organizationId: 'org-9',
+};
+
+const PROVIDER_MERGE_VARS = {
+ expectedHeadSha: 'a'.repeat(40),
+ squash: true,
+ deleteBranch: true,
+ commitTitle: 'My title',
+ commitMessage: 'My message',
+};
+
+function resetMocks() {
+ lastCapturedOptions = null;
+ scopeOverride = null;
+ mutateMock.mockReset();
+ providerMergeMutateMock.mockReset();
+ providerEnableAutoMergeMutateMock.mockReset();
+ invalidateQueriesMock.mockReset();
+ toastErrorMock.mockReset();
+ announceMock.announceForA11y.mockReset();
+ hoistedKeys.getKey.mockClear();
+ hoistedKeys.rotateKey.mockClear();
+}
+
describe('useMergePullRequestMutation (P0-B-08 wiring)', () => {
beforeEach(() => {
- lastCapturedOptions = null;
- mutateMock.mockReset();
- invalidateQueriesMock.mockReset();
- toastErrorMock.mockReset();
- hoistedKeys.getKey.mockClear();
- hoistedKeys.rotateKey.mockClear();
+ resetMocks();
});
afterEach(() => {
@@ -259,6 +352,179 @@ describe('useMergePullRequestMutation (P0-B-08 wiring)', () => {
});
});
+describe('useMergePullRequestMutation (s6 gitlab arm)', () => {
+ beforeEach(() => {
+ resetMocks();
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('routes the fenced merge through providerReview.mergePullRequest and normalizes the result', async () => {
+ providerMergeMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useMergePullRequestMutation(GITLAB_REF);
+
+ await expect(lastCapturedOptions?.mutationFn?.(PROVIDER_MERGE_VARS)).resolves.toEqual({
+ merged: true,
+ sha: 'a'.repeat(40),
+ branchDeleted: false,
+ });
+ expect(mutateMock).not.toHaveBeenCalled();
+ expect(providerMergeMutateMock).toHaveBeenCalledWith({
+ ...GITLAB_IDENTITY,
+ expectedHeadSha: 'a'.repeat(40),
+ squash: true,
+ deleteBranch: true,
+ commitTitle: 'My title',
+ commitMessage: 'My message',
+ operationKey: 'hoisted-op-key',
+ });
+ // Pinned bytes mirroring the server's gitlab merge fingerprint input:
+ // method folds the squash toggle, and the fence rides the identity.
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"method":"squash","commitTitle":"My title","commitMessage":"My message","deleteBranch":true,"expectedHeadSha":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}'
+ );
+ expect(hoistedKeys.rotateKey).toHaveBeenCalledTimes(1);
+ });
+
+ it('never celebrates done:false: throws MergeNotCompletedError with merge-request wording, key kept', async () => {
+ providerMergeMutateMock.mockResolvedValueOnce({ done: false, replayed: false });
+ useMergePullRequestMutation(GITLAB_REF);
+
+ let thrown: unknown = null;
+ try {
+ await lastCapturedOptions?.mutationFn?.(PROVIDER_MERGE_VARS);
+ } catch (error) {
+ thrown = error;
+ }
+ expect(thrown).toBeInstanceOf(MergeNotCompletedError);
+ expect((thrown as Error).message).toBe(
+ 'The merge request was not merged. Check its state and try again.'
+ );
+ expect(classifyPrReviewMutationError(thrown)).toEqual({ kind: 'retryable' });
+ expect(hoistedKeys.rotateKey).not.toHaveBeenCalled();
+ });
+
+ it('surfaces the server stale-head CONFLICT message unchanged (the sheet keeps it inline)', async () => {
+ const staleHead = new Error(
+ 'The merge request changed since it was loaded. Reload the merge request and try again.'
+ );
+ Object.assign(staleHead, { data: { code: 'CONFLICT' } });
+ providerMergeMutateMock.mockRejectedValueOnce(staleHead);
+ useMergePullRequestMutation(GITLAB_REF);
+
+ await expect(lastCapturedOptions?.mutationFn?.(PROVIDER_MERGE_VARS)).rejects.toMatchObject({
+ message:
+ 'The merge request changed since it was loaded. Reload the merge request and try again.',
+ });
+ });
+
+ it('onSettled invalidates the provider caches (overview + checks + files)', async () => {
+ useMergePullRequestMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.onSettled?.();
+
+ expect(invalidateQueriesMock).toHaveBeenCalledWith({
+ queryKey: ['providerReview', 'getPullRequest'],
+ });
+ expect(invalidateQueriesMock).toHaveBeenCalledWith(['providerReview', 'listChecks']);
+ expect(invalidateQueriesMock).toHaveBeenCalledWith(['providerReview', 'listFiles']);
+ });
+});
+
+describe('useMergePullRequestMutation (s6 bitbucket arm)', () => {
+ beforeEach(() => {
+ resetMocks();
+ scopeOverride = { ref: BITBUCKET_REF, organizationId: 'org-9' };
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('sends no squash/commitTitle (Bitbucket has only the merge commit) and pins the merge method', async () => {
+ providerMergeMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useMergePullRequestMutation(BITBUCKET_REF);
+
+ await lastCapturedOptions?.mutationFn?.(PROVIDER_MERGE_VARS);
+ const sent = providerMergeMutateMock.mock.calls[0]?.[0] as Record;
+ expect(sent).toEqual({
+ ...BITBUCKET_IDENTITY,
+ expectedHeadSha: 'a'.repeat(40),
+ deleteBranch: true,
+ commitMessage: 'My message',
+ operationKey: 'hoisted-op-key',
+ });
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["bitbucket","acme","widgets",77],"method":"merge","commitMessage":"My message","deleteBranch":true,"expectedHeadSha":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}'
+ );
+ });
+
+ it('uses pull-request wording when the provider declines the merge', async () => {
+ providerMergeMutateMock.mockResolvedValueOnce({ done: false, replayed: false });
+ useMergePullRequestMutation(BITBUCKET_REF);
+
+ await expect(lastCapturedOptions?.mutationFn?.(PROVIDER_MERGE_VARS)).rejects.toMatchObject({
+ message: 'The pull request was not merged. Check its state and try again.',
+ });
+ });
+});
+
+describe('useEnableAutoMergeMutation (s6 provider arms)', () => {
+ beforeEach(() => {
+ resetMocks();
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('gitlab: arms merge-when-pipeline-succeeds fenced on the head and announces success', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ providerEnableAutoMergeMutateMock.mockResolvedValueOnce({
+ supported: true,
+ reason: '',
+ done: true,
+ replayed: false,
+ });
+ useEnableAutoMergeMutation(GITLAB_REF);
+
+ await expect(
+ lastCapturedOptions?.mutationFn?.({ expectedHeadSha: 'a'.repeat(40) })
+ ).resolves.toMatchObject({ supported: true });
+ expect(providerEnableAutoMergeMutateMock).toHaveBeenCalledWith({
+ ...GITLAB_IDENTITY,
+ expectedHeadSha: 'a'.repeat(40),
+ operationKey: 'hoisted-op-key',
+ });
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"expectedHeadSha":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}'
+ );
+ lastCapturedOptions?.onSuccess?.({ supported: true, reason: '', done: true, replayed: false });
+ expect(announceMock.announceForA11y).toHaveBeenCalledWith('Auto-merge enabled');
+ });
+
+ it('bitbucket: the supported:false answer resolves as a reason, not a success — no announcement', async () => {
+ scopeOverride = { ref: BITBUCKET_REF, organizationId: 'org-9' };
+ const refusal = {
+ supported: false,
+ reason: 'Bitbucket Cloud does not expose auto-merge in its API',
+ done: false,
+ replayed: false,
+ };
+ providerEnableAutoMergeMutateMock.mockResolvedValueOnce(refusal);
+ useEnableAutoMergeMutation(BITBUCKET_REF);
+
+ await expect(
+ lastCapturedOptions?.mutationFn?.({ expectedHeadSha: 'a'.repeat(40) })
+ ).resolves.toEqual(refusal);
+ lastCapturedOptions?.onSuccess?.(refusal);
+ expect(announceMock.announceForA11y).not.toHaveBeenCalled();
+ });
+});
+
describe('merge fingerprint (P1-A-08c changed-input)', () => {
it('stays stable for a retry of the same merge and rotates when the method or message changes', () => {
const original = prIntentFingerprint('merge', INPUT);
diff --git a/apps/mobile/src/lib/pr-review/merge/use-pr-merge-mutations.ts b/apps/mobile/src/lib/pr-review/merge/use-pr-merge-mutations.ts
index 6254b32542..160a33f270 100644
--- a/apps/mobile/src/lib/pr-review/merge/use-pr-merge-mutations.ts
+++ b/apps/mobile/src/lib/pr-review/merge/use-pr-merge-mutations.ts
@@ -1,4 +1,5 @@
-// S8 merge-side mutation hooks. Pattern mirrors the repo's existing
+// S8 merge-side mutation hooks, s6: provider-aware through the
+// `providerReview` seam. Pattern mirrors the repo's existing
// mutation hooks (useSessionMutations, useSecurityAgentMutations):
// - `onError` toasts the message
// - `onSettled` invalidates the overview + the per-PR listChecks /
@@ -6,26 +7,47 @@
// - keeps the mutation hook thin and lets the sheet / section handle
// inline errors (toasts paint behind formSheets)
//
-// listChecks is keyed by `(owner, repo, ref)`. The head ref will change
-// after a successful merge / update-branch, so we invalidate the
+// listChecks is keyed by `(owner, repo, ref)` on GitHub. The head ref will
+// change after a successful merge / update-branch, so we invalidate the
// procedure PATH (not a single key) — every cached check list for this
// PR is dropped and any mounted consumer re-fetches against the new
// head. `listFiles` is per-page; we invalidate the full procedure too.
+// The provider arms mirror this on `providerReview` (path filters).
+//
+// Provider arms (s6): `mergePullRequest` requires the `expectedHeadSha`
+// fence on every provider — the server refuses a moved head with the
+// explicit stale-head reason (CONFLICT) before any merge call, and the
+// sheet keeps that reason inline without navigating away. The provider
+// result `{done, replayed}` is normalized onto the GitHub result shape so
+// the existing `assertMergeResult` gate keeps its "never celebrate a
+// merge that did not happen" contract. Auto-merge is GitLab-only:
+// Bitbucket Cloud has no auto-merge API, and the server answers
+// `enableAutoMerge` with `{supported: false, reason}` so the UI shows the
+// provider reason instead of failing.
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { prIntentFingerprint } from '@kilocode/app-shared/pr-review';
+import { providerPrTerm } from '@kilocode/app-shared/provider-review';
import { type inferRouterInputs, type MobileRouter } from '@kilocode/trpc/mobile';
import { i18n } from '@/i18n';
import { announceForA11y } from '@/lib/a11y/announce';
import { announcingToast } from '@/lib/a11y/announcing-toast';
import { trpcClient, useTRPC } from '@/lib/trpc';
+import { type ProviderPrScope, providerPrTriple } from '@/lib/pr-review/provider-pr-ref';
+import {
+ providerFingerprintInput,
+ providerWriteIdentity,
+ type ReviewWriteRef,
+ useReviewWriteScope,
+} from '@/lib/pr-review/use-pr-review-mutations';
import {
assertMergeResult,
gateMergeResult,
type MergePullRequestResult,
} from '@/lib/pr-review/merge/merge-result-gate';
+import { MergeNotCompletedError } from '@/lib/pr-review/merge/merge-result-error';
import { useHoistedOperationKey } from '@/lib/operation-key';
import {
isPrMutationRetryable,
@@ -37,19 +59,64 @@ type PrRef = { owner: string; repo: string; number: number };
type RouterInputs = inferRouterInputs;
type MergePullRequestInput = RouterInputs['githubPrReview']['mergePullRequest'];
+type GithubAutoMergeInput = RouterInputs['githubPrReview']['enableAutoMerge'];
+type GithubDisableAutoMergeInput = RouterInputs['githubPrReview']['disableAutoMerge'];
+
+/**
+ * The merge-sheet vars for a provider PR/MR. `method` is a UI concept:
+ * GitLab folds it into `squash`, Bitbucket Cloud has only the merge
+ * commit, and the fingerprint mirrors the server's `method` field.
+ */
+export type ProviderMergeVars = {
+ expectedHeadSha: string;
+ squash?: boolean;
+ deleteBranch?: boolean;
+ commitTitle?: string;
+ commitMessage?: string;
+};
+export type MergeVars = MergePullRequestInput | ProviderMergeVars;
+
+/** The auto-merge vars for a provider MR (GitLab; Bitbucket answers unsupported). */
+type ProviderAutoMergeVars = { expectedHeadSha: string };
+export type EnableAutoMergeVars = GithubAutoMergeInput | ProviderAutoMergeVars;
+export type DisableAutoMergeVars = GithubDisableAutoMergeInput | ProviderAutoMergeVars;
+
+/**
+ * The resolved auto-merge answer across arms: GitHub reports
+ * `{enabled, prNodeId}`, the provider seam reports `{supported, reason}`
+ * plus the ledger flags. Every field is optional so both arms land in the
+ * same `TData`; only `supported: false` (Bitbucket has no auto-merge API)
+ * is read back, to keep the success announcement off an unsupported answer.
+ */
+export type AutoMergeOutcome = {
+ enabled?: boolean;
+ prNodeId?: string;
+ supported?: boolean;
+ reason?: string;
+ done?: boolean;
+ replayed?: boolean;
+};
-function usePrRefKeys(ref: PrRef) {
+function useMergeKeys(scope: ProviderPrScope) {
const trpc = useTRPC();
+ if (scope.ref.platform === 'github') {
+ const triple = providerPrTriple(scope.ref);
+ return {
+ getPullRequest: trpc.githubPrReview.getPullRequest.queryKey(triple),
+ listChecksPath: trpc.githubPrReview.listChecks.pathFilter(),
+ listFilesPath: trpc.githubPrReview.listFiles.pathFilter(),
+ };
+ }
return {
- getPullRequest: trpc.githubPrReview.getPullRequest.queryKey(ref),
- listChecksPath: trpc.githubPrReview.listChecks.pathFilter(),
- listFilesPath: trpc.githubPrReview.listFiles.pathFilter(),
+ getPullRequest: trpc.providerReview.getPullRequest.queryKey(providerWriteIdentity(scope)),
+ listChecksPath: trpc.providerReview.listChecks.pathFilter(),
+ listFilesPath: trpc.providerReview.listFiles.pathFilter(),
};
}
async function invalidatePrCaches(
queryClient: ReturnType,
- keys: ReturnType
+ keys: ReturnType
): Promise {
await Promise.all([
queryClient.invalidateQueries({ queryKey: keys.getPullRequest }),
@@ -58,9 +125,91 @@ async function invalidatePrCaches(
]);
}
-export function useMergePullRequestMutation(ref: PrRef) {
+/** The hoisted operation-key getter a mutation arm stamps its fingerprint with. */
+type OperationKeyGetter = (fingerprint: string) => string;
+
+/** The GitHub merge arm — the pre-s6 call, unchanged. */
+// eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
+function githubMergeResult(
+ vars: MergePullRequestInput,
+ getKey: OperationKeyGetter
+): Promise {
+ return trpcClient.githubPrReview.mergePullRequest.mutate({
+ ...vars,
+ operationKey: getKey(prIntentFingerprint('merge', vars)),
+ });
+}
+
+/**
+ * The provider merge arm. One call per platform arm: a conditional spread
+ * inside a single literal would cross-multiply the identity union and hand
+ * the server gitlab-only fields on a bitbucket call. The layer reports no
+ * separate branch-delete outcome: the source-branch removal rides the merge
+ * call itself, so a committed merge is always the clean shape for the gate.
+ * A `done: false` answer is the same never-celebrate contract as GitHub's
+ * `merged: false`, but with provider wording: the default
+ * `MergeNotCompletedError` message names GitHub.
+ */
+async function providerMergeResult(
+ scope: ProviderPrScope,
+ vars: ProviderMergeVars,
+ getKey: OperationKeyGetter
+): Promise {
+ const identity = providerWriteIdentity(scope);
+ const merged =
+ identity.platform === 'gitlab'
+ ? await trpcClient.providerReview.mergePullRequest.mutate({
+ ...identity,
+ expectedHeadSha: vars.expectedHeadSha,
+ ...(vars.squash !== undefined ? { squash: vars.squash } : {}),
+ ...(vars.deleteBranch !== undefined ? { deleteBranch: vars.deleteBranch } : {}),
+ ...(vars.commitTitle !== undefined ? { commitTitle: vars.commitTitle } : {}),
+ ...(vars.commitMessage !== undefined ? { commitMessage: vars.commitMessage } : {}),
+ operationKey: getKey(
+ prIntentFingerprint(
+ 'merge',
+ providerFingerprintInput(identity, {
+ method: vars.squash ? 'squash' : 'merge',
+ commitTitle: vars.commitTitle,
+ commitMessage: vars.commitMessage,
+ deleteBranch: vars.deleteBranch,
+ expectedHeadSha: vars.expectedHeadSha,
+ })
+ )
+ ),
+ })
+ : await trpcClient.providerReview.mergePullRequest.mutate({
+ ...identity,
+ expectedHeadSha: vars.expectedHeadSha,
+ ...(vars.deleteBranch !== undefined ? { deleteBranch: vars.deleteBranch } : {}),
+ ...(vars.commitMessage !== undefined ? { commitMessage: vars.commitMessage } : {}),
+ operationKey: getKey(
+ prIntentFingerprint(
+ 'merge',
+ providerFingerprintInput(identity, {
+ method: 'merge',
+ commitMessage: vars.commitMessage,
+ deleteBranch: vars.deleteBranch,
+ expectedHeadSha: vars.expectedHeadSha,
+ })
+ )
+ ),
+ });
+ if (!merged.done) {
+ throw new MergeNotCompletedError({
+ sha: vars.expectedHeadSha,
+ message: i18n.t('prReview.operation.mergeResultNotCompleted', {
+ term: providerPrTerm(scope.ref.platform),
+ }),
+ });
+ }
+ return { merged: true, sha: vars.expectedHeadSha, branchDeleted: false };
+}
+
+export function useMergePullRequestMutation(ref: ReviewWriteRef) {
const queryClient = useQueryClient();
- const keys = usePrRefKeys(ref);
+ const scope = useReviewWriteScope(ref);
+ const keys = useMergeKeys(scope);
const { getKey, rotateKey } = useHoistedOperationKey();
// P0-B-08: gate success on the authoritative `merged: true` result
@@ -76,13 +225,13 @@ export function useMergePullRequestMutation(ref: PrRef) {
//
// P1-A-08c: the hoisted operation key rides the input so a same-key retry
// reconciles against authoritative PR state before ever re-merging.
- return useMutation({
+ return useMutation({
mutationFn: async input => {
try {
- const result = await trpcClient.githubPrReview.mergePullRequest.mutate({
- ...input,
- operationKey: getKey(prIntentFingerprint('merge', input)),
- });
+ const result =
+ scope.ref.platform === 'github'
+ ? await githubMergeResult(input as MergePullRequestInput, getKey)
+ : await providerMergeResult(scope, input as ProviderMergeVars, getKey);
// Throws on `merged: false`; returns the gate on clean / partial.
assertMergeResult(result);
rotateKey();
@@ -119,7 +268,7 @@ export function useMergePullRequestMutation(ref: PrRef) {
export function useUpdateBranchMutation(ref: PrRef) {
const trpc = useTRPC();
const queryClient = useQueryClient();
- const keys = usePrRefKeys(ref);
+ const keys = useMergeKeys({ ref: { platform: 'github', ...ref }, organizationId: null });
return useMutation(
trpc.githubPrReview.updateBranch.mutationOptions({
@@ -133,41 +282,104 @@ export function useUpdateBranchMutation(ref: PrRef) {
);
}
-export function useEnableAutoMergeMutation(ref: PrRef) {
- const trpc = useTRPC();
+/**
+ * Arm auto-merge. GitHub keeps its exact pre-s6 path; GitLab arms
+ * merge-when-pipeline-succeeds fenced on the head; Bitbucket Cloud has no
+ * auto-merge API, so the server answers `{supported: false, reason}` —
+ * the sheet shows the reason instead of celebrating.
+ */
+export function useEnableAutoMergeMutation(ref: ReviewWriteRef) {
const queryClient = useQueryClient();
- const keys = usePrRefKeys(ref);
+ const scope = useReviewWriteScope(ref);
+ const keys = useMergeKeys(scope);
+ const { getKey, rotateKey } = useHoistedOperationKey();
- return useMutation(
- trpc.githubPrReview.enableAutoMerge.mutationOptions({
- onSuccess: () => {
- // Bare success announcement beside the merge sheet's existing
- // auto-merge success effect (haptic + refetch + dismiss).
+ return useMutation({
+ mutationFn: async (vars: EnableAutoMergeVars) => {
+ if (scope.ref.platform === 'github') {
+ return trpcClient.githubPrReview.enableAutoMerge.mutate(vars as GithubAutoMergeInput);
+ }
+ try {
+ const result = await trpcClient.providerReview.enableAutoMerge.mutate({
+ ...providerWriteIdentity(scope),
+ expectedHeadSha: (vars as ProviderAutoMergeVars).expectedHeadSha,
+ operationKey: getKey(
+ prIntentFingerprint(
+ 'enable_auto_merge',
+ providerFingerprintInput(scope.ref, {
+ expectedHeadSha: (vars as ProviderAutoMergeVars).expectedHeadSha,
+ })
+ )
+ ),
+ });
+ rotateKey();
+ return result;
+ } catch (error) {
+ if (!isPrMutationRetryable(error)) {
+ rotateKey();
+ }
+ throw mapPrOperationError(error, 'merge');
+ }
+ },
+ onSuccess: (result: AutoMergeOutcome) => {
+ // Bare success announcement beside the merge sheet's existing
+ // auto-merge success effect (haptic + refetch + dismiss). A
+ // `supported: false` answer (Bitbucket) is not a success — the
+ // sheet renders the provider reason instead.
+ if (result.supported !== false) {
announceForA11y(i18n.t('prReview.announce.autoMergeEnabled'));
- },
- onError: (error: { message: string }) => {
- announcingToast.error(error.message);
- },
- onSettled: async () => {
- await invalidatePrCaches(queryClient, keys);
- },
- })
- );
+ }
+ },
+ onError: (error: { message: string }) => {
+ announcingToast.error(error.message);
+ },
+ onSettled: async () => {
+ await invalidatePrCaches(queryClient, keys);
+ },
+ });
}
-export function useDisableAutoMergeMutation(ref: PrRef) {
- const trpc = useTRPC();
+/** Cancel auto-merge. Same arms as `useEnableAutoMergeMutation`. */
+export function useDisableAutoMergeMutation(ref: ReviewWriteRef) {
const queryClient = useQueryClient();
- const keys = usePrRefKeys(ref);
+ const scope = useReviewWriteScope(ref);
+ const keys = useMergeKeys(scope);
+ const { getKey, rotateKey } = useHoistedOperationKey();
- return useMutation(
- trpc.githubPrReview.disableAutoMerge.mutationOptions({
- onError: (error: { message: string }) => {
- announcingToast.error(error.message);
- },
- onSettled: async () => {
- await invalidatePrCaches(queryClient, keys);
- },
- })
- );
+ return useMutation({
+ mutationFn: async (vars: DisableAutoMergeVars) => {
+ if (scope.ref.platform === 'github') {
+ return trpcClient.githubPrReview.disableAutoMerge.mutate(
+ vars as GithubDisableAutoMergeInput
+ );
+ }
+ try {
+ const result = await trpcClient.providerReview.disableAutoMerge.mutate({
+ ...providerWriteIdentity(scope),
+ expectedHeadSha: (vars as ProviderAutoMergeVars).expectedHeadSha,
+ operationKey: getKey(
+ prIntentFingerprint(
+ 'disable_auto_merge',
+ providerFingerprintInput(scope.ref, {
+ expectedHeadSha: (vars as ProviderAutoMergeVars).expectedHeadSha,
+ })
+ )
+ ),
+ });
+ rotateKey();
+ return result;
+ } catch (error) {
+ if (!isPrMutationRetryable(error)) {
+ rotateKey();
+ }
+ throw mapPrOperationError(error, 'merge');
+ }
+ },
+ onError: (error: { message: string }) => {
+ announcingToast.error(error.message);
+ },
+ onSettled: async () => {
+ await invalidatePrCaches(queryClient, keys);
+ },
+ });
}
diff --git a/apps/mobile/src/lib/pr-review/mutation-error-display.test.ts b/apps/mobile/src/lib/pr-review/mutation-error-display.test.ts
index 41654145b6..fc39709b4a 100644
--- a/apps/mobile/src/lib/pr-review/mutation-error-display.test.ts
+++ b/apps/mobile/src/lib/pr-review/mutation-error-display.test.ts
@@ -46,11 +46,11 @@ describe('mutationErrorDisplay', () => {
const ambiguous = new Error(PR_OPERATION_AMBIGUOUS_MESSAGE);
const classification = classifyPrReviewMutationError(ambiguous);
expect(classification).toEqual({ kind: 'retryable' });
- expect(mutationErrorDisplay('submit', classification, ambiguous)).toEqual({
+ expect(mutationErrorDisplay('submit', classification, { rawError: ambiguous })).toEqual({
kind: 'retryable',
message: PR_OPERATION_AMBIGUOUS_MESSAGE,
});
- expect(mutationErrorDisplay('composer', classification, ambiguous)).toEqual({
+ expect(mutationErrorDisplay('composer', classification, { rawError: ambiguous })).toEqual({
kind: 'retryable',
message: PR_OPERATION_AMBIGUOUS_MESSAGE,
});
@@ -68,14 +68,18 @@ describe('mutationErrorDisplay', () => {
const persistenceFailed = new Error(PR_OPERATION_PERSISTENCE_FAILED_MESSAGE);
const classification = classifyPrReviewMutationError(persistenceFailed);
expect(classification).toEqual({ kind: 'retryable' });
- expect(mutationErrorDisplay('composer', classification, persistenceFailed)).toEqual({
- kind: 'bad-request',
- message: PR_OPERATION_PERSISTENCE_FAILED_MESSAGE,
- });
- expect(mutationErrorDisplay('submit', classification, persistenceFailed)).toEqual({
+ expect(
+ mutationErrorDisplay('composer', classification, { rawError: persistenceFailed })
+ ).toEqual({
kind: 'bad-request',
message: PR_OPERATION_PERSISTENCE_FAILED_MESSAGE,
});
+ expect(mutationErrorDisplay('submit', classification, { rawError: persistenceFailed })).toEqual(
+ {
+ kind: 'bad-request',
+ message: PR_OPERATION_PERSISTENCE_FAILED_MESSAGE,
+ }
+ );
expect(mutationErrorDisplayFromError('submit', persistenceFailed)).toEqual({
kind: 'bad-request',
message: PR_OPERATION_PERSISTENCE_FAILED_MESSAGE,
@@ -98,6 +102,38 @@ describe('mutationErrorDisplay', () => {
});
});
+ it('words the submit bad-request copy after the connected provider when a term rides', () => {
+ // s6f: a rejected review submit on a GitLab merge request must never read
+ // "pull request". The provider arm passes the translated noun as `term`;
+ // GitHub (no term) keeps the exact pre-s6 copy asserted above.
+ const classification = classifyPrReviewMutationError(
+ makeError('BAD_REQUEST', 'You cannot perform the requested action')
+ );
+ expect(mutationErrorDisplay('submit', classification, { term: 'merge request' })).toEqual({
+ kind: 'bad-request',
+ message:
+ "This review can't be submitted as is. The merge request may have changed, or you can't review your own merge request.",
+ });
+ // The convenience wrapper forwards the term too.
+ expect(
+ mutationErrorDisplayFromError(
+ 'submit',
+ makeError('BAD_REQUEST', 'You cannot perform the requested action'),
+ 'merge request'
+ )
+ ).toEqual({
+ kind: 'bad-request',
+ message:
+ "This review can't be submitted as is. The merge request may have changed, or you can't review your own merge request.",
+ });
+ // The composer surface keeps its own copy even with a term.
+ expect(mutationErrorDisplay('composer', classification, { term: 'merge request' })).toEqual({
+ kind: 'bad-request',
+ message:
+ "This comment can't be posted. The selected line may have changed, or the PR may have been updated.",
+ });
+ });
+
it('keeps reconnect copy fixed on both surfaces', () => {
const classification = classifyPrReviewMutationError(
makeError('PRECONDITION_FAILED', 'revoked')
@@ -115,7 +151,7 @@ describe('mutationErrorDisplay', () => {
it('keeps retryable kinds with surface-appropriate messages', () => {
const networkError = new Error('Network request failed');
const classification = classifyPrReviewMutationError(networkError);
- expect(mutationErrorDisplay('composer', classification, networkError)).toEqual({
+ expect(mutationErrorDisplay('composer', classification, { rawError: networkError })).toEqual({
kind: 'retryable',
message: 'Network request failed',
});
@@ -123,7 +159,7 @@ describe('mutationErrorDisplay', () => {
kind: 'retryable',
message: 'Could not post comment.',
});
- expect(mutationErrorDisplay('submit', classification, networkError)).toEqual({
+ expect(mutationErrorDisplay('submit', classification, { rawError: networkError })).toEqual({
kind: 'retryable',
message: 'Could not submit review. Check your connection and try again.',
});
diff --git a/apps/mobile/src/lib/pr-review/mutation-error-display.ts b/apps/mobile/src/lib/pr-review/mutation-error-display.ts
index 343f67269c..d94019fbb0 100644
--- a/apps/mobile/src/lib/pr-review/mutation-error-display.ts
+++ b/apps/mobile/src/lib/pr-review/mutation-error-display.ts
@@ -27,6 +27,31 @@ type MutationErrorDisplay = {
type Classification = ReturnType;
+type MutationErrorDisplayOptions = {
+ /** The raw thrown error, used for the retryable composer copy. */
+ readonly rawError?: unknown;
+ /**
+ * The connected provider's noun, already translated (s6f): on the submit
+ * surface a bad-request then reads "The merge request may have changed, or
+ * you can't review your own merge request." instead of the hardcoded
+ * GitHub copy. Absent (GitHub), the exact pre-s6 copy stays.
+ */
+ readonly term?: string;
+};
+
+/**
+ * The bad-request inline copy per surface. The submit surface words the
+ * rejection after the connected provider when a term rides (s6f).
+ */
+function badRequestMessage(surface: MutationErrorDisplaySurface, term?: string): string {
+ if (surface === 'composer') {
+ return i18n.t('prReview.mutationError.commentNotPosted');
+ }
+ return term === undefined
+ ? i18n.t('prReview.mutationError.reviewNotSubmitted')
+ : i18n.t('prReview.mutationError.reviewNotSubmittedTerm', { term });
+}
+
/**
* Maps a mutation classification (and optional raw error for retryable
* composer copy) to the inline message the sheet should show.
@@ -34,8 +59,9 @@ type Classification = ReturnType;
export function mutationErrorDisplay(
surface: MutationErrorDisplaySurface,
classification: Classification,
- rawError?: unknown
+ options?: MutationErrorDisplayOptions
): MutationErrorDisplay {
+ const rawError = options?.rawError;
// The ambiguous outcome is NOT the generic retryable copy: the effect may
// have committed, so the user must verify the PR. Verbatim on both surfaces.
if (isPrOperationAmbiguous(rawError)) {
@@ -51,13 +77,7 @@ export function mutationErrorDisplay(
return { kind: 'forbidden', message: classification.message };
}
if (classification.kind === 'bad-request') {
- return {
- kind: 'bad-request',
- message:
- surface === 'composer'
- ? i18n.t('prReview.mutationError.commentNotPosted')
- : i18n.t('prReview.mutationError.reviewNotSubmitted'),
- };
+ return { kind: 'bad-request', message: badRequestMessage(surface, options?.term) };
}
if (classification.kind === 'reconnect') {
return { kind: 'reconnect', message: i18n.t('prReview.connectionExpired') };
@@ -78,7 +98,11 @@ export function mutationErrorDisplay(
*/
export function mutationErrorDisplayFromError(
surface: MutationErrorDisplaySurface,
- error: unknown
+ error: unknown,
+ term?: string
): MutationErrorDisplay {
- return mutationErrorDisplay(surface, classifyPrReviewMutationError(error), error);
+ return mutationErrorDisplay(surface, classifyPrReviewMutationError(error), {
+ rawError: error,
+ term,
+ });
}
diff --git a/apps/mobile/src/lib/pr-review/pending-review-provider.mounted.test.tsx b/apps/mobile/src/lib/pr-review/pending-review-provider.mounted.test.tsx
index 6aebc5936d..c26bae8172 100644
--- a/apps/mobile/src/lib/pr-review/pending-review-provider.mounted.test.tsx
+++ b/apps/mobile/src/lib/pr-review/pending-review-provider.mounted.test.tsx
@@ -9,6 +9,7 @@ import {
pendingReviewDraftKey,
type PendingReviewItem,
PendingReviewProvider,
+ providerPendingReviewDraftKey,
usePendingReview,
} from './pending-review-provider';
@@ -401,3 +402,80 @@ describe('PendingReviewProvider persistence', () => {
expect(draftsMock.flushDraft).toHaveBeenCalledWith('u1', 'pr-review:acme/kilo#42');
});
});
+
+describe('providerPendingReviewDraftKey (s6, identity rule 17)', () => {
+ it('keeps the legacy GitHub bytes unchanged for a github ref (migration)', () => {
+ expect(
+ providerPendingReviewDraftKey({
+ platform: 'github',
+ owner: 'octocat',
+ repo: 'hello',
+ number: 42,
+ })
+ ).toBe(pendingReviewDraftKey('octocat', 'hello', 42));
+ expect(
+ providerPendingReviewDraftKey({
+ platform: 'github',
+ owner: 'Kilo-Org',
+ repo: 'Cloud',
+ number: 42,
+ })
+ ).toBe('pr-review:kilo-org/cloud#42');
+ });
+
+ it('separates a GitLab MR from a same-triple GitHub PR queue', () => {
+ const github = providerPendingReviewDraftKey({
+ platform: 'github',
+ owner: 'group',
+ repo: 'app',
+ number: 7,
+ });
+ const gitlab = providerPendingReviewDraftKey({
+ platform: 'gitlab',
+ projectPath: 'group/app',
+ mrIid: 7,
+ instanceHint: 'https://gitlab.example.com',
+ });
+ expect(gitlab).not.toBe(github);
+ expect(gitlab.startsWith(`${github}@`)).toBe(true);
+ });
+
+ it('separates one GitLab project reached on two instances', () => {
+ const atGitlab = providerPendingReviewDraftKey({
+ platform: 'gitlab',
+ projectPath: 'group/app',
+ mrIid: 7,
+ instanceHint: 'https://gitlab.com',
+ });
+ const atSelfManaged = providerPendingReviewDraftKey({
+ platform: 'gitlab',
+ projectPath: 'group/app',
+ mrIid: 7,
+ instanceHint: 'https://gitlab.example.com',
+ });
+ const withoutHint = providerPendingReviewDraftKey({
+ platform: 'gitlab',
+ projectPath: 'group/app',
+ mrIid: 7,
+ });
+ expect(atGitlab).not.toBe(atSelfManaged);
+ // An absent hint folds to '' — deliberately NOT equal to the SaaS host.
+ expect(withoutHint).not.toBe(atGitlab);
+ });
+
+ it('separates same-numbered Bitbucket PRs across workspaces', () => {
+ const one = providerPendingReviewDraftKey({
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'app',
+ prId: 7,
+ });
+ const other = providerPendingReviewDraftKey({
+ platform: 'bitbucket',
+ workspace: 'other',
+ repoSlug: 'app',
+ prId: 7,
+ });
+ expect(one).not.toBe(other);
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/pending-review-provider.tsx b/apps/mobile/src/lib/pr-review/pending-review-provider.tsx
index 6e61d5e033..c1920a02a4 100644
--- a/apps/mobile/src/lib/pr-review/pending-review-provider.tsx
+++ b/apps/mobile/src/lib/pr-review/pending-review-provider.tsx
@@ -10,7 +10,11 @@ import {
useState,
} from 'react';
import { z } from 'zod';
+
+import { type ProviderPrRef, providerPrRefKey } from '@kilocode/app-shared/provider-review';
+
import { clearDraft, loadDraft, prReviewDraftKey, saveDraft } from '@/lib/persist/drafts';
+import { providerPrTriple } from '@/lib/pr-review/provider-pr-ref';
import { useDraftFlushOnBackground } from '@/lib/persist/use-draft-flush';
// One queued inline comment in the pending review. The composer fills
@@ -78,6 +82,23 @@ export function pendingReviewDraftKey(owner: string, repo: string, number: numbe
return prReviewDraftKey(owner.toLowerCase(), repo.toLowerCase(), number);
}
+/**
+ * Draft entity key for one PR/MR on ANY provider (s6, identity rule 17). The
+ * GitHub arm returns the legacy `pendingReviewDraftKey` bytes unchanged, so a
+ * queue persisted before the provider surface keeps loading. A GitLab or
+ * Bitbucket ref folds the s1 collision-free `providerPrRefKey` into the same
+ * key, so a GitLab MR and a same-numbered GitHub PR — and one project reached
+ * on two GitLab instances — can never share a queue.
+ */
+export function providerPendingReviewDraftKey(ref: ProviderPrRef): string {
+ const triple = providerPrTriple(ref);
+ const legacy = pendingReviewDraftKey(triple.owner, triple.repo, triple.number);
+ if (ref.platform === 'github') {
+ return legacy;
+ }
+ return `${legacy}@${providerPrRefKey(ref)}`;
+}
+
type PendingReviewContextValue = {
items: PendingReviewItem[];
addComment: (item: PendingReviewItem) => void;
diff --git a/apps/mobile/src/lib/pr-review/pr-link-paste.test.ts b/apps/mobile/src/lib/pr-review/pr-link-paste.test.ts
index 3d28c66e44..0796c892dc 100644
--- a/apps/mobile/src/lib/pr-review/pr-link-paste.test.ts
+++ b/apps/mobile/src/lib/pr-review/pr-link-paste.test.ts
@@ -1,6 +1,7 @@
import { describe, expect, it } from 'vitest';
import {
+ decidePrLinkOpen,
decidePrLinkPaste,
prLinkToastClipboardEmptyCopy,
prLinkToastInvalidCopy,
@@ -31,7 +32,38 @@ describe('decidePrLinkPaste', () => {
});
});
- it('returns non-url-text with trimmed text for non-PR content', () => {
+ it('returns valid-pr-url for a gitlab.com merge request', () => {
+ const url = 'https://gitlab.com/group/sub/repo/-/merge_requests/123';
+ expect(decidePrLinkPaste(url)).toEqual({ kind: 'valid-pr-url', text: url });
+ });
+
+ it('returns valid-pr-url for a self-managed GitLab host, legacy form included', () => {
+ expect(
+ decidePrLinkPaste('https://gitlab.example.com/acme/api/-/merge_requests/9/diffs')
+ ).toEqual({
+ kind: 'valid-pr-url',
+ text: 'https://gitlab.example.com/acme/api/-/merge_requests/9/diffs',
+ });
+ expect(decidePrLinkPaste('https://gitlab.example.com/acme/api/merge_requests/9')).toEqual({
+ kind: 'valid-pr-url',
+ text: 'https://gitlab.example.com/acme/api/merge_requests/9',
+ });
+ });
+
+ it('returns valid-pr-url for a Bitbucket pull request, overview variant included', () => {
+ expect(decidePrLinkPaste('https://bitbucket.org/acme/api/pull-requests/42')).toEqual({
+ kind: 'valid-pr-url',
+ text: 'https://bitbucket.org/acme/api/pull-requests/42',
+ });
+ expect(
+ decidePrLinkPaste('https://bitbucket.org/acme/api/pull-requests/42/overview?tab=commits')
+ ).toEqual({
+ kind: 'valid-pr-url',
+ text: 'https://bitbucket.org/acme/api/pull-requests/42/overview?tab=commits',
+ });
+ });
+
+ it('returns non-url-text with trimmed text for non-review content', () => {
expect(decidePrLinkPaste(' not a url ')).toEqual({
kind: 'non-url-text',
text: 'not a url',
@@ -44,6 +76,46 @@ describe('decidePrLinkPaste', () => {
kind: 'non-url-text',
text: 'https://gitlab.com/o/r/pull/1',
});
+ expect(decidePrLinkPaste('https://bitbucket.org/acme/api/pull-requests/abc')).toEqual({
+ kind: 'non-url-text',
+ text: 'https://bitbucket.org/acme/api/pull-requests/abc',
+ });
+ });
+});
+
+describe('decidePrLinkOpen', () => {
+ it('returns the GitHub ref for a github.com PR link', () => {
+ expect(decidePrLinkOpen('https://github.com/octocat/hello-world/pull/42')).toEqual({
+ kind: 'open',
+ ref: { platform: 'github', owner: 'octocat', repo: 'hello-world', number: 42 },
+ });
+ });
+
+ it('returns the GitLab ref with the pasted origin as instanceHint', () => {
+ expect(
+ decidePrLinkOpen(' https://gitlab.example.com/group/sub/repo/-/merge_requests/7#note_1 ')
+ ).toEqual({
+ kind: 'open',
+ ref: {
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 7,
+ instanceHint: 'https://gitlab.example.com',
+ },
+ });
+ });
+
+ it('returns the Bitbucket ref for a pull request link', () => {
+ expect(decidePrLinkOpen('https://bitbucket.org/acme/api/pull-requests/42')).toEqual({
+ kind: 'open',
+ ref: { platform: 'bitbucket', workspace: 'acme', repoSlug: 'api', prId: 42 },
+ });
+ });
+
+ it('returns invalid for anything no provider serves', () => {
+ expect(decidePrLinkOpen('hello')).toEqual({ kind: 'invalid' });
+ expect(decidePrLinkOpen('https://github.example.com/o/r/pull/1')).toEqual({ kind: 'invalid' });
+ expect(decidePrLinkOpen('')).toEqual({ kind: 'invalid' });
});
});
@@ -60,6 +132,6 @@ describe('selectPrLinkClearButtonVisible', () => {
describe('PR link toast copy', () => {
it('exports the pinned toast copy strings', () => {
expect(prLinkToastClipboardEmptyCopy()).toBe('Clipboard is empty');
- expect(prLinkToastInvalidCopy()).toBe('Not a GitHub pull request link');
+ expect(prLinkToastInvalidCopy()).toBe('Not a pull request or merge request link');
});
});
diff --git a/apps/mobile/src/lib/pr-review/pr-link-paste.ts b/apps/mobile/src/lib/pr-review/pr-link-paste.ts
index c9a693327e..2189723872 100644
--- a/apps/mobile/src/lib/pr-review/pr-link-paste.ts
+++ b/apps/mobile/src/lib/pr-review/pr-link-paste.ts
@@ -1,5 +1,7 @@
+import { type ProviderPrRef } from '@kilocode/app-shared/provider-review';
+
import { i18n } from '@/i18n';
-import { parseGitHubPrUrl } from '@/lib/github-pr-url';
+import { parseProviderPrUrl } from '@/lib/pr-review/provider-pr-url';
type PrLinkPasteDecision =
| { kind: 'valid-pr-url'; text: string }
@@ -8,20 +10,36 @@ type PrLinkPasteDecision =
/**
* Decide how a paste-button tap should treat clipboard contents.
- * Trims first; empty → no insertion; valid PR URL → replace + navigate;
- * anything else → replace + invalid toast at the call site.
+ * Trims first; empty → no insertion; a GitHub, GitLab (any host, including
+ * self-managed) or Bitbucket review URL → replace + navigate; anything else
+ * → replace + invalid toast at the call site.
*/
export function decidePrLinkPaste(clipboard: string | null | undefined): PrLinkPasteDecision {
const text = (clipboard ?? '').trim();
if (text.length === 0) {
return { kind: 'empty' };
}
- if (parseGitHubPrUrl(text) !== null) {
+ if (parseProviderPrUrl(text) !== null) {
return { kind: 'valid-pr-url', text };
}
return { kind: 'non-url-text', text };
}
+type PrLinkOpenDecision = { kind: 'open'; ref: ProviderPrRef } | { kind: 'invalid' };
+
+/**
+ * Decide what the entry screen's Open action does with the field text: parse
+ * it through the one provider URL resolver and hand back the review identity
+ * it names, or the invalid-link state. Self-managed GitLab hosts parse here
+ * too — the server re-derives the authoritative instance (s2), so a
+ * mismatched host lands on the clear not-authorized state downstream, never
+ * a redirect.
+ */
+export function decidePrLinkOpen(raw: string): PrLinkOpenDecision {
+ const ref = parseProviderPrUrl(raw.trim());
+ return ref ? { kind: 'open', ref } : { kind: 'invalid' };
+}
+
type PrLinkClearButtonInput = {
/** Whether the uncontrolled PR-link field currently has any text. */
readonly hasInput: boolean;
@@ -39,7 +57,10 @@ export function selectPrLinkClearButtonVisible(input: PrLinkClearButtonInput): b
export function prLinkToastClipboardEmptyCopy(): string {
return i18n.t('prReview.linkPasteClipboardEmpty');
}
-/** Toast copy when paste or Open gets a non-PR link. */
+/** Toast copy when paste or Open gets a link no provider serves. */
export function prLinkToastInvalidCopy(): string {
+ // Reuses the pre-s7 key: it exists in all 86 catalogs, and renaming it in
+ // en.json alone would make every catalog an "extra key" failure. s9
+ // retranslates the changed English value.
return i18n.t('prReview.linkPasteNotAPullRequest');
}
diff --git a/apps/mobile/src/lib/pr-review/pr-review-connect-gate-view.test.ts b/apps/mobile/src/lib/pr-review/pr-review-connect-gate-view.test.ts
new file mode 100644
index 0000000000..d0f1b3063c
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/pr-review-connect-gate-view.test.ts
@@ -0,0 +1,163 @@
+import { describe, expect, it } from 'vitest';
+
+import { parseProviderPrRoute, providerPrRoutePath } from './provider-pr-ref';
+import { parseProviderPrUrl } from './provider-pr-url';
+import { selectPrReviewGateView } from './pr-review-connect-gate-view';
+
+/** A GitHub arm with everything settled and connected. */
+const githubBase = {
+ platform: 'github' as const,
+ isError: false,
+ isLoading: false,
+ connected: true,
+ revoked: false,
+ organizationId: null,
+};
+
+describe('selectPrReviewGateView — GitHub', () => {
+ it('renders children when connected', () => {
+ expect(selectPrReviewGateView(githubBase)).toBe('children');
+ });
+
+ it('error outranks loading and connection', () => {
+ expect(selectPrReviewGateView({ ...githubBase, isError: true, isLoading: true })).toBe('error');
+ });
+
+ it('loading outranks a not-yet-known connection', () => {
+ expect(selectPrReviewGateView({ ...githubBase, isLoading: true, connected: false })).toBe(
+ 'loading'
+ );
+ });
+
+ it('not connected asks to connect', () => {
+ expect(selectPrReviewGateView({ ...githubBase, connected: false })).toBe('connect');
+ });
+
+ it('a revoked connection asks to reconnect', () => {
+ expect(selectPrReviewGateView({ ...githubBase, connected: false, revoked: true })).toBe(
+ 'reconnect'
+ );
+ });
+
+ it('revoked never outranks a connected answer', () => {
+ expect(selectPrReviewGateView({ ...githubBase, revoked: true })).toBe('children');
+ });
+});
+
+describe('selectPrReviewGateView — GitLab (personal and org)', () => {
+ for (const organizationId of [null, 'org_1']) {
+ const base = {
+ platform: 'gitlab' as const,
+ isError: false,
+ isLoading: false,
+ connected: true,
+ revoked: false,
+ organizationId,
+ };
+
+ it(`scope ${organizationId ?? 'personal'}: connected renders children`, () => {
+ expect(selectPrReviewGateView(base)).toBe('children');
+ });
+
+ it(`scope ${organizationId ?? 'personal'}: not connected asks to connect`, () => {
+ expect(selectPrReviewGateView({ ...base, connected: false })).toBe('connect');
+ });
+
+ it(`scope ${organizationId ?? 'personal'}: a failed check is retryable, not Connect`, () => {
+ expect(selectPrReviewGateView({ ...base, isError: true, connected: false })).toBe('error');
+ });
+
+ it(`scope ${organizationId ?? 'personal'}: a pending check is loading, not Connect`, () => {
+ expect(selectPrReviewGateView({ ...base, isLoading: true, connected: false })).toBe(
+ 'loading'
+ );
+ });
+ }
+});
+
+describe('selectPrReviewGateView — Bitbucket', () => {
+ const orgBase = {
+ platform: 'bitbucket' as const,
+ isError: false,
+ isLoading: false,
+ connected: true,
+ revoked: false,
+ organizationId: 'org_1',
+ };
+
+ it('an org scope behaves like the other arms', () => {
+ expect(selectPrReviewGateView(orgBase)).toBe('children');
+ expect(selectPrReviewGateView({ ...orgBase, connected: false })).toBe('connect');
+ expect(selectPrReviewGateView({ ...orgBase, isError: true })).toBe('error');
+ expect(selectPrReviewGateView({ ...orgBase, isLoading: true, connected: false })).toBe(
+ 'loading'
+ );
+ });
+
+ it('a personal scope is the terminal org-only state', () => {
+ expect(selectPrReviewGateView({ ...orgBase, organizationId: null, connected: false })).toBe(
+ 'org-only'
+ );
+ });
+
+ it('org-only outranks a failed check — the disabled query has nothing to retry', () => {
+ expect(
+ selectPrReviewGateView({
+ ...orgBase,
+ organizationId: null,
+ isError: true,
+ connected: false,
+ })
+ ).toBe('org-only');
+ });
+
+ it('org-only outranks a pending check — a disabled query reports pending forever', () => {
+ expect(
+ selectPrReviewGateView({
+ ...orgBase,
+ organizationId: null,
+ isLoading: true,
+ connected: false,
+ })
+ ).toBe('org-only');
+ });
+
+ /**
+ * The spot-check defect behind s7's org-only arm: a Bitbucket PR link
+ * opened in the personal scope must reach the org-only explanation, never
+ * the invalid-route state. This binds the full in-app chain — the URL
+ * every entry point parses (badge, paste, recents), the route it pushes,
+ * the layout's own re-parse of that route, and the gate's decision.
+ */
+ it('a Bitbucket PR link lands on the org-only gate in the personal scope', () => {
+ const url = 'https://bitbucket.org/workspace/repo/pull-requests/12';
+ const ref = parseProviderPrUrl(url);
+ if (ref === null) {
+ throw new Error('the Bitbucket URL did not parse');
+ }
+ const route = providerPrRoutePath(ref);
+ expect(route).toBe('/(app)/pr-review/bitbucket/workspace/repo/12');
+
+ const reparsed = parseProviderPrRoute({
+ platform: 'bitbucket',
+ identity: ['workspace', 'repo', '12'],
+ });
+ if (reparsed === null) {
+ throw new Error('the pushed route did not re-parse');
+ }
+ expect(reparsed.platform).toBe('bitbucket');
+
+ // The personal scope (organizationId null) is the terminal org-only
+ // state — the gate never falls through to a retryable error or Connect.
+ expect(
+ selectPrReviewGateView({
+ platform: 'bitbucket',
+ isError: false,
+ isLoading: true,
+ connected: false,
+ revoked: false,
+ organizationId: null,
+ })
+ ).toBe('org-only');
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/pr-review-connect-gate-view.ts b/apps/mobile/src/lib/pr-review/pr-review-connect-gate-view.ts
new file mode 100644
index 0000000000..cd2bc50984
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/pr-review-connect-gate-view.ts
@@ -0,0 +1,54 @@
+// Pure view selector for the provider-aware PR-review connect gate (s7).
+//
+// Extracted so every arm's branch order is unit-tested without mounting the
+// gate. The gate keeps its simple priority ladder — a terminal explanation
+// outranks a failed check, which outranks a pending check, which outranks
+// Connect — and every non-happy outcome lands in a fixed set of
+// header-bearing states.
+
+import { type ProviderPrPlatform } from '@kilocode/app-shared/provider-review';
+
+export type PrReviewGateView =
+ | 'error'
+ | 'loading'
+ | 'org-only'
+ | 'connect'
+ | 'reconnect'
+ | 'children';
+
+export type SelectPrReviewGateViewInput = {
+ /** Which provider's connection this mount checks. */
+ readonly platform: ProviderPrPlatform;
+ readonly isError: boolean;
+ readonly isLoading: boolean;
+ readonly connected: boolean;
+ /** GitHub only: the user revoked the connection. */
+ readonly revoked: boolean;
+ /** The selected organization, or null for the personal scope. */
+ readonly organizationId: string | null;
+};
+
+/**
+ * Decide the gate's view.
+ *
+ * Bitbucket Cloud is organization-context only (s4), so a personal scope has
+ * no integration to connect and no retry that could succeed: the org-only
+ * explanation is the terminal state and outranks even a failed or pending
+ * check (the provider query is disabled there, and a disabled query reports
+ * pending forever).
+ */
+export function selectPrReviewGateView(args: SelectPrReviewGateViewInput): PrReviewGateView {
+ if (args.platform === 'bitbucket' && args.organizationId === null) {
+ return 'org-only';
+ }
+ if (args.isError) {
+ return 'error';
+ }
+ if (args.isLoading) {
+ return 'loading';
+ }
+ if (!args.connected) {
+ return args.revoked ? 'reconnect' : 'connect';
+ }
+ return 'children';
+}
diff --git a/apps/mobile/src/lib/pr-review/provider-pr-queries.test.ts b/apps/mobile/src/lib/pr-review/provider-pr-queries.test.ts
new file mode 100644
index 0000000000..fd1f9b9f32
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/provider-pr-queries.test.ts
@@ -0,0 +1,378 @@
+/* eslint-disable max-lines -- the namespace-selection tests and the pure normalizer tests share the same stubbed-trpc harness. */
+import { describe, expect, it, vi } from 'vitest';
+
+import {
+ buildPrChecksQueryOptions,
+ buildPrFileLinesQueryOptions,
+ buildPrFilesQueryOptions,
+ buildPrMergeStateQueryOptions,
+ buildPrOverviewQueryOptions,
+ buildPrThreadsQueryOptions,
+ normalizeProviderChecks,
+ normalizeProviderOverview,
+ normalizeProviderThreadsPage,
+ normalizePrThreadsPages,
+ providerCapabilitiesIdentity,
+} from './provider-pr-queries';
+import { githubPrRef, isProviderScopeReady, type ProviderPrScope } from './provider-pr-ref';
+
+// `provider-pr-queries` imports `useTRPC` from `@/lib/trpc`, which pulls the
+// whole expo auth/token module graph. Mock it so the module loads under Node.
+vi.mock('@/lib/trpc', () => ({ useTRPC: () => ({}) }));
+
+type Trpc = Parameters[0];
+
+// Every read procedure both namespaces answer, stubbed by name so a builder
+// that picked the wrong namespace shows up as the wrong `procedure` tag.
+const GITHUB_PROCEDURES = ['getPullRequest', 'listChecks', 'listFiles', 'listReviewThreads'];
+const PROVIDER_PROCEDURES = ['listDiscussions', 'getFileLines', 'getMergeState', 'getCapabilities'];
+
+function makeTrpc() {
+ const record = (name: string) =>
+ vi.fn((input: unknown, opts: Record = {}) => ({
+ procedure: name,
+ input,
+ ...opts,
+ }));
+ const query = (namespace: string, name: string) => ({
+ queryOptions: record(`${namespace}.${name}`),
+ infiniteQueryOptions: record(`${namespace}.${name}`),
+ });
+ const namespaceOf = (namespace: string) =>
+ Object.fromEntries(
+ [...GITHUB_PROCEDURES, ...PROVIDER_PROCEDURES].map(name => [name, query(namespace, name)])
+ );
+ const trpc = { githubPrReview: namespaceOf('github'), providerReview: namespaceOf('provider') };
+ return { trpc: trpc as unknown as Trpc };
+}
+
+const githubScope: ProviderPrScope = {
+ ref: githubPrRef('octocat', 'hello', 7),
+ organizationId: null,
+};
+const gitlabScope: ProviderPrScope = {
+ ref: { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 },
+ organizationId: null,
+};
+const bitbucketScope: ProviderPrScope = {
+ ref: { platform: 'bitbucket', workspace: 'acme', repoSlug: 'api', prId: 42 },
+ organizationId: 'org-1',
+};
+
+/** First element, asserted present — `noUncheckedIndexedAccess` is on. */
+function first(items: readonly T[]): T {
+ const item = items[0];
+ if (item === undefined) {
+ throw new Error('expected at least one item');
+ }
+ return item;
+}
+
+function loose(options: unknown) {
+ return options as {
+ procedure: string;
+ input: Record;
+ enabled?: boolean;
+ getNextPageParam?: (page: { nextCursor: string | null }) => unknown;
+ };
+}
+
+describe('namespace selection', () => {
+ it('sends a GitHub ref to githubPrReview with the owner/repo/number input', () => {
+ const { trpc } = makeTrpc();
+ const overview = loose(buildPrOverviewQueryOptions(trpc, githubScope));
+ expect(overview.procedure).toBe('github.getPullRequest');
+ expect(overview.input).toEqual({ owner: 'octocat', repo: 'hello', number: 7 });
+ expect(loose(buildPrChecksQueryOptions(trpc, githubScope, 'abc')).input).toEqual({
+ owner: 'octocat',
+ repo: 'hello',
+ ref: 'abc',
+ });
+ expect(loose(buildPrFilesQueryOptions(trpc, githubScope, true)).procedure).toBe(
+ 'github.listFiles'
+ );
+ expect(loose(buildPrThreadsQueryOptions(trpc, githubScope)).procedure).toBe(
+ 'github.listReviewThreads'
+ );
+ });
+
+ it('sends a GitLab ref to providerReview with the full nested project path', () => {
+ const { trpc } = makeTrpc();
+ const overview = loose(buildPrOverviewQueryOptions(trpc, gitlabScope));
+ expect(overview.procedure).toBe('provider.getPullRequest');
+ expect(overview.input).toEqual({
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ });
+ expect(loose(buildPrThreadsQueryOptions(trpc, gitlabScope)).procedure).toBe(
+ 'provider.listDiscussions'
+ );
+ });
+
+ it('carries the GitLab instance hint and the selected organization', () => {
+ const ref = {
+ platform: 'gitlab',
+ projectPath: 'group/repo',
+ mrIid: 3,
+ instanceHint: 'gitlab.example.com',
+ } as const;
+ const { trpc } = makeTrpc();
+ expect(
+ loose(buildPrOverviewQueryOptions(trpc, { ref, organizationId: 'org-9' })).input
+ ).toEqual({ ...ref, organizationId: 'org-9' });
+ });
+
+ it('sends a Bitbucket ref with workspace, repo slug and organization', () => {
+ const { trpc } = makeTrpc();
+ expect(loose(buildPrOverviewQueryOptions(trpc, bitbucketScope)).input).toEqual({
+ ...bitbucketScope.ref,
+ organizationId: 'org-1',
+ });
+ });
+
+ it('keeps the same expanded-context procedure shape for every provider', () => {
+ const { trpc } = makeTrpc();
+ const input = { ref: 'sha', path: 'src/a.ts', startLine: 1, endLine: 20 };
+ expect(loose(buildPrFileLinesQueryOptions(trpc, githubScope, input)).input).toMatchObject({
+ owner: 'octocat',
+ repo: 'hello',
+ ...input,
+ });
+ expect(loose(buildPrFileLinesQueryOptions(trpc, gitlabScope, input)).input).toMatchObject({
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ ...input,
+ });
+ });
+
+ it('keeps the GitHub merge-state query disabled (the overview carries the gate)', () => {
+ const { trpc } = makeTrpc();
+ // The GitHub arm registers a never-enabled query so the hook keeps one
+ // type; nothing leaves the app on that path.
+ const githubOptions = loose(buildPrMergeStateQueryOptions(trpc, githubScope));
+ expect(githubOptions.procedure).toBe('provider.getMergeState');
+ expect(githubOptions.enabled).toBe(false);
+ const gitlabOptions = loose(buildPrMergeStateQueryOptions(trpc, gitlabScope));
+ expect(gitlabOptions.procedure).toBe('provider.getMergeState');
+ expect(gitlabOptions.enabled).toBe(true);
+ });
+
+ it('builds the capability identity from the platform, never a repository ref', () => {
+ // The `getCapabilities` query itself stays at its call site (the option
+ // type only resolves inline); the seam owns the identity it reads under.
+ expect(providerCapabilitiesIdentity(gitlabScope)).toEqual({ platform: 'gitlab' });
+ expect(
+ providerCapabilitiesIdentity({
+ ref: {
+ platform: 'gitlab',
+ projectPath: 'g/r',
+ mrIid: 1,
+ instanceHint: 'gitlab.example.com',
+ },
+ organizationId: 'org-2',
+ })
+ ).toEqual({ platform: 'gitlab', instanceHint: 'gitlab.example.com', organizationId: 'org-2' });
+ expect(providerCapabilitiesIdentity(bitbucketScope)).toEqual({
+ platform: 'bitbucket',
+ organizationId: 'org-1',
+ });
+ });
+
+ it('paginates each provider on its own opaque cursor', () => {
+ const { trpc } = makeTrpc();
+ const files = loose(buildPrFilesQueryOptions(trpc, gitlabScope, true));
+ const page: { nextCursor: string | null } = { nextCursor: 'page-2' };
+ expect(files.getNextPageParam?.(page)).toBe('page-2');
+ expect(files.getNextPageParam?.({ nextCursor: null })).toBeUndefined();
+ });
+});
+
+describe('organization readiness', () => {
+ it('disables a Bitbucket query until an organization is selected', () => {
+ const { trpc } = makeTrpc();
+ const scope = { ...bitbucketScope, organizationId: null };
+ expect(isProviderScopeReady(scope)).toBe(false);
+ expect(loose(buildPrOverviewQueryOptions(trpc, scope)).enabled).toBe(false);
+ expect(loose(buildPrChecksQueryOptions(trpc, scope, 'sha')).enabled).toBe(false);
+ expect(loose(buildPrFilesQueryOptions(trpc, scope, true)).enabled).toBe(false);
+ });
+
+ it('runs GitHub and personal GitLab without an organization, and honours enabled', () => {
+ const { trpc } = makeTrpc();
+ expect([githubScope, gitlabScope].every(scope => isProviderScopeReady(scope))).toBe(true);
+ expect(loose(buildPrFilesQueryOptions(trpc, bitbucketScope, false)).enabled).toBe(false);
+ expect(loose(buildPrFilesQueryOptions(trpc, bitbucketScope, true)).enabled).toBe(true);
+ });
+});
+
+describe('normalizeProviderChecks', () => {
+ it('maps provider run states onto the vocabulary the checks section reads', () => {
+ const result = normalizeProviderChecks({
+ checks: [
+ { name: 'build', status: 'success', conclusion: 'success', detailsUrl: 'https://x/1' },
+ { name: 'test', status: 'failed', conclusion: 'failed', detailsUrl: null },
+ { name: 'lint', status: 'running', conclusion: null, detailsUrl: null },
+ { name: 'deploy', status: 'canceled', conclusion: 'canceled', detailsUrl: null },
+ ],
+ });
+ expect(result.checkRuns.map(run => [run.status, run.conclusion])).toEqual([
+ ['completed', 'success'],
+ ['completed', 'failure'],
+ ['in_progress', null],
+ ['completed', 'cancelled'],
+ ]);
+ expect(result.rollup).toEqual({ total: 4, success: 1, failure: 1, pending: 1, skipped: 1 });
+ // Empty: a provider with no pipeline at all reports a zeroed rollup.
+ const empty = { total: 0, success: 0, failure: 0, pending: 0, skipped: 0 };
+ expect(normalizeProviderChecks({ checks: [] })).toEqual({ checkRuns: [], rollup: empty });
+ });
+});
+
+describe('normalizeProviderThreadsPage', () => {
+ const comment = {
+ commentId: '4821',
+ author: { login: 'ada', avatarUrl: null },
+ body: 'nit',
+ createdAt: '2026-01-01T00:00:00Z',
+ };
+ const thread = {
+ threadId: 'disc-1',
+ resolved: true,
+ path: 'src/a.ts',
+ line: 12,
+ side: 'RIGHT' as const,
+ comments: [comment],
+ };
+
+ it('maps a line-anchored resolved thread', () => {
+ const page = normalizeProviderThreadsPage({ threads: [thread], nextCursor: 'c2' });
+ expect(page.nextCursor).toBe('c2');
+ expect(page.conversation).toEqual([]);
+ expect(first(page.threads)).toMatchObject({
+ threadId: 'disc-1',
+ isResolved: true,
+ isOutdated: false,
+ subjectType: 'LINE',
+ path: 'src/a.ts',
+ line: 12,
+ diffSide: 'RIGHT',
+ });
+ // Reactions come from no provider read layer, and Bitbucket has none.
+ expect(first(first(page.threads).comments)).toMatchObject({
+ commentId: 4821,
+ nodeId: '4821',
+ reactions: [],
+ });
+ });
+
+ it('treats an unanchored discussion as a file-level thread', () => {
+ const page = normalizeProviderThreadsPage({
+ threads: [{ ...thread, path: null, line: null, side: null }],
+ nextCursor: null,
+ });
+ expect(first(page.threads).subjectType).toBe('FILE');
+ expect(first(page.threads).line).toBeNull();
+ });
+
+ it('gives a non-numeric provider comment id a stable positive key', () => {
+ const build = () =>
+ first(
+ first(
+ normalizeProviderThreadsPage({
+ threads: [{ ...thread, comments: [{ ...comment, commentId: 'ab12cd' }] }],
+ nextCursor: null,
+ }).threads
+ ).comments
+ );
+ expect(build().commentId).toBe(build().commentId);
+ expect(build().commentId).toBeGreaterThan(0);
+ expect(build().nodeId).toBe('ab12cd');
+ });
+
+ it('passes GitHub pages through untouched and maps provider pages', () => {
+ const githubPage = { threads: [], conversation: [], nextCursor: null };
+ expect(normalizePrThreadsPages('github', [githubPage])).toEqual([githubPage]);
+ const mapped = normalizePrThreadsPages('gitlab', [
+ { threads: [thread], nextCursor: null },
+ ] as never);
+ expect(first(first(mapped).threads).threadId).toBe('disc-1');
+ expect(normalizePrThreadsPages('gitlab', undefined)).toEqual([]);
+ });
+
+ it('drops a discussion whose notes are all system events', () => {
+ // GitLab reports every MR event (pushes, assignments) as a discussion,
+ // and the read layer strips the system notes — what remains carries no
+ // discussion content. Kept, it would count as content and the tab would
+ // render a blank list with no comments, no empty state, and no error
+ // (spot check e7).
+ const page = normalizeProviderThreadsPage({
+ threads: [thread, { ...thread, threadId: 'disc-system', comments: [] }],
+ nextCursor: null,
+ });
+ expect(page.threads.map(entry => entry.threadId)).toEqual(['disc-1']);
+ });
+});
+
+describe('normalizeProviderOverview', () => {
+ const summary = {
+ ref: { platform: 'gitlab' as const, projectPath: 'group/sub/repo', mrIid: 12 },
+ title: 'Fix the thing',
+ body: '## why',
+ author: { login: 'ada', avatarUrl: null },
+ state: 'open' as const,
+ draft: true,
+ headRef: 'feature',
+ baseRef: 'main',
+ headSha: 'deadbeef',
+ changedFiles: 3,
+ additions: 10,
+ deletions: 2,
+ webUrl: 'https://gitlab.example.com/group/sub/repo/-/merge_requests/12',
+ createdAt: '2026-01-01T00:00:00Z',
+ updatedAt: '2026-01-02T00:00:00Z',
+ } as const;
+
+ it('renders as the overview model the screens already consume', () => {
+ expect(normalizeProviderOverview(summary)).toMatchObject({
+ number: 12,
+ title: 'Fix the thing',
+ bodyMarkdown: '## why',
+ state: 'open',
+ draft: true,
+ baseRef: 'main',
+ headRef: 'feature',
+ headSha: 'deadbeef',
+ headRepoFullName: 'group/sub/repo',
+ isCrossRepo: false,
+ // commits is null, never 0: no provider read layer reports a commit
+ // count, and "0 commits" would state a wrong fact rather than an absent one.
+ counts: { commits: null, changedFiles: 3, additions: 10, deletions: 2 },
+ });
+ });
+
+ it('degrades the GitHub-only sections to empty instead of inventing them', () => {
+ expect(normalizeProviderOverview(summary)).toMatchObject({
+ labels: [],
+ reviewers: [],
+ assignees: [],
+ linkedIssues: [],
+ reviewDecision: null,
+ mergeable: null,
+ });
+ });
+
+ it('derives merge affordances from the provider capabilities', () => {
+ const gitlab = normalizeProviderOverview(summary);
+ const bitbucket = normalizeProviderOverview({
+ ...summary,
+ ref: { platform: 'bitbucket', workspace: 'group', repoSlug: 'repo', prId: 12 },
+ });
+ expect(gitlab.repo.allowAutoMerge).toBe(true);
+ // Bitbucket Cloud does not expose auto-merge in its API (s1 capability).
+ expect(bitbucket.repo.allowAutoMerge).toBe(false);
+ expect(bitbucket.repo.allowMergeCommit).toBe(true);
+ // Two same-named repositories on different providers stay apart.
+ expect(gitlab.prNodeId).not.toBe(bitbucket.prNodeId);
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/provider-pr-queries.ts b/apps/mobile/src/lib/pr-review/provider-pr-queries.ts
new file mode 100644
index 0000000000..ae0c4248db
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/provider-pr-queries.ts
@@ -0,0 +1,452 @@
+/* eslint-disable max-lines -- the seam owns the one provider→GitHub read-model mapping and every query builder; splitting it would scatter the seam across callers. */
+// The ONE data seam of the provider-aware PR review surface.
+//
+// Every read the review screens make goes through a builder here. Given a
+// `ProviderPrRef` the builder picks the tRPC namespace — `githubPrReview`
+// for GitHub (the exact procedures, inputs and DTOs the tree already used,
+// so that surface cannot regress) and `providerReview` for GitLab and
+// Bitbucket — and normalizes the provider answer into the same read models
+// the screens already render. Nothing downstream of this module knows which
+// provider it is showing except through `capabilities`.
+//
+// The scope (ref + organization) travels in React context rather than as a
+// prop through every child: the diff list, the file navigator and the
+// discussion list live outside this slice, and they already pass the
+// GitHub-shaped `owner`/`repo`/`number` triple to the hooks below. Reading
+// the real ref from context keeps those components untouched while their
+// queries move to the right provider.
+
+import {
+ type ProviderPrChecksResult,
+ type ProviderPrSummary,
+ type ProviderPrThread,
+ type ProviderReviewCapabilities,
+} from '@kilocode/app-shared/provider-review';
+import { type inferRouterOutputs, type MobileRouter } from '@kilocode/trpc/mobile';
+import { useMemo } from 'react';
+
+import {
+ isProviderScopeReady,
+ providerPrCapabilities,
+ type ProviderPrPlatform,
+ providerPrRefKey,
+ providerPrRepoPath,
+ type ProviderPrScope,
+ providerPrTriple,
+ type ProviderPrTriple,
+ useProviderPrScope,
+} from '@/lib/pr-review/provider-pr-ref';
+import { useTRPC } from '@/lib/trpc';
+
+type Trpc = ReturnType;
+type RouterOutputs = inferRouterOutputs;
+
+/** The read models the screens render. GitHub's DTOs are the shared shape. */
+type GitHubOverviewDto = RouterOutputs['githubPrReview']['getPullRequest'];
+
+/**
+ * GitHub's overview DTO with the commit count widened to `number | null`.
+ * No provider read layer reports a commit count, and a chip reading
+ * "0 commits" states a wrong fact rather than an absent one, so the count is
+ * omitted on those providers and the chip is not drawn.
+ */
+type PrOverviewCounts = Omit & { commits: number | null };
+export type PrOverviewModel = Omit & { counts: PrOverviewCounts };
+export type PrChecksModel = RouterOutputs['githubPrReview']['listChecks'];
+export type PrThreadsPageModel = RouterOutputs['githubPrReview']['listReviewThreads'];
+
+/** The provider-discriminated identity every `providerReview` input carries. */
+function providerIdentity(scope: ProviderPrScope) {
+ const { ref, organizationId } = scope;
+ if (ref.platform === 'gitlab') {
+ return {
+ platform: 'gitlab' as const,
+ projectPath: ref.projectPath,
+ mrIid: ref.mrIid,
+ ...(ref.instanceHint ? { instanceHint: ref.instanceHint } : {}),
+ ...(organizationId ? { organizationId } : {}),
+ };
+ }
+ return {
+ platform: 'bitbucket' as const,
+ workspace: ref.platform === 'bitbucket' ? ref.workspace : '',
+ repoSlug: ref.platform === 'bitbucket' ? ref.repoSlug : '',
+ prId: ref.platform === 'bitbucket' ? ref.prId : 0,
+ organizationId: organizationId ?? '',
+ };
+}
+
+// ── normalizers ────────────────────────────────────────────────────────
+// Pure, so the provider→screen contract is tested without a network or a
+// mount. Fields no provider reports degrade to the empty value the screens
+// already render for a GitHub PR whose GraphQL leg failed.
+
+// GitHub's check vocabulary, which the checks section classifies against:
+// GitLab reports `failed` and Bitbucket `canceled`; every other verdict the
+// two report already spells the same as GitHub's, or is provider-specific and
+// counts only towards the total.
+function normalizeConclusion(conclusion: string | null): string | null {
+ if (conclusion === 'failed') {
+ return 'failure';
+ }
+ return conclusion === 'canceled' ? 'cancelled' : conclusion;
+}
+
+// Which rollup counter a completed run lands in; anything else (a neutral
+// or provider-specific verdict) counts only towards the total.
+const ROLLUP_BUCKETS = new Map([
+ ['success', 'success'],
+ ['failure', 'failure'],
+ ['error', 'failure'],
+ ['cancelled', 'skipped'],
+ ['skipped', 'skipped'],
+]);
+
+export function normalizeProviderChecks(result: ProviderPrChecksResult): PrChecksModel {
+ const checkRuns = result.checks.map(check => ({
+ name: check.name,
+ // A provider reports its own run states; the rollup and the row icons
+ // read GitHub's, where `conclusion` is set only once a run completed.
+ status: check.conclusion === null ? 'in_progress' : 'completed',
+ conclusion: normalizeConclusion(check.conclusion),
+ detailsUrl: check.detailsUrl,
+ appName: null,
+ }));
+ const rollup = { total: checkRuns.length, success: 0, failure: 0, pending: 0, skipped: 0 };
+ for (const run of checkRuns) {
+ const bucket = run.conclusion === null ? 'pending' : ROLLUP_BUCKETS.get(run.conclusion);
+ if (bucket) {
+ rollup[bucket] += 1;
+ }
+ }
+ return { checkRuns, rollup };
+}
+
+/**
+ * The screens key comments by a numeric id (GitHub's). Provider ids are
+ * strings, so a numeric one is used as-is and anything else folds to a
+ * stable positive integer; the provider's own id is kept verbatim in
+ * `nodeId`, which is what a write call needs.
+ */
+function commentNumericId(commentId: string): number {
+ const parsed = Number(commentId);
+ if (/^\d+$/.test(commentId) && Number.isSafeInteger(parsed) && parsed > 0) {
+ return parsed;
+ }
+ let hash = 0;
+ for (const character of commentId) {
+ hash = (hash * 31 + (character.codePointAt(0) ?? 0)) % 2_147_483_647;
+ }
+ return hash === 0 ? 1 : hash;
+}
+
+function normalizeProviderThread(thread: ProviderPrThread): PrThreadsPageModel['threads'][number] {
+ return {
+ threadId: thread.threadId,
+ isResolved: thread.resolved,
+ isOutdated: false,
+ subjectType: thread.line === null ? 'FILE' : 'LINE',
+ path: thread.path,
+ line: thread.line,
+ startLine: null,
+ originalLine: null,
+ originalStartLine: null,
+ diffSide: thread.side,
+ diffHunk: null,
+ comments: thread.comments.map(comment => ({
+ commentId: commentNumericId(comment.commentId),
+ nodeId: comment.commentId,
+ author: comment.author,
+ bodyMarkdown: comment.body,
+ createdAt: comment.createdAt,
+ // Neither provider read layer returns reactions; Bitbucket has none at
+ // all (see BITBUCKET_REVIEW_CAPABILITIES.reactions).
+ reactions: [],
+ })),
+ };
+}
+
+/** One discussion page as a provider read layer returns it. */
+type ProviderThreadsPage = { threads: ProviderPrThread[]; nextCursor: string | null };
+
+export function normalizeProviderThreadsPage(page: ProviderThreadsPage): PrThreadsPageModel {
+ return {
+ // GitLab reports every MR event (pushes, assignments, "requested review")
+ // as a discussion; the read layer drops the system notes, which leaves
+ // threads with no comments. Those are not discussion content: counted as
+ // content they keep the tab out of its empty state, and filtered by the
+ // list they leave a blank screen — comments, empty state, and error all
+ // absent at once (spot check e7). Drop them here, where the provider
+ // shape is read, so the tab's empty check sees the truth.
+ threads: page.threads
+ .filter(thread => thread.comments.length > 0)
+ .map(thread => normalizeProviderThread(thread)),
+ // Providers have no separate conversation leg: an unanchored discussion
+ // is already a thread with `path: null`.
+ conversation: [],
+ nextCursor: page.nextCursor,
+ };
+}
+
+/**
+ * The loaded discussion pages as the tab renders them. GitHub pages are
+ * already the model; a provider page is mapped thread by thread. The query
+ * options are typed as GitHub's (see the casts below), so the provider arm
+ * is re-read at its true runtime shape here.
+ */
+export function normalizePrThreadsPages(
+ platform: ProviderPrPlatform,
+ pages: readonly PrThreadsPageModel[] | undefined
+): PrThreadsPageModel[] {
+ const loaded = pages ?? [];
+ if (platform === 'github') {
+ return [...loaded];
+ }
+ return asGithubOptions(loaded).map(page =>
+ normalizeProviderThreadsPage(page)
+ );
+}
+
+export function normalizeProviderOverview(summary: ProviderPrSummary): PrOverviewModel {
+ const { ref } = summary;
+ const capabilities = providerPrCapabilities(ref.platform);
+ return {
+ number: providerPrTriple(ref).number,
+ title: summary.title,
+ bodyMarkdown: summary.body,
+ author: summary.author,
+ state: summary.state,
+ draft: summary.draft,
+ baseRef: summary.baseRef,
+ headRef: summary.headRef,
+ isCrossRepo: false,
+ headRepoFullName: providerPrRepoPath(ref),
+ headSha: summary.headSha,
+ // A stable, collision-free node identity per provider ref.
+ prNodeId: providerPrRefKey(ref),
+ counts: {
+ // No provider read layer reports a commit count; null omits the chip.
+ commits: null,
+ changedFiles: summary.changedFiles,
+ additions: summary.additions,
+ deletions: summary.deletions,
+ },
+ mergeable: null,
+ mergeableState: null,
+ autoMerge: null,
+ reviewDecision: null,
+ labels: [],
+ assignees: [],
+ reviewers: [],
+ linkedIssues: [],
+ createdAt: summary.createdAt,
+ updatedAt: summary.updatedAt,
+ closedAt: null,
+ mergedAt: null,
+ mergedBy: null,
+ commentCount: 0,
+ repo: {
+ allowMergeCommit: capabilities.canMerge,
+ allowSquashMerge: capabilities.canMerge,
+ allowRebaseMerge: false,
+ allowAutoMerge: capabilities.autoMerge.supported,
+ deleteBranchOnMerge: false,
+ allowUpdateBranch: false,
+ viewerCanPush: false,
+ viewerCanAdmin: false,
+ viewerLogin: null,
+ },
+ };
+}
+
+// ── query builders ─────────────────────────────────────────────────────
+// A provider arm is read back at the GitHub option type: the normalizers
+// above make the DATA identical, and the only shape that differs is the
+// opaque page cursor, which travels straight back into the provider input.
+
+// eslint-disable-next-line typescript-eslint/no-unnecessary-type-parameters -- the caller names the GitHub option type this provider arm is read back at
+function asGithubOptions(providerOptions: unknown): T {
+ return providerOptions as T;
+}
+
+/** Every provider paginates on one opaque cursor of its own. */
+const nextProviderCursor = (lastPage: { nextCursor: string | null }) =>
+ lastPage.nextCursor ?? undefined;
+
+function githubOverviewOptions(trpc: Trpc, triple: ProviderPrTriple) {
+ return trpc.githubPrReview.getPullRequest.queryOptions(triple);
+}
+
+export function buildPrOverviewQueryOptions(trpc: Trpc, scope: ProviderPrScope) {
+ if (scope.ref.platform === 'github') {
+ return githubOverviewOptions(trpc, providerPrTriple(scope.ref));
+ }
+ return asGithubOptions>(
+ trpc.providerReview.getPullRequest.queryOptions(providerIdentity(scope), {
+ enabled: isProviderScopeReady(scope),
+ select: normalizeProviderOverview,
+ })
+ );
+}
+
+function githubChecksOptions(trpc: Trpc, input: { owner: string; repo: string; ref: string }) {
+ return trpc.githubPrReview.listChecks.queryOptions(input);
+}
+
+export function buildPrChecksQueryOptions(trpc: Trpc, scope: ProviderPrScope, headSha: string) {
+ const triple = providerPrTriple(scope.ref);
+ if (scope.ref.platform === 'github') {
+ return githubChecksOptions(trpc, { owner: triple.owner, repo: triple.repo, ref: headSha });
+ }
+ return asGithubOptions>(
+ trpc.providerReview.listChecks.queryOptions(providerIdentity(scope), {
+ enabled: isProviderScopeReady(scope),
+ select: normalizeProviderChecks,
+ })
+ );
+}
+
+function githubFilesOptions(trpc: Trpc, input: ProviderPrTriple, enabled: boolean) {
+ return trpc.githubPrReview.listFiles.infiniteQueryOptions(input, {
+ staleTime: 30_000,
+ enabled,
+ getNextPageParam: lastPage => lastPage.nextCursor ?? undefined,
+ });
+}
+
+export function buildPrFilesQueryOptions(trpc: Trpc, scope: ProviderPrScope, enabled: boolean) {
+ if (scope.ref.platform === 'github') {
+ return githubFilesOptions(trpc, providerPrTriple(scope.ref), enabled);
+ }
+ return asGithubOptions>(
+ trpc.providerReview.listFiles.infiniteQueryOptions(providerIdentity(scope), {
+ staleTime: 30_000,
+ enabled: enabled && isProviderScopeReady(scope),
+ getNextPageParam: nextProviderCursor,
+ })
+ );
+}
+
+function githubThreadsOptions(trpc: Trpc, input: ProviderPrTriple) {
+ return trpc.githubPrReview.listReviewThreads.infiniteQueryOptions(input, {
+ staleTime: 15_000,
+ getNextPageParam: lastPage => lastPage.nextCursor ?? undefined,
+ });
+}
+
+export function buildPrThreadsQueryOptions(trpc: Trpc, scope: ProviderPrScope) {
+ if (scope.ref.platform === 'github') {
+ return githubThreadsOptions(trpc, providerPrTriple(scope.ref));
+ }
+ return asGithubOptions>(
+ trpc.providerReview.listDiscussions.infiniteQueryOptions(providerIdentity(scope), {
+ staleTime: 15_000,
+ enabled: isProviderScopeReady(scope),
+ getNextPageParam: nextProviderCursor,
+ })
+ );
+}
+
+export type PrFileLinesInput = { ref: string; path: string; startLine: number; endLine: number };
+
+function githubFileLinesOptions(
+ trpc: Trpc,
+ input: { owner: string; repo: string } & PrFileLinesInput
+) {
+ return trpc.githubPrReview.getFileLines.queryOptions(input, {
+ staleTime: 5 * 60_000,
+ gcTime: 10 * 60_000,
+ });
+}
+
+/** Expanded diff context. Every provider answers `{ lines, totalLines }`. */
+export function buildPrFileLinesQueryOptions(
+ trpc: Trpc,
+ scope: ProviderPrScope,
+ input: PrFileLinesInput
+) {
+ const triple = providerPrTriple(scope.ref);
+ if (scope.ref.platform === 'github') {
+ return githubFileLinesOptions(trpc, { owner: triple.owner, repo: triple.repo, ...input });
+ }
+ return asGithubOptions>(
+ trpc.providerReview.getFileLines.queryOptions(
+ { ...providerIdentity(scope), ...input },
+ { staleTime: 5 * 60_000, gcTime: 10 * 60_000 }
+ )
+ );
+}
+
+/**
+ * The provider merge gate. GitHub has no `getMergeState` procedure — its
+ * merge surface derives the gate from the overview DTO — so its arm keeps
+ * the query disabled (a placeholder input registers it, nothing fetches).
+ */
+export function buildPrMergeStateQueryOptions(trpc: Trpc, scope: ProviderPrScope) {
+ const isProviderArm = scope.ref.platform !== 'github';
+ const identity = isProviderArm ? providerIdentity(scope) : null;
+ return trpc.providerReview.getMergeState.queryOptions(
+ identity ?? { platform: 'gitlab', projectPath: '', mrIid: 0 },
+ {
+ enabled: isProviderArm && isProviderScopeReady(scope),
+ }
+ );
+}
+
+/** The identity `providerReview.getCapabilities` takes: no repository to pin. */
+type ProviderCapabilitiesInput =
+ | { platform: 'gitlab'; instanceHint?: string; organizationId?: string }
+ | { platform: 'bitbucket'; organizationId: string };
+
+/**
+ * The identity the capability list is read under. The query itself stays at
+ * its call site (the merge screen's auto-merge arm, the review-submit event
+ * list) — the option type only resolves inline; a wrapper loses it under
+ * the linter's type inference. The GitHub arm keeps its query disabled and
+ * never touches `providerReview` over the network.
+ */
+export function providerCapabilitiesIdentity(scope: ProviderPrScope): ProviderCapabilitiesInput {
+ const ref = scope.ref;
+ if (ref.platform === 'bitbucket') {
+ return { platform: 'bitbucket', organizationId: scope.organizationId ?? '' };
+ }
+ return {
+ platform: 'gitlab',
+ ...(ref.platform === 'gitlab' && ref.instanceHint ? { instanceHint: ref.instanceHint } : {}),
+ ...(scope.organizationId ? { organizationId: scope.organizationId } : {}),
+ };
+}
+
+/**
+ * The capability query's option type only resolves when the `queryOptions`
+ * call sits inline at its call site (a wrapper loses it under the checkers),
+ * so the screens read its answer back through this typed selector instead of
+ * member-accessing the raw, checker-opaque query data.
+ */
+export function selectProviderCapabilitiesData(
+ data: unknown
+): ProviderReviewCapabilities | undefined {
+ return data as ProviderReviewCapabilities | undefined;
+}
+
+/**
+ * The seam as one value for a screen: which provider, what it can do, and
+ * the two reads a screen owns itself. The list surfaces below it call the
+ * builders through their own hooks (files, threads, expanded context).
+ */
+export function useProviderPrQueries(fallback: { owner: string; repo: string; number: number }) {
+ const trpc = useTRPC();
+ const scope = useProviderPrScope(fallback);
+ return useMemo(
+ () => ({
+ ref: scope.ref,
+ platform: scope.ref.platform,
+ capabilities: providerPrCapabilities(scope.ref.platform),
+ isReady: isProviderScopeReady(scope),
+ overviewOptions: () => buildPrOverviewQueryOptions(trpc, scope),
+ checksOptions: (headSha: string) => buildPrChecksQueryOptions(trpc, scope, headSha),
+ mergeStateOptions: () => buildPrMergeStateQueryOptions(trpc, scope),
+ }),
+ [trpc, scope]
+ );
+}
diff --git a/apps/mobile/src/lib/pr-review/provider-pr-ref.test.ts b/apps/mobile/src/lib/pr-review/provider-pr-ref.test.ts
new file mode 100644
index 0000000000..b7036f49d4
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/provider-pr-ref.test.ts
@@ -0,0 +1,241 @@
+import { describe, expect, it } from 'vitest';
+
+import {
+ githubPrRef,
+ isProviderPrPlatform,
+ parseProviderPrRoute,
+ providerPrChildRoutePath,
+ providerPrRefKey,
+ providerPrRefLabel,
+ providerPrRepoPath,
+ providerPrRoutePath,
+ providerPrRouteSegments,
+ providerPrTermKey,
+ providerPrTriple,
+ providerPrWebUrl,
+} from './provider-pr-ref';
+
+describe('isProviderPrPlatform', () => {
+ it('accepts the three supported platforms', () => {
+ expect(['github', 'gitlab', 'bitbucket'].every(value => isProviderPrPlatform(value))).toBe(
+ true
+ );
+ });
+
+ it('rejects anything else', () => {
+ expect(isProviderPrPlatform('gitea')).toBe(false);
+ expect(isProviderPrPlatform('')).toBe(false);
+ // `parseParam` already collapses a missing or repeated segment to null.
+ expect(isProviderPrPlatform(null)).toBe(false);
+ });
+});
+
+describe('parseProviderPrRoute', () => {
+ it('parses a GitLab nested project path with the iid last', () => {
+ expect(
+ parseProviderPrRoute({ platform: 'gitlab', identity: ['group', 'sub', 'repo', '12'] })
+ ).toEqual({
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ instanceHint: undefined,
+ });
+ });
+
+ it('carries the GitLab instance hint from the query param', () => {
+ expect(
+ parseProviderPrRoute({
+ platform: 'gitlab',
+ identity: ['group', 'repo', '3'],
+ instance: 'https://gitlab.example.com',
+ })
+ ).toEqual({
+ platform: 'gitlab',
+ projectPath: 'group/repo',
+ mrIid: 3,
+ instanceHint: 'https://gitlab.example.com',
+ });
+ });
+
+ it('parses a Bitbucket workspace/repo/id triple', () => {
+ expect(
+ parseProviderPrRoute({ platform: 'bitbucket', identity: ['acme', 'api', '42'] })
+ ).toEqual({ platform: 'bitbucket', workspace: 'acme', repoSlug: 'api', prId: 42 });
+ });
+
+ it('rejects a Bitbucket path with extra nesting (its API has none)', () => {
+ expect(
+ parseProviderPrRoute({ platform: 'bitbucket', identity: ['acme', 'group', 'api', '42'] })
+ ).toBeNull();
+ });
+
+ it('parses a GitHub owner/repo/number triple', () => {
+ expect(
+ parseProviderPrRoute({ platform: 'github', identity: ['octocat', 'hello', '7'] })
+ ).toEqual(githubPrRef('octocat', 'hello', 7));
+ });
+
+ it('decodes percent-escaped segments', () => {
+ expect(
+ parseProviderPrRoute({ platform: 'gitlab', identity: ['group', 'my%20repo', '5'] })
+ ).toMatchObject({ projectPath: 'group/my repo', mrIid: 5 });
+ });
+
+ it('rejects an unknown platform', () => {
+ expect(parseProviderPrRoute({ platform: 'gitea', identity: ['a', 'b', '1'] })).toBeNull();
+ });
+
+ it('rejects a non-numeric, zero, or partially numeric trailing segment', () => {
+ expect(parseProviderPrRoute({ platform: 'gitlab', identity: ['a', 'b', '12abc'] })).toBeNull();
+ expect(parseProviderPrRoute({ platform: 'gitlab', identity: ['a', 'b', '0'] })).toBeNull();
+ expect(parseProviderPrRoute({ platform: 'gitlab', identity: ['a', 'b', 'x'] })).toBeNull();
+ });
+
+ it('rejects a project path shorter than two segments', () => {
+ expect(parseProviderPrRoute({ platform: 'gitlab', identity: ['repo', '12'] })).toBeNull();
+ expect(parseProviderPrRoute({ platform: 'gitlab', identity: ['12'] })).toBeNull();
+ expect(parseProviderPrRoute({ platform: 'gitlab', identity: undefined })).toBeNull();
+ });
+
+ it('rejects an empty or malformed segment', () => {
+ expect(parseProviderPrRoute({ platform: 'gitlab', identity: ['a', '', '1'] })).toBeNull();
+ expect(
+ parseProviderPrRoute({ platform: 'gitlab', identity: ['a', '%E0%A4%A', '1'] })
+ ).toBeNull();
+ });
+
+ it('rejects a segment that decodes to a second path separator', () => {
+ expect(
+ parseProviderPrRoute({ platform: 'bitbucket', identity: ['acme', 'a%2Fb', '1'] })
+ ).toBeNull();
+ });
+});
+
+describe('providerPrRouteSegments / providerPrRoutePath', () => {
+ it('round-trips a nested GitLab ref through the route', () => {
+ const ref = { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 } as const;
+ const { platform, identity } = providerPrRouteSegments(ref);
+ expect(identity).toEqual(['group', 'sub', 'repo', '12']);
+ expect(parseProviderPrRoute({ platform, identity })).toMatchObject({
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ });
+ });
+
+ it('sends a GitHub ref to the existing three-segment route', () => {
+ expect(providerPrRoutePath(githubPrRef('octocat', 'hello', 7))).toBe(
+ '/(app)/pr-review/octocat/hello/7'
+ );
+ });
+
+ it('sends a Bitbucket ref to the provider route', () => {
+ expect(
+ providerPrRoutePath({ platform: 'bitbucket', workspace: 'acme', repoSlug: 'api', prId: 42 })
+ ).toBe('/(app)/pr-review/bitbucket/acme/api/42');
+ });
+
+ it('carries the GitLab instance hint as a query param', () => {
+ expect(
+ providerPrRoutePath({
+ platform: 'gitlab',
+ projectPath: 'group/repo',
+ mrIid: 3,
+ instanceHint: 'https://gitlab.example.com',
+ })
+ ).toBe('/(app)/pr-review/gitlab/group/repo/3?instance=https%3A%2F%2Fgitlab.example.com');
+ });
+});
+
+describe('providerPrChildRoutePath', () => {
+ it('keeps a GitHub ref on the existing file-navigator sibling', () => {
+ expect(providerPrChildRoutePath(githubPrRef('octocat', 'hello', 7), 'file-navigator')).toBe(
+ '/(app)/pr-review/octocat/hello/7/file-navigator'
+ );
+ });
+
+ it('opens the sheet inside the provider layout for a nested GitLab MR', () => {
+ expect(
+ providerPrChildRoutePath(
+ { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 },
+ 'file-navigator'
+ )
+ ).toBe('/(app)/pr-review/gitlab/group/sub/repo/12/file-navigator');
+ });
+
+ it('keeps the GitLab instance hint on the child route', () => {
+ expect(
+ providerPrChildRoutePath(
+ {
+ platform: 'gitlab',
+ projectPath: 'group/repo',
+ mrIid: 3,
+ instanceHint: 'https://gitlab.example.com',
+ },
+ 'file-navigator'
+ )
+ ).toBe(
+ '/(app)/pr-review/gitlab/group/repo/3/file-navigator?instance=https%3A%2F%2Fgitlab.example.com'
+ );
+ });
+
+ it('opens the sheet inside the provider layout for a Bitbucket PR', () => {
+ expect(
+ providerPrChildRoutePath(
+ { platform: 'bitbucket', workspace: 'acme', repoSlug: 'api', prId: 42 },
+ 'file-navigator'
+ )
+ ).toBe('/(app)/pr-review/bitbucket/acme/api/42/file-navigator');
+ });
+});
+
+describe('labels and keys', () => {
+ it('uses the provider separator in a row label', () => {
+ expect(providerPrRefLabel({ platform: 'gitlab', projectPath: 'g/s/r', mrIid: 12 })).toBe(
+ 'g/s/r!12'
+ );
+ expect(providerPrRefLabel(githubPrRef('octocat', 'hello', 7))).toBe('octocat/hello#7');
+ });
+
+ it('names the provider term key', () => {
+ expect(providerPrTermKey('gitlab')).toBe('prReview.terms.mergeRequest');
+ expect(providerPrTermKey('github')).toBe('prReview.terms.pullRequest');
+ expect(providerPrTermKey('bitbucket')).toBe('prReview.terms.pullRequest');
+ });
+
+ it('keeps two same-named repositories on different providers apart', () => {
+ expect(providerPrRefKey(githubPrRef('group', 'repo', 5))).not.toBe(
+ providerPrRefKey({ platform: 'gitlab', projectPath: 'group/repo', mrIid: 5 })
+ );
+ });
+
+ it('builds the provider web URL for GitHub and Bitbucket', () => {
+ expect(providerPrWebUrl(githubPrRef('octocat', 'hello', 7))).toBe(
+ 'https://github.com/octocat/hello/pull/7'
+ );
+ expect(
+ providerPrWebUrl({ platform: 'bitbucket', workspace: 'acme', repoSlug: 'api', prId: 42 })
+ ).toBe('https://bitbucket.org/acme/api/pull-requests/42');
+ });
+
+ it('builds a GitLab URL from the instance hint and none without it', () => {
+ expect(
+ providerPrWebUrl({
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 12,
+ instanceHint: 'https://gitlab.example.com/',
+ })
+ ).toBe('https://gitlab.example.com/group/sub/repo/-/merge_requests/12');
+ expect(
+ providerPrWebUrl({ platform: 'gitlab', projectPath: 'group/repo', mrIid: 1 })
+ ).toBeNull();
+ });
+
+ it('splits a nested project path so owner + repo rebuilds it', () => {
+ const ref = { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 } as const;
+ const triple = providerPrTriple(ref);
+ expect(triple).toEqual({ owner: 'group/sub', repo: 'repo', number: 12 });
+ expect(`${triple.owner}/${triple.repo}`).toBe(providerPrRepoPath(ref));
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/provider-pr-ref.ts b/apps/mobile/src/lib/pr-review/provider-pr-ref.ts
new file mode 100644
index 0000000000..5cfce12975
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/provider-pr-ref.ts
@@ -0,0 +1,308 @@
+// Mobile-side identity helpers for a provider PR/MR ref.
+//
+// One screen tree renders GitHub pull requests, GitLab merge requests and
+// Bitbucket pull requests, so every surface needs the same three answers
+// about the thing it is showing: which provider, which repository, which
+// number. `ProviderPrRef` (s1, `@kilocode/app-shared/provider-review`) is
+// that identity; this module is the route <-> ref translation plus the
+// display/keying helpers the presentation needs.
+//
+// Route shape: `/(app)/pr-review/[platform]/[...identity]`, where the LAST
+// identity segment is the number (MR iid / PR id) and everything before it
+// is the project path — a GitLab full nested path (`group/sub/repo`) or a
+// Bitbucket `workspace/repo`. GitHub keeps its original three-segment
+// `[owner]/[repo]/[number]` route; `providerPrRoutePath` sends a GitHub ref
+// back there so that surface is untouched.
+
+import {
+ type GitHubPrRef,
+ PROVIDER_REVIEW_CAPABILITIES,
+ type ProviderPrPlatform,
+ type ProviderPrRef,
+ providerPrRefKey,
+ providerPrTerm,
+ type ProviderReviewCapabilities,
+} from '@kilocode/app-shared/provider-review';
+import { type Href } from 'expo-router';
+import { createContext, createElement, type ReactNode, useContext, useMemo } from 'react';
+
+import { parseParam, parsePositiveIntParam } from '@/lib/route-params';
+
+export { providerPrRefKey, type GitHubPrRef, type ProviderPrPlatform, type ProviderPrRef };
+
+const PROVIDER_PR_PLATFORMS = ['github', 'gitlab', 'bitbucket'] as const;
+
+/** Narrows an already-parsed route segment onto the platform vocabulary. */
+export function isProviderPrPlatform(value: string | null): value is ProviderPrPlatform {
+ return value !== null && (PROVIDER_PR_PLATFORMS as readonly string[]).includes(value);
+}
+
+/** The GitHub arm of the ref, from the triple the existing route already parses. */
+export function githubPrRef(owner: string, repo: string, number: number): GitHubPrRef {
+ return { platform: 'github', owner, repo, number };
+}
+
+/**
+ * The i18n key holding the provider's own term for a PR/MR. Copy never
+ * spells "pull request" for GitLab: `providerPrTerm` decides the noun and
+ * this maps it onto the catalog block s5 added (`prReview.terms`).
+ */
+export function providerPrTermKey(
+ platform: ProviderPrPlatform
+): 'prReview.terms.mergeRequest' | 'prReview.terms.pullRequest' {
+ // i18n-dup-ok: 'prReview.terms.mergeRequest'/'prReview.terms.pullRequest' are the capitalized standalone labels (chips, headers); the mid-sentence lowercase noun is 'common.mergeRequest'/'common.pullRequest' — languages case-decline them apart.
+ return providerPrTerm(platform) === 'merge request'
+ ? 'prReview.terms.mergeRequest'
+ : 'prReview.terms.pullRequest';
+}
+
+/** The number a provider gives this change: a PR number, an MR iid, a PR id. */
+export function providerPrNumber(ref: ProviderPrRef): number {
+ if (ref.platform === 'github') {
+ return ref.number;
+ }
+ return ref.platform === 'gitlab' ? ref.mrIid : ref.prId;
+}
+
+/**
+ * The repository path as the provider writes it: `owner/repo` on GitHub and
+ * Bitbucket, the FULL nested path on GitLab (never just the last segment).
+ */
+export function providerPrRepoPath(ref: ProviderPrRef): string {
+ if (ref.platform === 'github') {
+ return `${ref.owner}/${ref.repo}`;
+ }
+ if (ref.platform === 'gitlab') {
+ return ref.projectPath;
+ }
+ return `${ref.workspace}/${ref.repoSlug}`;
+}
+
+/** `group/sub/repo!12` on GitLab, `owner/repo#7` elsewhere — one row label. */
+export function providerPrRefLabel(ref: ProviderPrRef): string {
+ const separator = ref.platform === 'gitlab' ? '!' : '#';
+ return `${providerPrRepoPath(ref)}${separator}${providerPrNumber(ref)}`;
+}
+
+/**
+ * The `owner` / `repo` / `number` triple the existing GitHub-shaped
+ * components and local stores are written against. Splitting the project
+ * path at its LAST separator keeps `owner + '/' + repo` equal to the
+ * provider's own path, so a nested GitLab group still renders in full.
+ */
+export type ProviderPrTriple = {
+ owner: string;
+ repo: string;
+ number: number;
+};
+
+export function providerPrTriple(ref: ProviderPrRef): ProviderPrTriple {
+ const path = providerPrRepoPath(ref);
+ const cut = path.lastIndexOf('/');
+ return {
+ owner: cut === -1 ? path : path.slice(0, cut),
+ repo: cut === -1 ? '' : path.slice(cut + 1),
+ number: providerPrNumber(ref),
+ };
+}
+
+/**
+ * The provider's own web URL for this PR/MR, or null when it cannot be
+ * built. A GitLab ref reached by a deep link may carry no instance hint, and
+ * the hint is the only thing that names the host — guessing gitlab.com would
+ * hand a self-managed user a link into a stranger's project.
+ */
+export function providerPrWebUrl(ref: ProviderPrRef): string | null {
+ if (ref.platform === 'github') {
+ return `https://github.com/${ref.owner}/${ref.repo}/pull/${ref.number}`;
+ }
+ if (ref.platform === 'bitbucket') {
+ return `https://bitbucket.org/${ref.workspace}/${ref.repoSlug}/pull-requests/${ref.prId}`;
+ }
+ if (!ref.instanceHint) {
+ return null;
+ }
+ const base = ref.instanceHint.replace(/\/+$/, '');
+ return `${base}/${ref.projectPath}/-/merge_requests/${ref.mrIid}`;
+}
+
+/**
+ * The route segments for a ref: the platform plus the identity segments,
+ * project path first and the number last.
+ */
+export type ProviderPrRouteSegments = {
+ platform: ProviderPrPlatform;
+ identity: string[];
+};
+
+export function providerPrRouteSegments(ref: ProviderPrRef): ProviderPrRouteSegments {
+ return {
+ platform: ref.platform,
+ identity: [...providerPrRepoPath(ref).split('/'), String(providerPrNumber(ref))],
+ };
+}
+
+/**
+ * The navigable path for a ref. GitHub refs keep the original three-segment
+ * route so that surface never changes; GitLab and Bitbucket go to the
+ * provider route. A GitLab `instanceHint` rides as a query param because it
+ * is display/matching only — the server re-derives the real instance.
+ */
+export function providerPrRoutePath(ref: ProviderPrRef): Href {
+ return providerPrHref(ref, '');
+}
+
+/**
+ * A screen that lives INSIDE the ref's own layout — today the file-navigator
+ * sheet. It must be reached through the ref's own route: the provider scope
+ * is published by the provider layout, so pushing the GitHub sibling from a
+ * GitLab MR would leave that scope and query the wrong provider.
+ */
+type ProviderPrChildRoute = 'file-navigator';
+
+export function providerPrChildRoutePath(ref: ProviderPrRef, child: ProviderPrChildRoute): Href {
+ return providerPrHref(ref, `/${child}`);
+}
+
+function providerPrHref(ref: ProviderPrRef, suffix: string): Href {
+ const { platform, identity } = providerPrRouteSegments(ref);
+ const encoded = identity.map(segment => encodeURIComponent(segment)).join('/');
+ if (ref.platform === 'github') {
+ return `/(app)/pr-review/${encoded}${suffix}` as Href;
+ }
+ const query =
+ ref.platform === 'gitlab' && ref.instanceHint
+ ? `?instance=${encodeURIComponent(ref.instanceHint)}`
+ : '';
+ return `/(app)/pr-review/${platform}/${encoded}${suffix}${query}` as Href;
+}
+
+/**
+ * Parse the provider route's params into a ref, or null when the deep link
+ * is malformed. Every segment is validated here — a hand-built link can hand
+ * a screen a missing segment, a repeated segment, or a non-numeric id, and
+ * none of those may reach a query.
+ *
+ * GitLab and Bitbucket both need at least a two-segment project path plus
+ * the number; Bitbucket is exactly `workspace/repo/id` because its API has
+ * no nesting.
+ */
+export function parseProviderPrRoute(params: {
+ platform: string | string[] | undefined;
+ identity: string | string[] | undefined;
+ instance?: string | string[] | undefined;
+}): ProviderPrRef | null {
+ const platform = parseParam(params.platform);
+ if (!isProviderPrPlatform(platform)) {
+ return null;
+ }
+ const segments = identitySegments(params.identity).map(segment => decodeSegment(segment));
+ if (segments.some(segment => segment === null)) {
+ return null;
+ }
+ const identity = segments as string[];
+ const number = parsePositiveIntParam(identity.at(-1));
+ if (number === null) {
+ return null;
+ }
+ const path = identity.slice(0, -1);
+ if (path.length < 2) {
+ return null;
+ }
+ const [first, second] = path;
+ if (platform === 'github' || platform === 'bitbucket') {
+ if (path.length !== 2 || !first || !second) {
+ return null;
+ }
+ return platform === 'github'
+ ? githubPrRef(first, second, number)
+ : { platform: 'bitbucket', workspace: first, repoSlug: second, prId: number };
+ }
+ const instanceHint = parseParam(params.instance) ?? undefined;
+ return { platform: 'gitlab', projectPath: path.join('/'), mrIid: number, instanceHint };
+}
+
+/** A catch-all param arrives as an array, a single string, or nothing. */
+function identitySegments(identity: string | string[] | undefined): string[] {
+ if (Array.isArray(identity)) {
+ return identity;
+ }
+ return identity ? [identity] : [];
+}
+
+/** A single route segment: present, non-empty, and decodable. */
+function decodeSegment(segment: string): string | null {
+ if (segment.length === 0) {
+ return null;
+ }
+ try {
+ const decoded = decodeURIComponent(segment);
+ return decoded.length > 0 && !decoded.includes('/') ? decoded : null;
+ } catch {
+ // A malformed percent-escape in a hand-built deep link.
+ return null;
+ }
+}
+
+// ── the live scope ─────────────────────────────────────────────────────
+// The ref alone does not say which organization a provider call runs under,
+// and the URL cannot carry one. The scope pairs them and travels in context
+// so the diff, navigator and discussion trees — which take the GitHub-shaped
+// triple — keep their props while their queries follow the real provider.
+
+/** Ref plus the organization the provider call must run under. */
+export type ProviderPrScope = {
+ readonly ref: ProviderPrRef;
+ /** The selected organization, or null for the personal scope. */
+ readonly organizationId: string | null;
+};
+
+const ProviderPrScopeContext = createContext(null);
+
+/**
+ * Publish the scope to every surface below. Mounted by the provider route;
+ * the GitHub route never mounts it, so GitHub keeps the exact query path it
+ * had before this slice.
+ */
+export function ProviderPrScopeProvider({
+ value,
+ children,
+}: Readonly<{ value: ProviderPrScope; children: ReactNode }>) {
+ return createElement(ProviderPrScopeContext.Provider, { value }, children);
+}
+
+/**
+ * The live scope. Falls back to the GitHub triple the caller already has,
+ * which is what every component below the GitHub route passes.
+ */
+export function useProviderPrScope(fallback: ProviderPrTriple): ProviderPrScope {
+ const context = useContext(ProviderPrScopeContext);
+ const { owner, repo, number } = fallback;
+ return useMemo(
+ () => context ?? { ref: githubPrRef(owner, repo, number), organizationId: null },
+ [context, owner, repo, number]
+ );
+}
+
+/**
+ * The live scope, or null when no provider route is above this component —
+ * which is the GitHub route, since only the provider layout mounts the
+ * scope provider. Recovery affordances (the reconnect notice) use it to
+ * check the right provider's connection without inventing a GitHub identity
+ * for a GitLab or Bitbucket surface.
+ */
+export function useProviderPrScopeOrNull(): ProviderPrScope | null {
+ return useContext(ProviderPrScopeContext);
+}
+
+export function providerPrCapabilities(platform: ProviderPrPlatform): ProviderReviewCapabilities {
+ return PROVIDER_REVIEW_CAPABILITIES[platform];
+}
+
+/**
+ * Bitbucket Cloud is organization-context only, so a scope without an
+ * organization cannot be queried at all. GitHub and GitLab work personally.
+ */
+export function isProviderScopeReady(scope: ProviderPrScope): boolean {
+ return scope.ref.platform !== 'bitbucket' || scope.organizationId !== null;
+}
diff --git a/apps/mobile/src/lib/pr-review/provider-pr-url.test.ts b/apps/mobile/src/lib/pr-review/provider-pr-url.test.ts
new file mode 100644
index 0000000000..2945582190
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/provider-pr-url.test.ts
@@ -0,0 +1,166 @@
+import { describe, expect, it } from 'vitest';
+
+import { parseProviderPrUrl } from './provider-pr-url';
+
+describe('parseProviderPrUrl — GitHub', () => {
+ it('parses a github.com pull request into the GitHub ref', () => {
+ expect(parseProviderPrUrl('https://github.com/octocat/hello-world/pull/42')).toEqual({
+ platform: 'github',
+ owner: 'octocat',
+ repo: 'hello-world',
+ number: 42,
+ });
+ });
+
+ it('tolerates trailing subpaths and query strings', () => {
+ expect(parseProviderPrUrl('https://github.com/o/r/pull/7/files?diff=split')).toEqual({
+ platform: 'github',
+ owner: 'o',
+ repo: 'r',
+ number: 7,
+ });
+ });
+
+ it('rejects a GitHub Enterprise host — the GitHub App serves github.com only', () => {
+ expect(parseProviderPrUrl('https://github.example.com/octocat/hello-world/pull/42')).toBeNull();
+ });
+});
+
+describe('parseProviderPrUrl — GitLab', () => {
+ it('parses the gitlab.com modern form with the origin as instanceHint', () => {
+ expect(parseProviderPrUrl('https://gitlab.com/group/sub/repo/-/merge_requests/123')).toEqual({
+ platform: 'gitlab',
+ projectPath: 'group/sub/repo',
+ mrIid: 123,
+ instanceHint: 'https://gitlab.com',
+ });
+ });
+
+ it('parses a self-managed host with a port, keeping the origin', () => {
+ expect(
+ parseProviderPrUrl('https://gitlab.example.com:8443/acme/api/-/merge_requests/9')
+ ).toEqual({
+ platform: 'gitlab',
+ projectPath: 'acme/api',
+ mrIid: 9,
+ instanceHint: 'https://gitlab.example.com:8443',
+ });
+ });
+
+ it('parses the legacy form without the /-/ separator', () => {
+ expect(parseProviderPrUrl('https://gitlab.example.com/group/project/merge_requests/5')).toEqual(
+ {
+ platform: 'gitlab',
+ projectPath: 'group/project',
+ mrIid: 5,
+ instanceHint: 'https://gitlab.example.com',
+ }
+ );
+ });
+
+ it('tolerates trailing subpaths, queries and fragments', () => {
+ expect(
+ parseProviderPrUrl('https://gitlab.com/g/r/-/merge_requests/5/diffs?w=1#note_2')
+ ).toEqual({
+ platform: 'gitlab',
+ projectPath: 'g/r',
+ mrIid: 5,
+ instanceHint: 'https://gitlab.com',
+ });
+ });
+
+ it('lowercases the host and keeps the scheme', () => {
+ const ref = parseProviderPrUrl('https://GITLAB.Example.COM/G/Repo/-/merge_requests/1');
+ expect(ref).toEqual({
+ platform: 'gitlab',
+ projectPath: 'G/Repo',
+ mrIid: 1,
+ instanceHint: 'https://gitlab.example.com',
+ });
+ });
+
+ it('accepts http on a self-managed instance', () => {
+ const ref = parseProviderPrUrl('http://git.lan/team/repo/-/merge_requests/2');
+ expect(ref).not.toBeNull();
+ expect(ref?.platform === 'gitlab' && ref.instanceHint).toBe('http://git.lan');
+ });
+
+ it('rejects a single-segment project path — the server requires a group', () => {
+ expect(parseProviderPrUrl('https://gitlab.com/repo/merge_requests/1')).toBeNull();
+ expect(parseProviderPrUrl('https://gitlab.com/repo/-/merge_requests/1')).toBeNull();
+ });
+
+ it('rejects dot segments, empty segments, and non-numeric iids', () => {
+ expect(parseProviderPrUrl('https://gitlab.com/../repo/-/merge_requests/1')).toBeNull();
+ expect(parseProviderPrUrl('https://gitlab.com/g//r/-/merge_requests/1')).toBeNull();
+ expect(parseProviderPrUrl('https://gitlab.com/g/r/-/merge_requests/abc')).toBeNull();
+ expect(parseProviderPrUrl('https://gitlab.com/g/r/-/merge_requests/0')).toBeNull();
+ });
+
+ it('rejects a lone "-" inside the project path — only the separator may be one', () => {
+ expect(parseProviderPrUrl('https://gitlab.com/-/r/-/merge_requests/1')).toBeNull();
+ expect(parseProviderPrUrl('https://gitlab.com/g/-/r/-/merge_requests/1')).toBeNull();
+ expect(parseProviderPrUrl('https://gitlab.com/g/-/r/merge_requests/1')).toBeNull();
+ });
+
+ it('never reads a github.com URL as a GitLab MR', () => {
+ expect(parseProviderPrUrl('https://github.com/g/r/-/merge_requests/1')).toBeNull();
+ });
+
+ it('rejects a GitLab path without a merge_requests marker', () => {
+ expect(parseProviderPrUrl('https://gitlab.com/g/r/-/issues/5')).toBeNull();
+ expect(parseProviderPrUrl('https://gitlab.com/g/r')).toBeNull();
+ });
+});
+
+describe('parseProviderPrUrl — Bitbucket', () => {
+ it('parses the plain pull request URL', () => {
+ expect(parseProviderPrUrl('https://bitbucket.org/acme/api/pull-requests/42')).toEqual({
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'api',
+ prId: 42,
+ });
+ });
+
+ it('parses the overview and other trailing-subpath variants', () => {
+ expect(
+ parseProviderPrUrl('https://bitbucket.org/acme/api/pull-requests/42/overview?tab=commits')
+ ).toEqual({
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'api',
+ prId: 42,
+ });
+ expect(parseProviderPrUrl('https://bitbucket.org/acme/api/pull-requests/42/diff')).toEqual({
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'api',
+ prId: 42,
+ });
+ });
+
+ it('rejects other hosts and malformed paths', () => {
+ expect(
+ parseProviderPrUrl('https://bitbucket.example.com/acme/api/pull-requests/42')
+ ).toBeNull();
+ expect(parseProviderPrUrl('https://bitbucket.org/acme/pull-requests/42')).toBeNull();
+ expect(parseProviderPrUrl('https://bitbucket.org/acme/api/pull-requests/x')).toBeNull();
+ });
+});
+
+describe('parseProviderPrUrl — garbage input', () => {
+ it('returns null for empty, whitespace, non-http and non-review URLs', () => {
+ expect(parseProviderPrUrl('')).toBeNull();
+ expect(parseProviderPrUrl(' \n ')).toBeNull();
+ expect(parseProviderPrUrl('not a url at all')).toBeNull();
+ expect(parseProviderPrUrl('ftp://gitlab.com/g/r/-/merge_requests/1')).toBeNull();
+ expect(parseProviderPrUrl('https://gitlab.com/o/r/pull/1')).toBeNull();
+ expect(parseProviderPrUrl('https://app.kilo.ai/profile')).toBeNull();
+ });
+
+ it('never throws on credential-bearing or malformed authorities', () => {
+ expect(parseProviderPrUrl('https://user:pass@gitlab.com/g/r/-/merge_requests/1')).toBeNull();
+ expect(parseProviderPrUrl('https://')).toBeNull();
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/provider-pr-url.ts b/apps/mobile/src/lib/pr-review/provider-pr-url.ts
new file mode 100644
index 0000000000..0496dd350b
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/provider-pr-url.ts
@@ -0,0 +1,174 @@
+// One URL resolver for every route into a review: a pasted link, a shared
+// link, a session badge or a recents entry all parse through here, so the
+// three providers' URL shapes are decided in exactly one place.
+//
+// The result is the s1 `ProviderPrRef` identity: platform, the provider's own
+// repository path, and the number. A GitLab ref carries the pasted URL's
+// origin as `instanceHint` — identity/recents only; the server re-derives the
+// authoritative instance (s2), so a mismatched host yields the clear
+// not-authorized state, never a redirect.
+//
+// `parseGitHubPrUrl` (`@/lib/github-pr-url`) stays for compat and owns the
+// GitHub arm; this resolver delegates to it rather than re-spelling the
+// pattern.
+
+import { type ProviderPrRef } from '@kilocode/app-shared/provider-review';
+
+import { parseGitHubPrUrl } from '@/lib/github-pr-url';
+
+const MERGE_REQUESTS_SEGMENT = 'merge_requests';
+const PULL_REQUESTS_SEGMENT = 'pull-requests';
+const BITBUCKET_HOST = 'bitbucket.org';
+/** Hosts that can never be a GitLab instance, so a GitHub URL never leaks into the GitLab arm. */
+const NON_GITLAB_HOSTS = new Set(['github.com', 'www.github.com']);
+
+/** A path segment GitLab accepts in a project path: the server's own shape. */
+const GITLAB_SEGMENT_PATTERN = /^[A-Za-z0-9_.-]+$/;
+/** A Bitbucket workspace/repository slug: the server's own shape. */
+const BITBUCKET_SLUG_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
+
+type SplitUrl = {
+ /** Lowercased scheme, e.g. `https`. */
+ scheme: string;
+ /** Lowercased authority (host, plus port when non-default). */
+ host: string;
+ /** Path segments, query and fragment dropped; empty segments preserved. */
+ segments: string[];
+};
+
+/**
+ * Split `http(s)://host[:port]/a/b` into its parts without `URL` — Hermes
+ * does not guarantee full WHATWG parsing. Returns `null` for any other
+ * scheme, a missing host, or credentials in the authority.
+ */
+function splitHttpUrl(href: string): SplitUrl | null {
+ const match = /^(https?):\/\/([^/?#@]+)([^?#]*)/i.exec(href);
+ if (!match) {
+ return null;
+ }
+ const scheme = (match[1] ?? '').toLowerCase();
+ const host = (match[2] ?? '').toLowerCase();
+ const path = match[3] ?? '';
+ if (host.length === 0) {
+ return null;
+ }
+ if (path.length === 0 || path === '/') {
+ return { scheme, host, segments: [] };
+ }
+ if (!path.startsWith('/')) {
+ return null;
+ }
+ return { scheme, host, segments: path.slice(1).split('/') };
+}
+
+/** Positive integer from a path segment, or null. No trailing junk. */
+function parseNumberSegment(segment: string | undefined): number | null {
+ if (segment === undefined || !/^\d+$/.test(segment)) {
+ return null;
+ }
+ const number = Number.parseInt(segment, 10);
+ return Number.isSafeInteger(number) && number > 0 ? number : null;
+}
+
+/**
+ * `https:///...//-/merge_requests/` and the legacy
+ * `https:////merge_requests/`, on ANY host — gitlab.com
+ * and self-managed instances alike. The project path is the FULL nested
+ * path; trailing subpaths (`/diffs`, `/review-notes`) are tolerated.
+ */
+function parseGitLabMrUrl(url: SplitUrl): ProviderPrRef | null {
+ if (NON_GITLAB_HOSTS.has(url.host)) {
+ return null;
+ }
+ const { segments } = url;
+ for (let i = 1; i < segments.length; i += 1) {
+ if (segments[i] === MERGE_REQUESTS_SEGMENT) {
+ const ref = gitLabRefAtMarker(url, segments, i);
+ if (ref) {
+ return ref;
+ }
+ }
+ }
+ return null;
+}
+
+/** The ref named by `merge_requests/` at `segments[markerAt]`, or null. */
+function gitLabRefAtMarker(
+ url: SplitUrl,
+ segments: string[],
+ markerAt: number
+): ProviderPrRef | null {
+ const modern = segments[markerAt - 1] === '-';
+ const pathEnd = modern ? markerAt - 1 : markerAt;
+ const mrIid = parseNumberSegment(segments[markerAt + 1]);
+ if (mrIid === null || pathEnd < 2) {
+ return null;
+ }
+ const projectPath = segments.slice(0, pathEnd);
+ if (!projectPath.every(segment => isGitLabPathSegment(segment))) {
+ return null;
+ }
+ return {
+ platform: 'gitlab',
+ projectPath: projectPath.join('/'),
+ mrIid,
+ instanceHint: `${url.scheme}://${url.host}`,
+ };
+}
+
+function isGitLabPathSegment(segment: string): boolean {
+ // '.', '..' and the bare '-' separator are shapes the server never names a
+ // project with; accepting them would let `/repo/-/merge_requests/1` read as
+ // the project `repo/-`.
+ return (
+ segment !== '.' && segment !== '..' && segment !== '-' && GITLAB_SEGMENT_PATTERN.test(segment)
+ );
+}
+
+/**
+ * `https://bitbucket.org///pull-requests/`, including the
+ * `/overview` and other trailing-subpath variants. Bitbucket Cloud only —
+ * its host is fixed.
+ */
+function parseBitbucketPrUrl(url: SplitUrl): ProviderPrRef | null {
+ if (url.host !== BITBUCKET_HOST) {
+ return null;
+ }
+ const [workspace, repoSlug, marker, idSegment] = url.segments;
+ if (marker !== PULL_REQUESTS_SEGMENT || workspace === undefined || repoSlug === undefined) {
+ return null;
+ }
+ const prId = parseNumberSegment(idSegment);
+ if (
+ prId === null ||
+ !BITBUCKET_SLUG_PATTERN.test(workspace) ||
+ !BITBUCKET_SLUG_PATTERN.test(repoSlug)
+ ) {
+ return null;
+ }
+ return { platform: 'bitbucket', workspace, repoSlug, prId };
+}
+
+/**
+ * Parse a pasted/shared PR/MR URL into the provider identity it names.
+ *
+ * GitHub (`github.com` only — the GitHub App serves no Enterprise host),
+ * GitLab merge requests on ANY host including self-managed instances, and
+ * Bitbucket Cloud pull requests. Returns `null` for anything else, so the
+ * caller can show its invalid-link state.
+ */
+export function parseProviderPrUrl(href: string): ProviderPrRef | null {
+ const trimmed = href.trim();
+ if (trimmed.length === 0) {
+ return null;
+ }
+ const github = parseGitHubPrUrl(trimmed);
+ if (github) {
+ return { platform: 'github', ...github };
+ }
+ const url = splitHttpUrl(trimmed);
+ if (!url) {
+ return null;
+ }
+ return parseGitLabMrUrl(url) ?? parseBitbucketPrUrl(url);
+}
diff --git a/apps/mobile/src/lib/pr-review/recent-pr-row-state.test.ts b/apps/mobile/src/lib/pr-review/recent-pr-row-state.test.ts
new file mode 100644
index 0000000000..39128d5e4b
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/recent-pr-row-state.test.ts
@@ -0,0 +1,91 @@
+import '@/i18n';
+
+import { describe, expect, it } from 'vitest';
+
+import { selectRecentPrRowState } from './recent-pr-row-state';
+import { type RecentPr } from '@/lib/pr-review/recent-prs';
+
+function makeRecent(overrides: Partial = {}): RecentPr {
+ return {
+ owner: 'octocat',
+ repo: 'hello-world',
+ number: 42,
+ title: 'Hello PR',
+ lastOpenedAt: 1_700_000_000_000,
+ ...overrides,
+ };
+}
+
+describe('selectRecentPrRowState', () => {
+ it('uses the title as primary and the identity as secondary', () => {
+ expect(selectRecentPrRowState(makeRecent({ title: 'Hello PR' }))).toEqual({
+ primary: 'Hello PR',
+ secondary: 'octocat/hello-world#42',
+ failed: false,
+ provider: 'GitHub',
+ });
+ });
+
+ it('drops the secondary line when the title is empty (no duplicate)', () => {
+ expect(selectRecentPrRowState(makeRecent({ title: '' }))).toEqual({
+ primary: 'octocat/hello-world#42',
+ secondary: null,
+ failed: false,
+ provider: 'GitHub',
+ });
+ });
+
+ it('marks a failed entry', () => {
+ expect(selectRecentPrRowState(makeRecent({ lastResult: 'failed' }))).toEqual({
+ primary: 'Hello PR',
+ secondary: 'octocat/hello-world#42',
+ failed: true,
+ provider: 'GitHub',
+ });
+ });
+
+ it('treats a missing lastResult as ok', () => {
+ expect(selectRecentPrRowState(makeRecent()).failed).toBe(false);
+ });
+
+ it('labels a GitLab entry with the instance path and the ! separator', () => {
+ expect(
+ selectRecentPrRowState(
+ makeRecent({ owner: 'group/sub', repo: 'api', number: 12, platform: 'gitlab' })
+ )
+ ).toEqual({
+ primary: 'Hello PR',
+ secondary: 'group/sub/api!12',
+ failed: false,
+ provider: 'GitLab',
+ });
+ });
+
+ it('labels a Bitbucket entry with the workspace path', () => {
+ expect(
+ selectRecentPrRowState(
+ makeRecent({ owner: 'acme', repo: 'api', number: 7, platform: 'bitbucket' })
+ )
+ ).toEqual({
+ primary: 'Hello PR',
+ secondary: 'acme/api#7',
+ failed: false,
+ provider: 'Bitbucket',
+ });
+ });
+
+ it('renders same-named repos across providers as distinct labelled rows', () => {
+ const rows = (
+ [
+ {},
+ { platform: 'gitlab' as const },
+ { platform: 'bitbucket' as const },
+ ] satisfies Partial[]
+ ).map(overrides =>
+ selectRecentPrRowState(makeRecent({ owner: 'acme', repo: 'api', number: 7, ...overrides }))
+ );
+
+ expect(rows.map(row => row.provider)).toEqual(['GitHub', 'GitLab', 'Bitbucket']);
+ expect(rows.map(row => row.secondary)).toEqual(['acme/api#7', 'acme/api!7', 'acme/api#7']);
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/recent-pr-row-state.ts b/apps/mobile/src/lib/pr-review/recent-pr-row-state.ts
new file mode 100644
index 0000000000..7d364165d2
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/recent-pr-row-state.ts
@@ -0,0 +1,47 @@
+// Pure row-state selection for a recents entry. Extracted so the
+// duplicated fallback line (title-less entries printing the identity
+// twice) and the failed-entry marker are unit-tested.
+//
+// Multi-provider identity (s7): the entry's platform decides the identity
+// separator (GitLab writes `group/repo!12`, the others `owner/repo#7`) and
+// the provider label the row renders, so same-named repositories on
+// different providers read as separate rows.
+
+import { type ProviderPrPlatform } from '@kilocode/app-shared/provider-review';
+
+import { i18n } from '@/i18n';
+import { type RecentPr } from '@/lib/pr-review/recent-prs';
+
+export type RecentPrRowState = {
+ /** Title when non-empty, else the identity line. */
+ primary: string;
+ /** The identity line, or null when it would repeat `primary`. */
+ secondary: string | null;
+ /** True when the entry's last load attempt failed. */
+ failed: boolean;
+ /** The provider's own name, rendered as the row's badge. */
+ provider: string;
+};
+
+export function selectRecentPrRowState(entry: RecentPr): RecentPrRowState {
+ const platform: ProviderPrPlatform = entry.platform ?? 'github';
+ const separator = platform === 'gitlab' ? '!' : '#';
+ const identity = `${entry.owner}/${entry.repo}${separator}${entry.number}`;
+ const primary = entry.title.length > 0 ? entry.title : identity;
+ return {
+ primary,
+ secondary: primary === identity ? null : identity,
+ failed: entry.lastResult === 'failed',
+ provider: recentPrProviderLabel(platform),
+ };
+}
+
+function recentPrProviderLabel(platform: ProviderPrPlatform): string {
+ if (platform === 'gitlab') {
+ return i18n.t('common.gitlab');
+ }
+ if (platform === 'bitbucket') {
+ return i18n.t('agentChat.repoPicker.platformBitbucket');
+ }
+ return i18n.t('common.github');
+}
diff --git a/apps/mobile/src/lib/pr-review/recent-prs.test.ts b/apps/mobile/src/lib/pr-review/recent-prs.test.ts
index 62aeefc5c9..a9d25ac35d 100644
--- a/apps/mobile/src/lib/pr-review/recent-prs.test.ts
+++ b/apps/mobile/src/lib/pr-review/recent-prs.test.ts
@@ -4,7 +4,9 @@ import {
clearRecentPrs,
getRecentPrs,
markRecentPrFailed,
+ providerRefFromRecentPr,
type RecentPr,
+ recentPrKey,
removeRecentPr,
upsertRecentPr,
} from './recent-prs';
@@ -173,4 +175,171 @@ describe('recent-prs', () => {
await expect(getRecentPrs()).resolves.toMatchObject([{ number: 1, lastResult: 'ok' }]);
});
+
+ it('upsert keeps one row per provider for a same-named repo', async () => {
+ await upsertRecentPr(makeRecent({ number: 1, title: 'GitHub one' }));
+ await upsertRecentPr(
+ makeRecent({
+ number: 1,
+ title: 'GitLab one',
+ platform: 'gitlab',
+ instanceHint: 'https://gitlab.example.com',
+ })
+ );
+ await upsertRecentPr(makeRecent({ number: 1, title: 'Bitbucket one', platform: 'bitbucket' }));
+
+ const recents = await getRecentPrs();
+ expect(recents).toHaveLength(3);
+ expect(recents.map(entry => entry.title)).toEqual([
+ 'Bitbucket one',
+ 'GitLab one',
+ 'GitHub one',
+ ]);
+ });
+
+ it('upsert dedupes a re-opened provider entry by platform and instance', async () => {
+ await upsertRecentPr(
+ makeRecent({
+ number: 1,
+ title: 'Old',
+ platform: 'gitlab',
+ instanceHint: 'https://gitlab.example.com',
+ })
+ );
+ await upsertRecentPr(
+ makeRecent({
+ number: 1,
+ title: 'New',
+ platform: 'gitlab',
+ instanceHint: 'https://gitlab.example.com',
+ })
+ );
+ await upsertRecentPr(
+ makeRecent({
+ number: 1,
+ title: 'Other instance',
+ platform: 'gitlab',
+ instanceHint: 'https://gitlab.other',
+ })
+ );
+
+ const recents = await getRecentPrs();
+ expect(recents).toHaveLength(2);
+ expect(recents[0]).toMatchObject({ title: 'Other instance' });
+ expect(recents[1]).toMatchObject({ title: 'New' });
+ });
+
+ it('a legacy entry (no platform) dedupes with the GitHub identity', async () => {
+ await upsertRecentPr(makeRecent({ number: 1, title: 'Legacy' }));
+ await upsertRecentPr(makeRecent({ number: 1, title: 'Explicit GitHub', platform: 'github' }));
+
+ await expect(getRecentPrs()).resolves.toMatchObject([
+ { number: 1, title: 'Explicit GitHub', platform: 'github' },
+ ]);
+ });
+
+ it('remove and mark-failed target one provider row, not its twins', async () => {
+ await upsertRecentPr(makeRecent({ number: 1, title: 'GitHub one' }));
+ await upsertRecentPr(
+ makeRecent({
+ number: 1,
+ title: 'GitLab one',
+ platform: 'gitlab',
+ instanceHint: 'https://gl.acme.dev',
+ })
+ );
+
+ await removeRecentPr({
+ owner: 'octocat',
+ repo: 'hello-world',
+ number: 1,
+ platform: 'gitlab',
+ instanceHint: 'https://gl.acme.dev',
+ });
+ await expect(getRecentPrs()).resolves.toMatchObject([{ title: 'GitHub one' }]);
+
+ await upsertRecentPr(
+ makeRecent({
+ number: 1,
+ title: 'GitLab one',
+ platform: 'gitlab',
+ instanceHint: 'https://gl.acme.dev',
+ })
+ );
+ await markRecentPrFailed({ owner: 'octocat', repo: 'hello-world', number: 1 });
+ await expect(getRecentPrs()).resolves.toMatchObject([
+ { title: 'GitLab one', lastResult: 'ok' },
+ { title: 'GitHub one', lastResult: 'failed' },
+ ]);
+ });
+
+ it('parseRecents keeps platform and instanceHint of stored provider entries', async () => {
+ store.set(
+ 'pr-review-recents',
+ JSON.stringify([
+ {
+ owner: 'group',
+ repo: 'api',
+ number: 7,
+ title: 'MR',
+ lastOpenedAt: 1_700_000_000_000,
+ platform: 'gitlab',
+ instanceHint: 'https://gitlab.acme.dev',
+ },
+ ])
+ );
+ await expect(getRecentPrs()).resolves.toEqual([
+ {
+ owner: 'group',
+ repo: 'api',
+ number: 7,
+ title: 'MR',
+ lastOpenedAt: 1_700_000_000_000,
+ lastResult: 'ok',
+ platform: 'gitlab',
+ instanceHint: 'https://gitlab.acme.dev',
+ },
+ ]);
+ });
+
+ it('recentPrKey is collision-free across providers and folds case for GitHub', () => {
+ const triple = { owner: 'Acme', repo: 'API', number: 1 };
+ expect(recentPrKey(triple)).not.toBe(recentPrKey({ ...triple, platform: 'gitlab' }));
+ expect(recentPrKey(triple)).toBe(recentPrKey({ ...triple, platform: 'github' }));
+ expect(recentPrKey({ ...triple, owner: 'acme', repo: 'api' })).toBe(recentPrKey(triple));
+ expect(
+ recentPrKey({ ...triple, platform: 'gitlab', instanceHint: 'https://a.example' })
+ ).not.toBe(recentPrKey({ ...triple, platform: 'gitlab', instanceHint: 'https://b.example' }));
+ // The GitLab instance part is the normalized host only, so a scheme or
+ // path on the hint cannot split one instance into two rows.
+ expect(recentPrKey({ ...triple, platform: 'gitlab', instanceHint: 'https://A.example/' })).toBe(
+ recentPrKey({ ...triple, platform: 'gitlab', instanceHint: 'http://a.example' })
+ );
+ });
+
+ it('providerRefFromRecentPr restores each platform ref, legacy entries as GitHub', () => {
+ expect(providerRefFromRecentPr({ owner: 'o', repo: 'r', number: 3 })).toEqual({
+ platform: 'github',
+ owner: 'o',
+ repo: 'r',
+ number: 3,
+ });
+ expect(
+ providerRefFromRecentPr({
+ owner: 'group/sub',
+ repo: 'api',
+ number: 7,
+ platform: 'gitlab',
+ instanceHint: 'https://gl.acme.dev',
+ })
+ ).toEqual({
+ platform: 'gitlab',
+ projectPath: 'group/sub/api',
+ mrIid: 7,
+ instanceHint: 'https://gl.acme.dev',
+ });
+ expect(
+ providerRefFromRecentPr({ owner: 'ws', repo: 'slug', number: 9, platform: 'bitbucket' })
+ ).toEqual({ platform: 'bitbucket', workspace: 'ws', repoSlug: 'slug', prId: 9 });
+ });
});
diff --git a/apps/mobile/src/lib/pr-review/recent-prs.ts b/apps/mobile/src/lib/pr-review/recent-prs.ts
index f9fc29955b..3b6ec5368f 100644
--- a/apps/mobile/src/lib/pr-review/recent-prs.ts
+++ b/apps/mobile/src/lib/pr-review/recent-prs.ts
@@ -1,6 +1,12 @@
import * as SecureStore from 'expo-secure-store';
import { z } from 'zod';
+import {
+ gitlabInstanceOrigin,
+ type ProviderPrPlatform,
+ type ProviderPrRef,
+} from '@kilocode/app-shared/provider-review';
+
import { deleteAccountMetadata, writeAccountMetadata } from '@/lib/auth/account-metadata-write';
import { PR_REVIEW_RECENTS_KEY } from '@/lib/storage-keys';
@@ -16,6 +22,19 @@ export type RecentPr = {
* missing field on a legacy stored entry) marks a successful load.
*/
lastResult?: 'ok' | 'failed';
+ /**
+ * The provider this entry belongs to. Entries stored before the
+ * multi-provider recents (s7) carry no platform and read as `'github'` —
+ * they were only ever written by the GitHub backfill.
+ */
+ platform?: ProviderPrPlatform;
+ /**
+ * GitLab only: the origin of the instance the entry was opened on.
+ * Identity/recents only — the server re-derives the authoritative
+ * instance (s2), so a stale hint never redirects, it only keeps one row
+ * per instance.
+ */
+ instanceHint?: string;
};
const recentPrSchema = z.object({
@@ -25,18 +44,60 @@ const recentPrSchema = z.object({
title: z.string(),
lastOpenedAt: z.number(),
lastResult: z.enum(['ok', 'failed']).optional(),
+ platform: z.enum(['github', 'gitlab', 'bitbucket']).optional(),
+ instanceHint: z.string().optional(),
});
const RECENT_PR_LIMIT = 10;
-type RecentPrRef = {
+/** The identity one recents entry is stored, keyed, removed and marked under. */
+export type RecentPrRef = {
owner: string;
repo: string;
number: number;
+ platform?: ProviderPrPlatform;
+ instanceHint?: string;
};
-function recentPrKey(item: RecentPrRef): string {
- return `${item.owner.toLowerCase()}/${item.repo.toLowerCase()}#${item.number}`;
+/**
+ * The collision-free recents key: platform, the GitLab instance origin, and
+ * the lowercased repository path plus number. The bare `owner/repo#number`
+ * triple collided across providers — the same-named repository on GitHub,
+ * GitLab and Bitbucket is three separate rows, and one GitLab project on two
+ * instances is two rows. GitHub paths keep their existing case-fold so a
+ * differently cased paste of the same PR still dedupes.
+ */
+export function recentPrKey(item: RecentPrRef): string {
+ const platform = item.platform ?? 'github';
+ const instance = platform === 'gitlab' ? gitlabInstanceOrigin(item.instanceHint) : '';
+ return `${platform}|${instance}|${item.owner.toLowerCase()}/${item.repo.toLowerCase()}#${item.number}`;
+}
+
+/**
+ * The provider ref a recents row navigates with. The entry's writers store
+ * the `owner`/`repo`/`number` triple exactly as `providerPrTriple` splits
+ * the provider path at its last separator, so folding it back with the
+ * platform (legacy entries: GitHub) restores the ref losslessly.
+ */
+export function providerRefFromRecentPr(entry: RecentPrRef): ProviderPrRef {
+ const platform: ProviderPrPlatform = entry.platform ?? 'github';
+ if (platform === 'gitlab') {
+ return {
+ platform: 'gitlab',
+ projectPath: `${entry.owner}/${entry.repo}`,
+ mrIid: entry.number,
+ ...(entry.instanceHint ? { instanceHint: entry.instanceHint } : {}),
+ };
+ }
+ if (platform === 'bitbucket') {
+ return {
+ platform: 'bitbucket',
+ workspace: entry.owner,
+ repoSlug: entry.repo,
+ prId: entry.number,
+ };
+ }
+ return { platform: 'github', owner: entry.owner, repo: entry.repo, number: entry.number };
}
function parseRecents(raw: string | null): RecentPr[] {
@@ -54,7 +115,9 @@ function parseRecents(raw: string | null): RecentPr[] {
return [];
}
// Legacy entries predate `lastResult`; read a missing field as 'ok'
- // so an installed app's existing recents survive the upgrade.
+ // so an installed app's existing recents survive the upgrade. A
+ // missing `platform` (s7) reads as GitHub, which is the only provider
+ // the pre-s7 writers could have stored.
return [
{ ...result.data, lastResult: result.data.lastResult === 'failed' ? 'failed' : 'ok' },
];
diff --git a/apps/mobile/src/lib/pr-review/use-check-provider-connection.ts b/apps/mobile/src/lib/pr-review/use-check-provider-connection.ts
new file mode 100644
index 0000000000..38c0460b46
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/use-check-provider-connection.ts
@@ -0,0 +1,66 @@
+// Provider-aware connection check for the PR-review connect gate.
+//
+// `useCheckGitHubConnection` stays the GitHub arm (it refetches the GitHub
+// App user authorization and invalidates `githubPrReview`). GitLab and
+// Bitbucket have no per-user GitHub authorization to check — their
+// connectivity is the integration status the s4 endpoints expose
+// (`getGitLabStatus` personal + org, `getBitbucketReadiness` org), so this
+// hook force-refetches that status and invalidates `providerReview` once the
+// provider answers connected.
+
+import { useMutation, useQueryClient } from '@tanstack/react-query';
+import { toast } from 'sonner-native';
+
+import { useTRPC } from '@/lib/trpc';
+
+type ProviderConnectionPlatform = 'gitlab' | 'bitbucket';
+
+export type CheckProviderConnectionInput = {
+ platform: ProviderConnectionPlatform;
+ /** The selected organization, or null for the personal scope. */
+ organizationId: string | null;
+};
+
+/**
+ * Force-fresh provider connection check. Bitbucket Cloud is
+ * organization-context only, so a personal scope has nothing to check and
+ * the mutation reports not-connected without a call.
+ */
+export function useCheckProviderConnection() {
+ const queryClient = useQueryClient();
+ const trpc = useTRPC();
+
+ return useMutation({
+ mutationFn: async (input: CheckProviderConnectionInput) => {
+ if (input.platform === 'bitbucket' && !input.organizationId) {
+ return { connected: false };
+ }
+ // The two providers answer with different status shapes, so each arm
+ // fetches its own options — a union of the two queryOptions types is
+ // not assignable to a single fetchQuery call.
+ const status =
+ input.platform === 'gitlab'
+ ? await queryClient.fetchQuery({
+ ...(input.organizationId
+ ? trpc.organizations.reviewAgent.getGitLabStatus.queryOptions({
+ organizationId: input.organizationId,
+ })
+ : trpc.personalReviewAgent.getGitLabStatus.queryOptions()),
+ staleTime: 0,
+ })
+ : await queryClient.fetchQuery({
+ ...trpc.organizations.reviewAgent.getBitbucketReadiness.queryOptions({
+ organizationId: input.organizationId ?? '',
+ }),
+ staleTime: 0,
+ });
+ if (status.connected) {
+ await queryClient.invalidateQueries(trpc.providerReview.pathFilter());
+ }
+ return status;
+ },
+ onError: error => {
+ toast.error(error.message);
+ },
+ });
+}
diff --git a/apps/mobile/src/lib/pr-review/use-pr-review-mutations.test.ts b/apps/mobile/src/lib/pr-review/use-pr-review-mutations.test.ts
index dd3d3d4854..5a066b3fdd 100644
--- a/apps/mobile/src/lib/pr-review/use-pr-review-mutations.test.ts
+++ b/apps/mobile/src/lib/pr-review/use-pr-review-mutations.test.ts
@@ -1,23 +1,37 @@
-// P1-A-08c wiring tests for `useCreateReviewCommentMutation` and
+/* eslint-disable max-lines -- the comment and review-submit suites share one mock harness for the review seam */
+// P1-A-08c + s6 wiring tests for `useCreateReviewCommentMutation` and
// `useSubmitReviewMutation`.
//
// The sheet / composer / pending-review surfaces own the inline error
// rendering; these tests assert the HOOK WIRING: each `mutationFn`
-// delegates to the matching `trpcClient.githubPrReview..mutate`,
-// the hoisted operation key is merged into the input, and the key rotation
+// delegates to the matching `trpcClient...mutate`, the
+// hoisted operation key is merged into the input, and the key rotation
// policy (real `isPrMutationRetryable` + `mapPrOperationError`) runs inside
// `mutationFn`. Only `useHoistedOperationKey` is mocked (it holds React ref
// state that needs a mounted renderer, covered by
// `operation-key.mounted.test.tsx`).
+//
+// s6: the GitHub arms stay byte-identical (same procedures, same inputs,
+// same pinned fingerprints). The provider arms route the same intents
+// through `providerReview.*` with the s1 provider identity, and the
+// fingerprint pins below mirror the server's `gitlabFingerprintInput` /
+// `bitbucketFingerprintInput` exactly — a GitLab comment and a same-named
+// GitHub comment can never share a ledger key (identity rule 17).
+// c3: the provider arms carry the REAL diff position — an `anchor` on
+// addComment and a `comments` batch on submitReview — and the pinned
+// fingerprints below mirror the server folding the anchor flat and the
+// parsed batch into the ledger key.
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import type * as OperationKeyModule from '@/lib/operation-key';
import { prIntentFingerprint } from '@kilocode/app-shared/pr-review';
+import type * as ProviderPrRefModule from '@/lib/pr-review/provider-pr-ref';
+import { type ProviderPrRef, type ProviderPrTriple } from '@/lib/pr-review/provider-pr-ref';
import { useCreateReviewCommentMutation, useSubmitReviewMutation } from './use-pr-review-mutations';
const hoistedKeys = vi.hoisted(() => ({
- getKey: vi.fn(() => 'hoisted-op-key'),
+ getKey: vi.fn((_: string) => 'hoisted-op-key'),
rotateKey: vi.fn(),
}));
@@ -30,6 +44,21 @@ vi.mock('@/lib/operation-key', async importOriginal => {
return { ...actual, useHoistedOperationKey: () => hoistedKeys };
});
+// The hooks read the live provider scope from context. These tests call the
+// hooks as plain functions (no renderer), so the context hook is replaced by
+// a settable override: null keeps the GitHub fallback the pre-s6 surface
+// used; a provider scope drives the provider arms.
+let scopeOverride: { ref: ProviderPrRef; organizationId: string | null } | null = null;
+
+vi.mock('@/lib/pr-review/provider-pr-ref', async importOriginal => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ useProviderPrScope: (fallback: ProviderPrTriple) =>
+ scopeOverride ?? { ref: { platform: 'github', ...fallback }, organizationId: null },
+ };
+});
+
type MutationOptions = {
mutationFn?: (vars: unknown) => Promise;
onError?: (error: unknown) => void;
@@ -39,6 +68,8 @@ type MutationOptions = {
let lastCapturedOptions: MutationOptions | null = null;
const createCommentMutateMock = vi.fn();
const submitReviewMutateMock = vi.fn();
+const providerAddCommentMutateMock = vi.fn();
+const providerSubmitReviewMutateMock = vi.fn();
const invalidateQueriesMock = vi.fn();
const toastErrorMock = vi.fn();
@@ -60,6 +91,10 @@ vi.mock('@/lib/trpc', () => ({
getPullRequest: { queryKey: () => ['githubPrReview', 'getPullRequest'] },
listReviewThreads: { pathFilter: () => ['githubPrReview', 'listReviewThreads'] },
},
+ providerReview: {
+ getPullRequest: { queryKey: () => ['providerReview', 'getPullRequest'] },
+ listDiscussions: { pathFilter: () => ['providerReview', 'listDiscussions'] },
+ },
}),
trpcClient: {
githubPrReview: {
@@ -68,6 +103,12 @@ vi.mock('@/lib/trpc', () => ({
// eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
submitReview: { mutate: (vars: unknown) => submitReviewMutateMock(vars) },
},
+ providerReview: {
+ // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
+ addComment: { mutate: (vars: unknown) => providerAddCommentMutateMock(vars) },
+ // eslint-disable-next-line typescript-eslint/promise-function-async -- conflicting require-await rule
+ submitReview: { mutate: (vars: unknown) => providerSubmitReviewMutateMock(vars) },
+ },
},
}));
@@ -89,6 +130,36 @@ vi.mock('react-native', () => ({
const REF = { owner: 'octocat', repo: 'hello', number: 1 };
+const GITLAB_REF: ProviderPrRef = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/app',
+ mrIid: 12,
+ instanceHint: 'https://gl.example.com',
+};
+
+const BITBUCKET_REF: ProviderPrRef = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'widgets',
+ prId: 77,
+};
+
+const GITLAB_IDENTITY = {
+ platform: 'gitlab',
+ projectPath: 'group/sub/app',
+ mrIid: 12,
+ instanceHint: 'https://gl.example.com',
+ organizationId: 'org-9',
+};
+
+const BITBUCKET_IDENTITY = {
+ platform: 'bitbucket',
+ workspace: 'acme',
+ repoSlug: 'widgets',
+ prId: 77,
+ organizationId: 'org-9',
+};
+
const COMMENT_INPUT = {
owner: 'octocat',
repo: 'hello',
@@ -110,14 +181,22 @@ const REVIEW_INPUT = {
comments: [{ path: 'README.md', line: 3, side: 'RIGHT' as const, body: 'nit' }],
};
+function resetMocks() {
+ lastCapturedOptions = null;
+ scopeOverride = null;
+ createCommentMutateMock.mockReset();
+ submitReviewMutateMock.mockReset();
+ providerAddCommentMutateMock.mockReset();
+ providerSubmitReviewMutateMock.mockReset();
+ invalidateQueriesMock.mockReset();
+ toastErrorMock.mockReset();
+ hoistedKeys.getKey.mockClear();
+ hoistedKeys.rotateKey.mockClear();
+}
+
describe('useCreateReviewCommentMutation (P1-A-08c wiring)', () => {
beforeEach(() => {
- lastCapturedOptions = null;
- createCommentMutateMock.mockReset();
- invalidateQueriesMock.mockReset();
- toastErrorMock.mockReset();
- hoistedKeys.getKey.mockClear();
- hoistedKeys.rotateKey.mockClear();
+ resetMocks();
});
afterEach(() => {
@@ -216,14 +295,196 @@ describe('useCreateReviewCommentMutation (P1-A-08c wiring)', () => {
});
});
+describe('useCreateReviewCommentMutation (s6 gitlab arm)', () => {
+ beforeEach(() => {
+ resetMocks();
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('routes the body through providerReview.addComment with the full identity', async () => {
+ providerAddCommentMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useCreateReviewCommentMutation(GITLAB_REF);
+
+ await expect(lastCapturedOptions?.mutationFn?.({ body: 'inline nit' })).resolves.toEqual({
+ done: true,
+ replayed: false,
+ });
+ expect(createCommentMutateMock).not.toHaveBeenCalled();
+ expect(providerAddCommentMutateMock).toHaveBeenCalledWith({
+ ...GITLAB_IDENTITY,
+ body: 'inline nit',
+ operationKey: 'hoisted-op-key',
+ });
+ });
+
+ it('folds the GitLab instance into the fingerprint (identity rule 17)', async () => {
+ providerAddCommentMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useCreateReviewCommentMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.mutationFn?.({ body: 'inline nit' });
+
+ // Pinned bytes mirroring the server's gitlabFingerprintInput: platform +
+ // instanceHint + projectPath + number (as `number`) + body.
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"body":"inline nit"}'
+ );
+ });
+
+ it('sends the tapped diff position as the real anchor and folds it into the fingerprint (c3)', async () => {
+ providerAddCommentMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useCreateReviewCommentMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.mutationFn?.({
+ body: 'inline nit',
+ anchor: { path: 'src/a.ts', side: 'RIGHT', line: 12, startLine: 10 },
+ });
+ expect(providerAddCommentMutateMock).toHaveBeenCalledWith({
+ ...GITLAB_IDENTITY,
+ body: 'inline nit',
+ anchor: { path: 'src/a.ts', side: 'RIGHT', line: 12, startLine: 10 },
+ operationKey: 'hoisted-op-key',
+ });
+ // Pinned bytes mirroring the server's gitlabFingerprintInput: the anchor
+ // folds FLAT into the s1 create_review_comment field order (body, path,
+ // line, side, startLine) — a retried anchored comment keeps its key.
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"body":"inline nit","path":"src/a.ts","line":12,"side":"RIGHT","startLine":10}'
+ );
+ });
+
+ it('rotates the key when the same body moves to another line (changed intent)', async () => {
+ providerAddCommentMutateMock.mockResolvedValue({ done: true, replayed: false });
+ useCreateReviewCommentMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.mutationFn?.({
+ body: 'inline nit',
+ anchor: { path: 'src/a.ts', side: 'RIGHT', line: 12 },
+ });
+ const atLine12 = hoistedKeys.getKey.mock.calls[0]?.[0];
+ await lastCapturedOptions?.mutationFn?.({
+ body: 'inline nit',
+ anchor: { path: 'src/a.ts', side: 'RIGHT', line: 13 },
+ });
+ const atLine13 = hoistedKeys.getKey.mock.calls[1]?.[0];
+ expect(atLine12).not.toBe(atLine13);
+ expect(atLine12).toBe(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"body":"inline nit","path":"src/a.ts","line":12,"side":"RIGHT"}'
+ );
+ });
+
+ it('keys a GitLab comment apart from the same GitHub comment and from the same MR on another instance', async () => {
+ providerAddCommentMutateMock.mockResolvedValue({ done: true, replayed: false });
+ const onInstanceA = prIntentFingerprint('create_review_comment', {
+ platform: 'gitlab',
+ projectPath: 'group/sub/app',
+ instanceHint: 'https://gl.example.com',
+ number: 12,
+ body: 'inline nit',
+ });
+ const onInstanceB = prIntentFingerprint('create_review_comment', {
+ platform: 'gitlab',
+ projectPath: 'group/sub/app',
+ instanceHint: 'https://gl.other.example',
+ number: 12,
+ body: 'inline nit',
+ });
+ const onGitHub = prIntentFingerprint('create_review_comment', COMMENT_INPUT);
+ expect(onInstanceA).not.toBe(onInstanceB);
+ expect(onInstanceA).not.toBe(onGitHub);
+
+ useCreateReviewCommentMutation({ ...GITLAB_REF, instanceHint: 'https://gl.other.example' });
+ await lastCapturedOptions?.mutationFn?.({ body: 'inline nit' });
+ expect(hoistedKeys.getKey).toHaveBeenLastCalledWith(
+ '{"resource":["gitlab","https://gl.other.example","group/sub/app",12],"body":"inline nit"}'
+ );
+ });
+
+ it('keeps the key on an in-progress CONFLICT and rotates on a non-retryable refusal', async () => {
+ providerAddCommentMutateMock.mockRejectedValueOnce(new Error('operation_in_progress'));
+ useCreateReviewCommentMutation(GITLAB_REF);
+ await expect(lastCapturedOptions?.mutationFn?.({ body: 'x' })).rejects.toBeInstanceOf(Error);
+ expect(hoistedKeys.rotateKey).not.toHaveBeenCalled();
+
+ const refused = new Error('Merge request is locked');
+ Object.assign(refused, { data: { code: 'BAD_REQUEST' } });
+ providerAddCommentMutateMock.mockRejectedValueOnce(refused);
+ await expect(lastCapturedOptions?.mutationFn?.({ body: 'x' })).rejects.toMatchObject({
+ message: 'Merge request is locked',
+ });
+ expect(hoistedKeys.rotateKey).toHaveBeenCalledTimes(1);
+ });
+
+ it('onSettled invalidates the provider caches (overview + discussions)', async () => {
+ useCreateReviewCommentMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.onSettled?.();
+
+ expect(invalidateQueriesMock).toHaveBeenCalledWith({
+ queryKey: ['providerReview', 'getPullRequest'],
+ });
+ expect(invalidateQueriesMock).toHaveBeenCalledWith(['providerReview', 'listDiscussions']);
+ });
+});
+
+describe('useCreateReviewCommentMutation (s6 bitbucket arm)', () => {
+ beforeEach(() => {
+ resetMocks();
+ scopeOverride = { ref: BITBUCKET_REF, organizationId: 'org-9' };
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('routes through providerReview.addComment with the workspace identity', async () => {
+ providerAddCommentMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useCreateReviewCommentMutation(BITBUCKET_REF);
+
+ await lastCapturedOptions?.mutationFn?.({ body: 'inline nit' });
+ expect(providerAddCommentMutateMock).toHaveBeenCalledWith({
+ ...BITBUCKET_IDENTITY,
+ body: 'inline nit',
+ operationKey: 'hoisted-op-key',
+ });
+ });
+
+ it('folds the workspace into the fingerprint (identity rule 17)', async () => {
+ providerAddCommentMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useCreateReviewCommentMutation(BITBUCKET_REF);
+
+ await lastCapturedOptions?.mutationFn?.({ body: 'inline nit' });
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["bitbucket","acme","widgets",77],"body":"inline nit"}'
+ );
+ });
+
+ it('sends the anchor through the seam with the workspace fingerprint (c3)', async () => {
+ providerAddCommentMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useCreateReviewCommentMutation(BITBUCKET_REF);
+
+ await lastCapturedOptions?.mutationFn?.({
+ body: 'inline nit',
+ anchor: { path: 'src/a.ts', side: 'LEFT', line: 5 },
+ });
+ expect(providerAddCommentMutateMock).toHaveBeenCalledWith({
+ ...BITBUCKET_IDENTITY,
+ body: 'inline nit',
+ anchor: { path: 'src/a.ts', side: 'LEFT', line: 5 },
+ operationKey: 'hoisted-op-key',
+ });
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["bitbucket","acme","widgets",77],"body":"inline nit","path":"src/a.ts","line":5,"side":"LEFT"}'
+ );
+ });
+});
+
describe('useSubmitReviewMutation (P1-A-08c wiring)', () => {
beforeEach(() => {
- lastCapturedOptions = null;
- submitReviewMutateMock.mockReset();
- invalidateQueriesMock.mockReset();
- toastErrorMock.mockReset();
- hoistedKeys.getKey.mockClear();
- hoistedKeys.rotateKey.mockClear();
+ resetMocks();
});
afterEach(() => {
@@ -313,6 +574,103 @@ describe('useSubmitReviewMutation (P1-A-08c wiring)', () => {
});
});
+describe('useSubmitReviewMutation (s6 provider arms)', () => {
+ beforeEach(() => {
+ resetMocks();
+ });
+
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('gitlab: routes event + summary through providerReview.submitReview', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ providerSubmitReviewMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useSubmitReviewMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.mutationFn?.({ event: 'approve', body: 'LGTM' });
+ expect(submitReviewMutateMock).not.toHaveBeenCalled();
+ expect(providerSubmitReviewMutateMock).toHaveBeenCalledWith({
+ ...GITLAB_IDENTITY,
+ event: 'approve',
+ body: 'LGTM',
+ operationKey: 'hoisted-op-key',
+ });
+ // Pinned bytes mirroring the server's submitReview fingerprint input.
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"event":"approve","body":"LGTM"}'
+ );
+ });
+
+ it('gitlab: an event-only review omits the body from the input and the fingerprint', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ providerSubmitReviewMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useSubmitReviewMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.mutationFn?.({ event: 'comment' });
+ const sent = providerSubmitReviewMutateMock.mock.calls[0]?.[0] as Record;
+ expect(sent).not.toHaveProperty('body');
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"event":"comment"}'
+ );
+ });
+
+ it('gitlab: sends the anchored comments batch and folds it into the fingerprint (c3)', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ providerSubmitReviewMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useSubmitReviewMutation(GITLAB_REF);
+
+ const comments = [
+ { path: 'src/a.ts', side: 'RIGHT' as const, line: 10, body: 'first' },
+ { path: 'src/b.ts', side: 'LEFT' as const, line: 2, startLine: 1, body: 'second' },
+ ];
+ await lastCapturedOptions?.mutationFn?.({ event: 'approve', body: 'LGTM', comments });
+ expect(providerSubmitReviewMutateMock).toHaveBeenCalledWith({
+ ...GITLAB_IDENTITY,
+ event: 'approve',
+ body: 'LGTM',
+ comments,
+ operationKey: 'hoisted-op-key',
+ });
+ // Pinned bytes mirroring the server's submitReview fingerprint input:
+ // the batch serializes in the router's field order (path, side, line,
+ // startLine, body), so a retried batch keeps its ledger identity.
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"event":"approve","body":"LGTM","comments":[{"path":"src/a.ts","side":"RIGHT","line":10,"body":"first"},{"path":"src/b.ts","side":"LEFT","line":2,"startLine":1,"body":"second"}]}'
+ );
+ });
+
+ it('gitlab: an empty comments batch is no batch — pre-c3 bytes unchanged (c3)', async () => {
+ scopeOverride = { ref: GITLAB_REF, organizationId: 'org-9' };
+ providerSubmitReviewMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useSubmitReviewMutation(GITLAB_REF);
+
+ await lastCapturedOptions?.mutationFn?.({ event: 'approve', body: 'LGTM', comments: [] });
+ const sent = providerSubmitReviewMutateMock.mock.calls[0]?.[0] as Record;
+ expect(sent).not.toHaveProperty('comments');
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["gitlab","https://gl.example.com","group/sub/app",12],"event":"approve","body":"LGTM"}'
+ );
+ });
+
+ it('bitbucket: routes request-changes through the seam with the workspace fingerprint', async () => {
+ scopeOverride = { ref: BITBUCKET_REF, organizationId: 'org-9' };
+ providerSubmitReviewMutateMock.mockResolvedValueOnce({ done: true, replayed: false });
+ useSubmitReviewMutation(BITBUCKET_REF);
+
+ await lastCapturedOptions?.mutationFn?.({ event: 'request_changes', body: 'Fix this' });
+ expect(providerSubmitReviewMutateMock).toHaveBeenCalledWith({
+ ...BITBUCKET_IDENTITY,
+ event: 'request_changes',
+ body: 'Fix this',
+ operationKey: 'hoisted-op-key',
+ });
+ expect(hoistedKeys.getKey).toHaveBeenCalledWith(
+ '{"resource":["bitbucket","acme","widgets",77],"event":"request_changes","body":"Fix this"}'
+ );
+ });
+});
+
describe('create_review_comment fingerprint (P1-A-08c changed-input)', () => {
it('stays stable for a retry of the same comment and rotates when any intent input changes', () => {
const original = prIntentFingerprint('create_review_comment', COMMENT_INPUT);
@@ -365,3 +723,47 @@ describe('submit_review fingerprint (P1-A-08c changed-input)', () => {
expect(changedComment).not.toBe(original);
});
});
+
+describe('provider pending-comment body builders (s6, c3)', () => {
+ it('formatPendingCommentBody anchors a single-line position like the pending list shows it', async () => {
+ const { formatPendingCommentBody } = await import('./use-pr-review-mutations');
+ expect(formatPendingCommentBody({ path: 'src/a.ts', line: 10, body: 'note' })).toBe(
+ 'src/a.ts:L10\n\nnote'
+ );
+ expect(
+ formatPendingCommentBody({ path: 'src/a.ts', line: 12, startLine: 10, body: 'range' })
+ ).toBe('src/a.ts:L10–L12\n\nrange');
+ });
+ it('buildProviderSubmitInput sends anchored items as a real comments batch (c3)', async () => {
+ const { buildProviderSubmitInput } = await import('./use-pr-review-mutations');
+ expect(
+ buildProviderSubmitInput('Looks good overall.', [
+ { path: 'src/a.ts', side: 'RIGHT' as const, line: 10, body: 'first' },
+ { path: 'src/b.ts', side: 'LEFT' as const, line: 2, startLine: 1, body: 'second' },
+ ])
+ ).toEqual({
+ body: 'Looks good overall.',
+ comments: [
+ { path: 'src/a.ts', side: 'RIGHT', line: 10, body: 'first' },
+ { path: 'src/b.ts', side: 'LEFT', line: 2, startLine: 1, body: 'second' },
+ ],
+ });
+ });
+ it('buildProviderSubmitInput keeps the text-anchored body for items without an anchor (c3)', async () => {
+ const { buildProviderSubmitInput } = await import('./use-pr-review-mutations');
+ expect(
+ buildProviderSubmitInput('Summary.', [
+ { path: 'src/a.ts', line: 10, body: 'folded' },
+ { path: 'src/b.ts', side: 'RIGHT' as const, line: 2, body: 'anchored' },
+ ])
+ ).toEqual({
+ body: 'Summary.\n\nsrc/a.ts:L10\n\nfolded',
+ comments: [{ path: 'src/b.ts', side: 'RIGHT', line: 2, body: 'anchored' }],
+ });
+ });
+ it('buildProviderSubmitInput drops empty parts: a summary-only approve posts exactly the summary', async () => {
+ const { buildProviderSubmitInput } = await import('./use-pr-review-mutations');
+ expect(buildProviderSubmitInput(' LGTM ', [])).toEqual({ body: 'LGTM', comments: [] });
+ expect(buildProviderSubmitInput('', [])).toEqual({ body: '', comments: [] });
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/use-pr-review-mutations.ts b/apps/mobile/src/lib/pr-review/use-pr-review-mutations.ts
index 3831e04caf..f32f2356d5 100644
--- a/apps/mobile/src/lib/pr-review/use-pr-review-mutations.ts
+++ b/apps/mobile/src/lib/pr-review/use-pr-review-mutations.ts
@@ -1,10 +1,10 @@
// S7a mutation hooks for inline PR review comments and the pending-
-// review batch submit. The pattern mirrors the existing S8 merge
-// mutations:
+// review batch submit, s6: provider-aware through the `providerReview` seam.
+// The pattern mirrors the existing S8 merge mutations:
// - `onError` toasts the message
// - `onSettled` invalidates the PR review queries that the
// mutation could have invalidated (overview `getPullRequest` for
-// `submitReview` because reviewDecision may flip; `listReviewThreads`
+// `submitReview` because reviewDecision may flip; the thread list
// for both because a new thread lands immediately)
// - the sheet / composer ALSO renders inline errors because toasts
// paint behind formSheets on iOS
@@ -16,13 +16,29 @@
// uses the LATEST head SHA (per the S3 contract) regardless of what
// SHA each item was queued under; a per-item 422 surfaces inline.
//
+// Provider arms (s6, anchored by c3): a GitLab MR or Bitbucket PR posts
+// through `providerReview.addComment` / `providerReview.submitReview` with
+// the REAL diff position (`anchor: { path, side, line, startLine? }`) and a
+// real `comments` batch, so an inline comment lands on the line the user
+// tapped. `formatPendingCommentBody` stays as the no-anchor fallback: a
+// position-less body keeps the `path:L10–L20` text anchor. The GitHub arms
+// stay byte-identical: same procedures, same inputs, same fingerprints.
+//
// P1-A-08c: both hooks hoist one operation key per intent, so retries of the
// same intent dedupe on the server instead of re-executing the write. The
-// ledger markers map onto the existing per-surface copy.
+// ledger markers map onto the existing per-surface copy. The provider key
+// fingerprint folds the s1 provider identity (platform + instance hint /
+// workspace), so a GitLab comment and a same-named GitHub comment can never
+// share a ledger key — the same bytes the server hashes into `resource_key`.
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { prIntentFingerprint } from '@kilocode/app-shared/pr-review';
+import {
+ type BitbucketPrRef,
+ type GitLabMrRef,
+ type ProviderPrRef,
+} from '@kilocode/app-shared/provider-review';
import { type inferRouterInputs, type MobileRouter } from '@kilocode/trpc/mobile';
import { i18n } from '@/i18n';
@@ -30,6 +46,12 @@ import { announceForA11y } from '@/lib/a11y/announce';
import { announcingToast } from '@/lib/a11y/announcing-toast';
import { trpcClient, useTRPC } from '@/lib/trpc';
import { useHoistedOperationKey } from '@/lib/operation-key';
+import {
+ type ProviderPrScope,
+ providerPrTriple,
+ type ProviderPrTriple,
+ useProviderPrScope,
+} from '@/lib/pr-review/provider-pr-ref';
import {
isPrMutationRetryable,
mapPrOperationError,
@@ -38,11 +60,108 @@ import {
type PrRef = { owner: string; repo: string; number: number };
-function usePrRefKeys(ref: PrRef) {
+/** Any ref the review write hooks accept: the legacy triple or a provider ref. */
+export type ReviewWriteRef = ProviderPrRef | PrRef;
+
+/** The legacy triple behind any accepted ref. */
+function reviewWriteTriple(ref: ReviewWriteRef): ProviderPrTriple {
+ return 'platform' in ref ? providerPrTriple(ref) : ref;
+}
+
+/**
+ * The provider write identity every `providerReview` mutation input carries.
+ * Mirrors `providerIdentity()` in `provider-pr-queries.ts` exactly, so the
+ * invalidation keys below hit the same cache entries the reads populate.
+ */
+export type ProviderWriteIdentity =
+ | {
+ platform: 'gitlab';
+ projectPath: string;
+ mrIid: number;
+ instanceHint?: string;
+ organizationId?: string;
+ }
+ | {
+ platform: 'bitbucket';
+ workspace: string;
+ repoSlug: string;
+ prId: number;
+ organizationId: string;
+ };
+
+/** The mutation-side identity of one scope — the read-side twin, unchanged. */
+export function providerWriteIdentity(scope: ProviderPrScope): ProviderWriteIdentity {
+ const { ref, organizationId } = scope;
+ if (ref.platform === 'gitlab') {
+ return {
+ platform: 'gitlab',
+ projectPath: ref.projectPath,
+ mrIid: ref.mrIid,
+ ...(ref.instanceHint ? { instanceHint: ref.instanceHint } : {}),
+ ...(organizationId ? { organizationId } : {}),
+ };
+ }
+ return {
+ platform: 'bitbucket',
+ workspace: ref.platform === 'bitbucket' ? ref.workspace : '',
+ repoSlug: ref.platform === 'bitbucket' ? ref.repoSlug : '',
+ prId: ref.platform === 'bitbucket' ? ref.prId : 0,
+ organizationId: organizationId ?? '',
+ };
+}
+
+/**
+ * The fingerprint input the server hashes into `resource_key`: the s1
+ * provider identity fields (`gitlabFingerprintInput` /
+ * `bitbucketFingerprintInput` in provider-review-router.ts) plus the
+ * intent-defining fields. Field VALUES must match the server's — the
+ * fingerprint is the dedupe identity, and a drift makes every same-key
+ * retry fail with `operation_key_reuse_mismatch`.
+ */
+export function providerFingerprintInput(
+ ref: GitLabMrRef | BitbucketPrRef,
+ fields: Record
+) {
+ if (ref.platform === 'gitlab') {
+ return {
+ platform: 'gitlab',
+ projectPath: ref.projectPath,
+ instanceHint: ref.instanceHint,
+ number: ref.mrIid,
+ ...fields,
+ };
+ }
+ return {
+ platform: 'bitbucket',
+ workspace: ref.workspace,
+ repoSlug: ref.repoSlug,
+ number: ref.prId,
+ ...fields,
+ };
+}
+
+/**
+ * The write scope: the caller's ref paired with the organization the live
+ * provider scope publishes. On the GitHub route the context is absent and
+ * the organization is null — exactly what the GitHub arms already sent.
+ */
+export function useReviewWriteScope(ref: ReviewWriteRef): ProviderPrScope {
+ const scope = useProviderPrScope(reviewWriteTriple(ref));
+ return 'platform' in ref ? { ref, organizationId: scope.organizationId } : scope;
+}
+
+function usePrRefKeys(scope: ProviderPrScope) {
const trpc = useTRPC();
+ if (scope.ref.platform === 'github') {
+ const triple = providerPrTriple(scope.ref);
+ return {
+ getPullRequest: trpc.githubPrReview.getPullRequest.queryKey(triple),
+ threadsPath: trpc.githubPrReview.listReviewThreads.pathFilter(),
+ };
+ }
return {
- getPullRequest: trpc.githubPrReview.getPullRequest.queryKey(ref),
- listReviewThreadsPath: trpc.githubPrReview.listReviewThreads.pathFilter(),
+ getPullRequest: trpc.providerReview.getPullRequest.queryKey(providerWriteIdentity(scope)),
+ threadsPath: trpc.providerReview.listDiscussions.pathFilter(),
};
}
@@ -52,28 +171,135 @@ async function invalidateReviewCaches(
): Promise {
await Promise.all([
queryClient.invalidateQueries({ queryKey: keys.getPullRequest }),
- queryClient.invalidateQueries(keys.listReviewThreadsPath),
+ queryClient.invalidateQueries(keys.threadsPath),
]);
}
type RouterInputs = inferRouterInputs;
-export type CreateReviewCommentInput = RouterInputs['githubPrReview']['createReviewComment'];
+type CreateReviewCommentInput = RouterInputs['githubPrReview']['createReviewComment'];
export type SubmitReviewInput = RouterInputs['githubPrReview']['submitReview'];
export type SubmitReviewComment = NonNullable[number];
-export function useCreateReviewCommentMutation(ref: PrRef) {
+/**
+ * The real diff position a provider comment anchors to (c3): the line the
+ * user tapped, with `startLine` marking the first line of a multi-line
+ * range ending at `line`. Absent, the comment is a top-level note.
+ */
+type ProviderCommentAnchor = {
+ path: string;
+ side: 'LEFT' | 'RIGHT';
+ line: number;
+ startLine?: number;
+};
+
+/** The provider arms accept a body plus the optional real diff anchor. */
+type ProviderCommentBody = { body: string; anchor?: ProviderCommentAnchor };
+export type CreateReviewCommentVars = CreateReviewCommentInput | ProviderCommentBody;
+
+/**
+ * The no-anchor fallback body: when the composer has no real diff position,
+ * the location rides in the text itself, in the same `path:L10–L20` format
+ * the pending list shows.
+ */
+export function formatPendingCommentBody(item: {
+ path: string;
+ line: number;
+ startLine?: number;
+ body: string;
+}): string {
+ const location =
+ item.startLine !== undefined && item.startLine !== item.line
+ ? `${item.path}:L${item.startLine}–L${item.line}`
+ : `${item.path}:L${item.line}`;
+ return `${location}\n\n${item.body}`;
+}
+
+/** One anchored item in a provider `submitReview` batch (c3). */
+type ProviderSubmitReviewComment = ProviderCommentAnchor & { body: string };
+
+/**
+ * The provider `submitReview` intent the submit sheet builds: every pending
+ * item with a side rides the real `comments` batch; an item without one
+ * keeps the text-anchored body (the no-anchor fallback). Empty body parts
+ * are dropped, so an approve with a summary alone posts exactly the summary
+ * and an approve with neither posts nothing. Comment items keep the router's
+ * field order (path, side, line, startLine, body): the server hashes the
+ * parsed batch into the `submit_review` fingerprint, and a key drift rotates
+ * the dedupe identity.
+ */
+export function buildProviderSubmitInput(
+ summary: string,
+ items: readonly {
+ path: string;
+ side?: 'LEFT' | 'RIGHT';
+ line: number;
+ startLine?: number;
+ body: string;
+ }[]
+) {
+ const comments: ProviderSubmitReviewComment[] = [];
+ const folded: string[] = [];
+ for (const item of items) {
+ if (item.side === undefined) {
+ folded.push(formatPendingCommentBody(item));
+ } else {
+ const { path, side, line, startLine, body } = item;
+ comments.push({ path, side, line, ...(startLine !== undefined ? { startLine } : {}), body });
+ }
+ }
+ const body = [summary.trim(), ...folded].filter(part => part.length > 0).join('\n\n');
+ return { body, comments };
+}
+
+/** The events the `providerReview.submitReview` input accepts. */
+export type ProviderReviewEventOption = 'approve' | 'request_changes' | 'comment';
+type ProviderSubmitReviewVars = {
+ event: ProviderReviewEventOption;
+ body?: string;
+ comments?: ProviderSubmitReviewComment[];
+};
+export type SubmitReviewVars = SubmitReviewInput | ProviderSubmitReviewVars;
+
+export function useCreateReviewCommentMutation(ref: ReviewWriteRef) {
const queryClient = useQueryClient();
- const keys = usePrRefKeys(ref);
+ const scope = useReviewWriteScope(ref);
+ const keys = usePrRefKeys(scope);
const { getKey, rotateKey } = useHoistedOperationKey();
return useMutation({
- mutationFn: async (input: CreateReviewCommentInput) => {
+ mutationFn: async (input: CreateReviewCommentVars) => {
try {
- const result = await trpcClient.githubPrReview.createReviewComment.mutate({
- ...input,
- operationKey: getKey(prIntentFingerprint('create_review_comment', input)),
- });
+ if (scope.ref.platform === 'github') {
+ const vars = input as CreateReviewCommentInput;
+ const result = await trpcClient.githubPrReview.createReviewComment.mutate({
+ ...vars,
+ operationKey: getKey(prIntentFingerprint('create_review_comment', vars)),
+ });
+ rotateKey();
+ return result;
+ }
+ const vars = input as ProviderCommentBody;
+ // The anchor rides the input AND the fingerprint: path/line/side/
+ // startLine are s1 create_review_comment fields, so a retried
+ // anchored comment dedupes and a moved position starts a fresh
+ // intent. The anchor keys are exactly the fingerprint field names,
+ // so the spread folds them FLAT the way the server's
+ // gitlabFingerprintInput / bitbucketFingerprintInput does. Hoisted
+ // off the call so the extra fields compile against the router input
+ // type the client is typed against (provider-review-router.ts).
+ const addCommentInput = {
+ ...providerWriteIdentity(scope),
+ body: vars.body,
+ ...(vars.anchor ? { anchor: vars.anchor } : {}),
+ operationKey: getKey(
+ prIntentFingerprint(
+ 'create_review_comment',
+ providerFingerprintInput(scope.ref, { body: vars.body, ...vars.anchor })
+ )
+ ),
+ };
+ const result = await trpcClient.providerReview.addComment.mutate(addCommentInput);
rotateKey();
return result;
} catch (error) {
@@ -98,18 +324,45 @@ export function useCreateReviewCommentMutation(ref: PrRef) {
});
}
-export function useSubmitReviewMutation(ref: PrRef) {
+export function useSubmitReviewMutation(ref: ReviewWriteRef) {
const queryClient = useQueryClient();
- const keys = usePrRefKeys(ref);
+ const scope = useReviewWriteScope(ref);
+ const keys = usePrRefKeys(scope);
const { getKey, rotateKey } = useHoistedOperationKey();
return useMutation({
- mutationFn: async (input: SubmitReviewInput) => {
+ mutationFn: async (input: SubmitReviewVars) => {
try {
- const result = await trpcClient.githubPrReview.submitReview.mutate({
- ...input,
- operationKey: getKey(prIntentFingerprint('submit_review', input)),
- });
+ if (scope.ref.platform === 'github') {
+ const vars = input as SubmitReviewInput;
+ const result = await trpcClient.githubPrReview.submitReview.mutate({
+ ...vars,
+ operationKey: getKey(prIntentFingerprint('submit_review', vars)),
+ });
+ rotateKey();
+ return result;
+ }
+ const vars = input as ProviderSubmitReviewVars;
+ // An empty batch is no batch: the key and the input omit `comments`
+ // together, so an event-only review keeps its pre-c3 bytes. The
+ // batch rides the fingerprint exactly as the server folds the parsed
+ // `comments` into the submit_review fingerprint. Hoisted off the
+ // call so the batch compiles against the router input type the
+ // client is typed against (provider-review-router.ts).
+ const comments = vars.comments?.length ? vars.comments : undefined;
+ const submitReviewInput = {
+ ...providerWriteIdentity(scope),
+ event: vars.event,
+ ...(vars.body !== undefined && vars.body.length > 0 ? { body: vars.body } : {}),
+ ...(comments ? { comments } : {}),
+ operationKey: getKey(
+ prIntentFingerprint(
+ 'submit_review',
+ providerFingerprintInput(scope.ref, { event: vars.event, body: vars.body, comments })
+ )
+ ),
+ };
+ const result = await trpcClient.providerReview.submitReview.mutate(submitReviewInput);
rotateKey();
return result;
} catch (error) {
diff --git a/apps/mobile/src/lib/pr-review/use-provider-inbox.test.ts b/apps/mobile/src/lib/pr-review/use-provider-inbox.test.ts
new file mode 100644
index 0000000000..82e92f1831
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/use-provider-inbox.test.ts
@@ -0,0 +1,336 @@
+import { describe, expect, it, vi } from 'vitest';
+
+import { classifyPrReviewQueryState } from './classify-pr-review-query-state';
+import {
+ buildBitbucketInboxQueryOptions,
+ buildGitLabInboxQueryOptions,
+ inboxRetryAction,
+ mergeProviderInboxSources,
+ type ProviderInboxSource,
+ toGitHubInboxRows,
+ toProviderInboxRows,
+} from './use-provider-inbox';
+
+// The hook module reaches the tRPC client, the organization context and the
+// connection-status hooks; mock them so the pure exports load under Node.
+vi.mock('@/lib/trpc', () => ({ useTRPC: () => ({}) }));
+vi.mock('@/lib/organization-context', () => ({
+ useOrganization: () => ({ organizationId: null }),
+}));
+vi.mock('@/lib/hooks/use-code-reviewer', () => ({
+ useGitLabStatus: () => ({ data: undefined }),
+ useBitbucketReadiness: () => ({ data: undefined }),
+}));
+vi.mock('@/lib/pr-review/use-pr-inbox', () => ({ usePrInbox: () => ({}) }));
+
+type Trpc = Parameters[0];
+
+function makeTrpc() {
+ const infiniteQueryOptions = vi.fn((input: unknown, opts: Record) => ({
+ input,
+ ...opts,
+ }));
+ return {
+ trpc: { providerReview: { listInbox: { infiniteQueryOptions } } } as unknown as Trpc,
+ infiniteQueryOptions,
+ };
+}
+
+function loose(options: unknown) {
+ return options as {
+ input: Record;
+ enabled: boolean;
+ maxPages: number;
+ getNextPageParam: (page: { nextCursor: string | null }) => string | undefined;
+ };
+}
+
+function source(overrides: Partial): ProviderInboxSource {
+ return {
+ platform: 'github',
+ enabled: true,
+ rows: [],
+ isPending: false,
+ hasLoadedPages: true,
+ error: null,
+ hasNextPage: false,
+ isFetchingNextPage: false,
+ ...overrides,
+ };
+}
+
+const githubRows = toGitHubInboxRows([
+ {
+ owner: 'octocat',
+ repo: 'hello',
+ number: 7,
+ title: 'GitHub PR',
+ isDraft: false,
+ updatedAt: '2026-01-02T00:00:00Z',
+ },
+]);
+
+const gitlabRows = toProviderInboxRows([
+ {
+ ref: { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 },
+ title: 'GitLab MR',
+ author: null,
+ state: 'open',
+ draft: true,
+ updatedAt: '2026-01-03T00:00:00Z',
+ },
+]);
+
+const bitbucketRows = toProviderInboxRows([
+ {
+ ref: { platform: 'bitbucket', workspace: 'acme', repoSlug: 'api', prId: 42 },
+ title: 'Bitbucket PR',
+ author: null,
+ state: 'open',
+ draft: false,
+ updatedAt: '2026-01-01T00:00:00Z',
+ },
+]);
+
+describe('inbox rows', () => {
+ it('carries the full ref and the provider draft flag', () => {
+ expect(gitlabRows[0]).toMatchObject({
+ ref: { platform: 'gitlab', projectPath: 'group/sub/repo', mrIid: 12 },
+ title: 'GitLab MR',
+ isDraft: true,
+ });
+ expect(githubRows[0]).toMatchObject({
+ ref: { platform: 'github', owner: 'octocat', repo: 'hello', number: 7 },
+ isDraft: false,
+ });
+ });
+
+ it('keys same-named repositories on different providers apart', () => {
+ const github = toGitHubInboxRows([
+ { owner: 'group', repo: 'repo', number: 5, title: 't', isDraft: false, updatedAt: '' },
+ ]);
+ const gitlab = toProviderInboxRows([
+ {
+ ref: { platform: 'gitlab', projectPath: 'group/repo', mrIid: 5 },
+ title: 't',
+ author: null,
+ state: 'open',
+ draft: false,
+ updatedAt: '',
+ },
+ ]);
+ expect(github[0]?.key).not.toBe(gitlab[0]?.key);
+ });
+});
+
+describe('mergeProviderInboxSources', () => {
+ it('merges every enabled provider newest-first', () => {
+ const merged = mergeProviderInboxSources([
+ source({ platform: 'github', rows: githubRows }),
+ source({ platform: 'gitlab', rows: gitlabRows }),
+ source({ platform: 'bitbucket', rows: bitbucketRows }),
+ ]);
+ expect(merged.items.map(row => row.title)).toEqual(['GitLab MR', 'GitHub PR', 'Bitbucket PR']);
+ });
+
+ it('sorts without the ES2023 copy-returning methods Hermes lacks', () => {
+ // The device runtime is Hermes: Array.prototype.{toSorted,toReversed,
+ // toSpliced,with} do not exist there, so the merge must go through the
+ // mutating API. Deleting them in Node reproduces the device crash the
+ // inbox shipped with (e12: `undefined is not a function` on `.toSorted`).
+ const methods = ['toSorted', 'toReversed', 'toSpliced', 'with'];
+ const restored = methods.map(
+ method => [method, Object.getOwnPropertyDescriptor(Array.prototype, method)] as const
+ );
+ for (const method of methods) {
+ // oxlint-disable-next-line typescript-eslint/no-dynamic-delete -- the test deletes the ES2023 built-ins to reproduce the Hermes runtime, then restores them below
+ delete (Array.prototype as unknown as Record)[method];
+ }
+ try {
+ const merged = mergeProviderInboxSources([
+ source({ platform: 'github', rows: githubRows }),
+ source({ platform: 'gitlab', rows: gitlabRows }),
+ ]);
+ expect(merged.items.map(row => row.title)).toEqual(['GitLab MR', 'GitHub PR']);
+ } finally {
+ for (const [method, descriptor] of restored) {
+ if (descriptor) {
+ // oxlint-disable-next-line no-extend-native -- restores exactly the built-ins deleted above, so later tests keep the real Array prototype
+ Object.defineProperty(Array.prototype, method, descriptor);
+ }
+ }
+ }
+ });
+
+ it('ignores a provider the user has not connected', () => {
+ const merged = mergeProviderInboxSources([
+ source({ platform: 'github', rows: githubRows }),
+ source({ platform: 'gitlab', rows: gitlabRows, enabled: false }),
+ ]);
+ expect(merged.items.map(row => row.title)).toEqual(['GitHub PR']);
+ });
+
+ it('stays pending while any enabled provider still owes its first page', () => {
+ const pending = source({ isPending: true, hasLoadedPages: false });
+ expect(mergeProviderInboxSources([pending, { ...pending, platform: 'gitlab' }]).isPending).toBe(
+ true
+ );
+ // The GitLab REST inbox answers empty while GitHub's GraphQL one is still
+ // in flight: reporting "settled" here would render "No review requests"
+ // and then replace it with GitHub's rows.
+ expect(
+ mergeProviderInboxSources([
+ source({ platform: 'github', isPending: true, hasLoadedPages: false }),
+ source({ platform: 'gitlab', isPending: false, rows: [] }),
+ ]).isPending
+ ).toBe(true);
+ });
+
+ it('never sends a list that already has rows back to the skeletons', () => {
+ // A provider whose connection status resolves late becomes enabled (and
+ // pending) after another provider has already painted rows.
+ const merged = mergeProviderInboxSources([
+ source({ platform: 'github', rows: githubRows }),
+ source({ platform: 'gitlab', isPending: true, hasLoadedPages: false }),
+ ]);
+ expect(merged.isPending).toBe(false);
+ expect(merged.items.map(row => row.title)).toEqual(['GitHub PR']);
+ });
+
+ it('settles to empty only once every enabled provider has answered', () => {
+ expect(
+ mergeProviderInboxSources([
+ source({ platform: 'github', rows: [] }),
+ source({ platform: 'gitlab', rows: [] }),
+ ]).isPending
+ ).toBe(false);
+ });
+
+ it('is empty, not pending, when no provider is enabled', () => {
+ const merged = mergeProviderInboxSources([source({ enabled: false })]);
+ expect(merged.items).toEqual([]);
+ expect(merged.isPending).toBe(false);
+ expect(merged.firstPageErrorState).toBeNull();
+ });
+
+ it('blanks the list only when every enabled provider failed its first page', () => {
+ const error = new Error('boom');
+ const merged = mergeProviderInboxSources([
+ source({ platform: 'github', error, hasLoadedPages: false }),
+ source({ platform: 'gitlab', error, hasLoadedPages: false }),
+ ]);
+ expect(merged.firstPageErrorState).toEqual(classifyPrReviewQueryState(error));
+ expect(merged.laterPageError).toBe(false);
+ });
+
+ it('keeps a working provider visible when another one fails', () => {
+ const merged = mergeProviderInboxSources([
+ source({ platform: 'github', rows: githubRows }),
+ source({ platform: 'gitlab', error: new Error('gitlab down'), hasLoadedPages: false }),
+ ]);
+ expect(merged.firstPageErrorState).toBeNull();
+ expect(merged.items.map(row => row.title)).toEqual(['GitHub PR']);
+ expect(merged.laterPageError).toBe(true);
+ });
+
+ it('reports a later-page failure without blanking the loaded rows', () => {
+ const merged = mergeProviderInboxSources([
+ source({
+ platform: 'github',
+ rows: githubRows,
+ error: new Error('page 2'),
+ hasLoadedPages: true,
+ }),
+ ]);
+ expect(merged.firstPageErrorState).toBeNull();
+ expect(merged.laterPageError).toBe(true);
+ expect(merged.items).toHaveLength(1);
+ });
+
+ it('has a next page while any provider still has one', () => {
+ expect(
+ mergeProviderInboxSources([
+ source({ platform: 'github' }),
+ source({ platform: 'gitlab', hasNextPage: true }),
+ ]).hasNextPage
+ ).toBe(true);
+ });
+});
+
+describe('per-provider pagination inputs', () => {
+ it('sends no organization for a personal GitLab inbox and caps at 20 pages', () => {
+ const { trpc } = makeTrpc();
+ const options = loose(
+ buildGitLabInboxQueryOptions(trpc, { enabled: true, organizationId: null })
+ );
+ expect(options.input).toEqual({ platform: 'gitlab' });
+ expect(options.enabled).toBe(true);
+ expect(options.maxPages).toBe(20);
+ expect(options.getNextPageParam({ nextCursor: 'gl-2' })).toBe('gl-2');
+ expect(options.getNextPageParam({ nextCursor: null })).toBeUndefined();
+ });
+
+ it('sends the selected organization for an org GitLab inbox', () => {
+ const { trpc } = makeTrpc();
+ expect(
+ loose(buildGitLabInboxQueryOptions(trpc, { enabled: true, organizationId: 'org-1' })).input
+ ).toEqual({ platform: 'gitlab', organizationId: 'org-1' });
+ });
+
+ it('never queries Bitbucket without an organization', () => {
+ const { trpc } = makeTrpc();
+ expect(
+ loose(buildBitbucketInboxQueryOptions(trpc, { enabled: true, organizationId: null })).enabled
+ ).toBe(false);
+ const ready = loose(
+ buildBitbucketInboxQueryOptions(trpc, { enabled: true, organizationId: 'org-1' })
+ );
+ expect(ready.enabled).toBe(true);
+ expect(ready.input).toEqual({ platform: 'bitbucket', organizationId: 'org-1' });
+ });
+
+ it('keeps each provider on its own cursor', () => {
+ const { trpc, infiniteQueryOptions } = makeTrpc();
+ buildGitLabInboxQueryOptions(trpc, { enabled: true, organizationId: null });
+ buildBitbucketInboxQueryOptions(trpc, { enabled: true, organizationId: 'org-1' });
+ const inputs = infiniteQueryOptions.mock.calls.map(call => call[0]);
+ expect(inputs).toEqual([
+ { platform: 'gitlab' },
+ { platform: 'bitbucket', organizationId: 'org-1' },
+ ]);
+ });
+});
+
+describe('inboxRetryAction', () => {
+ it('leaves a healthy provider alone so its loaded pages are not re-fetched', () => {
+ expect(inboxRetryAction(source({ rows: githubRows }))).toBe('none');
+ });
+
+ it("advances the failing provider's own cursor when a LATER page failed", () => {
+ expect(inboxRetryAction(source({ error: new Error('page 2'), hasLoadedPages: true }))).toBe(
+ 'fetch-next-page'
+ );
+ });
+
+ it('refetches the first page when the FIRST page failed', () => {
+ // react-query reports `hasNextPage: false` while `data` is undefined, so
+ // there is no cursor to advance — `fetchNextPage` would be a dead button.
+ expect(inboxRetryAction(source({ error: new Error('boom'), hasLoadedPages: false }))).toBe(
+ 'refetch'
+ );
+ });
+
+ it('never touches a provider the user has not connected', () => {
+ expect(
+ inboxRetryAction(source({ enabled: false, error: new Error('boom'), hasLoadedPages: false }))
+ ).toBe('none');
+ });
+
+ it('does not stack a second call on an in-flight page', () => {
+ expect(
+ inboxRetryAction(
+ source({ error: new Error('page 2'), hasLoadedPages: true, isFetchingNextPage: true })
+ )
+ ).toBe('none');
+ });
+});
diff --git a/apps/mobile/src/lib/pr-review/use-provider-inbox.ts b/apps/mobile/src/lib/pr-review/use-provider-inbox.ts
new file mode 100644
index 0000000000..1fd3b853c8
--- /dev/null
+++ b/apps/mobile/src/lib/pr-review/use-provider-inbox.ts
@@ -0,0 +1,337 @@
+// The provider-aware review inbox: one list, three providers.
+//
+// Each provider paginates on its own cursor and its own identity — GitHub
+// through `githubPrReview.listInbox` exactly as before this slice, GitLab and
+// Bitbucket through `providerReview.listInbox`. The cursors are never merged:
+// `fetchNextPage` advances every source that still has a page, each with the
+// cursor its own provider handed back, and a source that has run out simply
+// stops contributing rows.
+//
+// A provider the user has not connected is never queried: the GitLab and
+// Bitbucket sources stay disabled until their connection status says so, so
+// a GitHub-only user sees no provider errors at all.
+//
+// `mergeProviderInboxSources` is pure so the merge, the sort and the
+// partial-failure rules are testable without mounting the hook.
+
+import { type ProviderPrInboxItem } from '@kilocode/app-shared/provider-review';
+import { useInfiniteQuery } from '@tanstack/react-query';
+import { useCallback, useMemo } from 'react';
+
+import { PERSONAL_SCOPE } from '@/lib/code-reviewer-config';
+import { useBitbucketReadiness, useGitLabStatus } from '@/lib/hooks/use-code-reviewer';
+import { useOrganization } from '@/lib/organization-context';
+import { classifyPrReviewQueryState } from '@/lib/pr-review/classify-pr-review-query-state';
+import {
+ githubPrRef,
+ type ProviderPrPlatform,
+ type ProviderPrRef,
+ providerPrRefKey,
+} from '@/lib/pr-review/provider-pr-ref';
+import { usePrInbox } from '@/lib/pr-review/use-pr-inbox';
+import { useTRPC } from '@/lib/trpc';
+import { parseTimestamp } from '@/lib/utils';
+
+// Same ceiling as the GitHub inbox: a pathological inbox cannot walk one
+// provider's cursor forever.
+const INBOX_MAX_PAGES = 20;
+
+/** One inbox page as a provider read layer returns it. */
+type ProviderInboxPage = { items: ProviderPrInboxItem[]; nextCursor: string | null };
+
+const nextProviderCursor = (lastPage: ProviderInboxPage) => lastPage.nextCursor ?? undefined;
+
+/** One inbox row, always carrying the ref the list navigates with. */
+export type ProviderInboxRow = {
+ readonly ref: ProviderPrRef;
+ /** Collision-free across providers and GitLab instances (s1 key). */
+ readonly key: string;
+ readonly title: string;
+ readonly isDraft: boolean;
+ readonly updatedAt: string;
+};
+
+/** What one provider's infinite query contributes to the merged list. */
+export type ProviderInboxSource = {
+ readonly platform: ProviderPrPlatform;
+ readonly enabled: boolean;
+ readonly rows: readonly ProviderInboxRow[];
+ readonly isPending: boolean;
+ readonly hasLoadedPages: boolean;
+ readonly error: unknown;
+ readonly hasNextPage: boolean;
+ readonly isFetchingNextPage: boolean;
+};
+
+export type MergedProviderInbox = {
+ readonly items: readonly ProviderInboxRow[];
+ readonly isPending: boolean;
+ /** Set only when EVERY enabled provider failed its first page. */
+ readonly firstPageErrorState: ReturnType | null;
+ /** A later page failed, or one provider failed while another loaded. */
+ readonly laterPageError: boolean;
+ readonly hasNextPage: boolean;
+ readonly isFetchingNextPage: boolean;
+};
+
+function toRow(ref: ProviderPrRef, item: { title: string; isDraft: boolean; updatedAt: string }) {
+ return {
+ ref,
+ key: providerPrRefKey(ref),
+ title: item.title,
+ isDraft: item.isDraft,
+ updatedAt: item.updatedAt,
+ };
+}
+
+type GitHubInboxItem = {
+ owner: string;
+ repo: string;
+ number: number;
+ title: string;
+ isDraft: boolean;
+ updatedAt: string;
+};
+
+export function toGitHubInboxRows(items: readonly GitHubInboxItem[]): ProviderInboxRow[] {
+ return items.map(item => toRow(githubPrRef(item.owner, item.repo, item.number), item));
+}
+
+export function toProviderInboxRows(items: readonly ProviderPrInboxItem[]): ProviderInboxRow[] {
+ return items.map(item =>
+ toRow(item.ref, { title: item.title, isDraft: item.draft, updatedAt: item.updatedAt })
+ );
+}
+
+function providerPageItems(pages: readonly ProviderInboxPage[] | undefined): ProviderPrInboxItem[] {
+ return (pages ?? []).flatMap(page => page.items);
+}
+
+function updatedAtMs(row: ProviderInboxRow): number {
+ const parsed = parseTimestamp(row.updatedAt).getTime();
+ return Number.isNaN(parsed) ? 0 : parsed;
+}
+
+/**
+ * Merge the per-provider results into one list.
+ *
+ * A first-page failure blanks the list ONLY when every enabled provider
+ * failed — otherwise the providers that answered still render and the
+ * failure degrades to the inline "couldn't load more" retry, because
+ * hiding a working GitHub inbox behind a GitLab outage is worse than
+ * showing a partial list.
+ *
+ * `isPending` is "no rows yet AND someone is still fetching", not "every
+ * provider is pending": GitLab's REST inbox routinely answers before
+ * GitHub's GraphQL one, and an AND would have declared the merged inbox
+ * settled while GitHub still had every row, flashing the "No review
+ * requests" empty state and then replacing it with rows. The `items`
+ * guard is what keeps the rule from swinging the other way — once any
+ * provider has contributed a row, a provider that only just became
+ * enabled (its connection status resolves on its own clock) cannot send a
+ * rendered list back to skeletons.
+ */
+export function mergeProviderInboxSources(
+ sources: readonly ProviderInboxSource[]
+): MergedProviderInbox {
+ const active = sources.filter(source => source.enabled);
+ const items = active
+ .flatMap(source => source.rows)
+ // eslint-disable-next-line unicorn/no-array-sort -- Hermes does not implement Array.prototype.toSorted; flatMap already copies so nothing shared is mutated
+ .sort((left, right) => updatedAtMs(right) - updatedAtMs(left));
+ const failed = active.filter(source => source.error !== null && source.error !== undefined);
+ const firstPageFailures = failed.filter(source => !source.hasLoadedPages);
+ const allFailed = active.length > 0 && firstPageFailures.length === active.length;
+ const firstError = firstPageFailures[0]?.error;
+ return {
+ items,
+ isPending: items.length === 0 && active.some(source => source.isPending),
+ firstPageErrorState: allFailed && firstError ? classifyPrReviewQueryState(firstError) : null,
+ laterPageError: !allFailed && failed.length > 0,
+ hasNextPage: active.some(source => source.hasNextPage),
+ isFetchingNextPage: active.some(source => source.isFetchingNextPage),
+ };
+}
+
+/**
+ * What a "couldn't load more" retry must do for ONE provider.
+ *
+ * A provider that failed its FIRST page has no cursor to advance —
+ * react-query reports `hasNextPage: false` while `data` is undefined — so
+ * `fetchNextPage` would be a dead button there; it is retried with `refetch`,
+ * which fetches page one. A provider that failed a LATER page advances its
+ * own cursor. A provider that answered is left alone, so retrying one
+ * provider's failure never re-fetches another's loaded pages.
+ */
+type InboxRetryAction = 'none' | 'refetch' | 'fetch-next-page';
+
+export function inboxRetryAction(
+ source: Pick
+): InboxRetryAction {
+ if (!source.enabled || source.isFetchingNextPage) {
+ return 'none';
+ }
+ if (source.error === null || source.error === undefined) {
+ return 'none';
+ }
+ return source.hasLoadedPages ? 'fetch-next-page' : 'refetch';
+}
+
+/** The two calls `inboxRetryAction` chooses between, for one query. */
+type RetryableQuery = {
+ refetch: () => void;
+ fetchNextPage: () => void;
+};
+
+function runInboxRetry(source: ProviderInboxSource, query: RetryableQuery): void {
+ const action = inboxRetryAction(source);
+ if (action === 'refetch') {
+ query.refetch();
+ } else if (action === 'fetch-next-page') {
+ query.fetchNextPage();
+ }
+}
+
+type Trpc = ReturnType;
+
+/** GitLab's inbox input: the personal scope sends no organization. */
+export function buildGitLabInboxQueryOptions(
+ trpc: Trpc,
+ args: { enabled: boolean; organizationId: string | null }
+) {
+ return trpc.providerReview.listInbox.infiniteQueryOptions(
+ { platform: 'gitlab', ...(args.organizationId ? { organizationId: args.organizationId } : {}) },
+ {
+ enabled: args.enabled,
+ staleTime: 30_000,
+ getNextPageParam: nextProviderCursor,
+ maxPages: INBOX_MAX_PAGES,
+ }
+ );
+}
+
+/** Bitbucket Cloud is organization-only, so no organization means no query. */
+export function buildBitbucketInboxQueryOptions(
+ trpc: Trpc,
+ args: { enabled: boolean; organizationId: string | null }
+) {
+ return trpc.providerReview.listInbox.infiniteQueryOptions(
+ { platform: 'bitbucket', organizationId: args.organizationId ?? '' },
+ {
+ enabled: args.enabled && args.organizationId !== null,
+ staleTime: 30_000,
+ getNextPageParam: nextProviderCursor,
+ maxPages: INBOX_MAX_PAGES,
+ }
+ );
+}
+
+/**
+ * The merged inbox. GitHub keeps `usePrInbox` untouched; the two provider
+ * sources are gated on their connection status so an unconnected provider
+ * is never called.
+ */
+export function useProviderInbox(enabled: boolean) {
+ const trpc = useTRPC();
+ const { organizationId } = useOrganization();
+ const scope = organizationId ?? PERSONAL_SCOPE;
+ const gitlabStatus = useGitLabStatus(scope);
+ const bitbucketReadiness = useBitbucketReadiness(scope);
+
+ const github = usePrInbox(enabled);
+ const gitlabEnabled = enabled && gitlabStatus.data?.connected === true;
+ const bitbucketEnabled = enabled && bitbucketReadiness.data?.connected === true;
+ const gitlab = useInfiniteQuery(
+ buildGitLabInboxQueryOptions(trpc, { enabled: gitlabEnabled, organizationId })
+ );
+ const bitbucket = useInfiniteQuery(
+ buildBitbucketInboxQueryOptions(trpc, { enabled: bitbucketEnabled, organizationId })
+ );
+
+ const githubRows = useMemo(() => toGitHubInboxRows(github.items), [github.items]);
+ const gitlabPages = gitlab.data?.pages;
+ const gitlabRows = useMemo(
+ () => toProviderInboxRows(providerPageItems(gitlabPages)),
+ [gitlabPages]
+ );
+ const bitbucketPages = bitbucket.data?.pages;
+ const bitbucketRows = useMemo(
+ () => toProviderInboxRows(providerPageItems(bitbucketPages)),
+ [bitbucketPages]
+ );
+
+ const githubSource: ProviderInboxSource = {
+ platform: 'github',
+ enabled,
+ rows: githubRows,
+ isPending: github.query.isPending,
+ hasLoadedPages: (github.query.data?.pages.length ?? 0) > 0,
+ error: github.query.error,
+ hasNextPage: github.query.hasNextPage,
+ isFetchingNextPage: github.query.isFetchingNextPage,
+ };
+ const gitlabSource: ProviderInboxSource = {
+ platform: 'gitlab',
+ enabled: gitlabEnabled,
+ rows: gitlabRows,
+ isPending: gitlab.isPending,
+ hasLoadedPages: (gitlabPages?.length ?? 0) > 0,
+ error: gitlab.error,
+ hasNextPage: gitlab.hasNextPage,
+ isFetchingNextPage: gitlab.isFetchingNextPage,
+ };
+ const bitbucketSource: ProviderInboxSource = {
+ platform: 'bitbucket',
+ enabled: bitbucketEnabled,
+ rows: bitbucketRows,
+ isPending: bitbucket.isPending,
+ hasLoadedPages: (bitbucketPages?.length ?? 0) > 0,
+ error: bitbucket.error,
+ hasNextPage: bitbucket.hasNextPage,
+ isFetchingNextPage: bitbucket.isFetchingNextPage,
+ };
+ const merged = mergeProviderInboxSources([githubSource, gitlabSource, bitbucketSource]);
+
+ // Every source advances on ITS OWN cursor; nothing is shared or merged.
+ const fetchNextPage = useCallback(() => {
+ if (github.query.hasNextPage && !github.query.isFetchingNextPage) {
+ void github.query.fetchNextPage();
+ }
+ if (gitlabEnabled && gitlab.hasNextPage && !gitlab.isFetchingNextPage) {
+ void gitlab.fetchNextPage();
+ }
+ if (bitbucketEnabled && bitbucket.hasNextPage && !bitbucket.isFetchingNextPage) {
+ void bitbucket.fetchNextPage();
+ }
+ }, [github.query, gitlab, bitbucket, gitlabEnabled, bitbucketEnabled]);
+
+ const refetch = useCallback(() => {
+ void github.query.refetch();
+ if (gitlabEnabled) {
+ void gitlab.refetch();
+ }
+ if (bitbucketEnabled) {
+ void bitbucket.refetch();
+ }
+ }, [github.query, gitlab, bitbucket, gitlabEnabled, bitbucketEnabled]);
+
+ // The "couldn't load more" retry: it must load the page that FAILED, not
+ // re-run the whole inbox. Each failed provider gets exactly the call its
+ // own state needs; every healthy provider keeps its loaded pages.
+ // Not memoized on purpose: it reads the per-render source objects above, so
+ // a memo keyed on the query results would fire the previous render's
+ // decision whenever only an `enabled` flag moved.
+ const retryFailedPages = () => {
+ runInboxRetry(githubSource, github.query);
+ runInboxRetry(gitlabSource, gitlab);
+ runInboxRetry(bitbucketSource, bitbucket);
+ };
+
+ return {
+ ...merged,
+ isFetching: github.query.isFetching || gitlab.isFetching || bitbucket.isFetching,
+ fetchNextPage,
+ retryFailedPages,
+ refetch,
+ };
+}
diff --git a/apps/mobile/src/lib/pr-review/viewed-files.test.ts b/apps/mobile/src/lib/pr-review/viewed-files.test.ts
index cdc7d6d3bf..d20074ff17 100644
--- a/apps/mobile/src/lib/pr-review/viewed-files.test.ts
+++ b/apps/mobile/src/lib/pr-review/viewed-files.test.ts
@@ -171,6 +171,71 @@ describe('viewed-files', () => {
expect(getItemMock.mock.calls.length).toBe(callsBefore);
});
+ // s6 (identity rule 17): a provider ref folds the s1 collision-free key
+ // into the storage key, while the legacy GitHub bytes never change.
+ describe('provider refs', () => {
+ const GITLAB_A = {
+ platform: 'gitlab' as const,
+ projectPath: 'group/app',
+ mrIid: 7,
+ instanceHint: 'https://gitlab.example.com',
+ };
+ const GITLAB_B = {
+ platform: 'gitlab' as const,
+ projectPath: 'group/app',
+ mrIid: 7,
+ instanceHint: 'https://gitlab.com',
+ };
+
+ it('keeps a github ProviderPrRef byte-identical to the legacy triple (migration)', async () => {
+ setStored({ 'octocat/hello-world#42': { headSha: SHA1, viewedPaths: ['a.ts'] } });
+ await expect(
+ getViewedFiles(
+ { platform: 'github', owner: 'octocat', repo: 'hello-world', number: 42 },
+ SHA1
+ )
+ ).resolves.toEqual(['a.ts']);
+
+ await toggleViewedFile({
+ platform: 'github',
+ owner: 'octocat',
+ repo: 'hello-world',
+ number: 42,
+ headSha: SHA1,
+ path: 'b.ts',
+ });
+ // The write landed on the SAME legacy key, not a suffixed one.
+ const written: Record = JSON.parse(store.get('pr-review-viewed') ?? '{}');
+ expect(Object.keys(written)).toEqual(['octocat/hello-world#42']);
+ });
+
+ it('separates one GitLab project on two instances', async () => {
+ await toggleViewedFile({ ...GITLAB_A, headSha: SHA1, path: 'a.ts' });
+ await expect(getViewedFiles(GITLAB_A, SHA1)).resolves.toEqual(['a.ts']);
+ await expect(getViewedFiles(GITLAB_B, SHA1)).resolves.toEqual([]);
+ });
+
+ it('separates a GitLab MR from a same-triple GitHub PR', async () => {
+ await toggleViewedFile({ ...GITLAB_A, headSha: SHA1, path: 'a.ts' });
+ await expect(
+ getViewedFiles({ owner: 'group', repo: 'app', number: 7 }, SHA1)
+ ).resolves.toEqual([]);
+ });
+
+ it('separates same-numbered Bitbucket PRs across workspaces', async () => {
+ const one = { platform: 'bitbucket' as const, workspace: 'acme', repoSlug: 'app', prId: 7 };
+ const other = {
+ platform: 'bitbucket' as const,
+ workspace: 'other',
+ repoSlug: 'app',
+ prId: 7,
+ };
+ await toggleViewedFile({ ...one, headSha: SHA1, path: 'a.ts' });
+ await expect(getViewedFiles(one, SHA1)).resolves.toEqual(['a.ts']);
+ await expect(getViewedFiles(other, SHA1)).resolves.toEqual([]);
+ });
+ });
+
it('a concurrent read during clear never returns the prior paths', async () => {
setStored({ 'octocat/hello-world#42': { headSha: SHA1, viewedPaths: ['a.ts'] } });
await expect(getViewedFiles(REF, SHA1)).resolves.toEqual(['a.ts']);
diff --git a/apps/mobile/src/lib/pr-review/viewed-files.ts b/apps/mobile/src/lib/pr-review/viewed-files.ts
index 01a1143455..c2a7575dd6 100644
--- a/apps/mobile/src/lib/pr-review/viewed-files.ts
+++ b/apps/mobile/src/lib/pr-review/viewed-files.ts
@@ -1,7 +1,10 @@
import * as SecureStore from 'expo-secure-store';
import { z } from 'zod';
+import { type ProviderPrRef, providerPrRefKey } from '@kilocode/app-shared/provider-review';
+
import { deleteAccountMetadata, writeAccountMetadata } from '@/lib/auth/account-metadata-write';
+import { providerPrTriple } from '@/lib/pr-review/provider-pr-ref';
import { PR_REVIEW_VIEWED_KEY } from '@/lib/storage-keys';
type ViewedFileEntry = {
@@ -37,7 +40,25 @@ type ViewedFilePrRef = {
number: number;
};
-function viewedFilesKey(ref: ViewedFilePrRef): string {
+/**
+ * A viewed-files identity: the legacy GitHub triple or any provider ref
+ * (s6). The GitHub bytes never change — a set stored before the provider
+ * surface keeps loading — and a provider ref folds the s1 collision-free
+ * `providerPrRefKey` into the key, so one GitLab project on two instances,
+ * or a GitLab MR and a same-numbered GitHub PR, can never share a set
+ * (identity rule 17).
+ */
+export type ViewedFilesRef = ProviderPrRef | ViewedFilePrRef;
+
+function viewedFilesKey(ref: ViewedFilesRef): string {
+ if ('platform' in ref) {
+ const triple = providerPrTriple(ref);
+ const legacy = `${triple.owner.toLowerCase()}/${triple.repo.toLowerCase()}#${triple.number}`;
+ if (ref.platform === 'github') {
+ return legacy;
+ }
+ return `${legacy}@${providerPrRefKey(ref)}`;
+ }
return `${ref.owner.toLowerCase()}/${ref.repo.toLowerCase()}#${ref.number}`;
}
@@ -102,7 +123,7 @@ async function readMap(): Promise {
return parsed;
}
-export async function getViewedFiles(ref: ViewedFilePrRef, headSha: string): Promise {
+export async function getViewedFiles(ref: ViewedFilesRef, headSha: string): Promise {
const map = await readMap();
const entry = map[viewedFilesKey(ref)];
if (!entry || entry.headSha !== headSha) {
@@ -118,7 +139,7 @@ export async function getViewedFiles(ref: ViewedFilePrRef, headSha: string): Pro
* almost certainly stale and shouldn't be re-marked). The map itself is
* LRU-trimmed to VIEWED_FILES_PR_LIMIT PRs by most-recently-touched.
*/
-type ToggleViewedFileInput = ViewedFilePrRef & {
+type ToggleViewedFileInput = ViewedFilesRef & {
headSha: string;
path: string;
};
diff --git a/apps/mobile/src/lib/route-registry.ts b/apps/mobile/src/lib/route-registry.ts
index 0223dea6d3..f77054d0a1 100644
--- a/apps/mobile/src/lib/route-registry.ts
+++ b/apps/mobile/src/lib/route-registry.ts
@@ -11,6 +11,7 @@ import { useEffect } from 'react';
import { type DiffSelection } from './pr-review/diff-selection-bridge';
import {
+ type BranchPickerBridge,
type FolderPickerBridge,
type InstancePickerBridge,
type ModelPickerBridge,
@@ -47,6 +48,7 @@ type SlotValue = {
modelPicker: ModelPickerBridge;
modePicker: ModePickerBridge;
repoPicker: RepoPickerBridge;
+ branchPicker: BranchPickerBridge;
instancePicker: InstancePickerBridge;
folderPicker: FolderPickerBridge;
prFileNav: Set;
@@ -62,6 +64,7 @@ const slots: RegistrySlots = {
modelPicker: new Map(),
modePicker: new Map(),
repoPicker: new Map(),
+ branchPicker: new Map(),
instancePicker: new Map(),
folderPicker: new Map(),
prFileNav: new Map>(),
@@ -73,6 +76,7 @@ const ALL_SLOT_KINDS: readonly SlotKind[] = [
'modelPicker',
'modePicker',
'repoPicker',
+ 'branchPicker',
'instancePicker',
'folderPicker',
'prFileNav',
@@ -106,6 +110,7 @@ function createSlot(kind: K): RouteSlot {
export const modelPickerSlot = createSlot('modelPicker');
export const modePickerSlot = createSlot('modePicker');
export const repoPickerSlot = createSlot('repoPicker');
+export const branchPickerSlot = createSlot('branchPicker');
export const instancePickerSlot = createSlot('instancePicker');
export const folderPickerSlot = createSlot('folderPicker');
export const prFileNavSlot = createSlot('prFileNav');
diff --git a/apps/mobile/src/lib/session-pr-navigation.test.ts b/apps/mobile/src/lib/session-pr-navigation.test.ts
index 1ac535b0c1..81576edb1e 100644
--- a/apps/mobile/src/lib/session-pr-navigation.test.ts
+++ b/apps/mobile/src/lib/session-pr-navigation.test.ts
@@ -3,53 +3,48 @@ import { describe, expect, it } from 'vitest';
import { resolveSessionPrTapTarget } from './session-pr-navigation';
describe('resolveSessionPrTapTarget', () => {
- it('routes a GitHub PR in-app', () => {
+ it('routes a GitHub PR in-app to the GitHub route', () => {
expect(
resolveSessionPrTapTarget({
url: 'https://github.com/octocat/hello-world/pull/42',
- number: 42,
})
).toEqual({ kind: 'in-app', href: '/(app)/pr-review/octocat/hello-world/42' });
});
- it('routes a parseable github.com URL in-app', () => {
+ it('routes a gitlab.com merge request in-app to the provider route with its instance', () => {
expect(
resolveSessionPrTapTarget({
- url: 'https://github.com/octocat/hello-world/pull/7',
- number: 7,
+ url: 'https://gitlab.com/octocat/hello-world/-/merge_requests/42',
})
- ).toEqual({ kind: 'in-app', href: '/(app)/pr-review/octocat/hello-world/7' });
+ ).toEqual({
+ kind: 'in-app',
+ href: '/(app)/pr-review/gitlab/octocat/hello-world/42?instance=https%3A%2F%2Fgitlab.com',
+ });
});
- it('opens the browser for a GitLab PR URL', () => {
+ it('routes a self-managed GitLab merge request in-app, keeping the pasted origin', () => {
expect(
resolveSessionPrTapTarget({
- url: 'https://gitlab.com/octocat/hello-world/-/merge_requests/42',
- number: 42,
+ url: 'https://gitlab.example.com/team/repo/-/merge_requests/7',
})
).toEqual({
- kind: 'browser',
- url: 'https://gitlab.com/octocat/hello-world/-/merge_requests/42',
+ kind: 'in-app',
+ href: '/(app)/pr-review/gitlab/team/repo/7?instance=https%3A%2F%2Fgitlab.example.com',
});
});
- it('opens the browser for a Bitbucket PR URL', () => {
+ it('routes a Bitbucket pull request in-app to the provider route', () => {
expect(
resolveSessionPrTapTarget({
- url: 'https://bitbucket.org/octocat/hello-world/pull-requests/42',
- number: 42,
+ url: 'https://bitbucket.org/acme/api/pull-requests/42/overview',
})
- ).toEqual({
- kind: 'browser',
- url: 'https://bitbucket.org/octocat/hello-world/pull-requests/42',
- });
+ ).toEqual({ kind: 'in-app', href: '/(app)/pr-review/bitbucket/acme/api/42' });
});
- it('opens the browser for a GitHub Enterprise host', () => {
+ it('opens the browser for a GitHub Enterprise host — the GitHub App serves github.com only', () => {
expect(
resolveSessionPrTapTarget({
url: 'https://github.example.com/octocat/hello-world/pull/42',
- number: 42,
})
).toEqual({ kind: 'browser', url: 'https://github.example.com/octocat/hello-world/pull/42' });
});
@@ -58,7 +53,6 @@ describe('resolveSessionPrTapTarget', () => {
expect(
resolveSessionPrTapTarget({
url: 'not a url at all',
- number: 42,
})
).toEqual({ kind: 'browser', url: 'not a url at all' });
});
@@ -67,7 +61,6 @@ describe('resolveSessionPrTapTarget', () => {
expect(
resolveSessionPrTapTarget({
url: null,
- number: 42,
})
).toEqual({ kind: 'browser', url: '' });
});
diff --git a/apps/mobile/src/lib/session-pr-navigation.ts b/apps/mobile/src/lib/session-pr-navigation.ts
index 9bbe0ff15d..7e09b3315e 100644
--- a/apps/mobile/src/lib/session-pr-navigation.ts
+++ b/apps/mobile/src/lib/session-pr-navigation.ts
@@ -1,13 +1,11 @@
import { type Href } from 'expo-router';
-import { parseGitHubPrUrl } from '@/lib/github-pr-url';
-import { getPrReviewPath } from '@/lib/profile-agent-navigation';
+import { parseProviderPrUrl } from '@/lib/pr-review/provider-pr-url';
+import { providerPrRoutePath } from '@/lib/pr-review/provider-pr-ref';
export type SessionPrNavigationInput = Readonly<{
- /** PR HTML URL, e.g. `https://github.com/org/repo/pull/123`. */
+ /** PR/MR HTML URL, e.g. `https://github.com/org/repo/pull/123`. */
url: string | null | undefined;
- /** PR number. */
- number: number;
}>;
export type SessionPrNavigationResult =
@@ -17,18 +15,21 @@ export type SessionPrNavigationResult =
/**
* Decide where tapping a session's PR badge navigates.
*
- * GitHub PRs open the in-app review screen; everything else opens the browser.
- * The in-app route needs `owner` and `repo`, which only a parseable
- * `github.com` URL carries.
+ * A GitHub pull request, a GitLab merge request (gitlab.com or a
+ * self-managed host) and a Bitbucket pull request all open the in-app
+ * provider review route through the one URL resolver — the badge's own
+ * platform decides the route, so a GitLab MR never lands on a GitHub-shaped
+ * identity. Only a genuinely unparseable URL (GitHub Enterprise, a docs
+ * link, a bare number) falls back to the browser.
*/
export function resolveSessionPrTapTarget(
input: SessionPrNavigationInput
): SessionPrNavigationResult {
const url = input.url;
- const parsed = url ? parseGitHubPrUrl(url) : null;
+ const ref = url ? parseProviderPrUrl(url) : null;
- if (parsed) {
- return { kind: 'in-app', href: getPrReviewPath(parsed.owner, parsed.repo, input.number) };
+ if (ref) {
+ return { kind: 'in-app', href: providerPrRoutePath(ref) };
}
return { kind: 'browser', url: url ?? '' };
}
diff --git a/apps/mobile/src/lib/universal-link-paths.js b/apps/mobile/src/lib/universal-link-paths.js
index 7ebf68c6c3..3cd5db6d1d 100644
--- a/apps/mobile/src/lib/universal-link-paths.js
+++ b/apps/mobile/src/lib/universal-link-paths.js
@@ -20,5 +20,7 @@ export const UNIVERSAL_LINK_PATH_PATTERNS = [
'/organizations/.*/code-reviews',
'/organizations/.*/code-reviews/.*',
'/organizations/.*/overview',
+ '/pr-review/gitlab/.*',
+ '/pr-review/bitbucket/.*',
'/pr-review/.*/.*/.*',
];
diff --git a/apps/mobile/src/lib/use-new-session-repos.test.ts b/apps/mobile/src/lib/use-new-session-repos.test.ts
index 91174ec326..b75014ce11 100644
--- a/apps/mobile/src/lib/use-new-session-repos.test.ts
+++ b/apps/mobile/src/lib/use-new-session-repos.test.ts
@@ -1,24 +1,61 @@
/* eslint-disable typescript-eslint/no-deprecated -- react-test-renderer is the DOM-free renderer used to mount React/RN trees under vitest (node env, no jsdom); see src/components/agents/use-new-session-creator.test.ts */
/* eslint-disable require-await, @typescript-eslint/require-await -- the fake query factories settle without await because they resolve immediately */
+/* eslint-disable max-lines -- one mock harness serves the force-fresh suite and the branch-query suite; splitting it would duplicate every tRPC and react-query fake */
import * as React from 'react';
import TestRenderer, { act } from 'react-test-renderer';
import { beforeEach, describe, expect, it, vi } from 'vitest';
-import { useNewSessionRepos } from './use-new-session-repos';
+import {
+ getSelectedBranchOverride,
+ type NewSessionRepository,
+ setNewSessionBranchScope,
+ setSelectedBranchOverride,
+} from '@/components/agents/new-session-repository-state';
+import { useNewSessionRepos, useRepositoryBranches } from './use-new-session-repos';
const mocks = vi.hoisted(() => ({
fetchQuery: vi.fn(async (_opts: unknown): Promise => ({})),
setQueryData: vi.fn(() => undefined),
toastError: vi.fn(),
refreshGitHubForceFresh: vi.fn(async () => undefined),
+ listBranches: vi.fn(
+ async (_input: unknown): Promise => ({
+ defaultBranch: 'main',
+ branches: ['main'],
+ })
+ ),
+ /** Every `useQuery` call in mount order, so a test can read the branch query's options. */
+ queryCalls: [] as { queryKey?: unknown[]; enabled?: boolean }[],
+ /** Result the branch query (the one with a `queryFn`) reports. */
+ branchQueryResult: emptyQueryResult(),
}));
+function emptyQueryResult(): Record {
+ return {};
+}
+
vi.mock('react-native', () => ({ Platform: { OS: 'ios' } }));
vi.mock('sonner-native', () => ({ toast: { error: mocks.toastError } }));
vi.mock('@tanstack/react-query', () => ({
- useQuery: () => ({ data: undefined, isLoading: false, isError: false, isRefetching: false }),
+ // Records every call so the branch query's key and `enabled` can be asserted.
+ // The provider queries have no `queryFn`; the branch query does, and only it
+ // reads `branchQueryResult`.
+ useQuery: (options: { queryKey?: unknown[]; enabled?: boolean; queryFn?: unknown }) => {
+ mocks.queryCalls.push(options);
+ const base = {
+ data: undefined,
+ isLoading: false,
+ isPending: false,
+ isError: false,
+ isFetching: false,
+ isRefetching: false,
+ error: null,
+ refetch: vi.fn(),
+ };
+ return options.queryFn ? { ...base, ...mocks.branchQueryResult } : base;
+ },
useQueryClient: () => ({ fetchQuery: mocks.fetchQuery, setQueryData: mocks.setQueryData }),
}));
@@ -51,6 +88,10 @@ vi.mock('@/lib/use-github-repos-refresh', () => ({
}));
vi.mock('@/lib/trpc', () => ({
+ trpcClient: {
+ cloudAgentNext: { listRepositoryBranches: { query: mocks.listBranches } },
+ organizations: { cloudAgentNext: { listRepositoryBranches: { query: mocks.listBranches } } },
+ },
useTRPC: () => ({
cloudAgentNext: {
listGitHubRepositories: {
@@ -63,6 +104,9 @@ vi.mock('@/lib/trpc', () => ({
}),
queryKey: ({ forceRefresh }: { forceRefresh: boolean }) => ['gitlab', forceRefresh],
},
+ listRepositoryBranches: {
+ queryKey: (input: unknown) => ['branches', input],
+ },
},
organizations: {
cloudAgentNext: {
@@ -82,6 +126,9 @@ vi.mock('@/lib/trpc', () => ({
}),
queryKey: ({ forceRefresh }: { forceRefresh: boolean }) => ['bitbucket', forceRefresh],
},
+ listRepositoryBranches: {
+ queryKey: (input: unknown) => ['org-branches', input],
+ },
},
},
}),
@@ -132,6 +179,8 @@ function mockFetchQuery(resultForBitbucket: unknown, gitlabAndGithub: unknown) {
beforeEach(() => {
vi.clearAllMocks();
mocks.fetchQuery.mockImplementation(async (_opts: unknown) => ({ repositories: [] }));
+ mocks.queryCalls.length = 0;
+ mocks.branchQueryResult = {};
});
describe('useNewSessionRepos force-fresh Bitbucket cache write', () => {
@@ -172,3 +221,174 @@ describe('useNewSessionRepos force-fresh Bitbucket cache write', () => {
expect(mocks.toastError).not.toHaveBeenCalled();
});
});
+
+// ── Branches of the selected repository ──────────────────────────────
+
+type BranchesResult = ReturnType;
+
+const githubRepo: NewSessionRepository = {
+ platform: 'github',
+ fullName: 'owner/repo',
+ isPrivate: false,
+};
+const bitbucketRepo: NewSessionRepository = {
+ platform: 'bitbucket',
+ fullName: 'team/repo',
+ isPrivate: true,
+ workspaceUuid: 'ws-1',
+ repositoryUuid: 'id-1',
+};
+
+function BranchHarness({
+ repository,
+ resultRef,
+}: {
+ repository: NewSessionRepository | null;
+ resultRef: { current: BranchesResult | null };
+}) {
+ resultRef.current = useRepositoryBranches(repository);
+ return null;
+}
+
+function mountBranches(repository: NewSessionRepository | null) {
+ const resultRef: { current: BranchesResult | null } = { current: null };
+ act(() => {
+ TestRenderer.create(React.createElement(BranchHarness, { repository, resultRef }));
+ });
+ const result = resultRef.current;
+ if (result === null) {
+ throw new Error('useRepositoryBranches did not run');
+ }
+ return result;
+}
+
+/** The recorded branch query — the only `useQuery` call that carries a `queryFn`. */
+function branchQueryOptions() {
+ const options = mocks.queryCalls.at(-1);
+ if (!options) {
+ throw new Error('no query was issued');
+ }
+ return options;
+}
+
+describe('useRepositoryBranches', () => {
+ it('does not query until a repository is selected', () => {
+ setNewSessionBranchScope(undefined);
+ const result = mountBranches(null);
+
+ expect(branchQueryOptions().enabled).toBe(false);
+ expect(result.isEnabled).toBe(false);
+ expect(result.isLoading).toBe(false);
+ });
+
+ it('queries the personal procedure for a selected repository', () => {
+ setNewSessionBranchScope(undefined);
+ const result = mountBranches(githubRepo);
+
+ expect(result.isEnabled).toBe(true);
+ expect(branchQueryOptions().enabled).toBe(true);
+ expect(branchQueryOptions().queryKey?.[0]).toBe('branches');
+ });
+
+ it('queries the organization procedure inside an organization', () => {
+ setNewSessionBranchScope('org-1');
+ mountBranches(githubRepo);
+
+ expect(branchQueryOptions().queryKey?.[0]).toBe('org-branches');
+ expect(branchQueryOptions().queryKey?.[1]).toMatchObject({
+ organizationId: 'org-1',
+ platform: 'github',
+ repository: { fullName: 'owner/repo' },
+ });
+ });
+
+ it('keys the cache by the full repository identity, uuids included', () => {
+ setNewSessionBranchScope('org-1');
+ mountBranches(bitbucketRepo);
+ const first = branchQueryOptions().queryKey;
+ mountBranches({ ...bitbucketRepo, workspaceUuid: 'ws-2', repositoryUuid: 'id-2' });
+ const second = branchQueryOptions().queryKey;
+
+ expect(first).not.toEqual(second);
+ });
+
+ it('never queries a personal Bitbucket repository (organizations only)', () => {
+ setNewSessionBranchScope(undefined);
+ const result = mountBranches(bitbucketRepo);
+
+ expect(result.isEnabled).toBe(false);
+ expect(branchQueryOptions().enabled).toBe(false);
+ });
+
+ it('waits for the route to publish the organization scope before querying', async () => {
+ // `undefined` is a real scope (a personal session), so "not published yet"
+ // has to be its own state — otherwise the first render would query the
+ // personal procedure for what is about to be an organization session.
+ vi.resetModules();
+ const fresh = await import('./use-new-session-repos');
+ const resultRef: { current: BranchesResult | null } = { current: null };
+ function FreshHarness() {
+ resultRef.current = fresh.useRepositoryBranches(githubRepo);
+ return null;
+ }
+ act(() => {
+ TestRenderer.create(React.createElement(FreshHarness));
+ });
+
+ expect(resultRef.current?.isEnabled).toBe(false);
+ expect(branchQueryOptions().enabled).toBe(false);
+ });
+
+ it('reports a transient failure as retryable', () => {
+ setNewSessionBranchScope(undefined);
+ mocks.branchQueryResult = {
+ isError: true,
+ error: { data: { code: 'BAD_GATEWAY' } },
+ };
+ const result = mountBranches(githubRepo);
+
+ expect(result.isRetryableError).toBe(true);
+ expect(result.isPermanentError).toBe(false);
+ });
+
+ it('reports a refusal a retry cannot fix as permanent', () => {
+ setNewSessionBranchScope(undefined);
+ mocks.branchQueryResult = { isError: true, error: { data: { code: 'FORBIDDEN' } } };
+ const result = mountBranches(githubRepo);
+
+ expect(result.isPermanentError).toBe(true);
+ expect(result.isRetryableError).toBe(false);
+ });
+
+ it('reports the provider default and an empty list without an override', () => {
+ setNewSessionBranchScope(undefined);
+ mocks.branchQueryResult = { data: { defaultBranch: null, branches: [] } };
+ const result = mountBranches(githubRepo);
+
+ expect(result.branches).toEqual([]);
+ expect(result.defaultBranch).toBeNull();
+ expect(getSelectedBranchOverride(githubRepo)).toBeNull();
+ });
+
+ it('fetches through the organization procedure when the query runs', async () => {
+ setNewSessionBranchScope('org-1');
+ mountBranches(githubRepo);
+ const queryFn = (branchQueryOptions() as { queryFn?: () => Promise }).queryFn;
+
+ await queryFn?.();
+
+ expect(mocks.listBranches).toHaveBeenCalledWith({
+ organizationId: 'org-1',
+ platform: 'github',
+ repository: { fullName: 'owner/repo' },
+ });
+ });
+});
+
+describe('branch overrides across a repository change', () => {
+ it('drops a branch chosen for another repository', () => {
+ setSelectedBranchOverride(githubRepo, 'release/2.0');
+ expect(getSelectedBranchOverride(githubRepo)).toBe('release/2.0');
+ expect(getSelectedBranchOverride({ ...githubRepo, platform: 'gitlab' })).toBeNull();
+ });
+});
diff --git a/apps/mobile/src/lib/use-new-session-repos.ts b/apps/mobile/src/lib/use-new-session-repos.ts
index a5e77c9eea..a173edbb67 100644
--- a/apps/mobile/src/lib/use-new-session-repos.ts
+++ b/apps/mobile/src/lib/use-new-session-repos.ts
@@ -1,5 +1,5 @@
/* eslint-disable max-lines -- One hook wires the GitHub, GitLab, and Bitbucket provider queries, recents resolution, and connect/refresh flows end-to-end. */
-import { useCallback, useMemo, useState } from 'react';
+import { useCallback, useEffect, useMemo, useState, useSyncExternalStore } from 'react';
import { Platform } from 'react-native';
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { toast } from 'sonner-native';
@@ -7,13 +7,17 @@ import { toast } from 'sonner-native';
import {
dedupeRepositoriesByPlatformAndFullName,
detectRepositoryPlatform,
+ getNewSessionBranchState,
type NewSessionRepository,
type RepositoryGroup,
type RepositoryGroups,
+ repositoryIdentityKey,
type RepositoryPlatform,
resolveBitbucketStatus,
resolveProviderStatus,
resolveRepositoryGroups,
+ setNewSessionBranchScope,
+ subscribeNewSessionBranchState,
} from '@/components/agents/new-session-repository-state';
import { formatGitUrlProject } from '@/components/agents/session-list-helpers';
import { i18n } from '@/i18n';
@@ -22,8 +26,9 @@ import { useRecentAgentRepositories } from '@/lib/hooks/use-agent-sessions';
import { getBitbucketIntegrationUrl, getGitLabIntegrationUrl } from '@/lib/integration-urls';
import { openAuthorizationAndWaitForReturn } from '@/lib/pr-review/connect-gate-platform';
import { useExternalAuthReturn } from '@/lib/external-auth/use-external-auth-return';
+import { classifyProviderErrorCode } from '@/lib/code-reviewer-status';
import { useGitHubReposRefresh } from '@/lib/use-github-repos-refresh';
-import { useTRPC } from '@/lib/trpc';
+import { trpcClient, useTRPC } from '@/lib/trpc';
type UseNewSessionReposArgs = {
organizationId: string | undefined;
@@ -48,6 +53,14 @@ export function useNewSessionRepos({
const trpc = useTRPC();
const queryClient = useQueryClient();
+ // Publish the route's organization scope for the branch queries. The route
+ // hands this hook the scope already, and `useRepositoryBranches` reads it
+ // from the shared new-session branch state rather than from props the
+ // repository section is not given.
+ useEffect(() => {
+ setNewSessionBranchScope(organizationId);
+ }, [organizationId]);
+
const githubQuery = useQuery(
organizationId
? trpc.organizations.cloudAgentNext.listGitHubRepositories.queryOptions({
@@ -373,3 +386,97 @@ export function useNewSessionRepos({
function repoKey(repository: NewSessionRepository): string {
return `${repository.platform}/${repository.fullName.toLowerCase()}`;
}
+
+// ── Branches of the selected repository ──────────────────────────────
+
+export type RepositoryBranchesState = {
+ /** The provider's default branch, or null when it reports none. */
+ defaultBranch: string | null;
+ branches: string[];
+ /** The query runs only for a selected repository in a scope that can serve it. */
+ isEnabled: boolean;
+ isLoading: boolean;
+ /** A transient failure: the caller offers a retry. */
+ isRetryableError: boolean;
+ /** FORBIDDEN/UNAUTHORIZED/NOT_FOUND — a retry cannot fix it, so no retry CTA. */
+ isPermanentError: boolean;
+ isRetrying: boolean;
+ retry: () => void;
+};
+
+/**
+ * Branches of the selected repository, from the provider, through the s4
+ * `listRepositoryBranches` procedures (organization variant when the
+ * new-session route carries an organization).
+ *
+ * The query runs only when a repository is selected. Bitbucket is
+ * organization-only, so a personal Bitbucket row never issues a request — the
+ * server would refuse it with the org-only message, and the section explains
+ * the restriction instead.
+ *
+ * The cache key carries the full repository identity: the procedure input
+ * only accepts `platform` + `fullName`, so the Bitbucket workspace/repository
+ * uuids are appended to the key here. Two same-named rows — across providers,
+ * or across renamed Bitbucket workspaces — can never read each other's
+ * branches out of the cache.
+ */
+export function useRepositoryBranches(
+ repository: NewSessionRepository | null
+): RepositoryBranchesState {
+ const trpc = useTRPC();
+ const { isScopeReady, organizationId } = useSyncExternalStore(
+ subscribeNewSessionBranchState,
+ getNewSessionBranchState
+ );
+
+ const platform: RepositoryPlatform = repository?.platform ?? 'github';
+ const fullName = repository?.fullName ?? '';
+ const isEnabled =
+ repository !== null &&
+ isScopeReady &&
+ fullName !== '' &&
+ !(platform === 'bitbucket' && !organizationId);
+
+ const personalInput = { platform, repository: { fullName } };
+ const organizationInput = { organizationId: organizationId ?? '', ...personalInput };
+ const identity = repository ? repositoryIdentityKey(repository) : 'none';
+
+ const branchQuery = useQuery({
+ queryKey: [
+ ...(organizationId
+ ? trpc.organizations.cloudAgentNext.listRepositoryBranches.queryKey(organizationInput)
+ : trpc.cloudAgentNext.listRepositoryBranches.queryKey(personalInput)),
+ identity,
+ ],
+ queryFn: async () => {
+ const listing = organizationId
+ ? await trpcClient.organizations.cloudAgentNext.listRepositoryBranches.query(
+ organizationInput
+ )
+ : await trpcClient.cloudAgentNext.listRepositoryBranches.query(personalInput);
+ return listing;
+ },
+ enabled: isEnabled,
+ });
+
+ const errorCode = branchQuery.isError
+ ? // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- the query fn calls tRPC directly, so the error is a TRPCClientError carrying `data.code`
+ (branchQuery.error as { data?: { code?: string } } | null)?.data?.code
+ : undefined;
+ const { permanent } = classifyProviderErrorCode(errorCode);
+
+ const retry = useCallback(() => {
+ void branchQuery.refetch();
+ }, [branchQuery]);
+
+ return {
+ defaultBranch: branchQuery.data?.defaultBranch ?? null,
+ branches: branchQuery.data?.branches ?? [],
+ isEnabled,
+ isLoading: isEnabled && branchQuery.isPending,
+ isRetryableError: branchQuery.isError && !permanent,
+ isPermanentError: branchQuery.isError && permanent,
+ isRetrying: branchQuery.isFetching && branchQuery.isError,
+ retry,
+ };
+}
diff --git a/apps/web/public/.well-known/apple-app-site-association b/apps/web/public/.well-known/apple-app-site-association
index 5fc6240f18..e92f38c743 100644
--- a/apps/web/public/.well-known/apple-app-site-association
+++ b/apps/web/public/.well-known/apple-app-site-association
@@ -21,6 +21,8 @@
{ "/": "/organizations/*/code-reviews/review-md", "exclude": true },
{ "/": "/organizations/*/code-reviews/*" },
{ "/": "/organizations/*/overview" },
+ { "/": "/pr-review/gitlab/**" },
+ { "/": "/pr-review/bitbucket/**" },
{ "/": "/pr-review/*/*/*" }
]
}
diff --git a/apps/web/src/lib/provider-review/bitbucket-read.test.ts b/apps/web/src/lib/provider-review/bitbucket-read.test.ts
index eff6642109..638a2628a5 100644
--- a/apps/web/src/lib/provider-review/bitbucket-read.test.ts
+++ b/apps/web/src/lib/provider-review/bitbucket-read.test.ts
@@ -51,6 +51,7 @@ const prDetail = {
draft: false,
summary: { raw: 'Adds collision-free retry fingerprints.' },
task_count: 1,
+ merge_state: 'open',
author: {
uuid: '{author-uuid}',
nickname: 'alice',
@@ -1135,6 +1136,36 @@ describe('getMergeRestrictions', () => {
expect(state.canMerge).toBe(false);
});
+ it('reports a conflicted pull request from the provider merge_state', async () => {
+ fetchMock.mockImplementation(async (url: string | URL) => {
+ const full = url.toString();
+ if (full.includes('token-service.example.com')) {
+ return jsonResponse({ status: 'available', token: 'at-mock-token', workspace: WORKSPACE });
+ }
+ const pathname = new URL(full).pathname;
+ if (pathname.endsWith('/pullrequests/12')) {
+ return jsonResponse({ ...prDetail, merge_state: 'UNCLEAN', task_count: 0 });
+ }
+ if (pathname.endsWith('/statuses')) {
+ return jsonResponse({
+ pagelen: 10,
+ values: [{ state: 'SUCCESSFUL', key: 'pipeline.build', name: 'Build', url: null }],
+ next: null,
+ });
+ }
+ return jsonResponse({ pagelen: 10, values: [], next: null });
+ });
+
+ const state = await getMergeRestrictions(ORG_OWNER, 'acme', 'repo', 12);
+
+ expect(state.conflicts).toBe(true);
+ expect(state.blockedReasons).toContainEqual({
+ code: 'conflicts',
+ message: 'The pull request has conflicts that must be resolved.',
+ });
+ expect(state.canMerge).toBe(false);
+ });
+
it('reports no conflict when the file-conflicts endpoint answers an empty page', async () => {
fetchMock.mockImplementation(async (url: string | URL) => {
const full = url.toString();
diff --git a/apps/web/src/lib/provider-review/bitbucket-read.ts b/apps/web/src/lib/provider-review/bitbucket-read.ts
index 510df739a3..23f890a942 100644
--- a/apps/web/src/lib/provider-review/bitbucket-read.ts
+++ b/apps/web/src/lib/provider-review/bitbucket-read.ts
@@ -101,6 +101,7 @@ const BitbucketPullRequestDetailSchema = z.object({
source: BitbucketCommitSideSchema.nullable().optional(),
destination: BitbucketCommitSideSchema.nullable().optional(),
task_count: z.number().nullable().optional(),
+ merge_state: z.string().nullable().optional(),
created_on: z.string().nullable().optional(),
updated_on: z.string().nullable().optional(),
links: z
@@ -1122,10 +1123,13 @@ export async function getMergeRestrictions(
const approvalsRequired = readRestrictionNumber(restrictions, 'require_approvals_to_merge');
const buildsMustPass = hasRestriction(restrictions, 'require_passing_builds_to_merge');
- // The provider's own conflict verdict: Bitbucket's pull-request detail
- // carries no merge state, so the documented file-conflicts endpoint
- // answers whether the branches would clash on merge.
- const conflicts = await fileConflictsExist(access, detail);
+ // The provider's own merge verdict: an UNCLEAN (or conflict-worded) merge
+ // state means the branches diverged — independent of the restriction list.
+ // The pull-request detail usually carries no merge state at all, so the
+ // documented file-conflicts endpoint answers whether the branches would
+ // clash on merge.
+ const conflicts =
+ isConflictMergeState(detail.merge_state) || (await fileConflictsExist(access, detail));
const blockedReasons: ProviderPrMergeBlockedReason[] = [];
if (detail.state !== 'OPEN') {
@@ -1245,6 +1249,16 @@ async function fileConflictsExist(
}
}
+/**
+ * Bitbucket's own merge verdict. `UNCLEAN` (any casing, or provider wording
+ * that names a conflict) means the source and destination branches diverged
+ * and Bitbucket cannot merge them cleanly.
+ */
+function isConflictMergeState(mergeState: string | null | undefined): boolean {
+ const normalized = mergeState?.toUpperCase() ?? '';
+ return normalized === 'UNCLEAN' || normalized.includes('CONFLICT');
+}
+
function readRestrictionNumber(
restrictions: z.infer[],
kind: string
diff --git a/apps/web/src/lib/provider-review/gitlab-read.ts b/apps/web/src/lib/provider-review/gitlab-read.ts
index ec94dd5415..767ec5730d 100644
--- a/apps/web/src/lib/provider-review/gitlab-read.ts
+++ b/apps/web/src/lib/provider-review/gitlab-read.ts
@@ -610,7 +610,9 @@ export async function listInbox(
// merge requests, not review requests. `reviews_for_me` selects the
// merge requests where the acting user is the reviewer;
// reviewer_username keeps that filter on versions that predate the
- // scope value.
+ // scope value. reviewer_username is supported on gitlab.com and on
+ // self-managed GitLab since 10.x — older than the versions we
+ // advertise.
scope: 'reviews_for_me',
reviewer_username: me.username,
per_page: GITLAB_PAGE_SIZE,
diff --git a/packages/app-shared/src/universal-links/routes.test.ts b/packages/app-shared/src/universal-links/routes.test.ts
index 4e6bc8aa45..6ad62e47b0 100644
--- a/packages/app-shared/src/universal-links/routes.test.ts
+++ b/packages/app-shared/src/universal-links/routes.test.ts
@@ -11,7 +11,7 @@ import {
const WEB = 'https://app.kilo.ai';
-/** Expected targets for the 16 table rows (concrete ids where wildcards). */
+/** Expected targets for the 18 table rows (concrete ids where wildcards). */
const ROW_CASES = [
{
path: '/home',
@@ -73,6 +73,14 @@ const ROW_CASES = [
path: '/organizations/org_123/overview',
app: '/(app)/(tabs)/(3_profile)/organization/org_123',
},
+ {
+ path: '/pr-review/gitlab/acme/api/42',
+ app: '/(app)/pr-review/gitlab/acme/api/42',
+ },
+ {
+ path: '/pr-review/bitbucket/acme/api/42',
+ app: '/(app)/pr-review/bitbucket/acme/api/42',
+ },
{
path: '/pr-review/acme/api/42',
app: '/(app)/pr-review/acme/api/42',
@@ -80,8 +88,8 @@ const ROW_CASES = [
] as const;
describe('UNIVERSAL_LINK_ROUTES', () => {
- it('has exactly 16 rows', () => {
- expect(UNIVERSAL_LINK_ROUTES).toHaveLength(16);
+ it('has exactly 18 rows', () => {
+ expect(UNIVERSAL_LINK_ROUTES).toHaveLength(18);
});
});
@@ -172,6 +180,43 @@ describe('wildcard capture substitution', () => {
});
});
+describe('trailing ** rows (provider PR paths, s7)', () => {
+ it('joins a multi-segment GitLab project path into one capture', () => {
+ expect(resolveIncomingUrl(`${WEB}/pr-review/gitlab/group/sub/repo/123`)).toBe(
+ '/(app)/pr-review/gitlab/group/sub/repo/123'
+ );
+ });
+
+ it('matches the shortest tail — one segment', () => {
+ expect(resolveIncomingUrl(`${WEB}/pr-review/bitbucket/acme/42`)).toBe(
+ '/(app)/pr-review/bitbucket/acme/42'
+ );
+ });
+
+ it('beats the GitHub row on a same-length path — the literal platform wins', () => {
+ // `/pr-review/gitlab/x/123` has the GitHub row's segment count; it must
+ // NOT be read as owner "gitlab".
+ expect(resolveIncomingUrl(`${WEB}/pr-review/gitlab/x/123`)).toBe(
+ '/(app)/pr-review/gitlab/x/123'
+ );
+ });
+
+ it('requires one-or-more tail segments — a bare platform prefix maps to nothing', () => {
+ expect(resolveIncomingUrl(`${WEB}/pr-review/gitlab`)).toBeNull();
+ expect(webPathToAppPath('/pr-review/bitbucket')).toBeNull();
+ });
+
+ it('does not match other platform prefixes', () => {
+ expect(resolveIncomingUrl(`${WEB}/pr-review/gitlab.example/g/r/1`)).toBeNull();
+ });
+
+ it('inserts the joined tail literally — dollar patterns stay verbatim', () => {
+ expect(resolveIncomingUrl(`${WEB}/pr-review/gitlab/a$&b/c/1`)).toBe(
+ '/(app)/pr-review/gitlab/a$&b/c/1'
+ );
+ });
+});
+
describe('exclusions', () => {
it('excludes /code-reviews/review-md via resolveIncomingUrl', () => {
expect(resolveIncomingUrl(`${WEB}/code-reviews/review-md`)).toBeNull();
@@ -293,8 +338,8 @@ describe('parseKiloWebPath', () => {
});
describe('aasaComponents', () => {
- it('returns 18 entries (16 rows + 2 exclusions)', () => {
- expect(aasaComponents()).toHaveLength(18);
+ it('returns 20 entries (18 rows + 2 exclusions)', () => {
+ expect(aasaComponents()).toHaveLength(20);
});
it('every entry has a "/" key', () => {
@@ -327,11 +372,15 @@ describe('aasaComponents', () => {
expect(paths).toContain('/code-reviews/*');
expect(paths).toContain('/organizations/*/code-reviews/*');
expect(paths).toContain('/organizations/*/security-agent');
+ // '**' is two Apple globs — still a glob that crosses /, so the tail
+ // rows stay valid AASA output unchanged.
+ expect(paths).toContain('/pr-review/gitlab/**');
+ expect(paths).toContain('/pr-review/bitbucket/**');
});
});
describe('androidPathPatterns', () => {
- it('deep-equals the expected 16-string list', () => {
+ it('deep-equals the expected 18-string list', () => {
expect(androidPathPatterns()).toEqual([
'/home',
'/profile',
@@ -348,6 +397,8 @@ describe('androidPathPatterns', () => {
'/organizations/.*/code-reviews',
'/organizations/.*/code-reviews/.*',
'/organizations/.*/overview',
+ '/pr-review/gitlab/.*',
+ '/pr-review/bitbucket/.*',
'/pr-review/.*/.*/.*',
]);
});
diff --git a/packages/app-shared/src/universal-links/routes.ts b/packages/app-shared/src/universal-links/routes.ts
index 5710b2b34d..772f9c945e 100644
--- a/packages/app-shared/src/universal-links/routes.ts
+++ b/packages/app-shared/src/universal-links/routes.ts
@@ -5,7 +5,9 @@
*
* Pattern syntax: literal segments plus `*`, where `*` matches exactly ONE
* path segment ([^/]+) and is captured for substitution into the target as
- * `` (nth capture, 1-based). No regex.
+ * `` (nth capture, 1-based). A trailing `**` matches ONE-OR-MORE tail
+ * segments, joined by `/` into a single capture — GitLab project paths nest
+ * to any depth, so the provider rows need it. No regex.
*/
export type UniversalLinkRoute = {
@@ -66,10 +68,19 @@ export const UNIVERSAL_LINK_ROUTES: readonly UniversalLinkRoute[] = [
webPath: '/organizations/*/overview',
appPath: '/(app)/(tabs)/(3_profile)/organization/<1>',
},
+ // Provider rows BEFORE the GitHub row: `/pr-review/gitlab/x/123` has the
+ // same segment count as a GitHub PR path, and the literal platform segment
+ // must win over the GitHub wildcards. The GitHub row stays byte-identical
+ // to the one that shipped before multi-provider review.
{
- webPath: '/pr-review/*/*/*',
- appPath: '/(app)/pr-review/<1>/<2>/<3>',
+ webPath: '/pr-review/gitlab/**',
+ appPath: '/(app)/pr-review/gitlab/<1>',
},
+ {
+ webPath: '/pr-review/bitbucket/**',
+ appPath: '/(app)/pr-review/bitbucket/<1>',
+ },
+ { webPath: '/pr-review/*/*/*', appPath: '/(app)/pr-review/<1>/<2>/<3>' },
] as const;
const KILO_WEB_HOST = 'app.kilo.ai';
@@ -213,22 +224,26 @@ export function webPathToAppPath(webPath: string): string | null {
/**
* Match `pattern` against `path`. Both are absolute pathnames.
- * `*` matches exactly one non-empty segment. Returns captures or null.
+ * `*` matches exactly one non-empty segment. A trailing `**` matches
+ * one-or-more tail segments, captured as one `/`-joined value.
+ * Returns captures or null.
*/
function matchPattern(pattern: string, path: string): string[] | null {
const patternSegments = splitSegments(pattern);
const pathSegments = splitSegments(path);
+ const hasTail = patternSegments.at(-1) === '**';
+ const fixed = hasTail ? patternSegments.slice(0, -1) : patternSegments;
- if (patternSegments.length !== pathSegments.length) {
+ if (hasTail ? pathSegments.length < fixed.length + 1 : pathSegments.length !== fixed.length) {
return null;
}
const captures: string[] = [];
- for (const [i, pSeg] of patternSegments.entries()) {
+ for (const [i, pSeg] of fixed.entries()) {
const pathSeg = pathSegments[i];
if (pathSeg === undefined) {
- // Unreachable: segment counts are checked equal above.
+ // Unreachable: the length checks above bound the loop.
return null;
}
@@ -246,6 +261,12 @@ function matchPattern(pattern: string, path: string): string[] | null {
}
}
+ if (hasTail) {
+ // One-or-more tail segments, joined into a single capture. splitSegments
+ // never yields empty ones, so the join is unambiguous.
+ captures.push(pathSegments.slice(fixed.length).join('/'));
+ }
+
return captures;
}
@@ -348,15 +369,16 @@ function patternWithFinalWildcardReplaced(pattern: string, value: string): strin
/**
* Compile the table to Android `pathPattern` strings.
- * Each `*` segment becomes `.*`. Android cannot express exclusions — the
- * runtime matcher (`webPathToAppPath` / `resolveIncomingUrl`) is the
- * exclusion enforcement.
+ * Each `*` or trailing `**` segment becomes `.*` (Android's pattern crosses
+ * `/`, so the multi-segment tail needs no special form). Android cannot
+ * express exclusions — the runtime matcher (`webPathToAppPath` /
+ * `resolveIncomingUrl`) is the exclusion enforcement.
*/
export function androidPathPatterns(): string[] {
return UNIVERSAL_LINK_ROUTES.map(route =>
route.webPath
.split('/')
- .map(seg => (seg === '*' ? '.*' : seg))
+ .map(seg => (seg === '*' || seg === '**' ? '.*' : seg))
.join('/')
);
}
diff --git a/patches/expo-router@57.0.15.patch b/patches/expo-router@57.0.15.patch
index 3fe2a498d5..bf21f48d07 100644
--- a/patches/expo-router@57.0.15.patch
+++ b/patches/expo-router@57.0.15.patch
@@ -1,4 +1,36 @@
+diff --git a/android/src/main/java/expo/modules/router/ExpoRouterModule.kt b/android/src/main/java/expo/modules/router/ExpoRouterModule.kt
+deleted file mode 100644
+index 369cd65886415cb894b858e38604dc59b5c6ba95..0000000000000000000000000000000000000000
+diff --git a/build/fork/getStateFromPath-forks.js b/build/fork/getStateFromPath-forks.js
+index 63374a73c024945b5b7dc9db410ebb248f1b67e1..1e31faa0cebd6b8a37801328f1c1841b3c816804 100644
+--- a/build/fork/getStateFromPath-forks.js
++++ b/build/fork/getStateFromPath-forks.js
+@@ -343,6 +343,23 @@ function getRouteConfigSorter(previousSegments = []) {
+ return -1;
+ }
+ }
++ /*
++ * START FORK
++ * A catch-all index route and its static-suffix sibling (e.g.
++ * `*identity` + `merge`) tie on every comparison above: pushing
++ * 'index' into the index config's parts equalizes their lengths and
++ * static counts, and both regexes match the same paths. Without this
++ * tie-break the stable sort keeps the tree order, the index wins, and
++ * the static suffix is swallowed into the catch-all param. The static
++ * sibling consumes fewer catch-all segments, so it must rank first.
++ */
++ if (a.isIndex && !b.isIndex) {
++ return 1;
++ }
++ else if (!a.isIndex && b.isIndex) {
++ return -1;
++ }
++ // END FORK
+ /*
+ * Both configs are identical in specificity and segments count/type
+ * Try and sort by initial instead.
diff --git a/build/fork/useLinking.native.js b/build/fork/useLinking.native.js
+index c080a5853fa71f2708c6ed0f15092b6f43231f76..5da1348eaa9d3530253b683f8427b3c5a33f717c 100644
--- a/build/fork/useLinking.native.js
+++ b/build/fork/useLinking.native.js
@@ -114,20 +114,30 @@ function useLinking(ref, { enabled = true, prefixes, filter, config, getInitialU
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 75b258dcbd..39bfa6c8fc 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -162,7 +162,7 @@ packageExtensionsChecksum: sha256-1pgKZxx87NNMe1poF5N5u5kZB/qlEyILBQPxofM1shE=
patchedDependencies:
decode-uri-component@0.5.0: 44dc7ee3ec754d20fab8b07d7efd2442940d872ab7e8c3b61386a3d344fa3ac8
- expo-router@57.0.15: 616f8a79932a3ebc7d31343b53b3fc425a14bfb89bb86cdafa614cefa4e603ed
+ expo-router@57.0.15: a4b34f8ab2f1fa05490cc8b030a881f48c624878f4287d8f53dc42aca54e0784
expo-server-sdk: 7850520582b5b394397b35d1ea195192fe78589d8a6a748fe15177b818c4ed0b
expo-widgets@57.0.11: 1e56973d7097e3ff0eb5e8e339cdda799cece44b89ce2e13a43f00873f280adc
react-native-appsflyer@6.18.0: 82df99378c830e774b0f01796d8be595da114d1d13393d85ddd47d565c5c2aab
@@ -528,7 +528,7 @@ importers:
version: 57.0.13(expo@57.0.15)(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
expo-router:
specifier: ~57.0.15
- version: 57.0.15(patch_hash=616f8a79932a3ebc7d31343b53b3fc425a14bfb89bb86cdafa614cefa4e603ed)(082c608c44cb8ce85ad58ca6a80585cf)
+ version: 57.0.15(patch_hash=a4b34f8ab2f1fa05490cc8b030a881f48c624878f4287d8f53dc42aca54e0784)(082c608c44cb8ce85ad58ca6a80585cf)
expo-screen-corner-radius:
specifier: 1.1.0
version: 1.1.0(expo@57.0.15)(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
@@ -17023,9 +17023,6 @@ packages:
react-is@18.3.1:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
- react-is@19.2.7:
- resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==}
-
react-is@19.2.8:
resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==}
@@ -22008,7 +22005,7 @@ snapshots:
ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
zod: 3.25.76
optionalDependencies:
- expo-router: 57.0.15(patch_hash=616f8a79932a3ebc7d31343b53b3fc425a14bfb89bb86cdafa614cefa4e603ed)(082c608c44cb8ce85ad58ca6a80585cf)
+ expo-router: 57.0.15(patch_hash=a4b34f8ab2f1fa05490cc8b030a881f48c624878f4287d8f53dc42aca54e0784)(082c608c44cb8ce85ad58ca6a80585cf)
react-native: 0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
transitivePeerDependencies:
- '@expo/metro-runtime'
@@ -22085,7 +22082,7 @@ snapshots:
ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
zod: 3.25.76
optionalDependencies:
- expo-router: 57.0.15(patch_hash=616f8a79932a3ebc7d31343b53b3fc425a14bfb89bb86cdafa614cefa4e603ed)(0fddfe01ab5b870203118fef5ae0fa5d)
+ expo-router: 57.0.15(patch_hash=a4b34f8ab2f1fa05490cc8b030a881f48c624878f4287d8f53dc42aca54e0784)(0fddfe01ab5b870203118fef5ae0fa5d)
react-native: 0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
transitivePeerDependencies:
- '@expo/metro-runtime'
@@ -22582,7 +22579,7 @@ snapshots:
react: 19.2.3
optionalDependencies:
'@expo/metro-runtime': 57.0.12(expo@57.0.15)(react-dom@19.2.6(react@19.2.3))(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
- expo-router: 57.0.15(patch_hash=616f8a79932a3ebc7d31343b53b3fc425a14bfb89bb86cdafa614cefa4e603ed)(082c608c44cb8ce85ad58ca6a80585cf)
+ expo-router: 57.0.15(patch_hash=a4b34f8ab2f1fa05490cc8b030a881f48c624878f4287d8f53dc42aca54e0784)(082c608c44cb8ce85ad58ca6a80585cf)
react-dom: 19.2.6(react@19.2.3)
transitivePeerDependencies:
- supports-color
@@ -22597,7 +22594,7 @@ snapshots:
react: 19.2.6
optionalDependencies:
'@expo/metro-runtime': 57.0.12(expo@57.0.15)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
- expo-router: 57.0.15(patch_hash=616f8a79932a3ebc7d31343b53b3fc425a14bfb89bb86cdafa614cefa4e603ed)(0fddfe01ab5b870203118fef5ae0fa5d)
+ expo-router: 57.0.15(patch_hash=a4b34f8ab2f1fa05490cc8b030a881f48c624878f4287d8f53dc42aca54e0784)(0fddfe01ab5b870203118fef5ae0fa5d)
react-dom: 19.2.6(react@19.2.6)
transitivePeerDependencies:
- supports-color
@@ -31286,7 +31283,7 @@ snapshots:
- supports-color
- typescript
- expo-router@57.0.15(patch_hash=616f8a79932a3ebc7d31343b53b3fc425a14bfb89bb86cdafa614cefa4e603ed)(082c608c44cb8ce85ad58ca6a80585cf):
+ expo-router@57.0.15(patch_hash=a4b34f8ab2f1fa05490cc8b030a881f48c624878f4287d8f53dc42aca54e0784)(082c608c44cb8ce85ad58ca6a80585cf):
dependencies:
'@expo/log-box': 57.0.3(expo@57.0.15)(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
'@expo/metro-runtime': 57.0.12(expo@57.0.15)(react-dom@19.2.6(react@19.2.3))(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
@@ -31311,7 +31308,7 @@ snapshots:
query-string: 7.1.3
react: 19.2.3
react-fast-compare: 3.2.2
- react-is: 19.2.7
+ react-is: 19.2.8
react-native: 0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
react-native-drawer-layout: 4.2.9(react-native-gesture-handler@2.32.0(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-reanimated@4.5.1(react-native-worklets@0.10.1(@babel/core@7.29.7)(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
react-native-safe-area-context: 5.7.0(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
@@ -31333,7 +31330,7 @@ snapshots:
- react-native-worklets
- supports-color
- expo-router@57.0.15(patch_hash=616f8a79932a3ebc7d31343b53b3fc425a14bfb89bb86cdafa614cefa4e603ed)(0fddfe01ab5b870203118fef5ae0fa5d):
+ expo-router@57.0.15(patch_hash=a4b34f8ab2f1fa05490cc8b030a881f48c624878f4287d8f53dc42aca54e0784)(0fddfe01ab5b870203118fef5ae0fa5d):
dependencies:
'@expo/log-box': 57.0.3(expo@57.0.15)(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
'@expo/metro-runtime': 57.0.12(expo@57.0.15)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
@@ -31358,7 +31355,7 @@ snapshots:
query-string: 7.1.3
react: 19.2.6
react-fast-compare: 3.2.2
- react-is: 19.2.7
+ react-is: 19.2.8
react-native: 0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
react-native-drawer-layout: 4.2.9(react-native-gesture-handler@2.32.0(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(react-native-reanimated@4.5.1(react-native-worklets@0.10.1(@babel/core@7.29.7)(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
react-native-safe-area-context: 5.7.0(react-native@0.86.2(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
@@ -36506,8 +36503,6 @@ snapshots:
react-is@18.3.1: {}
- react-is@19.2.7: {}
-
react-is@19.2.8: {}
react-markdown@10.1.0(@types/react@19.2.14)(react@19.2.6):
diff --git a/tools/i18n/check-catalogs.mjs b/tools/i18n/check-catalogs.mjs
index 00e7c6f6ba..bbf89234fb 100644
--- a/tools/i18n/check-catalogs.mjs
+++ b/tools/i18n/check-catalogs.mjs
@@ -109,8 +109,10 @@ const ENGLISH_IDENTICAL_ALLOWLIST = new Set([
'agentChat.prBadge.label',
'share.reviewPrSubtitle',
// Format-only strings with no translatable words: a placeholder-only screen
- // title and a placeholder-plus-UTC time-range label.
+ // title, a placeholder-plus-UTC time-range label, and the GitLab merge
+ // request number, which is the provider's own "!" reference syntax.
'prReview.screen.title',
+ 'prReview.terms.mergeRequestNumber',
'securityAgent.auditReport.periodUtc',
]);