ترجمة إضافات nvda, الدرس الثاني

MesterPerfect

Administrator
طاقم الإدارة
إنضم
6 أغسطس 2018
المشاركات
3,556
مستوى التفاعل
2,665
النقاط
113
الإقامة
sohag, Egypt
الموقع الالكتروني
www.youtube.com
الجنس
ذكر
نظام التشغيل
Windows10
قارئ الشاشة المستخدم
nvda
Whatsapp
201554240991
السَلام عليكم ورحمة الله وبركاته
في هذا اليوم أرتأيت أن أتشارك معكم كيفية ترجمة إضافات nvda وبمنتها السهولة والبساطة
طبعا الشرح للأستاز صلاح البرعصي جزاه الله خيرا
وأنا لم أرتأي أن أكتب شرح لطريقة الترجمة لأن شرح الأستاز صلاح يفي بالغرض ويزيد
ولكن في حال أردتم أن أقوم بكتابة شرح فلا مشكلة عندي إن شاء الله
ولكن هذا الشرح سيفي ويزيد
ولأي استفسار سأكون معكم إن شائ الله
لمتابعة الطريقة الأولى
يمكنكم ذلك عبر الرابط التالي


والآن مع الطريقة الثانية الخاصة بالأستاز صلاح جزاه الله خيرا

السلام عليكم ورحمة الله وبركاته
ها نحن نستكمل ما بدأناه ولقد ذكَرنا أنه حين الترجمة ستجد نفسَكَ بين أمرين الأول وجود ملف nvda.po ولقد تحدّثنا عنه سابقاً
والآن سنعمل على الأمر الثاني وهو افتراض عدم وجود هذا الملف أصلاً,
فالإضافة لا تحوي أي ترجمات لا بالعربي ولا بغيره, وفي هذه الحالة سنُنشِئ كخطوة أولى ملف nvda.po والخطوة الثانية سنترجم ما به من عبارات,
وقبل أن نبدأ في شرْحِ الموضوع علينا أن نُحَمِّلَ الملفات التاليَة:

أولا
المكتبة xFind وهي تختلف عن السابقة بل هي إصدار جديد منها
بالمرفقات
أو يمكنكم نسخ الكود التالي

Python:
import api
def xFind (text, first, last):
    list = []
    x = 0
    y = 0
    size = text.count (first)
    for i in range(size):
        x = text.find(first ,y)+ len (first)
        y = text.find(last, x)
        list.append(text[x:y])
    return list

def nvdaPo ():
    x = api.getClipData()
    list1 = xFind(x, '_("', '")')
    list2 = xFind(x, "_('", "')")
    list = list1+list2
    for i in list:
        print 'msgid "%s"\nmsgstr ""\n' %(i)

ثم وضعه في ملف txt
ثم تغيير اسمه وأمتداده إلى xFind.py
ثانيا
برنامج Notepad++
وهو برنامج يشبِه المفكرة إلا أنه متطوِّر جداً وخاص بالتعامل مع لغات البرمجة المختلفة سواء بايثون أو غيرها فهو محرر لغات برمجة ممتاز للغاية,
ألم تتفاجَؤوا يوماً حينَ تفتَحوا بعض الملفات فتجدوا أن الملف من داخله ليس بالشكل المطلوب وَتُلْفُوا كثير من الأسطر في سطر واحد مع أنها في الحقيقة متعددة, والسبب في ذلك أنه تم تحريرها بهذا البرنامج وأنتَ تفتحها بالمفكرة.
على فكرة هذا البرنامج يوفر تعب التثليمات فهو يُثَلِّم التابات بنفسه ودون الحاجة لتدخُّلِكَ إلا في القليل النادر. إليكم رابط البرنامج:


