Skip to content

Commit 348eb7d

Browse files
committed
nextjs-app-router: review fixes after the Babelize run
- Read the locale inside <Suspense>: create-next-app 16.4 enables cacheComponents, and the generated i18n/request.ts reads cookies and headers, which failed next build - Keep the brand name Tasklane untranslated - Replace the 1/many ternary with one ICU plural message - Translate the page title and description through generateMetadata - Correct translations in fr, de and ja
1 parent d63ae53 commit 348eb7d

7 files changed

Lines changed: 81 additions & 69 deletions

File tree

‎nextjs-app-router/app/layout.tsx‎

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
import type { Metadata } from "next";
2+
import { Suspense } from "react";
3+
import { NextIntlClientProvider } from "next-intl";
4+
import { getTranslations } from "next-intl/server";
25
import "./globals.css";
3-
import { NextIntlClientProvider } from 'next-intl';
46

5-
export const metadata: Metadata = {
6-
title: "Tasklane: the to-do list for small teams",
7-
description: "Plan the week, share tasks and see what is due, in one simple list.",
8-
};
7+
export async function generateMetadata(): Promise<Metadata> {
8+
const t = await getTranslations("metadata");
9+
return { title: t("title"), description: t("description") };
10+
}
911

1012
export default function RootLayout({ children }: LayoutProps<"/">) {
1113
return (
1214
<html lang="en">
13-
<body><NextIntlClientProvider>{children}</NextIntlClientProvider></body>
15+
<body>
16+
{/* The locale comes from a cookie or Accept-Language, which is request
17+
data: with cacheComponents it has to be read inside <Suspense>. */}
18+
<Suspense>
19+
<NextIntlClientProvider>{children}</NextIntlClientProvider>
20+
</Suspense>
21+
</body>
1422
</html>
1523
);
1624
}

‎nextjs-app-router/components/Header.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export function Header() {
55
return (
66
<header>
77
<a href="/" className="logo" aria-label={t("header.tasklaneHome")}>
8-
{t("header.tasklane")}
8+
Tasklane
99
</a>
1010
<nav aria-label={t("header.main")}>
1111
<a href="#features">{t("header.features")}</a>

‎nextjs-app-router/components/TaskSummary.tsx‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,5 @@ import { useTranslations } from "next-intl";
22

33
export function TaskSummary({ dueToday }: { dueToday: number }) {
44
const t = useTranslations();
5-
return (
6-
<p className="summary">
7-
{dueToday === 1 ? t("task-summary.1TaskIsDueToday") : t("task-summary.duetodayTasksAreDueToday", { dueToday })}
8-
</p>
9-
);
5+
return <p className="summary">{t("task-summary.tasksDueToday", { count: dueToday })}</p>;
106
}

‎nextjs-app-router/public/locales/de.json‎

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,34 @@
66
"header": {
77
"features": "Funktionen",
88
"logIn": "Anmelden",
9-
"main": "Hauptsache",
9+
"main": "Hauptmenü",
1010
"pricing": "Preise",
11-
"tasklane": "Tasklane",
12-
"tasklaneHome": "Das Haus von Tasklane"
11+
"tasklaneHome": "Tasklane-Startseite"
12+
},
13+
"metadata": {
14+
"title": "Tasklane: die To-do-Liste für kleine Teams",
15+
"description": "Planen Sie die Woche, teilen Sie Aufgaben und sehen Sie, was fällig ist – in einer einfachen Liste."
1316
},
1417
"page": {
15-
"addTasksOnTheTrain": "Fügen Sie Aufgaben auf dem Zug hinzu. Sie synchronisieren, wenn Sie wieder online sind.",
16-
"dueDatesThatMakeSense": "Verfallstermine, die sinnvoll sind",
17-
"everyoneSeesTheSameTasks": "Jeder sieht die gleichen Aufgaben, also verliert sich nichts im Chat.",
18+
"addTasksOnTheTrain": "Fügen Sie Aufgaben im Zug hinzu. Sie werden synchronisiert, sobald Sie wieder online sind.",
19+
"dueDatesThatMakeSense": "Fälligkeiten, die Sinn ergeben",
20+
"everyoneSeesTheSameTasks": "Alle sehen dieselben Aufgaben, sodass nichts im Chat untergeht.",
1821
"features": "Funktionen",
19-
"freeForUpTo5": "Kostenlos für bis zu fünf Personen, keine Kreditkarte erforderlich.",
20-
"madeForTeamsWhoWould": "Für Teams gemacht, die es vorziehen, Dinge zu erledigen.",
22+
"freeForUpTo5": "Kostenlos für bis zu 5 Personen. Keine Kreditkarte nötig.",
23+
"madeForTeamsWhoWould": "Für Teams, die Dinge lieber erledigen.",
2124
"oneListForTheWhole": "Eine Liste für das ganze Team",
22-
"planTheWeekShareTasks": "Planen Sie die Woche, teilen Sie Aufgaben und sehen Sie, was zu tun ist, in einer einfachen Liste.",
23-
"startFree": "Beginnen Sie frei",
24-
"tasklaneGroupsWorkIntoToday": "Tasklane-Gruppen arbeiten heute, in dieser Woche und später.",
25-
"theToDoListForSmall": "Die Aufgabenliste für kleine Teams",
26-
"worksOffline": "Wirkt offline"
25+
"planTheWeekShareTasks": "Planen Sie die Woche, teilen Sie Aufgaben und sehen Sie, was fällig ist – in einer einfachen Liste.",
26+
"startFree": "Kostenlos starten",
27+
"tasklaneGroupsWorkIntoToday": "Tasklane ordnet Aufgaben nach heute, diese Woche und später.",
28+
"theToDoListForSmall": "Die To-do-Liste für kleine Teams",
29+
"worksOffline": "Funktioniert offline"
2730
},
2831
"signup-form": {
29-
"createMyList": "Erstellen Sie meine Liste",
30-
"thanksWeSentALink": "Wir haben einen Link zu {email} gesendet.",
31-
"workEmail": "Arbeits-E-Mail"
32+
"createMyList": "Meine Liste erstellen",
33+
"thanksWeSentALink": "Danke! Wir haben einen Link an {email} gesendet.",
34+
"workEmail": "Geschäftliche E-Mail"
3235
},
3336
"task-summary": {
34-
"1TaskIsDueToday": "Heute ist eine Aufgabe zu erfüllen",
35-
"duetodayTasksAreDueToday": "Heute sind {dueToday} Aufgaben fällig"
37+
"tasksDueToday": "{count, plural, one {# Aufgabe ist heute fällig} other {# Aufgaben sind heute fällig}}"
3638
}
3739
}

‎nextjs-app-router/public/locales/en.json‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88
"logIn": "Log in",
99
"main": "Main",
1010
"pricing": "Pricing",
11-
"tasklane": "Tasklane",
1211
"tasklaneHome": "Tasklane home"
1312
},
13+
"metadata": {
14+
"title": "Tasklane: the to-do list for small teams",
15+
"description": "Plan the week, share tasks and see what is due, in one simple list."
16+
},
1417
"page": {
1518
"addTasksOnTheTrain": "Add tasks on the train. They sync when you are back online.",
1619
"dueDatesThatMakeSense": "Due dates that make sense",
@@ -31,7 +34,6 @@
3134
"workEmail": "Work email"
3235
},
3336
"task-summary": {
34-
"1TaskIsDueToday": "1 task is due today",
35-
"duetodayTasksAreDueToday": "{dueToday} tasks are due today"
37+
"tasksDueToday": "{count, plural, one {# task is due today} other {# tasks are due today}}"
3638
}
3739
}

