PHP langsys/langsys-php

SDK PHP cơ sở: một client cho mọi ứng dụng PHP — PHP thuần, framework, worker hay CLI. Cụm từ trong mã của bạn vừa là khóa tra cứu vừa là giá trị mặc định bằng ngôn ngữ gốc — không cần tệp khóa, không cần bước trích xuất. Việc dịch diễn ra trên máy chủ, nên trang đến tay người dùng đã được bản địa hóa sẵn.

Đây là SDK phía backend nên trang này không có sân thử trong trình duyệt — trình duyệt không thể chạy PHP. Dùng Laravel? Gói Laravel bọc client này bằng một directive Blade, middleware và một facade. Tài liệu đầy đủ: README.

Đang dùng trợ lý lập trình AI? Hãy đưa cho nó prompt này
Add Langsys translation to this PHP app.

1. Read https://docs.langsys.dev/llms.txt, then follow
   https://docs.langsys.dev/learn/sdk/php/ 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.

Cài đặt

composer require langsys/langsys-php

PHP 7.4 trở lên, kèm các tiện ích mở rộng curl, json và intl — intl là tiện ích xử lý dạng số nhiều và định dạng số, ngày tháng cho từng ngôn ngữ.

.env
# A server can hold a WRITE key — it never reaches visitors. A write key is
# what lets phrases your pages use for the first time register themselves.
LANGSYS_API_KEY=your-api-key
LANGSYS_PROJECT_ID=your-project-id

Chưa có dự án hoặc khóa? Bắt đầu nhanh giúp bạn có cả hai chỉ trong hai phút.

Client

Mỗi yêu cầu dùng một client. Client đọc thông tin xác thực từ môi trường và lưu đệm danh mục của từng ngôn ngữ, nên dịch một trang chỉ tốn tối đa một lần gọi API.

Xem mã nguồn ↗
<?php
require 'vendor/autoload.php';

use LangsysSDKClient;

// Reads LANGSYS_API_KEY and LANGSYS_PROJECT_ID from the environment.
$langsys = new Client();
$langsys->setLocale('es-es');

Dịch

translate() nhận ngôn ngữ ở tham số thứ hai và danh mục ở tham số thứ ba. Truyền null cho ngôn ngữ để dùng ngôn ngữ hiện tại của client.

Xem mã nguồn ↗
// translate($phrase, $locale, $category, $contentBlockId, $params)
echo $langsys->translate('Order confirmed', null, 'Checkout');   // current locale
echo $langsys->translate('Order confirmed', 'fr-fr', 'Checkout'); // an explicit one

// A phrase the project doesn't have yet renders as written — never blank.

Giá trị trong câu

Placeholder dùng dạng {name}, cùng định dạng mà mọi SDK của Langsys lưu trữ, nên một danh mục sẽ hiển thị giống hệt nhau từ backend PHP và frontend JS.

Xem mã nguồn ↗
// Pass values as params, never build the string yourself.
echo $langsys->translate('Hello, {name}!', null, 'Greetings', null, ['name' => $user->name]);

// sprintf('Hello, %s!', $name) would register "Hello, Sarah!", "Hello, Ahmed!", …
// — one catalog entry per value, billed as words, and impossible to undo.

Dạng số nhiều

Xem · 1:14 Số nhiều

Hãy viết câu ở dạng phẳng: Langsys tạo các dạng số nhiều của từng ngôn ngữ trong quá trình dịch, và SDK hiển thị nhánh khớp với số lượng của bạn.

Xem mã nguồn ↗
// Written flat. Langsys generates each locale's plural forms during
// translation and the SDK picks the branch that matches the count.
echo $langsys->translate('You have {count} new messages.', null, 'Inbox', null, ['count' => $count]);

Các dạng số nhiều mà Langsys tạo ra chỉ có trong PHP từ langsys/langsys-php 1.3.2; các phiên bản cũ hơn hiển thị dạng số nhiều cho mọi số lượng, kể cả 1.

Hòa hợp giới tính

