feat: more translations

This commit is contained in:
Nevo David 2026-01-01 16:07:58 +07:00
parent b3d298daff
commit cd085e27ca
51 changed files with 2295 additions and 300 deletions

View File

@ -32,11 +32,13 @@ import { AddEditModal } from '@gitroom/frontend/components/new-launch/add.edit.m
import dayjs from 'dayjs';
import { makeId } from '@gitroom/nestjs-libraries/services/make.is';
import { ExistingDataContextProvider } from '@gitroom/frontend/components/launches/helpers/use.existing.data';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
export const AgentChat: FC = () => {
const { backendUrl } = useVariables();
const params = useParams<{ id: string }>();
const { properties } = useContext(PropertiesContext);
const t = useT();
return (
<CopilotKit
@ -64,8 +66,8 @@ export const AgentChat: FC = () => {
<CopilotChat
className="w-full h-full"
labels={{
title: 'Your Assistant',
initial: `Hello, I am your Postiz agent 🙌🏻.
title: t('your_assistant', 'Your Assistant'),
initial: t('agent_welcome_message', `Hello, I am your Postiz agent 🙌🏻.
I can schedule a post or multiple posts to multiple channels and generate pictures and videos.
@ -74,7 +76,7 @@ You can select the channels you want to use from the left menu.
You can see your previous conversations from the right menu.
You can also use me as an MCP Server, check Settings >> Public API
`,
`),
}}
UserMessage={Message}
Input={NewInput}

View File

@ -21,6 +21,7 @@ import { MultiMediaComponent } from '@gitroom/frontend/components/media/media.co
import { Integration } from '@prisma/client';
import Link from 'next/link';
import { useParams, usePathname, useRouter } from 'next/navigation';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
export const MediaPortal: FC<{
media: { path: string; id: string }[];
@ -39,13 +40,14 @@ export const MediaPortal: FC<{
}) => void;
}> = ({ media, setMedia, value }) => {
const waitForClass = useWaitForClass('copilotKitMessages');
const t = useT();
if (!waitForClass) return null;
return (
<div className="pl-[14px] pr-[24px] whitespace-nowrap editor rm-bg">
<MultiMediaComponent
allData={[{ content: value }]}
text={value}
label="Attachments"
label={t('attachments', 'Attachments')}
description=""
value={media}
dummy={false}
@ -62,6 +64,7 @@ export const AgentList: FC<{ onChange: (arr: any[]) => void }> = ({
onChange,
}) => {
const fetch = useFetch();
const t = useT();
const [selected, setSelected] = useState([]);
const load = useCallback(async () => {
@ -111,7 +114,7 @@ export const AgentList: FC<{ onChange: (arr: any[]) => void }> = ({
<div className="absolute top-0 start-0 w-full h-full p-[20px] overflow-auto scrollbar scrollbar-thumb-fifth scrollbar-track-newBgColor">
<div className="flex items-center">
<h2 className="group-[.sidebar]:hidden flex-1 text-[20px] font-[500] mb-[15px]">
Select Channels
{t('select_channels', 'Select Channels')}
</h2>
<div
onClick={() => setCollapseMenu(collapseMenu === '1' ? '0' : '1')}
@ -210,6 +213,7 @@ const Threads: FC = () => {
const fetch = useFetch();
const router = useRouter();
const pathname = usePathname();
const t = useT();
const threads = useCallback(async () => {
return (await fetch('/copilot/list')).json();
}, []);
@ -247,7 +251,7 @@ const Threads: FC = () => {
/>
</svg>
<div className="flex-1 text-start text-[16px] group-[.sidebar]:hidden">
Start a new chat
{t('start_a_new_chat', 'Start a new chat')}
</div>
</Link>
</div>

View File

@ -138,8 +138,8 @@ export const StarsAndForks: FC<StarsAndForksInterface> = (props) => {
</div>
<div className="text-[20px]">
{p === 0
? 'Last Github Trending'
: 'Next Predicted GitHub Trending'}
? t('last_github_trending', 'Last Github Trending')
: t('next_predicted_github_trending', 'Next Predicted GitHub Trending')}
</div>
</div>
<div className="flex items-center">

View File

@ -1,3 +1,5 @@
'use client';
import {
FC,
useCallback,
@ -205,22 +207,22 @@ export const StarsTableComponent = () => {
<thead>
<tr>
<th>
<UpDown name="Repository" param="login" />
<UpDown name={t('repository', 'Repository')} param="login" />
</th>
<th>
<UpDown name="Date" param="date" />
<UpDown name={t('date', 'Date')} param="date" />
</th>
<th>
<UpDown name="Total Stars" param="totalStars" />
<UpDown name={t('total_stars', 'Total Stars')} param="totalStars" />
</th>
<th>
<UpDown name="Total Fork" param="totalForks" />
<UpDown name={t('total_forks', 'Total Forks')} param="totalForks" />
</th>
<th>
<UpDown name="Stars" param="stars" />
<UpDown name={t('stars', 'Stars')} param="stars" />
</th>
<th>
<UpDown name="Forks" param="forks" />
<UpDown name={t('forks', 'Forks')} param="forks" />
</th>
<th>{t('media', 'Media')}</th>
</tr>

View File

@ -42,7 +42,7 @@ export function ForgotReturn({ token }: { token: string }) {
if (!reset) {
form.setError('password', {
type: 'manual',
message: 'Your password reset link has expired. Please try again.',
message: t('password_reset_link_expired', 'Your password reset link has expired. Please try again.'),
});
return false;
}
@ -61,15 +61,17 @@ export function ForgotReturn({ token }: { token: string }) {
<div className="space-y-4 text-textColor">
<Input
label="New Password"
translationKey="label_new_password"
{...form.register('password')}
type="password"
placeholder="Password"
placeholder={t('label_password', 'Password')}
/>
<Input
label="Repeat Password"
translationKey="label_repeat_password"
{...form.register('repeatPassword')}
type="password"
placeholder="Repeat Password"
placeholder={t('label_repeat_password', 'Repeat Password')}
/>
</div>
<div className="text-center mt-6">

View File

@ -49,9 +49,10 @@ export function Forgot() {
<div className="space-y-4 text-textColor">
<Input
label="Email"
translationKey="label_email"
{...form.register('email')}
type="email"
placeholder="Email Address"
placeholder={t('email_address', 'Email Address')}
/>
</div>
<div className="text-center mt-6">

View File

@ -82,7 +82,7 @@ export function Login() {
<div
className={`absolute z-[1] justify-center items-center w-full start-0 -top-[4px] flex`}
>
<div className="px-[16px]">or</div>
<div className="px-[16px]">{t('or', 'or')}</div>
</div>
</div>
<div className="flex flex-col gap-[12px]">
@ -92,7 +92,7 @@ export function Login() {
translationKey="label_email"
{...form.register('email')}
type="email"
placeholder="Email Address"
placeholder={t('email_address', 'Email Address')}
/>
<Input
label="Password"
@ -100,7 +100,7 @@ export function Login() {
{...form.register('password')}
autoComplete="off"
type="password"
placeholder="Password"
placeholder={t('label_password', 'Password')}
/>
</div>
<div className="text-center mt-6">

View File

@ -51,7 +51,7 @@ export const ButtonCaster: FC<{
</clipPath>
</defs>
</svg>
<div className="block xs:hidden">Farcaster</div>
<div className="block xs:hidden">{t('farcaster', 'Farcaster')}</div>
</div>
</NeynarAuthButton>
</NeynarContextProvider>

View File

@ -1,3 +1,5 @@
'use client';
import { useCallback } from 'react';
import { useFetch } from '@gitroom/helpers/utils/custom.fetch';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
@ -38,7 +40,7 @@ export const GoogleProvider = () => {
/>
</svg>
</div>
<div className="block xs:hidden">Google</div>
<div className="block xs:hidden">{t('google', 'Google')}</div>
</div>
);
};

View File

@ -151,7 +151,7 @@ export function RegisterAfter({
{t('sign_up', 'Sign Up')}
</h1>
</div>
<div className="text-[14px] mt-[32px] mb-[12px]">Continue With</div>
<div className="text-[14px] mt-[32px] mb-[12px]">{t('continue_with', 'Continue With')}</div>
<div className="flex flex-col">
{!isAfterProvider &&
(!isGeneral ? (
@ -174,7 +174,7 @@ export function RegisterAfter({
className={`absolute z-[1] justify-center items-center w-full start-0 -top-[4px] flex`}
>
<div className="px-[16px]">
or
{t('or', 'or')}
</div>
</div>
</div>
@ -185,25 +185,28 @@ export function RegisterAfter({
<>
<Input
label="Email"
translationKey="label_email"
{...form.register('email')}
type="email"
placeholder="Email Address"
placeholder={t('email_address', 'Email Address')}
/>
<Input
label="Password"
translationKey="label_password"
{...form.register('password')}
autoComplete="off"
type="password"
placeholder="Password"
placeholder={t('label_password', 'Password')}
/>
</>
)}
<Input
label="Company"
translationKey="label_company"
{...form.register('company')}
autoComplete="off"
type="text"
placeholder="Company"
placeholder={t('label_company', 'Company')}
/>
</div>
<div className={clsx('text-[12px]')}>

View File

@ -1,9 +1,10 @@
'use client';
import React, { FC, Fragment, useCallback, useMemo, useState } from 'react';
import { useFetch } from '@gitroom/helpers/utils/custom.fetch';
import useSWR from 'swr';
import { Button } from '@gitroom/react/form/button';
import { useModals } from '@gitroom/frontend/components/layout/new-modal';
import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component';
import { Input } from '@gitroom/react/form/input';
import { FormProvider, useForm } from 'react-hook-form';
import { array, boolean, object, string } from 'yup';
@ -28,7 +29,7 @@ export const Autopost: FC = () => {
const addWebhook = useCallback(
(data?: any) => () => {
modal.openModal({
title: data ? 'Edit Autopost' : 'Add Autopost',
title: data ? t('edit_autopost', 'Edit Autopost') : t('add_autopost_title', 'Add Autopost'),
withCloseButton: true,
children: <AddOrEditWebhook data={data} reload={mutate} />,
});
@ -50,7 +51,7 @@ export const Autopost: FC = () => {
method: 'DELETE',
});
mutate();
toaster.show('Webhook deleted successfully', 'success');
toaster.show(t('webhook_deleted_successfully', 'Webhook deleted successfully'), 'success');
}
},
[]
@ -142,33 +143,33 @@ const details = object().shape({
})
),
});
const options = [
const getOptions = (t: (key: string, fallback: string) => string) => [
{
label: 'All integrations',
label: t('all_integrations', 'All integrations'),
value: 'all',
},
{
label: 'Specific integrations',
label: t('specific_integrations', 'Specific integrations'),
value: 'specific',
},
];
const optionsChoose = [
const getOptionsChoose = (t: (key: string, fallback: string) => string) => [
{
label: 'Yes',
label: t('yes', 'Yes'),
value: true,
},
{
label: 'No',
label: t('no', 'No'),
value: false,
},
];
const postImmediately = [
const getPostImmediately = (t: (key: string, fallback: string) => string) => [
{
label: 'Post on the next available slot',
label: t('post_on_next_available_slot', 'Post on the next available slot'),
value: true,
},
{
label: 'Post Immediately',
label: t('post_immediately', 'Post Immediately'),
value: false,
},
];
@ -178,6 +179,10 @@ export const AddOrEditWebhook: FC<{
}> = (props) => {
const { data, reload } = props;
const fetch = useFetch();
const t = useT();
const options = getOptions(t);
const optionsChoose = getOptionsChoose(t);
const postImmediately = getPostImmediately(t);
const [allIntegrations, setAllIntegrations] = useState(
(JSON.parse(data?.integrations || '[]')?.length || 0) > 0
? options[1]
@ -255,8 +260,8 @@ export const AddOrEditWebhook: FC<{
});
toast.show(
data?.id
? 'Autopost updated successfully'
: 'Autopost added successfully',
? t('autopost_updated_successfully', 'Autopost updated successfully')
: t('autopost_added_successfully', 'Autopost added successfully'),
'success'
);
modal.closeAll();
@ -277,10 +282,10 @@ export const AddOrEditWebhook: FC<{
).json();
if (!success) {
setValid('');
toast.show('Could not use this RSS feed', 'warning');
toast.show(t('could_not_use_rss_feed', 'Could not use this RSS feed'), 'warning');
return;
}
toast.show('RSS valid!', 'success');
toast.show(t('rss_valid', 'RSS valid!'), 'success');
setValid(url);
setLastUrl(newUrl);
} catch (e: any) {
@ -288,8 +293,6 @@ export const AddOrEditWebhook: FC<{
}
}, []);
const t = useT();
return (
<FormProvider {...form}>
<form onSubmit={form.handleSubmit(callBack)}>
@ -360,7 +363,7 @@ export const AddOrEditWebhook: FC<{
onChange={(e) => {
form.setValue('content', e.target.value);
}}
placeholder="Write your post..."
placeholder={t('write_your_post_placeholder', 'Write your post...')}
autosuggestionsConfig={{
textareaPurpose: `Assist me in writing social media post`,
chatApiConfigs: {},

View File

@ -114,7 +114,7 @@ export const ApiModal: FC<{
return;
}
methods.setError('api', {
message: 'Invalid API key',
message: t('invalid_api_key', 'Invalid API key'),
});
}, []);
@ -343,7 +343,7 @@ export const AddProviderComponent: FC<{
await fetch(`/integrations/social/${identifier}`)
).json();
modal.openModal({
title: 'Web3 provider',
title: t('web3_provider', 'Web3 provider'),
withCloseButton: false,
classNames: {
modal: 'bg-transparent text-textColor',
@ -368,7 +368,7 @@ export const AddProviderComponent: FC<{
)
).json();
if (err) {
toaster.show('Could not connect to the platform', 'warning');
toaster.show(t('could_not_connect_to_platform', 'Could not connect to the platform'), 'warning');
return;
}
window.location.href = url;
@ -392,7 +392,7 @@ export const AddProviderComponent: FC<{
if (customFields) {
modal.closeAll();
modal.openModal({
title: 'Add Provider',
title: t('add_provider_title', 'Add Provider'),
withCloseButton: false,
classNames: {
modal: 'bg-transparent text-textColor',

View File

@ -1,3 +1,5 @@
'use client';
import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component';
import React, { FC, FormEventHandler, useCallback, useState } from 'react';
import { Integrations } from '@gitroom/frontend/components/launches/calendar.context';
@ -33,7 +35,7 @@ export const BotPicture: FC<{
}),
});
props.mutate();
toast.show('Updated', 'success');
toast.show(t('updated', 'Updated'), 'success');
modal.closeAll();
},
[nick, picture, props.mutate]
@ -45,7 +47,7 @@ export const BotPicture: FC<{
}, []);
return (
<div className="rounded-[4px] border border-customColor6 bg-sixth px-[16px] pb-[16px] relative w-full">
<TopTitle title={`Change Bot Picture`} />
<TopTitle title={t('change_bot_picture_title', 'Change Bot Picture')} />
<button
className="outline-none absolute end-[20px] top-[20px] mantine-UnstyledButton-root mantine-ActionIcon-root hover:bg-tableBorder cursor-pointer mantine-Modal-close mantine-1dcetaa"
type="button"
@ -86,7 +88,7 @@ export const BotPicture: FC<{
value={nick}
onChange={(e) => setNickname(e.target.value)}
name="Nickname"
label="Nickname"
label={t('label_nickname', 'Nickname')}
placeholder=""
disableForm={true}
/>

View File

@ -921,12 +921,12 @@ const CalendarItem: FC<{
<div className="text-start">
{state === 'DRAFT' ? t('draft', 'Draft') + ': ' : ''}
</div>
<div className="w-full relative">
<div className="absolute top-0 start-0 w-full text-ellipsis break-words line-clamp-1 text-left">
{stripHtmlValidation('none', post.content, false, true, false) ||
'no content'}
<div className="w-full relative">
<div className="absolute top-0 start-0 w-full text-ellipsis break-words line-clamp-1 text-start">
{stripHtmlValidation('none', post.content, false, true, false) ||
t('no_content', 'no content')}
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,4 +1,5 @@
import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component';
'use client';
import React, { FC, useCallback, useEffect, useState } from 'react';
import { useModals } from '@gitroom/frontend/components/layout/new-modal';
import { Integration } from '@prisma/client';
@ -56,8 +57,8 @@ export const CustomerModal: FC<{
classNames={{
label: 'text-white',
}}
label="Select Customer"
placeholder="Start typing..."
label={t('select_customer_label', 'Select Customer')}
placeholder={t('start_typing', 'Start typing...')}
data={data?.map((p: any) => p.name) || []}
/>
</div>

View File

@ -280,7 +280,7 @@ export const Filters = () => {
onClick={setToday}
className="hover:text-textItemFocused hover:bg-boxFocused py-[3px] px-[9px] flex justify-center items-center rounded-[8px] transition-all cursor-pointer text-[14px] bg-newBgColorInner border border-newTableBorder"
>
Today
{t('today', 'Today')}
</div>
</div>
</div>

View File

@ -1,3 +1,5 @@
'use client';
import React, { FC, useCallback, useMemo, useState } from 'react';
import { useUser } from '@gitroom/frontend/components/layout/user.context';
import { useRouter } from 'next/navigation';
@ -19,7 +21,7 @@ import dayjs from 'dayjs';
import { Select } from '@gitroom/react/form/select';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
import { AddEditModal } from '@gitroom/frontend/components/new-launch/add.edit.modal';
import { ModalWrapperComponent } from '@gitroom/frontend/components/new-launch/modal.wrapper.component';
const FirstStep: FC = (props) => {
const { integrations, reloadCalendarView } = useCalendar();
const modal = useModals();
@ -295,9 +297,9 @@ export const GeneratorComponent = () => {
if (!user?.tier?.ai) {
if (
await deleteDialog(
'You need to upgrade to use this feature',
'Move to billing',
'Payment Required'
t('upgrade_required', 'You need to upgrade to use this feature'),
t('move_to_billing', 'Move to billing'),
t('payment_required', 'Payment Required')
)
) {
router.push('/billing');
@ -305,7 +307,7 @@ export const GeneratorComponent = () => {
return;
}
modal.openModal({
title: 'Generate Posts',
title: t('generate_posts', 'Generate Posts'),
withCloseButton: false,
classNames: {
modal: 'bg-transparent text-textColor',

View File

@ -1,9 +1,12 @@
'use client';
import React, { FC, Fragment, useMemo } from 'react';
import { useLaunchStore } from '@gitroom/frontend/components/new-launch/store';
import { useShallow } from 'zustand/react/shallow';
import clsx from 'clsx';
import Image from 'next/image';
import { capitalize } from 'lodash';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
const Valid: FC = () => {
return (
@ -57,6 +60,7 @@ export const InformationComponent: FC<{
totalAllowedChars: number;
isPicture: boolean;
}> = ({ totalChars, totalAllowedChars, chars, isPicture }) => {
const t = useT();
const { isGlobal, selectedIntegrations, internal } = useLaunchStore(
useShallow((state) => ({
isGlobal: state.current === 'global',
@ -149,9 +153,7 @@ export const InformationComponent: FC<{
isGlobal && selectedIntegrations.length && 'mb-[12px]'
)}
>
Your post should have at least
<br />
one character or one image.
{t('your_post_should_have_at_least_one_character_or_one_image', 'Your post should have at least one character or one image.')}
</div>
)}
{isGlobal && (
@ -191,7 +193,7 @@ export const InformationComponent: FC<{
)}
>
{isInternal?.[index]
? 'Internal Edit'
? t('internal_edit', 'Internal Edit')
: `${totalChars}/${chars?.[p.integration.id] || 0}`}
</div>
</Fragment>

View File

@ -7,7 +7,6 @@ import { groupBy, orderBy } from 'lodash';
import { CalendarWeekProvider } from '@gitroom/frontend/components/launches/calendar.context';
import { Filters } from '@gitroom/frontend/components/launches/filters';
import { useFetch } from '@gitroom/helpers/utils/custom.fetch';
import useSWR from 'swr';
import { LoadingComponent } from '@gitroom/frontend/components/layout/loading';
import clsx from 'clsx';
import { useUser } from '../layout/user.context';
@ -234,6 +233,7 @@ export const MenuComponent: FC<
collapsed,
} = props;
const user = useUser();
const t = useT();
const [collected, drag, dragPreview] = useDrag(() => ({
type: 'menu',
item: {
@ -247,7 +247,7 @@ export const MenuComponent: FC<
{...(integration.refreshNeeded && {
onClick: refreshChannel(integration),
'data-tooltip-id': 'tooltip',
'data-tooltip-content': 'Channel disconnected, click to reconnect.',
'data-tooltip-content': t('channel_disconnected_click_to_reconnect', 'Channel disconnected, click to reconnect.'),
})}
{...(collapsed
? {
@ -317,7 +317,7 @@ export const MenuComponent: FC<
? {
'data-tooltip-id': 'tooltip',
'data-tooltip-content':
'This channel is disabled, please upgrade your plan to enable it.',
t('channel_disabled_upgrade_plan', 'This channel is disabled, please upgrade your plan to enable it.'),
}
: {})}
role="Handle"
@ -469,7 +469,7 @@ export const LaunchesComponent = () => {
fireEvents('channel_added');
window?.opener?.postMessage(
{
msg: 'Channel added',
msg: t('channel_added', 'Channel added'),
success: true,
},
'*'

View File

@ -108,8 +108,8 @@ export const Menu: FC<{
const disableChannel = useCallback(async () => {
if (
!(await deleteDialog(
'Are you sure you want to disable this channel?',
'Disable Channel'
t('are_you_sure_disable_channel', 'Are you sure you want to disable this channel?'),
t('disable_channel_title', 'Disable Channel')
))
) {
return;
@ -120,15 +120,15 @@ export const Menu: FC<{
id,
}),
});
toast.show('Channel Disabled', 'success');
toast.show(t('channel_disabled', 'Channel Disabled'), 'success');
setShow(false);
onChange(false);
}, []);
}, [t]);
const deleteChannel = useCallback(async () => {
if (
!(await deleteDialog(
'Are you sure you want to delete this channel?',
'Delete Channel'
t('are_you_sure_delete_channel', 'Are you sure you want to delete this channel?'),
t('delete_channel_title', 'Delete Channel')
))
) {
return;
@ -141,15 +141,15 @@ export const Menu: FC<{
});
if (deleteIntegration.status === 406) {
toast.show(
'You have to delete all the posts associated with this channel before deleting it',
t('delete_posts_before_channel', 'You have to delete all the posts associated with this channel before deleting it'),
'warning'
);
return;
}
toast.show('Channel Deleted', 'success');
toast.show(t('channel_deleted', 'Channel Deleted'), 'success');
setShow(false);
onChange(true);
}, []);
}, [t]);
const enableChannel = useCallback(async () => {
await fetch('/integrations/enable', {
@ -158,10 +158,10 @@ export const Menu: FC<{
id,
}),
});
toast.show('Channel Enabled', 'success');
toast.show(t('channel_enabled', 'Channel Enabled'), 'success');
setShow(false);
onChange(false);
}, []);
}, [t]);
const editTimeTable = useCallback(() => {
const findIntegration = integrations.find(
@ -172,20 +172,20 @@ export const Menu: FC<{
closeOnEscape: false,
closeOnClickOutside: false,
askClose: true,
title: 'Time Table Slots',
title: t('time_table_slots', 'Time Table Slots'),
children: <TimeTable integration={findIntegration!} mutate={mutate} />,
});
setShow(false);
}, [integrations]);
}, [integrations, t]);
const copyChannelId = useCallback(
(integration: Integrations) => async () => {
setShow(false);
const channelId = integration.id;
copy(channelId);
toast.show(`Channel ID ${channelId} copied to clipboard`, 'success');
toast.show(t('channel_id_copied', 'Channel ID copied to clipboard'), 'success');
},
[]
[t]
);
const createPost = useCallback(
@ -255,20 +255,20 @@ export const Menu: FC<{
(integration) => integration.id === id
);
modal.openModal({
title: 'Additional Settings',
title: t('additional_settings', 'Additional Settings'),
children: (
<SettingsModal
// @ts-ignore
integration={findIntegration}
onClose={() => {
mutate();
toast.show('Settings Updated', 'success');
toast.show(t('settings_updated', 'Settings Updated'), 'success');
}}
/>
),
});
setShow(false);
}, [integrations]);
}, [integrations, t]);
const addToCustomer = useCallback(() => {
const findIntegration = integrations.find(
(integration) => integration.id === id
@ -277,7 +277,7 @@ export const Menu: FC<{
classNames: {
modal: 'md',
},
title: 'Move / Add to customer',
title: t('move_add_to_customer', 'Move / Add to customer'),
withCloseButton: false,
closeOnEscape: true,
closeOnClickOutside: true,
@ -287,16 +287,16 @@ export const Menu: FC<{
integration={findIntegration}
onClose={() => {
mutate();
toast.show('Customer Updated', 'success');
toast.show(t('customer_updated', 'Customer Updated'), 'success');
}}
/>
),
});
setShow(false);
}, [integrations]);
}, [integrations, t]);
const updateCredentials = useCallback(() => {
modal.openModal({
title: 'Custom URL',
title: t('custom_url', 'Custom URL'),
withCloseButton: false,
classNames: {
modal: 'md',
@ -309,7 +309,7 @@ export const Menu: FC<{
/>
),
});
}, []);
}, [t]);
return (
<div
@ -488,8 +488,8 @@ export const Menu: FC<{
<div className="text-[14px]">
{t('change_bot', 'Change Bot')}
{[
canChangeProfilePicture && 'Picture',
canChangeNickName && 'Nickname',
canChangeProfilePicture && t('picture', 'Picture'),
canChangeNickName && t('label_nickname', 'Nickname'),
]
.filter((f) => f)
.join(' / ')}

View File

@ -1,3 +1,5 @@
'use client';
import { FC, useMemo, useState } from 'react';
import { Select } from '@gitroom/react/form/select';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
@ -5,46 +7,46 @@ import { useClickOutside } from '@mantine/hooks';
import { isUSCitizen } from '@gitroom/frontend/components/launches/helpers/isuscitizen.utils';
import clsx from 'clsx';
import { RepeatIcon, DropdownArrowIcon } from '@gitroom/frontend/components/ui/icons';
const list = [
const getList = (t: (key: string, fallback: string) => string) => [
{
value: 1,
label: 'Day',
label: t('day', 'Day'),
},
{
value: 2,
label: 'Two Days',
label: t('two_days', 'Two Days'),
},
{
value: 3,
label: 'Three Days',
label: t('three_days', 'Three Days'),
},
{
value: 4,
label: 'Four Days',
label: t('four_days', 'Four Days'),
},
{
value: 5,
label: 'Five Days',
label: t('five_days', 'Five Days'),
},
{
value: 6,
label: 'Six Days',
label: t('six_days', 'Six Days'),
},
{
value: 7,
label: 'Week',
label: t('week', 'Week'),
},
{
value: 14,
label: 'Two Weeks',
label: t('two_weeks', 'Two Weeks'),
},
{
value: 30,
label: 'Month',
label: t('month', 'Month'),
},
{
value: null,
label: 'Cancel',
label: t('cancel', 'Cancel'),
},
];
export const RepeatComponent: FC<{
@ -53,6 +55,7 @@ export const RepeatComponent: FC<{
}> = (props) => {
const { repeat } = props;
const t = useT();
const list = getList(t);
const [isOpen, setIsOpen] = useState(false);
const ref = useClickOutside(() => {
@ -67,7 +70,7 @@ export const RepeatComponent: FC<{
return '';
}
return list.find((p) => p.value === repeat)?.label;
}, [repeat]);
}, [repeat, list]);
return (
<div
@ -86,7 +89,7 @@ export const RepeatComponent: FC<{
</div>
<div className="cursor-pointer">
{repeat
? `Repeat Post Every ${everyLabel}`
? `${t('repeat_post_every_label', 'Repeat Post Every')} ${everyLabel}`
: t('repeat_post_every', 'Repeat Post Every...')}
</div>
<div className="cursor-pointer">
@ -94,7 +97,7 @@ export const RepeatComponent: FC<{
</div>
</div>
{isOpen && (
<div className="z-[300] absolute left-0 bottom-[100%] w-[240px] bg-newBgColorInner p-[12px] menu-shadow -translate-y-[10px] flex flex-col">
<div className="z-[300] absolute start-0 bottom-[100%] w-[240px] bg-newBgColorInner p-[12px] menu-shadow -translate-y-[10px] flex flex-col">
{list.map((p) => (
<div
onClick={() => {

View File

@ -1,3 +1,5 @@
'use client';
import { uniqBy } from 'lodash';
import React, { FC, useCallback, useMemo, useRef, useState } from 'react';
import { Integrations } from '@gitroom/frontend/components/launches/calendar.context';
@ -53,7 +55,7 @@ export const SelectCustomer: FC<{
<div className="relative select-none z-[500]" ref={ref}>
<div
data-tooltip-id="tooltip"
data-tooltip-content="Select Customer"
data-tooltip-content={t('select_customer_tooltip', 'Select Customer')}
onClick={openClose}
className={clsx(
'relative z-[20] cursor-pointer h-[42px] rounded-[8px] pl-[16px] pr-[12px] gap-[8px] border flex items-center',
@ -73,7 +75,7 @@ export const SelectCustomer: FC<{
className="flex flex-col fixed pt-[12px] bg-newBgColorInner menu-shadow min-w-[250px]"
>
<div className="text-[14px] font-[600] px-[12px] mb-[5px]">
Customers
{t('customers', 'Customers')}
</div>
{uniqBy(integrations, (u) => u?.customer?.name)
.filter((f) => f.customer?.name)

View File

@ -1,8 +1,9 @@
'use client';
import { FC, useCallback, useMemo, useState } from 'react';
import { ReactTags } from 'react-tag-autocomplete';
import { useFetch } from '@gitroom/helpers/utils/custom.fetch';
import useSWR from 'swr';
import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component';
import { Input } from '@gitroom/react/form/input';
import { ColorPicker } from '@gitroom/react/form/color.picker';
import { Button } from '@gitroom/react/form/button';
@ -71,7 +72,7 @@ export const TagsComponentInner: FC<{
const addTag = useCallback(async () => {
const val: string | undefined = await new Promise((resolve) => {
modals.openModal({
title: 'Add new tag',
title: t('add_new_tag', 'Add New Tag'),
children: (close) => (
<ShowModal tag="" close={close} resolve={resolve} />
),
@ -114,7 +115,7 @@ export const TagsComponentInner: FC<{
</div>
<div className="cursor-pointer flex gap-[4px]">
{tagValue.length === 0 ? (
'Add New Tag'
t('add_new_tag', 'Add New Tag')
) : (
<>
<div
@ -134,7 +135,7 @@ export const TagsComponentInner: FC<{
</div>
</div>
{isOpen && (
<div className="z-[300] absolute left-0 bottom-[100%] w-[240px] bg-newBgColorInner p-[12px] menu-shadow -translate-y-[10px] flex flex-col">
<div className="z-[300] absolute start-0 bottom-[100%] w-[240px] bg-newBgColorInner p-[12px] menu-shadow -translate-y-[10px] flex flex-col">
{(data?.tags || []).map((p: any) => (
<div
onClick={() => {
@ -180,7 +181,7 @@ export const TagsComponentInner: FC<{
<div>
<PlusIcon />
</div>
<div className="text-[13px] font-[600]">Add New Tag</div>
<div className="text-[13px] font-[600]">{t('add_new_tag', 'Add New Tag')}</div>
</div>
</div>
)}
@ -431,13 +432,13 @@ const ShowModal: FC<{
<Input
name="name"
disableForm={true}
label="Name"
label={t('tag_name', 'Name')}
value={tagName}
onChange={(e) => setTagName(e.target.value)}
/>
<ColorPicker
onChange={(e) => setColor(e.target.value)}
label="Tag Color"
label={t('label_tag_color', 'Tag Color')}
name="color"
value={color}
enabled={true}

View File

@ -1,4 +1,5 @@
import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component';
'use client';
import React, { FC, Fragment, useCallback, useMemo, useState } from 'react';
import { Integrations } from '@gitroom/frontend/components/launches/calendar.context';
import dayjs from 'dayjs';
@ -118,7 +119,7 @@ export const TimeTable: FC<{
<div className="mt-[16px] flex justify-center gap-[16px]">
<div className="w-[100px]">
<Select
label="Hour"
label={t('hour', 'Hour')}
name="hour"
disableForm={true}
className="w-[100px] mt-[8px]"
@ -135,7 +136,7 @@ export const TimeTable: FC<{
</div>
<div className="w-[100px]">
<Select
label="Minutes"
label={t('minutes', 'Minutes')}
name="minutes"
disableForm={true}
className="w-[100px] mt-[8px]"

View File

@ -76,7 +76,7 @@ export const SettingsPopup: FC<{
if (getRef) {
return;
}
toast.show('Profile updated');
toast.show(t('profile_updated', 'Profile updated'));
swr.mutate('/marketplace/account');
close();
}, []);

View File

@ -319,10 +319,10 @@ export const MediaBox: FC<{
className="cursor-pointer bg-btnSimple changeColor flex gap-[8px] h-[44px] px-[18px] justify-center items-center rounded-[8px]"
>
<PlusIcon size={14} />
<div>Upload</div>
<div>{t('upload', 'Upload')}</div>
</button>
);
}, []);
}, [t]);
return (
<DropFiles className="flex flex-col flex-1" onDrop={dragAndDrop}>
@ -335,8 +335,8 @@ export const MediaBox: FC<{
>
{!isLoading && !!data?.results?.length && (
<div className="flex-1 text-[14px] font-[600] whitespace-pre-line">
Select or upload pictures (maximum 5 at a time).{'\n'}
You can also drag & drop pictures.
{t('select_or_upload_pictures_max_5', 'Select or upload pictures (maximum 5 at a time).')}{'\n'}
{t('you_can_drag_drop_pictures', 'You can also drag & drop pictures.')}
</div>
)}
<input
@ -384,11 +384,11 @@ export const MediaBox: FC<{
<>
<NoMediaIcon />
<div className="text-[20px] font-[600]">
You don't have any media yet
{t('you_dont_have_any_media_yet', "You don't have any media yet")}
</div>
<div className="whitespace-pre-line text-newTextColor/[0.6] text-center">
Select or upload pictures (maximum 5 at a time). {'\n'}
You can also drag & drop pictures.
{t('select_or_upload_pictures_max_5', 'Select or upload pictures (maximum 5 at a time).')} {'\n'}
{t('you_can_drag_drop_pictures', 'You can also drag & drop pictures.')}
</div>
<div className="forceChange">{btn}</div>
</>
@ -474,7 +474,7 @@ export const MediaBox: FC<{
onClick={() => modals.closeCurrent()}
className="cursor-pointer h-[52px] px-[20px] items-center justify-center border border-newTextColor/10 flex rounded-[10px]"
>
Cancel
{t('cancel', 'Cancel')}
</button>
{!isLoading && !!data?.results?.length && (
<button
@ -542,6 +542,7 @@ export const MultiMediaComponent: FC<{
} = props;
const user = useUser();
const modals = useModals();
const t = useT();
useEffect(() => {
if (value) {
setCurrentMedia(value);
@ -576,7 +577,7 @@ export const MultiMediaComponent: FC<{
);
const showModal = useCallback(() => {
modals.openModal({
title: 'Media Library',
title: t('media_library', 'Media Library'),
askClose: false,
closeOnEscape: true,
fullScreen: true,
@ -586,7 +587,7 @@ export const MultiMediaComponent: FC<{
<MediaBox setMedia={changeMedia} closeModal={close} />
),
});
}, [changeMedia]);
}, [changeMedia, t]);
const clearMedia = useCallback(
(topIndex: number) => () => {
@ -606,16 +607,15 @@ export const MultiMediaComponent: FC<{
if (!!user?.tier?.ai && !dummy) {
modals.openModal({
askClose: false,
title: 'Design Media',
title: t('design_media', 'Design Media'),
size: '80%',
children: (close) => (
<Polonto setMedia={changeMedia} closeModal={close} />
),
});
}
}, [changeMedia]);
}, [changeMedia, t]);
const t = useT();
return (
<>
@ -641,7 +641,7 @@ export const MultiMediaComponent: FC<{
<div
onClick={async () => {
modals.openModal({
title: 'Media Settings',
title: t('media_settings', 'Media Settings'),
children: (close) => (
<MediaComponentInner
media={media as any}
@ -790,7 +790,7 @@ export const MediaComponent: FC<{
const showDesignModal = useCallback(() => {
modals.openModal({
title: 'Media Editor',
title: t('media_editor', 'Media Editor'),
askClose: false,
closeOnEscape: true,
fullScreen: true,
@ -805,7 +805,7 @@ export const MediaComponent: FC<{
/>
),
});
}, []);
}, [t]);
const changeMedia = useCallback((m: { path: string; id: string }[]) => {
setCurrentMedia(m[0]);
onChange({
@ -817,7 +817,7 @@ export const MediaComponent: FC<{
}, []);
const showModal = useCallback(() => {
modals.openModal({
title: 'Media Library',
title: t('media_library', 'Media Library'),
askClose: false,
closeOnEscape: true,
fullScreen: true,
@ -827,7 +827,7 @@ export const MediaComponent: FC<{
<MediaBox setMedia={changeMedia} closeModal={close} type={type} />
),
});
}, []);
}, [t]);
const clearMedia = useCallback(() => {
setCurrentMedia(undefined);
onChange({

View File

@ -1,6 +1,5 @@
'use client';
import dayjs from 'dayjs';
export interface Root {
id: string;
buyerId: string;
@ -63,6 +62,7 @@ export const Message: FC<{
}> = (props) => {
const { message, seller, buyer, scrollDown } = props;
const user = useUser();
const t = useT();
const amITheBuyerOrSeller = useMemo(() => {
return user?.id === buyer?.id ? 'BUYER' : 'SELLER';
}, [buyer, user]);
@ -107,7 +107,7 @@ export const Message: FC<{
</div>
<div className="flex-1 flex flex-col max-w-[534px] gap-[10px]">
<div className="flex gap-[10px] items-center">
<div>{isMe ? 'Me' : person?.name}</div>
<div>{isMe ? t('me', 'Me') : person?.name}</div>
<div className="w-[6px] h-[6px] bg-customColor34 rounded-full" />
<div className="text-[14px] text-inputText">{time}</div>
</div>
@ -235,7 +235,7 @@ export const Messages = () => {
)}
</div>
<div className="text-[20px] flex-1">
{showFrom?.name || 'Noname'}
{showFrom?.name || t('noname', 'Noname')}
</div>
<div>
<OrderTopActions />

View File

@ -10,10 +10,8 @@ import React, {
ClipboardEvent,
forwardRef,
useImperativeHandle,
Fragment,
} from 'react';
import clsx from 'clsx';
import { useUser } from '@gitroom/frontend/components/layout/user.context';
import { makeId } from '@gitroom/nestjs-libraries/services/make.is';
import EmojiPicker from 'emoji-picker-react';
import { Theme } from 'emoji-picker-react';
@ -41,7 +39,6 @@ import {
EditorContent,
Extension,
mergeAttributes,
Node,
} from '@tiptap/react';
import Document from '@tiptap/extension-document';
import Bold from '@tiptap/extension-bold';
@ -100,6 +97,7 @@ export const EditorWrapper: FC<{
totalPosts: number;
value: string;
}> = () => {
const t = useT();
const {
setGlobalValueText,
setInternalValueText,
@ -277,14 +275,14 @@ export const EditorWrapper: FC<{
const goBackToGlobal = useCallback(async () => {
if (
await deleteDialog(
'This action is irreversible. Are you sure you want to go back to global mode?',
'Yes, go back to global mode'
t('are_you_sure_go_back_to_global_mode', 'This action is irreversible. Are you sure you want to go back to global mode?'),
t('yes_go_back_to_global_mode', 'Yes, go back to global mode')
)
) {
setLoaded(false);
addRemoveInternal(current);
}
}, [addRemoveInternal, current]);
}, [addRemoveInternal, current, t]);
const addValue = useCallback(
(index: number) => () => {
@ -319,8 +317,8 @@ export const EditorWrapper: FC<{
(index: number) => async () => {
if (
!(await deleteDialog(
'Are you sure you want to delete this post?',
'Yes, delete it!'
t('are_you_sure_delete_this_post', 'Are you sure you want to delete this post?'),
t('yes_delete_it', 'Yes, delete it!')
))
) {
return;
@ -334,7 +332,7 @@ export const EditorWrapper: FC<{
deleteGlobalValue(index);
setLoaded(false);
},
[current, global, internal]
[current, global, internal, t]
);
if (!loaded || !loadedState) {
@ -360,7 +358,7 @@ export const EditorWrapper: FC<{
<div className="w-[54px] h-[54px] rounded-full bg-newSettings opacity-80" />
</div>
<div className="text-[14px] font-[600] text-white">
You can't edit networks when creating a set
{t('cant_edit_networks_when_creating_set', "You can't edit networks when creating a set")}
</div>
</div>
<div className="absolute w-full h-full left-0 top-0 bg-newBackdrop opacity-60 z-[100] rounded-[12px]" />
@ -382,13 +380,11 @@ export const EditorWrapper: FC<{
<div className="w-[54px] h-[54px] rounded-full bg-newSettings opacity-80" />
</div>
<div className="text-[14px] font-[600] text-white">
Click this button to exit global editing
<br />
and customize the post for this channel
{t('click_to_exit_global_editing', 'Click this button to exit global editing and customize the post for this channel')}
</div>
<div>
<div className="text-white rounded-[8px] h-[44px] px-[20px] bg-[#D82D7E] cursor-pointer flex justify-center items-center">
Edit content
{t('edit_content', 'Edit content')}
</div>
</div>
</div>
@ -453,7 +449,7 @@ export const EditorWrapper: FC<{
<div className="flex gap-[6px] items-center">
<div className="w-[8px] h-[8px] rounded-full bg-[#FC69FF]" />
<div className="text-[14px] font-[600]">
Editing a Specific Network
{t('editing_a_specific_network', 'Editing a Specific Network')}
</div>
</div>
<div className="flex gap-[6px] items-center">
@ -461,7 +457,7 @@ export const EditorWrapper: FC<{
<ResetIcon />
</div>
<div className="text-[13px] font-[600]">
Back to global
{t('back_to_global', 'Back to global')}
</div>
</div>
</div>
@ -483,7 +479,7 @@ export const EditorWrapper: FC<{
<TrashIcon
onClick={deletePost(index)}
data-tooltip-id="tooltip"
data-tooltip-content="Delete Post"
data-tooltip-content={t('delete_post_tooltip', 'Delete Post')}
className="cursor-pointer text-[#FF3F3F]"
/>
)}
@ -626,14 +622,14 @@ export const Editor: FC<{
>
<div className="relative cursor-text flex flex-1 flex-col">
<div {...getRootProps()} className="flex flex-1 flex-col">
<div
className={clsx(
'absolute left-0 top-0 w-full h-full bg-black/70 z-[300] transition-all items-center justify-center flex text-white text-sm',
!isDragActive ? 'pointer-events-none opacity-0' : 'opacity-100'
)}
>
Drop your files here to upload
</div>
<div
className={clsx(
'absolute left-0 top-0 w-full h-full bg-black/70 z-[300] transition-all items-center justify-center flex text-white text-sm',
!isDragActive ? 'pointer-events-none opacity-0' : 'opacity-100'
)}
>
{t('drop_files_here_to_upload', 'Drop your files here to upload')}
</div>
<div className="px-[10px] pt-[10px] bg-newBgColorInner rounded-t-[6px] relative z-[99]">
<OnlyEditor
value={props.value}
@ -725,7 +721,7 @@ export const Editor: FC<{
)}
<div
data-tooltip-id="tooltip"
data-tooltip-content="Insert Emoji"
data-tooltip-content={t('insert_emoji', 'Insert Emoji')}
className="select-none cursor-pointer rounded-[6px] w-[30px] h-[30px] bg-newColColor flex justify-center items-center"
onClick={() => setEmojiPickerOpen(!emojiPickerOpen)}
>
@ -781,6 +777,7 @@ export const OnlyEditor = forwardRef<
paste?: (event: ClipboardEvent | File[]) => void;
}
>(({ editorType, value, onChange, paste }, ref) => {
const t = useT();
const fetch = useFetch();
const { internal } = useLaunchStore(
@ -831,7 +828,7 @@ export const OnlyEditor = forwardRef<
BulletList,
ListItem,
Placeholder.configure({
placeholder: 'Write something …',
placeholder: t('write_something', 'Write something …'),
emptyEditorClass: 'is-editor-empty',
}),
...(editorType === 'html' || editorType === 'markdown'

View File

@ -100,20 +100,20 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
const currentIntegration = integrations.find((p) => p.id === current)!;
return (
<div className="flex items-center gap-[10px]">
<div className="relative">
<img
src={`/icons/platforms/${currentIntegration.identifier}.png`}
className="w-[20px] h-[20px] rounded-[4px]"
alt={currentIntegration.identifier}
/>
<SettingsIcon
size={15}
className="text-white absolute -end-[5px] -bottom-[5px]"
/>
<div className="flex items-center gap-[10px]">
<div className="relative">
<img
src={`/icons/platforms/${currentIntegration.identifier}.png`}
className="w-[20px] h-[20px] rounded-[4px]"
alt={currentIntegration.identifier}
/>
<SettingsIcon
size={15}
className="text-white absolute -end-[5px] -bottom-[5px]"
/>
</div>
<div>{currentIntegration.name} {t('channel_settings', 'Settings')}</div>
</div>
<div>{currentIntegration.name} Settings</div>
</div>
);
}, [current]);
@ -158,8 +158,8 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
setLoading(true);
if (
!(await deleteDialog(
'Are you sure you want to delete this post?',
'Yes, delete it!'
t('are_you_sure_you_want_to_delete_post', 'Are you sure you want to delete this post?'),
t('yes_delete_it', 'Yes, delete it!')
))
) {
setLoading(false);
@ -193,7 +193,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
toaster.show(
'' +
item.integration.name +
' Your post should have at least one character or one image.',
' ' + t('post_needs_content_or_image', 'Your post should have at least one character or one image.'),
'warning'
);
setLoading(false);
@ -203,7 +203,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
for (const item of checkAllValid) {
if (item.valid === false) {
toaster.show('Please fix your settings', 'warning');
toaster.show(t('please_fix_your_settings', 'Please fix your settings'), 'warning');
item.fix();
setLoading(false);
setShowSettings(true);
@ -240,7 +240,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
for (const item of sliceNeeded) {
toaster.show(
`${item?.integration?.name} (${item?.integration?.identifier}) post is too long, please fix it`,
`${item?.integration?.name} (${item?.integration?.identifier}) ${t('post_is_too_long', 'post is too long, please fix it')}`,
'warning'
);
item.preview();
@ -265,8 +265,8 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
const shortLink = !shortLinkUrl.ask
? false
: await deleteDialog(
'Do you want to shortlink the URLs? it will let you get statistics over clicks',
'Yes, shortlink it!'
t('shortlink_urls_question', 'Do you want to shortlink the URLs? it will let you get statistics over clicks'),
t('yes_shortlink_it', 'Yes, shortlink it!')
);
const group = existingData.group || makeId(10);
@ -327,8 +327,8 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
mutate();
toaster.show(
!existingData.integration
? 'Added successfully'
: 'Updated successfully'
? t('added_successfully', 'Added successfully')
: t('updated_successfully', 'Updated successfully')
);
}
if (customClose) {
@ -349,9 +349,9 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
<div className="w-full h-full flex-1 p-[40px] flex relative">
<div className="flex flex-1 bg-newBgColorInner rounded-[20px] flex-col">
<div className="flex-1 flex">
<div className="flex flex-col flex-1 border-r border-newBorder">
<div className="bg-newBgColor h-[65px] rounded-tl-[20px] flex items-center px-[20px] text-[20px] font-[600]">
Create Post
<div className="flex flex-col flex-1 border-e border-newBorder">
<div className="bg-newBgColor h-[65px] rounded-s-[20px] !rounded-b-[0] flex items-center px-[20px] text-[20px] font-[600]">
{t('create_post_title', 'Create Post')}
</div>
<div className="flex-1 flex flex-col gap-[16px]">
<div
@ -359,7 +359,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
>
<div
id="social-content"
className="gap-[32px] flex flex-col pr-[8px] pt-[20px] pl-[20px] absolute top-0 left-0 w-full h-full overflow-x-hidden overflow-y-scroll scrollbar scrollbar-thumb-newColColor scrollbar-track-newBgColorInner"
className="gap-[32px] flex flex-col pe-[8px] pt-[20px] ps-[20px] absolute top-0 left-0 w-full h-full overflow-x-hidden overflow-y-scroll scrollbar scrollbar-thumb-newColColor scrollbar-track-newBgColorInner"
>
<div className="flex w-full">
<div className="flex flex-1">
@ -434,16 +434,16 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
</div>
</div>
<div className="w-[580px] flex flex-col">
<div className="bg-newBgColor h-[65px] rounded-tr-[20px] flex items-center px-[20px] text-[20px] font-[600]">
<div className="flex-1">Post Preview</div>
<div className="bg-newBgColor h-[65px] rounded-e-[20px] !rounded-b-[0] flex items-center px-[20px] text-[20px] font-[600]">
<div className="flex-1">{t('post_preview', 'Post Preview')}</div>
<div className="cursor-pointer">
<CloseIcon onClick={askClose} className="text-[#A3A3A3]" />
</div>
</div>
<div className="flex-1 relative">
<Scrollable
scrollClasses="!pr-[20px]"
className="absolute top-0 p-[20px] pr-[8px] left-0 w-full h-full overflow-x-hidden overflow-y-scroll scrollbar scrollbar-thumb-newColColor scrollbar-track-newBgColorInner"
scrollClasses="!pe-[20px]"
className="absolute top-0 p-[20px] pe-[8px] left-0 w-full h-full overflow-x-hidden overflow-y-scroll scrollbar scrollbar-thumb-newColColor scrollbar-track-newBgColorInner"
>
<ShowAllProviders ref={ref} />
</Scrollable>
@ -451,7 +451,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
</div>
</div>
<div className="select-none h-[84px] py-[20px] border-t border-newBorder flex items-center">
<div className="flex-1 flex pl-[20px] gap-[8px]">
<div className="flex-1 flex ps-[20px] gap-[8px]">
{!dummy && (
<TagsComponent
name="tags"
@ -467,7 +467,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
<RepeatComponent repeat={repeater} onChange={setRepeater} />
)}
</div>
<div className="pr-[20px] flex items-center justify-end gap-[8px]">
<div className="pe-[20px] flex items-center justify-end gap-[8px]">
{existingData?.integration && (
<button
onClick={deletePost}
@ -476,7 +476,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
<div>
<TrashIcon />
</div>
<div>Delete Post</div>
<div>{t('delete_post', 'Delete Post')}</div>
</button>
)}
<DatePicker onChange={setDate} date={date} />
@ -488,12 +488,12 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
onClick={schedule('draft')}
className="cursor-pointer disabled:cursor-not-allowed px-[20px] h-[44px] bg-btnSimple justify-center items-center flex rounded-[8px] text-[15px] font-[600]"
>
Save as Draft
{t('save_as_draft', 'Save as Draft')}
</button>
)}
{addEditSets && (
<button
className="text-white text-[15px] font-[600] min-w-[180px] btnSub disabled:cursor-not-allowed disabled:opacity-80 outline-none gap-[8px] flex justify-center items-center h-[44px] rounded-[8px] bg-[#612BD3] pl-[20px] pr-[16px]"
className="text-white text-[15px] font-[600] min-w-[180px] btnSub disabled:cursor-not-allowed disabled:opacity-80 outline-none gap-[8px] flex justify-center items-center h-[44px] rounded-[8px] bg-[#612BD3] ps-[20px] pe-[16px]"
disabled={
selectedIntegrations.length === 0 || loading || locked
}
@ -509,13 +509,13 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
selectedIntegrations.length === 0 || loading || locked
}
onClick={schedule('schedule')}
className="text-white min-w-[180px] btnSub disabled:cursor-not-allowed disabled:opacity-80 outline-none gap-[8px] flex justify-center items-center h-[44px] rounded-[8px] bg-[#612BD3] pl-[20px] pr-[16px]"
className="text-white min-w-[180px] btnSub disabled:cursor-not-allowed disabled:opacity-80 outline-none gap-[8px] flex justify-center items-center h-[44px] rounded-[8px] bg-[#612BD3] ps-[20px] pe-[16px]"
>
<div className="text-[15px] font-[600]">
{selectedIntegrations.length === 0
? 'Check the circles above'
? t('check_circles_above', 'Check the circles above')
: dummy
? 'Create output'
? t('create_output', 'Create output')
: !existingData?.integration
? t('add_to_calendar', 'Add to calendar')
: existingData?.posts?.[0]?.state === 'DRAFT'
@ -538,7 +538,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
className="rounded-[8px] z-[300] disabled:cursor-not-allowed disabled:opacity-80 hidden group-hover:flex absolute bottom-[100%] -left-[12px] p-[12px] w-[206px] bg-newBgColorInner"
>
<div className="text-white rounded-[8px] bg-[#D82D7E] h-[44px] w-full flex justify-center items-center post-now">
Post Now
{t('post_now', 'Post Now')}
</div>
</button>
)}
@ -562,8 +562,8 @@ Post content can be added using the addPostContentFor{num} function.
After using the addPostFor{num} it will create a new addPostContentFor{num+ 1} function.
`}
labels={{
title: 'Your Assistant',
initial: 'Hi! I can help you to refine your social media posts.',
title: t('your_assistant', 'Your Assistant'),
initial: t('assistant_initial_message', 'Hi! I can help you to refine your social media posts.'),
}}
/>
</div>

View File

@ -1,7 +1,8 @@
'use client';
import React, { FC, useEffect, useImperativeHandle, useState } from 'react';
import { computePosition, flip, shift } from '@floating-ui/dom';
import { posToDOMRect, ReactRenderer } from '@tiptap/react';
import { timer } from '@gitroom/helpers/utils/timer';
// Debounce utility for TipTap
const debounce = <T extends any[]>(
@ -93,7 +94,7 @@ const MentionList: FC = (props: any) => {
) : (
props?.items?.map((item: any, index: any) => (
<button
className={`flex gap-[10px] w-full p-2 text-left rounded hover:bg-gray-100 ${
className={`flex gap-[10px] w-full p-2 text-start rounded hover:bg-gray-100 ${
index === selectedIndex ? 'bg-blue-100' : ''
}`}
key={item.id || index}

View File

@ -6,6 +6,7 @@ import clsx from 'clsx';
import Image from 'next/image';
import { useShallow } from 'zustand/react/shallow';
import { GlobalIcon } from '@gitroom/frontend/components/ui/icons';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
export function useHasScroll(ref: RefObject<HTMLElement>): boolean {
const [hasHorizontalScroll, setHasHorizontalScroll] = useState(false);
@ -144,6 +145,7 @@ export const SelectCurrent: FC = () => {
};
export const IsGlobal: FC<{ id: string }> = ({ id }) => {
const t = useT();
const { isInternal } =
useLaunchStore(
useShallow((state) => ({
@ -158,7 +160,7 @@ export const IsGlobal: FC<{ id: string }> = ({ id }) => {
return (
<div
data-tooltip-id="tooltip"
data-tooltip-content="No longer in global mode"
data-tooltip-content={t('no_longer_global_mode', 'No longer in global mode')}
className="w-[8px] h-[8px] bg-[#FC69FF] -top-[1px] -end-[3px] absolute rounded-full"
/>
);

View File

@ -7,12 +7,12 @@ import { Button } from '@gitroom/react/form/button';
import { ConnectChannels } from '@gitroom/frontend/components/onboarding/connect.channels';
import { useVariables } from '@gitroom/react/helpers/variable.context';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
import { ModalWrapperComponent } from '@gitroom/frontend/components/new-launch/modal.wrapper.component';
const Welcome: FC = () => {
const { isGeneral } = useVariables();
const [step, setStep] = useState(1);
const router = useRouter();
const t = useT();
const goToLaunches = useCallback(() => {
router.push('/launches');
@ -24,7 +24,7 @@ const Welcome: FC = () => {
<div>
<ConnectChannels />
<div className="flex justify-end gap-[8px]">
<Button onClick={goToLaunches}>Close</Button>
<Button onClick={goToLaunches}>{t('close', 'Close')}</Button>
</div>
</div>
)}

View File

@ -1,3 +1,5 @@
'use client';
import { Button } from '@gitroom/react/form/button';
import { useFetch } from '@gitroom/helpers/utils/custom.fetch';
import useSWR from 'swr';
@ -5,7 +7,6 @@ import React, { useCallback, useMemo } from 'react';
import { useUser } from '@gitroom/frontend/components/layout/user.context';
import { capitalize } from 'lodash';
import { useModals } from '@gitroom/frontend/components/layout/new-modal';
import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component';
import { Input } from '@gitroom/react/form/input';
import { useForm, FormProvider, useWatch } from 'react-hook-form';
import { Select } from '@gitroom/react/form/select';
@ -16,6 +17,7 @@ import { useToaster } from '@gitroom/react/toaster/toaster';
import { deleteDialog } from '@gitroom/react/helpers/delete.dialog';
import copy from 'copy-to-clipboard';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
const roles = [
{
name: 'User',
@ -56,12 +58,12 @@ export const AddMember = () => {
).json();
if (values.sendEmail) {
modals.closeAll();
toast.show('Invitation link sent');
toast.show(t('invitation_link_sent', 'Invitation link sent'));
return;
}
copy(url);
modals.closeAll();
toast.show('Link copied to clipboard');
toast.show(t('link_copied_to_clipboard', 'Link copied to clipboard'));
},
[]
);
@ -96,7 +98,7 @@ export const AddMember = () => {
</div>
</div>
<Button type="submit" className="mt-[18px]">
{sendEmail ? 'Send Invitation Link' : 'Copy Link'}
{sendEmail ? t('send_invitation_link', 'Send Invitation Link') : t('copy_link', 'Copy Link')}
</Button>
</div>
</form>
@ -107,6 +109,7 @@ export const TeamsComponent = () => {
const fetch = useFetch();
const user = useUser();
const modals = useModals();
const t = useT();
const myLevel = user?.role === 'USER' ? 0 : user?.role === 'ADMIN' ? 1 : 2;
const getLevel = useCallback(
(role: 'USER' | 'ADMIN' | 'SUPERADMIN') =>
@ -128,11 +131,11 @@ export const TeamsComponent = () => {
classNames: {
modal: 'bg-transparent text-textColor',
},
title: 'Add Team Member',
title: t('top_title_add_member', 'Add Member'),
withCloseButton: true,
children: <AddMember />,
});
}, []);
}, [t]);
const { data, mutate } = useSWR('/api/teams', loadTeam, {
revalidateOnFocus: false,
revalidateOnReconnect: false,
@ -147,7 +150,7 @@ export const TeamsComponent = () => {
async () => {
if (
!(await deleteDialog(
'Are you sure you want to remove this team member?'
t('are_you_sure_remove_team_member', 'Are you sure you want to remove this team member?')
))
) {
return;
@ -157,11 +160,9 @@ export const TeamsComponent = () => {
});
await mutate();
},
[]
[t]
);
const t = useT();
return (
<div className="flex flex-col">
<h3 className="text-[20px]">{t('team_members', 'Team Members')}</h3>
@ -180,10 +181,10 @@ export const TeamsComponent = () => {
</div>
<div className="flex-1">
{p.role === 'USER'
? 'User'
? t('user', 'User')
: p.role === 'ADMIN'
? 'Admin'
: 'Super Admin'}
? t('admin', 'Admin')
: t('super_admin', 'Super Admin')}
</div>
{+myLevel > +getLevel(p.role) ? (
<div className="flex-1 flex justify-end">

View File

@ -1,10 +1,11 @@
import React, { FC, Fragment, useCallback, useMemo, useState } from 'react';
'use client';
import React, { FC, Fragment, useCallback, useState } from 'react';
import { useFetch } from '@gitroom/helpers/utils/custom.fetch';
import useSWR from 'swr';
import { useUser } from '@gitroom/frontend/components/layout/user.context';
import { Button } from '@gitroom/react/form/button';
import { useModals } from '@gitroom/frontend/components/layout/new-modal';
import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component';
import { Input } from '@gitroom/react/form/input';
import { FormProvider, useForm } from 'react-hook-form';
import { array, object, string } from 'yup';
@ -15,11 +16,13 @@ import { useToaster } from '@gitroom/react/toaster/toaster';
import clsx from 'clsx';
import { deleteDialog } from '@gitroom/react/helpers/delete.dialog';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
export const Webhooks: FC = () => {
const fetch = useFetch();
const user = useUser();
const modal = useModals();
const toaster = useToaster();
const t = useT();
const list = useCallback(async () => {
return (await fetch('/webhooks')).json();
}, []);
@ -27,12 +30,12 @@ export const Webhooks: FC = () => {
const addWebhook = useCallback(
(data?: any) => () => {
modal.openModal({
title: data ? 'Update webhook' : 'Add webhook',
title: data ? t('update_webhook', 'Update webhook') : t('add_webhook', 'Add webhook'),
withCloseButton: true,
children: <AddOrEditWebhook data={data} reload={mutate} />,
});
},
[]
[t]
);
const deleteHook = useCallback(
(data: any) => async () => {
@ -49,14 +52,12 @@ export const Webhooks: FC = () => {
method: 'DELETE',
});
mutate();
toaster.show('Webhook deleted successfully', 'success');
toaster.show(t('webhook_deleted_successfully', 'Webhook deleted successfully'), 'success');
}
},
[]
);
const t = useT();
return (
<div className="flex flex-col">
<h3 className="text-[20px]">
@ -116,13 +117,13 @@ const details = object().shape({
url: string().url().required(),
integrations: array(),
});
const options = [
const getWebhookOptions = (t: (key: string, fallback: string) => string) => [
{
label: 'All integrations',
label: t('all_integrations', 'All integrations'),
value: 'all',
},
{
label: 'Specific integrations',
label: t('specific_integrations', 'Specific integrations'),
value: 'specific',
},
];
@ -132,6 +133,8 @@ export const AddOrEditWebhook: FC<{
}> = (props) => {
const { data, reload } = props;
const fetch = useFetch();
const t = useT();
const options = getWebhookOptions(t);
const [allIntegrations, setAllIntegrations] = useState(
(data?.integrations?.length || 0) > 0 ? options[1] : options[0]
);
@ -184,8 +187,8 @@ export const AddOrEditWebhook: FC<{
});
toast.show(
data?.id
? 'Webhook updated successfully'
: 'Webhook added successfully',
? t('webhook_updated_successfully', 'Webhook updated successfully')
: t('webhook_added_successfully', 'Webhook added successfully'),
'success'
);
modal.closeAll();
@ -195,7 +198,7 @@ export const AddOrEditWebhook: FC<{
);
const sendTest = useCallback(async () => {
const url = form.getValues('url');
toast.show('Webhook send', 'success');
toast.show(t('webhook_sent', 'Webhook send'), 'success');
try {
await fetch(`/webhooks/send?url=${encodeURIComponent(url)}`, {
method: 'POST',
@ -238,8 +241,6 @@ export const AddOrEditWebhook: FC<{
}
}, []);
const t = useT();
return (
<FormProvider {...form}>
<form onSubmit={form.handleSubmit(callBack)}>

124
i18n.lock
View File

@ -540,3 +540,127 @@ checksums:
billing_pay_0_start_trial: 28e72154e6cce7541e707b35f3a67309
billing_pay_now: 50cb14454e1b2df4a2f83bf1ac799819
billing_per_month: 6293d01c3d13f6938d47285122bd1a48
select_channels: 3aab82dc90ccafe55059c32c5a33c222
start_a_new_chat: 65b9067206fa4e4929d48ce242d879a6
your_assistant: bd6422d1c2a2ba461e1da169b082bf7b
agent_welcome_message: 21c75c6cdb64a5e2d4d9ac6a9b04b7ad
last_github_trending: 893235fc69e91abe15960108dcd77d7b
next_predicted_github_trending: 2e718a5c1acdad0c058440d0a70a0ea6
repository: 28c2debe822a225389ff8710934abff4
date: 56f41c5d30a76295bb087b20b7bee4c3
total_stars: 28e8ab506d02f06489ba8cee96da6083
total_forks: 79df39bca889feadf97b7963560574c6
continue_with: 6f825c6ccb2974ef5289b0aa84f9aff7
email_address: 0ee22bbbe989a0c61a18023407d12dc2
email_already_exists: ad25f0ca7a16c0d37e566a9c090a0fd2
google: 6cc462fb53d90d404f48d5a6695c1de1
farcaster: b09af25fcb497663e8594b9fc514b969
edit_autopost: 2cde36144cddda0acc069e6913e095f9
add_autopost_title: d018d5d12c9f41c0b610da4b101d77e9
webhook_deleted_successfully: fcefd247ec76a372002d2cffac3c5b0f
all_integrations: 7605d915dd24362c1cb9ec769dee3888
specific_integrations: fb3040ce68e4f41a8ac5e9a53d69a1e5
post_on_next_available_slot: abb1a1cd887b1e36f7b72e249b0e3e2e
post_immediately: ea58c7d158b37d944a894f90ac098eca
could_not_use_rss_feed: 9884cf220241440a4d635e5d39aa1c69
rss_valid: 592dc400803f044bb77eb92e8f241acb
autopost_updated_successfully: eb9b6518aa38dd4011435fbd8358d570
autopost_added_successfully: c83af96759f9baa9059984501ea33f73
write_your_post_placeholder: 0f4d124dbef4685590d5a95af3b5df64
select_or_upload_pictures_max_5: af063197b75e970f03303afcce5bde63
you_can_drag_drop_pictures: d41ac7a74ca936f4b388af721830f9d9
you_dont_have_any_media_yet: 59257169efa001e5dc0a7bf67867f77e
media_library: 2b05965bcc34712a764496206514c087
media_settings: 6f1f271ae8845b19f961e54206dde3bf
media_editor: de25325f8f2dd32ada6fde72e657ab59
close: 2c2e22f8424a1031de89063bd0022e16
me: e0cdc99c6c88fe486dbd78d9d366b788
noname: 90d26318cd738264fac16f6e59905d49
password_reset_link_expired: fce5f6a7e85fdc08ef0e6fe8d04cac87
invalid_api_key: cb0881df33e293f5f28e6b8677d24cc6
could_not_connect_to_platform: f778f0b7c8e3583a010e748f0bd68a7a
web3_provider: d748b2fb275a0cc1263030377543762c
add_provider_title: edbf2eb94542bde00e1da93999e667a1
profile_updated: 4a55423a795e43ff4bd1a8b3956de4b9
sets: a8e00731555775ef06d2d8933898c457
invitation_link_sent: 3d67ff64ec205998378cf7c8f124799f
send_invitation_link: 8eccac7afd966c2bf358b9e04fb02ee8
copy_link: 57a37acfe6d7ed71d00fbbc8079fbb35
are_you_sure_remove_team_member: fdd24783fdaefbfcd8150d51d088cc9d
admin: 90eb20f1400db82ab874744e47836dc6
super_admin: 6f8651907beb1156db8c3bb5a7d5d791
update_webhook: 7c761650a21097d9738cdef4a382a9d4
add_webhook: f8fa42d8c95936075e05ad238fd03467
webhook_updated_successfully: d67dc42810694fd1344a9a9545aca1e7
webhook_added_successfully: 2d8e8d7a158ea8e4b65e67900363527b
webhook_sent: 6ced91337118dc0efbf07668ae843380
today: 142173f9752e18e92109623a3ee68cad
channel_disconnected_click_to_reconnect: 404a3150eb00bf6dff15dab467ddeb3c
channel_disabled_upgrade_plan: 6ef222177df5034474096ad41375fd28
channel_added: 2f77e6b11433d4dc3f44dc8ae1140999
are_you_sure_disable_channel: 737398b5c5c3ca14b14eb3ba178f1781
disable_channel_title: a2d862c419b9fff01f72481499431341
channel_disabled: 67dbc2759aad3c5d3f67c09d7241645a
are_you_sure_delete_channel: ffd1e325a87cb148609263fe1b86effb
delete_channel_title: e179ddd5c85d4ad9bfc067107473fc04
delete_posts_before_channel: 4248eca31cde87c71d03f3f787324288
channel_deleted: b8aa2e7bd6ada3f5d51f5c6b3dca4d1d
channel_enabled: 26f6c39e1247322f9e63420a2703dbfd
time_table_slots: ba2e44486ebe947322acc78d3bc05a3a
channel_id_copied: 58bf6a74adf570a5daf233ce496149de
settings_updated: 260e10a61200b581616d766f3af5ae52
customer_updated: ab17bcd115b14b72bb2e89f2b48883a4
custom_url: f1e4e1c6a386d212abe94b937cf5e812
picture: 14818ef364a0ecc8b738bdb23c46b3c3
upgrade_required: 460dbea5061a1aba2080ffdecdf9544c
move_to_billing: e8fe4bf664cfb029e3e5ccb14cd4f86f
payment_required: 3acec87fe94c0bdb92b35e3081f45061
no_content: 1d2af798c895527a7f8a4c72c2571fdd
select_customer_tooltip: 1cd2f6f08560b7ebcc9285e845557673
customers: c31a0dfd0d92496ba6f5673781db24ef
hour: ec3113f22fc51d01f0c615c5496f8f87
minutes: c5442938e948e2e3937fb812cf68869c
updated: 8aa8ff2dc2977ca4b269e80a513100b4
change_bot_picture_title: 6ff9b68f0d29f9477a300b9042be0d4d
select_customer_label: 1cd2f6f08560b7ebcc9285e845557673
start_typing: b350b435f6d1cacadcaee99c862f2a19
choose_set_or_continue: 06611847f691e5374844289a4ed61059
continue_without_set: 96b7adb0defee5f96a9f8cd89150710c
select_set: 6723a7be7156d364ceaea2aa709f8d61
channel_settings: 8df6777277469c1fd88cc18dde2f1cc3
post_needs_content_or_image: e7a0d63d2931ca540ceea25c6d4df7ec
please_fix_your_settings: 41c970bc73bb775e8b1882dfdbaad569
shortlink_urls_question: 5308003901830e666ff9915b4855a9c9
yes_shortlink_it: b784b6f9ce6d5eec451de7f3c7f1e01d
added_successfully: 5a1557f26138d3f80b6449d4570d47a9
updated_successfully: fb4e4de59015fd30331e0f56c63918c5
create_post_title: 06549e1cb8bbba2645f5ded68259684d
post_preview: fe8a07b5e03233de2e8dbedb205bd824
check_circles_above: 18f66bbfa1607a87dff3b30a01639ad5
create_output: 2c2908912452a1510fd67f9151c6f7f4
assistant_initial_message: ac5658f3e6f50edf9f2e1ec331fc0bef
no_longer_global_mode: 166b528448bb464bfb7aff18c8eb6d0e
two_days: c0422dbabbbd18a7806dc2fa46a78ac6
three_days: 543b7c228c228eca588939eba3071af2
four_days: 29132e6b3311d11143ea8cf9fbffef2a
five_days: 87d5f0cb4569d52bd952007ae0a55ac2
six_days: 988ffdb8c75a33301ae2aa598c911838
two_weeks: 2535083efa302c3dde7d06cce2455b74
repeat_post_every_label: f3e3fd4d95a0eeaf1eab0219278ae812
add_new_tag: 911360b396ef6db7a24eb53134f0f7d2
tag_name: 9368b5a047572b6051f334af5aa76819
post_is_too_long: 7784c6ecca2c7e58665e83e219aff80b
your_post_should_have_at_least_one_character_or_one_image: e7a0d63d2931ca540ceea25c6d4df7ec
internal_edit: 04ed5d507cfed7c4f348df338c106809
are_you_sure_go_back_to_global_mode: e7e0913ac6a8bdecd5a9349ad84d2f3c
yes_go_back_to_global_mode: 50484cd2f72d76bd6a02d5ac956ba466
are_you_sure_delete_this_post: 25e67cb71ee64bf67af09ee20257655f
cant_edit_networks_when_creating_set: 10c389a15c85e82b69f3202bcd8fc527
click_to_exit_global_editing: fec20b458bec4dcabf3efe65d1e5777b
edit_content: 13b729cc6459ecdc3ea84d476c6dcddd
editing_a_specific_network: 127d93025c413d0074553b55388c8656
back_to_global: db0b2554e15d8a53ce09aed3085a7374
delete_post_tooltip: bcf081392c76d2f2a8522944ddd36b78
drop_files_here_to_upload: a7971302d02a19a461c519cffedfa5e5
insert_emoji: 6e2ab0e239c0ee87d385b1cd17185e00
write_something: bc9257cede62880c411001e61310ca43

View File

@ -40,16 +40,6 @@ export class LinkedinProvider extends SocialAbstract implements SocialProvider {
maxLength() {
return 3000;
}
public override handleErrors(body: string):
| {
type: 'refresh-token' | 'bad-body' | 'retry';
value: string;
}
| undefined {
return undefined;
}
async refreshToken(refresh_token: string): Promise<AuthTokenDetails> {
const {
access_token: accessToken,
@ -390,34 +380,17 @@ export class LinkedinProvider extends SocialAbstract implements SocialProvider {
})
);
// Find the maximum dimensions across all images to use as page size
const maxWidth = Math.max(...imageData.map((data) => data.width));
const maxHeight = Math.max(...imageData.map((data) => data.height));
const pageSize = [maxWidth, maxHeight];
// Use the dimensions of the first image for the PDF page size
// You could also use the largest dimensions if you prefer
const firstImageDimensions = imageData[0];
const pageSize = [firstImageDimensions.width, firstImageDimensions.height];
// Resize all images to fit within the page size while maintaining aspect ratio
// and centering them on a white background
const resizedImageBuffers = await Promise.all(
imageData.map(async (data) => {
// If image already matches page size, return as-is but convert to JPEG for consistency
if (data.width === maxWidth && data.height === maxHeight) {
return await sharp(data.buffer).jpeg({ quality: 95 }).toBuffer();
}
// Resize image to fit within page dimensions, then extend with white background to fill page
return await sharp(data.buffer)
.resize(maxWidth, maxHeight, {
fit: 'contain',
background: { r: 255, g: 255, b: 255, alpha: 1 },
})
.jpeg({ quality: 95 })
.toBuffer();
})
// Convert images to PDF with exact image dimensions
const pdfStream = imageToPDF(
imageData.map((data) => data.buffer),
pageSize
);
// Convert images to PDF with consistent page dimensions
const pdfStream = imageToPDF(resizedImageBuffers, pageSize);
// Convert stream to buffer
const pdfBuffer = await this.streamToBuffer(pdfStream);

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "يمكنك الإلغاء في أي وقت.",
"billing_pay_0_start_trial": "ادفع 0 دولار اليوم - ابدأ تجربتك المجانية!",
"billing_pay_now": "ادفع الآن",
"billing_per_month": "/ شهريًا"
"billing_per_month": "/ شهريًا",
"select_channels": "اختر القنوات",
"start_a_new_chat": "ابدأ محادثة جديدة",
"your_assistant": "مساعدك",
"agent_welcome_message": "مرحبًا، أنا وكيل Postiz الخاص بك 🙌🏻.\n\nيمكنني جدولة منشور أو عدة منشورات لعدة قنوات، وتوليد الصور والفيديوهات.\n\nيمكنك اختيار القنوات التي تريد استخدامها من القائمة اليسرى.\n\nيمكنك رؤية محادثاتك السابقة من القائمة اليمنى.\n\nيمكنك أيضًا استخدامي كخادم MCP، تحقق من الإعدادات >> واجهة برمجة التطبيقات العامة (Public API)",
"last_github_trending": "آخر الترندات على Github",
"next_predicted_github_trending": "الترند المتوقع القادم على Github",
"repository": "المستودع",
"date": "التاريخ",
"total_stars": "إجمالي النجوم",
"total_forks": "إجمالي التفرعات",
"continue_with": "المتابعة باستخدام",
"email_address": "عنوان البريد الإلكتروني",
"email_already_exists": "البريد الإلكتروني موجود بالفعل",
"google": "جوجل",
"farcaster": "فاركاستر",
"edit_autopost": "تعديل النشر التلقائي",
"add_autopost_title": "إضافة نشر تلقائي",
"webhook_deleted_successfully": "تم حذف الويب هوك بنجاح",
"all_integrations": "جميع التكاملات",
"specific_integrations": "تكاملات محددة",
"post_on_next_available_slot": "النشر في أول وقت متاح",
"post_immediately": "انشر فورًا",
"could_not_use_rss_feed": "تعذر استخدام موجز RSS هذا",
"rss_valid": "موجز RSS صالح!",
"autopost_updated_successfully": "تم تحديث النشر التلقائي بنجاح",
"autopost_added_successfully": "تمت إضافة النشر التلقائي بنجاح",
"write_your_post_placeholder": "اكتب منشورك...",
"select_or_upload_pictures_max_5": "اختر أو حمّل صورًا (بحد أقصى 5 في المرة الواحدة).",
"you_can_drag_drop_pictures": "يمكنك أيضًا سحب وإفلات الصور.",
"you_dont_have_any_media_yet": "ليس لديك أي وسائط بعد",
"media_library": "مكتبة الوسائط",
"media_settings": "إعدادات الوسائط",
"media_editor": "محرر الوسائط",
"close": "إغلاق",
"me": "أنا",
"noname": "بدون اسم",
"password_reset_link_expired": "انتهت صلاحية رابط إعادة تعيين كلمة المرور. يرجى المحاولة مرة أخرى.",
"invalid_api_key": "مفتاح API غير صالح",
"could_not_connect_to_platform": "تعذر الاتصال بالمنصة",
"web3_provider": "مزود Web3",
"add_provider_title": "إضافة مزود",
"profile_updated": "تم تحديث الملف الشخصي",
"sets": "مجموعات",
"invitation_link_sent": "تم إرسال رابط الدعوة",
"send_invitation_link": "إرسال رابط الدعوة",
"copy_link": "نسخ الرابط",
"are_you_sure_remove_team_member": "هل أنت متأكد أنك تريد إزالة هذا العضو من الفريق؟",
"admin": "مشرف",
"super_admin": "مشرف عام",
"update_webhook": "تحديث Webhook",
"add_webhook": "إضافة ويب هوك",
"webhook_updated_successfully": "تم تحديث الويب هوك بنجاح",
"webhook_added_successfully": "تمت إضافة الويب هوك بنجاح",
"webhook_sent": "تم إرسال الويب هوك",
"today": "اليوم",
"channel_disconnected_click_to_reconnect": "تم فصل القناة، انقر لإعادة الاتصال.",
"channel_disabled_upgrade_plan": "تم تعطيل هذه القناة، يرجى ترقية خطتك لتفعيلها.",
"channel_added": "تمت إضافة القناة",
"are_you_sure_disable_channel": "هل أنت متأكد أنك تريد تعطيل هذه القناة؟",
"disable_channel_title": "تعطيل القناة",
"channel_disabled": "تم تعطيل القناة",
"are_you_sure_delete_channel": "هل أنت متأكد أنك تريد حذف هذه القناة؟",
"delete_channel_title": "حذف القناة",
"delete_posts_before_channel": "يجب عليك حذف جميع المنشورات المرتبطة بهذه القناة قبل حذفها",
"channel_deleted": "تم حذف القناة",
"channel_enabled": "تم تفعيل القناة",
"time_table_slots": "فترات الجدول الزمني",
"channel_id_copied": "تم نسخ معرف القناة إلى الحافظة",
"settings_updated": "تم تحديث الإعدادات",
"customer_updated": "تم تحديث العميل",
"custom_url": "رابط مخصص",
"picture": "صورة",
"upgrade_required": "تحتاج إلى الترقية لاستخدام هذه الميزة",
"move_to_billing": "الانتقال إلى الفوترة",
"payment_required": "الدفع مطلوب",
"no_content": "لا يوجد محتوى",
"select_customer_tooltip": "اختر العميل",
"customers": "العملاء",
"hour": "ساعة",
"minutes": "دقائق",
"updated": "تم التحديث",
"change_bot_picture_title": "تغيير صورة البوت",
"select_customer_label": "اختر العميل",
"start_typing": "ابدأ الكتابة...",
"choose_set_or_continue": "اختر مجموعة أو تابع بدون واحدة",
"continue_without_set": "المتابعة بدون مجموعة",
"select_set": "اختر مجموعة",
"channel_settings": "الإعدادات",
"post_needs_content_or_image": "يجب أن يحتوي منشورك على حرف واحد على الأقل أو صورة واحدة.",
"please_fix_your_settings": "يرجى تصحيح إعداداتك",
"shortlink_urls_question": "هل تريد تقصير الروابط؟ سيسمح لك ذلك بالحصول على إحصائيات حول النقرات",
"yes_shortlink_it": "نعم، قصّر الرابط!",
"added_successfully": "تمت الإضافة بنجاح",
"updated_successfully": "تم التحديث بنجاح",
"create_post_title": "إنشاء منشور",
"post_preview": "معاينة المنشور",
"check_circles_above": "تحقق من الدوائر أعلاه",
"create_output": "إنشاء المخرجات",
"assistant_initial_message": "مرحبًا! يمكنني مساعدتك في تحسين منشوراتك على وسائل التواصل الاجتماعي.",
"no_longer_global_mode": "لم تعد في الوضع العالمي",
"two_days": "يومان",
"three_days": "ثلاثة أيام",
"four_days": "أربعة أيام",
"five_days": "خمسة أيام",
"six_days": "ستة أيام",
"two_weeks": "أسبوعان",
"repeat_post_every_label": "تكرار النشر كل",
"add_new_tag": "إضافة وسم جديد",
"tag_name": "الاسم",
"post_is_too_long": "المنشور طويل جدًا، يرجى تعديله",
"your_post_should_have_at_least_one_character_or_one_image": "يجب أن يحتوي منشورك على حرف واحد على الأقل أو صورة واحدة.",
"internal_edit": "تعديل داخلي",
"are_you_sure_go_back_to_global_mode": "هذا الإجراء لا يمكن التراجع عنه. هل أنت متأكد أنك تريد العودة إلى الوضع العام؟",
"yes_go_back_to_global_mode": "نعم، العودة إلى الوضع العام",
"are_you_sure_delete_this_post": "هل أنت متأكد أنك تريد حذف هذا المنشور؟",
"cant_edit_networks_when_creating_set": "لا يمكنك تعديل الشبكات أثناء إنشاء مجموعة",
"click_to_exit_global_editing": "انقر على هذا الزر للخروج من التحرير العام وتخصيص المنشور لهذه القناة",
"edit_content": "تعديل المحتوى",
"editing_a_specific_network": "تعديل شبكة محددة",
"back_to_global": "العودة إلى الوضع العام",
"delete_post_tooltip": "حذف المنشور",
"drop_files_here_to_upload": "أسقط ملفاتك هنا للتحميل",
"insert_emoji": "إدراج رمز تعبيري",
"write_something": "اكتب شيئًا …"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "যেকোনো সময় বাতিল করুন।",
"billing_pay_0_start_trial": "আজ $0 দিন - আপনার ফ্রি ট্রায়াল শুরু করুন!",
"billing_pay_now": "এখনই পেমেন্ট করুন",
"billing_per_month": "/ মাস"
"billing_per_month": "/ মাস",
"select_channels": "চ্যানেল নির্বাচন করুন",
"start_a_new_chat": "নতুন চ্যাট শুরু করুন",
"your_assistant": "আপনার সহকারী",
"agent_welcome_message": "হ্যালো, আমি আপনার Postiz এজেন্ট 🙌🏻।\n\nআমি এক বা একাধিক চ্যানেলে পোস্ট নির্ধারণ করতে পারি এবং ছবি ও ভিডিও তৈরি করতে পারি।\n\nআপনি বাম মেনু থেকে আপনার পছন্দের চ্যানেলগুলো নির্বাচন করতে পারেন।\n\nডান মেনু থেকে আপনি আপনার পূর্ববর্তী কথোপকথন দেখতে পারবেন।\n\nআপনি আমাকে MCP সার্ভার হিসেবেও ব্যবহার করতে পারেন, সেটিংস >> পাবলিক API দেখুন।",
"last_github_trending": "সর্বশেষ গিটহাব ট্রেন্ডিং",
"next_predicted_github_trending": "পরবর্তী অনুমানকৃত গিটহাব ট্রেন্ডিং",
"repository": "রিপোজিটরি",
"date": "তারিখ",
"total_stars": "মোট স্টার",
"total_forks": "মোট ফর্ক",
"continue_with": "চালিয়ে যান",
"email_address": "ইমেইল ঠিকানা",
"email_already_exists": "ইমেইল ইতিমধ্যে বিদ্যমান",
"google": "গুগল",
"farcaster": "ফারকাস্টার",
"edit_autopost": "অটোপোস্ট সম্পাদনা করুন",
"add_autopost_title": "অটোপোস্ট যোগ করুন",
"webhook_deleted_successfully": "ওয়েবহুক সফলভাবে মুছে ফেলা হয়েছে",
"all_integrations": "সব ইন্টিগ্রেশন",
"specific_integrations": "নির্দিষ্ট ইন্টিগ্রেশন",
"post_on_next_available_slot": "পরবর্তী উপলব্ধ স্লটে পোস্ট করুন",
"post_immediately": "সঙ্গে সঙ্গে পোস্ট করুন",
"could_not_use_rss_feed": "এই RSS ফিড ব্যবহার করা যায়নি",
"rss_valid": "RSS বৈধ!",
"autopost_updated_successfully": "অটোপোস্ট সফলভাবে আপডেট হয়েছে",
"autopost_added_successfully": "অটোপোস্ট সফলভাবে যোগ হয়েছে",
"write_your_post_placeholder": "আপনার পোস্ট লিখুন...",
"select_or_upload_pictures_max_5": "ছবি নির্বাচন করুন বা আপলোড করুন (একসাথে সর্বাধিক ৫টি)।",
"you_can_drag_drop_pictures": "আপনি চাইলে ছবি ড্র্যাগ ও ড্রপও করতে পারেন।",
"you_dont_have_any_media_yet": "আপনার কাছে এখনও কোনো মিডিয়া নেই",
"media_library": "মিডিয়া লাইব্রেরি",
"media_settings": "মিডিয়া সেটিংস",
"media_editor": "মিডিয়া এডিটর",
"close": "বন্ধ করুন",
"me": "আমি",
"noname": "নামহীন",
"password_reset_link_expired": "আপনার পাসওয়ার্ড রিসেট লিঙ্কের মেয়াদ শেষ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।",
"invalid_api_key": "অবৈধ API কী",
"could_not_connect_to_platform": "প্ল্যাটফর্মে সংযোগ করা যায়নি",
"web3_provider": "Web3 প্রদানকারী",
"add_provider_title": "প্রদানকারী যোগ করুন",
"profile_updated": "প্রোফাইল আপডেট হয়েছে",
"sets": "সেট",
"invitation_link_sent": "আমন্ত্রণ লিঙ্ক পাঠানো হয়েছে",
"send_invitation_link": "আমন্ত্রণ লিঙ্ক পাঠান",
"copy_link": "লিঙ্ক কপি করুন",
"are_you_sure_remove_team_member": "আপনি কি নিশ্চিত এই টিম সদস্যকে সরাতে চান?",
"admin": "অ্যাডমিন",
"super_admin": "সুপার অ্যাডমিন",
"update_webhook": "ওয়েবহুক আপডেট করুন",
"add_webhook": "ওয়েবহুক যোগ করুন",
"webhook_updated_successfully": "ওয়েবহুক সফলভাবে আপডেট হয়েছে",
"webhook_added_successfully": "ওয়েবহুক সফলভাবে যোগ হয়েছে",
"webhook_sent": "ওয়েবহুক পাঠানো হয়েছে",
"today": "আজ",
"channel_disconnected_click_to_reconnect": "চ্যানেল সংযোগ বিচ্ছিন্ন হয়েছে, পুনরায় সংযোগ করতে ক্লিক করুন।",
"channel_disabled_upgrade_plan": "এই চ্যানেলটি নিষ্ক্রিয়, এটি সক্রিয় করতে আপনার প্ল্যান আপগ্রেড করুন।",
"channel_added": "চ্যানেল যোগ হয়েছে",
"are_you_sure_disable_channel": "আপনি কি নিশ্চিত যে আপনি এই চ্যানেলটি নিষ্ক্রিয় করতে চান?",
"disable_channel_title": "চ্যানেল নিষ্ক্রিয় করুন",
"channel_disabled": "চ্যানেল নিষ্ক্রিয় হয়েছে",
"are_you_sure_delete_channel": "আপনি কি নিশ্চিত যে আপনি এই চ্যানেলটি মুছে ফেলতে চান?",
"delete_channel_title": "চ্যানেল মুছে ফেলুন",
"delete_posts_before_channel": "এই চ্যানেলটি মুছে ফেলার আগে আপনাকে এর সাথে যুক্ত সব পোস্ট মুছে ফেলতে হবে",
"channel_deleted": "চ্যানেল মুছে ফেলা হয়েছে",
"channel_enabled": "চ্যানেল সক্রিয় হয়েছে",
"time_table_slots": "সময়সূচির স্লট",
"channel_id_copied": "চ্যানেল আইডি ক্লিপবোর্ডে কপি হয়েছে",
"settings_updated": "সেটিংস আপডেট হয়েছে",
"customer_updated": "গ্রাহক আপডেট হয়েছে",
"custom_url": "কাস্টম URL",
"picture": "ছবি",
"upgrade_required": "এই ফিচারটি ব্যবহার করতে আপনাকে আপগ্রেড করতে হবে",
"move_to_billing": "বিলিং-এ যান",
"payment_required": "পেমেন্ট প্রয়োজন",
"no_content": "কোনো বিষয়বস্তু নেই",
"select_customer_tooltip": "গ্রাহক নির্বাচন করুন",
"customers": "গ্রাহকগণ",
"hour": "ঘণ্টা",
"minutes": "মিনিট",
"updated": "আপডেট হয়েছে",
"change_bot_picture_title": "বটের ছবি পরিবর্তন করুন",
"select_customer_label": "গ্রাহক নির্বাচন করুন",
"start_typing": "টাইপ করা শুরু করুন...",
"choose_set_or_continue": "একটি সেট নির্বাচন করুন অথবা সেট ছাড়াই চালিয়ে যান",
"continue_without_set": "সেট ছাড়াই চালিয়ে যান",
"select_set": "একটি সেট নির্বাচন করুন",
"channel_settings": "সেটিংস",
"post_needs_content_or_image": "আপনার পোস্টে অন্তত একটি অক্ষর বা একটি ছবি থাকতে হবে।",
"please_fix_your_settings": "অনুগ্রহ করে আপনার সেটিংস ঠিক করুন",
"shortlink_urls_question": "আপনি কি URL গুলো শর্টলিংক করতে চান? এতে আপনি ক্লিকের পরিসংখ্যান পেতে পারবেন",
"yes_shortlink_it": "হ্যাঁ, শর্টলিংক করুন!",
"added_successfully": "সফলভাবে যোগ হয়েছে",
"updated_successfully": "সফলভাবে আপডেট হয়েছে",
"create_post_title": "পোস্ট তৈরি করুন",
"post_preview": "পোস্টের প্রিভিউ",
"check_circles_above": "উপরে বৃত্তগুলো চেক করুন",
"create_output": "আউটপুট তৈরি করুন",
"assistant_initial_message": "হাই! আমি আপনাকে আপনার সোশ্যাল মিডিয়া পোস্টগুলো আরও সুন্দর করতে সাহায্য করতে পারি।",
"no_longer_global_mode": "আর গ্লোবাল মোডে নেই",
"two_days": "দুই দিন",
"three_days": "তিন দিন",
"four_days": "চার দিন",
"five_days": "পাঁচ দিন",
"six_days": "ছয় দিন",
"two_weeks": "দুই সপ্তাহ",
"repeat_post_every_label": "প্রতি কতদিন পর পোস্ট পুনরাবৃত্তি হবে",
"add_new_tag": "নতুন ট্যাগ যোগ করুন",
"tag_name": "নাম",
"post_is_too_long": "পোস্টটি খুব বড়, অনুগ্রহ করে ঠিক করুন",
"your_post_should_have_at_least_one_character_or_one_image": "আপনার পোস্টে অন্তত একটি অক্ষর বা একটি ছবি থাকতে হবে।",
"internal_edit": "অভ্যন্তরীণ সম্পাদনা",
"are_you_sure_go_back_to_global_mode": "এই কাজটি অপরিবর্তনীয়। আপনি কি নিশ্চিত যে আপনি গ্লোবাল মোডে ফিরে যেতে চান?",
"yes_go_back_to_global_mode": "হ্যাঁ, গ্লোবাল মোডে ফিরে যান",
"are_you_sure_delete_this_post": "আপনি কি নিশ্চিত যে আপনি এই পোস্টটি মুছে ফেলতে চান?",
"cant_edit_networks_when_creating_set": "সেট তৈরি করার সময় আপনি নেটওয়ার্ক সম্পাদনা করতে পারবেন না",
"click_to_exit_global_editing": "গ্লোবাল সম্পাদনা থেকে বেরিয়ে এই চ্যানেলের জন্য পোস্টটি কাস্টমাইজ করতে এই বোতামে ক্লিক করুন",
"edit_content": "বিষয়বস্তু সম্পাদনা করুন",
"editing_a_specific_network": "নির্দিষ্ট নেটওয়ার্ক সম্পাদনা",
"back_to_global": "গ্লোবালে ফিরে যান",
"delete_post_tooltip": "পোস্ট মুছুন",
"drop_files_here_to_upload": "আপলোড করতে আপনার ফাইলগুলো এখানে ছেড়ে দিন",
"insert_emoji": "ইমোজি যুক্ত করুন",
"write_something": "কিছু লিখুন …"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "Jederzeit kündbar.",
"billing_pay_0_start_trial": "Heute 0 $ zahlen Starten Sie Ihre kostenlose Testphase!",
"billing_pay_now": "Jetzt bezahlen",
"billing_per_month": "/ Monat"
"billing_per_month": "/ Monat",
"select_channels": "Kanäle auswählen",
"start_a_new_chat": "Neuen Chat starten",
"your_assistant": "Ihr Assistent",
"agent_welcome_message": "Hallo, ich bin Ihr Postiz-Agent 🙌🏻.\n\nIch kann einen oder mehrere Beiträge für mehrere Kanäle planen und Bilder sowie Videos generieren.\n\nSie können die gewünschten Kanäle im linken Menü auswählen.\n\nIhre bisherigen Unterhaltungen finden Sie im rechten Menü.\n\nSie können mich auch als MCP-Server verwenden, siehe Einstellungen >> Öffentliche API.",
"last_github_trending": "Letzte Github-Trends",
"next_predicted_github_trending": "Nächste vorhergesagte Github-Trends",
"repository": "Repository",
"date": "Datum",
"total_stars": "Gesamtanzahl Sterne",
"total_forks": "Gesamtanzahl Forks",
"continue_with": "Weiter mit",
"email_address": "E-Mail-Adresse",
"email_already_exists": "E-Mail existiert bereits",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "Autopost bearbeiten",
"add_autopost_title": "Autopost hinzufügen",
"webhook_deleted_successfully": "Webhook erfolgreich gelöscht",
"all_integrations": "Alle Integrationen",
"specific_integrations": "Spezifische Integrationen",
"post_on_next_available_slot": "Im nächsten verfügbaren Zeitfenster posten",
"post_immediately": "Sofort posten",
"could_not_use_rss_feed": "Dieser RSS-Feed konnte nicht verwendet werden",
"rss_valid": "RSS gültig!",
"autopost_updated_successfully": "Autopost erfolgreich aktualisiert",
"autopost_added_successfully": "Autopost erfolgreich hinzugefügt",
"write_your_post_placeholder": "Schreibe deinen Beitrag...",
"select_or_upload_pictures_max_5": "Wähle Bilder aus oder lade sie hoch (maximal 5 auf einmal).",
"you_can_drag_drop_pictures": "Du kannst Bilder auch per Drag & Drop hinzufügen.",
"you_dont_have_any_media_yet": "Du hast noch keine Medien",
"media_library": "Medienbibliothek",
"media_settings": "Medieneinstellungen",
"media_editor": "Medieneditor",
"close": "Schließen",
"me": "Ich",
"noname": "Kein Name",
"password_reset_link_expired": "Dein Passwort-Zurücksetzungslink ist abgelaufen. Bitte versuche es erneut.",
"invalid_api_key": "Ungültiger API-Schlüssel",
"could_not_connect_to_platform": "Verbindung zur Plattform konnte nicht hergestellt werden",
"web3_provider": "Web3-Anbieter",
"add_provider_title": "Anbieter hinzufügen",
"profile_updated": "Profil aktualisiert",
"sets": "Sets",
"invitation_link_sent": "Einladungslink gesendet",
"send_invitation_link": "Einladungslink senden",
"copy_link": "Link kopieren",
"are_you_sure_remove_team_member": "Bist du sicher, dass du dieses Teammitglied entfernen möchtest?",
"admin": "Admin",
"super_admin": "Super-Admin",
"update_webhook": "Webhook aktualisieren",
"add_webhook": "Webhook hinzufügen",
"webhook_updated_successfully": "Webhook erfolgreich aktualisiert",
"webhook_added_successfully": "Webhook erfolgreich hinzugefügt",
"webhook_sent": "Webhook gesendet",
"today": "Heute",
"channel_disconnected_click_to_reconnect": "Kanal getrennt, klicken Sie zum Wiederverbinden.",
"channel_disabled_upgrade_plan": "Dieser Kanal ist deaktiviert, bitte aktualisieren Sie Ihren Plan, um ihn zu aktivieren.",
"channel_added": "Kanal hinzugefügt",
"are_you_sure_disable_channel": "Sind Sie sicher, dass Sie diesen Kanal deaktivieren möchten?",
"disable_channel_title": "Kanal deaktivieren",
"channel_disabled": "Kanal deaktiviert",
"are_you_sure_delete_channel": "Sind Sie sicher, dass Sie diesen Kanal löschen möchten?",
"delete_channel_title": "Kanal löschen",
"delete_posts_before_channel": "Sie müssen alle mit diesem Kanal verbundenen Beiträge löschen, bevor Sie ihn löschen können",
"channel_deleted": "Kanal gelöscht",
"channel_enabled": "Kanal aktiviert",
"time_table_slots": "Zeitplan-Slots",
"channel_id_copied": "Kanal-ID in die Zwischenablage kopiert",
"settings_updated": "Einstellungen aktualisiert",
"customer_updated": "Kunde aktualisiert",
"custom_url": "Benutzerdefinierte URL",
"picture": "Bild",
"upgrade_required": "Sie müssen ein Upgrade durchführen, um diese Funktion zu nutzen",
"move_to_billing": "Zur Abrechnung wechseln",
"payment_required": "Zahlung erforderlich",
"no_content": "kein Inhalt",
"select_customer_tooltip": "Kunden auswählen",
"customers": "Kunden",
"hour": "Stunde",
"minutes": "Minuten",
"updated": "Aktualisiert",
"change_bot_picture_title": "Bot-Bild ändern",
"select_customer_label": "Kunden auswählen",
"start_typing": "Tippen Sie hier...",
"choose_set_or_continue": "Wählen Sie ein Set oder fahren Sie ohne fort",
"continue_without_set": "Ohne Set fortfahren",
"select_set": "Set auswählen",
"channel_settings": "Einstellungen",
"post_needs_content_or_image": "Ihr Beitrag sollte mindestens ein Zeichen oder ein Bild enthalten.",
"please_fix_your_settings": "Bitte korrigieren Sie Ihre Einstellungen",
"shortlink_urls_question": "Möchten Sie die URLs kürzen? So erhalten Sie Statistiken über Klicks.",
"yes_shortlink_it": "Ja, bitte kürzen!",
"added_successfully": "Erfolgreich hinzugefügt",
"updated_successfully": "Erfolgreich aktualisiert",
"create_post_title": "Beitrag erstellen",
"post_preview": "Beitragsvorschau",
"check_circles_above": "Überprüfen Sie die Kreise oben",
"create_output": "Ausgabe erstellen",
"assistant_initial_message": "Hallo! Ich kann Ihnen helfen, Ihre Social-Media-Beiträge zu optimieren.",
"no_longer_global_mode": "Nicht mehr im globalen Modus",
"two_days": "Zwei Tage",
"three_days": "Drei Tage",
"four_days": "Vier Tage",
"five_days": "Fünf Tage",
"six_days": "Sechs Tage",
"two_weeks": "Zwei Wochen",
"repeat_post_every_label": "Beitrag wiederholen alle",
"add_new_tag": "Neues Schlagwort hinzufügen",
"tag_name": "Name",
"post_is_too_long": "Beitrag ist zu lang, bitte korrigieren",
"your_post_should_have_at_least_one_character_or_one_image": "Dein Beitrag sollte mindestens ein Zeichen oder ein Bild enthalten.",
"internal_edit": "Interne Bearbeitung",
"are_you_sure_go_back_to_global_mode": "Diese Aktion ist unwiderruflich. Bist du sicher, dass du in den globalen Modus zurückkehren möchtest?",
"yes_go_back_to_global_mode": "Ja, zum globalen Modus zurückkehren",
"are_you_sure_delete_this_post": "Bist du sicher, dass du diesen Beitrag löschen möchtest?",
"cant_edit_networks_when_creating_set": "Du kannst Netzwerke beim Erstellen eines Sets nicht bearbeiten.",
"click_to_exit_global_editing": "Klicke auf diese Schaltfläche, um die globale Bearbeitung zu beenden und den Beitrag für diesen Kanal anzupassen.",
"edit_content": "Inhalt bearbeiten",
"editing_a_specific_network": "Bearbeitung eines bestimmten Netzwerks",
"back_to_global": "Zurück zum globalen Modus",
"delete_post_tooltip": "Beitrag löschen",
"drop_files_here_to_upload": "Dateien hierher ziehen, um sie hochzuladen",
"insert_emoji": "Emoji einfügen",
"write_something": "Schreibe etwas …"
}

View File

@ -535,5 +535,132 @@
"billing_cancel_anytime_short": "Cancel anytime.",
"billing_pay_0_start_trial": "Pay $0 Today - Start your free trial!",
"billing_pay_now": "Pay Now",
"billing_per_month": "/ month"
"billing_per_month": "/ month",
"select_channels": "Select Channels",
"start_a_new_chat": "Start a new chat",
"your_assistant": "Your Assistant",
"agent_welcome_message": "Hello, I am your Postiz agent 🙌🏻.\n\nI can schedule a post or multiple posts to multiple channels and generate pictures and videos.\n\nYou can select the channels you want to use from the left menu.\n\nYou can see your previous conversations from the right menu.\n\nYou can also use me as an MCP Server, check Settings >> Public API",
"last_github_trending": "Last Github Trending",
"next_predicted_github_trending": "Next Predicted GitHub Trending",
"repository": "Repository",
"date": "Date",
"total_stars": "Total Stars",
"total_forks": "Total Forks",
"continue_with": "Continue With",
"email_address": "Email Address",
"label_company": "Company",
"email_already_exists": "Email already exists",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "Edit Autopost",
"add_autopost_title": "Add Autopost",
"webhook_deleted_successfully": "Webhook deleted successfully",
"all_integrations": "All integrations",
"specific_integrations": "Specific integrations",
"post_on_next_available_slot": "Post on the next available slot",
"post_immediately": "Post Immediately",
"could_not_use_rss_feed": "Could not use this RSS feed",
"rss_valid": "RSS valid!",
"autopost_updated_successfully": "Autopost updated successfully",
"autopost_added_successfully": "Autopost added successfully",
"write_your_post_placeholder": "Write your post...",
"select_or_upload_pictures_max_5": "Select or upload pictures (maximum 5 at a time).",
"you_can_drag_drop_pictures": "You can also drag & drop pictures.",
"you_dont_have_any_media_yet": "You don't have any media yet",
"media_library": "Media Library",
"media_settings": "Media Settings",
"media_editor": "Media Editor",
"close": "Close",
"me": "Me",
"noname": "Noname",
"password_reset_link_expired": "Your password reset link has expired. Please try again.",
"invalid_api_key": "Invalid API key",
"could_not_connect_to_platform": "Could not connect to the platform",
"web3_provider": "Web3 provider",
"add_provider_title": "Add Provider",
"profile_updated": "Profile updated",
"sets": "Sets",
"email_address": "Email Address",
"invitation_link_sent": "Invitation link sent",
"send_invitation_link": "Send Invitation Link",
"copy_link": "Copy Link",
"are_you_sure_remove_team_member": "Are you sure you want to remove this team member?",
"admin": "Admin",
"super_admin": "Super Admin",
"update_webhook": "Update webhook",
"add_webhook": "Add webhook",
"webhook_updated_successfully": "Webhook updated successfully",
"webhook_added_successfully": "Webhook added successfully",
"webhook_sent": "Webhook send",
"today": "Today",
"channel_disconnected_click_to_reconnect": "Channel disconnected, click to reconnect.",
"channel_disabled_upgrade_plan": "This channel is disabled, please upgrade your plan to enable it.",
"channel_added": "Channel added",
"are_you_sure_disable_channel": "Are you sure you want to disable this channel?",
"disable_channel_title": "Disable Channel",
"channel_disabled": "Channel Disabled",
"are_you_sure_delete_channel": "Are you sure you want to delete this channel?",
"delete_channel_title": "Delete Channel",
"delete_posts_before_channel": "You have to delete all the posts associated with this channel before deleting it",
"channel_deleted": "Channel Deleted",
"channel_enabled": "Channel Enabled",
"time_table_slots": "Time Table Slots",
"channel_id_copied": "Channel ID copied to clipboard",
"settings_updated": "Settings Updated",
"customer_updated": "Customer Updated",
"custom_url": "Custom URL",
"picture": "Picture",
"upgrade_required": "You need to upgrade to use this feature",
"move_to_billing": "Move to billing",
"payment_required": "Payment Required",
"no_content": "no content",
"select_customer_tooltip": "Select Customer",
"customers": "Customers",
"hour": "Hour",
"minutes": "Minutes",
"updated": "Updated",
"change_bot_picture_title": "Change Bot Picture",
"select_customer_label": "Select Customer",
"start_typing": "Start typing...",
"choose_set_or_continue": "Choose a set or continue without one",
"continue_without_set": "Continue without set",
"select_set": "Select a Set",
"channel_settings": "Settings",
"post_needs_content_or_image": "Your post should have at least one character or one image.",
"please_fix_your_settings": "Please fix your settings",
"shortlink_urls_question": "Do you want to shortlink the URLs? it will let you get statistics over clicks",
"yes_shortlink_it": "Yes, shortlink it!",
"added_successfully": "Added successfully",
"updated_successfully": "Updated successfully",
"create_post_title": "Create Post",
"post_preview": "Post Preview",
"check_circles_above": "Check the circles above",
"create_output": "Create output",
"assistant_initial_message": "Hi! I can help you to refine your social media posts.",
"no_longer_global_mode": "No longer in global mode",
"two_days": "Two Days",
"three_days": "Three Days",
"four_days": "Four Days",
"five_days": "Five Days",
"six_days": "Six Days",
"two_weeks": "Two Weeks",
"repeat_post_every_label": "Repeat Post Every",
"add_new_tag": "Add New Tag",
"tag_name": "Name",
"post_is_too_long": "post is too long, please fix it",
"your_post_should_have_at_least_one_character_or_one_image": "Your post should have at least one character or one image.",
"internal_edit": "Internal Edit",
"are_you_sure_go_back_to_global_mode": "This action is irreversible. Are you sure you want to go back to global mode?",
"yes_go_back_to_global_mode": "Yes, go back to global mode",
"are_you_sure_delete_this_post": "Are you sure you want to delete this post?",
"yes_delete_it": "Yes, delete it!",
"cant_edit_networks_when_creating_set": "You can't edit networks when creating a set",
"click_to_exit_global_editing": "Click this button to exit global editing and customize the post for this channel",
"edit_content": "Edit content",
"editing_a_specific_network": "Editing a Specific Network",
"back_to_global": "Back to global",
"delete_post_tooltip": "Delete Post",
"drop_files_here_to_upload": "Drop your files here to upload",
"insert_emoji": "Insert Emoji",
"write_something": "Write something …"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "Cancela en cualquier momento.",
"billing_pay_0_start_trial": "¡Paga $0 hoy - Comienza tu prueba gratis!",
"billing_pay_now": "Pagar ahora",
"billing_per_month": "/ mes"
"billing_per_month": "/ mes",
"select_channels": "Seleccionar canales",
"start_a_new_chat": "Iniciar un nuevo chat",
"your_assistant": "Tu Asistente",
"agent_welcome_message": "Hola, soy tu agente de Postiz 🙌🏻.\n\nPuedo programar una publicación o varias publicaciones en múltiples canales y generar imágenes y videos.\n\nPuedes seleccionar los canales que deseas usar desde el menú de la izquierda.\n\nPuedes ver tus conversaciones anteriores desde el menú de la derecha.\n\nTambién puedes usarme como un servidor MCP, revisa Configuración >> API Pública",
"last_github_trending": "Últimas tendencias de Github",
"next_predicted_github_trending": "Próximas tendencias previstas de GitHub",
"repository": "Repositorio",
"date": "Fecha",
"total_stars": "Estrellas totales",
"total_forks": "Forks totales",
"continue_with": "Continuar con",
"email_address": "Dirección de correo electrónico",
"email_already_exists": "El correo electrónico ya existe",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "Editar autopublicación",
"add_autopost_title": "Agregar autopublicación",
"webhook_deleted_successfully": "Webhook eliminado correctamente",
"all_integrations": "Todas las integraciones",
"specific_integrations": "Integraciones específicas",
"post_on_next_available_slot": "Publicar en el siguiente espacio disponible",
"post_immediately": "Publicar inmediatamente",
"could_not_use_rss_feed": "No se pudo usar este feed RSS",
"rss_valid": "¡RSS válido!",
"autopost_updated_successfully": "Autopublicación actualizada correctamente",
"autopost_added_successfully": "Autopublicación añadida con éxito",
"write_your_post_placeholder": "Escribe tu publicación...",
"select_or_upload_pictures_max_5": "Selecciona o sube imágenes (máximo 5 a la vez).",
"you_can_drag_drop_pictures": "También puedes arrastrar y soltar imágenes.",
"you_dont_have_any_media_yet": "Aún no tienes ningún medio",
"media_library": "Biblioteca de medios",
"media_settings": "Configuración de medios",
"media_editor": "Editor de medios",
"close": "Cerrar",
"me": "Yo",
"noname": "Sin nombre",
"password_reset_link_expired": "Tu enlace para restablecer la contraseña ha expirado. Por favor, inténtalo de nuevo.",
"invalid_api_key": "Clave API inválida",
"could_not_connect_to_platform": "No se pudo conectar a la plataforma",
"web3_provider": "Proveedor Web3",
"add_provider_title": "Agregar proveedor",
"profile_updated": "Perfil actualizado",
"sets": "Conjuntos",
"invitation_link_sent": "Enlace de invitación enviado",
"send_invitation_link": "Enviar enlace de invitación",
"copy_link": "Copiar enlace",
"are_you_sure_remove_team_member": "¿Estás seguro de que deseas eliminar a este miembro del equipo?",
"admin": "Administrador",
"super_admin": "Súper administrador",
"update_webhook": "Actualizar webhook",
"add_webhook": "Agregar webhook",
"webhook_updated_successfully": "Webhook actualizado correctamente",
"webhook_added_successfully": "Webhook agregado correctamente",
"webhook_sent": "Webhook enviado",
"today": "Hoy",
"channel_disconnected_click_to_reconnect": "Canal desconectado, haz clic para reconectar.",
"channel_disabled_upgrade_plan": "Este canal está deshabilitado, por favor actualiza tu plan para habilitarlo.",
"channel_added": "Canal agregado",
"are_you_sure_disable_channel": "¿Estás seguro de que deseas deshabilitar este canal?",
"disable_channel_title": "Deshabilitar canal",
"channel_disabled": "Canal deshabilitado",
"are_you_sure_delete_channel": "¿Estás seguro de que deseas eliminar este canal?",
"delete_channel_title": "Eliminar canal",
"delete_posts_before_channel": "Debes eliminar todas las publicaciones asociadas a este canal antes de eliminarlo",
"channel_deleted": "Canal eliminado",
"channel_enabled": "Canal habilitado",
"time_table_slots": "Intervalos de horario",
"channel_id_copied": "ID del canal copiado al portapapeles",
"settings_updated": "Configuración actualizada",
"customer_updated": "Cliente actualizado",
"custom_url": "URL personalizada",
"picture": "Imagen",
"upgrade_required": "Necesitas actualizar para usar esta función",
"move_to_billing": "Ir a facturación",
"payment_required": "Pago requerido",
"no_content": "sin contenido",
"select_customer_tooltip": "Seleccionar cliente",
"customers": "Clientes",
"hour": "Hora",
"minutes": "Minutos",
"updated": "Actualizado",
"change_bot_picture_title": "Cambiar imagen del bot",
"select_customer_label": "Seleccionar cliente",
"start_typing": "Empieza a escribir...",
"choose_set_or_continue": "Elige un conjunto o continúa sin uno",
"continue_without_set": "Continuar sin conjunto",
"select_set": "Seleccionar un conjunto",
"channel_settings": "Configuración",
"post_needs_content_or_image": "Tu publicación debe tener al menos un carácter o una imagen.",
"please_fix_your_settings": "Por favor, corrige tu configuración",
"shortlink_urls_question": "¿Quieres acortar las URLs? Esto te permitirá obtener estadísticas sobre los clics",
"yes_shortlink_it": "¡Sí, acórtala!",
"added_successfully": "Agregado exitosamente",
"updated_successfully": "Actualizado exitosamente",
"create_post_title": "Crear publicación",
"post_preview": "Vista previa de la publicación",
"check_circles_above": "Revisa los círculos de arriba",
"create_output": "Crear resultado",
"assistant_initial_message": "¡Hola! Puedo ayudarte a mejorar tus publicaciones en redes sociales.",
"no_longer_global_mode": "Ya no estás en modo global",
"two_days": "Dos días",
"three_days": "Tres días",
"four_days": "Cuatro días",
"five_days": "Cinco días",
"six_days": "Seis días",
"two_weeks": "Dos semanas",
"repeat_post_every_label": "Repetir publicación cada",
"add_new_tag": "Agregar nueva etiqueta",
"tag_name": "Nombre",
"post_is_too_long": "la publicación es demasiado larga, por favor arréglala",
"your_post_should_have_at_least_one_character_or_one_image": "Tu publicación debe tener al menos un carácter o una imagen.",
"internal_edit": "Edición interna",
"are_you_sure_go_back_to_global_mode": "Esta acción es irreversible. ¿Estás seguro de que quieres volver al modo global?",
"yes_go_back_to_global_mode": "Sí, volver al modo global",
"are_you_sure_delete_this_post": "¿Estás seguro de que quieres eliminar esta publicación?",
"cant_edit_networks_when_creating_set": "No puedes editar redes al crear un conjunto",
"click_to_exit_global_editing": "Haz clic en este botón para salir de la edición global y personalizar la publicación para este canal",
"edit_content": "Editar contenido",
"editing_a_specific_network": "Editando una red específica",
"back_to_global": "Volver a global",
"delete_post_tooltip": "Eliminar publicación",
"drop_files_here_to_upload": "Suelta tus archivos aquí para subirlos",
"insert_emoji": "Insertar emoji",
"write_something": "Escribe algo…"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "Annulez à tout moment.",
"billing_pay_0_start_trial": "Payez 0 $ aujourd'hui - Commencez votre essai gratuit !",
"billing_pay_now": "Payer maintenant",
"billing_per_month": "/ mois"
"billing_per_month": "/ mois",
"select_channels": "Sélectionner les canaux",
"start_a_new_chat": "Démarrer une nouvelle conversation",
"your_assistant": "Votre assistant",
"agent_welcome_message": "Bonjour, je suis votre agent Postiz 🙌🏻.\n\nJe peux programmer une ou plusieurs publications sur plusieurs canaux et générer des images et des vidéos.\n\nVous pouvez sélectionner les canaux que vous souhaitez utiliser dans le menu de gauche.\n\nVous pouvez voir vos conversations précédentes dans le menu de droite.\n\nVous pouvez également m'utiliser comme serveur MCP, consultez Paramètres >> API publique",
"last_github_trending": "Dernières tendances GitHub",
"next_predicted_github_trending": "Prochaines tendances GitHub prévues",
"repository": "Dépôt",
"date": "Date",
"total_stars": "Nombre total d'étoiles",
"total_forks": "Nombre total de forks",
"continue_with": "Continuer avec",
"email_address": "Adresse e-mail",
"email_already_exists": "L'adresse e-mail existe déjà",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "Modifier l'autopost",
"add_autopost_title": "Ajouter un autopost",
"webhook_deleted_successfully": "Webhook supprimé avec succès",
"all_integrations": "Toutes les intégrations",
"specific_integrations": "Intégrations spécifiques",
"post_on_next_available_slot": "Publier au prochain créneau disponible",
"post_immediately": "Publier immédiatement",
"could_not_use_rss_feed": "Impossible d'utiliser ce flux RSS",
"rss_valid": "RSS valide !",
"autopost_updated_successfully": "Autopost mis à jour avec succès",
"autopost_added_successfully": "Publication automatique ajoutée avec succès",
"write_your_post_placeholder": "Écrivez votre publication...",
"select_or_upload_pictures_max_5": "Sélectionnez ou téléversez des images (maximum 5 à la fois).",
"you_can_drag_drop_pictures": "Vous pouvez aussi glisser-déposer des images.",
"you_dont_have_any_media_yet": "Vous n'avez pas encore de média",
"media_library": "Bibliothèque de médias",
"media_settings": "Paramètres des médias",
"media_editor": "Éditeur de médias",
"close": "Fermer",
"me": "Moi",
"noname": "Sans nom",
"password_reset_link_expired": "Votre lien de réinitialisation du mot de passe a expiré. Veuillez réessayer.",
"invalid_api_key": "Clé API invalide",
"could_not_connect_to_platform": "Impossible de se connecter à la plateforme",
"web3_provider": "Fournisseur Web3",
"add_provider_title": "Ajouter un fournisseur",
"profile_updated": "Profil mis à jour",
"sets": "Ensembles",
"invitation_link_sent": "Lien d'invitation envoyé",
"send_invitation_link": "Envoyer le lien d'invitation",
"copy_link": "Copier le lien",
"are_you_sure_remove_team_member": "Êtes-vous sûr de vouloir retirer ce membre de l'équipe ?",
"admin": "Admin",
"super_admin": "Super admin",
"update_webhook": "Mettre à jour le webhook",
"add_webhook": "Ajouter un webhook",
"webhook_updated_successfully": "Webhook mis à jour avec succès",
"webhook_added_successfully": "Webhook ajouté avec succès",
"webhook_sent": "Webhook envoyé",
"today": "Aujourd'hui",
"channel_disconnected_click_to_reconnect": "Canal déconnecté, cliquez pour reconnecter.",
"channel_disabled_upgrade_plan": "Ce canal est désactivé, veuillez mettre à niveau votre abonnement pour l'activer.",
"channel_added": "Canal ajouté",
"are_you_sure_disable_channel": "Êtes-vous sûr de vouloir désactiver ce canal ?",
"disable_channel_title": "Désactiver le canal",
"channel_disabled": "Canal désactivé",
"are_you_sure_delete_channel": "Êtes-vous sûr de vouloir supprimer ce canal ?",
"delete_channel_title": "Supprimer le canal",
"delete_posts_before_channel": "Vous devez supprimer tous les messages associés à ce canal avant de le supprimer",
"channel_deleted": "Canal supprimé",
"channel_enabled": "Canal activé",
"time_table_slots": "Créneaux horaires",
"channel_id_copied": "ID du canal copié dans le presse-papiers",
"settings_updated": "Paramètres mis à jour",
"customer_updated": "Client mis à jour",
"custom_url": "URL personnalisée",
"picture": "Image",
"upgrade_required": "Vous devez mettre à niveau pour utiliser cette fonctionnalité",
"move_to_billing": "Aller à la facturation",
"payment_required": "Paiement requis",
"no_content": "aucun contenu",
"select_customer_tooltip": "Sélectionner un client",
"customers": "Clients",
"hour": "Heure",
"minutes": "Minutes",
"updated": "Mis à jour",
"change_bot_picture_title": "Changer l'image du bot",
"select_customer_label": "Sélectionner un client",
"start_typing": "Commencez à taper...",
"choose_set_or_continue": "Choisissez un ensemble ou continuez sans",
"continue_without_set": "Continuer sans ensemble",
"select_set": "Sélectionner un ensemble",
"channel_settings": "Paramètres",
"post_needs_content_or_image": "Votre publication doit contenir au moins un caractère ou une image.",
"please_fix_your_settings": "Veuillez corriger vos paramètres",
"shortlink_urls_question": "Voulez-vous raccourcir les URL ? Cela vous permettra d'obtenir des statistiques sur les clics.",
"yes_shortlink_it": "Oui, raccourcissez-les !",
"added_successfully": "Ajouté avec succès",
"updated_successfully": "Mis à jour avec succès",
"create_post_title": "Créer une publication",
"post_preview": "Aperçu de la publication",
"check_circles_above": "Cochez les cercles ci-dessus",
"create_output": "Créer la sortie",
"assistant_initial_message": "Bonjour ! Je peux vous aider à améliorer vos publications sur les réseaux sociaux.",
"no_longer_global_mode": "N'est plus en mode global",
"two_days": "Deux jours",
"three_days": "Trois jours",
"four_days": "Quatre jours",
"five_days": "Cinq jours",
"six_days": "Six jours",
"two_weeks": "Deux semaines",
"repeat_post_every_label": "Répéter la publication tous les",
"add_new_tag": "Ajouter un nouveau tag",
"tag_name": "Nom",
"post_is_too_long": "le message est trop long, veuillez le corriger",
"your_post_should_have_at_least_one_character_or_one_image": "Votre publication doit contenir au moins un caractère ou une image.",
"internal_edit": "Modification interne",
"are_you_sure_go_back_to_global_mode": "Cette action est irréversible. Êtes-vous sûr de vouloir revenir au mode global ?",
"yes_go_back_to_global_mode": "Oui, revenir au mode global",
"are_you_sure_delete_this_post": "Êtes-vous sûr de vouloir supprimer cette publication ?",
"cant_edit_networks_when_creating_set": "Vous ne pouvez pas modifier les réseaux lors de la création dun ensemble",
"click_to_exit_global_editing": "Cliquez sur ce bouton pour quitter lédition globale et personnaliser la publication pour ce canal",
"edit_content": "Modifier le contenu",
"editing_a_specific_network": "Modification dun réseau spécifique",
"back_to_global": "Retour au global",
"delete_post_tooltip": "Supprimer la publication",
"drop_files_here_to_upload": "Déposez vos fichiers ici pour les télécharger",
"insert_emoji": "Insérer un emoji",
"write_something": "Écrivez quelque chose…"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "ניתן לבטל בכל עת.",
"billing_pay_0_start_trial": "שלם 0$ היום - התחל את תקופת הניסיון שלך!",
"billing_pay_now": "שלם עכשיו",
"billing_per_month": "/ חודש"
"billing_per_month": "/ חודש",
"select_channels": "בחר ערוצים",
"start_a_new_chat": "התחל שיחה חדשה",
"your_assistant": "העוזר שלך",
"agent_welcome_message": "שלום, אני הסוכן של Postiz שלך 🙌🏻.\n\nאני יכול לתזמן פוסט או מספר פוסטים למספר ערוצים וליצור תמונות וסרטונים.\n\nאתה יכול לבחור את הערוצים שברצונך להשתמש בהם מהתפריט השמאלי.\n\nאתה יכול לראות את השיחות הקודמות שלך מהתפריט הימני.\n\nאתה יכול גם להשתמש בי כשרת MCP, בדוק הגדרות >> API ציבורי",
"last_github_trending": "הטרנדים האחרונים ב-GitHub",
"next_predicted_github_trending": "הטרנד הבא הצפוי ב-GitHub",
"repository": "מאגר",
"date": "תאריך",
"total_stars": "סך כל הכוכבים",
"total_forks": "סך כל הפורקים",
"continue_with": "המשך עם",
"email_address": "כתובת אימייל",
"email_already_exists": "האימייל כבר קיים",
"google": "גוגל",
"farcaster": "Farcaster",
"edit_autopost": "ערוך פרסום אוטומטי",
"add_autopost_title": "הוסף פרסום אוטומטי",
"webhook_deleted_successfully": "ה-Webhook נמחק בהצלחה",
"all_integrations": "כל האינטגרציות",
"specific_integrations": "אינטגרציות מסוימות",
"post_on_next_available_slot": "פרסם במועד הפנוי הבא",
"post_immediately": "פרסם מיד",
"could_not_use_rss_feed": "לא ניתן היה להשתמש ב-RSS זה",
"rss_valid": "ה-RSS תקין!",
"autopost_updated_successfully": "הפרסום האוטומטי עודכן בהצלחה",
"autopost_added_successfully": "הפוסט האוטומטי נוסף בהצלחה",
"write_your_post_placeholder": "כתוב את הפוסט שלך...",
"select_or_upload_pictures_max_5": "בחר או העלה תמונות (מקסימום 5 בכל פעם).",
"you_can_drag_drop_pictures": "ניתן גם לגרור ולשחרר תמונות.",
"you_dont_have_any_media_yet": "עדיין אין לך מדיה",
"media_library": "ספריית מדיה",
"media_settings": "הגדרות מדיה",
"media_editor": "עורך מדיה",
"close": "סגור",
"me": "אני",
"noname": "ללא שם",
"password_reset_link_expired": "קישור איפוס הסיסמה שלך פג תוקף. נסה שוב.",
"invalid_api_key": "מפתח API לא תקין",
"could_not_connect_to_platform": "לא ניתן להתחבר לפלטפורמה",
"web3_provider": "ספק Web3",
"add_provider_title": "הוסף ספק",
"profile_updated": "הפרופיל עודכן",
"sets": "סטים",
"invitation_link_sent": "קישור ההזמנה נשלח",
"send_invitation_link": "שלח קישור הזמנה",
"copy_link": "העתק קישור",
"are_you_sure_remove_team_member": "האם אתה בטוח שברצונך להסיר את חבר הצוות הזה?",
"admin": "מנהל",
"super_admin": "מנהל ראשי",
"update_webhook": "עדכן Webhook",
"add_webhook": "הוסף וובהוק",
"webhook_updated_successfully": "הוובהוק עודכן בהצלחה",
"webhook_added_successfully": "הוובהוק נוסף בהצלחה",
"webhook_sent": "וובהוק נשלח",
"today": "היום",
"channel_disconnected_click_to_reconnect": "הערוץ מנותק, לחץ כדי להתחבר מחדש.",
"channel_disabled_upgrade_plan": "הערוץ הזה מושבת, אנא שדרג את התוכנית שלך כדי להפעיל אותו.",
"channel_added": "הערוץ נוסף",
"are_you_sure_disable_channel": "האם אתה בטוח שברצונך להשבית את הערוץ הזה?",
"disable_channel_title": "השבת ערוץ",
"channel_disabled": "הערוץ הושבת",
"are_you_sure_delete_channel": "האם אתה בטוח שברצונך למחוק את הערוץ הזה?",
"delete_channel_title": "מחק ערוץ",
"delete_posts_before_channel": "עליך למחוק את כל הפוסטים המשויכים לערוץ הזה לפני מחיקתו",
"channel_deleted": "הערוץ נמחק",
"channel_enabled": "הערוץ הופעל",
"time_table_slots": "משבצות לוח זמנים",
"channel_id_copied": "מזהה הערוץ הועתק ללוח",
"settings_updated": "ההגדרות עודכנו",
"customer_updated": "הלקוח עודכן",
"custom_url": "כתובת URL מותאמת אישית",
"picture": "תמונה",
"upgrade_required": "עליך לשדרג כדי להשתמש בתכונה זו",
"move_to_billing": "עבור לחיוב",
"payment_required": "נדרש תשלום",
"no_content": "אין תוכן",
"select_customer_tooltip": "בחר לקוח",
"customers": "לקוחות",
"hour": "שעה",
"minutes": "דקות",
"updated": "עודכן",
"change_bot_picture_title": "שנה תמונת בוט",
"select_customer_label": "בחר לקוח",
"start_typing": "התחל להקליד...",
"choose_set_or_continue": "בחר סט או המשך בלעדיו",
"continue_without_set": "המשך ללא סט",
"select_set": "בחר סט",
"channel_settings": "הגדרות",
"post_needs_content_or_image": "הפוסט שלך צריך לכלול לפחות תו אחד או תמונה אחת.",
"please_fix_your_settings": "אנא תקן את ההגדרות שלך",
"shortlink_urls_question": "האם ברצונך לקצר את הקישורים? זה יאפשר לך לקבל סטטיסטיקות על הקלקות",
"yes_shortlink_it": "כן, קצר את זה!",
"added_successfully": "נוסף בהצלחה",
"updated_successfully": "עודכן בהצלחה",
"create_post_title": "צור פוסט",
"post_preview": "תצוגה מקדימה של הפוסט",
"check_circles_above": "סמן את העיגולים למעלה",
"create_output": "צור פלט",
"assistant_initial_message": "היי! אני יכול לעזור לך לשפר את הפוסטים שלך ברשתות החברתיות.",
"no_longer_global_mode": "לא במצב גלובלי יותר",
"two_days": "יומיים",
"three_days": "שלושה ימים",
"four_days": "ארבעה ימים",
"five_days": "חמישה ימים",
"six_days": "שישה ימים",
"two_weeks": "שבועיים",
"repeat_post_every_label": "חזור על הפוסט כל",
"add_new_tag": "הוסף תגית חדשה",
"tag_name": "שם",
"post_is_too_long": "הפוסט ארוך מדי, אנא תקן אותו",
"your_post_should_have_at_least_one_character_or_one_image": "הפוסט שלך צריך לכלול לפחות תו אחד או תמונה אחת.",
"internal_edit": "עריכה פנימית",
"are_you_sure_go_back_to_global_mode": "פעולה זו אינה ניתנת לביטול. האם אתה בטוח שברצונך לחזור למצב גלובלי?",
"yes_go_back_to_global_mode": "כן, חזור למצב גלובלי",
"are_you_sure_delete_this_post": "האם אתה בטוח שברצונך למחוק את הפוסט הזה?",
"cant_edit_networks_when_creating_set": "לא ניתן לערוך רשתות בעת יצירת סט",
"click_to_exit_global_editing": "לחץ על כפתור זה כדי לצאת מעריכה גלובלית ולהתאים את הפוסט לערוץ זה",
"edit_content": "ערוך תוכן",
"editing_a_specific_network": "עריכה של רשת מסוימת",
"back_to_global": "חזרה לגלובלי",
"delete_post_tooltip": "מחק פוסט",
"drop_files_here_to_upload": "גרור קבצים לכאן להעלאה",
"insert_emoji": "הוסף אימוג'י",
"write_something": "כתוב משהו…"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "Annulla in qualsiasi momento.",
"billing_pay_0_start_trial": "Paga 0€ oggi - Inizia la tua prova gratuita!",
"billing_pay_now": "Paga ora",
"billing_per_month": "/ mese"
"billing_per_month": "/ mese",
"select_channels": "Seleziona canali",
"start_a_new_chat": "Inizia una nuova chat",
"your_assistant": "Il tuo assistente",
"agent_welcome_message": "Ciao, sono il tuo agente Postiz 🙌🏻.\n\nPosso programmare uno o più post su più canali e generare immagini e video.\n\nPuoi selezionare i canali che vuoi usare dal menu a sinistra.\n\nPuoi vedere le tue conversazioni precedenti dal menu a destra.\n\nPuoi anche usarmi come server MCP, vai su Impostazioni >> API pubblica",
"last_github_trending": "Ultime tendenze su Github",
"next_predicted_github_trending": "Prossime tendenze previste su GitHub",
"repository": "Repository",
"date": "Data",
"total_stars": "Stelle totali",
"total_forks": "Fork totali",
"continue_with": "Continua con",
"email_address": "Indirizzo email",
"email_already_exists": "L'email esiste già",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "Modifica autopost",
"add_autopost_title": "Aggiungi autopost",
"webhook_deleted_successfully": "Webhook eliminato con successo",
"all_integrations": "Tutte le integrazioni",
"specific_integrations": "Integrazioni specifiche",
"post_on_next_available_slot": "Pubblica nel prossimo slot disponibile",
"post_immediately": "Pubblica immediatamente",
"could_not_use_rss_feed": "Impossibile utilizzare questo feed RSS",
"rss_valid": "RSS valido!",
"autopost_updated_successfully": "Autopost aggiornato con successo",
"autopost_added_successfully": "Autopost aggiunto con successo",
"write_your_post_placeholder": "Scrivi il tuo post...",
"select_or_upload_pictures_max_5": "Seleziona o carica immagini (massimo 5 alla volta).",
"you_can_drag_drop_pictures": "Puoi anche trascinare e rilasciare le immagini.",
"you_dont_have_any_media_yet": "Non hai ancora nessun media",
"media_library": "Libreria media",
"media_settings": "Impostazioni media",
"media_editor": "Editor media",
"close": "Chiudi",
"me": "Io",
"noname": "Senza nome",
"password_reset_link_expired": "Il link per il reset della password è scaduto. Per favore riprova.",
"invalid_api_key": "API key non valida",
"could_not_connect_to_platform": "Impossibile connettersi alla piattaforma",
"web3_provider": "Provider Web3",
"add_provider_title": "Aggiungi provider",
"profile_updated": "Profilo aggiornato",
"sets": "Set",
"invitation_link_sent": "Link di invito inviato",
"send_invitation_link": "Invia link di invito",
"copy_link": "Copia link",
"are_you_sure_remove_team_member": "Sei sicuro di voler rimuovere questo membro del team?",
"admin": "Admin",
"super_admin": "Super Admin",
"update_webhook": "Aggiorna webhook",
"add_webhook": "Aggiungi webhook",
"webhook_updated_successfully": "Webhook aggiornato con successo",
"webhook_added_successfully": "Webhook aggiunto con successo",
"webhook_sent": "Webhook inviato",
"today": "Oggi",
"channel_disconnected_click_to_reconnect": "Canale disconnesso, clicca per riconnettere.",
"channel_disabled_upgrade_plan": "Questo canale è disabilitato, aggiorna il tuo piano per abilitarlo.",
"channel_added": "Canale aggiunto",
"are_you_sure_disable_channel": "Sei sicuro di voler disabilitare questo canale?",
"disable_channel_title": "Disabilita Canale",
"channel_disabled": "Canale Disabilitato",
"are_you_sure_delete_channel": "Sei sicuro di voler eliminare questo canale?",
"delete_channel_title": "Elimina Canale",
"delete_posts_before_channel": "Devi eliminare tutti i post associati a questo canale prima di eliminarlo",
"channel_deleted": "Canale Eliminato",
"channel_enabled": "Canale Abilitato",
"time_table_slots": "Fasce orarie",
"channel_id_copied": "ID canale copiato negli appunti",
"settings_updated": "Impostazioni aggiornate",
"customer_updated": "Cliente aggiornato",
"custom_url": "URL personalizzato",
"picture": "Immagine",
"upgrade_required": "Devi eseguire l'upgrade per utilizzare questa funzione",
"move_to_billing": "Vai alla fatturazione",
"payment_required": "Pagamento richiesto",
"no_content": "nessun contenuto",
"select_customer_tooltip": "Seleziona cliente",
"customers": "Clienti",
"hour": "Ora",
"minutes": "Minuti",
"updated": "Aggiornato",
"change_bot_picture_title": "Cambia immagine del bot",
"select_customer_label": "Seleziona cliente",
"start_typing": "Inizia a digitare...",
"choose_set_or_continue": "Scegli un set o continua senza",
"continue_without_set": "Continua senza set",
"select_set": "Seleziona un set",
"channel_settings": "Impostazioni",
"post_needs_content_or_image": "Il tuo post deve contenere almeno un carattere o un'immagine.",
"please_fix_your_settings": "Per favore, correggi le tue impostazioni",
"shortlink_urls_question": "Vuoi accorciare gli URL? Ti permetterà di ottenere statistiche sui clic",
"yes_shortlink_it": "Sì, accorcialo!",
"added_successfully": "Aggiunto con successo",
"updated_successfully": "Aggiornato con successo",
"create_post_title": "Crea post",
"post_preview": "Anteprima post",
"check_circles_above": "Controlla i cerchi sopra",
"create_output": "Crea output",
"assistant_initial_message": "Ciao! Posso aiutarti a perfezionare i tuoi post sui social media.",
"no_longer_global_mode": "Non più in modalità globale",
"two_days": "Due giorni",
"three_days": "Tre giorni",
"four_days": "Quattro giorni",
"five_days": "Cinque giorni",
"six_days": "Sei giorni",
"two_weeks": "Due settimane",
"repeat_post_every_label": "Ripeti post ogni",
"add_new_tag": "Aggiungi nuovo tag",
"tag_name": "Nome",
"post_is_too_long": "il post è troppo lungo, per favore correggilo",
"your_post_should_have_at_least_one_character_or_one_image": "Il tuo post deve contenere almeno un carattere o un'immagine.",
"internal_edit": "Modifica interna",
"are_you_sure_go_back_to_global_mode": "Questa azione è irreversibile. Sei sicuro di voler tornare alla modalità globale?",
"yes_go_back_to_global_mode": "Sì, torna alla modalità globale",
"are_you_sure_delete_this_post": "Sei sicuro di voler eliminare questo post?",
"cant_edit_networks_when_creating_set": "Non puoi modificare le reti durante la creazione di un set",
"click_to_exit_global_editing": "Clicca su questo pulsante per uscire dalla modifica globale e personalizzare il post per questo canale",
"edit_content": "Modifica contenuto",
"editing_a_specific_network": "Modifica di una rete specifica",
"back_to_global": "Torna alla modalità globale",
"delete_post_tooltip": "Elimina post",
"drop_files_here_to_upload": "Trascina qui i tuoi file per caricarli",
"insert_emoji": "Inserisci emoji",
"write_something": "Scrivi qualcosa…"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "いつでもキャンセル可能。",
"billing_pay_0_start_trial": "本日のお支払いは0円 - 無料トライアルを始めましょう!",
"billing_pay_now": "今すぐ支払う",
"billing_per_month": "/月"
"billing_per_month": "/月",
"select_channels": "チャンネルを選択",
"start_a_new_chat": "新しいチャットを開始",
"your_assistant": "あなたのアシスタント",
"agent_welcome_message": "こんにちは、私はあなたのPostizエージェントです🙌🏻。\n\n複数のチャンネルに投稿や複数の投稿をスケジュールしたり、画像や動画を生成したりできます。\n\n左側のメニューから使用したいチャンネルを選択できます。\n\n右側のメニューから過去の会話を見ることができます。\n\nまた、私をMCPサーバーとしても利用できます。設定 >> パブリックAPI をご確認ください。",
"last_github_trending": "最新のGitHubトレンド",
"next_predicted_github_trending": "次に予測されるGitHubトレンド",
"repository": "リポジトリ",
"date": "日付",
"total_stars": "総スター数",
"total_forks": "総フォーク数",
"continue_with": "続ける",
"email_address": "メールアドレス",
"email_already_exists": "メールアドレスは既に存在します",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "自動投稿を編集",
"add_autopost_title": "自動投稿を追加",
"webhook_deleted_successfully": "Webhookが正常に削除されました",
"all_integrations": "すべての連携",
"specific_integrations": "特定の連携",
"post_on_next_available_slot": "次の利用可能なスロットで投稿",
"post_immediately": "すぐに投稿",
"could_not_use_rss_feed": "このRSSフィードは使用できませんでした",
"rss_valid": "RSSは有効です",
"autopost_updated_successfully": "自動投稿が正常に更新されました",
"autopost_added_successfully": "自動投稿が正常に追加されました",
"write_your_post_placeholder": "投稿内容を入力してください...",
"select_or_upload_pictures_max_5": "画像を選択またはアップロード最大5枚まで同時に可能",
"you_can_drag_drop_pictures": "画像をドラッグ&ドロップすることもできます。",
"you_dont_have_any_media_yet": "まだメディアがありません",
"media_library": "メディアライブラリ",
"media_settings": "メディア設定",
"media_editor": "メディアエディター",
"close": "閉じる",
"me": "自分",
"noname": "名前なし",
"password_reset_link_expired": "パスワードリセットリンクの有効期限が切れています。もう一度お試しください。",
"invalid_api_key": "無効なAPIキーです",
"could_not_connect_to_platform": "プラットフォームに接続できませんでした",
"web3_provider": "Web3プロバイダー",
"add_provider_title": "プロバイダーを追加",
"profile_updated": "プロフィールが更新されました",
"sets": "セット",
"invitation_link_sent": "招待リンクが送信されました",
"send_invitation_link": "招待リンクを送信",
"copy_link": "リンクをコピー",
"are_you_sure_remove_team_member": "このチームメンバーを削除してもよろしいですか?",
"admin": "管理者",
"super_admin": "スーパー管理者",
"update_webhook": "Webhookを更新",
"add_webhook": "Webhookを追加",
"webhook_updated_successfully": "Webhookが正常に更新されました",
"webhook_added_successfully": "Webhookが正常に追加されました",
"webhook_sent": "Webhook送信",
"today": "今日",
"channel_disconnected_click_to_reconnect": "チャンネルが切断されました。再接続するにはクリックしてください。",
"channel_disabled_upgrade_plan": "このチャンネルは無効になっています。有効にするにはプランをアップグレードしてください。",
"channel_added": "チャンネルが追加されました",
"are_you_sure_disable_channel": "本当にこのチャンネルを無効にしますか?",
"disable_channel_title": "チャンネルを無効化",
"channel_disabled": "チャンネルが無効になりました",
"are_you_sure_delete_channel": "本当にこのチャンネルを削除しますか?",
"delete_channel_title": "チャンネルを削除",
"delete_posts_before_channel": "このチャンネルを削除する前に、関連するすべての投稿を削除する必要があります",
"channel_deleted": "チャンネルが削除されました",
"channel_enabled": "チャンネルが有効になりました",
"time_table_slots": "タイムテーブル枠",
"channel_id_copied": "チャンネルIDがクリップボードにコピーされました",
"settings_updated": "設定が更新されました",
"customer_updated": "顧客情報が更新されました",
"custom_url": "カスタムURL",
"picture": "画像",
"upgrade_required": "この機能を利用するにはアップグレードが必要です",
"move_to_billing": "請求画面へ移動",
"payment_required": "お支払いが必要です",
"no_content": "内容なし",
"select_customer_tooltip": "顧客を選択",
"customers": "顧客",
"hour": "時間",
"minutes": "分",
"updated": "更新済み",
"change_bot_picture_title": "ボットの画像を変更",
"select_customer_label": "顧客を選択",
"start_typing": "入力を開始...",
"choose_set_or_continue": "セットを選択するか、セットなしで続行してください",
"continue_without_set": "セットなしで続行",
"select_set": "セットを選択",
"channel_settings": "設定",
"post_needs_content_or_image": "投稿には少なくとも1文字または1つの画像が必要です。",
"please_fix_your_settings": "設定を修正してください",
"shortlink_urls_question": "URLを短縮リンクにしますかクリック数の統計を取得できます。",
"yes_shortlink_it": "はい、短縮リンクにします!",
"added_successfully": "追加に成功しました",
"updated_successfully": "更新に成功しました",
"create_post_title": "投稿を作成",
"post_preview": "投稿プレビュー",
"check_circles_above": "上の円を確認してください",
"create_output": "出力を作成",
"assistant_initial_message": "こんにちはあなたのSNS投稿をブラッシュアップするお手伝いができます。",
"no_longer_global_mode": "グローバルモードを終了しました",
"two_days": "2日間",
"three_days": "3日間",
"four_days": "4日間",
"five_days": "5日間",
"six_days": "6日間",
"two_weeks": "2週間",
"repeat_post_every_label": "投稿を繰り返す間隔",
"add_new_tag": "新しいタグを追加",
"tag_name": "名前",
"post_is_too_long": "投稿が長すぎます。修正してください",
"your_post_should_have_at_least_one_character_or_one_image": "投稿には少なくとも1文字または1枚の画像が必要です。",
"internal_edit": "内部編集",
"are_you_sure_go_back_to_global_mode": "この操作は元に戻せません。本当にグローバルモードに戻りますか?",
"yes_go_back_to_global_mode": "はい、グローバルモードに戻ります",
"are_you_sure_delete_this_post": "本当にこの投稿を削除しますか?",
"cant_edit_networks_when_creating_set": "セット作成中はネットワークを編集できません",
"click_to_exit_global_editing": "このボタンをクリックしてグローバル編集を終了し、このチャンネル用に投稿をカスタマイズします",
"edit_content": "内容を編集",
"editing_a_specific_network": "特定のネットワークを編集中",
"back_to_global": "グローバルに戻る",
"delete_post_tooltip": "投稿を削除",
"drop_files_here_to_upload": "ここにファイルをドロップしてアップロード",
"insert_emoji": "絵文字を挿入",
"write_something": "何かを書いてください…"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "언제든지 취소 가능합니다.",
"billing_pay_0_start_trial": "오늘 $0 결제 - 무료 체험을 시작하세요!",
"billing_pay_now": "지금 결제",
"billing_per_month": "/월"
"billing_per_month": "/월",
"select_channels": "채널 선택",
"start_a_new_chat": "새 채팅 시작",
"your_assistant": "당신의 어시스턴트",
"agent_welcome_message": "안녕하세요, 저는 Postiz 에이전트입니다 🙌🏻.\n\n저는 하나 또는 여러 개의 게시물을 여러 채널에 예약 게시할 수 있고, 사진과 동영상을 생성할 수 있습니다.\n\n왼쪽 메뉴에서 사용하고 싶은 채널을 선택할 수 있습니다.\n\n오른쪽 메뉴에서 이전 대화를 볼 수 있습니다.\n\n또한 저를 MCP 서버로 사용할 수 있으며, 설정 >> 공개 API에서 확인할 수 있습니다.",
"last_github_trending": "최근 깃허브 트렌딩",
"next_predicted_github_trending": "다음 예측 깃허브 트렌딩",
"repository": "저장소",
"date": "날짜",
"total_stars": "총 별점",
"total_forks": "총 포크",
"continue_with": "다음으로 계속",
"email_address": "이메일 주소",
"email_already_exists": "이미 존재하는 이메일입니다",
"google": "구글",
"farcaster": "파캐스터",
"edit_autopost": "자동 게시 수정",
"add_autopost_title": "자동 게시 추가",
"webhook_deleted_successfully": "웹훅이 성공적으로 삭제되었습니다",
"all_integrations": "모든 통합",
"specific_integrations": "특정 통합",
"post_on_next_available_slot": "다음 사용 가능한 시간에 게시",
"post_immediately": "즉시 게시",
"could_not_use_rss_feed": "이 RSS 피드를 사용할 수 없습니다",
"rss_valid": "RSS가 유효합니다!",
"autopost_updated_successfully": "자동 게시가 성공적으로 업데이트되었습니다",
"autopost_added_successfully": "자동 게시가 성공적으로 추가되었습니다",
"write_your_post_placeholder": "게시글을 작성하세요...",
"select_or_upload_pictures_max_5": "사진을 선택하거나 업로드하세요 (최대 5장까지 한 번에 가능합니다).",
"you_can_drag_drop_pictures": "사진을 드래그 앤 드롭하여 추가할 수도 있습니다.",
"you_dont_have_any_media_yet": "아직 미디어가 없습니다",
"media_library": "미디어 라이브러리",
"media_settings": "미디어 설정",
"media_editor": "미디어 편집기",
"close": "닫기",
"me": "나",
"noname": "이름 없음",
"password_reset_link_expired": "비밀번호 재설정 링크가 만료되었습니다. 다시 시도해 주세요.",
"invalid_api_key": "잘못된 API 키입니다",
"could_not_connect_to_platform": "플랫폼에 연결할 수 없습니다",
"web3_provider": "Web3 제공자",
"add_provider_title": "제공자 추가",
"profile_updated": "프로필이 업데이트되었습니다",
"sets": "세트",
"invitation_link_sent": "초대 링크가 전송되었습니다",
"send_invitation_link": "초대 링크 보내기",
"copy_link": "링크 복사",
"are_you_sure_remove_team_member": "이 팀 멤버를 삭제하시겠습니까?",
"admin": "관리자",
"super_admin": "슈퍼 관리자",
"update_webhook": "웹훅 업데이트",
"add_webhook": "웹훅 추가",
"webhook_updated_successfully": "웹훅이 성공적으로 업데이트되었습니다",
"webhook_added_successfully": "웹훅이 성공적으로 추가되었습니다",
"webhook_sent": "웹훅 전송됨",
"today": "오늘",
"channel_disconnected_click_to_reconnect": "채널이 연결 해제되었습니다. 다시 연결하려면 클릭하세요.",
"channel_disabled_upgrade_plan": "이 채널은 비활성화되어 있습니다. 활성화하려면 요금제를 업그레이드하세요.",
"channel_added": "채널이 추가되었습니다",
"are_you_sure_disable_channel": "이 채널을 비활성화하시겠습니까?",
"disable_channel_title": "채널 비활성화",
"channel_disabled": "채널이 비활성화되었습니다",
"are_you_sure_delete_channel": "이 채널을 삭제하시겠습니까?",
"delete_channel_title": "채널 삭제",
"delete_posts_before_channel": "이 채널을 삭제하기 전에 관련된 모든 게시물을 삭제해야 합니다",
"channel_deleted": "채널이 삭제되었습니다",
"channel_enabled": "채널이 활성화되었습니다",
"time_table_slots": "시간표 슬롯",
"channel_id_copied": "채널 ID가 클립보드에 복사되었습니다",
"settings_updated": "설정이 업데이트되었습니다",
"customer_updated": "고객 정보가 업데이트되었습니다",
"custom_url": "맞춤 URL",
"picture": "사진",
"upgrade_required": "이 기능을 사용하려면 업그레이드가 필요합니다",
"move_to_billing": "결제 페이지로 이동",
"payment_required": "결제가 필요합니다",
"no_content": "내용 없음",
"select_customer_tooltip": "고객 선택",
"customers": "고객",
"hour": "시간",
"minutes": "분",
"updated": "업데이트됨",
"change_bot_picture_title": "봇 사진 변경",
"select_customer_label": "고객 선택",
"start_typing": "입력 시작...",
"choose_set_or_continue": "세트를 선택하거나 세트 없이 계속하세요",
"continue_without_set": "세트 없이 계속하기",
"select_set": "세트 선택",
"channel_settings": "설정",
"post_needs_content_or_image": "게시물에는 최소 한 글자 또는 이미지가 있어야 합니다.",
"please_fix_your_settings": "설정을 수정해 주세요",
"shortlink_urls_question": "URL을 단축하시겠습니까? 클릭 통계를 확인할 수 있습니다.",
"yes_shortlink_it": "네, 단축하세요!",
"added_successfully": "성공적으로 추가되었습니다",
"updated_successfully": "성공적으로 업데이트되었습니다",
"create_post_title": "게시물 작성",
"post_preview": "게시물 미리보기",
"check_circles_above": "위의 원을 확인하세요",
"create_output": "결과 생성",
"assistant_initial_message": "안녕하세요! 소셜 미디어 게시물을 다듬는 데 도와드릴 수 있습니다.",
"no_longer_global_mode": "글로벌 모드가 해제되었습니다",
"two_days": "이틀",
"three_days": "삼일",
"four_days": "나흘",
"five_days": "닷새",
"six_days": "엿새",
"two_weeks": "2주",
"repeat_post_every_label": "게시 반복 주기",
"add_new_tag": "새 태그 추가",
"tag_name": "이름",
"post_is_too_long": "게시글이 너무 깁니다. 수정해 주세요.",
"your_post_should_have_at_least_one_character_or_one_image": "게시물에는 최소한 한 글자 또는 한 이미지를 포함해야 합니다.",
"internal_edit": "내부 편집",
"are_you_sure_go_back_to_global_mode": "이 작업은 되돌릴 수 없습니다. 정말로 글로벌 모드로 돌아가시겠습니까?",
"yes_go_back_to_global_mode": "네, 글로벌 모드로 돌아갑니다",
"are_you_sure_delete_this_post": "이 게시물을 삭제하시겠습니까?",
"cant_edit_networks_when_creating_set": "세트를 생성할 때는 네트워크를 편집할 수 없습니다.",
"click_to_exit_global_editing": "이 버튼을 클릭하면 글로벌 편집을 종료하고 이 채널에 맞게 게시물을 맞춤 설정할 수 있습니다.",
"edit_content": "내용 편집",
"editing_a_specific_network": "특정 네트워크 편집 중",
"back_to_global": "글로벌로 돌아가기",
"delete_post_tooltip": "게시물 삭제",
"drop_files_here_to_upload": "여기에 파일을 끌어다 놓아 업로드하세요",
"insert_emoji": "이모지 삽입",
"write_something": "무엇인가를 작성하세요 …"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "Cancele a qualquer momento.",
"billing_pay_0_start_trial": "Pague R$0 hoje - Comece seu teste gratuito!",
"billing_pay_now": "Pagar agora",
"billing_per_month": "/ mês"
"billing_per_month": "/ mês",
"select_channels": "Selecionar canais",
"start_a_new_chat": "Iniciar um novo chat",
"your_assistant": "Seu Assistente",
"agent_welcome_message": "Olá, sou seu agente Postiz 🙌🏻.\n\nPosso agendar uma publicação ou várias publicações para múltiplos canais e gerar imagens e vídeos.\n\nVocê pode selecionar os canais que deseja usar no menu à esquerda.\n\nVocê pode ver suas conversas anteriores no menu à direita.\n\nVocê também pode me usar como um Servidor MCP, confira Configurações >> API Pública",
"last_github_trending": "Últimas tendências do Github",
"next_predicted_github_trending": "Próxima tendência prevista do GitHub",
"repository": "Repositório",
"date": "Data",
"total_stars": "Total de estrelas",
"total_forks": "Total de forks",
"continue_with": "Continuar com",
"email_address": "Endereço de e-mail",
"email_already_exists": "O e-mail já existe",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "Editar autopost",
"add_autopost_title": "Adicionar autopost",
"webhook_deleted_successfully": "Webhook excluído com sucesso",
"all_integrations": "Todas as integrações",
"specific_integrations": "Integrações específicas",
"post_on_next_available_slot": "Publicar no próximo horário disponível",
"post_immediately": "Publicar imediatamente",
"could_not_use_rss_feed": "Não foi possível usar este feed RSS",
"rss_valid": "RSS válido!",
"autopost_updated_successfully": "Autopost atualizado com sucesso",
"autopost_added_successfully": "Autopost adicionado com sucesso",
"write_your_post_placeholder": "Escreva sua postagem...",
"select_or_upload_pictures_max_5": "Selecione ou envie fotos (máximo de 5 por vez).",
"you_can_drag_drop_pictures": "Você também pode arrastar e soltar fotos.",
"you_dont_have_any_media_yet": "Você ainda não tem nenhuma mídia",
"media_library": "Biblioteca de Mídia",
"media_settings": "Configurações de Mídia",
"media_editor": "Editor de Mídia",
"close": "Fechar",
"me": "Eu",
"noname": "Sem nome",
"password_reset_link_expired": "Seu link de redefinição de senha expirou. Por favor, tente novamente.",
"invalid_api_key": "Chave de API inválida",
"could_not_connect_to_platform": "Não foi possível conectar à plataforma",
"web3_provider": "Provedor Web3",
"add_provider_title": "Adicionar Provedor",
"profile_updated": "Perfil atualizado",
"sets": "Conjuntos",
"invitation_link_sent": "Link de convite enviado",
"send_invitation_link": "Enviar link de convite",
"copy_link": "Copiar link",
"are_you_sure_remove_team_member": "Tem certeza de que deseja remover este membro da equipe?",
"admin": "Administrador",
"super_admin": "Super Administrador",
"update_webhook": "Atualizar webhook",
"add_webhook": "Adicionar webhook",
"webhook_updated_successfully": "Webhook atualizado com sucesso",
"webhook_added_successfully": "Webhook adicionado com sucesso",
"webhook_sent": "Webhook enviado",
"today": "Hoje",
"channel_disconnected_click_to_reconnect": "Canal desconectado, clique para reconectar.",
"channel_disabled_upgrade_plan": "Este canal está desativado, por favor faça upgrade do seu plano para habilitá-lo.",
"channel_added": "Canal adicionado",
"are_you_sure_disable_channel": "Tem certeza de que deseja desativar este canal?",
"disable_channel_title": "Desativar Canal",
"channel_disabled": "Canal Desativado",
"are_you_sure_delete_channel": "Tem certeza de que deseja excluir este canal?",
"delete_channel_title": "Excluir Canal",
"delete_posts_before_channel": "Você precisa excluir todas as postagens associadas a este canal antes de excluí-lo",
"channel_deleted": "Canal Excluído",
"channel_enabled": "Canal Ativado",
"time_table_slots": "Horários da Tabela",
"channel_id_copied": "ID do canal copiado para a área de transferência",
"settings_updated": "Configurações Atualizadas",
"customer_updated": "Cliente Atualizado",
"custom_url": "URL personalizada",
"picture": "Imagem",
"upgrade_required": "Você precisa fazer upgrade para usar este recurso",
"move_to_billing": "Ir para cobrança",
"payment_required": "Pagamento Necessário",
"no_content": "sem conteúdo",
"select_customer_tooltip": "Selecionar cliente",
"customers": "Clientes",
"hour": "Hora",
"minutes": "Minutos",
"updated": "Atualizado",
"change_bot_picture_title": "Alterar foto do bot",
"select_customer_label": "Selecionar cliente",
"start_typing": "Comece a digitar...",
"choose_set_or_continue": "Escolha um conjunto ou continue sem um",
"continue_without_set": "Continuar sem conjunto",
"select_set": "Selecionar um conjunto",
"channel_settings": "Configurações",
"post_needs_content_or_image": "Sua publicação deve ter pelo menos um caractere ou uma imagem.",
"please_fix_your_settings": "Por favor, corrija suas configurações",
"shortlink_urls_question": "Você quer encurtar as URLs? Isso permitirá obter estatísticas sobre os cliques",
"yes_shortlink_it": "Sim, encurte!",
"added_successfully": "Adicionado com sucesso",
"updated_successfully": "Atualizado com sucesso",
"create_post_title": "Criar publicação",
"post_preview": "Prévia da publicação",
"check_circles_above": "Verifique os círculos acima",
"create_output": "Criar saída",
"assistant_initial_message": "Olá! Posso ajudar você a aprimorar suas postagens nas redes sociais.",
"no_longer_global_mode": "Não está mais no modo global",
"two_days": "Dois dias",
"three_days": "Três dias",
"four_days": "Quatro dias",
"five_days": "Cinco dias",
"six_days": "Seis dias",
"two_weeks": "Duas semanas",
"repeat_post_every_label": "Repetir postagem a cada",
"add_new_tag": "Adicionar nova tag",
"tag_name": "Nome",
"post_is_too_long": "a postagem está muito longa, por favor corrija",
"your_post_should_have_at_least_one_character_or_one_image": "Sua postagem deve ter pelo menos um caractere ou uma imagem.",
"internal_edit": "Edição interna",
"are_you_sure_go_back_to_global_mode": "Esta ação é irreversível. Tem certeza de que deseja voltar para o modo global?",
"yes_go_back_to_global_mode": "Sim, voltar para o modo global",
"are_you_sure_delete_this_post": "Tem certeza de que deseja excluir esta postagem?",
"cant_edit_networks_when_creating_set": "Você não pode editar redes ao criar um conjunto",
"click_to_exit_global_editing": "Clique neste botão para sair da edição global e personalizar a postagem para este canal",
"edit_content": "Editar conteúdo",
"editing_a_specific_network": "Editando uma Rede Específica",
"back_to_global": "Voltar para o global",
"delete_post_tooltip": "Excluir postagem",
"drop_files_here_to_upload": "Solte seus arquivos aqui para fazer upload",
"insert_emoji": "Inserir emoji",
"write_something": "Escreva algo…"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "Отменить можно в любое время.",
"billing_pay_0_start_trial": "Заплатите $0 сегодня — начните бесплатный пробный период!",
"billing_pay_now": "Оплатить сейчас",
"billing_per_month": "/ месяц"
"billing_per_month": "/ месяц",
"select_channels": "Выберите каналы",
"start_a_new_chat": "Начать новый чат",
"your_assistant": "Ваш помощник",
"agent_welcome_message": "Здравствуйте, я ваш агент Postiz 🙌🏻.\n\nЯ могу запланировать публикацию одного или нескольких постов в нескольких каналах, а также сгенерировать изображения и видео.\n\nВы можете выбрать нужные каналы в левом меню.\n\nВаши предыдущие разговоры доступны в правом меню.\n\nТакже вы можете использовать меня как MCP Server, проверьте Настройки >> Публичный API",
"last_github_trending": "Последние тренды на Github",
"next_predicted_github_trending": "Следующий прогнозируемый тренд на GitHub",
"repository": "Репозиторий",
"date": "Дата",
"total_stars": "Всего звёзд",
"total_forks": "Всего форков",
"continue_with": "Продолжить с",
"email_address": "Адрес электронной почты",
"email_already_exists": "Электронная почта уже существует",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "Редактировать автопост",
"add_autopost_title": "Добавить автопост",
"webhook_deleted_successfully": "Вебхук успешно удалён",
"all_integrations": "Все интеграции",
"specific_integrations": "Конкретные интеграции",
"post_on_next_available_slot": "Опубликовать в следующем доступном слоте",
"post_immediately": "Опубликовать немедленно",
"could_not_use_rss_feed": "Не удалось использовать этот RSS-канал",
"rss_valid": "RSS-канал действителен!",
"autopost_updated_successfully": "Автопост успешно обновлён",
"autopost_added_successfully": "Автопост успешно добавлен",
"write_your_post_placeholder": "Напишите свой пост...",
"select_or_upload_pictures_max_5": "Выберите или загрузите изображения (максимум 5 за раз).",
"you_can_drag_drop_pictures": "Вы также можете перетащить изображения.",
"you_dont_have_any_media_yet": "У вас ещё нет медиафайлов",
"media_library": "Медиатека",
"media_settings": "Настройки медиа",
"media_editor": "Редактор медиа",
"close": "Закрыть",
"me": "Я",
"noname": "Без имени",
"password_reset_link_expired": "Ссылка для сброса пароля истекла. Пожалуйста, попробуйте снова.",
"invalid_api_key": "Недействительный API-ключ",
"could_not_connect_to_platform": "Не удалось подключиться к платформе",
"web3_provider": "Web3-провайдер",
"add_provider_title": "Добавить провайдера",
"profile_updated": "Профиль обновлён",
"sets": "Наборы",
"invitation_link_sent": "Ссылка-приглашение отправлена",
"send_invitation_link": "Отправить ссылку-приглашение",
"copy_link": "Скопировать ссылку",
"are_you_sure_remove_team_member": "Вы уверены, что хотите удалить этого участника команды?",
"admin": "Администратор",
"super_admin": "Супер администратор",
"update_webhook": "Обновить вебхук",
"add_webhook": "Добавить вебхук",
"webhook_updated_successfully": "Вебхук успешно обновлён",
"webhook_added_successfully": "Вебхук успешно добавлен",
"webhook_sent": "Вебхук отправлен",
"today": "Сегодня",
"channel_disconnected_click_to_reconnect": "Канал отключён, нажмите для повторного подключения.",
"channel_disabled_upgrade_plan": "Этот канал отключён, пожалуйста, обновите ваш тариф для его активации.",
"channel_added": "Канал добавлен",
"are_you_sure_disable_channel": "Вы уверены, что хотите отключить этот канал?",
"disable_channel_title": "Отключить канал",
"channel_disabled": "Канал отключён",
"are_you_sure_delete_channel": "Вы уверены, что хотите удалить этот канал?",
"delete_channel_title": "Удалить канал",
"delete_posts_before_channel": "Вам нужно удалить все публикации, связанные с этим каналом, прежде чем его удалить",
"channel_deleted": "Канал удалён",
"channel_enabled": "Канал включён",
"time_table_slots": "Слоты расписания",
"channel_id_copied": "ID канала скопирован в буфер обмена",
"settings_updated": "Настройки обновлены",
"customer_updated": "Клиент обновлён",
"custom_url": "Пользовательский URL",
"picture": "Изображение",
"upgrade_required": "Вам необходимо обновить тариф для использования этой функции",
"move_to_billing": "Перейти к оплате",
"payment_required": "Требуется оплата",
"no_content": "нет содержимого",
"select_customer_tooltip": "Выберите клиента",
"customers": "Клиенты",
"hour": "Час",
"minutes": "Минуты",
"updated": "Обновлено",
"change_bot_picture_title": "Изменить изображение бота",
"select_customer_label": "Выберите клиента",
"start_typing": "Начните вводить...",
"choose_set_or_continue": "Выберите набор или продолжите без него",
"continue_without_set": "Продолжить без набора",
"select_set": "Выберите набор",
"channel_settings": "Настройки",
"post_needs_content_or_image": "Ваш пост должен содержать хотя бы один символ или одно изображение.",
"please_fix_your_settings": "Пожалуйста, исправьте ваши настройки",
"shortlink_urls_question": "Хотите сократить ссылки? Это позволит получать статистику по кликам.",
"yes_shortlink_it": "Да, сократить!",
"added_successfully": "Успешно добавлено",
"updated_successfully": "Успешно обновлено",
"create_post_title": "Создать пост",
"post_preview": "Предпросмотр поста",
"check_circles_above": "Проверьте круги выше",
"create_output": "Создать результат",
"assistant_initial_message": "Привет! Я могу помочь вам улучшить ваши посты для социальных сетей.",
"no_longer_global_mode": "Глобальный режим отключён",
"two_days": "Два дня",
"three_days": "Три дня",
"four_days": "Четыре дня",
"five_days": "Пять дней",
"six_days": "Шесть дней",
"two_weeks": "Две недели",
"repeat_post_every_label": "Повторять публикацию каждые",
"add_new_tag": "Добавить новый тег",
"tag_name": "Название",
"post_is_too_long": "пост слишком длинный, пожалуйста, исправьте его",
"your_post_should_have_at_least_one_character_or_one_image": "Ваша публикация должна содержать хотя бы один символ или одно изображение.",
"internal_edit": "Внутреннее редактирование",
"are_you_sure_go_back_to_global_mode": "Это действие необратимо. Вы уверены, что хотите вернуться в глобальный режим?",
"yes_go_back_to_global_mode": "Да, вернуться в глобальный режим",
"are_you_sure_delete_this_post": "Вы уверены, что хотите удалить эту публикацию?",
"cant_edit_networks_when_creating_set": "Вы не можете редактировать сети при создании набора",
"click_to_exit_global_editing": "Нажмите эту кнопку, чтобы выйти из глобального редактирования и настроить публикацию для этого канала",
"edit_content": "Редактировать содержимое",
"editing_a_specific_network": "Редактирование определённой сети",
"back_to_global": "Вернуться к глобальному",
"delete_post_tooltip": "Удалить публикацию",
"drop_files_here_to_upload": "Перетащите файлы сюда для загрузки",
"insert_emoji": "Вставить эмодзи",
"write_something": "Напишите что-нибудь …"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "İstediğiniz zaman iptal edin.",
"billing_pay_0_start_trial": "Bugün 0$ ödeyin - Ücretsiz denemenizi başlatın!",
"billing_pay_now": "Şimdi Öde",
"billing_per_month": "/ ay"
"billing_per_month": "/ ay",
"select_channels": "Kanalları Seç",
"start_a_new_chat": "Yeni bir sohbet başlat",
"your_assistant": "Asistanınız",
"agent_welcome_message": "Merhaba, ben Postiz ajanınızım 🙌🏻.\n\nBir veya birden fazla gönderiyi birden fazla kanala zamanlayabilir, resim ve video oluşturabilirim.\n\nKullanmak istediğiniz kanalları sol menüden seçebilirsiniz.\n\nÖnceki konuşmalarınızı sağ menüden görebilirsiniz.\n\nAyrıca beni bir MCP Sunucusu olarak da kullanabilirsiniz, Ayarlar >> Genel API bölümünü kontrol edin.",
"last_github_trending": "Son Github Trendleri",
"next_predicted_github_trending": "Sonraki Tahmini Github Trendleri",
"repository": "Depo",
"date": "Tarih",
"total_stars": "Toplam Yıldız",
"total_forks": "Toplam Çatallanma",
"continue_with": "Şununla Devam Et",
"email_address": "E-posta Adresi",
"email_already_exists": "E-posta zaten mevcut",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "Otomatik Gönderiyi Düzenle",
"add_autopost_title": "Otomatik Gönderi Ekle",
"webhook_deleted_successfully": "Webhook başarıyla silindi",
"all_integrations": "Tüm entegrasyonlar",
"specific_integrations": "Belirli entegrasyonlar",
"post_on_next_available_slot": "Bir sonraki uygun zamanda paylaş",
"post_immediately": "Hemen Paylaş",
"could_not_use_rss_feed": "Bu RSS beslemesi kullanılamadı",
"rss_valid": "RSS geçerli!",
"autopost_updated_successfully": "Otomatik gönderi başarıyla güncellendi",
"autopost_added_successfully": "Otomatik gönderi başarıyla eklendi",
"write_your_post_placeholder": "Gönderinizi yazın...",
"select_or_upload_pictures_max_5": "Resim seçin veya yükleyin (aynı anda en fazla 5).",
"you_can_drag_drop_pictures": "Ayrıca resimleri sürükleyip bırakabilirsiniz.",
"you_dont_have_any_media_yet": "Henüz herhangi bir medyanız yok",
"media_library": "Medya Kütüphanesi",
"media_settings": "Medya Ayarları",
"media_editor": "Medya Editörü",
"close": "Kapat",
"me": "Ben",
"noname": "İsimsiz",
"password_reset_link_expired": "Şifre sıfırlama bağlantınızın süresi doldu. Lütfen tekrar deneyin.",
"invalid_api_key": "Geçersiz API anahtarı",
"could_not_connect_to_platform": "Platforma bağlanılamadı",
"web3_provider": "Web3 sağlayıcı",
"add_provider_title": "Sağlayıcı Ekle",
"profile_updated": "Profil güncellendi",
"sets": "Setler",
"invitation_link_sent": "Davet bağlantısı gönderildi",
"send_invitation_link": "Davet Bağlantısı Gönder",
"copy_link": "Bağlantıyı Kopyala",
"are_you_sure_remove_team_member": "Bu ekip üyesini kaldırmak istediğinizden emin misiniz?",
"admin": "Yönetici",
"super_admin": "Süper Yönetici",
"update_webhook": "Webhook'u güncelle",
"add_webhook": "Webhook ekle",
"webhook_updated_successfully": "Webhook başarıyla güncellendi",
"webhook_added_successfully": "Webhook başarıyla eklendi",
"webhook_sent": "Webhook gönderildi",
"today": "Bugün",
"channel_disconnected_click_to_reconnect": "Kanal bağlantısı kesildi, yeniden bağlanmak için tıklayın.",
"channel_disabled_upgrade_plan": "Bu kanal devre dışı, etkinleştirmek için lütfen planınızı yükseltin.",
"channel_added": "Kanal eklendi",
"are_you_sure_disable_channel": "Bu kanalı devre dışı bırakmak istediğinizden emin misiniz?",
"disable_channel_title": "Kanalı Devre Dışı Bırak",
"channel_disabled": "Kanal Devre Dışı",
"are_you_sure_delete_channel": "Bu kanalı silmek istediğinizden emin misiniz?",
"delete_channel_title": "Kanalı Sil",
"delete_posts_before_channel": "Bu kanalı silmeden önce bu kanala ait tüm gönderileri silmelisiniz",
"channel_deleted": "Kanal Silindi",
"channel_enabled": "Kanal Etkinleştirildi",
"time_table_slots": "Zaman Tablosu Dilimleri",
"channel_id_copied": "Kanal kimliği panoya kopyalandı",
"settings_updated": "Ayarlar Güncellendi",
"customer_updated": "Müşteri Güncellendi",
"custom_url": "Özel URL",
"picture": "Resim",
"upgrade_required": "Bu özelliği kullanmak için yükseltme yapmanız gerekiyor",
"move_to_billing": "Faturalandırmaya geç",
"payment_required": "Ödeme Gerekli",
"no_content": "içerik yok",
"select_customer_tooltip": "Müşteri Seç",
"customers": "Müşteriler",
"hour": "Saat",
"minutes": "Dakika",
"updated": "Güncellendi",
"change_bot_picture_title": "Bot Resmini Değiştir",
"select_customer_label": "Müşteri Seç",
"start_typing": "Yazmaya başlayın...",
"choose_set_or_continue": "Bir set seçin veya setsiz devam edin",
"continue_without_set": "Setsiz devam et",
"select_set": "Bir Set Seçin",
"channel_settings": "Ayarlar",
"post_needs_content_or_image": "Gönderinizde en az bir karakter veya bir görsel olmalıdır.",
"please_fix_your_settings": "Lütfen ayarlarınızı düzeltin",
"shortlink_urls_question": "URL'leri kısaltmak ister misiniz? Bu, tıklamalar üzerinde istatistik almanızı sağlar.",
"yes_shortlink_it": "Evet, kısalt!",
"added_successfully": "Başarıyla eklendi",
"updated_successfully": "Başarıyla güncellendi",
"create_post_title": "Gönderi Oluştur",
"post_preview": "Gönderi Önizlemesi",
"check_circles_above": "Yukarıdaki daireleri kontrol edin",
"create_output": ıktı oluştur",
"assistant_initial_message": "Merhaba! Sosyal medya gönderilerinizi düzenlemenize yardımcı olabilirim.",
"no_longer_global_mode": "Artık global modda değil",
"two_days": "İki Gün",
"three_days": "Üç Gün",
"four_days": "Dört Gün",
"five_days": "Beş Gün",
"six_days": "Altı Gün",
"two_weeks": "İki Hafta",
"repeat_post_every_label": "Gönderiyi Her Tekrarla",
"add_new_tag": "Yeni Etiket Ekle",
"tag_name": "Adı",
"post_is_too_long": "gönderi çok uzun, lütfen düzeltin",
"your_post_should_have_at_least_one_character_or_one_image": "Gönderinizde en az bir karakter veya bir görsel olmalıdır.",
"internal_edit": "Dahili Düzenleme",
"are_you_sure_go_back_to_global_mode": "Bu işlem geri alınamaz. Global moda dönmek istediğinizden emin misiniz?",
"yes_go_back_to_global_mode": "Evet, global moda dön",
"are_you_sure_delete_this_post": "Bu gönderiyi silmek istediğinizden emin misiniz?",
"cant_edit_networks_when_creating_set": "Bir set oluştururken ağları düzenleyemezsiniz",
"click_to_exit_global_editing": "Global düzenlemeden çıkmak ve bu kanal için gönderiyi özelleştirmek için bu butona tıklayın",
"edit_content": "İçeriği düzenle",
"editing_a_specific_network": "Belirli Bir Ağı Düzenliyorsunuz",
"back_to_global": "Globale dön",
"delete_post_tooltip": "Gönderiyi Sil",
"drop_files_here_to_upload": "Yüklemek için dosyalarınızı buraya bırakın",
"insert_emoji": "Emoji Ekle",
"write_something": "Bir şeyler yazın …"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "Hủy bất cứ lúc nào.",
"billing_pay_0_start_trial": "Thanh toán $0 hôm nay - Bắt đầu dùng thử miễn phí!",
"billing_pay_now": "Thanh toán ngay",
"billing_per_month": "/ tháng"
"billing_per_month": "/ tháng",
"select_channels": "Chọn kênh",
"start_a_new_chat": "Bắt đầu cuộc trò chuyện mới",
"your_assistant": "Trợ lý của bạn",
"agent_welcome_message": "Xin chào, tôi là trợ lý Postiz của bạn 🙌🏻.\n\nTôi có thể lên lịch đăng một hoặc nhiều bài lên nhiều kênh khác nhau và tạo hình ảnh, video.\n\nBạn có thể chọn các kênh muốn sử dụng từ menu bên trái.\n\nBạn có thể xem các cuộc trò chuyện trước đó từ menu bên phải.\n\nBạn cũng có thể sử dụng tôi như một MCP Server, kiểm tra Cài đặt >> Public API",
"last_github_trending": "Xu hướng Github gần đây",
"next_predicted_github_trending": "Dự đoán xu hướng Github tiếp theo",
"repository": "Kho lưu trữ",
"date": "Ngày",
"total_stars": "Tổng số sao",
"total_forks": "Tổng số nhánh",
"continue_with": "Tiếp tục với",
"email_address": "Địa chỉ email",
"email_already_exists": "Email đã tồn tại",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "Chỉnh sửa tự động đăng",
"add_autopost_title": "Thêm tự động đăng",
"webhook_deleted_successfully": "Đã xóa webhook thành công",
"all_integrations": "Tất cả tích hợp",
"specific_integrations": "Tích hợp cụ thể",
"post_on_next_available_slot": "Đăng vào khung giờ tiếp theo có sẵn",
"post_immediately": "Đăng ngay lập tức",
"could_not_use_rss_feed": "Không thể sử dụng nguồn cấp RSS này",
"rss_valid": "RSS hợp lệ!",
"autopost_updated_successfully": "Cập nhật tự động đăng thành công",
"autopost_added_successfully": "Tự động đăng bài đã được thêm thành công",
"write_your_post_placeholder": "Viết bài đăng của bạn...",
"select_or_upload_pictures_max_5": "Chọn hoặc tải lên hình ảnh (tối đa 5 hình cùng lúc).",
"you_can_drag_drop_pictures": "Bạn cũng có thể kéo và thả hình ảnh.",
"you_dont_have_any_media_yet": "Bạn chưa có phương tiện nào",
"media_library": "Thư viện phương tiện",
"media_settings": "Cài đặt phương tiện",
"media_editor": "Trình chỉnh sửa phương tiện",
"close": "Đóng",
"me": "Tôi",
"noname": "Không tên",
"password_reset_link_expired": "Liên kết đặt lại mật khẩu của bạn đã hết hạn. Vui lòng thử lại.",
"invalid_api_key": "API key không hợp lệ",
"could_not_connect_to_platform": "Không thể kết nối với nền tảng",
"web3_provider": "Nhà cung cấp Web3",
"add_provider_title": "Thêm nhà cung cấp",
"profile_updated": "Cập nhật hồ sơ thành công",
"sets": "Bộ",
"invitation_link_sent": "Đã gửi liên kết mời",
"send_invitation_link": "Gửi liên kết mời",
"copy_link": "Sao chép liên kết",
"are_you_sure_remove_team_member": "Bạn có chắc chắn muốn xóa thành viên này khỏi nhóm không?",
"admin": "Quản trị viên",
"super_admin": "Siêu quản trị viên",
"update_webhook": "Cập nhật webhook",
"add_webhook": "Thêm webhook",
"webhook_updated_successfully": "Cập nhật webhook thành công",
"webhook_added_successfully": "Thêm webhook thành công",
"webhook_sent": "Đã gửi webhook",
"today": "Hôm nay",
"channel_disconnected_click_to_reconnect": "Kênh đã bị ngắt kết nối, nhấn để kết nối lại.",
"channel_disabled_upgrade_plan": "Kênh này đã bị vô hiệu hóa, vui lòng nâng cấp gói của bạn để kích hoạt.",
"channel_added": "Đã thêm kênh",
"are_you_sure_disable_channel": "Bạn có chắc chắn muốn vô hiệu hóa kênh này không?",
"disable_channel_title": "Vô hiệu hóa kênh",
"channel_disabled": "Kênh đã bị vô hiệu hóa",
"are_you_sure_delete_channel": "Bạn có chắc chắn muốn xóa kênh này không?",
"delete_channel_title": "Xóa kênh",
"delete_posts_before_channel": "Bạn phải xóa tất cả các bài đăng liên kết với kênh này trước khi xóa nó",
"channel_deleted": "Đã xóa kênh",
"channel_enabled": "Kênh đã được kích hoạt",
"time_table_slots": "Khung giờ thời gian biểu",
"channel_id_copied": "Đã sao chép ID kênh vào bộ nhớ tạm",
"settings_updated": "Đã cập nhật cài đặt",
"customer_updated": "Đã cập nhật khách hàng",
"custom_url": "URL tùy chỉnh",
"picture": "Hình ảnh",
"upgrade_required": "Bạn cần nâng cấp để sử dụng tính năng này",
"move_to_billing": "Chuyển đến thanh toán",
"payment_required": "Yêu cầu thanh toán",
"no_content": "không có nội dung",
"select_customer_tooltip": "Chọn khách hàng",
"customers": "Khách hàng",
"hour": "Giờ",
"minutes": "Phút",
"updated": "Đã cập nhật",
"change_bot_picture_title": "Thay đổi ảnh Bot",
"select_customer_label": "Chọn khách hàng",
"start_typing": "Bắt đầu nhập...",
"choose_set_or_continue": "Chọn một bộ hoặc tiếp tục mà không có bộ nào",
"continue_without_set": "Tiếp tục mà không có bộ",
"select_set": "Chọn một bộ",
"channel_settings": "Cài đặt",
"post_needs_content_or_image": "Bài đăng của bạn cần có ít nhất một ký tự hoặc một hình ảnh.",
"please_fix_your_settings": "Vui lòng sửa cài đặt của bạn",
"shortlink_urls_question": "Bạn có muốn rút gọn các URL không? Điều này sẽ giúp bạn thống kê số lần nhấp chuột",
"yes_shortlink_it": "Vâng, hãy rút gọn!",
"added_successfully": "Thêm thành công",
"updated_successfully": "Cập nhật thành công",
"create_post_title": "Tạo bài đăng",
"post_preview": "Xem trước bài đăng",
"check_circles_above": "Kiểm tra các vòng tròn phía trên",
"create_output": "Tạo kết quả",
"assistant_initial_message": "Chào bạn! Tôi có thể giúp bạn chỉnh sửa các bài đăng trên mạng xã hội.",
"no_longer_global_mode": "Không còn ở chế độ toàn cục",
"two_days": "Hai ngày",
"three_days": "Ba ngày",
"four_days": "Bốn ngày",
"five_days": "Năm ngày",
"six_days": "Sáu ngày",
"two_weeks": "Hai tuần",
"repeat_post_every_label": "Lặp lại bài đăng mỗi",
"add_new_tag": "Thêm thẻ mới",
"tag_name": "Tên",
"post_is_too_long": "bài đăng quá dài, vui lòng chỉnh sửa",
"your_post_should_have_at_least_one_character_or_one_image": "Bài đăng của bạn phải có ít nhất một ký tự hoặc một hình ảnh.",
"internal_edit": "Chỉnh sửa nội bộ",
"are_you_sure_go_back_to_global_mode": "Hành động này không thể hoàn tác. Bạn có chắc chắn muốn quay lại chế độ toàn cục không?",
"yes_go_back_to_global_mode": "Vâng, quay lại chế độ toàn cục",
"are_you_sure_delete_this_post": "Bạn có chắc chắn muốn xóa bài đăng này không?",
"cant_edit_networks_when_creating_set": "Bạn không thể chỉnh sửa các mạng khi đang tạo một bộ",
"click_to_exit_global_editing": "Nhấn vào nút này để thoát chỉnh sửa toàn cục và tùy chỉnh bài đăng cho kênh này",
"edit_content": "Chỉnh sửa nội dung",
"editing_a_specific_network": "Đang chỉnh sửa một mạng cụ thể",
"back_to_global": "Quay lại toàn cục",
"delete_post_tooltip": "Xóa bài đăng",
"drop_files_here_to_upload": "Kéo thả tệp vào đây để tải lên",
"insert_emoji": "Chèn biểu tượng cảm xúc",
"write_something": "Viết gì đó …"
}

View File

@ -535,5 +535,129 @@
"billing_cancel_anytime_short": "随时取消。",
"billing_pay_0_start_trial": "今日支付$0 - 开始您的免费试用!",
"billing_pay_now": "立即支付",
"billing_per_month": "每月"
"billing_per_month": "每月",
"select_channels": "选择频道",
"start_a_new_chat": "开始新聊天",
"your_assistant": "你的助手",
"agent_welcome_message": "你好,我是你的 Postiz 代理 🙌🏻。\n\n我可以为多个频道安排一条或多条帖子并生成图片和视频。\n\n你可以从左侧菜单中选择你想要使用的频道。\n\n你可以从右侧菜单中查看你之前的对话。\n\n你也可以将我用作 MCP 服务器,查看设置 >> 公共 API。",
"last_github_trending": "最新 Github 趋势",
"next_predicted_github_trending": "下一个预测的 Github 趋势",
"repository": "仓库",
"date": "日期",
"total_stars": "总星标数",
"total_forks": "总分支数",
"continue_with": "继续使用",
"email_address": "电子邮件地址",
"email_already_exists": "电子邮件已存在",
"google": "Google",
"farcaster": "Farcaster",
"edit_autopost": "编辑自动发布",
"add_autopost_title": "添加自动发布",
"webhook_deleted_successfully": "Webhook 删除成功",
"all_integrations": "所有集成",
"specific_integrations": "特定集成",
"post_on_next_available_slot": "在下一个可用时间发布",
"post_immediately": "立即发布",
"could_not_use_rss_feed": "无法使用此 RSS 源",
"rss_valid": "RSS 有效!",
"autopost_updated_successfully": "自动发布更新成功",
"autopost_added_successfully": "自动发布添加成功",
"write_your_post_placeholder": "写下你的帖子...",
"select_or_upload_pictures_max_5": "选择或上传图片每次最多5张。",
"you_can_drag_drop_pictures": "你也可以拖放图片。",
"you_dont_have_any_media_yet": "你还没有任何媒体",
"media_library": "媒体库",
"media_settings": "媒体设置",
"media_editor": "媒体编辑器",
"close": "关闭",
"me": "我",
"noname": "无名",
"password_reset_link_expired": "您的密码重置链接已过期,请重试。",
"invalid_api_key": "无效的API密钥",
"could_not_connect_to_platform": "无法连接到平台",
"web3_provider": "Web3提供商",
"add_provider_title": "添加提供商",
"profile_updated": "个人资料已更新",
"sets": "集合",
"invitation_link_sent": "邀请链接已发送",
"send_invitation_link": "发送邀请链接",
"copy_link": "复制链接",
"are_you_sure_remove_team_member": "您确定要移除此团队成员吗?",
"admin": "管理员",
"super_admin": "超级管理员",
"update_webhook": "更新Webhook",
"add_webhook": "添加 webhook",
"webhook_updated_successfully": "Webhook 更新成功",
"webhook_added_successfully": "Webhook 添加成功",
"webhook_sent": "Webhook 已发送",
"today": "今天",
"channel_disconnected_click_to_reconnect": "频道已断开连接,点击重新连接。",
"channel_disabled_upgrade_plan": "该频道已被禁用,请升级您的套餐以启用。",
"channel_added": "频道已添加",
"are_you_sure_disable_channel": "您确定要禁用此频道吗?",
"disable_channel_title": "禁用频道",
"channel_disabled": "频道已禁用",
"are_you_sure_delete_channel": "您确定要删除此频道吗?",
"delete_channel_title": "删除频道",
"delete_posts_before_channel": "您需要先删除与此频道相关的所有帖子,然后才能删除该频道",
"channel_deleted": "频道已删除",
"channel_enabled": "频道已启用",
"time_table_slots": "时间表时段",
"channel_id_copied": "频道 ID 已复制到剪贴板",
"settings_updated": "设置已更新",
"customer_updated": "客户已更新",
"custom_url": "自定义 URL",
"picture": "图片",
"upgrade_required": "您需要升级才能使用此功能",
"move_to_billing": "前往结算",
"payment_required": "需要付款",
"no_content": "无内容",
"select_customer_tooltip": "选择客户",
"customers": "客户",
"hour": "小时",
"minutes": "分钟",
"updated": "已更新",
"change_bot_picture_title": "更换机器人头像",
"select_customer_label": "选择客户",
"start_typing": "开始输入...",
"choose_set_or_continue": "选择一个集合或继续不选择",
"continue_without_set": "不选择集合继续",
"select_set": "选择集合",
"channel_settings": "设置",
"post_needs_content_or_image": "您的帖子至少需要一个字符或一张图片。",
"please_fix_your_settings": "请修正您的设置",
"shortlink_urls_question": "您想要对网址进行短链处理吗?这样可以统计点击次数。",
"yes_shortlink_it": "是的,短链处理!",
"added_successfully": "添加成功",
"updated_successfully": "更新成功",
"create_post_title": "创建帖子",
"post_preview": "帖子预览",
"check_circles_above": "请检查上方的圆圈",
"create_output": "生成内容",
"assistant_initial_message": "您好!我可以帮助您优化社交媒体帖子。",
"no_longer_global_mode": "已退出全局模式",
"two_days": "两天",
"three_days": "三天",
"four_days": "四天",
"five_days": "五天",
"six_days": "六天",
"two_weeks": "两周",
"repeat_post_every_label": "每隔...重复发布",
"add_new_tag": "添加新标签",
"tag_name": "名称",
"post_is_too_long": "帖子太长,请修改",
"your_post_should_have_at_least_one_character_or_one_image": "您的帖子至少应包含一个字符或一张图片。",
"internal_edit": "内部编辑",
"are_you_sure_go_back_to_global_mode": "此操作不可逆。您确定要返回全局模式吗?",
"yes_go_back_to_global_mode": "是的,返回全局模式",
"are_you_sure_delete_this_post": "您确定要删除此帖子吗?",
"cant_edit_networks_when_creating_set": "创建集合时无法编辑网络",
"click_to_exit_global_editing": "点击此按钮退出全局编辑,并为该频道自定义帖子",
"edit_content": "编辑内容",
"editing_a_specific_network": "正在编辑特定网络",
"back_to_global": "返回全局",
"delete_post_tooltip": "删除帖子",
"drop_files_here_to_upload": "将文件拖到此处以上传",
"insert_emoji": "插入表情",
"write_something": "写点什么…"
}