التنبيهات التالية ظهرت :
Warning [2] Undefined array key "lockoutexpiry" - Line: 94 - File: global.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/global.php 94 errorHandler->error
/showthread.php 28 require_once
Warning [2] Undefined property: MyLanguage::$today_rel - Line: 474 - File: inc/functions.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/inc/functions.php 474 errorHandler->error
/global.php 489 my_date
/showthread.php 28 require_once
Warning [2] Undefined array key "lockoutexpiry" - Line: 573 - File: global.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/global.php 573 errorHandler->error
/showthread.php 28 require_once
Warning [2] Undefined variable $can_access_moderationqueue - Line: 749 - File: global.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/global.php 749 errorHandler->error
/showthread.php 28 require_once
Warning [2] Undefined array key "avatartype" - Line: 889 - File: global.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/global.php 889 errorHandler->error
/showthread.php 28 require_once
Warning [2] Undefined array key "avatartype" - Line: 889 - File: global.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/global.php 889 errorHandler->error
/showthread.php 28 require_once
Warning [2] Undefined variable $awaitingusers - Line: 34 - File: global.php(956) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/global.php(956) : eval()'d code 34 errorHandler->error
/global.php 956 eval
/showthread.php 28 require_once
Warning [2] Undefined array key "style" - Line: 1021 - File: global.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/global.php 1021 errorHandler->error
/showthread.php 28 require_once
Warning [2] Undefined property: MyLanguage::$lang_select_default - Line: 5196 - File: inc/functions.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/inc/functions.php 5196 errorHandler->error
/global.php 1021 build_theme_select
/showthread.php 28 require_once
Warning [2] Undefined array key "additionalgroups" - Line: 7360 - File: inc/functions.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/inc/functions.php 7360 errorHandler->error
/inc/functions.php 5216 is_member
/global.php 1021 build_theme_select
/showthread.php 28 require_once
Warning [2] Undefined property: MyLanguage::$bottomlinks_forumteam - Line: 2 - File: global.php(1033) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/global.php(1033) : eval()'d code 2 errorHandler->error
/global.php 1033 eval
/showthread.php 28 require_once
Warning [2] Undefined property: MyLanguage::$bottomlinks_markread - Line: 15 - File: global.php(1056) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/global.php(1056) : eval()'d code 15 errorHandler->error
/global.php 1056 eval
/showthread.php 28 require_once
Warning [2] Undefined array key "mybb" - Line: 1997 - File: inc/functions.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/inc/functions.php 1997 errorHandler->error
/inc/functions_indicators.php 41 my_set_array_cookie
/showthread.php 669 mark_thread_read
Warning [2] Undefined property: MyLanguage::$ratings_update_error - Line: 5 - File: showthread.php(772) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php(772) : eval()'d code 5 errorHandler->error
/showthread.php 772 eval
Warning [2] Undefined variable $postsdone - Line: 905 - File: showthread.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php 905 errorHandler->error
Warning [2] Undefined array key 139 - Line: 911 - File: showthread.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php 911 errorHandler->error
Warning [2] Undefined array key 139 - Line: 1640 - File: showthread.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php 1640 errorHandler->error
/showthread.php 923 buildtree
Warning [2] Undefined array key "additionalgroups" - Line: 7360 - File: inc/functions.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/inc/functions.php 7360 errorHandler->error
/inc/functions_user.php 816 is_member
/inc/functions_post.php 416 purgespammer_show
/showthread.php 924 build_postbit
Warning [2] Undefined array key "profilefield" - Line: 6 - File: inc/functions_post.php(484) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/inc/functions_post.php(484) : eval()'d code 6 errorHandler->error
/inc/functions_post.php 484 eval
/showthread.php 924 build_postbit
Warning [2] Undefined array key "canonlyreplyownthreads" - Line: 672 - File: inc/functions_post.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/inc/functions_post.php 672 errorHandler->error
/showthread.php 924 build_postbit
Warning [2] Undefined array key "showimages" - Line: 758 - File: inc/functions_post.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/inc/functions_post.php 758 errorHandler->error
/showthread.php 924 build_postbit
Warning [2] Undefined array key "showvideos" - Line: 763 - File: inc/functions_post.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/inc/functions_post.php 763 errorHandler->error
/showthread.php 924 build_postbit
Warning [2] Undefined array key "invisible" - Line: 1565 - File: showthread.php PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php 1565 errorHandler->error
Warning [2] Undefined property: MyLanguage::$post_deleted_error - Line: 21 - File: showthread.php(1597) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php(1597) : eval()'d code 21 errorHandler->error
/showthread.php 1597 eval
Warning [2] Undefined variable $threadnotesbox - Line: 33 - File: showthread.php(1597) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php(1597) : eval()'d code 33 errorHandler->error
/showthread.php 1597 eval
Warning [2] Undefined variable $multipage - Line: 36 - File: showthread.php(1597) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php(1597) : eval()'d code 36 errorHandler->error
/showthread.php 1597 eval
Warning [2] Undefined variable $multipage - Line: 68 - File: showthread.php(1597) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php(1597) : eval()'d code 68 errorHandler->error
/showthread.php 1597 eval
Warning [2] Undefined variable $addremovesubscription - Line: 82 - File: showthread.php(1597) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php(1597) : eval()'d code 82 errorHandler->error
/showthread.php 1597 eval
Warning [2] Undefined variable $thread_deleted - Line: 104 - File: showthread.php(1597) : eval()'d code PHP 8.1.2-1ubuntu2.18 (Linux)
File Line Function
/showthread.php(1597) : eval()'d code 104 errorHandler->error
/showthread.php 1597 eval




تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تعريب برنامج بيثون
#1
تعريب برنامج بيثون
سنستخدم ادوات عامة لشرح تعريب برنامج بيثون أو تحويل الى اي لغة أخرى (internationalization).
ستحتاج اذا الى تثبيت الادوات التالية ان لم تكن موجودة على نظامك:
مجموعة الادوات gettext وهي مجموعة من الادوات مطورة خصيصا لتدويل برامج مهما كانت اللغة المستخدمة في تطويرها.
كود :
pip3 install python-gettext
أو راجع الموقع الرسمي للبحث عن طرق أخرى للتثبيت: https://www.gnu.org/software/gettext
حيث ستجد أيضا دليل الاستخدام.
سنترجم برنامج صغير هو عبارة عن لعبة سودوكو SudokuBan يمكن تنزيلها من الرابط التالي: https://sourceforge.net/projects/sudokub.../sudokuban
البرنامج قديم مبرمج بواسطة بيثون2، لذلك اذا اردت تشغيله تستخدم:
كود :
python2 sudokuban.py
# المراحل:
- استخراج السلاسل النصية التي نرغب في ترجمتها
- ترجمة السلاسل النصية
- تعديل البرنامج ليأخذ في الاعتبار التدويل (internationalization)

## استخراج السلاسل النصية
بالنسبة لبرنامجنا، سواء على وندوز او لينكس، ننتقل الى المجلد حيث قمنا بفك الارشيف ثم ننفذ الامر التالي:
كود :
xgettext -a sudokuban.py
على وندوز :
كود :
xgettext.exe -a sudokuban.py
الخيار a لكي نستخرج جميع السلاسل النصية دون استثناء. يمكن مراجعة دليل مساعدة xgettext للمزيد من الخيارات.
سينتج عن الامر الذي نفذناه ملف نصي يحمل اسم messages.po في نفس المجلد. ظهرت لي بعض الرسائل عند استخراج النصوص تتعلق كلها تقريبا بالسلسلة msgid مفادها أنها سلسلة فارغة وأن هذا الاستخدام محجوز للاداة gettext. سنتجاوز هذه الرسالة لأننا سوف لن نترجم على كل حال سلسلة نصية فارغة. سنقوم بانشاء سلسلة مجلدات داخل مجلد برنامجنا بحسب اللغة عبر الواجهة الرسومية او عبر الطرفية كما يلي بالنسبة الى لينكس:
اللغة العربية:
كود :
mkdir -p locale/ar_AR/LC_MESSAGES
اللغة الفرنسية:
كود :
mkdir -p locale/fr_FR/LC_MESSAGES
ننقل ملف messages.po الى المجلد LC_MESSAGES