Tiếng Tây Ban Nha, Pháp hay Nga biến đổi {username} has been invited theo người được nhắc đến. Langsys tạo các nhánh đó trong quá trình dịch — giống như cách tạo dạng số nhiều — và tên đối số được đặt theo tên biến, kèm thêm _gender: male, female hoặc other. Hãy truyền giá trị này bất cứ khi nào bạn biết. Cách hoạt động và cách tìm các cụm từ cần đến nó →

Truyền đối số giới tính Xem mã nguồn ↗
// Pass the agreement argument alongside the value it inflects.
echo $langsys->translate('{username} has been invited', null, 'Team', null, [
    'username'        => $user->name,
    'username_gender' => $user->gender, // 'male' | 'female' | 'other'
]);

Không biết giới tính? Hãy truyền 'other' một cách tường minh — đây là nhánh trung tính. Nếu thiếu giá trị này, SDK vẫn tự động dùng nhánh other cho bạn, nên câu vẫn hiển thị đúng.

Danh mục

Danh mục xác định phạm vi của một cụm từ, nên cùng một câu chữ có thể được dịch khác nhau trong các ngữ cảnh khác nhau.

// Same word, two meanings — the category disambiguates.
echo $langsys->translate('Home', null, 'Main Menu');     // es: "Inicio"
echo $langsys->translate('Home', null, 'Home repairs');  // es: "Casa"

Ngôn ngữ của khách truy cập

Hãy đặt ngôn ngữ từ cách định tuyến của bạn hoặc từ cài đặt của người dùng, hoặc để máy khách đọc header Accept-Language của trình duyệt.

Xem mã nguồn ↗
use LangsysSDKLocaleLocaleDetector;

// Explicit, from your own routing or the user's settings:
$langsys->setLocale('pt-br');

// Or from the browser: without setLocale(), getLocale() reads Accept-Language
// and falls back to the project's base locale.
$locale = $langsys->getLocale();

// The same detection, from a header your framework hands you:
$locale = LocaleDetector::fromAcceptLanguage($request->getHeaderLine('Accept-Language'));

Trong các mẫu giao diện của bạn

Một hàm trợ giúp nhỏ giúp các view của bạn có tên ngắn gọn và thoát (escape) dữ liệu đầu ra.

helpers.php
<?php
// helpers.php — one client per request, one short name in your templates.
use LangsysSDKClient;

function t(string $phrase, string $category, array $params = []): string
{
    static $langsys = null;
    $langsys ??= (new Client())->setLocale($_SESSION['locale'] ?? 'en-us');

    return htmlspecialchars($langsys->translate($phrase, null, $category, null, $params));
}

// In a template:
// <h1><?= t('Welcome to our store', 'Home') ?></h1>

Phát hiện token trên máy chủ

Với khóa ghi, mọi cụm từ mà dự án chưa từng thấy sẽ được xếp hàng khi bạn hiển thị và được đăng ký sau khi có phản hồi — khách truy cập thấy ngay văn bản ngôn ngữ gốc của bạn, và cụm từ đó được dịch cho lần sau. Với khóa chỉ đọc, không có gì được đăng ký và cũng không có gì bị lỗi.

Xem mã nguồn ↗
// With a write key, translate() queues every phrase the project doesn't have
// and sends them after the response, from a shutdown handler. Nothing to call.
// With a read key the queue is simply dropped — no errors.

// Or register up front, e.g. from a deploy script:
$langsys->registerPhrases([
    ['phrase' => 'Order confirmed', 'category' => 'Checkout'],
    ['phrase' => 'Copyright 2026', 'category' => 'Footer', 'translatable' => false],
]);

Toàn bộ trang

Bạn đã có trang dưới dạng chuỗi HTML? Hãy dịch toàn bộ chỉ trong một lần, bao gồm cả phần head.

Xem mã nguồn ↗
// An HTML page you already have as a string: <title>, meta and OpenGraph
// tags, and the body — phrases and content blocks — in one pass.
ob_start();
// … your app renders the page …
$html = ob_get_clean();

echo $langsys->setLocale('es-es')->translatePage($html, 'Home');

Bộ nhớ đệm

Xem mã nguồn ↗
// Catalogs are cached for an hour (a file cache by default; Redis or none
// via LANGSYS_CACHE_DRIVER). After editing translations in the dashboard:
$langsys->clearCache('es-es');
Tìm kiếm trong tài liệu & Trung tâm học tập