Skip to content

[DRAFT] Feature i18n added #669

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 80 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
7eb0847
Add first i18n stuff
Lokowitz May 4, 2025
059081a
more i18n
Lokowitz May 4, 2025
d460dd3
deleted: messages/de-DE.json
Lokowitz May 4, 2025
9d68c56
remove language translation
Lokowitz May 4, 2025
7f4135e
New translations en-us.json (German)
Lokowitz May 4, 2025
9e57268
deleted: messages/de-DE.json
Lokowitz May 4, 2025
230c08e
New translations en-us.json (German)
Lokowitz May 4, 2025
576fda2
New translations en-us.json (French)
Lokowitz May 4, 2025
8a377d7
New translations en-us.json (Italian)
Lokowitz May 4, 2025
95fed84
New translations en-us.json (Polish)
Lokowitz May 4, 2025
2543bf3
New translations en-us.json (Portuguese)
Lokowitz May 4, 2025
aca1cc0
New translations en-us.json (Turkish)
Lokowitz May 4, 2025
3d4b9d4
modified: src/components/LocaleSwitcher.tsx
Lokowitz May 4, 2025
6e5391c
Delete messages/de-DE.json
Lokowitz May 4, 2025
4f5c3a8
Merge pull request #11 from Lokowitz/translations_i18n
Lokowitz May 4, 2025
2937538
Create de-DE.json
Lokowitz May 4, 2025
fa1997a
complete share link i18n
Lokowitz May 5, 2025
5b44f35
New translations en-us.json (German)
Lokowitz May 5, 2025
d9aab7b
New translations en-us.json (French)
Lokowitz May 5, 2025
6b8fa28
New translations en-us.json (Italian)
Lokowitz May 5, 2025
dd24b4a
New translations en-us.json (Polish)
Lokowitz May 5, 2025
17789ef
New translations en-us.json (Portuguese)
Lokowitz May 5, 2025
5522245
New translations en-us.json (Turkish)
Lokowitz May 5, 2025
a058f4a
complete sites i18n
Lokowitz May 5, 2025
3bb4b44
New translations en-us.json (German)
Lokowitz May 5, 2025
08bd3cf
New translations en-us.json (French)
Lokowitz May 5, 2025
938cc31
New translations en-us.json (Italian)
Lokowitz May 5, 2025
8df0120
New translations en-us.json (Polish)
Lokowitz May 5, 2025
4e02a77
New translations en-us.json (Portuguese)
Lokowitz May 5, 2025
bb0c1c8
New translations en-us.json (Turkish)
Lokowitz May 5, 2025
0b235f9
New translations en-us.json (German)
Lokowitz May 5, 2025
f62f2e3
New translations en-us.json (French)
Lokowitz May 5, 2025
dde2f45
New translations en-us.json (Italian)
Lokowitz May 5, 2025
bc05009
New translations en-us.json (Polish)
Lokowitz May 5, 2025
e9e9478
New translations en-us.json (Portuguese)
Lokowitz May 5, 2025
e48a0fc
Merge pull request #12 from Lokowitz/translations_i18n
Lokowitz May 5, 2025
87b9598
...
Lokowitz May 5, 2025
b9c7c8c
api keys
vlalx May 6, 2025
e38941a
Merge pull request #14 from vlalx/support_i18n
Lokowitz May 6, 2025
4dd9f47
add admin/user i18n
Lokowitz May 6, 2025
1e72b0f
add admin/license i18n
Lokowitz May 6, 2025
cae4f5d
New translations en-us.json (French)
Lokowitz May 6, 2025
23f9d31
New translations en-us.json (German)
Lokowitz May 6, 2025
d47c2f9
New translations en-us.json (Italian)
Lokowitz May 6, 2025
afc6ee5
New translations en-us.json (Polish)
Lokowitz May 6, 2025
75dc6ed
New translations en-us.json (Portuguese)
Lokowitz May 6, 2025
2bd06ff
New translations en-us.json (Turkish)
Lokowitz May 6, 2025
e8d2cde
Merge pull request #15 from Lokowitz/translations_new_i18n
Lokowitz May 6, 2025
c6ff868
modified: src/app/setup/page.tsx
Lokowitz May 6, 2025
d88fc13
New translation keys in en-US locale
vlalx May 6, 2025
3dba4aa
New translation keys in de-DE locale
vlalx May 6, 2025
58c1299
New translation keys in fr-FR locale
vlalx May 6, 2025
31d54eb
New translation keys in it-IT locale
vlalx May 6, 2025
99352aa
New translation keys in pl-PL locale
vlalx May 6, 2025
bb7421c
New translation keys in pt-PT locale
vlalx May 6, 2025
1ee8561
New translation keys in tr-TR locale
vlalx May 6, 2025
d994a81
Add missed translation keys in settings/api-keys
vlalx May 6, 2025
8242a66
Add translation keys in admin/api-keys
vlalx May 6, 2025
a8e8676
Merge pull request #16 from vlalx/i18n_admin_api_keys
Lokowitz May 6, 2025
b03415a
New translation keys in en-US locale
vlalx May 7, 2025
3e9dc47
New translation keys in de-DE locale
vlalx May 7, 2025
f91a4e8
New translation keys in fr-FR locale
vlalx May 7, 2025
fa21934
New translation keys in it-IT locale
vlalx May 7, 2025
0fd3271
New translation keys in pl-PL locale
vlalx May 7, 2025
89729a4
New translation keys in pt-PT locale
vlalx May 7, 2025
491b4e7
New translation keys in tr-TR locale
vlalx May 7, 2025
840d5c2
Add translation keys in settings/access/invitations
vlalx May 7, 2025
408822a
Fix missed translation keys
vlalx May 9, 2025
3a1f4d7
Merge pull request #17 from vlalx/i18n_invitations
Lokowitz May 10, 2025
1f95d71
fixes for invitations
Lokowitz May 10, 2025
6f54e3d
New translations en-us.json (German)
Lokowitz May 17, 2025
96bfc3c
I18n orgId/settings (#21)
vlalx May 17, 2025
d2d84be
I18n admin (#22)
vlalx May 17, 2025
b8ed5ac
I18n auth (#23)
vlalx May 17, 2025
731ec1d
I18n app other (#24)
vlalx May 17, 2025
eff812e
first fixes
Lokowitz May 17, 2025
d9ee40c
more fixes
Lokowitz May 17, 2025
547e777
more fixes
Lokowitz May 17, 2025
ae4ef4e
modified: messages/en-US.json
Lokowitz May 17, 2025
af3694d
New Crowdin updates (#26)
Lokowitz May 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions crowdin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
files:
- source: /messages/en-US.json
translation: /messages/%locale%.json
911 changes: 911 additions & 0 deletions messages/de-DE.json

Large diffs are not rendered by default.

911 changes: 911 additions & 0 deletions messages/en-US.json

Large diffs are not rendered by default.

911 changes: 911 additions & 0 deletions messages/fr-FR.json

Large diffs are not rendered by default.

911 changes: 911 additions & 0 deletions messages/it-IT.json

Large diffs are not rendered by default.

911 changes: 911 additions & 0 deletions messages/pl-PL.json

Large diffs are not rendered by default.

911 changes: 911 additions & 0 deletions messages/pt-PT.json

Large diffs are not rendered by default.

911 changes: 911 additions & 0 deletions messages/tr-TR.json

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions next.config.mjs
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import createNextIntlPlugin from 'next-intl/plugin';

const withNextIntl = createNextIntlPlugin();

/** @type {import('next').NextConfig} */
const nextConfig = {
eslint: {
ignoreDuringBuilds: true,
ignoreDuringBuilds: true
},
output: "standalone"
output: 'standalone'
};

export default nextConfig;
export default withNextIntl(nextConfig);
2,984 changes: 2,266 additions & 718 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
},
"dependencies": {
"@asteasolutions/zod-to-openapi": "^7.3.0",
"@heroicons/react": "^2.2.0",
"@hookform/resolvers": "3.9.1",
"@node-rs/argon2": "2.0.2",
"@oslojs/crypto": "1.0.1",
Expand Down Expand Up @@ -74,6 +75,7 @@
"lucide-react": "0.469.0",
"moment": "2.30.1",
"next": "15.2.4",
"next-intl": "^4.1.0",
"next-themes": "0.4.4",
"node-cache": "5.1.2",
"node-fetch": "3.3.2",
Expand Down
15 changes: 9 additions & 6 deletions src/app/[orgId]/OrganizationLandingCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
} from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Users, Globe, Database, Cog, Settings, Waypoints, Combine } from "lucide-react";
import { useTranslations } from "next-intl";

interface OrgStat {
label: string;
Expand Down Expand Up @@ -38,19 +39,21 @@ export default function OrganizationLandingCard(
) {
const [orgData] = useState(props);

const t = useTranslations();

const orgStats: OrgStat[] = [
{
label: "Sites",
label: t('sites'),
value: orgData.overview.stats.sites,
icon: <Combine className="h-6 w-6" />
},
{
label: "Resources",
label: t('resources'),
value: orgData.overview.stats.resources,
icon: <Waypoints className="h-6 w-6" />
},
{
label: "Users",
label: t('users'),
value: orgData.overview.stats.users,
icon: <Users className="h-6 w-6" />
}
Expand Down Expand Up @@ -81,9 +84,9 @@ export default function OrganizationLandingCard(
))}
</div>
<div className="text-center text-lg">
Your role:{" "}
{t('accessRoleYour')}{" "}
<span className="font-semibold">
{orgData.overview.isOwner ? "Owner" : orgData.overview.userRole}
{orgData.overview.isOwner ? t('accessRoleOwner') : orgData.overview.userRole}
</span>
</div>
</CardContent>
Expand All @@ -92,7 +95,7 @@ export default function OrganizationLandingCard(
<Link href={`/${orgData.overview.orgId}/settings`}>
<Button size="lg" className="w-full md:w-auto">
<Settings className="mr-2 h-4 w-4" />
Organization Settings
{t('orgGeneralSettings')}
</Button>
</Link>
</CardFooter>
Expand Down
13 changes: 8 additions & 5 deletions src/app/[orgId]/settings/access/AccessPageHeaderAndNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { HorizontalTabs } from "@app/components/HorizontalTabs";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import { useTranslations } from "next-intl";

interface AccessPageHeaderAndNavProps {
children: React.ReactNode;
Expand All @@ -12,29 +13,31 @@ export default function AccessPageHeaderAndNav({
children,
hasInvitations
}: AccessPageHeaderAndNavProps) {
const t = useTranslations();

const navItems = [
{
title: "Users",
title: t('users'),
href: `/{orgId}/settings/access/users`
},
{
title: "Roles",
title: t('roles'),
href: `/{orgId}/settings/access/roles`
}
];

if (hasInvitations) {
navItems.push({
title: "Invitations",
title: t('invite'),
href: `/{orgId}/settings/access/invitations`
});
}

return (
<>
<SettingsSectionTitle
title="Manage Users & Roles"
description="Invite users and add them to roles to manage access to your organization"
title={t('accessUsersRoles')}
description={t('accessUsersRolesDescription')}
/>

<HorizontalTabs items={navItems}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
ColumnDef,
} from "@tanstack/react-table";
import { DataTable } from "@app/components/ui/data-table";
import { useTranslations } from 'next-intl';

interface DataTableProps<TData, TValue> {
columns: ColumnDef<TData, TValue>[];
Expand All @@ -14,12 +15,15 @@ export function InvitationsDataTable<TData, TValue>({
columns,
data
}: DataTableProps<TData, TValue>) {

const t = useTranslations();

return (
<DataTable
columns={columns}
data={data}
title="Invitations"
searchPlaceholder="Search invitations..."
title={t('invite')}
searchPlaceholder={t('inviteSearch')}
searchColumn="email"
/>
);
Expand Down
37 changes: 18 additions & 19 deletions src/app/[orgId]/settings/access/invitations/InvitationsTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { useOrgContext } from "@app/hooks/useOrgContext";
import { toast } from "@app/hooks/useToast";
import { createApiClient } from "@app/lib/api";
import { useEnvContext } from "@app/hooks/useEnvContext";
import { useTranslations } from "next-intl";

export type InvitationRow = {
id: string;
Expand All @@ -39,6 +40,8 @@ export default function InvitationsTable({
const [selectedInvitation, setSelectedInvitation] =
useState<InvitationRow | null>(null);

const t = useTranslations();

const api = createApiClient(useEnvContext());
const { org } = useOrgContext();

Expand All @@ -51,7 +54,7 @@ export default function InvitationsTable({
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" className="h-8 w-8 p-0">
<span className="sr-only">Open menu</span>
<span className="sr-only">{t('openMenu')}</span>
<MoreHorizontal className="h-4 w-4" />
</Button>
</DropdownMenuTrigger>
Expand All @@ -62,7 +65,7 @@ export default function InvitationsTable({
setSelectedInvitation(invitation);
}}
>
<span>Regenerate Invitation</span>
<span>{t('inviteRegenerate')}</span>
</DropdownMenuItem>
<DropdownMenuItem
onClick={() => {
Expand All @@ -71,7 +74,7 @@ export default function InvitationsTable({
}}
>
<span className="text-red-500">
Remove Invitation
{t('inviteRemove')}
</span>
</DropdownMenuItem>
</DropdownMenuContent>
Expand All @@ -81,11 +84,11 @@ export default function InvitationsTable({
},
{
accessorKey: "email",
header: "Email"
header: t('email')
},
{
accessorKey: "expiresAt",
header: "Expires At",
header: t('expiresAt'),
cell: ({ row }) => {
const expiresAt = new Date(row.original.expiresAt);
const isExpired = expiresAt < new Date();
Expand All @@ -99,7 +102,7 @@ export default function InvitationsTable({
},
{
accessorKey: "role",
header: "Role"
header: t('role')
}
];

Expand All @@ -112,17 +115,16 @@ export default function InvitationsTable({
.catch((e) => {
toast({
variant: "destructive",
title: "Failed to remove invitation",
description:
"An error occurred while removing the invitation."
title: t('inviteRemoveError'),
description: t('inviteRemoveErrorDescription')
});
});

if (res && res.status === 200) {
toast({
variant: "default",
title: "Invitation removed",
description: `The invitation for ${selectedInvitation.email} has been removed.`
title: t('inviteRemoved'),
description: t('inviteRemovedDescription', {email: selectedInvitation.email})
});

setInvitations((prev) =>
Expand All @@ -146,23 +148,20 @@ export default function InvitationsTable({
dialog={
<div className="space-y-4">
<p>
Are you sure you want to remove the invitation for{" "}
<b>{selectedInvitation?.email}</b>?
{t('inviteQuestionRemove', {email: selectedInvitation?.email || ''})}
</p>
<p>
Once removed, this invitation will no longer be
valid. You can always re-invite the user later.
{t('inviteMessageRemove')}
</p>
<p>
To confirm, please type the email address of the
invitation below.
{t('inviteMessageConfirm')}
</p>
</div>
}
buttonText="Confirm Remove Invitation"
buttonText={t('inviteRemoveConfirm')}
onConfirm={removeInvitation}
string={selectedInvitation?.email ?? ""}
title="Remove Invitation"
title={t('inviteRemove')}
/>
<RegenerateInvitationForm
open={isRegenerateModalOpen}
Expand Down
Loading