Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
b73586f
fix: Follow-up for #1573 to also handle the case when a non-default l…
amannn Nov 26, 2024
b44c8ef
Merge branch 'main' into canary
amannn Jan 21, 2025
b4de1a0
Merge remote-tracking branch 'origin/main' into canary
amannn Feb 17, 2025
84fe6d0
fix: Add workaround for OpenTelemetry/Zone.js (#1718)
amannn Feb 17, 2025
eade8d9
Merge remote-tracking branch 'origin/main' into canary
amannn Mar 12, 2025
19e339e
fix: Handle default exports correctly for `moduleResolution: 'node'` …
amannn Mar 12, 2025
ad6f306
fix: downgrade deps
amannn Mar 12, 2025
fdaddc5
fix: Patch version
amannn Mar 12, 2025
ad8d7c5
feat: Support stable turbo config in Next.js 15.3
amannn Apr 17, 2025
5cb0f4d
Upgrade to Next.js 15.3
amannn Apr 17, 2025
ac88b91
Merge remote-tracking branch 'origin/main' into canary
amannn Apr 17, 2025
b2e2aa5
fix lint
amannn Apr 17, 2025
bac7310
Merge remote-tracking branch 'origin/canary' into feat/1838-stable-tu…
amannn Apr 17, 2025
58b4a57
fix: Support stable Turbopack config (#1849)
amannn Apr 17, 2025
79fdcdc
Handle case if using experimental turbo config
amannn Apr 22, 2025
6918a47
Merge branch 'feat/1838-stable-turbo-config' into canary
amannn Apr 22, 2025
d5ffd72
Merge remote-tracking branch 'origin/main' into canary
amannn Apr 23, 2025
09b34ea
feat: Add `forcePrefix` option for `redirect` and `getPathname` (#1864)
amannn Apr 23, 2025
e629aa8
Update packages/next-intl/src/navigation/shared/createSharedNavigatio…
amannn Apr 23, 2025
69ae8e7
Wording
amannn Apr 24, 2025
0b3a5c6
Merge remote-tracking branch 'origin/main' into canary
amannn Jun 11, 2025
282196c
feat: Encode non-ASCII characters in pathnames returned from navigati…
amannn Jun 11, 2025
69cdf47
Add test for alternate links
amannn Jun 11, 2025
8172ea2
fix: Don't encode hashes in unknown pathnames
amannn Jun 24, 2025
c596c85
fix: Handle hashes in pathnames correctly when using `trailingSlash: …
amannn Jun 24, 2025
3f78906
Merge branch 'main' into canary
amannn Jun 24, 2025
025af7b
Merge branch 'canary' into fix/unknown-pathnames-encoding
amannn Jun 24, 2025
4ada87c
fix: Release
amannn Jun 24, 2025
f4ce836
Merge remote-tracking branch 'origin/main' into canary
amannn Jun 30, 2025
92d8a58
fix: Ensure cookie is synced before navigation with `useRouter` (#1946)
amannn Jun 30, 2025
7a3e132
Merge branch 'main' into canary
amannn Oct 15, 2025
f0249be
fix: Trusted publishers
amannn Oct 15, 2025
f500482
Merge remote-tracking branch 'origin/main' into canary
amannn Nov 4, 2025
2b3a9ce
feat: Add `useExtracted` (experimental) (#2078)
amannn Nov 5, 2025
5dfd0f5
Minor improvement for LRU cache eviction
amannn Nov 5, 2025
d29ce7b
plugin reference docs
amannn Nov 5, 2025
c8efecc
fix script
amannn Nov 5, 2025
e7eb9dd
fix: keep ids used in other files
amannn Nov 6, 2025
e99a61d
docs
amannn Nov 6, 2025
4481378
blog post draft
amannn Nov 6, 2025
75ea108
Merge remote-tracking branch 'origin/main' into canary
amannn Nov 7, 2025
d478b4e
post wording updates
amannn Nov 7, 2025
0ba5a18
more robust meta parsing for po parser
amannn Nov 7, 2025
75af761
fix: don't export _useExtracted
amannn Nov 7, 2025
1d5dd9f
size
amannn Nov 7, 2025
2070129
fix test
amannn Nov 7, 2025
2bb68f8
finalize blog article
amannn Nov 7, 2025
7e95eb2
docs finishing touches
amannn Nov 7, 2025
79f89da
styling fix
amannn Nov 7, 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
Binary file added docs/public/blog/use-extracted/demo-01.mp4
Binary file not shown.
Binary file added docs/public/blog/use-extracted/demo-02.mp4
Binary file not shown.
Binary file added docs/public/blog/use-extracted/demo-03.mp4
Binary file not shown.
Binary file added docs/public/blog/use-extracted/demo-04.mp4
Binary file not shown.
Binary file added docs/public/blog/use-extracted/demo-05.mp4
Binary file not shown.
Binary file added docs/public/i18n-ally-extracted-message.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions docs/src/components/BlogVideo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import {ComponentProps} from 'react';
import Video from './Video';

export default function BlogVideo(
props: Omit<ComponentProps<typeof Video>, 'className'>
) {
return <Video className="-mx-3 my-5 xl:-mx-6 xl:my-8" {...props} />;
}
8 changes: 4 additions & 4 deletions docs/src/components/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ export default function Footer() {
<FooterVersionSelector />
</div>
<div>
<FooterLink href={config.blueskyUrl} target="_blank">
Bluesky
</FooterLink>
<FooterSeparator />
<FooterLink href={config.xUrl} target="_blank">
X
</FooterLink>
<FooterSeparator />
<FooterLink href={config.blueskyUrl} target="_blank">
Bluesky
</FooterLink>
<FooterSeparator />
<FooterLink href={config.githubUrl} target="_blank">
GitHub
</FooterLink>
Expand Down
2 changes: 1 addition & 1 deletion docs/src/components/StayUpdated.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

**Let's keep in touch:**

- [Bluesky (Jan Amann)](https://bsky.app/profile/amann.work)
- [X (Jan Amann)](https://x.com/jamannnnnn)
- [Bluesky (Jan Amann)](https://bsky.app/profile/amann.work)
99 changes: 99 additions & 0 deletions docs/src/components/Video.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/* eslint-disable jsx-a11y/media-has-caption */
import clsx from 'clsx';
import {ComponentProps, useEffect, useRef, useState} from 'react';
import useIsMobile from '../hooks/useIsMobile';

export default function Video({
className,
...props
}: Omit<ComponentProps<'video'>, 'controls'>) {
const videoRef = useRef<HTMLVideoElement>(null);
const [isPlaying, setIsPlaying] = useState(false);
const isMobile = useIsMobile();

function onTogglePlay() {
setIsPlaying(!isPlaying);
}

function handleVideoEnd() {
setIsPlaying(false);
}

function handleVideoPlay() {
setIsPlaying(true);
}

function handleVideoPause() {
setIsPlaying(false);
}

useEffect(() => {
const video = videoRef.current;
if (!video) return;

if (isPlaying) {
video.play();
} else {
video.pause();
}
}, [isPlaying]);

useEffect(() => {
const video = videoRef.current;
if (!video) return;

function handlePlayEvent() {
handleVideoPlay();
}

function handlePauseEvent() {
handleVideoPause();
}

function handleEndedEvent() {
handleVideoEnd();
}

video.addEventListener('play', handlePlayEvent);
video.addEventListener('pause', handlePauseEvent);
video.addEventListener('ended', handleEndedEvent);

return () => {
video.removeEventListener('play', handlePlayEvent);
video.removeEventListener('pause', handlePauseEvent);
video.removeEventListener('ended', handleEndedEvent);
};
}, []);

return (
<div className={clsx('relative', className)}>
<video
ref={videoRef}
className="w-full cursor-pointer rounded-lg shadow-lg"
controls={isMobile}
{...props}
/>
{!isMobile && (
<button
aria-label={isPlaying ? 'Pause video' : 'Play video'}
className={clsx(
'absolute inset-0 flex items-center justify-center rounded-lg bg-black/10 transition-all hover:bg-black/20',
isPlaying
? 'transition-duration-500 opacity-0'
: 'transition-duration-200 opacity-100'
)}
onClick={onTogglePlay}
type="button"
>
<svg
className="h-16 w-16 text-white"
fill="currentColor"
viewBox="0 0 24 24"
>
<path d="M8 5v14l11-7z" />
</svg>
</button>
)}
</div>
);
}
21 changes: 21 additions & 0 deletions docs/src/hooks/useIsMobile.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import {useEffect, useState} from 'react';

export default function useIsMobile() {
const [isMobile, setIsMobile] = useState(false);

useEffect(() => {
function checkMobile() {
setIsMobile(window.innerWidth < 768 || 'ontouchstart' in window);
}

checkMobile();

window.addEventListener('resize', checkMobile);

return () => {
window.removeEventListener('resize', checkMobile);
};
}, []);

return isMobile;
}
3 changes: 2 additions & 1 deletion docs/src/pages/api/og-image.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ export default async function OG(req: Request) {
lineHeight: 1.1,
letterSpacing: -2,
marginRight: 12,
fontWeight: 500
fontWeight: 500,
color: '#55556D'
}}
>
{subtitle}
Expand Down
4 changes: 4 additions & 0 deletions docs/src/pages/blog/_meta.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ export default {
index: {
title: 'Overview'
},
'use-extracted': {
title: 'useExtracted: The Tailwind of i18n?',
display: 'hidden'
},
'next-intl-4-0': {
title: 'next-intl 4.0',
display: 'hidden'
Expand Down
6 changes: 6 additions & 0 deletions docs/src/pages/blog/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ import StayUpdated from '@/components/StayUpdated.mdx';
# next-intl blog

<div className="flex flex-col gap-4 py-8">
<BlogPostLink
href="/blog/use-extracted"
title="useExtracted: The Tailwind of i18n?"
date="Nov 7, 2025"
author="By Jan Amann"
/>
<BlogPostLink
href="/blog/next-intl-4-0"
title="next-intl 4.0"
Expand Down
Loading