i18.dev
HomePricingquick setupinstall cli

Built to make you extraordinarily productive, i18.dev is the best way to localize.

Detects hardcoded strings automatically
Generates organized, semantic keys
Auto-translates 100+ languages
Returns refactored, i18n-ready code

Stop writing i18n boilerplate.
Forever.

You know the drill: find every "Save", "Loading...", "User not found". Wrap in t(). Invent keys. Manage locale JSON.

i18.dev detects hardcoded strings, suggests semantic keys, auto-translates to 100+ languages, and refactors your code.

2 days15 minutes
AI Code Extractor
LoginForm.tsx
function LoginForm() {
return (
<div>
<h1>"Welcome back!"</h1>
<p>"Please sign in"</p>
<button>"Sign In"</button>
</div>
);
}
Extract Strings
Results3 strings
{
"welcome_back": "Welcome back!",
"please_sign_in": "Please sign in",
"button_sign_in": "Sign In"
}
- "Welcome back!"
+ t('welcome_back')

You focus on features, not i18n plumbing.

Read the docs

Everything you need to localize, in one powerful platform.

AI String Extraction

Automatically detect and extract translatable strings from your codebase using advanced AI.

LoginForm.tsx
<h1>"Welcome back!"</h1>
<button>"Sign In"</button>
+12 strings extracted
Detects hardcoded strings automatically
Supports React, Vue, Angular, and more

Smart Key Generation

Generate semantic, organized translation keys automatically.

auth
welcome
signIn
forgotPassword
dashboard
title
settings

AI Translation

Context-aware translations powered by advanced AI.

ENWelcome back
ESBienvenido de nuevo
JPおかえりなさい

Version Control

Track changes, create versions, and roll back when needed.

v1.2.0 (latest)
v1.1.0
v1.0.0

Team Collaboration

Invite team members, manage permissions, and work together.

JD
SK
MR
AL
+8 more
AdminEditorViewer

CLI & API

Full-featured CLI and REST API for programmatic access.

$ i18dev pull
✓ Fetched 1,247 translations
✓ Updated en.json, es.json
✓ Done in 0.42s
REST APIWebhooks

Set Up Guide

Choose your i18n library and copy a ready-to-use integration setup.

Integration

i18n Libraries

▲

next-intl

Internationalization for Next.js that gets out of your way

Cursor AI Prompt

Copy this prompt and paste it into Cursor AI for quick integration setup

1

Install next-intl

Terminal
npm install next-intl
2

File Structure

your-project/
├── messages/
│   ├── en.json
│   ├── es.json
│   └── fr.json
├── scripts/
│   └── pull-translations.js
├── next.config.js
└── i18n.ts
3

Environment Variables

.env
I18DEV_API_KEY=your-project-api-key
I18DEV_BASE_URL=https://i18-dev-sass.vercel.app/
I18DEV_MESSAGES_PATH=messages
4

Pull Script

Create scripts/pull-translations.js

scripts/pull-translations.js
// pull-translations.js - For next-intl
const fs = require('fs');
const path = require('path');
const https = require('https');

const BASE_URL = process.env.I18DEV_BASE_URL || 'https://i18.dev';
const API_KEY = process.env.I18DEV_API_KEY || 'your-project-api-key';
const MESSAGES_PATH = process.env.I18DEV_MESSAGES_PATH || 'messages';

const API_URL = `${BASE_URL}/api/download-translations?projectId=${API_KEY}`;
const MESSAGES_DIR = path.join(__dirname, '..', MESSAGES_PATH);

async function fetchTranslations() {
  return new Promise((resolve, reject) => {
    const req = https.get(API_URL, (res) => {
      let data = '';
      res.on('data', (chunk) => { data += chunk; });
      res.on('end', () => {
        try {
          resolve(JSON.parse(data));
        } catch (error) {
          reject(new Error(`Failed to parse JSON: ${error.message}`));
        }
      });
    });
    req.on('error', reject);
    req.setTimeout(10000, () => { req.destroy(); reject(new Error('Timeout')); });
  });
}

function ensureDir(dirPath) {
  if (!fs.existsSync(dirPath)) fs.mkdirSync(dirPath, { recursive: true });
}

function updateMessageFiles(translations) {
  ensureDir(MESSAGES_DIR);
  
  Object.entries(translations).forEach(([locale, content]) => {
    const filePath = path.join(MESSAGES_DIR, `${locale}.json`);
    fs.writeFileSync(filePath, JSON.stringify(content, null, 2));
    console.log(`✅ Updated ${locale}.json`);
  });
}

async function main() {
  console.log('🔄 Fetching translations...');
  const translations = await fetchTranslations();
  console.log('📝 Updating files...');
  updateMessageFiles(translations);
  console.log('✨ Done!');
}

main().catch(console.error);
5

Configure next-intl

Configuration
// i18n.ts
import {notFound} from 'next/navigation';
import {getRequestConfig} from 'next-intl/server';

const locales = ['en', 'es', 'fr'];

export default getRequestConfig(async ({locale}) => {
  if (!locales.includes(locale as any)) notFound();

  return {
    messages: (await import(`./messages/${locale}.json`)).default
  };
});
6

Usage Example

Component
// In your component
import {useTranslations} from 'next-intl';

export default function MyComponent() {
  const t = useTranslations('common');
  
  return <h1>{t('hello')}</h1>;
}
7

Pull Translations

Add the script to package.json and run:

npm
npm run pull
yarn
yarn pull
pnpm
pnpm pull

Try i18.dev now

Free for personal projects. No credit card required.

i18
© 2026 i18.dev
PrivacyTermsDocumentation