langsys/langsys-php के ऊपर एक पतली Laravel बाइंडिंग: @t Blade डायरेक्टिव, t() हेल्पर और लोकेल मिडलवेयर। आपके कोड में मौजूद वाक्यांश ही लुकअप की और बेस भाषा का डिफ़ॉल्ट भी है — न कोई कीज़ फ़ाइल, न कोई एक्सट्रैक्शन चरण। अनुवाद सर्वर पर होता है, इसलिए पेज पहले से स्थानीयकृत होकर पहुँचता है।

बैकएंड SDK, इसलिए इस पेज पर ब्राउज़र में चलने वाला प्लेग्राउंड नहीं है — ब्राउज़र PHP नहीं चला सकता। नीचे दिए हर उदाहरण का लाइव रूप डेमो ऐप है: उसे क्लोन करके php artisan serve चलाएँ, या Codespace में खोलें — यह एक असली PHP कंटेनर है जो उसे आपके लिए इंस्टॉल करके चला देता है। ऑटोमैटिक पेज अनुवाद और Inertia सीडिंग सहित पूरा पैकेज रेफ़रेंस Laravel SDK दस्तावेज़ में है।

AI कोडिंग एजेंट इस्तेमाल कर रहे हैं? उसे यह प्रॉम्प्ट दें
Add Langsys translation to this Laravel app.

1. Read https://docs.langsys.dev/llms.txt, then follow
   https://docs.langsys.dev/learn/sdk/laravel/ for the install and setup.
2. The English text in the code is the translation key. Wrap user-facing
   strings as they are: no keys file, no extraction step, and no
   hand-written plural or gender branches (Langsys generates those).
3. Read the Langsys project id and API key from environment variables.
   The write key is for development and servers only; anything shipped
   to the browser gets the read-only key.
4. Keep brand names and user-generated content out of translation.

इंस्टॉल करें

composer require langsys/langsys-php-laravel
php artisan vendor:publish --tag=langsys-config
.env
# The server can hold a WRITE key — unlike a browser app, it's never
# shipped to visitors. A write key is what lets new phrases register.
LANGSYS_API_KEY=your-api-key
LANGSYS_PROJECT_ID=your-project-id

अभी तक प्रोजेक्ट या कीज़ नहीं हैं? क्विकस्टार्ट दो मिनट में आपको दोनों दिला देता है।

मिडलवेयर

दो मिडलवेयर फ़्रेमवर्क का काम संभालते हैं: DetectLocale विज़िटर का लोकेल तय करता है (क्वेरी पैरामीटर, कुकी, सेशन, फिर Accept-Language) और उनकी पसंद को सहेजता है; FlushPendingRegistrations रिस्पॉन्स भेजे जाने के बाद नए खोजे गए फ़्रेज़ को Langsys को भेजता है, ताकि रजिस्ट्रेशन से पेज कभी धीमा न हो।

स्रोत देखें ↗
// bootstrap/app.php (Laravel 11/12)
->withMiddleware(function (Middleware $middleware) {
    $middleware->web(append: [
        // Resolves ?locale= / cookie / session / Accept-Language,
        // then persists the visitor's choice.
        \Langsys\Laravel\Http\Middleware\DetectLocale::class,
        // After the response is sent, registers any phrases
        // rendered for the first time.
        \Langsys\Laravel\Http\Middleware\FlushPendingRegistrations::class,
    ]);
})

Blade में अनुवाद करें

एक डायरेक्टिव: @t(phrase, category?, params?, locale?)। Params को {name} मार्कर से इंटरपोलेट किया जाता है — संख्याएँ और तारीखें लोकेल के अनुसार फ़ॉर्मैट होकर आती हैं — और आउटपुट HTML-एस्केप किया जाता है।

@t — इनलाइन स्ट्रिंग, पैरामीटर सहित स्रोत देखें ↗
<h1>@t('Welcome to our store', 'Home')</h1>
<p>@t('Hello, {name}! You have {count} new messages.', 'Greetings',
    ['name' => $name, 'count' => $count])</p>

PHP में कहीं भी