وإليكم هذا الملف القياسي nvda.po الذي ستجرون عليه التعديلات اللازمة
نبدأ الآن في الجد
1-انسخ المكتبة xFind إلى مجلد nvda سواء في المحمولة أو الثابتة, وأعِدْ تشغيل قارء الشاشة.
2- اذهبْ إلى الإضافة المراد إنشاء ملف nvda.po لها, ادخُلْها وحدد كل ما فيها ثم انسخه,
الآن أنتَ تحوز في الحافظة نصاً كبيراً يحوي على بعض الرسائل,.
3- افتح البوابة واكتب ما يأتي:

Python:
from xFind import nvdaPo

تم استيراد الدالة nvdaPo من المكتبة xFind
الآن ننفِّذُ الدالة

Python:
nvdaPo()

لاحظْ أن الدالة لا تأخذ أي معامل كما أنها ستطبع لك الرسائل في الشكل المطلوب ,
أي الطريقة المتبعة في ملفات nvda.po
نظرة سريعة إلى النتائج وهي من عمل سابق لي, وضعتُ فيه ترجمة لإضافة لا يوجد لها ترجمة أصلاً وهي إضافة speech_beep_omiter
ووظيفة هذه الإضافة لمن لم يعرفها تخطي المرحلة الثانية وهي مرحلة beep حين الضغط على nvda+s
فنحن كنا في الوضع الافتراضي نمر على ثلاث حالات هي تشغيل الصوت وإصدار صوت الصفير وإيقاف الصوت,
وطبعاً حالة الصفير هذه خاصة بمن يستخدم البرايل مع nvda
وباعتبار قلة أجهزة قراءة البرايل بسبب ارتفاع أسعارها فإنه من الأفضل إلغاء هذه الحالة,
على العموم أنا دخلتُ الإضافة ونسختُ كل ما فيها دون فرق ثم كتبتُ في البوابة ما ذكرتُه لكم سابقاً وكانت النتائج وكالتالي:

كود:
>>> from xFind import nvdaPo
>>> nvdaPo()
msgid "speech off."
msgstr ""

msgid "speech on."
msgstr ""

انسخ نتيجة الكود السابق ولا تنسخ الأكواد.
4- اذهبْ إلى الملف المضغوط الجاهز فك عنه الضغط ادخِله ثم ادخل إلى مجلد ar ثم تعمق حتى تصل إلى nvda.po افتحه ببرنامج notepad++ ثم اذهب إلى أسفل الملف واحذف الرسالتين التي وضعتهما افتراضياً في نهاية الملف للدلالة على موضع اللصق, ثم ألْصِق ما نسختَ سابقاً ثم احفظ وَاخْرُجْ.
5- افتح الملف nvda.po مرة ثانية ولكن هذه المرة بواسطة برنامج poedit
واعملْ على ترجمتِه ستلاحظ وجود نجمة star أمام كل عبارة وهذه علامة على أن هذه العبارات غير مترجمة,
بعد أن تُتِمّ ترجمة كل العبارات
من قوائم البرنامج اذهبْ إلى كاتالوج واختر منه خصائص
في الخانة الأولى اكتب اسم الإضافة واملَأ الخانات التي كُتِبَ فيها none وهي عبارة وضعتُها لكم بمعنى بِلَا
أي بِلَا تسمية, خانة اسم الفريق والبريد الالكتروني خياريتان بإمكانكَ تركُهما,
بعد الانتهاء احفظْ واخْرُجْ.
5- افتح ملف الإضافة المنتهي بِ .py
والذي في العادة يكون اسمه init لكن في أحيان أخرى ستجده باسم الإضافة
ادخُلْ إلى هذا الملف واسْتَورِدْ هذه المكتبة.

Python:
import addonHandler

ثم اكتبْ تحتها مباشرة هذا الكود

Python:
addonHandler.initTranslation()

6- اذهبْ إلى ملف منفست العربي
ستلاحظ أني وضعتُ لكم أسماء افتراضية اعملوا على تغييرها بما يناسب.
7- أعِدْ تشغيل الإضافة وهكذا انتهتْ العملية بنجاح, أرجو التوفيق للجميع,
ملاحظة
ينبغي أن تكتبَ حين تصميمِكَ للإضافات العبارات المراد ترجمتها على النحو التالي:
ui.message(_('speech on')) وهذا النوع يسمى unicode ولا يغنيك هذا الوضع عن كتابة حرف u في حالة التعامل مع الرسائل العربية , مثال لهذه الحالة: [ICODE]ui.message(_(u'إيقاف الصوت'))
والأفضل والأكمل أن تتم مشروعكَ من غير كتابة أي حرف عربي بل تصمم ملف لترجمة اللغة العربية, عوضاً عن كتابة الرسائل بالعربية مباشرة.
أنتظِر إضافاتكم والسلام عليكم ورحمة الله وبركاته.[/ICODE]
طبعا بهذا ينتهي الدرس الثاني من الشروحات التي قدمها الأستاز صلاح
بالنسبة للملف القياسي الذي تكلم عنه الروابط الخاصة به تالفة
ولكن في حال ما أردتم أن أقوم بإنشاء ملف بديل عنه فلا مشكلة في ذلك فالأمر بسيط
ويمكن إنجازه بمنتها السهولة من داخل برنامج poedit
ولأي استفسار أنا في خدمتكم إن شاء الله
وسَلام الله عليكم ورحمته وبركاته
 

المرفقات

  • xFind.7z
    394 بايت · المشاهدات: 24
شكراً لك أخي أحمد
ولكن ما المراد بهذه الجملة
2- اذهبْ إلى الإضافة المراد إنشاء ملف nvda.po لها, ادخُلْها وحدد كل ما فيها ثم انسخه,
 
شكراً لك أخي أحمد
ولكن ما المراد بهذه الجملة
2- اذهبْ إلى الإضافة المراد إنشاء ملف nvda.po لها, ادخُلْها وحدد كل ما فيها ثم انسخه,
العفو أخي الكريم
بالنسبة للنقطة التي أشرت إليها
يُقصد بها أن تذهب إلى ملف الأكواد الموجود بالإضافة ويكون بأمتداد py
ثم تفتحه باستخدام notbad وتنسخ الأكواد الموجودة داخله
مثال هذه الإضافة مثلا aCopy Append
ملف الpy الخاص بها موجود على هذا المسار "%appdata%\nvda\addons\aCopy Append\globalPlugins\Copy Append\__init__.py"
وإذا فتحناه نجد الأكواد داخله على هذا الشكل
Python:
# -*- coding: utf-8 -*-

# Global Plugin Created By Alsari <[email protected]>
# Date: Dec 2012
# This Plugin wil Let you Append New text to the existing text on the Clipboard without Replacing it.

import globalPluginHandler
import api
import ui
import textInfos
import scriptHandler

class GlobalPlugin(globalPluginHandler.GlobalPlugin):
    def script_AppendTextToClipboard(self, gesture):
        #  First of all try to filter random calls to the script and avoid copying the same text more than once, by testing repeet cound of the script handler
        repeatCount =scriptHandler.getLastScriptRepeatCount()
        if repeatCount:
            return

        # Here is our Veriables.
        ClipboardText = ""
        SelectedText = ""
        ResultText = ""
        info = ""
        # It is the time of  Getting The selected text, I used The NVDA source to do it via Global Commands.py

        obj=api.getFocusObject()
        treeInterceptor=obj.treeInterceptor
        if hasattr(treeInterceptor,'TextInfo') and not treeInterceptor.passThrough:
            obj=treeInterceptor
        try:
            info=obj.makeTextInfo(textInfos.POSITION_SELECTION)
        except (RuntimeError, NotImplementedError):
            info=None
        if not info or info.isCollapsed:
            ui.message("no selection")
            return
        else:
            SelectedText = info.text

        # We will get the clipboard text, this will done throu NVDA api.
        try:
            ClipboardText = api.getClipData()
        except:
            api.copyToClip(SelectedText)
            ui.message("Copyed")
            return

        # Prepair our text to copy.
        ResultText = ClipboardText + "\n" + SelectedText
        try:
            api.copyToClip(ResultText)
            ui.message("Appended")
        except:
            ui.message("Faild to Append Text")

    # Function To Clear The Clipboard.
    def script_clearClipboard(self, gesture):
        import win32clipboard
        win32clipboard.OpenClipboard()
        try:
            win32clipboard.EmptyClipboard()
            ui.message("Clipboard Cleared")
        except win32clipboard.error:
            pass
        finally:
            win32clipboard.CloseClipboard()

    # Documentation
    script_AppendTextToClipboard.__doc__ = _("Lets you Append New text to the existing text on the Clipboard without Replacing it")
    script_clearClipboard.__doc__ = _("Clears The clipboard")


    __gestures={
        "kb:control+shift+c": "AppendTextToClipboard",
        "kb:NVDA+shift+c": "clearClipboard",
    }
