{error}
diff --git a/src/app/i18n/en.json b/src/app/i18n/en.json
new file mode 100644
index 0000000..6cc6cb5
--- /dev/null
+++ b/src/app/i18n/en.json
@@ -0,0 +1,19 @@
+{
+ "nav.home": "home",
+ "nav.login": "login",
+ "nav.register": "register",
+ "nav.admin": "admin",
+ "auth.login.cta": "login",
+ "auth.login.register_instead": "register instead?",
+ "auth.register.cta": "signup",
+ "auth.register.login_instead": "login instead?",
+ "auth.username.label": "username",
+ "auth.password.label": "password",
+ "auth.remember_me.label": "stay logged in",
+ "misc.loading": "wait...",
+ "nav.logout": "logout",
+ "post.add_media.cta": "+ add media",
+ "post.public.label": "public",
+ "post.submit.cta": "post",
+ "post.editor.placeholder": "write something..."
+}
\ No newline at end of file
diff --git a/src/app/i18n/translationKeys.ts b/src/app/i18n/translationKeys.ts
new file mode 100644
index 0000000..de1c52a
--- /dev/null
+++ b/src/app/i18n/translationKeys.ts
@@ -0,0 +1,24 @@
+export interface Translations {
+ 'auth.login.cta': string
+ 'auth.login.register_instead': string
+ 'auth.password.label': string
+ 'auth.register.cta': string
+ 'auth.register.login_instead': string
+ 'auth.remember_me.label': string
+ 'auth.username.label': string
+
+ 'misc.loading': string
+
+ 'nav.admin': string
+ 'nav.home': string
+ 'nav.login': string
+ 'nav.logout': string
+ 'nav.register': string
+
+ 'post.add_media.cta': string
+ 'post.editor.placeholder': string
+ 'post.public.label': string
+ 'post.submit.cta': string
+}
+
+export type TranslationKey = keyof Translations
diff --git a/src/app/i18n/useTranslations.ts b/src/app/i18n/useTranslations.ts
new file mode 100644
index 0000000..c403be1
--- /dev/null
+++ b/src/app/i18n/useTranslations.ts
@@ -0,0 +1,13 @@
+import { TranslationKey, Translations } from './translationKeys.ts'
+import en from './en.json' assert { type: 'json' }
+
+export function useTranslations() {
+ // TODO somehow handle other languages (reactively)
+ const texts = en as Translations
+
+ function getText
(key: K): Translations[K] {
+ return texts[key] ?? key
+ }
+
+ return { t: getText }
+}
diff --git a/src/components/NewPostWidget.tsx b/src/components/NewPostWidget.tsx
index ea3496a..d7b4828 100644
--- a/src/components/NewPostWidget.tsx
+++ b/src/components/NewPostWidget.tsx
@@ -3,6 +3,7 @@ import FancyTextEditor, { TextInputKeyDownEvent } from './inputs/FancyTextEditor
import Button from './buttons/Button.tsx'
import { openFileDialog } from '../utils/openFileDialog.ts'
import makePica from 'pica'
+import { useTranslations } from '../app/i18n/useTranslations.ts'
interface NewPostWidgetProps {
onSubmit: (
@@ -22,6 +23,7 @@ interface Attachment {
}
export default function NewPostWidget({ onSubmit, isSubmitting = false }: NewPostWidgetProps) {
+ const { t } = useTranslations()
const [content, setContent] = useState('')
const [attachments, setAttachments] = useState([])
const [isPublic, setIsPublic] = useState(false)
@@ -72,7 +74,7 @@ export default function NewPostWidget({ onSubmit, isSubmitting = false }: NewPos
onInput={onContentInput}
onKeyDown={onInputKeyDown}
className="mb-3"
- placeholder="write something..."
+ placeholder={t('post.editor.placeholder')}
/>
{attachments.length > 0 && (
@@ -93,7 +95,7 @@ export default function NewPostWidget({ onSubmit, isSubmitting = false }: NewPos