@t असल में एस्केपिंग वाला t() हेल्पर ही है — हेल्पर खुद कहीं भी काम करता है: कंट्रोलर, Livewire कंपोनेंट, जॉब, मेल, वैलिडेशन संदेश।

t() — वही जोड़, Blade की ज़रूरत नहीं स्रोत देखें ↗
// Controllers, Livewire components, jobs, mail — anywhere:
$title = t('Order confirmed', 'Checkout');
$body  = t('Your order {id} ships on {date}.', 'Checkout', [
    'id'   => (string) $order->number, // strings skip number formatting
    'date' => $order->ships_at,        // DateTime → locale-formatted
]);

बहुवचन

देखें · 1:14 बहुवचन रूप

वाक्य को सपाट रूप में लिखें: Langsys अनुवाद के दौरान हर लोकेल के बहुवचन रूप तैयार करता है — बेस लोकेल सहित — और SDK वही ब्रांच रेंडर करता है जो आपकी गिनती से मेल खाती है (ext-intl के ज़रिए पूर्ण ICU)। यह हर SDK में एक जैसा है, इसलिए वाक्यांश आपके बैकएंड और फ़्रंटएंड के बीच पोर्टेबल रहते हैं।

स्रोत देखें ↗
// Written flat. Langsys generates each locale's plural forms during
// translation (the base locale included) and the SDK picks the branch.
t('You have {count} items in your cart', 'Cart', ['count' => $count]);

Langsys द्वारा बनाए गए बहुवचन रूप PHP में langsys/langsys-php 1.3.2 से उपलब्ध हैं; इससे पहले के संस्करण हर संख्या के लिए बहुवचन रूप ही दिखाते हैं, 1 के लिए भी।

लिंग-अनुरूपता

स्पैनिश, फ़्रेंच या रूसी में {username} has been invited का रूप उस व्यक्ति के अनुसार बदलता है जिसके बारे में बात हो रही है। Langsys अनुवाद के दौरान ये शाखाएँ अपने आप बनाता है — ठीक वैसे ही जैसे बहुवचन रूप बनाता है — और आर्ग्युमेंट का नाम वेरिएबल के नाम में _gender जोड़कर रखा जाता है: male, female या other। जब भी यह जानकारी हो, इसे अवश्य दें। यह कैसे काम करता है, और जिन वाक्यांशों को इसकी ज़रूरत है उन्हें कैसे खोजें →

जेंडर आर्ग्युमेंट पास करना स्रोत देखें ↗
{{-- Pass the agreement argument alongside the value it inflects. --}}
@t('{username} has been invited', 'Team', [
    'username'        => $post->author->name,
    'username_gender' => $post->author->gender, // 'male' | 'female' | 'other'
])

लिंग पता नहीं है? 'other' को स्पष्ट रूप से पास करें — यह तटस्थ शाखा है। फिर भी अगर यह न दिया गया हो, तो बेस SDK आपके लिए other शाखा ले लेता है (langsys/langsys-php 1.3.1 और उसके बाद, ext-intl के साथ या उसके बिना), इसलिए वाक्य फिर भी सही पढ़ा जाता है।

श्रेणियाँ

श्रेणी वाक्यांश का दायरा तय करती है, इसलिए वही शब्द अलग-अलग संदर्भों में अलग तरह से अनूदित हो सकते हैं।

{{-- Same word, two meanings — the category disambiguates. --}}
<strong>@t('Home', 'Main Menu')</strong>      {{-- "Inicio" --}}
<strong>@t('Home', 'Home repairs')</strong>   {{-- "Casa" --}}

एक ही मार्कर शैली: {name}। JS SDK में markup पैरामीटर %name% इस्तेमाल करते हैं, क्योंकि सिंगल ब्रेसेस JSX और Vue टेम्पलेट सिंटैक्स से टकराते हैं। Blade में ऐसा कोई टकराव नहीं है, इसलिए PHP में हर जगह मानक {name} रूप इस्तेमाल होता है — वही रूप जो t() हर SDK में इस्तेमाल करता है।

मैं कौन-सा उपयोग करूँ?