‎nextjs-app-router/public/locales/fr.json‎

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,34 @@
66
"header": {
77
"features": "Fonctionnalités",
88
"logIn": "Se connecter",
9-
"main": "Principaux",
9+
"main": "Principal",
1010
"pricing": "Tarifs",
11-
"tasklane": "pour les enfants",
12-
"tasklaneHome": "La maison de Tasklane"
11+
"tasklaneHome": "Accueil Tasklane"
12+
},
13+
"metadata": {
14+
"title": "Tasklane : la liste de tâches des petites équipes",
15+
"description": "Planifiez la semaine, partagez les tâches et voyez ce qui arrive à échéance, dans une seule liste."
1316
},
1417
"page": {
15-
"addTasksOnTheTrain": "Ajoutez des tâches sur le train, elles se synchronisent quand vous êtes en ligne.",
16-
"dueDatesThatMakeSense": "Des dates d'échéance qui ont du sens",
17-
"everyoneSeesTheSameTasks": "Tout le monde voit les mêmes tâches, donc rien ne se perd dans le chat.",
18+
"addTasksOnTheTrain": "Ajoutez des tâches dans le train. Elles se synchronisent dès que vous êtes de nouveau en ligne.",
19+
"dueDatesThatMakeSense": "Des échéances qui ont du sens",
20+
"everyoneSeesTheSameTasks": "Tout le monde voit les mêmes tâches : rien ne se perd dans les discussions.",
1821
"features": "Fonctionnalités",
19-
"freeForUpTo5": "Gratuit pour 5 personnes, pas besoin de carte de crédit.",
20-
"madeForTeamsWhoWould": "Fait pour les équipes qui préfèrent faire les choses.",
21-
"oneListForTheWhole": "Une liste pour toute l' équipe",
22-
"planTheWeekShareTasks": "Planifiez la semaine, partagez les tâches et voyez ce qu'il faut faire, dans une simple liste.",
22+
"freeForUpTo5": "Gratuit jusqu'à 5 personnes. Sans carte bancaire.",
23+
"madeForTeamsWhoWould": "Conçu pour les équipes qui préfèrent avancer.",
24+
"oneListForTheWhole": "Une seule liste pour toute l'équipe",
25+
"planTheWeekShareTasks": "Planifiez la semaine, partagez les tâches et voyez ce qui arrive à échéance, dans une seule liste.",
2326
"startFree": "Commencez gratuitement",
24-
"tasklaneGroupsWorkIntoToday": "Les groupes Tasklane travaillent aujourd'hui, cette semaine et plus tard.",
25-
"theToDoListForSmall": "La liste des tâches pour les petites équipes",
27+
"tasklaneGroupsWorkIntoToday": "Tasklane classe le travail en aujourd'hui, cette semaine et plus tard.",
28+
"theToDoListForSmall": "La liste de tâches des petites équipes",
2629
"worksOffline": "Fonctionne hors ligne"
2730
},
2831
"signup-form": {
29-
"createMyList": "Créez ma liste",
30-
"thanksWeSentALink": "Nous avons envoyé un lien vers {email}.",
31-
"workEmail": "E-mail de travail"
32+
"createMyList": "Créer ma liste",
33+
"thanksWeSentALink": "Merci ! Nous avons envoyé un lien à {email}.",
34+
"workEmail": "E-mail professionnel"
3235
},
3336
"task-summary": {
34-
"1TaskIsDueToday": "Une tâche est due aujourd'hui",
35-
"duetodayTasksAreDueToday": "{dueToday} tâches doivent être effectuées aujourd'hui"
37+
"tasksDueToday": "{count, plural, one {# tâche arrive à échéance aujourd'hui} other {# tâches arrivent à échéance aujourd'hui}}"
3638
}
3739
}