نقوم بنسخ الأكواد ثم نفتح البوابة ونستدعي الدوال كما تبين في الشرح
فيكون الناتج بهذا الشكل

Python:
>>> from xFind import nvdaPo
>>> nvdaPo()
msgid "Lets you Append New text to the existing text on the Clipboard without Replacing it"
msgstr ""

msgid "Clears The clipboard"
msgstr ""
في حال لم يكن الأمر واضح بالشكل الكافي أخبرني
تحياتي لك أخي
 
شكراً لك أخي أحمد
ولكن ما المراد بهذه الجملة
2- اذهبْ إلى الإضافة المراد إنشاء ملف nvda.po لها, ادخُلْها وحدد كل ما فيها ثم انسخه,
أيضا يمكن تطبيق الشرح على إضافات أخرى مثل addonUpdater ولكن يجب جمع جميع أكوادها في ملف واحد ثم نسخها دفعة واحدة إلى الحافظة واستدعاء الدوال من المكتبة وستخرج لنا جميع الرسايل من الإضافة
 
ما شاء الله عليك تسلم أخي الحبيب أحمد
شرح رائع وموضوع في غاية الروعة والجمال
بارك الله فيك وجزاك الله كل خير
شكرا جزيلا لك على هذا الموضوع المميز والمفيد جدا
تقبل تحياتي.
 
حياك الله أخي أحمد وبَارَكَ فيكَ
ولِيْ عدة أسئلةة في الخطوة الخامسة
5- افتح ملف الإضافة المنتهي بِ .py
السؤال
هل يَقصد فتحه في notepad?
الشرح
والذي في العادة يكون اسمه init لكن في أحيان أخرى ستجده باسم الإضافة
السؤال
لنفترض أننا عندنا أكثر من ملف بصيغة .py ماذا نَفعل؟
الشرح
ادخُلْ إلى هذا الملف واسْتَورِدْ هذه المكتبة.
السؤال
ما المراد بالدخول إلى الملف؟
الشرح
import addonHandler
ثم اكتبْ تحتها مباشرة هذا الكود
addonHandler.initTranslation()
والسؤال الأخير
عند ترجمتي لبعض الإضافات أجد أنها تحتوي على نقاط وعلامات ترقيم هل أكتب تلك النقاط والعلامات كما هي أَم ماذا؟
وتقبل تحياتي
 
حياك الله أخي أحمد وبَارَكَ فيكَ
وعليك تحية الله أخي

ولِيْ عدة أسئلةة في الخطوة الخامسة
سوف أقوم بإجابتك خطوة بخطوة بإذن الله

5- افتح ملف الإضافة المنتهي بِ .py
السؤال
هل يَقصد فتحه في notepad?
نعم يقصد أن تقوم بفتح ملف الpy في المفكرة notepad?

الشرح
والذي في العادة يكون اسمه init لكن في أحيان أخرى ستجده باسم الإضافة
السؤال
لنفترض أننا عندنا أكثر من ملف بصيغة .py ماذا نَفعل؟
هنا يجب عليك أن تفتح الملفات وتعرف محتواهم
ولكي يكون الأمر سهل عليك
ملف الpy الصحيح يكون غير مشفر, يعني تجد الأكواد واضحة به دون مشاكل
أيضا يحتوي على أكواد استدعاء لمكاتب أخرى
مثال هذا الملف مثلا
Python:
REMOTE_KEY = "kb:f11"
import os
import sys
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
import json
sys.path.remove(sys.path[-1])
import threading
import time
import socket
from globalPluginHandler import GlobalPlugin
import logging
كما ترا
الملف أوله كله مليئ بأكواد استدعاء لمكاتب أخرى
طبعا هذا الملف من إضافة الremote

الشرح
ادخُلْ إلى هذا الملف واسْتَورِدْ هذه المكتبة.
السؤال
ما المراد بالدخول إلى الملف؟
يقصد أن تفتح الملف بمحرر النصوص notepad?

الشرح
import addonHandler
ثم اكتبْ تحتها مباشرة هذا الكود
addonHandler.initTranslation()
والسؤال الأخير
عند ترجمتي لبعض الإضافات أجد أنها تحتوي على نقاط وعلامات ترقيم هل أكتب تلك النقاط والعلامات كما هي أَم ماذا؟
نعم يالغالي يتم وضع العلامات كما هي.
ملحوظة, هناك كلمات ستجدها موجودة داخل أقواس مربعة كهذه, [], حذاري من العبث بها أو ترجمتها,
فهذه متغيرات تستدعي جُمل معينة وأكواد معينة.

وتقبل تحياتي
حياك الله أخي
لأي استفسار لا تتردد في طرحه وفي خدمتك إن شاء الله
تحياتي
 
أخي أحمد
قمت بفتح ملف الإضافة والذي كان اسمه
__init__.py
وكتبت الأكواد في البوابة وهذا ما ظهر لي
>>> import addonHandler
>>> addonHandler.initTranslation()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "addonHandler.pyo", line 431, in initTranslation
File "addonHandler.pyo", line 421, in getCodeAddon
AddonError: Code does not belong to an addon package.
ولم تنجح معي الترجمة.
فأينَ المشكلة؟
 
أخي أحمد
قمت بفتح ملف الإضافة والذي كان اسمه
__init__.py
وكتبت الأكواد في البوابة وهذا ما ظهر لي
>>> import addonHandler
>>> addonHandler.initTranslation()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "addonHandler.pyo", line 431, in initTranslation
File "addonHandler.pyo", line 421, in getCodeAddon
AddonError: Code does not belong to
an addon package.
ولم تنجح معي الترجمة.
فأينَ المشكلة؟
مع أي إضافة جربت هذا أخي
 
ما شاء الله عليك تسلم أخي الحبيب أحمد
شرح رائع وموضوع في غاية الروعة والجمال
بارك الله فيك وجزاك الله كل خير
شكرا جزيلا لك على هذا الموضوع المميز والمفيد جدا
تقبل تحياتي.
الله يسلمك ويبارك فيك أخي الحبيب
الأروع مرورك
تحياتي لك
 
إضافة clipspeak
المشكلة من الإضافة نفسها أخي
فقد حاولت استخراج عباراتها بأكثر من طريقة ولم تفلح
ولكن سأعود لها لاحقا وأتصرف معها
 
أخيأحمد المشكلة عندي ليست في استخراج أوامر الإضافة، أنا قمتُ باستخراجِ أوامرها
ويمكنكَ أن تشاهد الأوامر والتعريب من الرابط التالي
إنما المشكلة عندي في عدم عَمَل التعريب، بعد فتح ملف الإضافة وكتابة الأكواد التي في الأعلى.
 
عودة
أعلى