## ترجمة السلاسل النصية
ليس من الضروري ترجمة كل شيء. سوف لن نترجم سوى السلاسل النصية المفيدة. أسهل حل للتعرف على السلاسل النصية ذات الاهمية هو تشغيل البرنامج بلغته الاصلية. ثم، لترجمة النصوص يمكن استخدام محرر نصوص عادي او استخدام محررات متخصصة مثل poedit. هنا سأستخدم محرر نصوص عادي (لكن يدعم التلوين) لأن عدد السلاسل النصية ليس كبيرا. هذه السطور الاولى في ملف messages.po عندي:
كود :
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#: sudokuban.py:304 sudokuban.py:385 sudokuban.py:458
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-01 00:00+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: sudokuban.py:41
msgid "Create a new empty or random puzzle."
msgstr ""
كيف نفهم هذا الملف؟
الجزء الاول يتعلق بالحقوق وبالمترجم. سوف لن نهتم بهذا في موضوعنا. سنعدل فقط السطر المتعلق بترميز المحارف:
كود :
"Content-Type: text/plain; charset=UTF-8\n"
الذي يهمنا أكثر هي الاجزاء بدأ من :
كود :
#: sudokuban.py:41
msgid "Create a new empty or random puzzle."
msgstr ""
التعليق sudokuban.py:41 يحدد لنا اسم الملف ورقم السطر المستخرج منه السلسلة النصية
السطر msgid هو السطر الاصلي المستخرج. يجب أن نتركه كما هو
السطر msgstr هنا سنكتب ترجمتنا للنص الموجود فوقه مباشرة. اذا بعد الترجمة ستكون السطور الثلاثة كما يلي:
كود :
#: sudokuban.py:41
msgid "Create a new empty or random puzzle."
msgstr "إنشاء لغز جديد فارغ أو عشوائي."
وهكذا نستمر في ترجمة ما نراه مهما ويحتاج الى ترجمة.

## تعديل البرنامج
بعد الانتهاء من ترجمة السلاسل النصية نمر لتعديل البرنامج حتى يأخذ في الاعتبار اللغة التي أضفناها.
نحتاج الى ان يكون الملفان messages.po و sudokuban.py مفتوحين. من ملف messages.po لدينا رقم السطر الذي ترجمناه. نبحث عنه في ملف sudokuban.py ثم نعدله عبر وضع السلسلة النصية بين _() كما يلي:
كود :
# Tooltips. TODO: i18n.
tipNew = _('Create a new empty or random puzzle.')
وهكذا نستمر مع جميع السلاسل النصية التي ترجمناها. هو عمل يدوي هنا، وبالتاكيد يوجد برامج اكثر كفاءة لتقوم بهذا العمل عوضا عنا، لكننا مازلنا في بداياتنا هنا كما أن البرنامج لا يحتاج الى الكثير من الجهد كما أظن.
عندما ننتهي من تعديل ملف sudokuban.py نعود الى اوله لنستورد المكتبات الضرورية (تركت هذا لآخر مرحلة حتى لا يضيع ترتيب السطور):
كود :
import os, sys, time
import pygtk, gtk, pango
import gettext              # نستورد هذه المكتبة
from sudoku import *
ثم نضيف السطور التالية بعد سطور التعليق التالي
كود :
# Tooltips. TODO: i18n.     # يجدر حذف هذا التعليق
# i16ln
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("messages", localdir)
## بناء الملف الثنائي
هذه آخر مرحلة. لكي يستطيع البرنامج قراءة ملف اللغة messages.po لابد من تحويل الى ملف ثنائي. سنستخدم أداة تابعة لـgettext وهي تسمى msgfmt
كما يلي (طبعا بعد التنقل الى المجلد LC_MESSAGES الذي حفظنا فيه ملف الترجمة):
كود :
msgfmt messages.po
بالنسبة لوندوز سيكون الامر كما يلي:
كود :
msgfmt.exe messages.po
سنحصل، بعد تنفيذ هذا الامر على ملف باسم messages.mo وهو الملف الثنائي الموافق للملف النصي الذي ترجمناه.
يفترض بعد هذا الماراطون أن يكون برنامجك متوافقا بعد لغة النظام لديك.
حظا موفقا، في انتظار تفاعلاتكم :/
## ملاحظات
ملاحظة1: برنامج sudokuban الذي اعتمدته كمثال يمكنك تنزيله من الرابط المذكور في الموضوع او من المرفقات.
ملاحظة2: تحديد السلاسل النصية التي تحتاج الى الترجمة عمل مضني ودقيق عندما نمارسه بشكل يدوي. يفترض أن مطور البرنامج قد حدد بنفسه ما يمكن ترجمته وما لا يفترض أن يترجم. بما أن مطور البرنامج الذي اعتمدناه كمثال لم يأخذ في الحسبان تعدد اللغات في برنامجه، وجدت صعوبة في تحديد ما يمكن ترجمته مما يجب أن يبقى كما هو (أسماء الملفات مثلا).. هذا بالاضافة الى أن لكل مكتبة من المكتبات الرسومية آلياتها الخاصة في اعتماد تعدد اللغات .. يبقى هذا الموضوع محاولة أولى لفهم كيفية ترجمة برامج بيثون.


الملفات المرفقة
.gz   sudokuban-1.0.tar.gz (الحجم : 54.31 KB / التحميلات : 1)
الرد


الردود في هذا الموضوع
تعريب برنامج بيثون - بواسطة محمد - 07-06-2018, 12:54 AM

التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف