الحافز
كما هو موضّح في النظرة العامة، اعتمادًا على حالات الاستخدام التي يريد مشغّل شبكة الجوّال توفيرها، يجب أن تنفّذ DPA مزيجًا من واجهة برمجة التطبيقات Google Mobile Data Plan Sharing API وواجهة برمجة التطبيقات Data Plan Agent API. يوضّح هذا المستند واجهة برمجة التطبيقات Data Plan Agent التي ستستخدمها Google لتحديد خطط بيانات الجوّال الخاصة بالمستخدم واسترداد معلومات حول هذه الخطط وشرائها.
المصادقة
قبل أن يتمكّن تطبيق GTAF من إجراء مكالمة، يجب أن يصادق تطبيق DPA على تطبيق GTAF. كجزء من عملية إعداد المشغّل، سنتحقّق من صلاحية شهادة طبقة المقابس الآمنة (SSL) الخاصة باتفاقية معالجة البيانات. نحن نَشترط حاليًا استخدام OAuth2 للمصادقة المتبادلة.
وصف واجهة برمجة التطبيقات
تستخدم GTAF مفتاح المستخدم، الذي يحدّد المشترك لدى مشغّل شبكة الجوّال، عند طلب البحث في "اتفاقية معالجة البيانات" الخاصة بالمشغّل. عندما تستعلم أداة GTAF عن DPA نيابةً عن التطبيقات التي يمكنها الوصول إلى رقم MSISDN، يجوز لأداة GTAF استخدام رقم MSISDN. على مستوى عالٍ، تتألف واجهة برمجة التطبيقات المقترَحة لـ "وكيل خطة البيانات" من المكوّنات التالية:
- آلية للاستعلام عن حالة خطة بيانات المستخدم
- آلية طلب عروض خطط البيانات من "شريك توفير البيانات" للمستخدم
- آلية لإجراء تغييرات على خطة بيانات المستخدم (مثل شراء خطة جديدة)
- آلية للتحقّق مما إذا كان المستخدم مؤهَّلاً لشراء خطة بيانات معيّنة
- آلية تسجيل أرقام MSISDN لدى هيئة حماية البيانات من قِبل GTAF
- آلية تتيح لأداة GTAF التحقّق مما إذا كانت DPA في حالة جيدة.
يقدّم الجزء المتبقي من هذا المستند شرحًا تفصيليًا لكل مكوّن من مكوّنات واجهة برمجة التطبيقات هذه. ما لم يُذكر خلاف ذلك صراحةً، يجب أن تتم جميع الاتصالات عبر HTTPS (مع شهادة طبقة المقابس الآمنة (SSL) صالحة لاتفاقية معالجة البيانات). استنادًا إلى الميزات الفعلية المتوافقة، يمكن للمشغّل اختيار تنفيذ كل مكونات واجهة برمجة التطبيقات هذه أو مجموعة فرعية منها.
طلب البحث عن حالة خطة البيانات
التفاعل بين إطار عمل تقييم التهديدات العالمية (GTAF) واتفاقية معالجة البيانات (DPA)
الشكل 4. مسار المكالمة لطلب معلومات خطة بيانات المستخدم وتلقّيها
يوضّح الشكل 4 مسار المكالمة المرتبط باستعلام العميل عن حالة خطة البيانات الخاصة بالمستخدم ومعلومات أخرى عن خطة البيانات. يتم مشاركة مسار المكالمة هذا مع طلبات البيانات من واجهة برمجة التطبيقات التي يتم تشغيلها من قِبل العميل على جهاز المستخدم.
- يطلب العميل معرفة حالة خطة البيانات و/أو معلومات أخرى من خلال استدعاء واجهة برمجة تطبيقات خاصة من Google. يتضمّن العميل مفتاح المستخدم في الطلب المُرسَل إلى GTAF.
- تستخدم GTAF مفتاح المستخدم ومعرّف العميل للاستعلام عن اتفاقية معالجة البيانات الخاصة بالمشغّل. معرّفا العميل المتوافقان هما mobiledataplan وyoutube. عندما يتلقّى DPA طلبًا يتضمّن أحد معرّفات العميل هذه، عليه الردّ بمعلومات الخطة التي يمكن للعميل استخدامها.
- تعرض GTAF المعلومات المطلوبة للعميل، ويتم تخزين معلومات الخطة مؤقتًا في GTAF إلى حين انتهاء الوقت المحدّد في اتفاقية معالجة البيانات.
الخطوتان 1 و3 في الشكل 4 هما من واجهات برمجة التطبيقات الخاصة من Google، وبالتالي لن يتم تقديم وصف إضافي لهما. الخطوة 2 هي واجهة برمجة تطبيقات عامة موضّحة أدناه. يجب أن يلتزم "شريك معالجة البيانات" بعنوان HTTP Cache-Control: no-cache
عند عرض طلبات البيانات من واجهة برمجة التطبيقات هذه من "إطار الشفافية والموافقة العالمي".
حالة الخطة
يُصدر GTAF طلب HTTP التالي للحصول على حالة الخطة:
GET DPA_URL/{userKey}/planStatus?key_type={CPID,MSISDN}&client_id=CLIENT_ID
يتم تحديد العميل الذي تتواصل GTAF معه نيابةً عن "هيئة حماية البيانات" باستخدام CLIENT_ID. استنادًا إلى الاتفاقية بين عميل Google ومشغّل شبكة الجوّال، يمكن لـ DPA تخصيص الردّ على GTAF. يكون تنسيق الردّ عبارة عن عنصر JSON يمثّل PlanStatus.
{
"plans": [{
"planName": "ACME1",
"planId": "1",
"planCategory": "PREPAID",
"expirationTime": "2017-01-29T01:00:03.14159Z", // req.
"planModules": [{
"moduleName": "Giga Plan", // req.
"trafficCategories": ["GENERIC"],
"expirationTime": "2017-01-29T01:00:03.14159Z", // req.
"overUsagePolicy": "BLOCKED",
"maxRateKbps": "1500",
"description": "1GB for a month", // req.
"coarseBalanceLevel": "HIGH_QUOTA"
}]
}],
"languageCode": "en-US", // req.
"expireTime": "2018-06-14T08:41:27-07:00", // req.
"updateTime": "2018-06-07T07:41:22-07:00", // req.
"title": "Prepaid Plan"
"planInfoPerClient": {
"youtube": {
"rateLimitedStreaming": {
"maxMediaRateKbps": 256
}
}
}
}
يجب أن يتضمّن الطلب عنوان Accept-Language
يشير إلى اللغة التي يجب أن تكون بها السلاسل القابلة للقراءة (مثل أوصاف الخطط).
بالنسبة إلى الخطط المدفوعة لاحقًا، يجب أن يكون expirationTime
هو تاريخ تكرار الخطة (أي
عندما يتم تجديد/إعادة تحميل رصيد البيانات).
قد تحتوي كل وحدة خطة على فئات متعددة من عدد الزيارات لوحدة الخطة (PMTCs)
) لتحديد الحالات التي تتم فيها مشاركة وحدة الخطة بين تطبيقات متعددة (مثل 500 ميغابايت
للألعاب والموسيقى). يتم تحديد فئات PMTC التالية مسبقًا: GENERIC, VIDEO,
VIDEO_BROWSING, VIDEO_OFFLINE, MUSIC, GAMING, SOCIAL and MESSAGING.
من المتوقّع أن تتواصل شركات التشغيل مع فِرق Google الفردية للاتفاق على مجموعة فئات الزيارات ودلالاتها ذات الصلة بتطبيقات Google المختلفة.
الاستعلام عن عروض الخطط
يُصدر GTAF طلب HTTP التالي للحصول على عروض الخطط من مشغّل شبكة الجوّال:
GET DPA_URL/{userKey}/planOffer?key_type={CPID,MSISDN}&client_id=CLIENT_ID&context={purchaseContext}
يتم تحديد العميل الذي تتواصل GTAF معه نيابةً عن "هيئة حماية البيانات" باستخدام CLIENT_ID. استنادًا إلى الاتفاقية بين عميل Google ومشغّل شبكة الجوّال، يمكن لـ DPA تخصيص الردّ على GTAF. تقدّم مَعلمة السياق الاختيارية سياق التطبيق الذي يتم فيه تقديم الطلب. عادةً ما يكون هذا السلسلة التي يمرّرها التطبيق إلى المشغّل من خلال GTAF.
يحتوي نص الاستجابة على مثال PlanOffer.
{
"offers": [
{
"planName": "ACME Red", // req.
"planId": "turbulent1", // req.
"planDescription": "Unlimited Videos for 30 days.", // req.
"promoMessage": "Binge watch videos.",
"languageCode": "en_US", // req.
"overusagePolicy": "BLOCKED",
"cost": { // req.
"currencyCode": "INR",
"units": "300",
"nanos": 0
},
"duration": "2592000s",
"offerContext": "YouTube",
"trafficCategories": ["VIDEO"],
"quotaBytes": "9223372036850"
}
],
"expireTime": "2019-03-04T00:06:07Z" // req.
}
قد يحدّد ترتيب خطط البيانات في مصفوفة offers
الترتيب الذي تُعرض به خطط البيانات للمستخدمين. علاوةً على ذلك، إذا كان التطبيق لا يمكنه عرض سوى x خطط بسبب قيود في واجهة المستخدم أو قيود أخرى، وكان الرد يتضمّن y > x خطط، يجب عرض أول x خطط فقط. لا تشارك GTAF سوى ما يصل إلى 10 خطط إذا كان التطبيق الذي يطلب عروضًا هو واجهة مستخدم "خطة بيانات الجوّال" التي تشكّل جزءًا من "خدمات Google Play". يهدف ذلك إلى ضمان توفير تجربة مستخدم جيدة لمستخدمي "خدمات Google Play".
تهدف السلاسل في offerInfo
إلى السماح للمستخدم بقراءة المزيد من المعلومات حول العرض، كما تتضمّن طريقة لإيقاف تلقّي المزيد من العروض من داخل التطبيقات. والسبب في توفّر هذه الحقول هو أنّ بعض مشغّلي شبكات الجوّال لا يحتاجون إلى موافقة المستخدم النهائي للسماح بعمليات الشراء داخل التطبيق، بل يتطلّبون آلية تتيح للمستخدمين إيقاف هذه العمليات. يُرجى العِلم أنّه يجب أن يتوفّر لدى مشغّل شبكة الجوّال آلية لتلبية طلب شراء أي عرض ترويجي مقدَّم للمستخدم. يمكن إبلاغ GTAF بآلية تحصيل رسوم أي عملية شراء من المستخدم باستخدام الخيار formOfPayment في الردّ.
يجب أن يتضمّن الطلب عنوان Accept-Language
يشير إلى اللغة التي يجب أن تكون بها السلاسل القابلة للقراءة (مثل أوصاف الخطط).
شراء البيانات
تحدّد واجهة برمجة التطبيقات الخاصة بخطة الشراء كيفية شراء GTAF للخطط من خلال "اتفاقية المطوّرين للنشر". تبدأ GTAF المعاملة لشراء خطة بيانات واحدة إلى DPA. يجب أن يتضمّن الطلب معرّف معاملة فريدًا (transactionId) لتتبُّع الطلبات وتجنُّب تنفيذ المعاملات المكرّرة. يجب أن تردّ "هيئة حماية البيانات" برسالة تفيد بالنجاح أو الفشل.
طلب المعاملة
بعد تلقّي طلب من أحد العملاء، يرسل إطار الشفافية والموافقة العالمي طلب POST إلى "منصة إدارة الموافقة". عنوان URL للطلب هو:
POST DPA_URL/{userKey}/purchasePlan?key_type={CPID,MSISDN}&client_id=CLIENT_ID
حيث userKey
هي إما CPID
أو MSISDN
. يتضمّن نص الطلب مثيلاً من TransactionRequest يتضمّن الحقول التالية:
{
"planId": string, // Id of plan to be purchased. Copied from
// offers.planId field returned from a
// Upsell Offer request,
// if available. (req.).
"transactionId": string, // Unique request identifier (req.)
"offerContext": string, // Copied from from the
// offers.offerContext, if available.
// (opt.)
"callbackUrl": string // URL that the DPA can call back with response once
// it has handled the request.
}
ردّ المعاملة
يجب أن تعرض "معالجة البيانات" أسباب الخطأ الشائعة في حال حدوث خطأ. بالإضافة إلى ذلك، تمثّل رموز الخطأ التالية نتائج المعاملات غير الناجحة:
- تعرض "اتفاقية المطوّرين للنشر" رمز الخطأ 400 BAD REQUEST، ما يشير إلى أنّ معرّف الخطة التي تم شراؤها غير صالح.
- تعرض "اتفاقية معالجة البيانات" رمز الخطأ 402 PAYMENT REQUIRED، ما يشير إلى أنّ المستخدم لا يملك رصيدًا كافيًا لإكمال عملية الشراء.
- تعرض "اتفاقية المطوّرين للنشر" رمز الخطأ 409 CONFLICT الذي يشير إلى "أداة Google لتطبيقات Android" (GTAF) بأنّ الخطة المطلوب شراؤها غير متوافقة مع مجموعة المنتجات الحالية للمستخدم. على سبيل المثال، إذا كانت سياسة خطة بيانات مشغّل شبكة الجوّال لا تسمح بدمج الخطط المدفوعة لاحقًا والخطط المدفوعة مسبقًا، ستؤدي محاولة شراء خطة مدفوعة مسبقًا لمستخدم لديه خطة مدفوعة لاحقًا إلى حدوث خطأ 409 CONFLICT.
- تعرض "وكالة الدفع المباشر" رمز الخطأ 403 FORBIDDEN الذي يشير إلى "إطار عمل معاملات Google" (GTAF) بأنّ المعاملة الحالية هي نسخة مكرّرة من معاملة تم إصدارها سابقًا. يجب أن تعرض
DPA أسباب الخطأ التالية في الرد:
- إذا تعذّر إكمال المعاملة السابقة، سيظهر سبب الخطأ الذي يشير إلى سبب تعذّر إكمالها.
- إذا كانت المعاملة السابقة ناجحة، سيظهر الخطأ DUPLICATE_TRANSACTION.
- إذا كانت المعاملة السابقة لا تزال في قائمة الانتظار، سيتم عرض REQUEST_QUEUED.
يجب أن تنشئ "وكالة معالجة البيانات" استجابة 200-OK فقط للمعاملات التي تم تنفيذها بنجاح أو المعاملات التي تم وضعها في قائمة الانتظار. في حال كانت المعاملة في قائمة الانتظار، يجب أن يملأ DPA حالة المعاملة فقط ويترك الحقول الأخرى في الرد فارغة. يجب أن يعاود موفّر خدمة الدفع الاتصال بـ GTAF لإرسال ردّ بعد معالجة معاملة تم وضعها في قائمة الانتظار. نص الاستجابة هو مثال على TransactionResponse الذي يتضمّن التفاصيل التالية:
{
"transactionStatus": "SUCCESS",
"purchase": {
"planId": string, // copied from request. (req.)
"transactionId": string, // copied from request. (req.)
"transactionMessage": string, // status message. (opt.)
"confirmationCode": string, // DPA-generated confirmation code
// for successful transaction. (opt.)
"planActivationTime" : string, // Time when plan will be activated,
// in timestamp format. (opt.)
},
// walletInfo is populated with the balance left in the user's account.
"walletBalance": {
"currencyCode": string, // 3-letter currency code defined in ISO 4217.
"units": string, // Whole units of the currency amount.
"nanos": number // Number of nano units of the amount.
}
}
في حال عدم توفّر planActivationTime
، يجب أن يفترض GTAF أنّه تم تفعيل الخطة.
الموافقة
قد تصدر أداة GTAF الطلب التالي لتمرير خيار موافقة المستخدم إلى مشغّل شبكة الجوّال.
POST DPA_URL/{userKey}/consent?key_type={CPID,MSISDN}&client_id=CLIENT_ID
حيث userKey
هي إما CPID
أو MSISDN
. يتضمّن نص الطلب مثيلاً من SetConsentStatusRequest.
إذا كانت الاستجابة ناجحة، يجب أن يكون نص الاستجابة فارغًا.
الأهلية
قد تصدر GTAF طلب الأهلية التالي للتحقّق مما إذا كان المستخدم مؤهلاً لشراء خطة.
GET DPA/{userKey}/Eligibility/{planId}?key_type={CPID,MSISDN}
يُرجى العِلم أنّ planId
هو المعرّف الفريد للخطة الذي يمكن استخدامه لشراء الخطة نيابةً عن المستخدم (راجِع شراء البيانات).
في حال عدم تحديد planId
، يجب أن تعرض DPA جميع الخطط التي يمكن للمستخدم شراؤها.
يجب أن تعرض "معالجة البيانات" أسباب الخطأ الشائعة في حال حدوث خطأ. بالإضافة إلى ذلك، يجب أن تعرض "معالجة البيانات الإضافية" خطأً في حالات الخطأ التالية:
- تعرض "هيئة حماية البيانات" رمز الخطأ 400 BAD REQUEST الذي يشير إلى GTAF بأنّ
planId
غير صالح. - تعرض "اتفاقية معالجة البيانات" رمز الخطأ 409 CONFLICT الذي يشير إلى أنّ
planId
غير متوافق مع خطة بيانات المستخدم.
بخلاف ذلك، يجب أن تعرض "هيئة حماية البيانات" الرد 200-OK. يكون تنسيق EligibilityResponse الناجح كما يلي:
{
"eligiblePlans":
[
{
"planId": string, // Plan identifier. Can be used to
// refer to the plan during
// offers, etc. (req.)
}
]
}
عندما يتضمّن الطلب planId
، لا يتضمّن الردّ سوى هذا
الخطة. بخلاف ذلك، تتضمّن القائمة جميع الخطط التي يمكن للمستخدم شراؤها. في حال كانت planId
فارغة ولم يكن موفّر DPA يتيح عرض قائمة بالخطط المؤهَّلة، يجب أن يعرض الخطأ 400 BAD REQUEST.
نقطة نهاية تسجيل رقم MSISDN
لعرض التطبيقات التي يمكنها الوصول إلى رقم MSISDN، ستسجّل GTAF رقم MSISDN لدى DPA. لا يسجّل GTAF رقم MSISDN إلا عندما تكون هناك تطبيقات يتم عرضها من خلال واجهة برمجة التطبيقات Google Mobile Data Plan Sharing API، حيث يرسل "اتفاقية معالجة البيانات" المعلومات إلى GTAF باستخدام واجهات برمجة التطبيقات من Google. لتسجيل رقم MSISDN، سيُرسل GTAF طلب POST إلى DPA:
POST DPA_URL/register
سيكون نص الطلب مثالاً على RegistrationRequest.
{
"msisdn": "<msisdn_string>"
}
في حال نجاح تسجيل رقم MSISDN، يجب أن تعرض DPA استجابة 200 OK تتضمّن RegistrationResponse. يكون تنسيق JSON كما يلي:
{
// msisdn that was registered.
"msisdn": "<msisdn_string>",
// time after which DPA will not send updates to GTAF.
"expirationTime": string
}
يجب أن يرسل مشغّل شبكة الجوّال بعد ذلك إشعارات بشأن خطة بيانات المستخدم إلى GTAF إلى أن يمر الوقت المحدّد في expirationTime.
في حال حدوث خطأ، يجب عرض ErrorResponse:
{
"error": "<error message>",
"cause": enum(ErrorCause)
}
يمكنك الاطّلاع هنا على القائمة الكاملة بقيم السبب المحتملة ورموز حالة HTTP الخاصة بمختلف حالات الخطأ. على وجه الخصوص، إذا تم تلقّي طلب تسجيل MSISDN لمستخدم يتجوّل أو لم يوافق على مشاركة معلومات خطة البيانات مع Google، يجب أن تعرض "وكالة معالجة البيانات" رمز حالة HTTP 403.
Monitoring API
تتطلّب بعض حالات الاستخدام أن تراقب أداة GTAF "اتفاقية معالجة البيانات" وترصد حالات فشلها. بالنسبة إلى حالات الاستخدام هذه، حدّدنا واجهة برمجة تطبيقات للرصد.
تعريف واجهة برمجة التطبيقات
يجب أن تكون واجهة برمجة التطبيقات الخاصة بالمراقبة متاحة من خلال طلب HTTP GET على عنوان URL التالي:
DPA_URL/dpaStatus
إذا كان "موفّر بيانات الدفع" وجميع الأنظمة الخلفية التابعة له تعمل بشكل صحيح، من المفترض أن يستجيب "موفّر بيانات الدفع" لطلب البحث هذا برمز حالة HTTP 200 ونص استجابة يتضمّن مثيلاً من DpaStatus.
{
"status": enum(DpaStatusEnum),
"message": "<optional human-readable status description>"
}
إذا لم يكن DPA أو أي من الأنظمة الخلفية يعمل بشكل صحيح، يجب أن يستجيب برمز حالة HTTP 500 ونص استجابة يتضمّن مثيلاً من DpaStatus.
سلوك DPA
عند رصد تعذُّر، يجب أن تعرض "منصة إدارة الشركاء" الحالة "غير متوفّر" لجميع طلبات البحث عن dpaStatus. بالإضافة إلى ذلك، يجب أن تتوقف عن إرسال معلومات خطة البيانات التي تتضمّن فترات تخزين مؤقت طويلة. قد تتوقف عن إرسال استجابات تتضمّن فترات تخزين مؤقت طويلة بإحدى الطريقتَين التاليتَين:
- ابدأ بضبط أوقات انتهاء صلاحية قصيرة لذاكرة التخزين المؤقت.
- التوقّف نهائيًا عن إرسال معلومات خطة البيانات
GTAF Behavior
ستطلب GTAF حالة dpaStatus بشكل دوري. عند رصد تعذُّر توفّر إذن بموجب قانون حماية البيانات (استنادًا إلى الردّ "UNAVAILABLE")، ستتم إزالة البيانات المخزَّنة مؤقتًا الخاصة بالمشغّل.
حالات الأخطاء
في حال حدوث خطأ، من المتوقّع أن تعرض "جهة معالجة البيانات" رمز حالة HTTP يتوافق مع أحد ما يلي:
- يتجوّل المستخدم حاليًا وتم إيقاف طلب DPA لهذا المستخدم. تعرض DPA الخطأ 403.
- تعرض "جهة معالجة البيانات" رمز الخطأ 404 NOT_FOUND الذي يشير إلى GTAF بأنّ مفتاح المستخدم غير صالح (أي مفتاح مستخدم غير موجود).
- تعرض "اتفاقية معالجة البيانات" رمز الخطأ 410 GONE الذي يشير إلى GTAF بأنّه على العميل الحصول على مفتاح مستخدم جديد إذا كان key_type = CPID وانتهت صلاحية CPID.
- تعرض DPA رمز الخطأ 501 NOT_IMPLEMENTED الذي يشير إلى أنّها لا تتوافق مع هذه المكالمة.
- الخدمة غير متاحة مؤقتًا. تعرض "هيئة حماية البيانات" الرمز 503 SERVICE UNAVAILABLE (الخدمة غير متاحة) مع العنوان Retry-After (إعادة المحاولة) الذي يشير إلى الوقت الذي يمكن فيه محاولة إرسال طلب جديد.
- تعرض "اتفاقية معالجة البيانات" رمز الخطأ 500 INTERNAL SERVER ERROR لجميع الأخطاء الأخرى غير المحدّدة.
- تعرض خدمة DPA الخطأ 429 TOO_MANY_REQUESTS مع العنوان Retry-After الذي يشير إلى أنّ خدمة GTAF تُجري عددًا كبيرًا جدًا من الطلبات إلى خدمة DPA.
- تعرض "هيئة حماية البيانات" رسالة الخطأ 409 CONFLICT التي تشير إلى أنّه لا يمكن إكمال الطلب بسبب تعارضه مع الحالة الحالية لـ "هيئة حماية البيانات".
في جميع حالات الخطأ، يجب أن يتضمّن نص استجابة HTTP عنصر JSON يحتوي على مزيد من المعلومات حول الخطأ. يجب أن يحتوي نص استجابة الخطأ على مثيل من ErrorResponse.
{
"error": string,
"cause": enum(ErrorCause)
}
يتم إدراج قيم cause
المحدّدة حاليًا كجزء من مرجع واجهة برمجة التطبيقات ErrorCause.
بخلاف ذلك، تعرض DPA الرمز 200 OK. نلاحظ أنّ قيم cause
هذه تُستخدَم
في جميع الردود.
التدويل
تتضمّن طلبات GTAF إلى DPA عنوان Accept-Language يشير إلى اللغة التي يجب أن تكون بها السلاسل القابلة للقراءة (مثل أوصاف الخطط). بالإضافة إلى ذلك، تتضمّن استجابات DPA (مثل PlanStatus وPlanOffers) حقل languageCode إلزاميًا تكون قيمته رمز اللغة BCP-47 (مثل "en-US") للرد.
إذا لم تكن اتفاقية معالجة البيانات متوافقة مع اللغة التي طلبها المستخدم، يمكنها استخدام لغة تلقائية واستخدام حقل languageCode للإشارة إلى اختيارها.