Skip to content

Commit

Permalink
Add Arabic ui texts for testing rtl languages (#1315)
Browse files Browse the repository at this point in the history
Add arabic ui texts
  • Loading branch information
nygrenh authored Sep 20, 2024
1 parent 784da78 commit cdd2894
Show file tree
Hide file tree
Showing 9 changed files with 1,461 additions and 0 deletions.
90 changes: 90 additions & 0 deletions bin/translations-translate
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/usr/bin/env python3

import os
import json
import http.client
from typing import Dict, Any
import json5
import pdb


current_file_path = os.path.abspath(__file__)
LOCALES_DIR = os.path.abspath(os.path.join(__file__, '..', '..', 'shared-module', 'packages', 'common', 'src', 'locales'))

def create_payload(prompt: str, user_message: str) -> Dict[str, Any]:
"""Create the payload for the API request."""
return {
"messages": [{"role": "system", "content": prompt}, {"role": "user", "content": user_message}],
"temperature": 0.4,
"top_p": 1.0,
"frequency_penalty": 0.0,
"presence_penalty": 0.0,
"stop": None,
"stream": False
}

def get_api_key() -> str:
"""Retrieve the API key from environment variables."""
api_key = os.getenv('AZURE_API_KEY')

if not api_key:
raise ValueError("AZURE_API_KEY environment variable not set")
return api_key

def make_api_request(payload: Dict[str, Any], api_key: str) -> str:
api_host = os.getenv('AZURE_API_HOST')
api_model = os.getenv('AZURE_API_MODEL')
conn = http.client.HTTPSConnection(api_host)
headers = {
'api-key': api_key,
'Content-Type': "application/json"
}
conn.request(
"POST",
f"/openai/deployments/{api_model}/chat/completions?api-version=2024-06-01",
json.dumps(payload, ensure_ascii=False),
headers
)
res = conn.getresponse()
return res.read().decode("utf-8")

def main():
desired_language = input("What language would you like to translate to? ").strip()
new_language_slug = input("What is the slug for the language? ").strip()
result_folder = os.path.join(LOCALES_DIR, new_language_slug)
if not os.path.exists(result_folder):
os.makedirs(result_folder)
for filename in os.listdir(os.path.join(LOCALES_DIR, "en")):
result_dict = {}
path_to_file = os.path.join(LOCALES_DIR, "en", filename)
if not path_to_file.endswith(".json"):
continue
with open(path_to_file, "r") as file:
input_file = file.read()
input_file: Dict[str, str] = json.loads(input_file)
# Do the operation in batches of 100 messages
batches = [dict(list(input_file.items())[i:i + 100]) for i in range(0, len(input_file), 100)]

for batch in batches:
prompt = f"Translate the given i18next translation file from english to #{desired_language}. Answer only with the contents of the translated file. Don't include markdown markup around the result. The result should be valid JSON, it should start with the '{{'-character and it should end with the '}}' character. The input is in the next message."
user_message = json.dumps(batch, indent=2, ensure_ascii=False)
payload = create_payload(prompt, user_message)
api_key = get_api_key()
response = make_api_request(payload, api_key)
parsed = json.loads(response)
res = parsed['choices'][0]['message']['content']
# Using json5 because it tolerates slightly wrong commas
res_parsed = json5.loads(res)
result_dict.update(res_parsed)
print("Completed a batch")
result_file_path = os.path.join(result_folder, filename)

res = json.dumps(result_dict, indent=2, ensure_ascii=False)
with open(result_file_path, "w") as file:
file.write(res)
print(f"Translation saved to {result_file_path}")



print("Starting")
main()
12 changes: 12 additions & 0 deletions shared-module/packages/common/src/hooks/useLanguage.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { dir } from "i18next"
import { useRouter } from "next/router"

import { LANGUAGE_COOKIE_KEY } from "../utils/constants"
Expand All @@ -11,6 +12,15 @@ const DEFAULT_LANGUAGE = "en"

const CAN_ACCESS_COOKIES = detectAccessToCookies()

function getDir(language: string) {
try {
return dir(language)
} catch (e) {
// eslint-disable-next-line i18next/no-literal-string
return "ltr"
}
}

// If language is specified with the `lang` query param, use that and save that as a langauge preference.
// Otherwise use either the saved language preference or detect the desired language
export default function useLanguage(): string | null {
Expand All @@ -36,6 +46,8 @@ export default function useLanguage(): string | null {

// Set html lang=lang attribute
document.documentElement.lang = selectedLanguage
// Set right text direction
document.documentElement.dir = getDir(selectedLanguage)
}

return selectedLanguage
Expand Down
137 changes: 137 additions & 0 deletions shared-module/packages/common/src/locales/ar/cms.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
{
"add-peer-review": "إضافة مراجعة الأقران",
"add-peer-review-question": "إضافة سؤال مراجعة الأقران",
"add-self-review": "إضافة مراجعة ذاتية",
"add-slide": "إضافة شريحة",
"add-task": "إضافة مهمة",
"answer-required": "الإجابة مطلوبة",
"are-you-sure-you-want-to-discard-changes": "هل أنت متأكد أنك تريد تجاهل التغييرات غير المحفوظة؟",
"authors-block": "كتلة المؤلفين",
"authors-block-description": "تُستخدم كتلة المؤلفين لعرض نبذة مختصرة وصورة للمؤلف(ين) لصفحة معينة",
"available-repository-exercises": "تمارين المستودع المتاحة",
"background": "الخلفية",
"background-color": "لون الخلفية",
"background-image": "صورة الخلفية",
"block-list": "الكتل الحالية",
"block-menu": "إضافة كتلة / جميع الكتل المتاحة",
"block-props": "خصائص الكتلة",
"button-text-create": "إنشاء",
"button-text-export-all-pages": "تصدير جميع الصفحات",
"button-text-select-media": "اختيار الوسائط (غير مُنفّذ)",
"chapter-progress-placeholder": "عنصر نائب لتقدم الفصل",
"chapter-progress-placeholder-explanation": "تُستخدم هذه الكتلة لعرض تقدم الفصل. لعرض تقدم الدورة بالكامل، يجب عليك استخدام كتلة تقدم الدورة.",
"chapters-grid-placeholder": "عنصر نائب لشبكة الفصول",
"chapters-grid-placeholder-explanation": "تُوضع هذه الكتلة في الصفحة الأمامية لمواد الدورة للتنقل بسهولة بين الفصول المختلفة.",
"close": "إغلاق",
"code-giveaway": "توزيع الأكواد",
"code-giveaway-explanation": "تشير هذه الكتلة إلى مكان توزيع الأكواد في مواد الدورة.",
"conditional-block": "كتلة تُعرض بشرط",
"conditional-block-explanation": "ستُعرض هذه الكتلة للطالب إذا استوفى جميع الشروط المحددة.",
"conditionally-shown-content": "المحتوى المعروض بشرط",
"configure-review-answers-option": "تكوين خيار إجابات المراجعة",
"congratulations-explanation": "تُوضع هذه الكتلة في مواد الدورة حيث ترغب في تهنئة الطالب عند إكمال الدورة. بالنسبة للدورات التي تم تكوينها للحصول على ECTS، ستوفر أيضًا رابطًا لصفحة حيث يمكنهم تسجيل إكمالهم في الجامعة المفتوحة.",
"congratulations-placeholder": "عنصر نائب للتهنئة",
"course-instance-enrollment-condition": "الطالب مسجل في أي من دورات الدورة التالية:",
"course-progress-placeholder": "عنصر نائب لتقدم الدورة",
"course-progress-placeholder-explanation": "تُوضع هذه الكتلة في مواد الدورة حيث ترغب في عرض تقدم المستخدم الحالي وعدد النقاط التي حصل عليها من الدورة بالكامل.",
"default": "افتراضي",
"default-question": "أدخل السؤال هنا",
"delete": "حذف",
"edit": "تحرير",
"editor-select-sidebar-view": "تبديل العرض",
"error": "خطأ",
"error-cannot-render-editor-for-exercise-service-x": "لا يمكن عرض المحرر لخدمة التمرين {{slug}}.",
"error-cannot-render-exercise-task-missing-url": "لا يمكن عرض مهمة التمرين، عنوان URL مفقود.",
"error-question-too-short": "السؤال قصير جدًا.",
"error-spec-not-parseable": "المواصفات غير قابلة للتحليل.",
"exercise-custom-view-block": "كتلة عرض مخصصة للتمرين",
"exercise-custom-view-block-explanation": "عرض لخدمة التمرين غير متعلق بتمرين.",
"exercise-max-points": "الحد الأقصى للنقاط",
"exercise-name": "اسم التمرين",
"exercise-title": "التمرين",
"exercises-in-chapter-placeholder": "عنصر نائب للتمارين في الفصل",
"exercises-in-chapter-placeholder-explanation": "تُوضع هذه الكتلة في الصفحة الأمامية لكل فصل، مثل /chapter-1/ لعرض والتنقل بين التمارين المختلفة داخل الفصل.",
"failed-loading-repository-exercises": "فشل تحميل تمارين المستودع",
"font-color": "لون الخط",
"glossary-placeholder": "عنصر نائب للقاموس",
"glossary-placeholder-explanation": "ستحتوي هذه الكتلة على قاموس الدورة.",
"header-export": "تصدير",
"instructions": "التعليمات",
"label-align-bottom": "محاذاة للأسفل",
"label-align-center": "محاذاة للوسط",
"label-default": "افتراضي",
"label-email-subject": "موضوع البريد الإلكتروني",
"label-no-padding": "بدون حشو",
"label-points-are-all-or-nothing": "النقاط كلها أو لا شيء",
"label-question": "السؤال",
"label-repeat-background-x": "تكرار الخلفية أفقيًا",
"label-template-name": "اسم القالب",
"label-title": "العنوان",
"label-weight": "الوزن",
"landing-page-copy-text": "نص نسخة الصفحة الرئيسية",
"learning-objectives": "أهداف التعلم",
"limit-number-of-tries": "تحديد عدد المحاولات",
"link-course-default-peer-review-config": "تكوين مراجعة الأقران الافتراضية للدورة",
"loading": "جارٍ التحميل...",
"loading-repository-exercises": "جارٍ تحميل تمارين المستودع",
"map-block-placeholder": "عنصر نائب لخريطة الكتلة",
"map-block-placeholder-explanation": "هذا عنصر نائب لخريطة تُظهر البلدان التي سجل فيها الطلاب في الدورة.",
"menti-height-help-text": "الارتفاع بالبكسل. قم بضبط ارتفاع النافذة المدمجة بحيث يختفي شريط التمرير. تأكد أيضًا من أن شريط التمرير غير مرئي في مواد الدورة.",
"menti-height-label": "الارتفاع",
"menti-panel-instructions": "يرجى لصق عنوان URL للتضمين والإرسال. بعد ذلك يمكنك تحديد العنوان والارتفاع.",
"menti-panel-title": "سمات Mentimeter",
"menti-title-help-text": "تعيين عنوان. يُستخدم هذا بواسطة قارئات الشاشة.",
"menti-title-label": "العنوان",
"module-completion-condition": "أكمل الطالب أيًا من الوحدات التالية:",
"needs-peer-review": "يحتاج إلى مراجعة الأقران",
"no-repository-exercises-found-for-course": "لم يتم العثور على تمارين مستودع للدورة",
"open-saved-page-in-new-tab": "فتح الصفحة المحفوظة في علامة تبويب جديدة",
"outdated-blocks-migrated-explanation": "تم إنشاء {{num}} كتل بإصدار أقدم من المحرر وكان يجب ترحيلها إلى تنسيق جديد. احفظ الصفحة لتثبيت التغييرات.",
"pages-in-chapter-placeholder": "عنصر نائب للصفحات في الفصل",
"pages-in-chapter-placeholder-explanation": "تُوضع هذه الكتلة في الصفحة الأمامية لكل فصل، مثل /chapter-1/ للتنقل بسهولة بين الأقسام الفرعية المختلفة.",
"partially-transparent-background": "جعل صورة الخلفية شبه شفافة",
"partners-block": "كتلة الشركاء",
"partners-block-description": "تُستخدم كتلة الشركاء لعرض شعارات جميع الشركاء في الصفحة الرئيسية",
"peer-and-self-review-configuration": "تكوين مراجعة الأقران والمراجعة الذاتية",
"peer-review-accepting-threshold": "عتبة قبول مراجعة الأقران",
"peer-review-processing-strategy": "استراتيجية معالجة مراجعة الأقران",
"peer-review-question": "سؤال مراجعة الأقران",
"peer-review-question-type": "نوع سؤال مراجعة الأقران",
"peer-reviews-to-give": "مراجعات الأقران لتقديمها",
"peer-reviews-to-receive": "مراجعات الأقران لتلقيها",
"peer-reviews-to-receive-and-give-error-message": "يجب أن تكون المراجعات الزملاء المقدمة أكبر من المراجعات الزملاء المستلمة",
"please-select-exercise-type": "يرجى اختيار نوع التمرين:",
"remove": "إزالة",
"research-form-checkbox-description": "يستخدم هذا المربع لإضافة سؤال إلى نموذج البحث.",
"reset": "إعادة تعيين",
"save": "حفظ",
"saved": "تم الحفظ",
"saving": "جارٍ الحفظ...",
"select": "اختر",
"select-an-option": "اختر خيارًا",
"select-repository-exercise": "اختر تمرين المستودع",
"selected-exercise-type": "نوع التمرين المختار: {{exerciseType}}",
"separator-color": "لون الفاصل",
"serialize-to-html": "تحويل إلى HTML",
"slide-title": "شريحة {{ number }}",
"start": "ابدأ",
"table-box": "صندوق الجدول",
"table-box-description": "هذا هو كتلة جدول مخصصة بخلفية ملونة",
"table-width-customizer": "مخصص عرض الجدول",
"task": "مهمة",
"title-additional-review-instructions": "تعليمات مراجعة إضافية",
"title-assignment": "مهمة",
"title-outdated-blocks-migrated": "تم ترحيل الكتل القديمة",
"title-research-form-question": "سؤال نموذج البحث",
"top-level-block-placeholder": "عنصر نائب لصفحات المستوى الأعلى",
"top-level-block-placeholder-explanation": "تسرد هذه الكتلة جميع الصفحات العليا في الدورة وتوضع في الصفحة الأمامية لمواد الدورة.",
"tries-per-slide": "أقصى عدد من المحاولات لكل شريحة",
"unsupported-block-placeholder": "عنصر نائب للكتل غير المدعومة",
"unsupported-block-placeholder-explanation": "تستخدم هذه الكتلة كعنصر نائب للكتل غير المدعومة.",
"upload-or-drag-and-drop-onto-this-block": "قم بالتحميل أو السحب والإفلات على هذه الكتلة",
"use-course-default-peer-review-config": "استخدم إعدادات مراجعة الزملاء الافتراضية للدورة",
"use-default-text-for-label": "استخدم النص الافتراضي للتسمية",
"warning-points-are-all-or-nothing-disabled": "تحذير: يُوصى بتمكين “النقاط كلها أو لا شيء”. تختلف المراجعات الزملاء التي يقدمها الطلاب بشكل كبير في الجودة، مما قد يؤدي إلى حصول بعض الطلاب على نقاط غير عادلة من التمرين. تمكين هذا الخيار يقلل من العشوائية في النقاط المستلمة، مما يجعل عملية مراجعة الزملاء أكثر عدلاً للطلاب.",
"welcome-message-for-course": "رسالة ترحيب للدورة...",
"width-of-table": "عرض الجدول"
}
Loading

0 comments on commit cdd2894

Please sign in to comment.