تمرين - استدعاء خدمة Translator

مكتمل

من خلال جاهزية خدمة Translator في كمبيوتر الخادم التي تم إنشاؤها على Azure والمتغيرات المخزنة للعمل، دعنا نوجه انتباهنا إلى إضافة المنطق والقالب اللازمين إلى تطبيقنا لترجمة النص. سنعمل من خلال الخطوات التالية:

  1. إضافة تعليمة برمجية لاستدعاء الخدمة
  2. إنشاء القالب لعرض النتائج
  3. اختبار تطبيقنا

إضافة تعليمة برمجية لاستدعاء الخدمة

يحتوي app.py على منطق لتطبيقنا. سنضيف بضع عمليات استيراد مطلوبة للمكتبات التي سنستخدمها، متبوعًا بالمسار الجديد للرد على المستخدم.

  1. في أعلىapp.py، أضف الأسطر التالية من التعليمات البرمجية:

    import requests, os, uuid, json
    from dotenv import load_dotenv
    load_dotenv()
    

سيستورد السطر العلوي المكتبات التي سنستخدمها لاحقًا، عند استدعاء خدمة Translator. كما سنقوم أيضاً باستيراد load_dotenv من dotenv وتنفيذ الدالة، والتي ستقوم بتحميل القيم من .env.

  1. في الجزء السفلي من app.py، أضف الأسطر التالية من التعليمات البرمجية لإنشاء المسار والمنطق لترجمة النص:

    @app.route('/', methods=['POST'])
    def index_post():
        # Read the values from the form
        original_text = request.form['text']
        target_language = request.form['language']
    
        # Load the values from .env
        key = os.environ['KEY']
        endpoint = os.environ['ENDPOINT']
        location = os.environ['LOCATION']
    
        # Indicate that we want to translate and the API version (3.0) and the target language
        path = '/translate?api-version=3.0'
        # Add the target language parameter
        target_language_parameter = '&to=' + target_language
        # Create the full URL
        constructed_url = endpoint + path + target_language_parameter
    
        # Set up the header information, which includes our subscription key
        headers = {
            'Ocp-Apim-Subscription-Key': key,
            'Ocp-Apim-Subscription-Region': location,
            'Content-type': 'application/json',
            'X-ClientTraceId': str(uuid.uuid4())
        }
    
        # Create the body of the request with the text to be translated
        body = [{ 'text': original_text }]
    
        # Make the call using post
        translator_request = requests.post(constructed_url, headers=headers, json=body)
        # Retrieve the JSON response
        translator_response = translator_request.json()
        # Retrieve the translation
        translated_text = translator_response[0]['translations'][0]['text']
    
        # Call render template, passing the translated text,
        # original text, and target language to the template
        return render_template(
            'results.html',
            translated_text=translated_text,
            original_text=original_text,
            target_language=target_language
        )
    

يتم تعليق التعليمات البرمجية لوصف الخطوات التي يتم اتخاذها. على مستوى عالٍ، إليك ما تفعله التعليمات البرمجية لدينا:

  1. قراءة النص الذي أدخله المستخدم واللغة التي حددها في النموذج
  2. يقرأ المتغيرات البيئية التي أنشأناها سابقا من ملف .env
  3. إنشاء المسار الضروري لاستدعاء خدمة Translator، والتي تتضمن اللغة المستهدفة (يتم الكشف عن اللغة المصدر تلقائيًا)
  4. إنشاء معلومات العنوان، التي تتضمن مفتاح خدمة Translator وموقع الخدمة ومعرف عشوائي للترجمة
  5. إنشاء نص الطلب، والذي يتضمن النص الذي نريد ترجمته
  6. requests استدعاء post للاتصال بخدمة المترجم
  7. استرداد استجابة JSON من الخادم، والتي تتضمن النص المترجم
  8. استرداد النص المترجم (انظر الملاحظة التالية)
  9. المكالمات render_template لعرض صفحة الاستجابة

إشعار

