UNPKG

@gftdcojp/weblate-nextjs-sdk

Version:

A Next.js SDK for integrating with Weblate translation management system

295 lines (224 loc) 7.64 kB
# Weblate Next.js SDK [![npm version](https://badge.fury.io/js/@gftdcojp%2Fweblate-nextjs-sdk.svg)](https://badge.fury.io/js/@gftdcojp%2Fweblate-nextjs-sdk) [![CI](https://github.com/gftdcojp/weblate-nextjs-sdk/workflows/CI/badge.svg)](https://github.com/gftdcojp/weblate-nextjs-sdk/actions) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?style=flat&logo=typescript&logoColor=white)](https://www.typescriptlang.org/) A powerful and easy-to-use SDK for integrating Weblate translation management system with Next.js applications. ## Features - 🌐 **Full Weblate API Integration** - Complete support for Weblate's REST API -**React Hooks** - Modern React hooks for managing translations and languages - 🎯 **TypeScript Support** - Full TypeScript support with comprehensive type definitions - 🔄 **Real-time Updates** - Live translation updates using SWR - 🌍 **Multi-language Support** - Easy language switching and management - 🎨 **Next.js Optimized** - Built specifically for Next.js applications - 📦 **Lightweight** - Minimal dependencies and optimized bundle size ## Installation ```bash # Using pnpm (recommended) pnpm install @gftdcojp/weblate-nextjs-sdk # Using npm npm install @gftdcojp/weblate-nextjs-sdk # Using yarn yarn add @gftdcojp/weblate-nextjs-sdk ``` ## Quick Start ### 1. Setup WeblateProvider Wrap your app with the WeblateProvider: ```tsx import { WeblateProvider } from '@gftdcojp/weblate-nextjs-sdk'; const weblateConfig = { baseUrl: process.env.NEXT_PUBLIC_WEBLATE_URL, apiKey: process.env.WEBLATE_API_KEY, }; function App({ Component, pageProps }) { return ( <WeblateProvider config={weblateConfig} defaultLanguage="en"> <Component {...pageProps} /> </WeblateProvider> ); } ``` ### 2. Use Translation Hooks ```tsx import { useTranslation, useWeblate } from '@gftdcojp/weblate-nextjs-sdk'; function MyComponent() { const { client, currentLanguage } = useWeblate(); const { translations, isLoading, error } = useTranslation({ componentSlug: 'my-component', languageCode: currentLanguage, client, }); if (isLoading) return <div>Loading...</div>; if (error) return <div>Error: {error.message}</div>; return ( <div> <h1>{translations['welcome'] || 'Welcome'}</h1> </div> ); } ``` ### 3. Language Management ```tsx import { useLanguage, useWeblate } from '@gftdcojp/weblate-nextjs-sdk'; function LanguageSelector() { const { client } = useWeblate(); const { languages, currentLanguage, setLanguage } = useLanguage({ client, }); return ( <select value={currentLanguage?.code || ''} onChange={(e) => setLanguage(e.target.value)} > {languages.map((lang) => ( <option key={lang.code} value={lang.code}> {lang.name} </option> ))} </select> ); } ``` ## Configuration ### Environment Variables ```env NEXT_PUBLIC_WEBLATE_URL=https://your-weblate-instance.com WEBLATE_API_KEY=your-api-key ``` ### WeblateConfig ```typescript interface WeblateConfig { baseUrl: string; // Weblate instance URL apiKey: string; // API key for authentication timeout?: number; // Request timeout (default: 10000ms) retries?: number; // Number of retries (default: 3) } ``` ## API Reference ### Hooks #### `useWeblate()` Returns the Weblate context with client and language state. #### `useTranslation(options)` Fetches translations for a specific component and language. **Options:** - `componentSlug: string` - Component slug - `languageCode: string` - Language code - `client: WeblateClient` - Weblate client instance #### `useLanguage(options)` Manages available languages and current language selection. **Options:** - `client: WeblateClient` - Weblate client instance - `defaultLanguage?: string` - Default language code #### `useT(key, defaultValue?, options?)` Simple hook for getting a single translation. #### `useUpdateTranslation(client)` Hook for updating translations. ### Client Methods #### `WeblateClient` - `getProjects()` - Get all projects - `getProject(slug)` - Get specific project - `getComponents(projectSlug)` - Get project components - `getTranslations(componentSlug)` - Get component translations - `getTranslation(componentSlug, languageCode)` - Get specific translation - `getUnits(translationId)` - Get translation units - `updateUnit(unitId, target)` - Update translation unit - `getStatistics(componentSlug, languageCode)` - Get translation statistics - `searchUnits(query, component?, language?)` - Search translation units - `getLanguages()` - Get available languages ## Advanced Usage ### Custom Client ```typescript import { createWeblateClient } from '@gftdcojp/weblate-nextjs-sdk'; const client = createWeblateClient({ baseUrl: 'https://your-weblate-instance.com', apiKey: 'your-api-key', timeout: 5000, retries: 2, }); // Use client directly const projects = await client.getProjects(); ``` ### Error Handling ```tsx import { WeblateApiError } from '@gftdcojp/weblate-nextjs-sdk'; function MyComponent() { const { translations, error } = useTranslation(options); if (error) { if (error instanceof WeblateApiError) { console.error('API Error:', error.code, error.message); } return <div>Translation error occurred</div>; } return <div>{translations['key']}</div>; } ``` ### Server-Side Rendering ```tsx import { GetServerSideProps } from 'next'; import { createWeblateClient } from '@gftdcojp/weblate-nextjs-sdk'; export const getServerSideProps: GetServerSideProps = async (context) => { const client = createWeblateClient({ baseUrl: process.env.WEBLATE_URL, apiKey: process.env.WEBLATE_API_KEY, }); const translations = await client.getTranslation( 'my-component', context.locale || 'en' ); return { props: { translations, }, }; }; ``` ## Type Definitions The SDK provides comprehensive TypeScript definitions for all Weblate API objects: - `WeblateProject` - `WeblateComponent` - `WeblateLanguage` - `WeblateTranslation` - `WeblateUnit` - `WeblateStats` - And more... ## Versioning This project uses **CalVer** (Calendar Versioning) with the format `YYYY.MM.MICRO`: - **YYYY**: 4-digit year (e.g., 2025) - **MM**: 2-digit month (e.g., 07 for July) - **MICRO**: Incremental release number within the month (starting from 1) ### Examples - `2025.07.1` - First release in July 2025 - `2025.07.2` - Second release in July 2025 - `2025.08.1` - First release in August 2025 ### Release Commands ```bash # Micro release (increment within current month) pnpm run calver pnpm run release # Major release (reset to .1 for current month) pnpm run calver:major pnpm run release:major ``` ## Contributing 1. Fork the repository 2. Create a feature branch 3. Make your changes 4. Add tests 5. Submit a pull request ## License MIT License. See [LICENSE](LICENSE) for details. ## Support - [GitHub Issues](https://github.com/gftdcojp/weblate-nextjs-sdk/issues) - [Weblate Documentation](https://docs.weblate.org/) - [npm Package](https://www.npmjs.com/package/@gftdcojp/weblate-nextjs-sdk) ## Roadmap - [ ] Support for Weblate's GraphQL API - [ ] Built-in caching strategies - [ ] Offline translation support - [ ] Translation management UI components - [ ] Integration with Next.js i18n - [ ] Support for translation editing - [ ] Batch translation operations - [ ] Advanced filtering and search - [ ] Translation validation hooks - [ ] Performance optimization tools