Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions packages/i18n/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"parser": "@babel/eslint-parser",
"env": {
"node": true,
"es6": true
},
"extends": [
"airbnb-base",
"prettier"
],
"plugins": ["prettier"],
"rules": {
"prettier/prettier": "error",
"no-console": "off",
"no-unused-vars": "warn",
"no-underscore-dangle": "off",
"no-param-reassign": "off",
"consistent-return": "off",
"import/no-extraneous-dependencies": "off",
"no-nested-ternary": "off",
"no-undef": "error",
"no-restricted-exports": "off"
}
}

4 changes: 4 additions & 0 deletions packages/i18n/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"singleQuote": true,
"semi": true
}
13 changes: 13 additions & 0 deletions packages/i18n/babel.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module.exports = {
presets: [
[
'@babel/preset-env',
{
modules: false,
bugfixes: true,
targets: { node: 'current' },
},
],
],
};

16 changes: 16 additions & 0 deletions packages/i18n/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "@embeddedchat/i18n",
"version": "0.1.0",
"main": "src/index.js",
"scripts": {
"format": "prettier --write 'src/' ",
"format:check": "prettier --check 'src/' ",
"lint": "eslint 'src/**/*.js'",
"lint:fix": "eslint 'src/**/*.js' --fix",
"test:lint": "eslint src/**/*.js"
},
"devDependencies": {
"eslint": "^8.30.0",
"prettier": "^2.8.1"
}
}
46 changes: 46 additions & 0 deletions packages/i18n/src/i18n.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
class I18n {
constructor() {
this.translations = {};
this.currentLang = 'en';
this.loadTranslations(this.currentLang);
}

async loadTranslations(lang) {
try {
const module = await import(`./locales/${lang}.i18n.json`);
this.translations = module.default || module;
this.currentLang = lang;
} catch (error) {
console.error(`Failed to load translations for ${lang}:`, error);
const fallbackModule = await import('./locales/en.i18n.json');
this.translations = fallbackModule.default || fallbackModule;
}
}

t(key, params = null) {
let translation = this.translations[key] || key;

if (params) {
Object.keys(params).forEach((param) => {
translation = translation.replace(
new RegExp(`{{${param}}}`, 'g'),
params[param]
);
});
}

return translation;
}

changeLanguage(lang) {
this.loadTranslations(lang);
}

getCurrentLang() {
return this.currentLang;
}
}

const i18n = new I18n();

export default i18n;
17 changes: 17 additions & 0 deletions packages/i18n/src/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
declare module '@embeddedchat/i18n' {
class I18n {
translations: Record<string, any>;
currentLang: string;

constructor();

loadTranslations(lang: string): void;
t(key: string): string;
changeLanguage(lang: string): void;
getCurrentLang(): string;
}

const i18n: I18n;

export default i18n;
}
3 changes: 3 additions & 0 deletions packages/i18n/src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import i18n from './i18n';