عند استدعاء خدمة Translator، من الممكن أن يتم ترجمة عدة عبارات إلى عدة لغات في استدعاء واحد. نتيجة لذلك، يحتوي JSON الذي أرجعته الخدمة على الكثير من المعلومات، والتي نحتاج فقط إلى جزء صغير منها. ونتيجة لذلك، نحن بحاجة إلى التنحي عن عدة مستويات للحصول على النص المترجم.

على وجه التحديد، نحن بحاجة إلى قراءة النتيجة الأولى، ثم إلى مجموعة translations، والترجمة الأولى، ثم إلى text. يتم ذلك عن طريق المكالمة: translator_response[0]['translations'][0]['text']

[
  {
    "detectedLanguage": {
      "language": "en",
      "score": 1.0
    },
    "translations": [
      {
        "text": "これはテストです",
        "to": "ja"
      }
    ]
  }
]

إنشاء القالب لعرض النتائج

دعنا ننشئ قالب HTML لصفحة النتائج.

  1. أنشئ ملفا جديدا في القوالب عن طريق تحديد قوالب في أداة Explorer في Visual Studio Code. ثم حدد ملف جديد

  2. قم بتسمية الملف results.html

  3. إضافة HTML التالي إلى results.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css"
            integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
        <title>Result</title>
    </head>
    <body>
        <div class="container">
            <h2>Results</h2>
            <div>
                <strong>Original text:</strong> {{ original_text }}
            </div>
            <div>
                <strong>Translated text:</strong> {{ translated_text }}
            </div>
            <div>
                <strong>Target language code:</strong> {{ target_language }}
            </div>
            <div>
                <a href="{{ url_for('index') }}">Try another one!</a>
            </div>
        </div>
    </body>
    </html>
    

ستلاحظ أننا نقوم بالوصول إلى original_textو translated_textو target_languageوالتي قمنا بتمريرها كمعلمات مسماة في render_template باستخدام {{ }}. تطلب هذه العملية من Flask تقديم المحتويات كنص عادي. نحن نستخدم url_for('index') أيضا لإنشاء ارتباط مرة أخرى إلى الصفحة الافتراضية. بينما يمكننا، من الناحية الفنية، كتابة المسار إلى الصفحة الأصلية، باستخدام url_for يخبر Flask بقراءة مسار الدالة بالاسم الذي نقدمه (index في هذه الحالة). إذا أعدنا ترتيب موقعنا، فإن عنوان URL الذي تم إنشاؤه للارتباط سيكون صالحًا دائمًا.

اختبر الصفحة

العودة إلى terminal المتكامل في تعليمة Visual Studio البرمجية (أو إعادة فتحه باستخدام Ctrl- أو Cmd- على Mac). إذا كان الموقع قيد التشغيل حاليًا، فسنحتاج إلى التوقف وإعادة تشغيله بحيث يقرأ التطبيق المتغيرات البيئية.

  1. استخدام Ctrl-C لإيقاف تطبيق Flask

  2. تنفيذ الأمر flask run لإعادة تشغيل الخدمة

  3. استعرض لاختبار http://localhost:5000 التطبيق الخاص بك

  4. أدخل النص في منطقة النص، واختر لغة، وحدد ترجمة

    Screenshot showing the completed translation form with text for translation that reads I am going to Osaka and Japanese selected as the language.

  5. سترى النتائج!

    Screenshot showing the translation results.

تهانينا

لقد قمت الآن بإنشاء موقع ويب بنجاح يستخدم Translator لإجراء عمليات الترجمة! نظرًا إلى أن اللغة والتواصل يعتمدان على السياق، وهو أمر غير واضح دائمًا للكمبيوتر، فقد تلاحظ أن النتائج ليست مثالية. ومع ذلك، فإنها عادةً ما تكون دقيقة أو قريبة بدرجة كافية للتواصل الفعال، وهذا هو الهدف!

يمكن دمج الرمز الذي قدمناه هنا في أي تطبيق حسبما ترغب. يمكنك الاستمرار في البناء على موقع الويب الذي أنشأناه، أو حتى نشره في Azure App Services!

‏‫اختبر معلوماتك

1.

ما هو اسم عنوان HTTP الذي يحمل مفاتيح واجهة برمجة التطبيقات في استدعاءات خدمات Azure الذكاء الاصطناعي؟