‎nextjs-app-router/public/locales/ja.json‎

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,34 @@
66
"header": {
77
"features": "機能",
88
"logIn": "ログイン",
9-
"main": "メイン・ウェイン",
9+
"main": "メイン",
1010
"pricing": "料金",
11-
"tasklane": "タスクラン",
12-
"tasklaneHome": "タスクランの家"
11+
"tasklaneHome": "Tasklane ホーム"
12+
},
13+
"metadata": {
14+
"title": "Tasklane:小さなチームのための ToDo リスト",
15+
"description": "1週間の計画、タスクの共有、期限の確認を、ひとつのシンプルなリストで。"
1316
},
1417
"page": {
15-
"addTasksOnTheTrain": "電車で作業を加え オンラインに戻ると同期します",
16-
"dueDatesThatMakeSense": "決済日期が意味のあること",
17-
"everyoneSeesTheSameTasks": "誰もが同じ作業を 見ているので,チャットでは何も失われません.",
18+
"addTasksOnTheTrain": "電車の中でもタスクを追加できます。オンラインに戻ると同期されます。",
19+
"dueDatesThatMakeSense": "わかりやすい期限管理",
20+
"everyoneSeesTheSameTasks": "全員が同じタスクを見られるので、チャットで埋もれることはありません。",
1821
"features": "機能",
19-
"freeForUpTo5": "5人まで無料です クレジットカードは必要ありません",
20-
"madeForTeamsWhoWould": "仕上げたいチームのために作られました",
21-
"oneListForTheWhole": "チーム全員に1つのリストがある",
22-
"planTheWeekShareTasks": "一週間を計画し 課題を共有し 簡単なリストで 必要なものを見つけましょう",
23-
"startFree": "無料でスタートする",
24-
"tasklaneGroupsWorkIntoToday": "タスクラングループは今日,今週,そして後日,",
25-
"theToDoListForSmall": "小規模なチームでのタスクリスト",
26-
"worksOffline": "オフラインで動作する"
22+
"freeForUpTo5": "5人まで無料。クレジットカードは不要です。",
23+
"madeForTeamsWhoWould": "やるべきことを片付けたいチームのために。",
24+
"oneListForTheWhole": "チーム全員でひとつのリスト",
25+
"planTheWeekShareTasks": "1週間の計画、タスクの共有、期限の確認を、ひとつのシンプルなリストで。",
26+
"startFree": "無料で始める",
27+
"tasklaneGroupsWorkIntoToday": "Tasklane は作業を「今日」「今週」「それ以降」に分けて整理します。",
28+
"theToDoListForSmall": "小さなチームのための ToDo リスト",
29+
"worksOffline": "オフラインでも使える"
2730
},
2831
"signup-form": {
29-
"createMyList": "私のリストを作成する",
30-
"thanksWeSentALink": "{email}にリンクを送りました",
31-
"workEmail": "職場のメール"
32+
"createMyList": "リストを作成",
33+
"thanksWeSentALink": "ありがとうございます!{email} にリンクを送信しました。",
34+
"workEmail": "仕事用メールアドレス"
3235
},
3336
"task-summary": {
34-
"1TaskIsDueToday": "今日も1つの課題がある",
35-
"duetodayTasksAreDueToday": "{dueToday}の任務が予定されている"
37+
"tasksDueToday": "{count, plural, other {今日が期限のタスク:#件}}"
3638
}
3739
}

0 commit comments

Comments
 (0)