export default i18n;
167 changes: 167 additions & 0 deletions packages/i18n/src/locales/ar.i18n.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
{
"Add": "إضافة",
"Add_Reaction": "إضافة رد فعل",
"Admin": "مدير",
"All": "الكل",
"all": "الكل",
"Announcement": "إعلان",
"Are_You_Sure": "هل أنت متأكد؟",
"Audios": "الملفات الصوتية",
"avatar": "الصورة الشخصية",
"Bio": "السيرة الذاتية",
"Browser_Not_Support_Audio": "متصفحك لا يدعم عنصر الصوت.",
"Browser_Not_Support_Video": "متصفحك لا يدعم عنصر الفيديو.",
"Cancel": "إلغاء",
"Close": "إغلاق",
"Copy_link": "نسخ الرابط",
"Copy_Message": "نسخ الرسالة",
"Created_At": "تم الإنشاء في",
"Delete": "حذف",
"Delete_Forever_Warning": "حذف الملف سيؤدي إلى حذفه نهائيًا. لا يمكن التراجع عن ذلك.",
"Delete_Message": "حذف الرسالة",
"Delete_Message_Ask": "هل تريد حذف هذه الرسالة؟",
"Description": "الوصف",
"Download": "تحميل",
"Edit": "تعديل",
"Editing_Message": "تعديل الرسالة",
"Email": "البريد الإلكتروني",
"Email_Or_Username": "البريد الإلكتروني أو اسم المستخدم",
"Enter_TOTP": "أدخل رمز TOTP",
"Esc_Enter_Instruction": "اضغط على esc للإلغاء · اضغط على enter للحفظ",
"Field_Required": "هذا الحقل مطلوب",
"Files": "الملفات",
"Full_Name": "الاسم الكامل",
"general": "عام",
"here": "هنا",
"Images": "الصور",
"Invite_Link": "رابط الدعوة",
"Invite_Link_Will_Expire_On": "رابط الدعوة سينتهي في ",
"Invite_Members": "دعوة الأعضاء",
"Join": "الانضمام",
"Last_Login": "آخر تسجيل دخول",
"Login": "تسجيل الدخول",
"Login_To_Chat": "تسجيل الدخول للدردشة",
"Logout": "تسجيل الخروج",
"Mailto_Email": "mailto:{{email}}",
"Maximize": "تكبير",
"Members": "الأعضاء",
"Mentions": "الإشارات",
"Message": "الرسالة",
"Message_Too_Long": "الرسالة طويلة جدًا!",
"Minimize": "تصغير",
"New_Messages": "رسائل جديدة",
"Nickname": "اسم الشهرة",
"No_Files_Found": "لم يتم العثور على ملفات",
"No_Members_Found": "لم يتم العثور على أعضاء",
"No_Mentions_Found": "لم يتم العثور على إشارات",
"No_Messages_Found": "لم يتم العثور على رسائل",
"No_Pinned_Messages": "لا توجد رسائل مثبتة",
"No_Starred_Messages": "لا توجد رسائل مميزة",
"No_Threads_Found": "لم يتم العثور على مواضيع",
"Ok": "موافق",
"Options": "الخيارات",
"Password": "كلمة المرور",
"Pin": "تثبيت",
"Pinned_Messages": "الرسائل المثبتة",
"Quote": "اقتباس",
"Read_Only_Room": "هذه الغرفة للقراءة فقط",
"Ready_To_Chat": "مستعد للدردشة؟ سجل الدخول الآن للانضمام إلى المرح.",
"Reply": "رد",
"Report": "تقرير",
"Report_message": "تقرير رسالة",
"Report_this_message": "هل تريد الإبلاغ عن هذه الرسالة؟",
"Report_this_message_Why": "لماذا ترغب في الإبلاغ عن هذه الرسالة؟",
"Roles": "الأدوار",
"Room_Information": "معلومات الغرفة",
"Search_Files": "بحث عن ملفات",
"Search_Members": "بحث عن أعضاء",
"Search_Messages": "بحث عن رسائل",
"Search_Threads": "بحث عن مواضيع",
"Send_It_As_Attachment_Instead": "هل ترغب في إرسالها كمرفق بدلاً من ذلك؟",
"Sign_In_To_Chat": "تسجيل الدخول للدردشة",
"Something_Wrong": "حدث خطأ ما",
"Star": "نجم",
"Starred_Messages": "الرسائل المميزة",
"Start_Of_Conversation": "بداية المحادثة",
"Submit": "إرسال",
"Team_Information": "معلومات الفريق",
"Texts": "النصوص",
"Threads": "المواضيع",
"Toast_Channel_Not_Exist": "القناة غير موجودة. جاري تسجيل الخروج.",
"Toast_Copied_To_Clipboard": "تم النسخ إلى الحافظة",
"Toast_Copy_Failed": "فشل النسخ إلى الحافظة.",
"Toast_Error_In_Copying_Message": "خطأ في نسخ الرسالة",
"Toast_Error_In_Copying_Message_Link": "خطأ في نسخ رابط الرسالة",
"Toast_Error_In_Deleting_Message": "خطأ في حذف الرسالة",
"Toast_Error_In_Editing_Message": "خطأ في تعديل الرسالة، يرجى تسجيل الدخول مرة أخرى",
"Toast_Error_In_File_Deleting": "خطأ في حذف الملف",
"Toast_Error_In_Pinning_Message": "خطأ في تثبيت الرسالة",
"Toast_Error_In_Reporting_Message": "خطأ في الإبلاغ عن الرسالة",
"Toast_File_Deleted": "تم حذف الملف",
"Toast_Invalid_TOTP": "رمز TOTP غير صالح.",
"Toast_Invalid_Username_Password": "اسم المستخدم أو كلمة المرور غير صحيحة. يرجى التحقق من بياناتك والمحاولة مرة أخرى",
"Toast_Logged_In": "تم تسجيل الدخول بنجاح",
"Toast_Media_Type_Not_Accepted": "نوع الوسائط غير مقبول",
"Toast_Message_Copied": "تم نسخ الرسالة بنجاح",
"Toast_Message_Deleted": "تم حذف الرسالة بنجاح",
"Toast_Message_Link_Copied": "تم نسخ رابط الرسالة بنجاح",
"Toast_Message_Pinned": "تم تثبيت الرسالة",
"Toast_Message_Reported": "تم الإبلاغ عن الرسالة بنجاح",
"Toast_Message_Starred": "تم تمييز الرسالة",
"Toast_Message_Unpinned": "تم إلغاء تثبيت الرسالة",
"Toast_Message_Unstarred": "تم إزالة تمييز الرسالة",
"Toast_Not_Have_Permission_To_Access_Channel": "ليس لديك إذن للوصول إلى هذه القناة. جاري تسجيل الخروج",
"Toast_Open_Authentication_App": "يرجى فتح تطبيق المصادقة وإدخال الرمز.",
"Toast_Theme_Copied": "تم نسخ السمة إلى الحافظة.",
"Tooltip_Audio_Message": "رسالة صوتية",
"Tooltip_Bold": "غامق",
"Tooltip_Cancel_Recording": "إلغاء التسجيل",
"Tooltip_Code": "كود",
"Tooltip_Emoji": "رمز تعبيري",
"Tooltip_Finish_Recording": "إنهاء التسجيل",
"Tooltip_Inline": "كود مدمج",
"Tooltip_Italic": "مائل",
"Tooltip_Link": "رابط",
"Tooltip_More": "المزيد",
"Tooltip_Multiline": "عدة أسطر",
"Tooltip_Pinned": "مثبت",
"Tooltip_Starred": "مميز",
"Tooltip_Strike": "شطب",
"Tooltip_Upload_File": "رفع ملف",
"Tooltip_Video_Message": "رسالة فيديو",
"Topic": "الموضوع",
"Unpin": "إلغاء التثبيت",
"Unstar": "إلغاء التمييز",
"user": "مستخدم",
"User_Action_Added_Message": "أضاف @{{message}}",
"User_Action_Allowed_Reactions": "سمح بالردود",
"User_Action_Archived_Room": "أرشفة الغرفة",
"User_Action_Changed_Room": "غَيَّر الغرفة إلى {{message}}",
"User_Action_Changed_Room_Announcement": "غَيَّر إعلان الغرفة إلى: {{message}}",
"User_Action_Changed_Room_Avatar": "غَيَّر صورة الغرفة",
"User_Action_Changed_Room_Description": "غَيَّر وصف الغرفة إلى: {{message}}",
"User_Action_Changed_Room_Name": "غَيَّر اسم الغرفة إلى {{message}}",
"User_Action_Changed_Room_Topic": "غَيَّر موضوع الغرفة إلى: {{message}}",
"User_Action_Converted_Room": "تحويل #{{message}}",
"User_Action_Joined_The_Channel": "انضم إلى القناة",
"User_Action_Left_The_Channel": "غادر القناة",
"User_Action_Message_Removed": "تم إزالة الرسالة",
"User_Action_Pinned_Message": "تثبيت رسالة:",
"User_Action_Removed_Message": "تم إزالة @{{message}}",
"User_Action_Removed_Read_Only": "تمت إزالة صلاحيات القراءة فقط",
"User_Action_Removed_Role": "تم إزالة {{message}} كـ {{role}}",
"User_Action_Set_Role": "تم تعيين {{message}} كـ {{role}}",
"User_Action_Set_Room_Read_Only": "تم تعيين الغرفة للقراءة فقط",
"User_Action_Unarchived_Room": "إلغاء أرشفة الغرفة",
"User_Action_User_Typing_Multiple": ", و{{count}} آخرين يكتبون...",
"User_Action_User_Typing_One": "{{user}} يكتب...",
"User_Action_User_Typing_Two": "{{user1}} و{{user2}} يكتبان...",
"Verified": "موثق",
"Verified_Not": "غير موثق",
"Videos": "فيديوهات",
"View_Thread": "عرض الموضوع",
"Followers": "المتابعون",
"Last_Message": "الرسالة الأخيرة: {{time}}",
"User_Info": "معلومات المستخدم",
"Username": "اسم المستخدم"
}
Loading
Loading