mirror of
https://github.com/CompassConnections/Compass.git
synced 2026-03-24 17:41:27 -04:00
Add multi language support for emails
This commit is contained in:
@@ -60,6 +60,14 @@ const t = useT()
|
||||
No exceptions.
|
||||
Do not manually access locale files.
|
||||
|
||||
For the backend, use
|
||||
|
||||
```tsx
|
||||
import {createT} from 'shared/locale'
|
||||
|
||||
const t = createT(locale)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3️⃣ Replace Hardcoded Strings
|
||||
@@ -121,8 +129,8 @@ After updating the component:
|
||||
1. Open:
|
||||
|
||||
```
|
||||
web/messages/fr.json
|
||||
web/messages/de.json
|
||||
common/src/messages/fr.json
|
||||
common/src/messages/de.json
|
||||
...
|
||||
```
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"git": {
|
||||
"revision": "704bcb4",
|
||||
"commitDate": "2025-12-15 13:38:09 +0200",
|
||||
"revision": "c085e8f",
|
||||
"commitDate": "2026-02-22 21:51:08 +0100",
|
||||
"author": "MartinBraquet",
|
||||
"message": "Increase API docs font size on mobile"
|
||||
"message": "Add guidelines for adding translations to existing files"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@compass/api",
|
||||
"description": "Backend API endpoints",
|
||||
"version": "1.12.0",
|
||||
"version": "1.13.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"watch:serve": "tsx watch src/serve.ts",
|
||||
|
||||
@@ -88,6 +88,7 @@ import {updateMe} from './update-me'
|
||||
import {updateNotifSettings} from './update-notif-setting'
|
||||
import {updatePrivateUserMessageChannel} from './update-private-user-message-channel'
|
||||
import {updateProfile} from './update-profile'
|
||||
import {updateUserLocale} from './update-user-locale'
|
||||
|
||||
// const corsOptions: CorsOptions = {
|
||||
// origin: ['*'], // Only allow requests from this domain
|
||||
@@ -371,6 +372,7 @@ const handlers: {[k in APIPath]: APIHandler<k>} = {
|
||||
'star-profile': starProfile,
|
||||
'update-notif-settings': updateNotifSettings,
|
||||
'update-options': updateOptions,
|
||||
'update-user-locale': updateUserLocale,
|
||||
'update-private-user-message-channel': updatePrivateUserMessageChannel,
|
||||
'update-profile': updateProfile,
|
||||
'user/by-id/:id': getUser,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {setLastOnlineTimeUser} from 'api/set-last-online-time'
|
||||
import {defaultLocale} from 'common/constants'
|
||||
import {RESERVED_PATHS} from 'common/envs/constants'
|
||||
import {IS_LOCAL} from 'common/hosting/constants'
|
||||
import {convertPrivateUser, convertUser} from 'common/supabase/users'
|
||||
@@ -19,7 +20,7 @@ import {getUser, getUserByUsername, log} from 'shared/utils'
|
||||
import {APIError, APIHandler} from './helpers/endpoint'
|
||||
|
||||
export const createUser: APIHandler<'create-user'> = async (props, auth, req) => {
|
||||
const {deviceToken: preDeviceToken} = props
|
||||
const {deviceToken: preDeviceToken, locale = defaultLocale} = props
|
||||
const firebaseUser = await admin.auth().getUser(auth.uid)
|
||||
|
||||
const testUserAKAEmailPasswordUser = firebaseUser.providerData[0].providerId === 'password'
|
||||
@@ -93,6 +94,7 @@ export const createUser: APIHandler<'create-user'> = async (props, auth, req) =>
|
||||
const privateUser: PrivateUser = {
|
||||
id: auth.uid,
|
||||
email,
|
||||
locale,
|
||||
initialIpAddress: ip,
|
||||
initialDeviceToken: deviceToken,
|
||||
notificationPreferences: getDefaultNotificationPreferences(),
|
||||
|
||||
@@ -186,9 +186,16 @@ const notifyOtherUserInChannelIfInactive = async (
|
||||
body: textContent,
|
||||
url: `/messages/${channelId}`,
|
||||
}
|
||||
await sendWebNotifications(pg, receiverId, JSON.stringify(payload))
|
||||
await sendMobileNotifications(pg, receiverId, payload)
|
||||
|
||||
try {
|
||||
await sendWebNotifications(pg, receiverId, JSON.stringify(payload))
|
||||
} catch (err) {
|
||||
console.error('Failed to send web notification:', err)
|
||||
}
|
||||
try {
|
||||
await sendMobileNotifications(pg, receiverId, payload)
|
||||
} catch (err) {
|
||||
console.error('Failed to send mobile notification:', err)
|
||||
}
|
||||
const startOfDay = dayjs().tz('America/Los_Angeles').startOf('day').toISOString()
|
||||
const previousMessagesThisDayBetweenTheseUsers = await pg.one(
|
||||
`select count(*)
|
||||
|
||||
18
backend/api/src/update-user-locale.ts
Normal file
18
backend/api/src/update-user-locale.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import {createSupabaseDirectClient} from 'shared/supabase/init'
|
||||
import {updatePrivateUser} from 'shared/supabase/users'
|
||||
import {broadcastUpdatedPrivateUser} from 'shared/websockets/helpers'
|
||||
|
||||
import {APIError, APIHandler} from './helpers/endpoint'
|
||||
|
||||
export const updateUserLocale: APIHandler<'update-user-locale'> = async ({locale}, auth) => {
|
||||
if (!auth?.uid) throw new APIError(401, 'Not authenticated')
|
||||
|
||||
const pg = createSupabaseDirectClient()
|
||||
|
||||
// Update the private user's data with the new locale
|
||||
await updatePrivateUser(pg, auth.uid, {
|
||||
locale,
|
||||
})
|
||||
|
||||
broadcastUpdatedPrivateUser(auth.uid)
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import NewSearchAlertsEmail from 'email/new-search_alerts'
|
||||
import WelcomeEmail from 'email/welcome'
|
||||
import * as admin from 'firebase-admin'
|
||||
import {getOptionsIdsToLabels} from 'shared/supabase/options'
|
||||
import {createT} from 'shared/locale'
|
||||
|
||||
export const fromEmail = 'Compass <compass@compassmeet.com>'
|
||||
|
||||
@@ -65,9 +66,17 @@ export const sendNewMessageEmail = async (
|
||||
return
|
||||
}
|
||||
|
||||
const locale = privateUser?.locale
|
||||
const t = createT(locale)
|
||||
console.log(`Sending email to ${privateUser.email} in ${locale}`)
|
||||
|
||||
const subject = t('email.new_message.subject', '{creatorName} sent you a message!', {
|
||||
creatorName: fromUser.name,
|
||||
})
|
||||
|
||||
return await sendEmail({
|
||||
from: fromEmail,
|
||||
subject: `${fromUser.name} sent you a message!`,
|
||||
subject,
|
||||
to: privateUser.email,
|
||||
html: await render(
|
||||
<NewMessageEmail
|
||||
@@ -77,6 +86,7 @@ export const sendNewMessageEmail = async (
|
||||
channelId={channelId}
|
||||
unsubscribeUrl={unsubscribeUrl}
|
||||
email={privateUser.email}
|
||||
locale={locale}
|
||||
/>,
|
||||
),
|
||||
})
|
||||
@@ -85,9 +95,16 @@ export const sendNewMessageEmail = async (
|
||||
export const sendWelcomeEmail = async (toUser: User, privateUser: PrivateUser) => {
|
||||
if (!privateUser.email) return
|
||||
const verificationLink = await admin.auth().generateEmailVerificationLink(privateUser.email)
|
||||
|
||||
const locale = privateUser?.locale
|
||||
const t = createT(locale)
|
||||
console.log(`Sending email to ${privateUser.email} in ${locale}`)
|
||||
|
||||
const subject = t('email.welcome.subject', 'Welcome to Compass!')
|
||||
|
||||
return await sendEmail({
|
||||
from: fromEmail,
|
||||
subject: `Welcome to Compass!`,
|
||||
subject,
|
||||
to: privateUser.email,
|
||||
html: await render(
|
||||
<WelcomeEmail
|
||||
@@ -95,6 +112,7 @@ export const sendWelcomeEmail = async (toUser: User, privateUser: PrivateUser) =
|
||||
unsubscribeUrl={UNSUBSCRIBE_URL}
|
||||
email={privateUser.email}
|
||||
verificationLink={verificationLink}
|
||||
locale={locale}
|
||||
/>,
|
||||
),
|
||||
})
|
||||
@@ -112,14 +130,17 @@ export const sendSearchAlertsEmail = async (
|
||||
const email = privateUser.email
|
||||
if (!email || !sendToEmail) return
|
||||
|
||||
// Determine locale (fallback to 'en') and load option labels before rendering
|
||||
// TODO: add locale to user array
|
||||
const locale = (toUser as any)?.locale ?? 'en'
|
||||
const locale = privateUser?.locale
|
||||
const t = createT(locale)
|
||||
console.log(`Sending email to ${privateUser.email} in ${locale}`)
|
||||
|
||||
const optionIdsToLabels = await getOptionsIdsToLabels(locale)
|
||||
|
||||
const subject = t('email.search_alerts.subject', 'People aligned with your values just joined')
|
||||
|
||||
return await sendEmail({
|
||||
from: fromEmail,
|
||||
subject: `People aligned with your values just joined`,
|
||||
subject,
|
||||
to: email,
|
||||
html: await render(
|
||||
<NewSearchAlertsEmail
|
||||
@@ -128,6 +149,7 @@ export const sendSearchAlertsEmail = async (
|
||||
unsubscribeUrl={unsubscribeUrl}
|
||||
email={email}
|
||||
optionIdsToLabels={optionIdsToLabels}
|
||||
locale={locale}
|
||||
/>,
|
||||
),
|
||||
})
|
||||
@@ -145,9 +167,17 @@ export const sendNewEndorsementEmail = async (
|
||||
)
|
||||
if (!privateUser.email || !sendToEmail) return
|
||||
|
||||
const locale = privateUser?.locale
|
||||
const t = createT(locale)
|
||||
console.log(`Sending email to ${privateUser.email} in ${locale}`)
|
||||
|
||||
const subject = t('email.new_endorsement.subject', '{fromUserName} just endorsed you!', {
|
||||
fromUserName: fromUser.name,
|
||||
})
|
||||
|
||||
return await sendEmail({
|
||||
from: fromEmail,
|
||||
subject: `${fromUser.name} just endorsed you!`,
|
||||
subject,
|
||||
to: privateUser.email,
|
||||
html: await render(
|
||||
<NewEndorsementEmail
|
||||
@@ -156,6 +186,7 @@ export const sendNewEndorsementEmail = async (
|
||||
endorsementText={text}
|
||||
unsubscribeUrl={unsubscribeUrl}
|
||||
email={privateUser.email}
|
||||
locale={locale}
|
||||
/>,
|
||||
),
|
||||
})
|
||||
|
||||
@@ -4,76 +4,44 @@ import type {User} from 'common/user'
|
||||
// for email template testing
|
||||
|
||||
// A subset of Profile with only essential fields for testing
|
||||
export type PartialProfile = Pick<ProfileRow,
|
||||
'id' | 'user_id' | 'created_time' | 'last_modification_time' |
|
||||
'disabled' | 'looking_for_matches' | 'messaging_status' |
|
||||
'comments_enabled' | 'visibility'
|
||||
> & Partial<ProfileRow>
|
||||
export type PartialProfile = Pick<
|
||||
ProfileRow,
|
||||
| 'id'
|
||||
| 'user_id'
|
||||
| 'created_time'
|
||||
| 'last_modification_time'
|
||||
| 'disabled'
|
||||
| 'looking_for_matches'
|
||||
| 'messaging_status'
|
||||
| 'comments_enabled'
|
||||
| 'visibility'
|
||||
> &
|
||||
Partial<ProfileRow>
|
||||
|
||||
export const mockUser: User = {
|
||||
createdTime: 0,
|
||||
bio: 'the futa in futarchy',
|
||||
website: 'sincl.ai',
|
||||
avatarUrl:
|
||||
'https://firebasestorage.googleapis.com/v0/b/mantic-markets.appspot.com/o/user-images%2FSinclair%2FbqSXdzkn1z.JPG?alt=media&token=7779230a-9f5d-42b5-839f-fbdfef31a3ac',
|
||||
idVerified: true,
|
||||
discordHandle: 'sinclaether#5570',
|
||||
twitterHandle: 'singularitttt',
|
||||
verifiedPhone: true,
|
||||
// sweepstakesVerified: true,
|
||||
avatarUrl: 'https://martinbraquet.com/wp-content/uploads/BDo_Tbzj.jpeg',
|
||||
id: '0k1suGSJKVUnHbCPEhHNpgZPkUP2',
|
||||
username: 'Sinclair',
|
||||
name: 'Sinclair',
|
||||
// isAdmin: true,
|
||||
// isTrustworthy: false,
|
||||
username: 'Martin',
|
||||
name: 'Martin',
|
||||
link: {
|
||||
site: 'sincl.ai',
|
||||
x: 'singularitttt',
|
||||
discord: 'sinclaether#5570',
|
||||
site: 'martinbraquet.com',
|
||||
x: 'martin',
|
||||
},
|
||||
}
|
||||
|
||||
export const sinclairProfile: PartialProfile = {
|
||||
// Required fields
|
||||
id: 55,
|
||||
user_id: '0k1suGSJKVUnHbCPEhHNpgZPkUP2',
|
||||
created_time: '2023-10-27T00:41:59.851776+00:00',
|
||||
last_modification_time: '2024-05-17T02:11:48.83+00:00',
|
||||
disabled: false,
|
||||
looking_for_matches: true,
|
||||
messaging_status: 'open',
|
||||
comments_enabled: true,
|
||||
visibility: 'public',
|
||||
|
||||
// Optional commonly used fields for testing
|
||||
city: 'San Francisco',
|
||||
gender: 'trans-female',
|
||||
age: 25,
|
||||
}
|
||||
|
||||
export const jamesUser: User = {
|
||||
createdTime: 0,
|
||||
bio: 'Manifold cofounder! We got the AMM (What!?). We got the order book (What!?). We got the combination AMM and order book!',
|
||||
website: 'https://calendly.com/jamesgrugett/manifold',
|
||||
avatarUrl:
|
||||
'https://firebasestorage.googleapis.com/v0/b/mantic-markets.appspot.com/o/user-images%2FJamesGrugett%2FefVzXKc9iz.png?alt=media&token=5c205402-04d5-4e64-be65-9d8b4836eb03',
|
||||
idVerified: true,
|
||||
// fromManifold: true,
|
||||
discordHandle: '',
|
||||
twitterHandle: 'jahooma',
|
||||
verifiedPhone: true,
|
||||
// sweepstakesVerified: true,
|
||||
avatarUrl: 'https://martinbraquet.com/wp-content/uploads/BDo_Tbzj.jpeg',
|
||||
id: '5LZ4LgYuySdL1huCWe7bti02ghx2',
|
||||
username: 'JamesGrugett',
|
||||
username: 'James',
|
||||
name: 'James',
|
||||
link: {
|
||||
x: 'jahooma',
|
||||
discord: '',
|
||||
x: 'james',
|
||||
},
|
||||
}
|
||||
|
||||
export const jamesProfile: PartialProfile = {
|
||||
// Required fields
|
||||
id: 2,
|
||||
user_id: '5LZ4LgYuySdL1huCWe7bti02ghx2',
|
||||
created_time: '2023-10-21T21:18:26.691211+00:00',
|
||||
@@ -83,8 +51,6 @@ export const jamesProfile: PartialProfile = {
|
||||
messaging_status: 'open',
|
||||
comments_enabled: true,
|
||||
visibility: 'public',
|
||||
|
||||
// Optional commonly used fields for testing
|
||||
city: 'San Francisco',
|
||||
gender: 'male',
|
||||
age: 32,
|
||||
|
||||
@@ -15,6 +15,7 @@ import {type User} from 'common/user'
|
||||
import {DOMAIN} from 'common/envs/constants'
|
||||
import {jamesUser, mockUser} from './functions/mock'
|
||||
import {button, container, content, Footer, main, paragraph} from 'email/utils'
|
||||
import {createT} from 'shared/locale'
|
||||
|
||||
interface NewEndorsementEmailProps {
|
||||
fromUser: User
|
||||
@@ -22,6 +23,7 @@ interface NewEndorsementEmailProps {
|
||||
endorsementText: string
|
||||
unsubscribeUrl: string
|
||||
email?: string
|
||||
locale?: string
|
||||
}
|
||||
|
||||
export const NewEndorsementEmail = ({
|
||||
@@ -30,15 +32,17 @@ export const NewEndorsementEmail = ({
|
||||
endorsementText,
|
||||
unsubscribeUrl,
|
||||
email,
|
||||
locale,
|
||||
}: NewEndorsementEmailProps) => {
|
||||
const name = onUser.name.split(' ')[0]
|
||||
const t = createT(locale)
|
||||
|
||||
const endorsementUrl = `https://${DOMAIN}/${onUser.username}`
|
||||
|
||||
return (
|
||||
<Html>
|
||||
<Head />
|
||||
<Preview>New endorsement from {fromUser.name}</Preview>
|
||||
<Preview>{t('email.new_endorsement.preview', 'New endorsement from {fromUserName}', {fromUserName: fromUser.name})}</Preview>
|
||||
<Body style={main}>
|
||||
<Container style={container}>
|
||||
{/*<Section style={logoContainer}>*/}
|
||||
@@ -51,9 +55,9 @@ export const NewEndorsementEmail = ({
|
||||
{/*</Section>*/}
|
||||
|
||||
<Section style={content}>
|
||||
<Text style={paragraph}>Hi {name},</Text>
|
||||
<Text style={paragraph}>{t('email.new_endorsement.greeting', 'Hi {name},', {name})}</Text>
|
||||
|
||||
<Text style={paragraph}>{fromUser.name} just endorsed you!</Text>
|
||||
<Text style={paragraph}>{t('email.new_endorsement.message', '{fromUserName} endorsed you!', {fromUserName: fromUser.name})}</Text>
|
||||
|
||||
<Section style={endorsementContainer}>
|
||||
<Row>
|
||||
@@ -72,12 +76,12 @@ export const NewEndorsementEmail = ({
|
||||
</Row>
|
||||
|
||||
<Button href={endorsementUrl} style={button}>
|
||||
View endorsement
|
||||
{t('email.new_endorsement.viewButton', 'View endorsement')}
|
||||
</Button>
|
||||
</Section>
|
||||
</Section>
|
||||
|
||||
<Footer unsubscribeUrl={unsubscribeUrl} email={email ?? name} />
|
||||
<Footer unsubscribeUrl={unsubscribeUrl} email={email ?? name} locale={locale} />
|
||||
</Container>
|
||||
</Body>
|
||||
</Html>
|
||||
|
||||
@@ -5,6 +5,7 @@ import {type ProfileRow} from 'common/profiles/profile'
|
||||
import {jamesProfile, jamesUser, mockUser} from './functions/mock'
|
||||
import {DOMAIN} from 'common/envs/constants'
|
||||
import {button, container, content, Footer, imageContainer, main, paragraph} from 'email/utils'
|
||||
import {createT} from 'shared/locale'
|
||||
|
||||
interface NewMessageEmailProps {
|
||||
fromUser: User
|
||||
@@ -13,6 +14,7 @@ interface NewMessageEmailProps {
|
||||
channelId: number
|
||||
unsubscribeUrl: string
|
||||
email?: string
|
||||
locale?: string
|
||||
}
|
||||
|
||||
export const NewMessageEmail = ({
|
||||
@@ -22,16 +24,20 @@ export const NewMessageEmail = ({
|
||||
channelId,
|
||||
unsubscribeUrl,
|
||||
email,
|
||||
locale,
|
||||
}: NewMessageEmailProps) => {
|
||||
const name = toUser.name.split(' ')[0]
|
||||
const creatorName = fromUser.name
|
||||
const messagesUrl = `https://${DOMAIN}/messages/${channelId}`
|
||||
// const userImgSrc = getOgImageUrl(fromUser, fromUserProfile)
|
||||
const t = createT(locale)
|
||||
|
||||
return (
|
||||
<Html>
|
||||
<Head />
|
||||
<Preview>New message from {creatorName}</Preview>
|
||||
<Preview>
|
||||
{t('email.new_message.preview', 'New message from {creatorName}', {creatorName})}
|
||||
</Preview>
|
||||
<Body style={main}>
|
||||
<Container style={container}>
|
||||
{/*<Section style={logoContainer}>*/}
|
||||
@@ -44,9 +50,11 @@ export const NewMessageEmail = ({
|
||||
{/*</Section>*/}
|
||||
|
||||
<Section style={content}>
|
||||
<Text style={paragraph}>Hi {name},</Text>
|
||||
<Text style={paragraph}>{t('email.new_message.greeting', 'Hi {name},', {name})}</Text>
|
||||
|
||||
<Text style={paragraph}>{creatorName} just messaged you!</Text>
|
||||
<Text style={paragraph}>
|
||||
{t('email.new_message.message', '{creatorName} just messaged you!', {creatorName})}
|
||||
</Text>
|
||||
|
||||
<Section style={imageContainer}>
|
||||
{/*<Link href={messagesUrl}>*/}
|
||||
@@ -60,12 +68,12 @@ export const NewMessageEmail = ({
|
||||
{/*</Link>*/}
|
||||
|
||||
<Button href={messagesUrl} style={button}>
|
||||
View message
|
||||
{t('email.new_message.viewButton', 'View message')}
|
||||
</Button>
|
||||
</Section>
|
||||
</Section>
|
||||
|
||||
<Footer unsubscribeUrl={unsubscribeUrl} email={email ?? name} />
|
||||
<Footer unsubscribeUrl={unsubscribeUrl} email={email ?? name} locale={locale} />
|
||||
</Container>
|
||||
</Body>
|
||||
</Html>
|
||||
|
||||
@@ -7,6 +7,7 @@ import {container, content, Footer, main, paragraph} from 'email/utils'
|
||||
import {MatchesType} from 'common/profiles/bookmarked_searches'
|
||||
import {formatFilters, locationType} from 'common/searches'
|
||||
import {FilterFields} from 'common/filters'
|
||||
import {createT} from 'shared/locale'
|
||||
|
||||
interface NewMessageEmailProps {
|
||||
toUser: User
|
||||
@@ -14,6 +15,7 @@ interface NewMessageEmailProps {
|
||||
unsubscribeUrl: string
|
||||
email?: string
|
||||
optionIdsToLabels?: Record<string, Record<string, string>>
|
||||
locale?: string
|
||||
}
|
||||
|
||||
export const NewSearchAlertsEmail = ({
|
||||
@@ -22,22 +24,28 @@ export const NewSearchAlertsEmail = ({
|
||||
matches,
|
||||
email,
|
||||
optionIdsToLabels = {},
|
||||
locale,
|
||||
}: NewMessageEmailProps) => {
|
||||
const name = toUser.name.split(' ')[0]
|
||||
const t = createT(locale)
|
||||
const measurementSystem = locale === 'en' ? 'imperial' : 'metric'
|
||||
|
||||
return (
|
||||
<Html>
|
||||
<Head />
|
||||
<Preview>New people share your values — reach out and connect</Preview>
|
||||
<Preview>
|
||||
{t('email.search_alerts.preview', 'New people share your values — reach out and connect')}
|
||||
</Preview>
|
||||
<Body style={main}>
|
||||
<Container style={container}>
|
||||
<Section style={content}>
|
||||
<Text style={paragraph}>Hi {name},</Text>
|
||||
<Text style={paragraph}>{t('email.search_alerts.greeting', 'Hi {name},', {name})}</Text>
|
||||
|
||||
<Text style={paragraph}>
|
||||
In the past 24 hours, new people joined Compass whose values and interests align with
|
||||
your saved searches. Compass is a gift from the community, and it comes alive when
|
||||
people like you take the step to connect with one another.
|
||||
{t(
|
||||
'email.search_alerts.intro',
|
||||
'In the past 24 hours, new people joined Compass whose values and interests align with your saved searches. Compass is a gift from the community, and it comes alive when people like you take the step to connect with one another.',
|
||||
)}
|
||||
</Text>
|
||||
|
||||
{(matches || []).map((match) => (
|
||||
@@ -47,6 +55,8 @@ export const NewSearchAlertsEmail = ({
|
||||
match.description.filters as Partial<FilterFields>,
|
||||
match.description.location as locationType,
|
||||
optionIdsToLabels,
|
||||
measurementSystem,
|
||||
t,
|
||||
)?.join(' • ')}
|
||||
</Text>
|
||||
<Text style={{margin: 0}}>
|
||||
@@ -68,8 +78,10 @@ export const NewSearchAlertsEmail = ({
|
||||
|
||||
<Section style={{textAlign: 'center', marginTop: '30px'}}>
|
||||
<Text style={{marginBottom: '20px'}}>
|
||||
If someone resonates with you, reach out. A simple hello can be the start of a
|
||||
meaningful friendship, collaboration, or relationship.
|
||||
{t(
|
||||
'email.search_alerts.callToAction',
|
||||
'If someone resonates with you, reach out. A simple hello can be the start of a meaningful friendship, collaboration, or relationship.',
|
||||
)}
|
||||
</Text>
|
||||
<Link
|
||||
href={`https://${DOMAIN}/messages`}
|
||||
@@ -83,16 +95,18 @@ export const NewSearchAlertsEmail = ({
|
||||
fontWeight: 'bold',
|
||||
}}
|
||||
>
|
||||
Start a Conversation
|
||||
{t('email.search_alerts.startConversation', 'Start a Conversation')}
|
||||
</Link>
|
||||
</Section>
|
||||
|
||||
<Text style={{marginTop: '40px', fontSize: '12px', color: '#555'}}>
|
||||
Compass is built and sustained by the community — no ads, no hidden algorithms, no
|
||||
subscriptions. Your presence and participation make it possible.
|
||||
{t(
|
||||
'email.search_alerts.communityNote',
|
||||
'Compass is built and sustained by the community — no ads, no hidden algorithms, no subscriptions. Your presence and participation make it possible.',
|
||||
)}
|
||||
</Text>
|
||||
</Section>
|
||||
<Footer unsubscribeUrl={unsubscribeUrl} email={email ?? name} />
|
||||
<Footer unsubscribeUrl={unsubscribeUrl} email={email ?? name} locale={locale} />
|
||||
</Container>
|
||||
</Body>
|
||||
</Html>
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
import React from 'react'
|
||||
import {Column, Img, Link, Row, Section, Text} from '@react-email/components'
|
||||
import {DOMAIN} from 'common/envs/constants'
|
||||
import {createT} from 'shared/locale'
|
||||
|
||||
interface Props {
|
||||
email?: string
|
||||
unsubscribeUrl: string
|
||||
locale?: string
|
||||
}
|
||||
|
||||
export const Footer = ({email, unsubscribeUrl}: Props) => {
|
||||
export const Footer = ({email, unsubscribeUrl, locale}: Props) => {
|
||||
const t = createT(locale)
|
||||
return (
|
||||
<Section style={footer}>
|
||||
<hr style={{border: 'none', borderTop: '1px solid #e0e0e0', margin: '10px 0'}} />
|
||||
@@ -58,8 +61,8 @@ export const Footer = ({email, unsubscribeUrl}: Props) => {
|
||||
</Text>
|
||||
|
||||
<Text style={{fontSize: '10px', color: '#888', marginTop: '12px'}}>
|
||||
The email was sent to {email}. To no longer receive these emails, unsubscribe{' '}
|
||||
<Link href={unsubscribeUrl}>here</Link>.
|
||||
{t('email.footer.sent_to', 'The email was sent to {email}. To no longer receive these emails, unsubscribe', {email})}{' '}
|
||||
<Link href={unsubscribeUrl}>{t('email.footer.unsubscribe_link', 'here')}</Link>.
|
||||
</Text>
|
||||
</Row>
|
||||
</Section>
|
||||
|
||||
@@ -3,20 +3,14 @@ import {Body, Button, Container, Head, Html, Preview, Section, Text} from '@reac
|
||||
import {type User} from 'common/user'
|
||||
import {mockUser} from './functions/mock'
|
||||
import {button, container, content, Footer, main, paragraph} from 'email/utils'
|
||||
|
||||
// function randomHex(length: number) {
|
||||
// const bytes = new Uint8Array(Math.ceil(length / 2));
|
||||
// crypto.getRandomValues(bytes);
|
||||
// return Array.from(bytes, b => b.toString(16).padStart(2, "0"))
|
||||
// .join("")
|
||||
// .slice(0, length);
|
||||
// }
|
||||
import {createT} from 'shared/locale'
|
||||
|
||||
interface WelcomeEmailProps {
|
||||
toUser: User
|
||||
unsubscribeUrl: string
|
||||
email?: string
|
||||
verificationLink?: string
|
||||
locale?: string
|
||||
}
|
||||
|
||||
export const WelcomeEmail = ({
|
||||
@@ -24,52 +18,39 @@ export const WelcomeEmail = ({
|
||||
unsubscribeUrl,
|
||||
email,
|
||||
verificationLink,
|
||||
locale,
|
||||
}: WelcomeEmailProps) => {
|
||||
const name = toUser.name.split(' ')[0]
|
||||
|
||||
// Some users may already have a verified email (e.g., signed it with Googl), but we send them a link anyway so that
|
||||
// their email provider marks Compass as spam-free once they click the link.
|
||||
// We can remove the verif link for them if we ask the user to click on another link in the email (which would not be related to email verification)
|
||||
// const verificationLink = `https://compassmeet.com/confirm-email/${randomHex(16)}`
|
||||
const t = createT(locale)
|
||||
|
||||
return (
|
||||
<Html>
|
||||
<Head />
|
||||
<Preview>Welcome to Compass — Please confirm your email</Preview>
|
||||
<Preview>{t('email.welcome.preview', 'Welcome to Compass — Please confirm your email')}</Preview>
|
||||
<Body style={main}>
|
||||
<Container style={container}>
|
||||
<Section style={content}>
|
||||
<Text style={paragraph}>Welcome to Compass, {name}!</Text>
|
||||
<Text style={paragraph}>{t('email.welcome.title', 'Welcome to Compass, {name}!', {name})}</Text>
|
||||
|
||||
<Text style={paragraph}>
|
||||
Compass is a free, community-owned platform built to help people form deep, meaningful
|
||||
connections — platonic, romantic, or collaborative. There are no ads, no hidden
|
||||
algorithms, and no subscriptions — just a transparent, open-source space shaped by
|
||||
people like you.
|
||||
</Text>
|
||||
<Text style={paragraph}>{t('email.welcome.intro', 'Compass is a free, community-owned platform built to help people form deep, meaningful connections — platonic, romantic, or collaborative. There are no ads, no hidden algorithms, and no subscriptions — just a transparent, open-source space shaped by people like you.')}</Text>
|
||||
|
||||
<Text style={paragraph}>
|
||||
To finish creating your account and start exploring Compass, please confirm your email
|
||||
below:
|
||||
</Text>
|
||||
<Text style={paragraph}>{t('email.welcome.confirmation', 'To finish creating your account and start exploring Compass, please confirm your email below:')}</Text>
|
||||
|
||||
<Button style={button} href={verificationLink}>
|
||||
Confirm My Email
|
||||
{t('email.welcome.confirmButton', 'Confirm My Email')}
|
||||
</Button>
|
||||
|
||||
<Text style={{marginTop: '40px', fontSize: '10px', color: '#555'}}>
|
||||
Or copy and paste this link into your browser: <br />
|
||||
{t('email.welcome.copyLink', 'Or copy and paste this link into your browser:')} <br />
|
||||
<a href={verificationLink}>{verificationLink}</a>
|
||||
</Text>
|
||||
|
||||
<Text style={{marginTop: '40px', fontSize: '12px', color: '#555'}}>
|
||||
Your presence and participation are what make Compass possible. Thank you for helping
|
||||
us build an internet space that prioritizes depth, trust, and community over
|
||||
monetization.
|
||||
{t('email.welcome.thanks', 'Your presence and participation are what make Compass possible. Thank you for helping us build an internet space that prioritizes depth, trust, and community over monetization.')}
|
||||
</Text>
|
||||
</Section>
|
||||
|
||||
<Footer unsubscribeUrl={unsubscribeUrl} email={email ?? name} />
|
||||
<Footer unsubscribeUrl={unsubscribeUrl} email={email ?? name} locale={locale} />
|
||||
</Container>
|
||||
</Body>
|
||||
</Html>
|
||||
|
||||
36
backend/shared/src/locale.ts
Normal file
36
backend/shared/src/locale.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import {defaultLocale} from 'common/constants'
|
||||
import {getTranslationMethod} from 'common/translate'
|
||||
import {readFileSync} from 'fs'
|
||||
import {join} from 'path'
|
||||
|
||||
const messageCache: Record<string, Record<string, string>> = {}
|
||||
|
||||
export function loadMessages(locale: string): Record<string, string> {
|
||||
if (messageCache[locale]) return messageCache[locale]
|
||||
|
||||
try {
|
||||
const filePath = join(
|
||||
__dirname,
|
||||
'..',
|
||||
'..',
|
||||
'..',
|
||||
'common',
|
||||
'src',
|
||||
'messages',
|
||||
`${locale}.json`,
|
||||
)
|
||||
const raw = readFileSync(filePath, 'utf-8')
|
||||
messageCache[locale] = JSON.parse(raw)
|
||||
} catch (e) {
|
||||
console.error('Failed to load messages for locale', locale, e)
|
||||
messageCache[locale] = {}
|
||||
}
|
||||
|
||||
return messageCache[locale]
|
||||
}
|
||||
|
||||
export function createT(locale: string | undefined) {
|
||||
locale = locale ?? defaultLocale
|
||||
const messages = locale === defaultLocale ? {} : loadMessages(locale)
|
||||
return getTranslationMethod(locale, messages)
|
||||
}
|
||||
@@ -157,6 +157,7 @@ export const API = (_apiTypeCheck = {
|
||||
.object({
|
||||
deviceToken: z.string().optional(),
|
||||
adminToken: z.string().optional(),
|
||||
locale: z.string().optional(),
|
||||
})
|
||||
.strict(),
|
||||
summary: 'Create a new user (admin or onboarding flow)',
|
||||
@@ -246,6 +247,16 @@ export const API = (_apiTypeCheck = {
|
||||
summary: 'Update a notification preference for the user',
|
||||
tag: 'Notifications',
|
||||
},
|
||||
'update-user-locale': {
|
||||
method: 'POST',
|
||||
authed: true,
|
||||
rateLimited: false,
|
||||
props: z.object({
|
||||
locale: z.string(),
|
||||
}),
|
||||
summary: "Update the user's preferred locale",
|
||||
tag: 'User',
|
||||
},
|
||||
'me/delete': {
|
||||
method: 'POST',
|
||||
authed: true,
|
||||
|
||||
@@ -1,35 +1,12 @@
|
||||
{
|
||||
"404.default_message": "Diese Seite konnte nicht gefunden werden.",
|
||||
"404.help_text": "Falls Sie dies nicht erwartet haben, holen Sie sich ",
|
||||
"404.title": "404: Hoppla!",
|
||||
"about.block.democratic.link_constitution": "Verfassung",
|
||||
"about.block.democratic.link_voted": "abgestimmt",
|
||||
"about.block.democratic.middle": " von der Gemeinschaft, während wir gleichzeitig keine Abweichungen durch unsere ",
|
||||
"about.block.democratic.prefix": "Verwaltet und ",
|
||||
"about.block.democratic.suffix": " garantieren.",
|
||||
"about.block.press.title": "Presse",
|
||||
"about.block.press.text": "Entdecken Sie die neuesten Presseberichte ",
|
||||
"about.block.press.link": "hier",
|
||||
"press.seo.title": "Presse - Compass",
|
||||
"press.seo.description": "Aktuelle Berichterstattung und Medienberichte über Compass",
|
||||
"press.title": "Presse",
|
||||
"press.subtitle": "Aktuelle Neuigkeiten und Medienberichte über Compass",
|
||||
"press.media_kit": "Medienpaket",
|
||||
"press.brand_assets": "Markenressourcen",
|
||||
"press.brand_assets_description": "Laden Sie unser Logo und unsere Markenrichtlinien herunter.",
|
||||
"press.download_assets": "Ressourcen herunterladen",
|
||||
"press.contact": "Pressekontakt",
|
||||
"press.contact_description": "Für Presseanfragen wenden Sie sich bitte an unser Team.",
|
||||
"press.contact_us": "Kontakt aufnehmen",
|
||||
"press.summary": "Zusammenfassung (Compass Redaktion)",
|
||||
"press.summary.5": "Radiointerview mit Martin; er erklärt seinen Werdegang, seine Philosophie des Lernens durch praktische Erfahrung und die Entstehung einer Dating-App, die anders konzipiert ist. Das Gespräch behandelt die Risiken klassischer Apps (Sucht, Swipen, Datenauswertung), die Priorisierung von Interessen und Werten über das Aussehen sowie das Ziel, tiefere freundschaftliche, berufliche oder romantische Beziehungen zu fördern. Martin erläutert auch die Wahl eines Open-Source-, kostenlosen und transparenten Modells, die internationale Entwicklung und die Herausforderungen in Bezug auf die Nutzerzahl, um das Tool wirklich nützlich zu machen.",
|
||||
"press.summary.4": "Belgischer und lokaler Artikel über die Anfänge von Compass. In nur acht Wochen entwickelt und kostenlos angeboten, unterscheidet sich Compass durch den Verzicht auf versteckte Algorithmen und Wisch-Mechanismen. Stattdessen setzt die Plattform auf eine Schlagwortsuche, die sich auf Werte, Interessen und Persönlichkeit konzentriert, während Fotos in den Hintergrund treten. Als Open-Source-Projekt verfolgt Compass einen gemeinnützigen und gemeinschaftlichen Ansatz. Vier Monate nach dem Start zählt die Plattform etwas mehr als 400 Nutzer, mit dem Ziel, eine kritische Masse auf lokaler Ebene zu erreichen.",
|
||||
"press.summary.2": "Kurzes Video (Facebook Reel), das Compass auf unterhaltsame und dynamische Weise präsentiert. Martin Braquet, ein junger Ingenieur aus Havelange, stellt seine ethische Dating-App vor. Hier geht es um einen anderen Ansatz. Compass ist gemeinnützig und darauf ausgelegt, Verbindungen zu schaffen. Die Plattform ist offen, kollaborativ, ohne undurchsichtige Algorithmen. Und ohne den Druck von Profilfotos.",
|
||||
"press.summary.1": "Belgischer und lokaler Videobericht, der Compass als Open-Source-Plattform zwischen Dating-App und sozialem Netzwerk beschreibt, die mit den üblichen Konventionen bricht, indem sie auf versteckte Algorithmen und die Betonung von Fotos verzichtet. Entwickelt vom Havelanger Ingenieur Martin Braquet, ermöglicht die Plattform die Suche nach Profilen basierend auf Werten und Interessen für freundschaftliche, berufliche oder romantische Beziehungen. Als eine Art 'Bibliothek' von Profilen mit Filterfunktionen zielt Compass darauf ab, soziale Verbindungen neu zu gestalten. Kostenlos, werbefrei und bereits mit über 400 Nutzern.",
|
||||
"press.no_articles": "Derzeit sind keine Presseartikel verfügbar. Bitte schauen Sie später wieder vorbei.",
|
||||
"languages.en": "Englisch",
|
||||
"languages.fr": "Französisch",
|
||||
"languages.de": "Deutsch",
|
||||
"404.title": "404: Hoppla!",
|
||||
"404.default_message": "Diese Seite konnte nicht gefunden werden.",
|
||||
"404.help_text": "Falls Sie dies nicht erwartet haben, holen Sie sich ",
|
||||
"about.block.democratic.title": "Demokratisch",
|
||||
"about.block.free.text": "Kein Abonnement. Keine Bezahlschranke. Keine Werbung.",
|
||||
"about.block.free.title": "Kostenlos",
|
||||
@@ -41,6 +18,9 @@
|
||||
"about.block.notify.title": "Suchbenachrichtigungen erhalten",
|
||||
"about.block.personality.text": "Werte und Interessen zuerst, Fotos sind zweitrangig.",
|
||||
"about.block.personality.title": "Auf Persönlichkeit fokussiert",
|
||||
"about.block.press.link": "hier",
|
||||
"about.block.press.text": "Entdecken Sie die neuesten Presseberichte ",
|
||||
"about.block.press.title": "Presse",
|
||||
"about.block.transparent.text": "Open-Source-Code und gemeinschaftliches Design.",
|
||||
"about.block.transparent.title": "Transparenz",
|
||||
"about.block.vision.text": "Compass ist für menschliche Beziehungen das, was Linux, Wikipedia und Firefox für Software und Wissen sind: ein öffentliches Gut, das von den Menschen, die es nutzen, für das Wohl aller aufgebaut wird.",
|
||||
@@ -59,13 +39,13 @@
|
||||
"about.join.title": "Der Community beitreten",
|
||||
"about.seo.description": "Über Compass",
|
||||
"about.seo.title": "Über uns",
|
||||
"about.settings.copied": "Kopiert!",
|
||||
"about.settings.copy_info": "Infos kopieren",
|
||||
"about.subtitle": "Finden Sie Ihre Leute ganz einfach.",
|
||||
"about.suggestions.button": "Hier vorschlagen",
|
||||
"about.suggestions.text": "Machen Sie Vorschläge oder teilen Sie uns mit, dass Sie über dieses Formular helfen möchten!",
|
||||
"about.suggestions.title": "Vorschläge machen oder beitragen",
|
||||
"about.title": "Warum Compass wählen?",
|
||||
"about.settings.copied": "Kopiert!",
|
||||
"about.settings.copy_info": "Infos kopieren",
|
||||
"add_photos.add_description": "Beschreibung hinzufügen",
|
||||
"add_photos.profile_picture_hint": "Das hervorgehobene Bild ist Ihr Profilbild",
|
||||
"answers.add.error_create": "Fehler beim Erstellen der Kompatibilitätsfrage. Erneut versuchen?",
|
||||
@@ -123,12 +103,14 @@
|
||||
"common.active": "Aktiv",
|
||||
"common.add": "Hinzufügen",
|
||||
"common.and": "und",
|
||||
"common.change": "Ändern",
|
||||
"common.close": "Schließen",
|
||||
"common.compatible": "Kompatibel",
|
||||
"common.continue": "Weiter",
|
||||
"common.either": "Egal",
|
||||
"common.from-now.just_now": "gerade eben",
|
||||
"common.from-now.past_day": "heute",
|
||||
"common.from-now.minute": "vor {time} Minute",
|
||||
"common.from-now.past_day": "heute",
|
||||
"common.new": "Neu",
|
||||
"common.next": "Weiter",
|
||||
"common.no": "Nein",
|
||||
@@ -141,17 +123,24 @@
|
||||
"common.saved": "Gespeichert!",
|
||||
"common.yes": "Ja",
|
||||
"compatibility.empty.answered": "Sie haben noch keine Fragen beantwortet.",
|
||||
"compatibility.empty.no_results": "Keine Ergebnisse für \"{keyword}\"",
|
||||
"compatibility.empty.not_answered": "Alle Fragen wurden beantwortet!",
|
||||
"compatibility.empty.skipped": "Sie haben keine Fragen übersprungen.",
|
||||
"compatibility.onboarding.body1": "Beantworten Sie einige kurze Fragen, um die Kompatibilität basierend auf Werten und Vorlieben zu berechnen — nicht auf Fotos oder Swipes.",
|
||||
"compatibility.onboarding.body2": "Ihre Antworten beeinflussen direkt, wer mit Ihnen übereinstimmt und wie stark.",
|
||||
"compatibility.onboarding.impact": "Die meisten Menschen, die mindestens 3 Fragen beantworten, sehen wesentlich relevantere Übereinstimmungen.",
|
||||
"compatibility.onboarding.later": "Später erledigen",
|
||||
"compatibility.onboarding.start": "Fragen beantworten beginnen",
|
||||
"compatibility.onboarding.title": "Sehen Sie, mit wem Sie tatsächlich übereinstimmen",
|
||||
"compatibility.search_placeholder": "Fragen und Antworten durchsuchen...",
|
||||
"compatibility.seo.description": "Ihre Kompatibilitätsfragen anzeigen und verwalten",
|
||||
"compatibility.seo.title": "Kompatibilität",
|
||||
"compatibility.sign_in_prompt": "Bitte melden Sie sich an, um Ihre Kompatibilitätsfragen zu sehen",
|
||||
"compatibility.tabs.answered": "Beantwortet",
|
||||
"compatibility.tabs.skipped": "Übersprungen",
|
||||
"compatibility.tabs.to_answer": "Zu beantworten",
|
||||
"compatibility.title": "Ihre Kompatibilitätsfragen",
|
||||
"compatibility.tooltip": "Kompatibilitätswert zwischen Ihnen beiden",
|
||||
"compatibility.empty.no_results": "Keine Ergebnisse für \"{keyword}\"",
|
||||
"compatibility.seo.title": "Kompatibilität",
|
||||
"compatibility.seo.description": "Ihre Kompatibilitätsfragen anzeigen und verwalten",
|
||||
"contact.editor.placeholder": "Kontaktieren Sie uns hier...",
|
||||
"contact.form_link": "Feedback-Formular",
|
||||
"contact.intro_middle": " oder über unsere ",
|
||||
@@ -164,6 +153,8 @@
|
||||
"contact.title": "Kontakt",
|
||||
"contact.toast.failed": "Senden fehlgeschlagen — versuchen Sie es erneut oder kontaktieren Sie uns...",
|
||||
"contact.toast.success": "Vielen Dank für Ihre Nachricht!",
|
||||
"copy_link_button.copy_link": "Link kopieren",
|
||||
"copy_link_button.link_copied": "Link kopiert!",
|
||||
"delete.data.intro": "Aus rechtlichen und betrieblichen Gründen können wir bestimmte Informationen nach der Kontolöschung aufbewahren:",
|
||||
"delete.data.item1": "Transaktionsunterlagen (falls vorhanden) für Buchhaltung und Compliance",
|
||||
"delete.data.item2": "Kopien der Kommunikation mit unserem Support-Team",
|
||||
@@ -188,6 +179,25 @@
|
||||
"delete.what_happens.profile": "Ihr Profil, einschließlich aller Fotos und persönlichen Informationen, wird dauerhaft gelöscht",
|
||||
"delete.what_happens.title": "Was passiert, wenn Sie Ihr Konto löschen",
|
||||
"delete.what_happens.username": "Ihr Benutzername kann von anderen wiederverwendet werden",
|
||||
"delete_survey.description": "Es tut uns leid, dass Sie gehen. Um uns bei der Verbesserung von Compass zu helfen, teilen Sie uns bitte mit, warum Sie Ihr Konto löschen.",
|
||||
"delete_survey.error_saving_reason": "Fehler beim Speichern des Löschgrunds",
|
||||
"delete_survey.other_placeholder": "Bitte geben Sie weitere Details an",
|
||||
"delete_survey.reason_label": "Warum löschen Sie Ihr Konto?",
|
||||
"delete_survey.reasons.conversations_didnt_progress": "Gespräche wurden nicht zu echten Verbindungen",
|
||||
"delete_survey.reasons.found_connection_elsewhere": "Ich habe woanders eine Verbindung gefunden",
|
||||
"delete_survey.reasons.found_connection_on_compass": "Ich habe eine bedeutungsvolle Verbindung auf Compass gefunden",
|
||||
"delete_survey.reasons.life_circumstances_changed": "Meine Lebensumstände haben sich geändert",
|
||||
"delete_survey.reasons.low_response_rate": "Nachrichten blieben oft unbeantwortet",
|
||||
"delete_survey.reasons.not_enough_relevant_people": "Nicht genügend relevante Leute in meiner Nähe",
|
||||
"delete_survey.reasons.not_meeting_depth_expectations": "Interaktionen fühlten sich oberflächlicher an als erwartet",
|
||||
"delete_survey.reasons.other": "Andere",
|
||||
"delete_survey.reasons.platform_not_active_enough": "Die Community fühlte sich nicht aktiv genug an",
|
||||
"delete_survey.reasons.prefer_simpler_apps": "Ich bevorzuge einfachere oder schnellere Apps",
|
||||
"delete_survey.reasons.privacy_concerns": "Bedenken bezüglich Datenschutz oder Profilsichtbarkeit",
|
||||
"delete_survey.reasons.taking_a_break": "Ich mache eine Pause von Dating-Apps",
|
||||
"delete_survey.reasons.technical_issues": "Technische Probleme oder Fehler",
|
||||
"delete_survey.reasons.too_much_time_or_effort": "Die Nutzung der Plattform erforderte mehr Zeit oder Aufwand als ich geben kann",
|
||||
"delete_survey.title": "Schade, dass Sie gehen",
|
||||
"delete_yourself.confirm_phrase": "delete my account",
|
||||
"delete_yourself.description": "Das Löschen Ihres Kontos bedeutet, dass Sie es nicht mehr verwenden können. Sie verlieren den Zugriff auf alle Ihre Daten.",
|
||||
"delete_yourself.input_placeholder": "Geben Sie 'delete my account' zur Bestätigung ein",
|
||||
@@ -197,30 +207,108 @@
|
||||
"delete_yourself.toast.error": "Kontolöschung fehlgeschlagen.",
|
||||
"delete_yourself.toast.loading": "Konto wird gelöscht..",
|
||||
"delete_yourself.toast.success": "Ihr Konto wurde gelöscht.",
|
||||
"delete_survey.title": "Schade, dass Sie gehen",
|
||||
"delete_survey.description": "Es tut uns leid, dass Sie gehen. Um uns bei der Verbesserung von Compass zu helfen, teilen Sie uns bitte mit, warum Sie Ihr Konto löschen.",
|
||||
"delete_survey.reason_label": "Warum löschen Sie Ihr Konto?",
|
||||
"delete_survey.reasons.found_connection_on_compass": "Ich habe eine bedeutungsvolle Verbindung auf Compass gefunden",
|
||||
"delete_survey.reasons.found_connection_elsewhere": "Ich habe woanders eine Verbindung gefunden",
|
||||
"delete_survey.reasons.not_enough_relevant_people": "Nicht genügend relevante Leute in meiner Nähe",
|
||||
"delete_survey.reasons.conversations_didnt_progress": "Gespräche wurden nicht zu echten Verbindungen",
|
||||
"delete_survey.reasons.low_response_rate": "Nachrichten blieben oft unbeantwortet",
|
||||
"delete_survey.reasons.platform_not_active_enough": "Die Community fühlte sich nicht aktiv genug an",
|
||||
"delete_survey.reasons.not_meeting_depth_expectations": "Interaktionen fühlten sich oberflächlicher an als erwartet",
|
||||
"delete_survey.reasons.too_much_time_or_effort": "Die Nutzung der Plattform erforderte mehr Zeit oder Aufwand als ich geben kann",
|
||||
"delete_survey.reasons.prefer_simpler_apps": "Ich bevorzuge einfachere oder schnellere Apps",
|
||||
"delete_survey.reasons.privacy_concerns": "Bedenken bezüglich Datenschutz oder Profilsichtbarkeit",
|
||||
"delete_survey.reasons.technical_issues": "Technische Probleme oder Fehler",
|
||||
"delete_survey.reasons.taking_a_break": "Ich mache eine Pause von Dating-Apps",
|
||||
"delete_survey.reasons.life_circumstances_changed": "Meine Lebensumstände haben sich geändert",
|
||||
"delete_survey.reasons.other": "Andere",
|
||||
"delete_survey.other_placeholder": "Bitte geben Sie weitere Details an",
|
||||
"delete_survey.error_saving_reason": "Fehler beim Speichern des Löschgrunds",
|
||||
"donate.seo.description": "Spenden Sie zur Unterstützung von Compass",
|
||||
"donate.seo.title": "Spenden",
|
||||
"donate.title": "Spenden",
|
||||
"email.footer.sent_to": "Die E-Mail wurde an {email} gesendet. Um diese E-Mails nicht mehr zu erhalten, abonnieren Sie sich hier ab",
|
||||
"email.footer.unsubscribe_link": "hier",
|
||||
"email.new_endorsement.greeting": "Hallo {name},",
|
||||
"email.new_endorsement.message": "{fromUserName} hat Sie empfohlen!",
|
||||
"email.new_endorsement.preview": "Neue Empfehlung von {fromUserName}",
|
||||
"email.new_endorsement.subject": "{fromUserName} hat Sie empfohlen!",
|
||||
"email.new_endorsement.viewButton": "Empfehlung anzeigen",
|
||||
"email.new_message.greeting": "Hallo {name},",
|
||||
"email.new_message.message": "{creatorName} hat Ihnen gerade eine Nachricht geschickt!",
|
||||
"email.new_message.preview": "Neue Nachricht von {creatorName}",
|
||||
"email.new_message.subject": "{creatorName} hat Ihnen eine Nachricht geschickt!",
|
||||
"email.new_message.viewButton": "Nachricht anzeigen",
|
||||
"email.search_alerts.callToAction": "Wenn jemand zu Ihnen passt, treten Sie in Kontakt. Ein einfaches Hallo kann der Beginn einer bedeutungsvollen Freundschaft, Zusammenarbeit oder Beziehung sein.",
|
||||
"email.search_alerts.communityNote": "Compass wird von der Community aufgebaut und erhalten — keine Werbung, keine versteckten Algorithmen, keine Abonnements. Ihre Präsenz und Teilnahme machen es möglich.",
|
||||
"email.search_alerts.greeting": "Hallo {name},",
|
||||
"email.search_alerts.intro": "In den letzten 24 Stunden sind neue Personen zu Compass gestoßen, deren Werte und Interessen mit Ihren gespeicherten Suchanfragen übereinstimmen. Compass ist ein Geschenk der Gemeinschaft und erwacht zum Leben, wenn Menschen wie Sie den Schritt unternehmen, miteinander in Kontakt zu treten.",
|
||||
"email.search_alerts.preview": "Neue Menschen teilen Ihre Werte — erreichen Sie sie und knüpfen Sie Kontakte",
|
||||
"email.search_alerts.startConversation": "Ein Gespräch beginnen",
|
||||
"email.search_alerts.subject": "Personen, die mit Ihren Werten übereinstimmen, sind gerade beigetreten",
|
||||
"email.welcome.confirmButton": "Meine E-Mail bestätigen",
|
||||
"email.welcome.confirmation": "Um die Erstellung Ihres Kontos abzuschließen und mit der Erkundung von Compass zu beginnen, bestätigen Sie bitte unten Ihre E-Mail-Adresse:",
|
||||
"email.welcome.copyLink": "Oder kopieren Sie diesen Link und fügen Sie ihn in Ihren Browser ein:",
|
||||
"email.welcome.intro": "Compass ist eine kostenlose, gemeinnützige Plattform, die Menschen dabei helfen soll, tiefe und bedeutungsvolle Verbindungen – platonisch, romantisch oder kollaborativ – aufzubauen. Es gibt keine Werbung, keine verborgenen Algorithmen und keine Abonnements – nur ein transparenter, quelloffener Raum, der von Menschen wie Ihnen geprägt wird.",
|
||||
"email.welcome.preview": "Willkommen bei Compass — Bitte bestätigen Sie Ihre E-Mail",
|
||||
"email.welcome.subject": "Willkommen bei Compass!",
|
||||
"email.welcome.thanks": "Ihre Präsenz und Teilnahme machen Compass erst möglich. Vielen Dank, dass Sie uns helfen, einen Internet-Raum aufzubauen, der Tiefe, Vertrauen und Gemeinschaft über die Monetarisierung stellt.",
|
||||
"email.welcome.title": "Willkommen bei Compass, {name}!",
|
||||
"error.option_exists": "Diese Option existiert bereits",
|
||||
"events.book_clubs": "Buchclubs",
|
||||
"events.cancel": "Abbrechen",
|
||||
"events.cancel_event": "Event abbrechen",
|
||||
"events.cancel_event_confirmation": "Sind Sie sicher, dass Sie dieses Event abbrechen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"events.cancel_rsvp": "RSVP abbrechen",
|
||||
"events.cancelled": "Abgesagt",
|
||||
"events.coffee_chats": "Kaffeegespräche",
|
||||
"events.completed": "Abgeschlossen",
|
||||
"events.create_event": "Event erstellen",
|
||||
"events.create_new_event": "Neues Event erstellen",
|
||||
"events.creating": "Erstellen...",
|
||||
"events.creative_workshops": "Kreative Workshops",
|
||||
"events.description": "Beschreibung",
|
||||
"events.description_placeholder": "Beschreiben Sie Ihr Event...",
|
||||
"events.edit_event": "Event bearbeiten",
|
||||
"events.end_time": "Endzeit",
|
||||
"events.event_cancelled": "Event erfolgreich abgesagt!",
|
||||
"events.event_created": "Event erfolgreich erstellt!",
|
||||
"events.event_title": "Event-Titel",
|
||||
"events.event_title_placeholder": "Event-Titel eingeben",
|
||||
"events.event_updated": "Event erfolgreich aktualisiert!",
|
||||
"events.failed_cancel_event": "Event-Abbruch fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.failed_cancel_rsvp": "RSVP-Abbruch fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.failed_create_event": "Event-Erstellung fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.failed_rsvp": "RSVP fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.failed_to_load": "Events konnten nicht geladen werden. Bitte versuchen Sie es später erneut.",
|
||||
"events.failed_update_event": "Event-Aktualisierung fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.game_nights": "Spieleabende",
|
||||
"events.going": "going",
|
||||
"events.hobby_exchanges": "Hobby-Austausche",
|
||||
"events.in_person": "In Person",
|
||||
"events.leave_empty": "Leer lassen für unbegrenzt",
|
||||
"events.loading": "Laden...",
|
||||
"events.location_address": "Ortsadresse",
|
||||
"events.location_address_placeholder": "Ortsadresse eingeben",
|
||||
"events.location_type": "Ortstyp",
|
||||
"events.location_url": "Orts-URL",
|
||||
"events.location_url_placeholder": "Orts-URL eingeben",
|
||||
"events.login_to_rsvp": "Anmelden für RSVP",
|
||||
"events.max_participants": "Max. Teilnehmer (optional)",
|
||||
"events.max_participants_hint": "Max. Teilnehmer",
|
||||
"events.maybe": "maybe",
|
||||
"events.maybe_count": " ({count} maybe)",
|
||||
"events.no_past": "Keine vergangenen Events",
|
||||
"events.no_upcoming": "Keine bevorstehenden Events. Schauen Sie bald wieder oder erstellen Sie Ihre eigenen!",
|
||||
"events.not_going": "Nicht gehen",
|
||||
"events.online": "Online",
|
||||
"events.online_event_join_link": "Online-Event - Link beitreten",
|
||||
"events.organized_by": "Organisiert von",
|
||||
"events.participants_count": "{count} going",
|
||||
"events.participants_max": " / {max} max",
|
||||
"events.past_events": "Vergangene Events",
|
||||
"events.philosophy_discussions": "Philosophiediskussionen",
|
||||
"events.select_end_datetime": "Endzeit auswählen (optional)",
|
||||
"events.select_start_datetime": "Datum und Uhrzeit auswählen",
|
||||
"events.start_time": "Startzeit",
|
||||
"events.started": "Gestartet {time}",
|
||||
"events.subtitle": "Entdecken und nehmen Sie an Community-Events teil — oder erstellen Sie Ihre eigenen, um Menschen zusammenzubringen",
|
||||
"events.sustainability_meetups": "Nachhaltigkeits-Treffen",
|
||||
"events.title": "Events",
|
||||
"events.try_again": "Erneut versuchen",
|
||||
"events.upcoming_events": "Bevorstehende Events",
|
||||
"events.update_event": "Event aktualisieren",
|
||||
"events.updating": "Aktualisieren...",
|
||||
"events.walking_groups": "Wandergruppen",
|
||||
"events.why_description": "Events sind das Herzbedeutungsvoller Verbindungen. Ob online oder in Person, sie schaffen Raum für tiefere Gespräche, gemeinsame Erlebnisse und dauerhafte Beziehungen.",
|
||||
"events.why_organize": "Warum Events organisieren?",
|
||||
"filter.age.age": "Alter",
|
||||
"filter.age.any": "Alle",
|
||||
"filter.age.label": "Alter",
|
||||
"filter.age.up_to": "bis zu",
|
||||
"filter.age.years": "Jahre",
|
||||
"filter.any": "Alle",
|
||||
"filter.any_causes": "Jedes Anliegen",
|
||||
@@ -230,18 +318,37 @@
|
||||
"filter.any_interests": "Jedes Interesse",
|
||||
"filter.any_language": "Alle Sprachen",
|
||||
"filter.any_mbti": "Jeder MBTI",
|
||||
"filter.any_new_users": "Jegliche neue Nutzer",
|
||||
"filter.any_politics": "Jede politische Ausrichtung",
|
||||
"filter.any_relationship": "Jede romantische Beziehung",
|
||||
"filter.any_religion": "Jede Religion",
|
||||
"filter.any_work": "Jede Arbeit",
|
||||
"filter.big5.any": "Beliebige Big 5",
|
||||
"filter.big5.custom": "Benutzerdefinierte Big 5",
|
||||
"filter.drinks.per_month": "pro Monat",
|
||||
"filter.gender.any": "Alle",
|
||||
"filter.gender.gender": "Geschlecht",
|
||||
"filter.gender.genders": "Geschlechter",
|
||||
"filter.gender.they_seek": "Geschlecht, das sie suchen",
|
||||
"filter.label.diet": "Ernährung",
|
||||
"filter.label.drinks": "Getränke",
|
||||
"filter.label.education_levels": "Bildung",
|
||||
"filter.label.mbti": "MBTI",
|
||||
"filter.label.name": "Suche",
|
||||
"filter.label.political_beliefs": "Politische Ansichten",
|
||||
"filter.label.pref_age_max": "Max. Alter",
|
||||
"filter.label.pref_age_min": "Min. Alter",
|
||||
"filter.label.pref_gender": "Gesuchtes Geschlecht",
|
||||
"filter.label.pref_relation_styles": "Suche",
|
||||
"filter.label.wants_kids_strength": "Kinder",
|
||||
"filter.location": "Wohnhaft",
|
||||
"filter.location.any": "überall",
|
||||
"filter.location.search_city": "Stadt suchen...",
|
||||
"filter.location.set_any_city": "Auf jede Stadt einstellen",
|
||||
"filter.mine_toggle": "Meine Filter",
|
||||
"filter.multiple": "Mehrere",
|
||||
"filter.near": "in der Nähe von",
|
||||
"filter.raised_in": "Aufgewachsen",
|
||||
"filter.relationship.any_connection": "Jede Beziehung",
|
||||
"filter.relationship_status.any": "Jeder romantische Status",
|
||||
"filter.reset": "Zurücksetzen",
|
||||
@@ -250,6 +357,9 @@
|
||||
"filter.wants_kids.doesnt_want_kids": "Möchte keine Kinder",
|
||||
"filter.wants_kids.either": "Egal",
|
||||
"filter.wants_kids.wants_kids": "Möchte Kinder",
|
||||
"font.atkinson": "Atkinson Hyperlegible",
|
||||
"font.classic-serif": "Klassische Serifenschrift",
|
||||
"font.system-sans": "System Sans",
|
||||
"help.account.delete_instructions": "Möchten Sie Ihr Konto löschen? Gehen Sie zu Ihren Profileinstellungen, klicken Sie auf das Drei-Punkte-Menü oben rechts und wählen Sie dann Konto löschen",
|
||||
"help.account.login_issue": "Können Sie sich nicht anmelden? Versuchen Sie, sich abzumelden und dann erneut anzumelden, oder aktualisieren Sie die Seite und versuchen Sie es erneut.",
|
||||
"help.account.profile_update": "Profilaktualisierungen werden nicht angezeigt? Warten Sie ein paar Sekunden und aktualisieren Sie. Wenn das Problem weiterhin besteht, melden Sie es über das Kontaktformular.",
|
||||
@@ -283,35 +393,18 @@
|
||||
"home.subtitle": "Finden Sie Menschen, die Ihre Werte, Ideen und Absichten teilen — nicht nur Ihre Fotos.",
|
||||
"home.title": "Schluss mit Swipen.",
|
||||
"home.typewriter": "Suchen.",
|
||||
"copy_link_button.copy_link": "Link kopieren",
|
||||
"copy_link_button.link_copied": "Link kopiert!",
|
||||
"search.include_short_bios_tooltip": "Um alle Profile aufzulisten, aktivieren Sie \"Kurze Bios einbeziehen\"",
|
||||
"more_options_user.more_options": "Weitere Optionen",
|
||||
"more_options_user.banning": "Sperre...",
|
||||
"more_options_user.user_banned": "Benutzer gesperrt!",
|
||||
"more_options_user.error_banning": "Fehler beim Sperren des Benutzers",
|
||||
"more_options_user.banned": "Gesperrt",
|
||||
"more_options_user.ban_user": "Benutzer sperren",
|
||||
"more_options_user.delete_pinned_photo": "Angeheftetes Foto löschen",
|
||||
"more_options_user.joined": "Beigetreten",
|
||||
"more_options_user.copy_user_id": "Benutzer-ID kopieren",
|
||||
"more_options_user.delete_account": "Konto löschen",
|
||||
"more_options_user.block": "Blockieren",
|
||||
"more_options_user.report": "Melden",
|
||||
"sticky_format_menu.add_embed": "Embed hinzufügen",
|
||||
"sticky_format_menu.add_emoji": "Emoji hinzufügen",
|
||||
"sticky_format_menu.upload_image": "Bild hochladen",
|
||||
"star_button.save": "Profil speichern",
|
||||
"star_button.unsave": "Profil nicht mehr speichern",
|
||||
"send_message.button_label": "Nachricht",
|
||||
"send_message.title": "Kontakt",
|
||||
"languages.de": "Deutsch",
|
||||
"languages.en": "Englisch",
|
||||
"languages.fr": "Französisch",
|
||||
"messages.action.add_reaction": "Reaktion hinzufügen",
|
||||
"messages.action.delete": "Löschen",
|
||||
"messages.action.edit": "Bearbeiten",
|
||||
"messages.cannot_message_deleted": "Sie können ihnen keine Nachricht senden, da sie ihr Konto gelöscht haben.",
|
||||
"messages.create": "Erstellen",
|
||||
"messages.delete_confirm": "Sind Sie sicher, dass Sie diese Nachricht löschen möchten?",
|
||||
"messages.delete_failed": "Löschen der Nachricht fehlgeschlagen",
|
||||
"messages.deleted": "Nachricht gelöscht",
|
||||
"messages.deleted_user": "Gelöschter Benutzer",
|
||||
"messages.edited": "bearbeitet",
|
||||
"messages.empty": "Sie haben noch keine Nachrichten.",
|
||||
"messages.input_placeholder": "Nachricht senden",
|
||||
@@ -321,6 +414,7 @@
|
||||
"messages.menu.see_members": "Mitglieder ansehen",
|
||||
"messages.more": " mehr",
|
||||
"messages.new_message": "Neue Nachricht",
|
||||
"messages.no_access": "Sie haben keinen Zugriff auf diese Konversation",
|
||||
"messages.seo.description": "Ihre Nachrichten",
|
||||
"messages.title": "Nachrichten",
|
||||
"messages.toast.edit_failed": "Bearbeiten der Nachricht fehlgeschlagen.",
|
||||
@@ -332,14 +426,27 @@
|
||||
"messages.toast.muting_forever.success": "Benachrichtigungen dauerhaft stummgeschaltet",
|
||||
"messages.toast.send_failed": "Senden der Nachricht fehlgeschlagen. Bitte versuchen Sie es später erneut oder kontaktieren Sie den Support, wenn das Problem weiterhin besteht.",
|
||||
"messages.you_prefix": "Sie: ",
|
||||
"messages.cannot_message_deleted": "Sie können ihnen keine Nachricht senden, da sie ihr Konto gelöscht haben.",
|
||||
"messages.deleted_user": "Gelöschter Benutzer",
|
||||
"messages.no_access": "Sie haben keinen Zugriff auf diese Konversation",
|
||||
"multi-checkbox.enter_value": "Bitte geben Sie einen Wert ein.",
|
||||
"multi-checkbox.could_not_add": "Option konnte nicht hinzugefügt werden.",
|
||||
"messaging.email_verification_required": "Sie müssen Ihre E-Mail überprüfen, um Personen zu schreiben.",
|
||||
"more_options_user.ban_user": "Benutzer sperren",
|
||||
"more_options_user.banned": "Gesperrt",
|
||||
"more_options_user.banning": "Sperre...",
|
||||
"more_options_user.block": "Blockieren",
|
||||
"more_options_user.copy_user_id": "Benutzer-ID kopieren",
|
||||
"more_options_user.delete_account": "Konto löschen",
|
||||
"more_options_user.delete_pinned_photo": "Angeheftetes Foto löschen",
|
||||
"more_options_user.edit_bio": "Bio bearbeiten",
|
||||
"more_options_user.edit_profile": "Profil bearbeiten",
|
||||
"more_options_user.error_banning": "Fehler beim Sperren des Benutzers",
|
||||
"more_options_user.joined": "Beigetreten",
|
||||
"more_options_user.more_options": "Weitere Optionen",
|
||||
"more_options_user.profile_options": "Profiloptionen",
|
||||
"more_options_user.report": "Melden",
|
||||
"more_options_user.user_banned": "Benutzer gesperrt!",
|
||||
"multi-checkbox.add_failed": "Hinzufügen der Option fehlgeschlagen.",
|
||||
"multi-checkbox.search_or_add": "Suchen oder hinzufügen",
|
||||
"multi-checkbox.could_not_add": "Option konnte nicht hinzugefügt werden.",
|
||||
"multi-checkbox.enter_value": "Bitte geben Sie einen Wert ein.",
|
||||
"multi-checkbox.no_matching_options": "Keine passenden Optionen, Sie können gerne eine hinzufügen.",
|
||||
"multi-checkbox.search_or_add": "Suchen oder hinzufügen",
|
||||
"nav.about": "Über uns",
|
||||
"nav.contact": "Kontakt",
|
||||
"nav.events": "Veranstaltungen",
|
||||
@@ -361,11 +468,11 @@
|
||||
"nav.vote": "Abstimmung",
|
||||
"news.failed": "Abrufen der Versionen fehlgeschlagen.",
|
||||
"news.no_release_notes": "_Keine Versionshinweise vorhanden._",
|
||||
"news.note": "Hinweis: Leider ist diese Seite nur auf Englisch verfügbar.",
|
||||
"news.seo.description": "Die neuesten Updates und Funktionen ansehen",
|
||||
"news.seo.description_general": "Alle Neuigkeiten und Code-Updates für Compass",
|
||||
"news.title": "Neuigkeiten",
|
||||
"news.view_on_github": "Auf GitHub ansehen",
|
||||
"news.note": "Hinweis: Leider ist diese Seite nur auf Englisch verfügbar.",
|
||||
"notifications.empty": "Sie haben noch keine Benachrichtigungen.",
|
||||
"notifications.heading": "Wo möchten Sie benachrichtigt werden, wenn eine Person",
|
||||
"notifications.options.email": "Per E-Mail",
|
||||
@@ -379,19 +486,52 @@
|
||||
"notifications.tabs.notifications": "Benachrichtigungen",
|
||||
"notifications.tabs.settings": "Einstellungen",
|
||||
"notifications.title": "Updates",
|
||||
"organization.about.title": "Über uns",
|
||||
"onboarding.skip": "Onboarding überspringen",
|
||||
"onboarding.soft-gate.bullet1": "Kompatibilitätswerte spiegeln jetzt Ihre Werte und Präferenzen wider",
|
||||
"onboarding.soft-gate.bullet2": "Sie sehen Übereinstimmungswerte, die eng mit dem übereinstimmen, was Ihnen wichtig ist",
|
||||
"onboarding.soft-gate.bullet3": "Sie können Ihr Profil jederzeit aktualisieren, um die Chancen zu erhöhen, dass die richtigen Personen sich an Sie wenden.",
|
||||
"onboarding.soft-gate.explore_button": "Profile jetzt erkunden",
|
||||
"onboarding.soft-gate.intro": "Sie haben Ihre ersten Kompatibilitätsfragen beantwortet und Ihre Hauptinteressen geteilt.",
|
||||
"onboarding.soft-gate.refine_button": "Profil verfeinern",
|
||||
"onboarding.soft-gate.seo.description": "Starten Sie mit Compass - transparente Verbindungen ohne Algorithmen",
|
||||
"onboarding.soft-gate.seo.title": "Sie sind bereit zu erkunden - Compass",
|
||||
"onboarding.soft-gate.title": "Sie sind bereit zu erkunden",
|
||||
"onboarding.soft-gate.what_it_means": "Das bedeutet das für Sie:",
|
||||
"onboarding.step1.body1": "Compass entscheidet nicht, wen Sie sehen sollten.",
|
||||
"onboarding.step1.body2": "Es gibt keinen Engagement-Algorithmus, kein Swipe-Ranking, keine boosteten Profile und keine Aufmerksamkeitsoptimierung. Sie können die vollständige Datenbank durchsuchen, Ihre eigenen Filter anwenden und genau sehen, warum jemand mit Ihnen übereinstimmt.",
|
||||
"onboarding.step1.body3": "Sie behalten die Kontrolle über die Entdeckung. Immer.",
|
||||
"onboarding.step1.footer": "Transparenz ist ein Grundprinzip, keine Funktion.",
|
||||
"onboarding.step1.title": "Keine Black Box. Keine Manipulation.",
|
||||
"onboarding.step2.body1": "Anstatt endlosem Swiping erlaubt Ihnen Compass, gezielt zu suchen.",
|
||||
"onboarding.step2.body2": "Suchen Sie Personen nach:",
|
||||
"onboarding.step2.body3": "Sie können Suchen speichern und benachrichtigt werden, wenn neue Personen übereinstimmen. Keine Notwendigkeit, die App jeden Tag zu überprüfen.",
|
||||
"onboarding.step2.footer": "Weniger Lärm. Mehr Signal.",
|
||||
"onboarding.step2.item1": "Interessen und Schlüsselwörtern",
|
||||
"onboarding.step2.item2": "Werten und Ideen",
|
||||
"onboarding.step2.item3": "Kompatibilitätsantworten",
|
||||
"onboarding.step2.item4": "Standort und Absicht",
|
||||
"onboarding.step2.title": "Suchen, nicht scrollen.",
|
||||
"onboarding.step3.body1": "Matches sind weder magisch noch mysteriös.",
|
||||
"onboarding.step3.body2": "Ihr Kompatibilitäts-Score kommt von expliziten Fragen:",
|
||||
"onboarding.step3.body3": "Sie können das System inspizieren, in Frage stellen und verbessern. Die vollständige Mathematik ist Open Source.",
|
||||
"onboarding.step3.continue": "Loslegen",
|
||||
"onboarding.step3.footer": "Wenn Sie nicht mit der Funktionsweise einverstanden sind, können Sie helfen, sie zu ändern.",
|
||||
"onboarding.step3.item1": "Ihre Antwort",
|
||||
"onboarding.step3.item2": "Welche Antworten Sie von anderen akzeptieren",
|
||||
"onboarding.step3.item3": "Wie wichtig jede Frage für Sie ist",
|
||||
"onboarding.step3.title": "Kompatibilität, die Sie verstehen können.",
|
||||
"onboarding.welcome": "Willkommen bei Compass",
|
||||
"organization.about.desc": "Wer wir sind, unsere Mission und wie die Organisation funktioniert.",
|
||||
"organization.proof.title": "Nachweise & Transparenz",
|
||||
"organization.proof.desc": "Wichtige Zahlen, Fortschritte und was andere über uns sagen.",
|
||||
"organization.contactSection.title": "Kontakt & Support",
|
||||
"organization.contactSection.desc": "Brauchen Sie Hilfe oder möchten Sie uns erreichen? Hier geht es los.",
|
||||
"organization.trust.title": "Vertrauen & Rechtliches",
|
||||
"organization.trust.desc": "Wie wir Ihre Daten schützen und die Regeln, die die Plattform governieren.",
|
||||
"organization.about.title": "Über uns",
|
||||
"organization.constitution": "Verfassung",
|
||||
"organization.contact": "Kontakt",
|
||||
"organization.contactSection.desc": "Brauchen Sie Hilfe oder möchten Sie uns erreichen? Hier geht es los.",
|
||||
"organization.contactSection.title": "Kontakt & Support",
|
||||
"organization.financials": "Finanzen",
|
||||
"organization.help": "Hilfe",
|
||||
"organization.privacy": "Datenschutzrichtlinie",
|
||||
"organization.proof.desc": "Wichtige Zahlen, Fortschritte und was andere über uns sagen.",
|
||||
"organization.proof.title": "Nachweise & Transparenz",
|
||||
"organization.security": "Sicherheit",
|
||||
"organization.seo.description": "Organisation",
|
||||
"organization.seo.title": "Organisation",
|
||||
@@ -399,7 +539,26 @@
|
||||
"organization.support": "Support",
|
||||
"organization.terms": "Allgemeine Geschäftsbedingungen",
|
||||
"organization.title": "Organisation",
|
||||
"organization.trust.desc": "Wie wir Ihre Daten schützen und die Regeln, die die Plattform governieren.",
|
||||
"organization.trust.title": "Vertrauen & Rechtliches",
|
||||
"organization.vote": "Vorschläge",
|
||||
"press.brand_assets": "Markenressourcen",
|
||||
"press.brand_assets_description": "Laden Sie unser Logo und unsere Markenrichtlinien herunter.",
|
||||
"press.contact": "Pressekontakt",
|
||||
"press.contact_description": "Für Presseanfragen wenden Sie sich bitte an unser Team.",
|
||||
"press.contact_us": "Kontakt aufnehmen",
|
||||
"press.download_assets": "Ressourcen herunterladen",
|
||||
"press.media_kit": "Medienpaket",
|
||||
"press.no_articles": "Derzeit sind keine Presseartikel verfügbar. Bitte schauen Sie später wieder vorbei.",
|
||||
"press.seo.description": "Aktuelle Berichterstattung und Medienberichte über Compass",
|
||||
"press.seo.title": "Presse - Compass",
|
||||
"press.subtitle": "Aktuelle Neuigkeiten und Medienberichte über Compass",
|
||||
"press.summary": "Zusammenfassung (Compass Redaktion)",
|
||||
"press.summary.1": "Belgischer und lokaler Videobericht, der Compass als Open-Source-Plattform zwischen Dating-App und sozialem Netzwerk beschreibt, die mit den üblichen Konventionen bricht, indem sie auf versteckte Algorithmen und die Betonung von Fotos verzichtet. Entwickelt vom Havelanger Ingenieur Martin Braquet, ermöglicht die Plattform die Suche nach Profilen basierend auf Werten und Interessen für freundschaftliche, berufliche oder romantische Beziehungen. Als eine Art 'Bibliothek' von Profilen mit Filterfunktionen zielt Compass darauf ab, soziale Verbindungen neu zu gestalten. Kostenlos, werbefrei und bereits mit über 400 Nutzern.",
|
||||
"press.summary.2": "Kurzes Video (Facebook Reel), das Compass auf unterhaltsame und dynamische Weise präsentiert. Martin Braquet, ein junger Ingenieur aus Havelange, stellt seine ethische Dating-App vor. Hier geht es um einen anderen Ansatz. Compass ist gemeinnützig und darauf ausgelegt, Verbindungen zu schaffen. Die Plattform ist offen, kollaborativ, ohne undurchsichtige Algorithmen. Und ohne den Druck von Profilfotos.",
|
||||
"press.summary.4": "Belgischer und lokaler Artikel über die Anfänge von Compass. In nur acht Wochen entwickelt und kostenlos angeboten, unterscheidet sich Compass durch den Verzicht auf versteckte Algorithmen und Wisch-Mechanismen. Stattdessen setzt die Plattform auf eine Schlagwortsuche, die sich auf Werte, Interessen und Persönlichkeit konzentriert, während Fotos in den Hintergrund treten. Als Open-Source-Projekt verfolgt Compass einen gemeinnützigen und gemeinschaftlichen Ansatz. Vier Monate nach dem Start zählt die Plattform etwas mehr als 400 Nutzer, mit dem Ziel, eine kritische Masse auf lokaler Ebene zu erreichen.",
|
||||
"press.summary.5": "Radiointerview mit Martin; er erklärt seinen Werdegang, seine Philosophie des Lernens durch praktische Erfahrung und die Entstehung einer Dating-App, die anders konzipiert ist. Das Gespräch behandelt die Risiken klassischer Apps (Sucht, Swipen, Datenauswertung), die Priorisierung von Interessen und Werten über das Aussehen sowie das Ziel, tiefere freundschaftliche, berufliche oder romantische Beziehungen zu fördern. Martin erläutert auch die Wahl eines Open-Source-, kostenlosen und transparenten Modells, die internationale Entwicklung und die Herausforderungen in Bezug auf die Nutzerzahl, um das Tool wirklich nützlich zu machen.",
|
||||
"press.title": "Presse",
|
||||
"privacy.contact": "Bei Fragen zu dieser Datenschutzrichtlinie wenden Sie sich an ",
|
||||
"privacy.effective_date": "Gültigkeitsdatum: 1. Januar 2025",
|
||||
"privacy.info.text": "Wir erfassen grundlegende Kontoinformationen wie Ihren Namen, Ihre E-Mail und Profildaten. Darüber hinaus können wir Nutzungsdaten erfassen, um die Funktionen der Plattform zu verbessern.",
|
||||
@@ -417,20 +576,30 @@
|
||||
"privacy.title": "Datenschutzrichtlinie",
|
||||
"privacy.use.text": "Ihre Daten werden nur verwendet, um die Plattform zu betreiben, zu personalisieren und zu verbessern. Wir verkaufen Ihre persönlichen Informationen nicht an Dritte.",
|
||||
"privacy.use.title": "2. Wie wir Ihre Daten verwenden",
|
||||
"profile.about.raised_in": "Aufgewachsen in {location}",
|
||||
"profile.age_any": "jeden Alters",
|
||||
"profile.age_between": "zwischen {min} und {max} Jahren",
|
||||
"profile.age_exact": "genau {min} Jahre",
|
||||
"profile.age_older_than": "älter als {min} Jahre",
|
||||
"profile.age_younger_than": "jünger als {max} Jahre",
|
||||
"profile.optional.error.invalid_fields": "Einige Felder sind nicht korrekt...",
|
||||
"profile.optional.age.error_min": "Du musst mindestens 18 Jahre alt sein",
|
||||
"profile.optional.age.error_max": "Bitte gib ein gültiges Alter ein",
|
||||
"profile.at": "in",
|
||||
"profile.basics.bio": "Biografie",
|
||||
"profile.basics.display_name": "Anzeigename",
|
||||
"profile.basics.subtitle": "Schreiben Sie Ihre eigene Biografie auf Ihre Weise.",
|
||||
"profile.basics.title": "Die Grundlagen",
|
||||
"profile.basics.username": "Benutzername",
|
||||
"profile.big5": "Persönlichkeit (Big Five)",
|
||||
"profile.big5_agreeableness": "Verträglichkeit",
|
||||
"profile.big5_average": "Durchschnittlich",
|
||||
"profile.big5_conscientiousness": "Gewissenhaftigkeit",
|
||||
"profile.big5_extraversion": "Extraversion",
|
||||
"profile.big5_high": "Hoch",
|
||||
"profile.big5_hint": "Ziehen Sie jeden Schieber, um festzulegen, wo Sie sich bei diesen Merkmalen sehen (0 = niedrig, 100 = hoch).",
|
||||
"profile.big5_low": "Niedrig",
|
||||
"profile.big5_neuroticism": "Neurotizismus",
|
||||
"profile.big5_openness": "Offenheit",
|
||||
"profile.big5_very_high": "Sehr hoch",
|
||||
"profile.big5_very_low": "Sehr niedrig",
|
||||
"profile.bio.about_me": "Über mich",
|
||||
"profile.bio.add_characters_many": "Fügen Sie {count} weitere Zeichen hinzu, um in den Suchergebnissen zu erscheinen — oder nehmen Sie sich Zeit und erkunden Sie zunächst die anderen.",
|
||||
"profile.bio.add_characters_one": "Fügen Sie {count} weiteres Zeichen hinzu, um in den Suchergebnissen zu erscheinen — oder nehmen Sie sich Zeit und erkunden Sie zunächst die anderen.",
|
||||
@@ -446,9 +615,8 @@
|
||||
"profile.bio.tips_list": "- Ihre Grundwerte, Interessen und Aktivitäten\n- Persönlichkeitsmerkmale, was Sie einzigartig macht und was Ihnen wichtig ist\n- Verbindungsziele (Zusammenarbeit, Freundschaft, romantisch)\n- Erwartungen und Grenzen\n- Verfügbarkeit, wie man Sie kontaktieren oder ein Gespräch beginnen kann (E-Mail, soziale Netzwerke, etc.)\n- Optional: romantische Vorlieben, Lebensgewohnheiten und Gesprächsthemen",
|
||||
"profile.bio.too_short": "Bio zu kurz. Das Profil kann aus den Suchergebnissen gefiltert werden.",
|
||||
"profile.bio.too_short_tooltip": "Da Ihre Bio zu kurz ist, filtert der Compass-Algorithmus Ihr Profil aus den Suchergebnissen (außer „Kurze Bios einbeziehen“ ist ausgewählt). Dies stellt sicher, dass Suchergebnisse aussagekräftige Profile anzeigen.",
|
||||
"profile.comments.current_user_hint": "Andere Benutzer können Ihnen hier Empfehlungen hinterlassen.",
|
||||
"profile.comments.add_comment": "Kommentar hinzufügen",
|
||||
"profile.comments.placeholder": "Schreiben Sie Ihre Empfehlung...",
|
||||
"profile.comments.current_user_hint": "Andere Benutzer können Ihnen hier Empfehlungen hinterlassen.",
|
||||
"profile.comments.disabled": "Empfehlungen deaktiviert",
|
||||
"profile.comments.disabling": "Empfehlungen anderer Benutzer werden deaktiviert",
|
||||
"profile.comments.enable_tooltip": "Empfehlungen anderer Benutzer aktivieren/deaktivieren",
|
||||
@@ -457,6 +625,7 @@
|
||||
"profile.comments.feature_disabled_other": "{name} hat Empfehlungen anderer Benutzer deaktiviert.",
|
||||
"profile.comments.feature_disabled_self": "Diese Funktion ist deaktiviert",
|
||||
"profile.comments.other_user_hint": "Wenn Sie sie kennen, schreiben Sie etwas Nettes, das ihr Profil bereichert.",
|
||||
"profile.comments.placeholder": "Schreiben Sie Ihre Empfehlung...",
|
||||
"profile.comments.section_title": "Empfehlungen",
|
||||
"profile.comments.update_error": "Aktualisierung der Empfehlungseinstellungen fehlgeschlagen",
|
||||
"profile.diet.keto": "Ketogen",
|
||||
@@ -492,12 +661,7 @@
|
||||
"profile.has_kids.no_preference": "Egal",
|
||||
"profile.has_kids_many": "Hat {count} Kinder",
|
||||
"profile.has_kids_one": "Hat {count} Kind",
|
||||
"profiles.hidden_success": "Profil ausgeblendet. Sie werden diese Person nicht mehr in den Suchergebnissen sehen.",
|
||||
"profile_grid.hide_profile": "Nicht mehr in den Suchergebnissen anzeigen",
|
||||
"profile_grid.unhide_profile": "Wieder in den Suchergebnissen anzeigen",
|
||||
"profile_grid.profile_hidden_short": "Du wirst {name} nicht mehr in deinen Suchergebnissen sehen.",
|
||||
"profile_grid.undo": "Rückgängig",
|
||||
"profile_grid.hidden_notice": "Du hast diese Person ausgeblendet, sie wird nicht mehr in deinen Suchergebnissen angezeigt.",
|
||||
"profile.header.age": "{age}",
|
||||
"profile.header.disabled_notice": "Sie haben Ihr Profil deaktiviert, niemand sonst kann darauf zugreifen.",
|
||||
"profile.header.menu.disable_profile": "Profil deaktivieren",
|
||||
"profile.header.menu.enable_profile": "Profil aktivieren",
|
||||
@@ -533,75 +697,7 @@
|
||||
"profile.language.eastern-min": "Ost-Min",
|
||||
"profile.language.english": "Englisch",
|
||||
"profile.language.french": "Französisch",
|
||||
"referrals.title": "Lade jemanden ein, Compass beizutreten!",
|
||||
"profile.language.fula": "Fulfulde",
|
||||
"events.title": "Events",
|
||||
"events.subtitle": "Entdecken und nehmen Sie an Community-Events teil — oder erstellen Sie Ihre eigenen, um Menschen zusammenzubringen",
|
||||
"events.create_event": "Event erstellen",
|
||||
"events.why_organize": "Warum Events organisieren?",
|
||||
"events.why_description": "Events sind das Herzbedeutungsvoller Verbindungen. Ob online oder in Person, sie schaffen Raum für tiefere Gespräche, gemeinsame Erlebnisse und dauerhafte Beziehungen.",
|
||||
"events.upcoming_events": "Bevorstehende Events",
|
||||
"events.past_events": "Vergangene Events",
|
||||
"events.no_upcoming": "Keine bevorstehenden Events. Schauen Sie bald wieder oder erstellen Sie Ihre eigenen!",
|
||||
"events.no_past": "Keine vergangenen Events",
|
||||
"events.failed_to_load": "Events konnten nicht geladen werden. Bitte versuchen Sie es später erneut.",
|
||||
"events.try_again": "Erneut versuchen",
|
||||
"events.going": "going",
|
||||
"events.maybe": "maybe",
|
||||
"events.not_going": "Nicht gehen",
|
||||
"events.cancel_rsvp": "RSVP abbrechen",
|
||||
"events.cancel_event": "Event abbrechen",
|
||||
"events.cancel_event_confirmation": "Sind Sie sicher, dass Sie dieses Event abbrechen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"events.edit_event": "Event bearbeiten",
|
||||
"events.create_new_event": "Neues Event erstellen",
|
||||
"events.update_event": "Event aktualisieren",
|
||||
"events.event_created": "Event erfolgreich erstellt!",
|
||||
"events.event_updated": "Event erfolgreich aktualisiert!",
|
||||
"events.event_cancelled": "Event erfolgreich abgesagt!",
|
||||
"events.failed_rsvp": "RSVP fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.failed_cancel_rsvp": "RSVP-Abbruch fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.failed_cancel_event": "Event-Abbruch fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.failed_update_event": "Event-Aktualisierung fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.failed_create_event": "Event-Erstellung fehlgeschlagen. Bitte versuchen Sie es erneut.",
|
||||
"events.cancelled": "Abgesagt",
|
||||
"events.completed": "Abgeschlossen",
|
||||
"events.participants_count": "{count} going",
|
||||
"events.participants_max": " / {max} max",
|
||||
"events.maybe_count": " ({count} maybe)",
|
||||
"events.event_title": "Event-Titel",
|
||||
"events.description": "Beschreibung",
|
||||
"events.location_type": "Ortstyp",
|
||||
"events.location_address": "Ortsadresse",
|
||||
"events.location_url": "Orts-URL",
|
||||
"events.start_time": "Startzeit",
|
||||
"events.end_time": "Endzeit",
|
||||
"events.select_start_datetime": "Datum und Uhrzeit auswählen",
|
||||
"events.select_end_datetime": "Endzeit auswählen (optional)",
|
||||
"events.max_participants": "Max. Teilnehmer (optional)",
|
||||
"events.leave_empty": "Leer lassen für unbegrenzt",
|
||||
"events.in_person": "In Person",
|
||||
"events.online": "Online",
|
||||
"events.event_title_placeholder": "Event-Titel eingeben",
|
||||
"events.description_placeholder": "Beschreiben Sie Ihr Event...",
|
||||
"events.location_address_placeholder": "Ortsadresse eingeben",
|
||||
"events.location_url_placeholder": "Orts-URL eingeben",
|
||||
"events.cancel": "Abbrechen",
|
||||
"events.loading": "Laden...",
|
||||
"events.creating": "Erstellen...",
|
||||
"events.updating": "Aktualisieren...",
|
||||
"events.max_participants_hint": "Max. Teilnehmer",
|
||||
"events.login_to_rsvp": "Anmelden für RSVP",
|
||||
"events.book_clubs": "Buchclubs",
|
||||
"events.game_nights": "Spieleabende",
|
||||
"events.walking_groups": "Wandergruppen",
|
||||
"events.coffee_chats": "Kaffeegespräche",
|
||||
"events.creative_workshops": "Kreative Workshops",
|
||||
"events.philosophy_discussions": "Philosophiediskussionen",
|
||||
"events.sustainability_meetups": "Nachhaltigkeits-Treffen",
|
||||
"events.hobby_exchanges": "Hobby-Austausche",
|
||||
"events.started": "Gestartet {time}",
|
||||
"events.organized_by": "Organisiert von",
|
||||
"events.online_event_join_link": "Online-Event - Link beitreten",
|
||||
"profile.language.gan": "Gan",
|
||||
"profile.language.german": "Deutsch",
|
||||
"profile.language.greek": "Griechisch",
|
||||
@@ -654,16 +750,6 @@
|
||||
"profile.language.serbo-croatian": "Serbokroatisch",
|
||||
"profile.language.shona": "Shona",
|
||||
"profile.language.sindhi": "Sindhi",
|
||||
"onboarding.soft-gate.seo.title": "Sie sind bereit zu erkunden - Compass",
|
||||
"onboarding.soft-gate.seo.description": "Starten Sie mit Compass - transparente Verbindungen ohne Algorithmen",
|
||||
"onboarding.soft-gate.title": "Sie sind bereit zu erkunden",
|
||||
"onboarding.soft-gate.intro": "Sie haben Ihre ersten Kompatibilitätsfragen beantwortet und Ihre Hauptinteressen geteilt.",
|
||||
"onboarding.soft-gate.what_it_means": "Das bedeutet das für Sie:",
|
||||
"onboarding.soft-gate.bullet1": "Kompatibilitätswerte spiegeln jetzt Ihre Werte und Präferenzen wider",
|
||||
"onboarding.soft-gate.bullet2": "Sie sehen Übereinstimmungswerte, die eng mit dem übereinstimmen, was Ihnen wichtig ist",
|
||||
"onboarding.soft-gate.bullet3": "Sie können Ihr Profil jederzeit aktualisieren, um die Chancen zu erhöhen, dass die richtigen Personen sich an Sie wenden.",
|
||||
"onboarding.soft-gate.explore_button": "Profile jetzt erkunden",
|
||||
"onboarding.soft-gate.refine_button": "Profil verfeinern",
|
||||
"profile.language.sinhala": "Singhalesisch",
|
||||
"profile.language.somali": "Somali",
|
||||
"profile.language.southern-min": "Süd-Min",
|
||||
@@ -692,7 +778,19 @@
|
||||
"profile.language.zulu": "Zulu",
|
||||
"profile.last_online": "Zuletzt online {time}",
|
||||
"profile.optional.age": "Alter",
|
||||
"profile.optional.age.error_max": "Bitte gib ein gültiges Alter ein",
|
||||
"profile.optional.age.error_min": "Du musst mindestens 18 Jahre alt sein",
|
||||
"profile.optional.age_range": "Im Alter zwischen",
|
||||
"profile.optional.big5_hint": "Ziehen Sie jeden Schieber, um festzulegen, wo Sie sich bei diesen Merkmalen sehen (0 = niedrig, 100 = hoch).",
|
||||
"profile.optional.category.education": "Bildung",
|
||||
"profile.optional.category.family": "Familie",
|
||||
"profile.optional.category.interested_in": "Wen ich suche",
|
||||
"profile.optional.category.morality": "Moral",
|
||||
"profile.optional.category.personal_info": "Persönliche Informationen",
|
||||
"profile.optional.category.psychology": "Psychologie",
|
||||
"profile.optional.category.relationships": "Beziehungen",
|
||||
"profile.optional.category.substances": "Substanzen",
|
||||
"profile.optional.category.work": "Beruf",
|
||||
"profile.optional.causes": "Moralische Anliegen",
|
||||
"profile.optional.centimeters": "Zentimeter",
|
||||
"profile.optional.company": "Unternehmen",
|
||||
@@ -701,6 +799,7 @@
|
||||
"profile.optional.diet": "Ernährungsweise",
|
||||
"profile.optional.drinks_per_month": "Alkoholische Getränke pro Monat",
|
||||
"profile.optional.education_level": "Höchster Bildungsabschluss",
|
||||
"profile.optional.error.invalid_fields": "Einige Felder sind nicht korrekt...",
|
||||
"profile.optional.ethnicity": "Ethnische Herkunft",
|
||||
"profile.optional.feet": "Fuß",
|
||||
"profile.optional.gender": "Geschlecht",
|
||||
@@ -715,16 +814,9 @@
|
||||
"profile.optional.mbti": "MBTI-Persönlichkeitstyp",
|
||||
"profile.optional.num_kids": "Aktuelle Anzahl von Kindern",
|
||||
"profile.optional.photos": "Fotos",
|
||||
"profile.optional.category.personal_info": "Persönliche Informationen",
|
||||
"profile.optional.category.interested_in": "Wen ich suche",
|
||||
"profile.optional.category.relationships": "Beziehungen",
|
||||
"profile.optional.category.family": "Familie",
|
||||
"profile.optional.category.morality": "Moral",
|
||||
"profile.optional.category.psychology": "Psychologie",
|
||||
"profile.optional.category.work": "Beruf",
|
||||
"profile.optional.category.education": "Bildung",
|
||||
"profile.optional.category.substances": "Substanzen",
|
||||
"profile.optional.political_beliefs": "Politische Ansichten",
|
||||
"profile.optional.raised_in": "Ort, an dem ich aufgewachsen bin",
|
||||
"profile.optional.raised_in_hint": "Besonders nützlich, wenn Sie in einem anderen Land aufgewachsen sind als dem, in dem Sie jetzt leben – und wenn dies Ihre kulturellen Referenzen, Werte und Lebenserfahrungen widerspiegelt.",
|
||||
"profile.optional.relationship_status": "Beziehungsstatus",
|
||||
"profile.optional.relationship_style": "Beziehungsstil",
|
||||
"profile.optional.religious_beliefs": "Religiöse Überzeugungen",
|
||||
@@ -738,29 +830,6 @@
|
||||
"profile.optional.username_or_url": "Benutzername oder URL",
|
||||
"profile.optional.want_kids": "Ich möchte Kinder haben",
|
||||
"profile.optional.work": "Arbeit",
|
||||
"profile.optional.raised_in": "Ort, an dem ich aufgewachsen bin",
|
||||
"profile.optional.raised_in_hint": "Besonders nützlich, wenn Sie in einem anderen Land aufgewachsen sind als dem, in dem Sie jetzt leben – und wenn dies Ihre kulturellen Referenzen, Werte und Lebenserfahrungen widerspiegelt.",
|
||||
"profile.about.raised_in": "Aufgewachsen in {location}",
|
||||
"profile.header.age": "{age}",
|
||||
"filter.raised_in": "Aufgewachsen",
|
||||
"filter.location": "Wohnhaft",
|
||||
"filter.location.any": "überall",
|
||||
"filter.near": "in der Nähe von",
|
||||
"filter.location.search_city": "Stadt suchen...",
|
||||
"filter.location.set_any_city": "Auf jede Stadt einstellen",
|
||||
"profile.big5_openness": "Offenheit",
|
||||
"profile.big5_conscientiousness": "Gewissenhaftigkeit",
|
||||
"profile.big5_extraversion": "Extraversion",
|
||||
"profile.big5_agreeableness": "Verträglichkeit",
|
||||
"profile.big5_neuroticism": "Neurotizismus",
|
||||
"profile.big5": "Persönlichkeit (Big Five)",
|
||||
"profile.big5_hint": "Ziehen Sie jeden Schieber, um festzulegen, wo Sie sich bei diesen Merkmalen sehen (0 = niedrig, 100 = hoch).",
|
||||
"profile.big5_very_low": "Sehr niedrig",
|
||||
"profile.big5_low": "Niedrig",
|
||||
"profile.big5_average": "Durchschnittlich",
|
||||
"profile.big5_high": "Hoch",
|
||||
"profile.big5_very_high": "Sehr hoch",
|
||||
"profile.optional.big5_hint": "Ziehen Sie jeden Schieber, um festzulegen, wo Sie sich bei diesen Merkmalen sehen (0 = niedrig, 100 = hoch).",
|
||||
"profile.political.conservative": "Konservativ",
|
||||
"profile.political.e/acc": "Effektiver Akzelerationismus",
|
||||
"profile.political.green": "Grün / Ökosozialismus",
|
||||
@@ -829,18 +898,25 @@
|
||||
"profile.wants_kids_2": "Neutral oder offen für Kinder",
|
||||
"profile.wants_kids_3": "Neigt dazu, Kinder zu wollen",
|
||||
"profile.wants_kids_4": "Möchte Kinder",
|
||||
"profile_grid.hidden_notice": "Du hast diese Person ausgeblendet, sie wird nicht mehr in deinen Suchergebnissen angezeigt.",
|
||||
"profile_grid.hide_profile": "Nicht mehr in den Suchergebnissen anzeigen",
|
||||
"profile_grid.no_profiles": "Keine Profile gefunden.",
|
||||
"profile_grid.notification_cta": "Klicken Sie gern auf „Benachrichtigen“, und wir informieren Sie, sobald neue Nutzer Ihrer Suche entsprechen.",
|
||||
"profiles.title": "Personen",
|
||||
"profile_grid.profile_hidden_short": "Du wirst {name} nicht mehr in deinen Suchergebnissen sehen.",
|
||||
"profile_grid.undo": "Rückgängig",
|
||||
"profile_grid.unhide_profile": "Wieder in den Suchergebnissen anzeigen",
|
||||
"profiles.dismiss": "Verwerfen",
|
||||
"profiles.filter_guide": "Filtern Sie unten nach Absicht, Alter, Standort und mehr",
|
||||
"profiles.hidden_success": "Profil ausgeblendet. Sie werden diese Person nicht mehr in den Suchergebnissen sehen.",
|
||||
"profiles.interactive_profiles": "Profile sind interaktiv — klicken Sie auf jede Karte, um mehr zu erfahren und Kontakt aufzunehmen.",
|
||||
"profiles.search_intention": "Compass funktioniert am besten, wenn Sie mit Absicht suchen. Versuchen Sie, Schlüsselwörter oder Filter anstelle des Scrollens zu verwenden.",
|
||||
"profiles.try_keyword_search": "Schlüsselwortsuche versuchen",
|
||||
"profiles.search_tip": "Tipp: Suchen Sie zuerst, um bessere Übereinstimmungen zu finden. Endloses Scrollen reduziert die Relevanz.",
|
||||
"profiles.seeing_all_profiles": "Sie sehen alle Profile. Verwenden Sie Suche oder Filter, um einzugrenzen.",
|
||||
"profiles.show_filters": "Filter anzeigen",
|
||||
"profiles.sort_differently": "Anders sortieren",
|
||||
"profiles.interactive_profiles": "Profile sind interaktiv — klicken Sie auf jede Karte, um mehr zu erfahren und Kontakt aufzunehmen.",
|
||||
"profiles.dismiss": "Verwerfen",
|
||||
"profiles.seeing_all_profiles": "Sie sehen alle Profile. Verwenden Sie Suche oder Filter, um einzugrenzen.",
|
||||
"profiles.filter_guide": "Filtern Sie unten nach Absicht, Alter, Standort und mehr",
|
||||
"profiles.search_tip": "Tipp: Suchen Sie zuerst, um bessere Übereinstimmungen zu finden. Endloses Scrollen reduziert die Relevanz.",
|
||||
"profiles.title": "Personen",
|
||||
"profiles.try_keyword_search": "Schlüsselwortsuche versuchen",
|
||||
"referrals.title": "Lade jemanden ein, Compass beizutreten!",
|
||||
"register.agreement.and": " und ",
|
||||
"register.agreement.prefix": "Mit der Registrierung akzeptiere ich die ",
|
||||
"register.agreement.suffix": ".",
|
||||
@@ -859,7 +935,6 @@
|
||||
"register.error.all_fields_required": "Alle Felder sind erforderlich",
|
||||
"register.error.email_in_use": "Diese E-Mail ist bereits registriert",
|
||||
"register.error.unknown": "Registrierung fehlgeschlagen",
|
||||
"error.option_exists": "Diese Option existiert bereits",
|
||||
"register.get_started": "Loslegen",
|
||||
"register.link_signin": "Anmelden",
|
||||
"register.or_sign_up_with": "Oder registrieren mit",
|
||||
@@ -890,6 +965,7 @@
|
||||
"saved_searches.empty_state": "Sie haben noch keine Suche gespeichert. Um eine zu speichern, klicken Sie auf „Benachrichtigen“ – wir informieren Sie täglich, wenn neue Personen passen.",
|
||||
"saved_searches.notification_note": "Wir benachrichtigen Sie täglich, wenn neue Personen Ihren gespeicherten Suchen entsprechen.",
|
||||
"saved_searches.title": "Gespeicherte Suchen",
|
||||
"search.include_short_bios_tooltip": "Um alle Profile aufzulisten, aktivieren Sie \"Kurze Bios einbeziehen\"",
|
||||
"security.contact.email_button": "E-Mail",
|
||||
"security.contact.form": "Kontaktformular",
|
||||
"security.contact.title": "Kontakt",
|
||||
@@ -913,10 +989,17 @@
|
||||
"security.seo.description": "Sicherheitslücken an das Compass-Team melden",
|
||||
"security.seo.title": "Sicherheit",
|
||||
"security.title": "Sicherheit",
|
||||
"send_message.button_label": "Nachricht",
|
||||
"send_message.title": "Kontakt",
|
||||
"settings.action.cancel": "Abbrechen",
|
||||
"common.change": "Ändern",
|
||||
"settings.action.save": "Speichern",
|
||||
"settings.danger_zone": "Gefahrenzone",
|
||||
"settings.data_privacy.description": "Laden Sie eine JSON-Datei mit allen Ihren Informationen herunter: Profil, Konto, Nachrichten, Kompatibilitätsantworten, markierte Profile, Stimmen, Empfehlungen, Such-Lesezeichen usw.",
|
||||
"settings.data_privacy.download": "Alle meine Daten herunterladen (JSON)",
|
||||
"settings.data_privacy.download.error": "Fehler beim Herunterladen Ihrer Daten. Bitte versuchen Sie es erneut.",
|
||||
"settings.data_privacy.download.success": "Ihr Daten-Export wurde heruntergeladen.",
|
||||
"settings.data_privacy.downloading": "Herunterladen...",
|
||||
"settings.data_privacy.title": "Daten & Datenschutz",
|
||||
"settings.delete.error": "Löschen des Kontos fehlgeschlagen.",
|
||||
"settings.delete.loading": "Konto wird gelöscht..",
|
||||
"settings.delete.success": "Ihr Konto wurde gelöscht.",
|
||||
@@ -931,40 +1014,37 @@
|
||||
"settings.email.same_as_current": "Die neue E-Mail-Adresse ist identisch mit der aktuellen",
|
||||
"settings.email.send_verification": "Bestätigungs-E-Mail senden",
|
||||
"settings.email.sending": "Bestätigungs-E-Mail wird gesendet...",
|
||||
"settings.email.too_many_requests": "Sie können nicht mehr als eine E-Mail pro Minute anfordern. Bitte warten Sie, bevor Sie eine weitere Anfrage senden.",
|
||||
"settings.email.update_failed": "Aktualisierung der E-Mail-Adresse fehlgeschlagen",
|
||||
"settings.email.updated_success": "E-Mail-Adresse erfolgreich aktualisiert",
|
||||
"settings.email.verification_failed": "Senden der Bestätigungs-E-Mail fehlgeschlagen.",
|
||||
"settings.email.verification_sent": "Bestätigungs-E-Mail gesendet – prüfen Sie Ihren Posteingang und Spam-Ordner.",
|
||||
"settings.email.too_many_requests": "Sie können nicht mehr als eine E-Mail pro Minute anfordern. Bitte warten Sie, bevor Sie eine weitere Anfrage senden.",
|
||||
"settings.email.verified": "E-Mail bestätigt ✔️",
|
||||
"messaging.email_verification_required": "Sie müssen Ihre E-Mail überprüfen, um Personen zu schreiben.",
|
||||
"settings.general.account": "Konto",
|
||||
"settings.general.email": "E-Mail",
|
||||
"settings.general.font": "Schriftart",
|
||||
"settings.general.language": "Sprache",
|
||||
"settings.general.measurement": "Maßeinheitensystem",
|
||||
"settings.general.password": "Passwort",
|
||||
"settings.general.people": "Personen",
|
||||
"settings.general.theme": "Design",
|
||||
"settings.hidden_profiles.description": "Diese Personen erscheinen nicht in Ihren Suchergebnissen.",
|
||||
"settings.hidden_profiles.empty": "Sie haben keine Profile ausgeblendet.",
|
||||
"settings.hidden_profiles.load_error": "Fehler beim Laden ausgeblendeter Profile.",
|
||||
"settings.hidden_profiles.loading": "Ausgeblendete Profile werden geladen...",
|
||||
"settings.hidden_profiles.manage": "Ausgeblendete Profile verwalten",
|
||||
"settings.hidden_profiles.title": "Profile, die Sie ausgeblendet haben",
|
||||
"settings.hidden_profiles.unhidden_success": "Profil eingeblendet. Sie werden diese Person wieder in den Ergebnissen sehen.",
|
||||
"settings.hidden_profiles.unhide": "Einblenden",
|
||||
"settings.hidden_profiles.unhide_failed": "Fehler beim Einblenden",
|
||||
"settings.hidden_profiles.unhiding": "Einblenden...",
|
||||
"settings.measurement.imperial": "Imperial",
|
||||
"settings.measurement.metric": "Metrisch",
|
||||
"settings.password.send_reset": "Passwort-Zurücksetzungs-E-Mail senden",
|
||||
"settings.tabs.about": "Über",
|
||||
"settings.tabs.general": "Allgemein",
|
||||
"settings.tabs.notifications": "Benachrichtigungen",
|
||||
"settings.title": "Einstellungen",
|
||||
"settings.hidden_profiles.title": "Profile, die Sie ausgeblendet haben",
|
||||
"settings.hidden_profiles.manage": "Ausgeblendete Profile verwalten",
|
||||
"settings.hidden_profiles.load_error": "Fehler beim Laden ausgeblendeter Profile.",
|
||||
"settings.hidden_profiles.unhidden_success": "Profil eingeblendet. Sie werden diese Person wieder in den Ergebnissen sehen.",
|
||||
"settings.hidden_profiles.unhide_failed": "Fehler beim Einblenden",
|
||||
"settings.hidden_profiles.loading": "Ausgeblendete Profile werden geladen...",
|
||||
"settings.hidden_profiles.unhiding": "Einblenden...",
|
||||
"settings.hidden_profiles.unhide": "Einblenden",
|
||||
"settings.hidden_profiles.empty": "Sie haben keine Profile ausgeblendet.",
|
||||
"settings.hidden_profiles.description": "Diese Personen erscheinen nicht in Ihren Suchergebnissen.",
|
||||
"settings.data_privacy.title": "Daten & Datenschutz",
|
||||
"settings.data_privacy.description": "Laden Sie eine JSON-Datei mit allen Ihren Informationen herunter: Profil, Konto, Nachrichten, Kompatibilitätsantworten, markierte Profile, Stimmen, Empfehlungen, Such-Lesezeichen usw.",
|
||||
"settings.data_privacy.download": "Alle meine Daten herunterladen (JSON)",
|
||||
"settings.data_privacy.downloading": "Herunterladen...",
|
||||
"settings.data_privacy.download.success": "Ihr Daten-Export wurde heruntergeladen.",
|
||||
"settings.data_privacy.download.error": "Fehler beim Herunterladen Ihrer Daten. Bitte versuchen Sie es erneut.",
|
||||
"signin.continue": "Oder fortfahren mit",
|
||||
"signin.email": "E-Mail",
|
||||
"signin.enter_email": "Bitte geben Sie Ihre E-Mail ein",
|
||||
@@ -994,16 +1074,16 @@
|
||||
"signup.submit": "Konto erstellen",
|
||||
"signup.title": "Konto erstellen",
|
||||
"signup.toast.created": "Konto erstellt",
|
||||
"social.community.title": "Community",
|
||||
"social.community.desc": "Treten Sie unseren Community-Diskussionen und Chats bei.",
|
||||
"social.follow.title": "Folgen & Updates",
|
||||
"social.follow.desc": "Bleiben Sie über Ankündigungen und Nachrichten informiert.",
|
||||
"social.dev.title": "Entwicklung",
|
||||
"social.dev.desc": "Sehen Sie sich unseren Quellcode an oder tragen Sie bei.",
|
||||
"social.contact.title": "Kontakt",
|
||||
"social.community.title": "Community",
|
||||
"social.contact.desc": "Kontaktieren Sie uns direkt für Anfragen.",
|
||||
"social.contact.title": "Kontakt",
|
||||
"social.dev.desc": "Sehen Sie sich unseren Quellcode an oder tragen Sie bei.",
|
||||
"social.dev.title": "Entwicklung",
|
||||
"social.discord": "Discord",
|
||||
"social.email_button": "E-Mail",
|
||||
"social.follow.desc": "Bleiben Sie über Ankündigungen und Nachrichten informiert.",
|
||||
"social.follow.title": "Folgen & Updates",
|
||||
"social.github": "GitHub",
|
||||
"social.reddit": "Reddit",
|
||||
"social.seo.description": "Soziale Netzwerke",
|
||||
@@ -1011,6 +1091,8 @@
|
||||
"social.stoat": "Revolt / Stoat",
|
||||
"social.title": "Soziale Netzwerke",
|
||||
"social.x": "X",
|
||||
"star_button.save": "Profil speichern",
|
||||
"star_button.unsave": "Profil nicht mehr speichern",
|
||||
"stats.active_members": "Aktive Mitglieder (letzter Monat)",
|
||||
"stats.compatibility_prompts": "Kompatibilitätsfragen",
|
||||
"stats.discussions": "Diskussionen",
|
||||
@@ -1027,6 +1109,9 @@
|
||||
"stats.total": "Gesamt",
|
||||
"stats.votes": "Stimmen",
|
||||
"stats.with_bio": "Mit Bio",
|
||||
"sticky_format_menu.add_embed": "Embed hinzufügen",
|
||||
"sticky_format_menu.add_emoji": "Emoji hinzufügen",
|
||||
"sticky_format_menu.upload_image": "Bild hochladen",
|
||||
"terms.changes.text": "Wir können diese Bedingungen gelegentlich aktualisieren. Die weitere Nutzung von Compass nach Änderungen gilt als Zustimmung zu den neuen Bedingungen.",
|
||||
"terms.changes.title": "6. Änderungen",
|
||||
"terms.contact": "Bei Fragen zu diesen Bedingungen kontaktieren Sie uns bitte unter ",
|
||||
@@ -1106,63 +1191,5 @@
|
||||
"vote.toast.created": "Vorschlag erstellt",
|
||||
"vote.urgent": "Dringend",
|
||||
"vote.voted": "Stimme gespeichert",
|
||||
"onboarding.skip": "Onboarding überspringen",
|
||||
"onboarding.welcome": "Willkommen bei Compass",
|
||||
"onboarding.step1.title": "Keine Black Box. Keine Manipulation.",
|
||||
"onboarding.step1.body1": "Compass entscheidet nicht, wen Sie sehen sollten.",
|
||||
"onboarding.step1.body2": "Es gibt keinen Engagement-Algorithmus, kein Swipe-Ranking, keine boosteten Profile und keine Aufmerksamkeitsoptimierung. Sie können die vollständige Datenbank durchsuchen, Ihre eigenen Filter anwenden und genau sehen, warum jemand mit Ihnen übereinstimmt.",
|
||||
"onboarding.step1.body3": "Sie behalten die Kontrolle über die Entdeckung. Immer.",
|
||||
"onboarding.step1.footer": "Transparenz ist ein Grundprinzip, keine Funktion.",
|
||||
"onboarding.step2.title": "Suchen, nicht scrollen.",
|
||||
"onboarding.step2.body1": "Anstatt endlosem Swiping erlaubt Ihnen Compass, gezielt zu suchen.",
|
||||
"onboarding.step2.body2": "Suchen Sie Personen nach:",
|
||||
"onboarding.step2.item1": "Interessen und Schlüsselwörtern",
|
||||
"onboarding.step2.item2": "Werten und Ideen",
|
||||
"onboarding.step2.item3": "Kompatibilitätsantworten",
|
||||
"onboarding.step2.item4": "Standort und Absicht",
|
||||
"onboarding.step2.body3": "Sie können Suchen speichern und benachrichtigt werden, wenn neue Personen übereinstimmen. Keine Notwendigkeit, die App jeden Tag zu überprüfen.",
|
||||
"onboarding.step2.footer": "Weniger Lärm. Mehr Signal.",
|
||||
"onboarding.step3.title": "Kompatibilität, die Sie verstehen können.",
|
||||
"onboarding.step3.body1": "Matches sind weder magisch noch mysteriös.",
|
||||
"onboarding.step3.body2": "Ihr Kompatibilitäts-Score kommt von expliziten Fragen:",
|
||||
"onboarding.step3.item1": "Ihre Antwort",
|
||||
"onboarding.step3.item2": "Welche Antworten Sie von anderen akzeptieren",
|
||||
"onboarding.step3.item3": "Wie wichtig jede Frage für Sie ist",
|
||||
"onboarding.step3.body3": "Sie können das System inspizieren, in Frage stellen und verbessern. Die vollständige Mathematik ist Open Source.",
|
||||
"onboarding.step3.footer": "Wenn Sie nicht mit der Funktionsweise einverstanden sind, können Sie helfen, sie zu ändern.",
|
||||
"onboarding.step3.continue": "Loslegen",
|
||||
"common.continue": "Weiter",
|
||||
"compatibility.onboarding.title": "Sehen Sie, mit wem Sie tatsächlich übereinstimmen",
|
||||
"compatibility.onboarding.body1": "Beantworten Sie einige kurze Fragen, um die Kompatibilität basierend auf Werten und Vorlieben zu berechnen — nicht auf Fotos oder Swipes.",
|
||||
"compatibility.onboarding.body2": "Ihre Antworten beeinflussen direkt, wer mit Ihnen übereinstimmt und wie stark.",
|
||||
"compatibility.onboarding.impact": "Die meisten Menschen, die mindestens 3 Fragen beantworten, sehen wesentlich relevantere Übereinstimmungen.",
|
||||
"compatibility.onboarding.start": "Fragen beantworten beginnen",
|
||||
"compatibility.onboarding.later": "Später erledigen",
|
||||
"more_options_user.edit_profile": "Profil bearbeiten",
|
||||
"more_options_user.profile_options": "Profiloptionen",
|
||||
"more_options_user.edit_bio": "Bio bearbeiten",
|
||||
"vote.with_priority": "mit Priorität",
|
||||
"settings.general.font": "Schriftart",
|
||||
"settings.general.measurement": "Maßeinheitensystem",
|
||||
"settings.measurement.imperial": "Imperial",
|
||||
"settings.measurement.metric": "Metrisch",
|
||||
"font.atkinson": "Atkinson Hyperlegible",
|
||||
"font.system-sans": "System Sans",
|
||||
"font.classic-serif": "Klassische Serifenschrift",
|
||||
"filter.age.label": "Alter",
|
||||
"filter.age.up_to": "bis zu",
|
||||
"filter.any_new_users": "Jegliche neue Nutzer",
|
||||
"filter.label.name": "Suche",
|
||||
"filter.label.education_levels": "Bildung",
|
||||
"filter.label.pref_age_max": "Max. Alter",
|
||||
"filter.label.pref_age_min": "Min. Alter",
|
||||
"filter.label.drinks": "Getränke",
|
||||
"filter.label.wants_kids_strength": "Kinder",
|
||||
"filter.label.pref_relation_styles": "Suche",
|
||||
"filter.label.pref_gender": "Gesuchtes Geschlecht",
|
||||
"filter.label.diet": "Ernährung",
|
||||
"filter.label.political_beliefs": "Politische Ansichten",
|
||||
"filter.label.mbti": "MBTI",
|
||||
"filter.drinks.per_month": "pro Monat",
|
||||
"compatibility.search_placeholder": "Fragen und Antworten durchsuchen..."
|
||||
"vote.with_priority": "mit Priorität"
|
||||
}
|
||||
@@ -1,35 +1,12 @@
|
||||
{
|
||||
"404.default_message": "Je ne trouve pas cette page.",
|
||||
"404.help_text": "Si vous ne vous attendiez pas à cela, essayez de recharger la page dans quelques secondes ou obtenez de l'",
|
||||
"404.title": "404 : Oups !",
|
||||
"about.block.democratic.link_constitution": "constitution",
|
||||
"about.block.democratic.link_voted": "voté",
|
||||
"about.block.democratic.middle": " par la communauté, tout en garantissant aucune dérive via notre ",
|
||||
"about.block.democratic.prefix": "Gouverné et ",
|
||||
"about.block.democratic.suffix": ".",
|
||||
"about.block.press.title": "Presse",
|
||||
"about.block.press.text": "Découvrez les derniers articles de presse ",
|
||||
"about.block.press.link": "ici",
|
||||
"press.seo.title": "Presse - Compass",
|
||||
"press.seo.description": "Dernières actualités et mentions de Compass dans la presse",
|
||||
"press.title": "Presse",
|
||||
"press.subtitle": "Dernières actualités et couverture médiatique de Compass",
|
||||
"press.media_kit": "Kit Média",
|
||||
"press.brand_assets": "Ressources de marque",
|
||||
"press.brand_assets_description": "Téléchargez notre logo et nos directives de marque.",
|
||||
"press.download_assets": "Télécharger les ressources",
|
||||
"press.contact": "Contact presse",
|
||||
"press.contact_description": "Pour toute demande de presse, veuillez contacter notre équipe.",
|
||||
"press.contact_us": "Nous contacter",
|
||||
"press.summary": "Résumé (Éditorial Compass)",
|
||||
"press.summary.5": "Interview radio de Martin; il y explique son parcours, sa philosophie d’apprentissage par la pratique et la genèse d’une application de rencontre pensée autrement. L’entretien aborde les dérives des applications classiques (addiction, swipe, exploitation des données), la volonté de replacer les centres d’intérêt et les valeurs avant le physique, et l’objectif de favoriser des relations amicales, professionnelles ou amoureuses plus profondes. Martin détaille aussi le choix du modèle open source, gratuit et transparent, son développement international, ainsi que les enjeux d’audience pour rendre l’outil réellement utile aux utilisateurs.",
|
||||
"press.summary.4": "Article belge et local présentant les débuts de Compass. Développée en huit semaines et proposée gratuitement, Compass se distingue des applications dominantes par l’absence d’algorithmes cachés et de mécanismes de swipe, au profit d’une recherche par mots-clés centrée sur les valeurs, les centres d’intérêt et la personnalité, les photos étant secondaires. Projet open source, Compass revendique une logique non lucrative et communautaire. Quatre mois après son lancement, elle compte un peu plus de 400 utilisateurs, avec l’ambition d’atteindre une masse critique locale.",
|
||||
"press.summary.2": "Courte vidéo (Facebook reel) illustrant Compass de manière fun et dynamique. Martin Braquet, un jeune ingénieur havelangeois, sort son appli de rencontre éthique. Ici, on parle d’une autre approche. Compass est sans but lucratif, pensée pour créer du lien. Sa plateforme est ouverte, collaborative, sans algorithme opaque. Et sans le poids des photos de profil.",
|
||||
"press.summary.1": "Reportage vidéo belge et local qui décrit Compass comme une plateforme open source à mi-chemin entre application de rencontre et réseau social, qui rompt avec les codes habituels en supprimant algorithmes cachés et mise en avant des photos. Créée par l’ingénieur havelangeois Martin Braquet, elle permet de rechercher des profils selon les valeurs et centres d’intérêt, pour des relations amicales, professionnelles ou romantiques. Pensée comme une « bibliothèque » de profils accessible par filtres, Compass vise à recréer du lien social. Gratuite, sans publicité, elle compte déjà un peu plus de 400 utilisateurs.",
|
||||
"press.no_articles": "Aucun article de presse disponible pour le moment. Veuillez réessayer ultérieurement.",
|
||||
"languages.en": "Anglais",
|
||||
"languages.fr": "Français",
|
||||
"languages.de": "Allemand",
|
||||
"404.title": "404 : Oups !",
|
||||
"404.default_message": "Je ne trouve pas cette page.",
|
||||
"404.help_text": "Si vous ne vous attendiez pas à cela, essayez de recharger la page dans quelques secondes ou obtenez de l'",
|
||||
"about.block.democratic.title": "Démocratique",
|
||||
"about.block.free.text": "Sans abonnement. Sans paywall. Sans publicité.",
|
||||
"about.block.free.title": "Gratuit",
|
||||
@@ -41,6 +18,9 @@
|
||||
"about.block.notify.title": "Recevez des notifications de recherches",
|
||||
"about.block.personality.text": "Valeurs et centres d'intérêt d'abord, les photos sont secondaires.",
|
||||
"about.block.personality.title": "Centré sur la personnalité",
|
||||
"about.block.press.link": "ici",
|
||||
"about.block.press.text": "Découvrez les derniers articles de presse ",
|
||||
"about.block.press.title": "Presse",
|
||||
"about.block.transparent.text": "Code open source et conception communautaire.",
|
||||
"about.block.transparent.title": "Transparence",
|
||||
"about.block.vision.text": "Compass est aux relations humaines ce que Linux, Wikipédia et Firefox sont aux logiciels et au savoir : un bien public construit par les personnes qui l'utilisent, pour le bien de tous.",
|
||||
@@ -59,13 +39,13 @@
|
||||
"about.join.title": "Rejoindre la communauté",
|
||||
"about.seo.description": "À propos de Compass",
|
||||
"about.seo.title": "À propos",
|
||||
"about.settings.copied": "Copié !",
|
||||
"about.settings.copy_info": "Copier les infos",
|
||||
"about.subtitle": "Trouvez vos personnes en toute simplicité.",
|
||||
"about.suggestions.button": "Suggérer ici",
|
||||
"about.suggestions.text": "Faites des suggestions ou dites-nous que vous voulez aider via ce formulaire !",
|
||||
"about.suggestions.title": "Faire des suggestions ou contribuer",
|
||||
"about.title": "Pourquoi choisir Compass ?",
|
||||
"about.settings.copied": "Copié !",
|
||||
"about.settings.copy_info": "Copier les infos",
|
||||
"add_photos.add_description": "Ajouter une description",
|
||||
"add_photos.profile_picture_hint": "L'image mise en surbrillance est votre photo de profil",
|
||||
"answers.add.error_create": "Erreur lors de la création de la question de compatibilité. Réessayez ?",
|
||||
@@ -123,14 +103,16 @@
|
||||
"common.active": "Actif",
|
||||
"common.add": "Ajouter",
|
||||
"common.and": "et",
|
||||
"common.change": "Modifier",
|
||||
"common.close": "Fermer",
|
||||
"common.compatible": "Compatible",
|
||||
"common.continue": "Continuer",
|
||||
"common.either": "N'importe",
|
||||
"common.from-now.just_now": "à l'instant",
|
||||
"common.from-now.minute": "il y a {time} minutes",
|
||||
"common.from-now.past_day": "il y a moins de 24 heures",
|
||||
"common.new": "Nouveau",
|
||||
"common.next": "Suivant",
|
||||
"common.from-now.just_now": "à l'instant",
|
||||
"common.from-now.past_day": "il y a moins de 24 heures",
|
||||
"common.from-now.minute": "il y a {time} minutes",
|
||||
"common.no": "Non",
|
||||
"common.notified": "Recevoir notifs pour les filtres sélectionnés",
|
||||
"common.notified_any": "Recevoir notifs pour tout nouveau profil",
|
||||
@@ -141,8 +123,18 @@
|
||||
"common.saved": "Enregistré !",
|
||||
"common.yes": "Oui",
|
||||
"compatibility.empty.answered": "Vous n'avez répondu à aucune question pour le moment.",
|
||||
"compatibility.empty.no_results": "Aucun résultat pour \"{keyword}\"",
|
||||
"compatibility.empty.not_answered": "Toutes les questions ont été répondues !",
|
||||
"compatibility.empty.skipped": "Vous n'avez ignoré aucune question.",
|
||||
"compatibility.onboarding.body1": "Répondez à quelques questions courtes pour calculer la compatibilité basée sur les valeurs et les préférences — pas sur les photos ou les swipes.",
|
||||
"compatibility.onboarding.body2": "Vos réponses affectent directement qui vous correspond et avec quelle force.",
|
||||
"compatibility.onboarding.impact": "La plupart des personnes qui répondent à au moins 5 questions trouvent des correspondances beaucoup plus pertinentes.",
|
||||
"compatibility.onboarding.later": "Faire ça plus tard",
|
||||
"compatibility.onboarding.start": "Commencer à répondre",
|
||||
"compatibility.onboarding.title": "Questions de compatibilité",
|
||||
"compatibility.search_placeholder": "Rechercher des questions et réponses...",
|
||||
"compatibility.seo.description": "Afficher et gérer vos questions de compatibilité",
|
||||
"compatibility.seo.title": "Compatibilité",
|
||||
"compatibility.sign_in_prompt": "Veuillez vous connecter pour voir vos questions de compatibilité",
|
||||
"compatibility.tabs.answered": "Répondues",
|
||||
"compatibility.tabs.skipped": "Ignorées",
|
||||
@@ -161,6 +153,8 @@
|
||||
"contact.title": "Contact",
|
||||
"contact.toast.failed": "Échec de l'envoi — réessayez ou contactez-nous...",
|
||||
"contact.toast.success": "Merci pour votre message !",
|
||||
"copy_link_button.copy_link": "Copier le lien",
|
||||
"copy_link_button.link_copied": "Lien copié !",
|
||||
"delete.data.intro": "Pour des raisons légales et opérationnelles, nous pouvons conserver certaines informations après la suppression du compte :",
|
||||
"delete.data.item1": "Dossiers de transaction (le cas échéant) pour la comptabilité et la conformité",
|
||||
"delete.data.item2": "Copies des communications avec notre équipe de support",
|
||||
@@ -185,6 +179,25 @@
|
||||
"delete.what_happens.profile": "Votre profil, y compris toutes les photos et informations personnelles, sera supprimé définitivement",
|
||||
"delete.what_happens.title": "Ce qui se passe lorsque vous supprimez votre compte",
|
||||
"delete.what_happens.username": "Votre nom d'utilisateur pourra être réutilisé par d'autres",
|
||||
"delete_survey.description": "Nous sommes désolés de vous voir partir. Pour nous aider à améliorer Compass, veuillez nous indiquer pourquoi vous supprimez votre compte.",
|
||||
"delete_survey.error_saving_reason": "Erreur lors de l'enregistrement de la raison de suppression",
|
||||
"delete_survey.other_placeholder": "Veuillez partager plus de détails",
|
||||
"delete_survey.reason_label": "Pourquoi supprimez-vous votre compte ?",
|
||||
"delete_survey.reasons.conversations_didnt_progress": "Les conversations ne se sont pas transformées en vraies relations",
|
||||
"delete_survey.reasons.found_connection_elsewhere": "J'ai trouvé une relation ailleurs",
|
||||
"delete_survey.reasons.found_connection_on_compass": "J'ai trouvé une relation significative sur Compass",
|
||||
"delete_survey.reasons.life_circumstances_changed": "Mes circonstances de vie ont changé",
|
||||
"delete_survey.reasons.low_response_rate": "Les messages restaient souvent sans réponse",
|
||||
"delete_survey.reasons.not_enough_relevant_people": "Pas assez de personnes pertinentes près de chez moi",
|
||||
"delete_survey.reasons.not_meeting_depth_expectations": "Les interactions semblaient plus superficielles que prévu",
|
||||
"delete_survey.reasons.other": "Autre",
|
||||
"delete_survey.reasons.platform_not_active_enough": "La communauté ne semblait pas assez active",
|
||||
"delete_survey.reasons.prefer_simpler_apps": "Je préfère des applications plus simples ou plus rapides",
|
||||
"delete_survey.reasons.privacy_concerns": "Préoccupations concernant la confidentialité ou la visibilité du profil",
|
||||
"delete_survey.reasons.taking_a_break": "Je fais une pause des applications de rencontre",
|
||||
"delete_survey.reasons.technical_issues": "Problèmes techniques ou bugs",
|
||||
"delete_survey.reasons.too_much_time_or_effort": "Utiliser la plateforme demandait plus de temps ou d'effort que je ne peux donner",
|
||||
"delete_survey.title": "Désolé de vous voir partir",
|
||||
"delete_yourself.confirm_phrase": "delete my account",
|
||||
"delete_yourself.description": "Supprimer votre compte signifie que vous ne pourrez plus l'utiliser. Vous perdrez l'accès à toutes vos données.",
|
||||
"delete_yourself.input_placeholder": "Tapez 'delete my account' pour confirmer",
|
||||
@@ -194,30 +207,108 @@
|
||||
"delete_yourself.toast.error": "Échec de la suppression du compte.",
|
||||
"delete_yourself.toast.loading": "Suppression du compte..",
|
||||
"delete_yourself.toast.success": "Votre compte a été supprimé.",
|
||||
"delete_survey.title": "Désolé de vous voir partir",
|
||||
"delete_survey.description": "Nous sommes désolés de vous voir partir. Pour nous aider à améliorer Compass, veuillez nous indiquer pourquoi vous supprimez votre compte.",
|
||||
"delete_survey.reason_label": "Pourquoi supprimez-vous votre compte ?",
|
||||
"delete_survey.reasons.found_connection_on_compass": "J'ai trouvé une relation significative sur Compass",
|
||||
"delete_survey.reasons.found_connection_elsewhere": "J'ai trouvé une relation ailleurs",
|
||||
"delete_survey.reasons.not_enough_relevant_people": "Pas assez de personnes pertinentes près de chez moi",
|
||||
"delete_survey.reasons.conversations_didnt_progress": "Les conversations ne se sont pas transformées en vraies relations",
|
||||
"delete_survey.reasons.low_response_rate": "Les messages restaient souvent sans réponse",
|
||||
"delete_survey.reasons.platform_not_active_enough": "La communauté ne semblait pas assez active",
|
||||
"delete_survey.reasons.not_meeting_depth_expectations": "Les interactions semblaient plus superficielles que prévu",
|
||||
"delete_survey.reasons.too_much_time_or_effort": "Utiliser la plateforme demandait plus de temps ou d'effort que je ne peux donner",
|
||||
"delete_survey.reasons.prefer_simpler_apps": "Je préfère des applications plus simples ou plus rapides",
|
||||
"delete_survey.reasons.privacy_concerns": "Préoccupations concernant la confidentialité ou la visibilité du profil",
|
||||
"delete_survey.reasons.technical_issues": "Problèmes techniques ou bugs",
|
||||
"delete_survey.reasons.taking_a_break": "Je fais une pause des applications de rencontre",
|
||||
"delete_survey.reasons.life_circumstances_changed": "Mes circonstances de vie ont changé",
|
||||
"delete_survey.reasons.other": "Autre",
|
||||
"delete_survey.other_placeholder": "Veuillez partager plus de détails",
|
||||
"delete_survey.error_saving_reason": "Erreur lors de l'enregistrement de la raison de suppression",
|
||||
"donate.seo.description": "Faites un don pour soutenir Compass",
|
||||
"donate.seo.title": "Faire un don",
|
||||
"donate.title": "Faire un don",
|
||||
"email.footer.sent_to": "L'e-mail a été envoyé à {email}. Pour ne plus recevoir ces e-mails, désinscrivez-vous",
|
||||
"email.footer.unsubscribe_link": "ici",
|
||||
"email.new_endorsement.greeting": "Bonjour {name},",
|
||||
"email.new_endorsement.message": "{fromUserName} vous a recommandé !",
|
||||
"email.new_endorsement.preview": "Nouvelle recommandation de {fromUserName}",
|
||||
"email.new_endorsement.subject": "{fromUserName} vous a recommandé !",
|
||||
"email.new_endorsement.viewButton": "Voir la recommandation",
|
||||
"email.new_message.greeting": "Bonjour {name},",
|
||||
"email.new_message.message": "{creatorName} vient de vous envoyer un message !",
|
||||
"email.new_message.preview": "Nouveau message de {creatorName}",
|
||||
"email.new_message.subject": "{creatorName} vous a envoyé un message !",
|
||||
"email.new_message.viewButton": "Voir le message",
|
||||
"email.search_alerts.callToAction": "Si quelqu'un vous parle, contactez-les. Un simple bonjour peut être le début d'une amitié, d'une collaboration ou d'une relation significative.",
|
||||
"email.search_alerts.communityNote": "Compass est construit et soutenu par la communauté — pas de publicité, pas d'algorithmes cachés, pas d'abonnements. Votre présence et votre participation le rendent possible.",
|
||||
"email.search_alerts.greeting": "Bonjour {name},",
|
||||
"email.search_alerts.intro": "Au cours des dernières 24 heures, de nouvelles personnes ont rejoint Compass dont les valeurs et les intérêts s'accordent avec vos recherches sauvegardées. Compass est un cadeau de la communauté, et il prend vie quand des personnes comme vous font le pas pour entrer en contact les unes avec les autres.",
|
||||
"email.search_alerts.preview": "De nouvelles personnes partagent vos valeurs — contactez-les et connectez-vous",
|
||||
"email.search_alerts.startConversation": "Commencer une conversation",
|
||||
"email.search_alerts.subject": "Des personnes que vous recherchez viennent de rejoindre Compass",
|
||||
"email.welcome.confirmButton": "Confirmer mon e-mail",
|
||||
"email.welcome.confirmation": "Pour terminer la création de votre compte et commencer à explorer Compass, veuillez confirmer votre adresse e-mail ci-dessous :",
|
||||
"email.welcome.copyLink": "Ou copiez et collez ce lien dans votre navigateur :",
|
||||
"email.welcome.intro": "Compass est une plateforme gratuite et communautaire conçue pour aider les gens à former des liens profonds et significatifs — platoniques, romantiques ou collaboratifs. Il n'y a pas de publicités, pas d'algorithmes cachés et pas d'abonnements — juste un espace transparent et open-source façonné par des personnes comme vous.",
|
||||
"email.welcome.preview": "Bienvenue sur Compass — Veuillez confirmer votre email",
|
||||
"email.welcome.subject": "Bienvenue sur Compass !",
|
||||
"email.welcome.thanks": "Votre présence et votre participation rendent Compass possible. Merci de nous aider à créer un espace Internet qui privilégie la profondeur, la confiance et la communauté plutôt que la monétisation.",
|
||||
"email.welcome.title": "Bienvenue sur Compass, {name} !",
|
||||
"error.option_exists": "Cette option existe déjà",
|
||||
"events.book_clubs": "Clubs de lecture",
|
||||
"events.cancel": "Annuler",
|
||||
"events.cancel_event": "Annuler l'événement",
|
||||
"events.cancel_event_confirmation": "Êtes-vous sûr de vouloir annuler cet événement ? Cette action ne peut pas être annulée.",
|
||||
"events.cancel_rsvp": "Annuler RSVP",
|
||||
"events.cancelled": "Annulé",
|
||||
"events.coffee_chats": "Discussions café",
|
||||
"events.completed": "Terminé",
|
||||
"events.create_event": "Créer un événement",
|
||||
"events.create_new_event": "Créer un nouvel événement",
|
||||
"events.creating": "Création...",
|
||||
"events.creative_workshops": "Ateliers créatifs",
|
||||
"events.description": "Description",
|
||||
"events.description_placeholder": "Décrivez votre événement...",
|
||||
"events.edit_event": "Modifier l'événement",
|
||||
"events.end_time": "Fin",
|
||||
"events.event_cancelled": "Événement annulé avec succès !",
|
||||
"events.event_created": "Événement créé avec succès !",
|
||||
"events.event_title": "Titre de l'événement",
|
||||
"events.event_title_placeholder": "Entrez le titre de l'événement",
|
||||
"events.event_updated": "Événement mis à jour avec succès !",
|
||||
"events.failed_cancel_event": "Échec de l'annulation de l'événement. Veuillez réessayer.",
|
||||
"events.failed_cancel_rsvp": "Échec de l'annulation de l'RSVP. Veuillez réessayer.",
|
||||
"events.failed_create_event": "Échec de la création de l'événement. Veuillez réessayer.",
|
||||
"events.failed_rsvp": "Échec de l'RSVP. Veuillez réessayer.",
|
||||
"events.failed_to_load": "Échec du chargement des événements. Veuillez réessayer plus tard.",
|
||||
"events.failed_update_event": "Échec de la mise à jour de l'événement. Veuillez réessayer.",
|
||||
"events.game_nights": "Soirées jeux",
|
||||
"events.going": "Participer",
|
||||
"events.hobby_exchanges": "Échanges de loisirs",
|
||||
"events.in_person": "En personne",
|
||||
"events.leave_empty": "Laisser vide pour illimité",
|
||||
"events.loading": "Chargement...",
|
||||
"events.location_address": "Adresse du lieu",
|
||||
"events.location_address_placeholder": "Entrez l'adresse du lieu",
|
||||
"events.location_type": "Type de lieu",
|
||||
"events.location_url": "URL du lieu",
|
||||
"events.location_url_placeholder": "Entrez l'URL du lieu",
|
||||
"events.login_to_rsvp": "Se connecter pour RSVP",
|
||||
"events.max_participants": "Participants max (optionnel)",
|
||||
"events.max_participants_hint": "Participants max",
|
||||
"events.maybe": "Peut-être",
|
||||
"events.maybe_count": " ({count} peut-être)",
|
||||
"events.no_past": "Aucun événement passé",
|
||||
"events.no_upcoming": "Aucun événement à venir. Revenez bientôt ou créez le vôtre !",
|
||||
"events.not_going": "Annuler",
|
||||
"events.online": "En ligne",
|
||||
"events.online_event_join_link": "Événement en ligne - Lien d'accès",
|
||||
"events.organized_by": "Organisé par",
|
||||
"events.participants_count": "{count} participant(s)",
|
||||
"events.participants_max": " / {max} max",
|
||||
"events.past_events": "Événements passés",
|
||||
"events.philosophy_discussions": "Discussions philosophiques",
|
||||
"events.select_end_datetime": "Sélectionner (optionnel)",
|
||||
"events.select_start_datetime": "Sélectionner la date",
|
||||
"events.start_time": "Début",
|
||||
"events.started": "Commencé {time}",
|
||||
"events.subtitle": "Découvrez et participez aux événements communautaires — ou créez les vôtres pour rassembler les gens",
|
||||
"events.sustainability_meetups": "Rencontres durabilité",
|
||||
"events.title": "Événements",
|
||||
"events.try_again": "Réessayer",
|
||||
"events.upcoming_events": "Événements à venir",
|
||||
"events.update_event": "Mettre à jour l'événement",
|
||||
"events.updating": "Mise à jour...",
|
||||
"events.walking_groups": "Groupes de marche",
|
||||
"events.why_description": "Les événements sont au cœur de relations qui ont du sens. Qu'ils soient en ligne ou en personne, ils créent un espace pour des conversations plus profondes, des expériences partagées et des relations durables.",
|
||||
"events.why_organize": "Pourquoi organiser des événements ?",
|
||||
"filter.age.age": "âge",
|
||||
"filter.age.any": "Tout",
|
||||
"filter.age.label": "Âge",
|
||||
"filter.age.up_to": "jusqu'à",
|
||||
"filter.age.years": "ans",
|
||||
"filter.any": "Tous",
|
||||
"filter.any_causes": "Toute cause",
|
||||
@@ -227,23 +318,37 @@
|
||||
"filter.any_interests": "Tout intérêt",
|
||||
"filter.any_language": "Toutes les langues",
|
||||
"filter.any_mbti": "Tout MBTI",
|
||||
"filter.any_new_users": "Tout nouvel utilisateur",
|
||||
"filter.any_politics": "Toute orientation politique",
|
||||
"filter.any_relationship": "Toute relation amoureuse",
|
||||
"filter.any_religion": "Toute religion",
|
||||
"filter.any_work": "Tout travail",
|
||||
"filter.big5.any": "Tout Big 5",
|
||||
"filter.big5.custom": "Certains Big 5",
|
||||
"filter.drinks.per_month": "par mois",
|
||||
"filter.gender.any": "Tout",
|
||||
"filter.gender.gender": "genre",
|
||||
"filter.gender.genders": "genres",
|
||||
"filter.gender.they_seek": "Genre qu'ils recherchent",
|
||||
"filter.location.set_any_city": "N'importe quelle ville",
|
||||
"filter.location": "Vit",
|
||||
"filter.label.diet": "Régime",
|
||||
"filter.label.drinks": "Boissons",
|
||||
"filter.label.education_levels": "Éducation",
|
||||
"filter.label.mbti": "MBTI",
|
||||
"filter.label.name": "Recherche",
|
||||
"filter.label.political_beliefs": "Opinions politiques",
|
||||
"filter.label.pref_age_max": "Âge max",
|
||||
"filter.label.pref_age_min": "Âge min",
|
||||
"filter.label.pref_gender": "Genre recherché",
|
||||
"filter.label.pref_relation_styles": "Recherche",
|
||||
"filter.label.wants_kids_strength": "Enfants",
|
||||
"filter.location": "Habite",
|
||||
"filter.location.any": "n'importe où",
|
||||
"filter.near": "près de",
|
||||
"filter.location.search_city": "Rechercher une ville...",
|
||||
"filter.location.set_any_city": "N'importe quelle ville",
|
||||
"filter.mine_toggle": "Mes filtres",
|
||||
"filter.multiple": "Multiple",
|
||||
"filter.near": "près de",
|
||||
"filter.raised_in": "A grandi",
|
||||
"filter.relationship.any_connection": "Toute relation",
|
||||
"filter.relationship_status.any": "Tout statut romantique",
|
||||
"filter.reset": "Réinitialiser",
|
||||
@@ -252,6 +357,9 @@
|
||||
"filter.wants_kids.doesnt_want_kids": "Ne veut pas d'enfants",
|
||||
"filter.wants_kids.either": "Tout désir d'enfants",
|
||||
"filter.wants_kids.wants_kids": "Veut des enfants",
|
||||
"font.atkinson": "Atkinson Hyperlegible",
|
||||
"font.classic-serif": "Serif classique",
|
||||
"font.system-sans": "Sans-serif système",
|
||||
"help.account.delete_instructions": "Vous voulez supprimer votre compte ? Allez dans les paramètres de votre profil, cliquez sur le menu à trois points en haut à droite, puis sélectionnez « Supprimer le compte »",
|
||||
"help.account.login_issue": "Impossible de se connecter ? Essayez de vous déconnecter puis de vous reconnecter, ou actualisez la page et réessayez.",
|
||||
"help.account.profile_update": "Les mises à jour du profil n'apparaissent pas ? Patientez quelques secondes et actualisez. Si le problème persiste, signalez-le via le formulaire de contact.",
|
||||
@@ -285,35 +393,18 @@
|
||||
"home.subtitle": "Trouvez des personnes qui partagent vos valeurs, idées et intentions — pas seulement vos photos.",
|
||||
"home.title": "Fini les swipes.",
|
||||
"home.typewriter": "Cherche.",
|
||||
"copy_link_button.copy_link": "Copier le lien",
|
||||
"copy_link_button.link_copied": "Lien copié !",
|
||||
"search.include_short_bios_tooltip": "Pour lister tous les profils, cochez \"Inclure les profils incomplets\"",
|
||||
"more_options_user.more_options": "Plus d'options",
|
||||
"more_options_user.banning": "Bannissement...",
|
||||
"more_options_user.user_banned": "Utilisateur banni !",
|
||||
"more_options_user.error_banning": "Erreur lors du bannissement de l'utilisateur",
|
||||
"more_options_user.banned": "Banni",
|
||||
"more_options_user.ban_user": "Bannir l'utilisateur",
|
||||
"more_options_user.delete_pinned_photo": "Supprimer la photo épinglée",
|
||||
"more_options_user.joined": "Rejoint",
|
||||
"more_options_user.copy_user_id": "Copier l'ID utilisateur",
|
||||
"more_options_user.delete_account": "Supprimer le compte",
|
||||
"more_options_user.block": "Bloquer",
|
||||
"more_options_user.report": "Signaler",
|
||||
"sticky_format_menu.add_embed": "Ajouter un embed",
|
||||
"sticky_format_menu.add_emoji": "Ajouter un emoji",
|
||||
"sticky_format_menu.upload_image": "Ajouter une image",
|
||||
"star_button.save": "Enregistrer le profil",
|
||||
"star_button.unsave": "Ne plus enregistrer le profil",
|
||||
"send_message.button_label": "Contacter",
|
||||
"send_message.title": "Contactez",
|
||||
"languages.de": "Allemand",
|
||||
"languages.en": "Anglais",
|
||||
"languages.fr": "Français",
|
||||
"messages.action.add_reaction": "Ajouter une réaction",
|
||||
"messages.action.delete": "Supprimer",
|
||||
"messages.action.edit": "Modifier",
|
||||
"messages.cannot_message_deleted": "Vous ne pouvez pas leur envoyer de message car ils ont supprimé leur compte.",
|
||||
"messages.create": "Créer",
|
||||
"messages.delete_confirm": "Êtes-vous sûr de vouloir supprimer ce message ?",
|
||||
"messages.delete_failed": "Échec de la suppression du message",
|
||||
"messages.deleted": "Message supprimé",
|
||||
"messages.deleted_user": "Utilisateur supprimé",
|
||||
"messages.edited": "modifié",
|
||||
"messages.empty": "Vous n'avez pas encore de messages.",
|
||||
"messages.input_placeholder": "Envoyer un message",
|
||||
@@ -323,6 +414,7 @@
|
||||
"messages.menu.see_members": "Voir les membres",
|
||||
"messages.more": " de plus",
|
||||
"messages.new_message": "Nouveau message",
|
||||
"messages.no_access": "Vous n'avez pas accès à cette conversation.",
|
||||
"messages.seo.description": "Vos messages",
|
||||
"messages.title": "Messages",
|
||||
"messages.toast.edit_failed": "Échec de la modification du message.",
|
||||
@@ -334,14 +426,27 @@
|
||||
"messages.toast.muting_forever.success": "Notifs coupées définitivement",
|
||||
"messages.toast.send_failed": "Échec de l'envoi du message. Veuillez réessayer plus tard ou contacter le support si le problème persiste.",
|
||||
"messages.you_prefix": "Vous : ",
|
||||
"messages.cannot_message_deleted": "Vous ne pouvez pas leur envoyer de message car ils ont supprimé leur compte.",
|
||||
"messages.deleted_user": "Utilisateur supprimé",
|
||||
"messages.no_access": "Vous n'avez pas accès à cette conversation.",
|
||||
"multi-checkbox.enter_value": "Veuillez saisir une valeur.",
|
||||
"multi-checkbox.could_not_add": "Impossible d'ajouter l'option.",
|
||||
"messaging.email_verification_required": "Vous devez vérifier votre e-mail pour pouvoir envoyer des messages.",
|
||||
"more_options_user.ban_user": "Bannir l'utilisateur",
|
||||
"more_options_user.banned": "Banni",
|
||||
"more_options_user.banning": "Bannissement...",
|
||||
"more_options_user.block": "Bloquer",
|
||||
"more_options_user.copy_user_id": "Copier l'ID utilisateur",
|
||||
"more_options_user.delete_account": "Supprimer le compte",
|
||||
"more_options_user.delete_pinned_photo": "Supprimer la photo épinglée",
|
||||
"more_options_user.edit_bio": "Options de biographie",
|
||||
"more_options_user.edit_profile": "Modifier le profil",
|
||||
"more_options_user.error_banning": "Erreur lors du bannissement de l'utilisateur",
|
||||
"more_options_user.joined": "Rejoint",
|
||||
"more_options_user.more_options": "Plus d'options",
|
||||
"more_options_user.profile_options": "Options du profil",
|
||||
"more_options_user.report": "Signaler",
|
||||
"more_options_user.user_banned": "Utilisateur banni !",
|
||||
"multi-checkbox.add_failed": "Échec de l'ajout de l'option.",
|
||||
"multi-checkbox.search_or_add": "Rechercher ou ajouter",
|
||||
"multi-checkbox.could_not_add": "Impossible d'ajouter l'option.",
|
||||
"multi-checkbox.enter_value": "Veuillez saisir une valeur.",
|
||||
"multi-checkbox.no_matching_options": "Aucune option correspondante, n'hésitez pas à l'ajouter.",
|
||||
"multi-checkbox.search_or_add": "Rechercher ou ajouter",
|
||||
"nav.about": "À propos",
|
||||
"nav.contact": "Contact",
|
||||
"nav.events": "Événements",
|
||||
@@ -363,11 +468,11 @@
|
||||
"nav.vote": "Vote",
|
||||
"news.failed": "Échec de la récupération des versions.",
|
||||
"news.no_release_notes": "_Aucune note de version fournie._",
|
||||
"news.note": "Note : Malheureusement, cette page n'est disponible qu'en anglais.",
|
||||
"news.seo.description": "Voir les dernières mises à jour et fonctionnalités",
|
||||
"news.seo.description_general": "Toutes les actualités et mises à jour du code pour Compass",
|
||||
"news.title": "Quoi de neuf",
|
||||
"news.view_on_github": "Voir sur GitHub",
|
||||
"news.note": "Note : Malheureusement, cette page n'est disponible qu'en anglais.",
|
||||
"notifications.empty": "Vous n'avez pas encore de notifications.",
|
||||
"notifications.heading": "Où voulez-vous être notifié lorsqu'une personne",
|
||||
"notifications.options.email": "Par e‑mail",
|
||||
@@ -381,19 +486,52 @@
|
||||
"notifications.tabs.notifications": "Notifications",
|
||||
"notifications.tabs.settings": "Paramètres",
|
||||
"notifications.title": "Mises à jour",
|
||||
"organization.about.title": "À propos de nous",
|
||||
"onboarding.skip": "Passer le tutoriel",
|
||||
"onboarding.soft-gate.bullet1": "Les scores de compatibilité reflètent désormais vos valeurs et préférences",
|
||||
"onboarding.soft-gate.bullet2": "Vous verrez des pourcentages de compatibilité qui correspondent étroitement à ce qui vous importe",
|
||||
"onboarding.soft-gate.bullet3": "Vous pouvez mettre à jour votre profil à tout moment pour augmenter les chances que les bonnes personnes vous contactent.",
|
||||
"onboarding.soft-gate.explore_button": "Explorer les profils maintenant",
|
||||
"onboarding.soft-gate.intro": "Vous avez répondu à vos premières questions de compatibilité et partagé vos principaux centres d'intérêt.",
|
||||
"onboarding.soft-gate.refine_button": "Affiner votre profil",
|
||||
"onboarding.soft-gate.seo.description": "Commencez avec Compass - des connexions transparentes sans algorithmes",
|
||||
"onboarding.soft-gate.seo.title": "Vous êtes prêt à explorer - Compass",
|
||||
"onboarding.soft-gate.title": "Vous êtes prêt à explorer",
|
||||
"onboarding.soft-gate.what_it_means": "Voici ce que cela signifie pour vous :",
|
||||
"onboarding.step1.body1": "Compass ne décide pas qui vous devriez voir.",
|
||||
"onboarding.step1.body2": "Il n'y a pas d'algorithme d'engagement, pas de classement par swipe, pas de profils boostés et pas d'optimisation de l'attention. Vous pouvez parcourir la base de données complète, appliquer vos propres filtres et voir exactement pourquoi quelqu'un vous correspond.",
|
||||
"onboarding.step1.body3": "Vous gardez le contrôle de la découverte. Toujours.",
|
||||
"onboarding.step1.footer": "La transparence est un principe fondamental, pas une fonctionnalité.",
|
||||
"onboarding.step1.title": "Pas de boîte noire. Pas de manipulation.",
|
||||
"onboarding.step2.body1": "Au lieu d'un défilement sans fin, Compass vous permet de chercher intentionnellement.",
|
||||
"onboarding.step2.body2": "Cherchez des personnes par :",
|
||||
"onboarding.step2.body3": "Vous pouvez sauvegarder des recherches et être notifié lorsque de nouvelles personnes vous correspondent. Pas besoin de vérifier l'application chaque jour.",
|
||||
"onboarding.step2.footer": "Moins de bruit. Plus de signal.",
|
||||
"onboarding.step2.item1": "Intérêts et mots-clés",
|
||||
"onboarding.step2.item2": "Valeurs et idées",
|
||||
"onboarding.step2.item3": "Réponses de compatibilité",
|
||||
"onboarding.step2.item4": "Lieu et intention",
|
||||
"onboarding.step2.title": "Cherchez, sans swipe.",
|
||||
"onboarding.step3.body1": "Les correspondances ne sont ni magiques ni mystérieuses.",
|
||||
"onboarding.step3.body2": "Votre score de compatibilité provient de questions explicites :",
|
||||
"onboarding.step3.body3": "Vous pouvez inspecter, questionner et améliorer le système. Les maths derrière sont open source.",
|
||||
"onboarding.step3.continue": "Commencer",
|
||||
"onboarding.step3.footer": "Si vous n'êtes pas d'accord avec son fonctionnement, vous pouvez aider à le changer.",
|
||||
"onboarding.step3.item1": "Votre réponse",
|
||||
"onboarding.step3.item2": "Quelles réponses vous acceptez des autres",
|
||||
"onboarding.step3.item3": "L'importance de chaque question pour vous",
|
||||
"onboarding.step3.title": "Une compatibilité qui fait sens.",
|
||||
"onboarding.welcome": "Bienvenue sur Compass!",
|
||||
"organization.about.desc": "Qui nous sommes, notre mission et comment l'organisation fonctionne.",
|
||||
"organization.proof.title": "Preuves & transparence",
|
||||
"organization.proof.desc": "Chiffres clés, progrès et ce que les autres disent de nous.",
|
||||
"organization.contactSection.title": "Contact & support",
|
||||
"organization.contactSection.desc": "Besoin d'aide ou de nous contacter ? Commencez ici.",
|
||||
"organization.trust.title": "Confiance & légal",
|
||||
"organization.trust.desc": "Comment nous protégeons vos données et les règles qui régissent la plateforme.",
|
||||
"organization.about.title": "À propos de nous",
|
||||
"organization.constitution": "Constitution",
|
||||
"organization.contact": "Contact",
|
||||
"organization.contactSection.desc": "Besoin d'aide ou de nous contacter ? Commencez ici.",
|
||||
"organization.contactSection.title": "Contact & support",
|
||||
"organization.financials": "Finances",
|
||||
"organization.help": "Aide",
|
||||
"organization.privacy": "Politique de confidentialité",
|
||||
"organization.proof.desc": "Chiffres clés, progrès et ce que les autres disent de nous.",
|
||||
"organization.proof.title": "Preuves & transparence",
|
||||
"organization.security": "Sécurité",
|
||||
"organization.seo.description": "Organisation",
|
||||
"organization.seo.title": "Organisation",
|
||||
@@ -401,7 +539,26 @@
|
||||
"organization.support": "Support",
|
||||
"organization.terms": "Conditions générales",
|
||||
"organization.title": "Organisation",
|
||||
"organization.trust.desc": "Comment nous protégeons vos données et les règles qui régissent la plateforme.",
|
||||
"organization.trust.title": "Confiance & légal",
|
||||
"organization.vote": "Propositions",
|
||||
"press.brand_assets": "Ressources de marque",
|
||||
"press.brand_assets_description": "Téléchargez notre logo et nos directives de marque.",
|
||||
"press.contact": "Contact presse",
|
||||
"press.contact_description": "Pour toute demande de presse, veuillez contacter notre équipe.",
|
||||
"press.contact_us": "Nous contacter",
|
||||
"press.download_assets": "Télécharger les ressources",
|
||||
"press.media_kit": "Kit Média",
|
||||
"press.no_articles": "Aucun article de presse disponible pour le moment. Veuillez réessayer ultérieurement.",
|
||||
"press.seo.description": "Dernières actualités et mentions de Compass dans la presse",
|
||||
"press.seo.title": "Presse - Compass",
|
||||
"press.subtitle": "Dernières actualités et couverture médiatique de Compass",
|
||||
"press.summary": "Résumé (Éditorial Compass)",
|
||||
"press.summary.1": "Reportage vidéo belge et local qui décrit Compass comme une plateforme open source à mi-chemin entre application de rencontre et réseau social, qui rompt avec les codes habituels en supprimant algorithmes cachés et mise en avant des photos. Créée par l’ingénieur havelangeois Martin Braquet, elle permet de rechercher des profils selon les valeurs et centres d’intérêt, pour des relations amicales, professionnelles ou romantiques. Pensée comme une « bibliothèque » de profils accessible par filtres, Compass vise à recréer du lien social. Gratuite, sans publicité, elle compte déjà un peu plus de 400 utilisateurs.",
|
||||
"press.summary.2": "Courte vidéo (Facebook reel) illustrant Compass de manière fun et dynamique. Martin Braquet, un jeune ingénieur havelangeois, sort son appli de rencontre éthique. Ici, on parle d’une autre approche. Compass est sans but lucratif, pensée pour créer du lien. Sa plateforme est ouverte, collaborative, sans algorithme opaque. Et sans le poids des photos de profil.",
|
||||
"press.summary.4": "Article belge et local présentant les débuts de Compass. Développée en huit semaines et proposée gratuitement, Compass se distingue des applications dominantes par l’absence d’algorithmes cachés et de mécanismes de swipe, au profit d’une recherche par mots-clés centrée sur les valeurs, les centres d’intérêt et la personnalité, les photos étant secondaires. Projet open source, Compass revendique une logique non lucrative et communautaire. Quatre mois après son lancement, elle compte un peu plus de 400 utilisateurs, avec l’ambition d’atteindre une masse critique locale.",
|
||||
"press.summary.5": "Interview radio de Martin; il y explique son parcours, sa philosophie d’apprentissage par la pratique et la genèse d’une application de rencontre pensée autrement. L’entretien aborde les dérives des applications classiques (addiction, swipe, exploitation des données), la volonté de replacer les centres d’intérêt et les valeurs avant le physique, et l’objectif de favoriser des relations amicales, professionnelles ou amoureuses plus profondes. Martin détaille aussi le choix du modèle open source, gratuit et transparent, son développement international, ainsi que les enjeux d’audience pour rendre l’outil réellement utile aux utilisateurs.",
|
||||
"press.title": "Presse",
|
||||
"privacy.contact": "Pour toute question concernant cette politique de confidentialité, contactez ",
|
||||
"privacy.effective_date": "Date d'entrée en vigueur : 1er janvier 2025",
|
||||
"privacy.info.text": "Nous collectons des informations de base de compte telles que votre nom, votre adresse e-mail et les données de profil. De plus, nous pouvons collecter des données d'utilisation pour améliorer les fonctionnalités de la plateforme.",
|
||||
@@ -419,20 +576,30 @@
|
||||
"privacy.title": "Politique de confidentialité",
|
||||
"privacy.use.text": "Vos données sont utilisées uniquement pour faire fonctionner, personnaliser et améliorer la plateforme. Nous ne vendons pas vos informations personnelles à des tiers.",
|
||||
"privacy.use.title": "2. Comment nous utilisons vos données",
|
||||
"profile.about.raised_in": "A grandi à {location}",
|
||||
"profile.age_any": "de tout âge",
|
||||
"profile.age_between": "entre {min} et {max} ans",
|
||||
"profile.age_exact": "exactement {min} ans",
|
||||
"profile.age_older_than": "plus de {min} ans",
|
||||
"profile.age_younger_than": "moins de {max} ans",
|
||||
"profile.optional.error.invalid_fields": "Certains champs sont incorrects...",
|
||||
"profile.optional.age.error_min": "Vous devez avoir au moins 18 ans",
|
||||
"profile.optional.age.error_max": "Veuillez entrer un âge valide",
|
||||
"profile.at": "à",
|
||||
"profile.basics.bio": "Biographie",
|
||||
"profile.basics.display_name": "Nom d'affichage",
|
||||
"profile.basics.subtitle": "Écrivez votre propre biographie à votre manière.",
|
||||
"profile.basics.title": "Les bases",
|
||||
"profile.basics.username": "Nom d'utilisateur",
|
||||
"profile.big5": "Big Five",
|
||||
"profile.big5_agreeableness": "Agréabilité",
|
||||
"profile.big5_average": "Moyen",
|
||||
"profile.big5_conscientiousness": "Conscienciosité",
|
||||
"profile.big5_extraversion": "Extraversion",
|
||||
"profile.big5_high": "Élevé",
|
||||
"profile.big5_hint": "Faites glisser chaque curseur pour définir où vous vous situez sur ces traits (0 = faible, 100 = élevé).",
|
||||
"profile.big5_low": "Faible",
|
||||
"profile.big5_neuroticism": "Névrosisme",
|
||||
"profile.big5_openness": "Ouverture",
|
||||
"profile.big5_very_high": "Très élevé",
|
||||
"profile.big5_very_low": "Très faible",
|
||||
"profile.bio.about_me": "À propos de moi",
|
||||
"profile.bio.add_characters_many": "Ajoutez {count} caractères de plus pour apparaître dans les résultats de recherche — ou prenez votre temps et commencez par explorer les autres.",
|
||||
"profile.bio.add_characters_one": "Ajoutez {count} caractère de plus pour apparaître dans les résultats de recherche — ou prenez votre temps et commencez par explorer les autres.",
|
||||
@@ -448,9 +615,8 @@
|
||||
"profile.bio.tips_list": "- Vos valeurs fondamentales, intérêts et activités\n- Traits de personnalité, ce qui vous rend unique et ce qui vous tient à cœur\n- Objectifs de connexion (collaboration, amitié, romantique)\n- Attentes et limites\n- Disponibilité, comment vous contacter ou démarrer une conversation (e-mail, réseaux sociaux, etc.)\n- Optionnel : préférences romantiques, habitudes de vie et sujets de conversation",
|
||||
"profile.bio.too_short": "Bio trop courte. Votre profil n'est pas affiché dans les résultats de recherche par défaut.",
|
||||
"profile.bio.too_short_tooltip": "Comme votre bio est trop courte, l'algorithme de Compass filtre votre profil des résultats de recherche (sauf si « Inclure les profils incomplets » est sélectionné). Cela garantit que les recherches affichent des profils significatifs.",
|
||||
"profile.comments.current_user_hint": "Les autres utilisateurs peuvent vous laisser des recommandations ici.",
|
||||
"profile.comments.add_comment": "Ajouter un commentaire",
|
||||
"profile.comments.placeholder": "Écrivez votre recommandation...",
|
||||
"profile.comments.current_user_hint": "Les autres utilisateurs peuvent vous laisser des recommandations ici.",
|
||||
"profile.comments.disabled": "Recommandations désactivées",
|
||||
"profile.comments.disabling": "Désactivation des recommandations des autres utilisateurs",
|
||||
"profile.comments.enable_tooltip": "Activer/Désactiver les recommandations des autres utilisateurs",
|
||||
@@ -459,6 +625,7 @@
|
||||
"profile.comments.feature_disabled_other": "{name} a désactivé les recommandations des autres utilisateurs.",
|
||||
"profile.comments.feature_disabled_self": "Cette fonctionnalité est désactivée",
|
||||
"profile.comments.other_user_hint": "Si vous les connaissez, écrivez quelque chose de sympa qui enrichira leur profil.",
|
||||
"profile.comments.placeholder": "Écrivez votre recommandation...",
|
||||
"profile.comments.section_title": "Recommandations",
|
||||
"profile.comments.update_error": "Échec de la mise à jour des paramètres de recommandation",
|
||||
"profile.diet.keto": "Cétogène",
|
||||
@@ -494,12 +661,7 @@
|
||||
"profile.has_kids.no_preference": "Tout enfant",
|
||||
"profile.has_kids_many": "A {count} enfants",
|
||||
"profile.has_kids_one": "A {count} enfant",
|
||||
"profiles.hidden_success": "Profil masqué. Vous ne verrez plus cette personne dans les résultats de recherche.",
|
||||
"profile_grid.hide_profile": "Ne plus afficher dans les résultats de recherche",
|
||||
"profile_grid.unhide_profile": "Afficher à nouveau dans les résultats de recherche",
|
||||
"profile_grid.profile_hidden_short": "Vous ne verrez plus {name} dans vos résultats de recherche.",
|
||||
"profile_grid.undo": "Annuler",
|
||||
"profile_grid.hidden_notice": "Vous avez masqué cette personne, elle n'apparaîtra plus dans vos résultats de recherche.",
|
||||
"profile.header.age": "{age} ans",
|
||||
"profile.header.disabled_notice": "Vous avez désactivé votre profil, personne d'autre ne peut y accéder.",
|
||||
"profile.header.menu.disable_profile": "Désactiver le profil",
|
||||
"profile.header.menu.enable_profile": "Activer le profil",
|
||||
@@ -535,75 +697,7 @@
|
||||
"profile.language.eastern-min": "Min de l'Est",
|
||||
"profile.language.english": "Anglais",
|
||||
"profile.language.french": "Français",
|
||||
"referrals.title": "Invitez quelqu'un à rejoindre Compass !",
|
||||
"profile.language.fula": "Peul",
|
||||
"events.title": "Événements",
|
||||
"events.subtitle": "Découvrez et participez aux événements communautaires — ou créez les vôtres pour rassembler les gens",
|
||||
"events.create_event": "Créer un événement",
|
||||
"events.why_organize": "Pourquoi organiser des événements ?",
|
||||
"events.why_description": "Les événements sont au cœur de relations qui ont du sens. Qu'ils soient en ligne ou en personne, ils créent un espace pour des conversations plus profondes, des expériences partagées et des relations durables.",
|
||||
"events.upcoming_events": "Événements à venir",
|
||||
"events.past_events": "Événements passés",
|
||||
"events.no_upcoming": "Aucun événement à venir. Revenez bientôt ou créez le vôtre !",
|
||||
"events.no_past": "Aucun événement passé",
|
||||
"events.failed_to_load": "Échec du chargement des événements. Veuillez réessayer plus tard.",
|
||||
"events.try_again": "Réessayer",
|
||||
"events.going": "Participer",
|
||||
"events.maybe": "Peut-être",
|
||||
"events.not_going": "Annuler",
|
||||
"events.cancel_rsvp": "Annuler RSVP",
|
||||
"events.cancel_event": "Annuler l'événement",
|
||||
"events.cancel_event_confirmation": "Êtes-vous sûr de vouloir annuler cet événement ? Cette action ne peut pas être annulée.",
|
||||
"events.edit_event": "Modifier l'événement",
|
||||
"events.create_new_event": "Créer un nouvel événement",
|
||||
"events.update_event": "Mettre à jour l'événement",
|
||||
"events.event_created": "Événement créé avec succès !",
|
||||
"events.event_updated": "Événement mis à jour avec succès !",
|
||||
"events.event_cancelled": "Événement annulé avec succès !",
|
||||
"events.failed_rsvp": "Échec de l'RSVP. Veuillez réessayer.",
|
||||
"events.failed_cancel_rsvp": "Échec de l'annulation de l'RSVP. Veuillez réessayer.",
|
||||
"events.failed_cancel_event": "Échec de l'annulation de l'événement. Veuillez réessayer.",
|
||||
"events.failed_update_event": "Échec de la mise à jour de l'événement. Veuillez réessayer.",
|
||||
"events.failed_create_event": "Échec de la création de l'événement. Veuillez réessayer.",
|
||||
"events.cancelled": "Annulé",
|
||||
"events.completed": "Terminé",
|
||||
"events.participants_count": "{count} participant(s)",
|
||||
"events.participants_max": " / {max} max",
|
||||
"events.maybe_count": " ({count} peut-être)",
|
||||
"events.event_title": "Titre de l'événement",
|
||||
"events.description": "Description",
|
||||
"events.location_type": "Type de lieu",
|
||||
"events.location_address": "Adresse du lieu",
|
||||
"events.location_url": "URL du lieu",
|
||||
"events.start_time": "Début",
|
||||
"events.end_time": "Fin",
|
||||
"events.select_start_datetime": "Sélectionner la date",
|
||||
"events.select_end_datetime": "Sélectionner (optionnel)",
|
||||
"events.max_participants": "Participants max (optionnel)",
|
||||
"events.leave_empty": "Laisser vide pour illimité",
|
||||
"events.in_person": "En personne",
|
||||
"events.online": "En ligne",
|
||||
"events.event_title_placeholder": "Entrez le titre de l'événement",
|
||||
"events.description_placeholder": "Décrivez votre événement...",
|
||||
"events.location_address_placeholder": "Entrez l'adresse du lieu",
|
||||
"events.location_url_placeholder": "Entrez l'URL du lieu",
|
||||
"events.cancel": "Annuler",
|
||||
"events.loading": "Chargement...",
|
||||
"events.creating": "Création...",
|
||||
"events.updating": "Mise à jour...",
|
||||
"events.max_participants_hint": "Participants max",
|
||||
"events.login_to_rsvp": "Se connecter pour RSVP",
|
||||
"events.book_clubs": "Clubs de lecture",
|
||||
"events.game_nights": "Soirées jeux",
|
||||
"events.walking_groups": "Groupes de marche",
|
||||
"events.coffee_chats": "Discussions café",
|
||||
"events.creative_workshops": "Ateliers créatifs",
|
||||
"events.philosophy_discussions": "Discussions philosophiques",
|
||||
"events.sustainability_meetups": "Rencontres durabilité",
|
||||
"events.hobby_exchanges": "Échanges de loisirs",
|
||||
"events.started": "Commencé {time}",
|
||||
"events.organized_by": "Organisé par",
|
||||
"events.online_event_join_link": "Événement en ligne - Lien d'accès",
|
||||
"profile.language.gan": "Gan",
|
||||
"profile.language.german": "Allemand",
|
||||
"profile.language.greek": "Grec",
|
||||
@@ -656,16 +750,6 @@
|
||||
"profile.language.serbo-croatian": "Serbo-croate",
|
||||
"profile.language.shona": "Shona",
|
||||
"profile.language.sindhi": "Sindhi",
|
||||
"onboarding.soft-gate.seo.title": "Vous êtes prêt à explorer - Compass",
|
||||
"onboarding.soft-gate.seo.description": "Commencez avec Compass - des connexions transparentes sans algorithmes",
|
||||
"onboarding.soft-gate.title": "Vous êtes prêt à explorer",
|
||||
"onboarding.soft-gate.intro": "Vous avez répondu à vos premières questions de compatibilité et partagé vos principaux centres d'intérêt.",
|
||||
"onboarding.soft-gate.what_it_means": "Voici ce que cela signifie pour vous :",
|
||||
"onboarding.soft-gate.bullet1": "Les scores de compatibilité reflètent désormais vos valeurs et préférences",
|
||||
"onboarding.soft-gate.bullet2": "Vous verrez des pourcentages de compatibilité qui correspondent étroitement à ce qui vous importe",
|
||||
"onboarding.soft-gate.bullet3": "Vous pouvez mettre à jour votre profil à tout moment pour augmenter les chances que les bonnes personnes vous contactent.",
|
||||
"onboarding.soft-gate.explore_button": "Explorer les profils maintenant",
|
||||
"onboarding.soft-gate.refine_button": "Affiner votre profil",
|
||||
"profile.language.sinhala": "Cingalais",
|
||||
"profile.language.somali": "Somali",
|
||||
"profile.language.southern-min": "Min du Sud",
|
||||
@@ -694,7 +778,19 @@
|
||||
"profile.language.zulu": "Zoulou",
|
||||
"profile.last_online": "Actif·ve {time}",
|
||||
"profile.optional.age": "Âge",
|
||||
"profile.optional.age.error_max": "Veuillez entrer un âge valide",
|
||||
"profile.optional.age.error_min": "Vous devez avoir au moins 18 ans",
|
||||
"profile.optional.age_range": "Âgés entre",
|
||||
"profile.optional.big5_hint": "Faites glisser chaque curseur pour définir où vous vous situez sur ces traits (0 = faible, 100 = élevé).",
|
||||
"profile.optional.category.education": "Éducation",
|
||||
"profile.optional.category.family": "Famille",
|
||||
"profile.optional.category.interested_in": "Ce que je recherche",
|
||||
"profile.optional.category.morality": "Moralité",
|
||||
"profile.optional.category.personal_info": "Infos personnelles",
|
||||
"profile.optional.category.psychology": "Psychologie",
|
||||
"profile.optional.category.relationships": "Relations",
|
||||
"profile.optional.category.substances": "Substances",
|
||||
"profile.optional.category.work": "Travail",
|
||||
"profile.optional.causes": "Causes morales",
|
||||
"profile.optional.centimeters": "Centimètres",
|
||||
"profile.optional.company": "Entreprise",
|
||||
@@ -703,6 +799,7 @@
|
||||
"profile.optional.diet": "Régime alimentaire",
|
||||
"profile.optional.drinks_per_month": "Boissons alcoolisées consommées par mois",
|
||||
"profile.optional.education_level": "Niveau d'études le plus élevé",
|
||||
"profile.optional.error.invalid_fields": "Certains champs sont incorrects...",
|
||||
"profile.optional.ethnicity": "Origine ethnique",
|
||||
"profile.optional.feet": "Pieds",
|
||||
"profile.optional.gender": "Genre",
|
||||
@@ -717,16 +814,9 @@
|
||||
"profile.optional.mbti": "Type de personnalité MBTI",
|
||||
"profile.optional.num_kids": "Nombre actuel d'enfants",
|
||||
"profile.optional.photos": "Photos",
|
||||
"profile.optional.category.personal_info": "Infos personnelles",
|
||||
"profile.optional.category.interested_in": "Ce que je recherche",
|
||||
"profile.optional.category.relationships": "Relations",
|
||||
"profile.optional.category.family": "Famille",
|
||||
"profile.optional.category.morality": "Moralité",
|
||||
"profile.optional.category.psychology": "Psychologie",
|
||||
"profile.optional.category.work": "Travail",
|
||||
"profile.optional.category.education": "Éducation",
|
||||
"profile.optional.category.substances": "Substances",
|
||||
"profile.optional.political_beliefs": "Opinions politiques",
|
||||
"profile.optional.raised_in": "Lieu où j'ai grandi",
|
||||
"profile.optional.raised_in_hint": "Particulièrement utile si vous avez grandi dans un pays différent de celui où vous vivez maintenant – et si cela reflète vos références culturelles, vos valeurs et vos expériences de vie.",
|
||||
"profile.optional.relationship_status": "Situation amoureuse",
|
||||
"profile.optional.relationship_style": "Style de relation",
|
||||
"profile.optional.religious_beliefs": "Croyances religieuses",
|
||||
@@ -740,24 +830,6 @@
|
||||
"profile.optional.username_or_url": "Nom d'utilisateur ou URL",
|
||||
"profile.optional.want_kids": "Je souhaite avoir des enfants",
|
||||
"profile.optional.work": "Domaine de travail",
|
||||
"profile.optional.raised_in": "Lieu où j'ai grandi",
|
||||
"profile.optional.raised_in_hint": "Particulièrement utile si vous avez grandi dans un pays différent de celui où vous vivez maintenant – et si cela reflète vos références culturelles, vos valeurs et vos expériences de vie.",
|
||||
"profile.about.raised_in": "A grandi à {location}",
|
||||
"profile.header.age": "{age} ans",
|
||||
"filter.raised_in": "A grandi",
|
||||
"profile.big5_openness": "Ouverture",
|
||||
"profile.big5_conscientiousness": "Conscienciosité",
|
||||
"profile.big5_extraversion": "Extraversion",
|
||||
"profile.big5_agreeableness": "Agréabilité",
|
||||
"profile.big5_neuroticism": "Névrosisme",
|
||||
"profile.big5": "Big Five",
|
||||
"profile.big5_hint": "Faites glisser chaque curseur pour définir où vous vous situez sur ces traits (0 = faible, 100 = élevé).",
|
||||
"profile.big5_very_low": "Très faible",
|
||||
"profile.big5_low": "Faible",
|
||||
"profile.big5_average": "Moyen",
|
||||
"profile.big5_high": "Élevé",
|
||||
"profile.big5_very_high": "Très élevé",
|
||||
"profile.optional.big5_hint": "Faites glisser chaque curseur pour définir où vous vous situez sur ces traits (0 = faible, 100 = élevé).",
|
||||
"profile.political.conservative": "Conservateur·trice",
|
||||
"profile.political.e/acc": "Accélérationnisme efficace",
|
||||
"profile.political.green": "Vert·e / Éco-socialiste",
|
||||
@@ -826,18 +898,25 @@
|
||||
"profile.wants_kids_2": "Neutre ou ouvert·e à avoir des enfants",
|
||||
"profile.wants_kids_3": "Tend à vouloir des enfants",
|
||||
"profile.wants_kids_4": "Veut des enfants",
|
||||
"profile_grid.hidden_notice": "Vous avez masqué cette personne, elle n'apparaîtra plus dans vos résultats de recherche.",
|
||||
"profile_grid.hide_profile": "Ne plus afficher dans les résultats de recherche",
|
||||
"profile_grid.no_profiles": "Aucun profil trouvé.",
|
||||
"profile_grid.notification_cta": "N'hésitez pas à cliquer sur \"Recevoir notifs\" et nous vous préviendrons quand de nouveaux utilisateurs correspondront à votre recherche !",
|
||||
"profiles.title": "Personnes",
|
||||
"profile_grid.profile_hidden_short": "Vous ne verrez plus {name} dans vos résultats de recherche.",
|
||||
"profile_grid.undo": "Annuler",
|
||||
"profile_grid.unhide_profile": "Afficher à nouveau dans les résultats de recherche",
|
||||
"profiles.dismiss": "Fermer",
|
||||
"profiles.filter_guide": "Filtrez ci-dessous par intention, âge, lieu et plus encore",
|
||||
"profiles.hidden_success": "Profil masqué. Vous ne verrez plus cette personne dans les résultats de recherche.",
|
||||
"profiles.interactive_profiles": "Les profils sont interactifs — cliquez sur n'importe quelle carte pour en savoir plus et entrer en contact.",
|
||||
"profiles.search_intention": "Compass fonctionne mieux lorsque vous cherchez avec intention. Essayez d'utiliser des mots-clés ou des filtres au lieu de faire défiler.",
|
||||
"profiles.try_keyword_search": "Essayer une recherche par mot-clé",
|
||||
"profiles.search_tip": "Astuce : Cherchez d'abord par filtres et mot-clés pour trouver de meilleures correspondances. Le défilement sans fin réduit la pertinence.",
|
||||
"profiles.seeing_all_profiles": "Vous voyez tous les profils. Utilisez la recherche ou les filtres pour affiner.",
|
||||
"profiles.show_filters": "Voir les filtres",
|
||||
"profiles.sort_differently": "Trier différemment",
|
||||
"profiles.interactive_profiles": "Les profils sont interactifs — cliquez sur n'importe quelle carte pour en savoir plus et entrer en contact.",
|
||||
"profiles.dismiss": "Fermer",
|
||||
"profiles.seeing_all_profiles": "Vous voyez tous les profils. Utilisez la recherche ou les filtres pour affiner.",
|
||||
"profiles.filter_guide": "Filtrez ci-dessous par intention, âge, lieu et plus encore",
|
||||
"profiles.search_tip": "Astuce : Cherchez d'abord par filtres et mot-clés pour trouver de meilleures correspondances. Le défilement sans fin réduit la pertinence.",
|
||||
"profiles.title": "Personnes",
|
||||
"profiles.try_keyword_search": "Essayer une recherche par mot-clé",
|
||||
"referrals.title": "Invitez quelqu'un à rejoindre Compass !",
|
||||
"register.agreement.and": " et ",
|
||||
"register.agreement.prefix": "En vous inscrivant, j'accepte les ",
|
||||
"register.agreement.suffix": ".",
|
||||
@@ -856,7 +935,6 @@
|
||||
"register.error.all_fields_required": "Tous les champs sont requis",
|
||||
"register.error.email_in_use": "Cet e‑mail est déjà enregistré",
|
||||
"register.error.unknown": "Échec de l'inscription",
|
||||
"error.option_exists": "Cette option existe déjà",
|
||||
"register.get_started": "Commencer",
|
||||
"register.link_signin": "Se connecter",
|
||||
"register.or_sign_up_with": "Ou inscrivez-vous avec",
|
||||
@@ -887,6 +965,7 @@
|
||||
"saved_searches.empty_state": "Vous n'avez enregistré aucune recherche. Pour en enregistrer une, cliquez sur Recevoir notifs et nous vous préviendrons quotidiennement lorsque de nouvelles personnes correspondront.",
|
||||
"saved_searches.notification_note": "Nous vous préviendrons quotidiennement lorsque de nouvelles personnes correspondront à vos recherches ci-dessous.",
|
||||
"saved_searches.title": "Recherches enregistrées",
|
||||
"search.include_short_bios_tooltip": "Pour lister tous les profils, cochez \"Inclure les profils incomplets\"",
|
||||
"security.contact.email_button": "E‑mail",
|
||||
"security.contact.form": "Formulaire de contact",
|
||||
"security.contact.title": "Nous contacter",
|
||||
@@ -910,10 +989,17 @@
|
||||
"security.seo.description": "Signalez les vulnérabilités de sécurité à l'équipe Compass",
|
||||
"security.seo.title": "Sécurité",
|
||||
"security.title": "Sécurité",
|
||||
"send_message.button_label": "Contacter",
|
||||
"send_message.title": "Contactez",
|
||||
"settings.action.cancel": "Annuler",
|
||||
"common.change": "Modifier",
|
||||
"settings.action.save": "Enregistrer",
|
||||
"settings.danger_zone": "Zone dangereuse",
|
||||
"settings.data_privacy.description": "Téléchargez un fichier JSON contenant toutes vos informations : profil, compte, messages, réponses de compatibilité, profils en favoris, votes, recommandations, recherches enregistrées, etc.",
|
||||
"settings.data_privacy.download": "Télécharger toutes mes données (JSON)",
|
||||
"settings.data_privacy.download.error": "Échec du téléchargement de vos données. Veuillez réessayer.",
|
||||
"settings.data_privacy.download.success": "Votre export de données a été téléchargé.",
|
||||
"settings.data_privacy.downloading": "Téléchargement...",
|
||||
"settings.data_privacy.title": "Données & Confidentialité",
|
||||
"settings.delete.error": "Échec de la suppression du compte.",
|
||||
"settings.delete.loading": "Suppression du compte..",
|
||||
"settings.delete.success": "Votre compte a été supprimé.",
|
||||
@@ -928,40 +1014,37 @@
|
||||
"settings.email.same_as_current": "Le nouvel e-mail est identique à l'actuel",
|
||||
"settings.email.send_verification": "Envoyer un e-mail de vérification",
|
||||
"settings.email.sending": "Envoi de l'e-mail de vérification...",
|
||||
"settings.email.too_many_requests": "Vous ne pouvez pas demander plus d'un e-mail par minute. Veuillez attendre avant d'envoyer une autre demande.",
|
||||
"settings.email.update_failed": "Échec de la mise à jour de l'adresse e‑mail",
|
||||
"settings.email.updated_success": "Adresse e‑mail mise à jour avec succès",
|
||||
"settings.email.verification_failed": "Échec de l'envoi de l'e-mail de vérification.",
|
||||
"settings.email.verification_sent": "E-mail de vérification envoyé — vérifiez votre boîte de réception et les spams.",
|
||||
"settings.email.too_many_requests": "Vous ne pouvez pas demander plus d'un e-mail par minute. Veuillez attendre avant d'envoyer une autre demande.",
|
||||
"settings.email.verified": "E-mail vérifié ✔️",
|
||||
"messaging.email_verification_required": "Vous devez vérifier votre e-mail pour pouvoir envoyer des messages.",
|
||||
"settings.general.account": "Compte",
|
||||
"settings.general.email": "E-mail",
|
||||
"settings.general.font": "Police",
|
||||
"settings.general.language": "Langue",
|
||||
"settings.general.measurement": "Système de mesure",
|
||||
"settings.general.password": "Mot de passe",
|
||||
"settings.general.people": "Personnes",
|
||||
"settings.general.theme": "Thème",
|
||||
"settings.hidden_profiles.description": "Ces personnes n'apparaissent pas dans vos résultats de recherche.",
|
||||
"settings.hidden_profiles.empty": "Vous n'avez masqué aucun profil.",
|
||||
"settings.hidden_profiles.load_error": "Échec du chargement des profils masqués.",
|
||||
"settings.hidden_profiles.loading": "Chargement des profils masqués...",
|
||||
"settings.hidden_profiles.manage": "Gérer les profils masqués",
|
||||
"settings.hidden_profiles.title": "Profils que vous avez masqués",
|
||||
"settings.hidden_profiles.unhidden_success": "Profil affiché. Vous commencerez à voir cette personne à nouveau dans les résultats.",
|
||||
"settings.hidden_profiles.unhide": "Afficher",
|
||||
"settings.hidden_profiles.unhide_failed": "Échec de l'affichage",
|
||||
"settings.hidden_profiles.unhiding": "Affichage...",
|
||||
"settings.measurement.imperial": "Impérial",
|
||||
"settings.measurement.metric": "Métrique",
|
||||
"settings.password.send_reset": "Envoyer un e‑mail de réinitialisation de mot de passe",
|
||||
"settings.tabs.about": "À propos",
|
||||
"settings.tabs.general": "Général",
|
||||
"settings.tabs.notifications": "Notifications",
|
||||
"settings.title": "Paramètres",
|
||||
"settings.hidden_profiles.title": "Profils que vous avez masqués",
|
||||
"settings.hidden_profiles.manage": "Gérer les profils masqués",
|
||||
"settings.hidden_profiles.load_error": "Échec du chargement des profils masqués.",
|
||||
"settings.hidden_profiles.unhidden_success": "Profil affiché. Vous commencerez à voir cette personne à nouveau dans les résultats.",
|
||||
"settings.hidden_profiles.unhide_failed": "Échec de l'affichage",
|
||||
"settings.hidden_profiles.loading": "Chargement des profils masqués...",
|
||||
"settings.hidden_profiles.unhiding": "Affichage...",
|
||||
"settings.hidden_profiles.unhide": "Afficher",
|
||||
"settings.hidden_profiles.empty": "Vous n'avez masqué aucun profil.",
|
||||
"settings.hidden_profiles.description": "Ces personnes n'apparaissent pas dans vos résultats de recherche.",
|
||||
"settings.data_privacy.title": "Données & Confidentialité",
|
||||
"settings.data_privacy.description": "Téléchargez un fichier JSON contenant toutes vos informations : profil, compte, messages, réponses de compatibilité, profils en favoris, votes, recommandations, recherches enregistrées, etc.",
|
||||
"settings.data_privacy.download": "Télécharger toutes mes données (JSON)",
|
||||
"settings.data_privacy.downloading": "Téléchargement...",
|
||||
"settings.data_privacy.download.success": "Votre export de données a été téléchargé.",
|
||||
"settings.data_privacy.download.error": "Échec du téléchargement de vos données. Veuillez réessayer.",
|
||||
"signin.continue": "Ou continuez avec",
|
||||
"signin.email": "E-mail",
|
||||
"signin.enter_email": "Veuillez taper votre email",
|
||||
@@ -991,16 +1074,16 @@
|
||||
"signup.submit": "Créer le compte",
|
||||
"signup.title": "Créer un compte",
|
||||
"signup.toast.created": "Compte créé",
|
||||
"social.community.title": "Communauté",
|
||||
"social.community.desc": "Rejoignez nos discussions et chats communautaires.",
|
||||
"social.follow.title": "Annonces & Mises à jour",
|
||||
"social.follow.desc": "Restez informé des annonces et actualités.",
|
||||
"social.dev.title": "Développement",
|
||||
"social.dev.desc": "Consultez notre code source ou contribuez.",
|
||||
"social.contact.title": "Contact",
|
||||
"social.community.title": "Communauté",
|
||||
"social.contact.desc": "Contactez-nous directement pour toute demande.",
|
||||
"social.contact.title": "Contact",
|
||||
"social.dev.desc": "Consultez notre code source ou contribuez.",
|
||||
"social.dev.title": "Développement",
|
||||
"social.discord": "Discord",
|
||||
"social.email_button": "E‑mail",
|
||||
"social.follow.desc": "Restez informé des annonces et actualités.",
|
||||
"social.follow.title": "Annonces & Mises à jour",
|
||||
"social.github": "GitHub",
|
||||
"social.reddit": "Reddit",
|
||||
"social.seo.description": "Réseaux sociaux",
|
||||
@@ -1008,6 +1091,8 @@
|
||||
"social.stoat": "Revolt / Stoat",
|
||||
"social.title": "Réseaux sociaux",
|
||||
"social.x": "X",
|
||||
"star_button.save": "Enregistrer le profil",
|
||||
"star_button.unsave": "Ne plus enregistrer le profil",
|
||||
"stats.active_members": "Membres actifs (le mois dernier)",
|
||||
"stats.compatibility_prompts": "Questions de compatibilité",
|
||||
"stats.discussions": "Discussions",
|
||||
@@ -1024,6 +1109,9 @@
|
||||
"stats.total": "Total",
|
||||
"stats.votes": "Votes",
|
||||
"stats.with_bio": "Complétés",
|
||||
"sticky_format_menu.add_embed": "Ajouter un embed",
|
||||
"sticky_format_menu.add_emoji": "Ajouter un emoji",
|
||||
"sticky_format_menu.upload_image": "Ajouter une image",
|
||||
"terms.changes.text": "Nous pouvons mettre à jour ces Conditions périodiquement. La poursuite de l'utilisation de Compass après les mises à jour vaut acceptation des nouvelles Conditions.",
|
||||
"terms.changes.title": "6. Modifications",
|
||||
"terms.contact": "Pour toute question concernant ces Conditions, veuillez nous contacter à ",
|
||||
@@ -1103,66 +1191,5 @@
|
||||
"vote.toast.created": "Proposition créée",
|
||||
"vote.urgent": "Urgente",
|
||||
"vote.voted": "Vote enregistré",
|
||||
"onboarding.skip": "Passer le tutoriel",
|
||||
"onboarding.welcome": "Bienvenue sur Compass!",
|
||||
"onboarding.step1.title": "Pas de boîte noire. Pas de manipulation.",
|
||||
"onboarding.step1.body1": "Compass ne décide pas qui vous devriez voir.",
|
||||
"onboarding.step1.body2": "Il n'y a pas d'algorithme d'engagement, pas de classement par swipe, pas de profils boostés et pas d'optimisation de l'attention. Vous pouvez parcourir la base de données complète, appliquer vos propres filtres et voir exactement pourquoi quelqu'un vous correspond.",
|
||||
"onboarding.step1.body3": "Vous gardez le contrôle de la découverte. Toujours.",
|
||||
"onboarding.step1.footer": "La transparence est un principe fondamental, pas une fonctionnalité.",
|
||||
"onboarding.step2.title": "Cherchez, sans swipe.",
|
||||
"onboarding.step2.body1": "Au lieu d'un défilement sans fin, Compass vous permet de chercher intentionnellement.",
|
||||
"onboarding.step2.body2": "Cherchez des personnes par :",
|
||||
"onboarding.step2.item1": "Intérêts et mots-clés",
|
||||
"onboarding.step2.item2": "Valeurs et idées",
|
||||
"onboarding.step2.item3": "Réponses de compatibilité",
|
||||
"onboarding.step2.item4": "Lieu et intention",
|
||||
"onboarding.step2.body3": "Vous pouvez sauvegarder des recherches et être notifié lorsque de nouvelles personnes vous correspondent. Pas besoin de vérifier l'application chaque jour.",
|
||||
"onboarding.step2.footer": "Moins de bruit. Plus de signal.",
|
||||
"onboarding.step3.title": "Une compatibilité qui fait sens.",
|
||||
"onboarding.step3.body1": "Les correspondances ne sont ni magiques ni mystérieuses.",
|
||||
"onboarding.step3.body2": "Votre score de compatibilité provient de questions explicites :",
|
||||
"onboarding.step3.item1": "Votre réponse",
|
||||
"onboarding.step3.item2": "Quelles réponses vous acceptez des autres",
|
||||
"onboarding.step3.item3": "L'importance de chaque question pour vous",
|
||||
"onboarding.step3.body3": "Vous pouvez inspecter, questionner et améliorer le système. Les maths derrière sont open source.",
|
||||
"onboarding.step3.footer": "Si vous n'êtes pas d'accord avec son fonctionnement, vous pouvez aider à le changer.",
|
||||
"onboarding.step3.continue": "Commencer",
|
||||
"common.continue": "Continuer",
|
||||
"compatibility.onboarding.title": "Questions de compatibilité",
|
||||
"compatibility.onboarding.body1": "Répondez à quelques questions courtes pour calculer la compatibilité basée sur les valeurs et les préférences — pas sur les photos ou les swipes.",
|
||||
"compatibility.onboarding.body2": "Vos réponses affectent directement qui vous correspond et avec quelle force.",
|
||||
"compatibility.onboarding.impact": "La plupart des personnes qui répondent à au moins 5 questions trouvent des correspondances beaucoup plus pertinentes.",
|
||||
"compatibility.onboarding.start": "Commencer à répondre",
|
||||
"compatibility.onboarding.later": "Faire ça plus tard",
|
||||
"more_options_user.edit_profile": "Modifier le profil",
|
||||
"more_options_user.profile_options": "Options du profil",
|
||||
"more_options_user.edit_bio": "Options de biographie",
|
||||
"vote.with_priority": "avec priorité",
|
||||
"settings.general.font": "Police",
|
||||
"settings.general.measurement": "Système de mesure",
|
||||
"settings.measurement.imperial": "Impérial",
|
||||
"settings.measurement.metric": "Métrique",
|
||||
"font.atkinson": "Atkinson Hyperlegible",
|
||||
"font.system-sans": "Sans-serif système",
|
||||
"font.classic-serif": "Serif classique",
|
||||
"filter.age.label": "Âge",
|
||||
"filter.age.up_to": "jusqu'à",
|
||||
"filter.any_new_users": "Tout nouvel utilisateur",
|
||||
"filter.label.name": "Recherche",
|
||||
"filter.label.education_levels": "Éducation",
|
||||
"filter.label.pref_age_max": "Âge max",
|
||||
"filter.label.pref_age_min": "Âge min",
|
||||
"filter.label.drinks": "Boissons",
|
||||
"filter.label.wants_kids_strength": "Enfants",
|
||||
"filter.label.pref_relation_styles": "Recherche",
|
||||
"filter.label.pref_gender": "Genre recherché",
|
||||
"filter.label.diet": "Régime",
|
||||
"filter.label.political_beliefs": "Opinions politiques",
|
||||
"filter.label.mbti": "MBTI",
|
||||
"filter.drinks.per_month": "par mois",
|
||||
"compatibility.search_placeholder": "Rechercher des questions et réponses...",
|
||||
"compatibility.seo.title": "Compatibilité",
|
||||
"compatibility.seo.description": "Afficher et gérer vos questions de compatibilité",
|
||||
"compatibility.empty.no_results": "Aucun résultat pour \"{keyword}\""
|
||||
"vote.with_priority": "avec priorité"
|
||||
}
|
||||
18
common/src/translate.ts
Normal file
18
common/src/translate.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import {defaultLocale} from 'common/constants'
|
||||
|
||||
export function getTranslationMethod(locale: string | undefined, messages: Record<string, string>) {
|
||||
return (key: string, fallback: string, formatter?: any): string => {
|
||||
const result = locale === defaultLocale ? fallback : (messages[key] ?? fallback)
|
||||
if (!formatter) return result
|
||||
if (typeof formatter === 'function') return formatter(result)
|
||||
if (typeof formatter === 'object') {
|
||||
let text = String(result)
|
||||
for (const [k, v] of Object.entries(formatter)) {
|
||||
text = text.replace(new RegExp(`\\{${k}\\}`, 'g'), String(v))
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
import {DOMAIN} from 'common/envs/constants'
|
||||
|
||||
import {PrivateUser} from './user'
|
||||
import {filterDefined} from './util/array'
|
||||
|
||||
@@ -49,7 +51,7 @@ export const getDefaultNotificationPreferences = (isDev?: boolean) => {
|
||||
return defaults
|
||||
}
|
||||
|
||||
export const UNSUBSCRIBE_URL = 'https://compassmeet.com/notifications'
|
||||
export const UNSUBSCRIBE_URL = `https://${DOMAIN}/notifications`
|
||||
export const getNotificationDestinationsForUser = (
|
||||
privateUser: PrivateUser,
|
||||
type: notification_preference,
|
||||
|
||||
@@ -4,33 +4,12 @@ import {notification_preferences} from './user-notification-preferences'
|
||||
export type User = {
|
||||
id: string
|
||||
createdTime: number
|
||||
|
||||
name: string
|
||||
username: string
|
||||
avatarUrl: string
|
||||
|
||||
// For their user page
|
||||
bio?: string
|
||||
|
||||
// Social links
|
||||
link: Socials
|
||||
|
||||
// Legacy fields (deprecated)
|
||||
/** @deprecated Use link.site instead */
|
||||
website?: string
|
||||
/** @deprecated Use link.x instead */
|
||||
twitterHandle?: string
|
||||
/** @deprecated Use link.discord instead */
|
||||
discordHandle?: string
|
||||
/** @deprecated Use link.manifold instead */
|
||||
manifoldHandle?: string
|
||||
|
||||
link: Socials // Social links
|
||||
isBannedFromPosting?: boolean
|
||||
userDeleted?: boolean
|
||||
|
||||
sweestakesVerified?: boolean
|
||||
verifiedPhone?: boolean
|
||||
idVerified?: boolean
|
||||
}
|
||||
|
||||
export type PrivateUser = {
|
||||
@@ -41,6 +20,7 @@ export type PrivateUser = {
|
||||
notificationPreferences: notification_preferences
|
||||
blockedUserIds: string[]
|
||||
blockedByUserIds: string[]
|
||||
locale?: string
|
||||
}
|
||||
|
||||
export type UserActivity = {
|
||||
@@ -49,9 +29,3 @@ export type UserActivity = {
|
||||
}
|
||||
|
||||
export type UserAndPrivateUser = {user: User; privateUser: PrivateUser}
|
||||
|
||||
export function getCurrentUtcTime(): Date {
|
||||
const currentDate = new Date()
|
||||
const utcDate = currentDate.toISOString()
|
||||
return new Date(utcDate)
|
||||
}
|
||||
|
||||
@@ -7,3 +7,9 @@ export const YEAR_MS = 365 * DAY_MS
|
||||
export const HOUR_SECONDS = 60 * 60
|
||||
|
||||
export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
|
||||
|
||||
export function getCurrentUtcTime(): Date {
|
||||
const currentDate = new Date()
|
||||
const utcDate = currentDate.toISOString()
|
||||
return new Date(utcDate)
|
||||
}
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
describe('translation', () => {
|
||||
it('same number of translation keys', async () => {
|
||||
const de = await import('web/messages/de.json')
|
||||
const fr = await import('web/messages/fr.json')
|
||||
const de = await import('common/messages/de.json')
|
||||
const fr = await import('common/messages/fr.json')
|
||||
|
||||
// Check if both files have the same number of top-level keys
|
||||
// expect(Object.keys(de).length).toBe(Object.keys(fr).length)
|
||||
|
||||
// Check if all keys in de exist in fr and log any missing ones
|
||||
const missingKeys = Object.keys(fr).filter((key) => !de.hasOwnProperty(key))
|
||||
const missingKeys = Object.keys(fr).filter(
|
||||
(key) => !Object.prototype.hasOwnProperty.call(de, key),
|
||||
)
|
||||
if (missingKeys.length > 0) {
|
||||
console.log('Missing keys in de.json:', missingKeys)
|
||||
}
|
||||
@@ -11,10 +11,13 @@
|
||||
"strict": true,
|
||||
"target": "es2022",
|
||||
"skipLibCheck": true,
|
||||
"resolveJsonModule": true,
|
||||
"esModuleInterop": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"paths": {
|
||||
"common/*": ["./src/*", "../lib/*"]
|
||||
}
|
||||
},
|
||||
"include": ["src/**/*.ts"],
|
||||
"include": ["src/**/*.ts", "src/messages/*.json"],
|
||||
"exclude": ["**/*.test.ts", "**/*.spec.ts"]
|
||||
}
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
"compilerOptions": {
|
||||
"types": ["jest"]
|
||||
},
|
||||
"include": ["src/**/*.ts", "tests/**/*.ts"],
|
||||
"include": ["src/**/*.ts", "src/messages/*.json", "tests/**/*.ts"],
|
||||
"exclude": []
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import {useStateCheckEquality} from 'web/hooks/use-state-check-equality'
|
||||
import {useWebsocketPrivateUser, useWebsocketUser} from 'web/hooks/use-user'
|
||||
import {api} from 'web/lib/api'
|
||||
import {auth} from 'web/lib/firebase/users'
|
||||
import {useLocale} from 'web/lib/locale'
|
||||
import {identifyUser, setUserProperty} from 'web/lib/service/analytics'
|
||||
import {getPrivateUserSafe, getUserSafe} from 'web/lib/supabase/users'
|
||||
import {getCookie, setCookie} from 'web/lib/util/cookie'
|
||||
@@ -116,6 +117,8 @@ export function AuthProvider(props: {children: ReactNode; serverUser?: AuthUser}
|
||||
)
|
||||
const [authLoaded, setAuthLoaded] = useState(false)
|
||||
const firebaseUser = useAndSetupFirebaseUser()
|
||||
const {locale} = useLocale()
|
||||
console.log('AuthProvider locale', locale)
|
||||
|
||||
const authUser = !user
|
||||
? user
|
||||
@@ -153,6 +156,11 @@ export function AuthProvider(props: {children: ReactNode; serverUser?: AuthUser}
|
||||
setAuthLoaded(true)
|
||||
// generate auth token
|
||||
fbUser.getIdToken()
|
||||
console.log('onAuthLoad', locale)
|
||||
if (privateUser.locale !== locale) {
|
||||
console.log('update-user-locale', locale)
|
||||
api('update-user-locale', {locale})
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
@@ -178,9 +186,11 @@ export function AuthProvider(props: {children: ReactNode; serverUser?: AuthUser}
|
||||
const deviceToken = ensureDeviceToken()
|
||||
const adminToken = getAdminToken()
|
||||
|
||||
console.log('create-user locale', locale)
|
||||
const newUser = (await api('create-user', {
|
||||
deviceToken,
|
||||
adminToken,
|
||||
locale,
|
||||
})) as UserAndPrivateUser
|
||||
|
||||
onAuthLoad(fbUser, newUser.user, newUser.privateUser)
|
||||
|
||||
@@ -4,10 +4,7 @@ import {sleep} from 'common/util/time'
|
||||
|
||||
import {auth} from './firebase/users'
|
||||
|
||||
export async function api<P extends APIPath>(
|
||||
path: P,
|
||||
params: APIParams<P> = {}
|
||||
) {
|
||||
export async function api<P extends APIPath>(path: P, params: APIParams<P> = {}) {
|
||||
// If the api is authed and the user is not loaded, wait for the user to load.
|
||||
if (API[path].authed && !auth.currentUser) {
|
||||
let i = 0
|
||||
@@ -32,3 +29,11 @@ function curriedAPI<P extends APIPath>(path: P) {
|
||||
export const updateProfile = curriedAPI('update-profile')
|
||||
export const updateUser = curriedAPI('me/update')
|
||||
export const report = curriedAPI('report')
|
||||
|
||||
export const updateBackendLocale = (newLocale: string) => {
|
||||
if (!auth.currentUser) return
|
||||
console.debug('Updating backend locale to', newLocale)
|
||||
api('update-user-locale', {locale: newLocale}).catch((error) => {
|
||||
console.error('Failed to update user locale:', error)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {defaultLocale} from 'common/constants'
|
||||
import {getTranslationMethod} from 'common/translate'
|
||||
import {createContext, useContext, useEffect, useState} from 'react'
|
||||
|
||||
export type I18nContextType = {
|
||||
@@ -15,14 +16,6 @@ export function useLocale() {
|
||||
return useContext(I18nContext)
|
||||
}
|
||||
|
||||
// export function t(key: string, english: string): string {
|
||||
// const locale = useLocale()
|
||||
// console.log({locale})
|
||||
//
|
||||
// if (locale === defaultLocale) return english
|
||||
// return messages[locale]?.[key] ?? english
|
||||
// }
|
||||
|
||||
const messageCache: Record<string, Record<string, string>> = {}
|
||||
|
||||
export function useT() {
|
||||
@@ -36,7 +29,7 @@ export function useT() {
|
||||
return
|
||||
}
|
||||
|
||||
import(`web/messages/${locale}.json`)
|
||||
import(`common/messages/${locale}.json`)
|
||||
.then((mod) => {
|
||||
messageCache[locale] = mod.default
|
||||
setMessages(mod.default)
|
||||
@@ -44,17 +37,5 @@ export function useT() {
|
||||
.catch(() => setMessages({}))
|
||||
}, [locale])
|
||||
|
||||
return (key: string, fallback: string, formatter?: any) => {
|
||||
const result = locale === defaultLocale ? fallback : (messages[key] ?? fallback)
|
||||
if (!formatter) return result
|
||||
if (typeof formatter === 'function') return formatter(result)
|
||||
if (typeof formatter === 'object') {
|
||||
let text = String(result)
|
||||
for (const [k, v] of Object.entries(formatter)) {
|
||||
text = text.replace(new RegExp(`\\{${k}\\}`, 'g'), String(v))
|
||||
}
|
||||
return text
|
||||
}
|
||||
return result
|
||||
}
|
||||
return getTranslationMethod(locale, messages)
|
||||
}
|
||||
|
||||
@@ -289,7 +289,7 @@ function UserPageInner(props: ActiveUserPageProps) {
|
||||
>
|
||||
<SEO
|
||||
title={`${user.name}`}
|
||||
description={user.bio ?? ''}
|
||||
description={`${user.name} is on Compass`}
|
||||
url={`/${user.username}`}
|
||||
image={getProfileOgImageUrl(user, profile)}
|
||||
/>
|
||||
|
||||
@@ -20,6 +20,7 @@ import {useFontPreferenceManager} from 'web/hooks/use-font-preference'
|
||||
import {useHasLoaded} from 'web/hooks/use-has-loaded'
|
||||
import {HiddenProfilesProvider} from 'web/hooks/use-hidden-profiles'
|
||||
import {updateStatusBar} from 'web/hooks/use-theme'
|
||||
import {updateBackendLocale} from 'web/lib/api'
|
||||
import {DAYJS_LOCALE_IMPORTS, registerDatePickerLocale} from 'web/lib/dayjs'
|
||||
import {I18nContext} from 'web/lib/locale'
|
||||
import {getLocale, resetCachedLocale} from 'web/lib/locale-cookie'
|
||||
@@ -98,13 +99,16 @@ function MyApp(props: AppProps<PageProps>) {
|
||||
useFontPreferenceManager()
|
||||
const router = useRouter()
|
||||
|
||||
const [locale, setLocaleState] = useState(getLocale())
|
||||
const [locale, setLocaleState] = useState<string>(getLocale())
|
||||
console.log('_app locale', locale)
|
||||
const setLocale = (newLocale: string) => {
|
||||
console.log('setLocale', newLocale)
|
||||
document.cookie = `lang=${newLocale}; path=/; max-age=31536000`
|
||||
setLocaleState(newLocale)
|
||||
resetCachedLocale()
|
||||
DAYJS_LOCALE_IMPORTS[newLocale]?.()
|
||||
registerDatePickerLocale(newLocale)
|
||||
updateBackendLocale(newLocale)
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
@@ -190,15 +194,15 @@ function MyApp(props: AppProps<PageProps>) {
|
||||
// mainFont.variable
|
||||
)}
|
||||
>
|
||||
<AuthProvider serverUser={pageProps.auth}>
|
||||
<HiddenProfilesProvider>
|
||||
<WebPush />
|
||||
<AndroidPush />
|
||||
<I18nContext.Provider value={{locale, setLocale}}>
|
||||
<I18nContext.Provider value={{locale, setLocale}}>
|
||||
<AuthProvider serverUser={pageProps.auth}>
|
||||
<HiddenProfilesProvider>
|
||||
<WebPush />
|
||||
<AndroidPush />
|
||||
<Component {...pageProps} />
|
||||
</I18nContext.Provider>
|
||||
</HiddenProfilesProvider>
|
||||
</AuthProvider>
|
||||
</HiddenProfilesProvider>
|
||||
</AuthProvider>
|
||||
</I18nContext.Provider>
|
||||
{/* Workaround for https://github.com/tailwindlabs/headlessui/discussions/666, to allow font CSS variable */}
|
||||
<div id="headlessui-portal-root">
|
||||
<div />
|
||||
|
||||
Reference in New Issue
Block a user