استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
تاريخ الإصدارات
- "استيراد موفّري السياق والخطافات مباشرةً من react-native-intlayer؛ لم يعد react-intlayer ضروريًا كاعتمادية مباشرة"v9.0.0٢٥/٦/٢٠٢٦
- "تحديث استخدام واجهة برمجة تطبيقات useIntlayer في Solid للوصول المباشر إلى الخصائص"v8.9.0٤/٥/٢٠٢٦
- "إضافة أمر init"v7.5.9٣٠/١٢/٢٠٢٥
- "بداية التاريخ"v5.5.10٢٩/٦/٢٠٢٥
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
ترجم تطبيق Expo و React Native الخاص بك | التدويل (i18n)
جدول المحتويات
لماذا Intlayer على البدائل؟
بالمقارنة مع الحلول الرئيسية مثل react-native-localize أو i18next، يعد Intlayer حلاً يأتي مزودًا بتحسينات متكاملة مثل:
تم تحسين Intlayer للعمل بشكل مثالي مع React Native وExpo من خلال تقديم نطاق المحتوى على مستوى المكونات، ودعم TypeScript، وجميع الميزات اللازمة لتوسيع نطاق التدويل (i18n) في تطبيقات الأجهزة المحمولة.
يؤدي تحديد نطاق محتوى تطبيقك إلى تسهيل الصيانة للتطبيقات واسعة النطاق. يمكنك تكرار أو حذف مجلد ميزات واحد دون العبء العقلي لمراجعة قاعدة بيانات المحتوى بالكامل. بالإضافة إلى ذلك، تتم كتابة Intlayer بالكامل لضمان دقة المحتوى الخاص بك.
يؤدي تحديد موقع المحتوى المشترك إلى تقليل السياق المطلوب بواسطة نماذج اللغات الكبيرة (LLMs). يأتي Intlayer أيضًا مزودًا بمجموعة من الأدوات، مثل CLI لاختبار الترجمات المفقودة،LSP، MCP ومهارات الوكيل، لجعل تجربة المطور (DX) أكثر سلاسة للذكاء الاصطناعي وكلاء.
استخدم الأتمتة للترجمة في مسار CI/CD الخاص بك باستخدام LLM من اختيارك على حساب مزود الذكاء الاصطناعي الخاص بك. يقدم Intlayer أيضًا مترجمًا لأتمتة استخراج المحتوى، بالإضافة إلى منصة ويب للمساعدة في الترجمة في الخلفية.
يمكن أن يؤدي ربط ملفات JSON الضخمة بالمكونات إلى حدوث مشكلات في الأداء والتفاعل. يعمل Intlayer على تحسين تحميل المحتوى الخاص بك في وقت الإنشاء.
أكثر من مجرد حل i18n، يوفر Intlayer محررًا مرئيًا مستضافًا ذاتيًا ونظام إدارة محتوى كامل لمساعدتك في إدارة المحتوى متعدد اللغات في الوقت الفعلي، مما يجعل التعاون مع المترجمين ومؤلفي النصوص وأعضاء الفريق الآخرين سلسًا. يمكن تخزين المحتوى محليًا و/أو عن بعد.
بدلاً من تحميل ملفات JSON ضخمة إلى صفحاتك، قم بتحميل المحتوى الضروري فقط. يساعد Intlayer في تقليل حجم الحزمة وأحجام العرض بنسبة تصل إلى 50%.
تثبيت التبعيات
راجع قالب التطبيق على GitHub.
من مشروع React Native الخاص بك، قم بتثبيت الحزم التالية:
bashنسخ الكودنسخ الكود إلى الحافظة
npx intlayer@canary init --interactive # v9# npx intlayer init # v8علامة
--interactiveاختيارية. استخدمintlayer-cli initإذا كنت وكيل ذكاء اصطناعي.سيقوم هذا الأمر باكتشاف بيئتك وتثبيت الحزم المطلوبة. على سبيل المثال:
bashنسخ الكودنسخ الكود إلى الحافظة
npm install intlayer react-native-intlayerالحزم
intlayer
مجموعة أدوات i18n الأساسية للتكوين، محتوى القاموس، توليد الأنواع، وأوامر CLI.react-native-intlayer
تكامل React Native الذي يوفر موفّري السياق وReact hooks التي ستستخدمها للحصول على اللغات وتبديلها، وpolyfills لـ React Native، وإضافة Metro لدمج Intlayer مع مجمع React Native. يُعيد تصدير كل شيء منreact-intlayer، لذلك تحتاج فقط إلى هذه الحزمة الواحدة في تطبيق React Native.
إنشاء تكوين Intlayer
في جذر مشروعك (أو في أي مكان مناسب)، أنشئ ملف تكوين Intlayer. قد يبدو كالتالي:
intlayer.config.tsنسخ الكودنسخ الكود إلى الحافظة
/** * إذا لم تكن أنواع Locales متوفرة، حاول تعيين moduleResolution إلى "bundler" في ملف tsconfig.json الخاص بك */ import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // ... أضف أي لغات أخرى تحتاجها ], defaultLocale: Locales.ENGLISH, }, }; export default config;ضمن هذا التكوين، يمكنك:
- تكوين قائمة اللغات المدعومة.
- تعيين لغة افتراضية.
- لاحقًا، يمكنك إضافة خيارات أكثر تقدمًا (مثل السجلات، مجلدات المحتوى المخصصة، إلخ).
- راجع وثائق تكوين Intlayer للمزيد.
إضافة ملحق Metro
Metro هو أداة تجميع (bundler) لـ React Native. وهو أداة التجميع الافتراضية لمشاريع React Native التي تم إنشاؤها باستخدام الأمر
react-native init. لاستخدام Intlayer مع Metro، تحتاج إلى إضافة الملحق إلى ملفmetro.config.jsالخاص بك:metro.config.jsنسخ الكودنسخ الكود إلى الحافظة
const { getDefaultConfig } = require("expo/metro-config");const { configMetroIntlayer } = require("react-native-intlayer/metro");module.exports = (async () => { const defaultConfig = getDefaultConfig(__dirname); return await configMetroIntlayer(defaultConfig);})();ملاحظة:
configMetroIntlayerهي دالة غير متزامنة (promise). استخدمconfigMetroIntlayerSyncبدلاً من ذلك إذا كنت تريد استخدامها بشكل متزامن، أو تجنب IFFE (التعبير الدالي المستدعى فورًا). ملاحظة:configMetroIntlayerSyncلا تسمح ببناء قواميس Intlayer عند بدء تشغيل الخادمإضافة موفّر Intlayer
للحفاظ على مزامنة لغة المستخدم في جميع أنحاء تطبيقك، تحتاج إلى تغليف المكون الجذر الخاص بك بمكون
IntlayerProviderمنreact-native-intlayer.قم دائمًا بالاستيراد من
react-native-intlayer. يتضمنIntlayerProviderالخاص به polyfills لواجهة برمجة تطبيقات الويب المستخدمة بواسطة Intlayer، والحزمة تُعيد تصدير جميع الخطافات والأدوات منreact-intlayer.بالإضافة إلى ذلك، تحتاج إلى إضافة دالة
intlayerPolyfillإلى ملفindex.jsالخاص بك لضمان عمل Intlayer بشكل صحيح.app/_layout.tsxنسخ الكودنسخ الكود إلى الحافظة
import { Stack } from "expo-router"; import { getLocales } from "expo-localization"; import { IntlayerProvider } from "react-native-intlayer"; import { type FC } from "react"; const getDeviceLocale = () => getLocales()[0]?.languageTag; const RootLayout: FC = () => { return ( <IntlayerProvider defaultLocale={getDeviceLocale()}> <Stack> <Stack.Screen name="(tabs)" options={{ headerShown: false }} /> </Stack> </IntlayerProvider> ); }; export default RootLayout;إعلان المحتوى الخاص بك
قم بإنشاء ملفات إعلان المحتوى في أي مكان داخل مشروعك (عادةً داخل مجلد
src/)، باستخدام أي من صيغ الامتداد التي يدعمها Intlayer:.content.json.content.jsonc.content.json5.content.ts.content.tsx.content.js.content.jsx.content.mjs.content.mjx.content.cjs.content.md.content.mdx.content.yaml.content.yml- إلخ.
Expo Router (الويب): احتفظ بملفات
.content.*خارج مجلدapp/. يعامل Expo Router كل ملف JavaScript/TypeScript داخلapp/كمسار. على الويب، يقوم اكتشاف المسار بمسح نظام الملفات مباشرة ولا يحترمresolver.blockListالخاص بـ Metro، لذلك يتم تسجيل*.content.tsالموجود في نفس المكان كمسار. حتى أن ملفًا مثلapp/(tabs)/_layout.content.tsيتم تحليله كتخطيط (تُقرأ اللاحقة.contentكلاحقة للمنصة)، مما يتعارض مع_layout.tsxالحقيقي ويطرح الخطأ:plaintextنسخ الكودنسخ الكود إلى الحافظة
The layouts "./(tabs)/_layout.content.ts" and "./(tabs)/_layout.tsx" conflict on the route "/(tabs)/_layout.content". Remove or rename one of these files.ضع تصريحاتك في مجلد خارج
app/(على سبيل المثالcontent/أوsrc/content/). يكتشف Intlayer ملفات.content.*في أي مكان في المشروع ويتم الإشارة إلى القواميس من خلالkeyالخاص بها، لذلك لا توجد حاجة لتغيير الاستيرادات. على التطبيقات الأصلية (native)، هذا غير مطلوب (يخفيهاblockListالخاص بـ Metro بالفعل)، ولكن استخدام مجلد غيرapp/يحافظ على عمل كلتا المنصتين.مثال (TypeScript مع عقد TSX لـ React Native):
src/app.content.tsxنسخ الكودنسخ الكود إلى الحافظة
import { t, type Dictionary } from "intlayer"; import type { ReactNode } from "react"; /** * قاموس المحتوى لنطاق "app" الخاص بنا */ import { t, type Dictionary } from "intlayer"; const homeScreenContent = { key: "home-screen", content: { title: t({ en: "Welcome!", fr: "Bienvenue!", es: "¡Bienvenido!", }), }, } satisfies Dictionary; export default homeScreenContent;لمزيد من التفاصيل حول إعلانات المحتوى، راجع وثائق محتوى Intlayer.
استخدام Intlayer في مكوناتك
استخدم الخطاف
useIntlayerفي المكونات الفرعية للحصول على المحتوى المحلي.مثال
app/(tabs)/index.tsxنسخ الكودنسخ الكود إلى الحافظة
import { Image, StyleSheet, Platform } from "react-native"; import { useIntlayer } from "react-native-intlayer"; import { HelloWave } from "@/components/HelloWave"; import ParallaxScrollView from "@/components/ParallaxScrollView"; import { ThemedText } from "@/components/ThemedText"; import { ThemedView } from "@/components/ThemedView"; import { type FC } from "react"; const HomeScreen = (): FC => { const { title, steps } = useIntlayer("home-screen"); return ( <ParallaxScrollView headerBackgroundColor={{ light: "#A1CEDC", dark: "#1D3D47" }} headerImage={ <Image source={require("@/assets/images/partial-react-logo.png")} style={styles.reactLogo} /> } > <ThemedView style={styles.titleContainer}> <ThemedText type="title">{title}</ThemedText> <HelloWave /> </ThemedView> </ParallaxScrollView> ); }; const styles = StyleSheet.create({ titleContainer: { flexDirection: "row", alignItems: "center", gap: 8, }, }); export default HomeScreen;عند استخدام
content.someKeyفي الخصائص المعتمدة على النصوص (مثل خاصيةtitleلزر أوchildrenلمكونText)، يجب استدعاءcontent.someKey.valueللحصول على النص الفعلي.إذا كان تطبيقك موجودًا بالفعل، يمكنك استخدام مترجم Intlayer، بالإضافة إلى أمر الاستخراج، لتحويل آلاف المكونات في ثانية واحدة.
تغيير لغة التطبيق
اختياريلتغيير اللغة من داخل مكوناتك، يمكنك استخدام دالة
setLocaleمن الخطافuseLocale:src/components/LocaleSwitcher.tsxنسخ الكودنسخ الكود إلى الحافظة
import { type FC } from "react"; import { View, Text, TouchableOpacity, StyleSheet } from "react-native"; import { getLocaleName } from "intlayer"; import { useLocale } from "react-native-intlayer"; export const LocaleSwitcher: FC = () => { const { setLocale, availableLocales } = useLocale(); return ( <View style={styles.container}> {availableLocales.map((locale) => ( <TouchableOpacity key={locale} style={styles.button} onPress={() => setLocale(locale)} > <Text style={styles.text}>{getLocaleName(locale)}</Text> </TouchableOpacity> ))} </View> ); }; const styles = StyleSheet.create({ container: { flexDirection: "row", justifyContent: "center", alignItems: "center", gap: 8, }, button: { paddingVertical: 6, paddingHorizontal: 12, borderRadius: 6, backgroundColor: "#ddd", }, text: { fontSize: 14, fontWeight: "500", color: "#333", }, });هذا يؤدي إلى إعادة عرض جميع المكونات التي تستخدم محتوى Intlayer، مما يعرض الآن الترجمات للغة الجديدة.
راجع
useLocaledocs لمزيد من التفاصيل.
تكوين TypeScript (إذا كنت تستخدم TypeScript)
يقوم Intlayer بإنشاء تعريفات النوع في مجلد مخفي (افتراضيًا .intlayer) لتحسين الإكمال التلقائي واكتشاف أخطاء الترجمة:
نسخ الكود إلى الحافظة
// tsconfig.json{ // ... تكوين TypeScript الحالي الخاص بك "include": [ "src", // كود المصدر الخاص بك ".intlayer/types/**/*.ts", // <-- تأكد من تضمين الأنواع التي تم إنشاؤها تلقائيًا // ... أي شيء آخر تقوم بتضمينه بالفعل ],}هذا ما يتيح ميزات مثل:
- الإكمال التلقائي لمفاتيح القاموس الخاصة بك.
- التحقق من النوع الذي يحذرك إذا قمت بالوصول إلى مفتاح غير موجود أو عدم تطابق النوع.
تكوين Git
لتجنب الالتزام بالملفات التي تم إنشاؤها تلقائيًا بواسطة Intlayer، أضف ما يلي إلى ملف .gitignore الخاص بك:
نسخ الكود إلى الحافظة
# تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer.intlayerإضافة VS Code
لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت إضافة Intlayer الرسمية لـ VS Code.
تقدم هذه الإضافة:
- الإكمال التلقائي لمفاتيح الترجمة.
- الكشف عن الأخطاء في الوقت الحقيقي للترجمات المفقودة.
- معاينات داخلية للمحتوى المترجم.
- إجراءات سريعة لإنشاء وتحديث الترجمات بسهولة.
لمزيد من التفاصيل حول كيفية استخدام الإضافة، راجع توثيق إضافة Intlayer لـ VS Code.
التعمق أكثر
- المحرر المرئي: استخدم المحرر المرئي لـ Intlayer لإدارة الترجمات بشكل بصري.
- تكامل نظام إدارة المحتوى (CMS): يمكنك أيضًا تعهيد واستيراد محتوى القاموس الخاص بك من خلال نظام إدارة المحتوى (CMS).
- أوامر سطر الأوامر (CLI): استكشف أدوات سطر الأوامر لـ Intlayer للمهام مثل استخراج الترجمات أو التحقق من المفاتيح المفقودة.
استمتع ببناء تطبيقات React Native الخاصة بك مع دعم كامل للترجمة الدولية (i18n) من خلال Intlayer!
التصحيح
React Native قد يكون أقل استقراراً من React Web، لذلك انتبه جيداً لمحاذاة الإصدارات.
يستهدف Intlayer بشكل أساسي Web Intl API؛ على React Native يجب عليك تضمين polyfills المناسبة.
قائمة التحقق:
- استخدم أحدث إصدارات
intlayerوreact-native-intlayer. - قم بتفعيل polyfill الخاص بـ Intlayer.
- إذا كنت تستخدم
getLocaleNameأو أدوات أخرى قائمة على Intl-API، قم باستيراد هذه polyfills مبكراً (على سبيل المثال فيindex.jsأوApp.tsx):
نسخ الكود إلى الحافظة
import "intl";import "@formatjs/intl-getcanonicallocales/polyfill";import "@formatjs/intl-locale/polyfill";import "@formatjs/intl-pluralrules/polyfill";import "@formatjs/intl-displaynames/polyfill";import "@formatjs/intl-listformat/polyfill";import "@formatjs/intl-numberformat/polyfill";import "@formatjs/intl-relativetimeformat/polyfill";import "@formatjs/intl-datetimeformat/polyfill";- تحقق من إعدادات Metro الخاصة بك (resolver aliases و asset plugins و مسارات
tsconfig) إذا فشل استيراد الوحدات.