आप अनुवाद कर रहे हैं… उपयोग करें क्यों
Blade टेम्पलेट में टेक्स्ट। @t(...) t() हेल्पर के साथ HTML एस्केपिंग — सीधे टेम्पलेट आउटपुट के लिए सुरक्षित।
कहीं और की कोई भी स्ट्रिंग — कंट्रोलर, Livewire, जॉब्स, मेल। t() पैरामीटर जोड़कर और ICU प्लुरल हल करके एक सादी स्ट्रिंग लौटाता है।
ऐसा कुछ जिसका अनुवाद कभी नहीं होना चाहिए — ब्रांड नाम, कोड, आईडी। इसे बिना रैप किए छोड़ दें कवरेज स्पष्ट है: केवल वही स्ट्रिंग अनूदित होती हैं जिन्हें आप रैप करते हैं; बिना टैग वाला आउटपुट जस का तस रहता है।
एक पूरा HTML दस्तावेज़ जो आपके पास पहले से स्ट्रिंग के रूप में है। Langsys::client()->translatePage() रॉ PHP SDK की फ़ुल-पेज पाइपलाइन पर चला जाता है — शीर्षक, मेटा और बॉडी टेक्स्ट, एक ही कॉल में।

मोटा नियम: Blade → @t · PHP → t() · जिसे छूना नहीं है → उसे रैप न करें।

सर्वर पर टोकन डिस्कवरी

जब आप ऐसा फ़्रेज़ रेंडर करते हैं जिसे Langsys ने पहले नहीं देखा, तो वह कतार में लगता है और रिस्पॉन्स समाप्त होने के बाद रजिस्टर होता है — विज़िटर को तुरंत आपकी बेस भाषा का टेक्स्ट दिखता है, और फ़्रेज़ आपके डैशबोर्ड में अनुवाद के लिए तैयार दिखाई देता है। इसके लिए write कुंजी चाहिए; रीड-ओनली कुंजी पर कतार चुपचाप छोड़ दी जाती है, जो ठीक वही है जो ऐसे एन्वायरनमेंट में चाहिए जहाँ कैटलॉग में बदलाव नहीं होना चाहिए।

JS SDK के साथ जोड़ना

Inertia या हाइब्रिड ऐप चला रहे हैं? सर्वर जो कैटलॉग पहले ही फ़ेच कर चुका है, उसे JS SDK को सौंप दें, ताकि क्लाइंट उसे दोबारा फ़ेच न करे — यह वही initialTranslations हैंडऑफ़ है जिसका वर्णन फ्रंटएंड SDK पेजों में है।

सर्वर — कैटलॉग साझा करें स्रोत देखें ↗
// app/Http/Middleware/HandleInertiaRequests.php
use Langsys\Laravel\Support\InertiaSsrProps;

public function share(Request $request): array
{
    return [...parent::share($request), ...InertiaSsrProps::share()];
}
क्लाइंट — बिना दोबारा फ़ेच किए हाइड्रेट करें
// resources/js — Vue shown; same shape for React/Svelte
import { LangsysApp, useLocaleStore } from 'langsys-js-vue';

const { store } = useLocaleStore(props.langsys.initialTranslationsLocale);
LangsysApp.init({
    projectid: import.meta.env.VITE_LANGSYS_PROJECT_ID,
    key: import.meta.env.VITE_LANGSYS_API_KEY, // read-only key on the client
    UserLocaleStore: store,
    initialTranslations: props.langsys.initialTranslations,
    initialTranslationsLocale: props.langsys.initialTranslationsLocale,
});

फ़साड और रॉ क्लाइंट

Langsys फ़साड t() को दोहराता है, और Langsys::client() आपको वाक्यांश लुकअप के अलावा हर काम — कैटलॉग पढ़ना, कैश नियंत्रण, कंटेंट ब्लॉक — के लिए अंतर्निहित langsys/langsys-php क्लाइंट देता है।

स्रोत देखें ↗
use Langsys\Laravel\Facades\Langsys;

Langsys::translate('Save', 'UI');            // same seam as t()
Langsys::client()->getTranslations('es-es'); // the vanilla langsys/langsys-php client
Langsys::client()->clearCache('es-es');      // pick up dashboard edits before the TTL
डॉक्स और लर्निंग सेंटर में खोजें