/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic- ترجمة - /* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic- العربية كيف أقول

/* -*- Mode: javascript; tab-width:

/* -*- Mode: javascript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";
Components.utils.import("resource://gre/modules/NetUtil.jsm");

/* Turn the error e into a string, without fail. */
function safeErrorString(aError) {
try {
var s = aError.toString();
if (typeof s === "string")
return s;
} catch (ee) { }

return "";
}

/**
* Given a handler function that may throw, return an infallible handler
* function that calls the fallible handler, and logs any exceptions it
* throws.
*
* @param aHandler function
* A handler function, which may throw.
* @param aName string
* A name for aHandler, for use in error messages. If omitted, we use
* aHandler.name.
*
* (SpiderMonkey does generate good names for anonymous functions, but we
* don't have a way to get at them from JavaScript at the moment.)
*/
function makeInfallible(aHandler, aName) {
if (!aName)
aName = aHandler.name;

return function (/* arguments */) {
try {
return aHandler.apply(this, arguments);
} catch (ex) {
let msg = "Handler function ";
if (aName) {
msg += aName + " ";
}
msg += "threw an exception: " + safeErrorString(ex);
if (ex.stack) {
msg += "
Call stack:
" + ex.stack;
}

dump(msg + "
");

if (Cu.reportError) {
/*
* Note that the xpcshell test harness registers an observer for
* console messages, so when we're running tests, this will cause
* the test to quit.
*/
Cu.reportError(msg);
}
}
}
}

/**
* An adapter that handles data transfers between the debugger client and
* server. It can work with both nsIPipe and nsIServerSocket transports so
* long as the properly created input and output streams are specified.
*
* @param aInput nsIInputStream
* The input stream.
* @param aOutput nsIAsyncOutputStream
* The output stream.
*
* Given a DebuggerTransport instance dt:
* 1) Set dt.hooks to a packet handler object (described below).
* 2) Call dt.ready() to begin watching for input packets.
* 3) Send packets as you please, and handle incoming packets passed to
* hook.onPacket.
* 4) Call dt.close() to close the connection, and disengage from the event
* loop.
*
* A packet handler object is an object with two methods:
*
* - onPacket(packet) - called when we have received a complete packet.
* |Packet| is the parsed form of the packet --- a JavaScript value, not
* a JSON-syntax string.
*
* - onClosed(status) - called when the connection is closed. |Status| is
* an nsresult, of the sort passed to nsIRequestObserver.
*
* Data is transferred as a JSON packet serialized into a string, with the
* string length prepended to the packet, followed by a colon
* ([length]:[packet]). The contents of the JSON packet are specified in
* the Remote Debugging Protocol specification.
*/
this.DebuggerTransport = function DebuggerTransport(aInput, aOutput)
{
this._input = aInput;
this._output = aOutput;

this._converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
.createInstance(Ci.nsIScriptableUnicodeConverter);
this._converter.charset = "UTF-8";

this._outgoing = "";
this._incoming = "";

this.hooks = null;
}

DebuggerTransport.prototype = {
/**
* Transmit a packet.
*
* This method returns immediately, without waiting for the entire
* packet to be transmitted, registering event handlers as needed to
* transmit the entire packet. Packets are transmitted in the order
* they are passed to this method.
*/
send: function DT_send(aPacket) {
// TODO (bug 709088): remove pretty printing when the protocol is done.
let data = JSON.stringify(aPacket, null, 2);
data = this._converter.ConvertFromUnicode(data);
data = data.length + ':' + data;
this._outgoing += data;
this._flushOutgoing();
},

/**
* Close the transport.
*/
close: function DT_close() {
this._input.close();
this._output.close();
},

/**
* Flush the outgoing stream.
*/
_flushOutgoing: function DT_flushOutgoing() {
if (this._outgoing.length > 0) {
var threadManager = Cc["@mozilla.org/thread-manager;1"].getService();
this._output.asyncWait(this, 0, 0, threadManager.currentThread);
}
},

onOutputStreamReady:
makeInfallible(function DT_onOutputStreamReady(aStream) {
let written = aStream.write(this._outgoing, this._outgoing.length);
this._outgoing = this._outgoing.slice(written);
this._flushOutgoing();
}, "DebuggerTransport.prototype.onOutputStreamReady"),

/**
* Initialize the input stream for reading. Once this method has been
* called, we watch for packets on the input stream, and pass them to
* this.hook.onPacket.
*/
ready: function DT_ready() {
let pump = Cc["@mozilla.org/network/input-stream-pump;1"]
.createInstance(Ci.nsIInputStreamPump);
pump.init(this._input, -1, -1, 0, 0, false);
pump.asyncRead(this, null);
},

// nsIStreamListener
onStartRequest:
makeInfallible(function DT_onStartRequest(aRequest, aContext) {},
"DebuggerTransport.prototype.onStartRequest"),

onStopRequest:
makeInfallible(function DT_onStopRequest(aRequest, aContext, aStatus) {
this.close();
this.hooks.onClosed(aStatus);
}, "DebuggerTransport.prototype.onStopRequest"),

onDataAvailable:
makeInfallible(function DT_onDataAvailable(aRequest, aContext,
aStream, aOffset, aCount) {
this._incoming += NetUtil.readInputStreamToString(aStream,
aStream.available());
while (this._processIncoming()) {};
}, "DebuggerTransport.prototype.onDataAvailable"),

/**
* Process incoming packets. Returns true if a packet has been received, either
* if it was properly parsed or not. Returns false if the incoming stream does
* not contain a full packet yet. After a proper packet is parsed, the dispatch
* handler DebuggerTransport.hooks.onPacket is called with the packet as a
* parameter.
*/
_processIncoming: function DT__processIncoming() {
// Well this is ugly.
let sep = this._incoming.indexOf(':');
if (sep < 0) {
return false;
}

let count = parseInt(this._incoming.substring(0, sep));
if (this._incoming.length - (sep + 1) < count) {
// Don't have a complete request yet.
return false;
}

// We have a complete request, pluck it out of the data and parse it.
this._incoming = this._incoming.substring(sep + 1);
let packet = this._incoming.substring(0, count);
this._incoming = this._incoming.substring(count);

try {
packet = this._converter.ConvertToUnicode(packet);
var parsed = JSON.parse(packet);
} catch(e) {
let msg = "Error parsing incoming packet: " + packet + " (" + e + " - " + e.stack + ")";
if (Cu.reportError) {
Cu.reportError(msg);
}
dump(msg + "
");
return true;
}

dumpn("Got: " + packet);
let self = this;
Services.tm.currentThread.dispatch(makeInfallible(function() {
self.hooks.onPacket(parsed);
}, "DebuggerTransport instance's this.hooks.onPacket"), 0);

return true;
}
}


/**
* An adapter that handles data transfers between the debugger client and
* server when they both run in the same process. It presents the same API as
* DebuggerTransport, but instead of transmitting serialized messages across a
* connection it merely calls the packet dispatcher of the other side.
*
* @param aOther LocalDebuggerTransport
* The other endpoint for this debugger connection.
*
* @see DebuggerTransport
*/
this.LocalDebuggerTransport = function LocalDebuggerTransport(aOther)
{
this.other = aOther;
this.hooks = null;

/*
* A packet number, shared between this and this.other. This isn't used
* by the protocol at all, but it makes the packet traces a lot easier to
* follow.
*/
this._serial = this.other ? this.other._serial : { count: 0 };
}

LocalDebuggerTransport.prototype = {
/**
* Transmit a message by directly calling the onPacket handler of the other
* endpoint.
*/
send: function LDT_send(aPacket) {
let serial = this._serial.count++;
if (wantLogging) {
if (aPacket.to) {
dumpn("Packet " + serial + " sent to " + uneval(aPacket.to));
} else if (aPacket.from) {
dumpn("Packet " + serial + " sent from " + uneval(aPacket.from));
}
}
this._deepFreeze(aPacket);
let other = this.other;
Services.tm.currentThread.dispatch(makeInfallible(function() {
// Avoid the cost of JSON.stringify() when logging is disabled.
if (wantLogging) {
dumpn("Received packet " + serial + ": " + JSON.stringify(aPacket, null, 2));
}
other.hooks.onPacket(aPacket);
}, "LocalDebuggerTransport instance's this.other.hooks.onPacket"), 0);
},

/**
* Close the transport.
*/
close: function LDT_close() {
if (this.other) {
// Remove the reference to the other endpoint before calling close(), to
// avoid infinite recursion.
let other = this.other;
delete this.other;
other.close();
}
this.hooks.onClosed();
},

/**
* An empty method for emulating the DebuggerTransport API.
*/
ready: function LDT_ready() {},

/**
* Helper function that makes an object fully immutable.
*/
_deepFreeze: function LDT_deepFreeze(aObject) {
Object.freeze(aObject);
for (let prop in aObject) {
// Freeze the properties that are objects, not on the prototype, a
0/5000
من: -
إلى: -
النتائج (العربية) 1: [نسخ]
نسخ!
/ * - * - الوضع: جافا سكريبت والتبويب العرض: 2؛ البادئة علامات التبويب واسطة: لا شيء؛ C-الأساسية لموازنة: 2 - * - * /
/ * همة: مجموعة FT = سكريبت TS = 2 آخرون SW = 2 TW = 80: * /
/ * هذا شكل شفرة المصدر يخضع لشروط الجمهور موزيلا
* رخصة، V. 2.0. إذا نسخة من MPL لم يوزع مع هذا
* الملف، يمكنك الحصول على واحد في http://mozilla.org/mpl/2.0/. * /

"استخدام صارمة"؛
components.utils.import ("الموارد:/ / GRE / وحدات / netutil.jsm ")؛

/ * تحويل البريد الخطأ إلى سلسلة، دون أن تفشل * /
ظيفة safeerrorstring (aerror) {{

محاولة فار ق = aerror.tostring ()؛
إذا كان (ق تشير typeof === "السلسلة")
العودة ثانية؛
} المصيد (ه ه) {}

العودة " خطأ"؛}


/ **
* إعطاء وظيفة معالج التي قد رمي، والعودة معالج معصوم
* وظيفة الذي يستدعي معالج غير معصوم،ويقوم بتسجيل أي استثناءات ذلك
* رميات.
*
* @ وظيفة ahandler المعلمة
* دالة معالج، والتي قد رمي.
* @ سلسلة aname المعلمة
* اسما لahandler، لاستخدامها في رسائل الخطأ. إذا حذفت، ونحن نستخدم
* ahandler.name.
*
* (spidermonkey لا تولد أسماء جيدة لوظائف المجهولين، ولكننا
* لم يكن لديك وسيلة للحصول عليهم من JavaScript في الوقت الراهن.)
* /
وظيفة makeinfallible (ahandler، aname) {

إذا aname = ahandler.name (aname!)

وظيفة عودة (/ * حجج * /) {{

حاول ahandler.apply عودة (هذا، والحجج)؛
} قبض (السابقين) {
دعونا MSG = "دالة معالج"؛
إذا كان (aname) {
MSG = aname ""؛}

MSG = "استثناء:" safeerrorstring (السابقين)؛
إذا كان (ex.stack) {
MSG = " n المكالمة المكدس: N" ex.stack؛
}

تفريغ (MSG " N")؛

إذا كان (cu.reporterror) {
/ *
* لاحظ أن الاختبار تسخير xpcshell يسجل مراقب ل
* رسائل تعزية، لذلك عندما نقوم بتشغيل الاختبارات، وهذا سوف يسبب
* اختبار لإنهاء.
* /
cu.reporterror (MSG )؛}


}}}


/ **
* محول الذي يعالج عمليات نقل البيانات بين العميل المصحح و
* الخادم. ويمكن ان تعمل مع كل من nsipipe ووسائل النقل nsiserversocket حتى
. * طالما يتم تحديد الإدخال التي تم إنشاؤها بشكل صحيح وتيارات الانتاج
*
* @ المعلمة ainput nsiinputstream
* دفق الإدخال
* @ nsiasyncoutputstream aoutput المعلمة
* دفق إخراج
*
* إعطاء المثال DT debuggertransport:
* 1) مجموعة dt.hooks إلى كائن معالج حزمة (موضح أدناه).
* 2) دعوة dt.ready () لبدء مشاهدة للحزم الإدخال.
* 3) إرسال الحزم كما يحلو لك،والتعامل مع الحزم الواردة التي تم تمريرها إلى
* hook.onpacket.
* 4) دعوة dt.close () لإغلاق الاتصال، والانفصال عن الحدث
* حلقة.
*
* كائن معالج حزمة هو كائن مع طريقتين :
*
* - onpacket (حزمة) - دعا عندما تلقينا حزمة كاملة
* | حزمة | هو شكل تحليل من الحزمة --- قيمة جافا سكريبت، لا
* سلسلة جسون-جملة
*
* - OnClosed و(الحالة) - دعا عندما يتم إغلاق الاتصال. | أوضاع |. و
* وnsresult، من ذلك النوع الذي تم تمريره إلى nsirequestobserver
*
* يتم نقل البيانات في حزمة جسون تسلسل إلى سلسلة، مع
* طول سلسلة إرفاق مسبقا إلى حزمة، متبوعا بنقطتين
* ( [طول]: [حزمة]). يتم تحديد محتويات الحزمة جسون في
* مواصفات بروتوكول تصحيح الأخطاء عن بعد.
* /
this.debuggertransport = وظيفة debuggertransport (ainput، aoutput)

{this._input = ainput؛
this._output = aoutput؛.

this._converter = سم مكعب ["@ mozilla.org / تي / scriptableunicodeconverter"]
createinstance ( ci.nsiscriptableunicodeconverter)؛
this._converter.charset = "UTF-8"؛

this._outgoing = ""؛
this._incoming = ""؛

this.hooks = فارغة؛
}

debuggertransport.prototype = {
/
*** نقل حزمة.
*
* هذا الأسلوب بإرجاع فورا، دون انتظار لكامل
* الحزمة إلى أن تنتقل، تسجيل معالجات الأحداث حسب الحاجة إلى
* إحالة الحزمة بأكملها. وتنتقل الحزم في الترتيب
* يتم تمريرها إلى هذا الأسلوب
* /
إرسال:. وظيفة dt_send (apacket) {
/ / TODO (علة 709088):. إزالة الطباعة جميلة عندما يتم البروتوكول
البيانات واسمحوا = جسون .stringify (apacket، فارغة، 2)؛
البيانات = this._converter.convertfromunicode (البيانات)؛
البيانات = data.length ':' البيانات؛
this._outgoing = البيانات؛
this._flushoutgoing ()؛}
،

/ **
* إغلاق النقل
* /
ثيقة: وظيفة dt_close () {
this._input.close ()؛
this._output.close ()؛}
،

/ **
* دافق تيار المنتهية ولايته
* /
_flushoutgoing: وظيفة dt_flushoutgoing () {
إذا كان (this._outgoing.طول> 0) {
فار threadmanager = سم مكعب ["@ mozilla.org / موضوع إداري؛ 1"] getservice ()؛.
this._output.asyncwait (هذا، 0، 0، threadmanager.currentthread)؛}



onoutputstreamready:
makeinfallible (وظيفة dt_onoutputstreamready (astream) {
السماح مكتوبة = astream.write (this._outgoing، this._outgoing.length)؛
this._outgoing = this._outgoing.slice (كتابة)؛
هذا . _flushoutgoing ()؛}
،"debuggertransport.prototype.onoutputstreamready")،

/ **
* تهيئة دفق الإدخال للقراءة. مرة واحدة هذا الأسلوب تم
* دعا، نرقب الحزم لتدفق الدخل، وتمريرها إلى
*
* this.hook.onpacket /
جاهزة:. وظيفة dt_ready () {
دعونا مضخة = سم مكعب ["@ موزيلا .org / شبكة / إدخال تيار مضخة؛ 1 "]
createinstance (ci.nsiinputstreampump)؛
pump.init (this._input، -1، -1، 0، 0،كاذبة)؛
pump.asyncread (هذا، فارغة)؛}
،

/ /
nsistreamlistener onstartrequest:
makeinfallible (وظيفة dt_onstartrequest (arequest، acontext) {}،
"debuggertransport.prototype.onstartrequest")،

onstoprequest :
makeinfallible (وظيفة dt_onstoprequest (arequest، acontext، astatus) {
this.close ()؛
this.hooks.onclosed (astatus)؛
}، "debuggertransport.prototype.onstoprequest")،

ondataavailable:
makeinfallible (وظيفة dt_ondataavailable (arequest، acontext،
astream، aoffset، acount) {
this._incoming = netutil.readinputstreamtostring (astream،
astream.available ())؛
في حين أن (this._processincoming ()) {} ؛
}، "debuggertransport.prototype.ondataavailable")،

/ **
* الحزم الواردة العملية. إرجاع TRUE إذا تم تلقي حزمة، إما
* إذا تم تحليل بشكل صحيح أم لا. عائدات كاذبة إذا لم
* لا يحتوي على تيار واردة حزمة كاملة حتى الآن. بعد يتم تحليل حزمة المناسبة، إيفاد
* يسمى debuggertransport.hooks.onpacket معالج مع الحزمة ك أ
*
* المعلمة /
_processincoming:. وظيفة dt__processincoming () {
/ / حسنا هذا هو قبيح
دعونا سبتمبر = this._incoming.indexof (':')؛
إذا (سبتمبر <0) {
عودة كاذبة؛
}

دعونا العد = parseint (this._incoming.substring (0، سبتمبر))؛.
إذا كان (this._incoming.length - (1 سبتمبر) <العد) {
/ / لم يكن لديك طلب تكتمل بعد
عودة كاذبة؛}


/ / لدينا طلب كاملة، ونتفه من البيانات وتحليل فإنه
this._incoming = this._incoming.substring (1 سبتمبر)؛.
دعونا حزمة = this._incoming.substring ( 0، عد)؛
this._incoming = this._incoming.substring (العدد)؛

محاولة {
حزمة = this._converter.converttounicode (الحزمة)؛
فار تحليل = json.parse (الحزمة)؛
} المصيد (ه) {
دعونا MSG = "خطأ في توزيع الحزمة الواردة:" حزمة "(" E "- "e.stack") "؛
إذا كان (cu.reporterror) {
cu.reporterror (MSG)؛}

تفريغ (MSG" N ")؛
العودة الحقيقية؛}


dumpn (" حصلت على: " الحزمة)؛
دعونا النفس = هذا؛
services.tm.currentthread.dispatch (makeinfallible (وظيفة () {
الذاتي.hooks.onpacket (تحليل)؛
}، "this.hooks.onpacket debuggertransport المثال في")، 0)؛

العودة الحقيقية؛}




} / **
* محول الذي يعالج عمليات نقل البيانات بين المصحح العميل والخادم
* عندما كلا تشغيل في نفس العملية. أنه يقدم نفس API كما
* debuggertransport، ولكن بدلا من نقل الرسائل عبر تسلسل
* اتصال تصفه مجرد المرسل حزمة من الجانب الآخر.
*
* @ المعلمة aother localdebuggertransport
* نقطة النهاية الأخرى لهذا الاتصال المصحح.
*
* @ رؤية debuggertransport
* /
this.localdebuggertransport = وظيفة localdebuggertransport (aother )

{this.other = aother؛
this.hooks = فارغة؛

/ *
* عدد الرزم، المشتركة بين هذا وthis.other. هذا لا يتم استخدام
* بواسطة بروتوكول على الإطلاق، ولكنه يجعل حزمة يتتبع أسهل كثيرا إلى
* متابعة.
* /
this._serial = this.other؟ this.other._serial: {الاحصاء: 0}؛}



localdebuggertransport.prototype = {/ **
* نقل رسالة مباشرة عن طريق استدعاء معالج onpacket من الأخرى
*
* نقطة النهاية /
إرسال:. وظيفة ldt_send (apacket) {
السماح مسلسل = this._serial.count؛
إذا كان (wantlogging) {
إذا كان (apacket.ل) {
dumpn ("حزمة" مسلسل "أرسلت إلى" uneval (apacket.to))؛
} والا اذا (apacket.from) {
dumpn ("حزمة" مسلسل "المرسلة من" uneval (apacket.from)) ؛}


} this._deepfreeze (apacket)؛
اسمحوا الأخرى = this.other؛
services.tm.currentthread.dispatch (makeinfallible (وظيفة () {
/ / تجنب تكلفة json.stringify () عند تسجيل الدخول معطل.
إذا كان (wantlogging) {
dumpn ("تلقى حزمة" مسلسل ":" json.stringify (apacket، فارغة، 2))؛}

other.hooks.onpacket (apacket)؛
}، "this.other.hooks.onpacket localdebuggertransport المثال في")، 0)؛}
،

/ **
* إغلاق النقل
* /
ثيقة: وظيفة ldt_close () {
إذا كان (this.other) {
/ / إزالة الإشارة إلى نقطة النهاية الأخرى قبل استدعاء إغلاق ( )، إلى
/ / تجنب العودية لانهائية.
تدع الآخرين = هذا.الأخرى؛
حذف this.other؛
other.close ()؛}

this.hooks.onclosed ()؛}
،

/ **
* أسلوب فارغة لمحاكاة debuggertransport API
* /
جاهزة : وظيفة ldt_ready () {}،

/ **
* وظيفة المساعد الذي يجعل كائن كامل غير قابل للتغيير
* /
_deepfreeze: وظيفة ldt_deepfreeze (aobject) {
object.freeze (aobject)؛
ل(اسمحوا دعم في. aobject) {
/ / تجميد الخصائص التي هي كائنات،ليس على النموذج الأولي، وهو
يجري ترجمتها، يرجى الانتظار ..
النتائج (العربية) 2:[نسخ]
نسخ!
/*-*-وضع: جافا سكريبت؛ عرض التبويب: 2؛ المسافة البادئة--علامات التبويب--الوضع: لا شيء؛ ج-الأساسية-الإزاحة: 2-*-*/
/* فيم: ft تعيين = ts سكريبت = 2 et sw = 2 tw = 80: */
/* "هذا نموذج التعليمات البرمجية المصدر" يخضع للشروط من الجمهور موزيلا
* الترخيص، v. 2.0. إذا لم توزع نسخة من المكتبة مع هذا
* ملف، يمكنك الحصول على واحدة في http://mozilla.org/MPL/2.0/. */

"استخدام strict";
Components.utils.import ("الموارد://gre/modules/NetUtil.jsm");

/* ه خطأ تحويل سلسلة، دون أن تفشل. *
تعمل safeErrorString(aError) {
محاولة {
فأر s = aError.toString()؛
إذا (typeof s = = = "سلسلة")
العودة s؛
}

إرجاع المصيد (ee) {} "< الفاشلة في محاولة للعثور على وصف الخطأ >"؛
}

/* *
* نظراً لدالة معالج قد رمي، العودة معالج معصوم
* وظيفة الذي يستدعي المعالج غير معصوم، ويقوم بتسجيل أي استثناءات
* رميات.
*
* الدالة أهاندلير @param
* دالة معالج، الذي قد رمي.
* السلسلة أنام @param
* اسماً أهاندلير، لاستخدامها في رسائل الإعلام بالخطأ. إذا تم حذفها، نستخدم
* aHandler.name.
*
* (SpiderMonkey توليد أسماء جيدة للدالات المجهولة، ولكن نحن
* لا يملكون وسيلة للحصول عليهم عن جافا سكريبت في الوقت الراهن.)
*/
تعمل ماكينفاليبلي (أهاندلير، أنام) {
إذا (! أنام)
aName = aHandler.name;

إرجاع الدالة (/* الحجج */) {
حاول {
العودة aHandler.apply (هذا، الحجج)؛
} المصيد (السابقين) {
اسمحوا msg = "معالج الدالة"؛
إذا (أنام) {
msg = أنام ""؛
}
msg = "استثناءاً:" safeErrorString(ex)؛
إذا (ex.stack) {
msg = ex.stack;
"
Call stack:
"}

تفريغ (msg "
");

إذا (Cu.reportError) {
/*
* علما أنه مفعل الاختبار إكسبكشيل يسجل مراقب ل
* رسائل وحدة التحكم، حتى عندما نحن بتشغيل الاختبارات، وهذا سوف يسبب
* إلى إنهاء الاختبار.
*/
Cu.reportError(msg)؛
}
}
}
}

/* *
* نقل محول الذي يتعامل مع البيانات بين العميل المصحح و
* خادم. يمكن أن تعمل مع وسائل النقل نسيبيبي ونسيسيرفيرسوكيت حتى
* منذ فترة طويلة كالتي تم إنشاؤها بشكل صحيح من الإدخال والإخراج يتم تحديد تيارات.
*
* @param أينبوت نسيينبوتستريم
* دفق الإدخال.
* @param أوتبوت نسياسينكوتبوتستريم
* دفق الإخراج.
*
* "نظراً ديبوجيرترانسبورت" سبيل المثال dt:
* 1) تعيين dt.hooks إلى كائن معالج حزم (الموصوفة أدناه).
* الإدخال dt.ready() 2) الدعوة البدء في مشاهدة للحزم.
* 3) إرسال الحزم كما يحلو لك، والتعامل مع الحزم الواردة التي تم تمريرها إلى
* hook.onPacket.
* 4) استدعاء dt.close() إغلاق الاتصال، وفك الارتباط بالحدث
* الحلقة.
*
* كائن معالج حزم كائن مع اثنين من الأساليب:
*
*--onPacket(packet)--دعا عندما تلقينا حزمة كاملة.
* |Packet| هو النموذج الذي تم تحليله من الحزمة---قيمة جافا سكريبت، لا
* سلسلة بناء جملة JSON.
*
*-ودعا onClosed(status)--عندما يتم إغلاق الاتصال. |الحالة هو
* نسريسولت، من النوع الذي تم تمريره إلى نسيريقويستوبسيرفير.
*
* يتم نقل البيانات كحزمة JSON متسلسل في سلسلة، مع
* سلسلة طول prepended للحزمة، متبوعاً بنقطتين
* ([length]:[packet]). يتم تحديد محتويات الحزمة JSON في
* مواصفات "بروتوكول التصحيح البعيد".
*/
وهذا.ديبوجيرترانسبورت = وظيفة ديبوجيرترانسبورت (أينبوت، أوتبوت)
{
هذا._input = أينبوت؛
هذا._output = أوتبوت;

هذا._converter =.createInstance(Ci.nsIScriptableUnicodeConverter) Cc["@mozilla.org/intl/scriptableunicodeconverter"]
؛
this._converter.charset = "UTF-8";

هذا._outgoing = ""؛
هذا._incoming = ""؛

this.hooks = null;
}

DebuggerTransport.prototype = {
/* *
* إرسال الحزمة.
*
* هذا الأسلوب بإرجاع فورا، دون انتظار للكامل
* الحزمة تحال، تسجيل معالجات الأحداث حسب الحاجة إلى
* إرسال الحزمة بأكملها. يتم إرسال الحزم بالترتيب
* التي تم تمريرها إلى هذا الأسلوب.
*/
إرسال: تعمل DT_send(aPacket) {
//تودو (علة 709088): إزالة حد الطباعة عندما يتم ذلك البروتوكول.
اسمحوا بيانات = JSON.سترينجيفي (أباكيت، فارغة، 2)؛
البيانات = هذا._converter.ConvertFromUnicode(data)؛
البيانات = data.length ':' البيانات؛
هذا._outgoing = البيانات؛
this._flushOutgoing()؛


/* *
* إغلاق النقل.
*/
إغلاق: تعمل DT_close() {
this._input.close()؛
this._output.close()؛


/* *
* تدفق تيار الصادرة.
*/
_flushOutgoing: تعمل DT_flushOutgoing() {
إذا (._outgoing هذا.length > 0) {
فأر ثريدماناجير = Cc["@mozilla.org/thread-manager;1"].getService()؛
this._output.asyncWait (هذا، 0، 0، threadManager.currentThread);
}


أونوتبوتستريمريدي:
ماكينفاليبلي (تعمل DT_onOutputStreamReady(aStream) {
تمكنك من كتابة = aStream.write (هذا._outgoing, this._outgoing.length)؛
هذا._outgoing = this._outgoing.slice(written)؛
this._flushOutgoing()؛
}، "DebuggerTransport.prototype.onOutputStreamReady"),

/* *
* تهيئة دفق الإدخال للقراءة. مرة واحدة وقد تم هذا الأسلوب
* دعا، نحن لمشاهدة الحزم على دفق الإدخال، وتمريرها إلى
* this.hook.onPacket.
*/
جاهزة: تعمل DT_ready() {
اسمحوا المضخة =.createInstance(Ci.nsIInputStreamPump) Cc["@mozilla.org/network/input-stream-pump;1"]
؛
pump.init (هذا._input،-1،-1، 0، 0، كاذبة)؛
pump.asyncRead (هذا, null)؛


//نسيستريمليستينير
أونستارتريكويست:
ماكينفاليبلي (تعمل {} DT_onStartRequest (أريكويست، أكونتيكست)،
"أونستوبريكويست DebuggerTransport.prototype.onStartRequest"),

:
ماكينفاليبلي (وظيفة DT_onStopRequest (أريكويست، أكونتيكست، أستاتوس) {
this.close()؛
this.hooks.onClosed(aStatus)؛
}،"DebuggerTransport.prototype.onStopRequest"),

onDataAvailable:
ماكينفاليبلي (وظيفة DT_onDataAvailable (أريكويست، أكونتيكست،
أستريام، أوفسيت، aCount) {
هذا._incoming = NetUtil.readInputStreamToString (أستريام،
aStream.available())؛
بينما (this._processIncoming()) {}؛
}، "DebuggerTransport.prototype.onDataAvailable"),

/* *
* معالجة الحزم الواردة. إرجاع true إذا تم تلقي حزمة، أما
* إذا كان تم توزيعه بشكل صحيح أم لا. إرجاع false إذا كان الدفق الواردة لا
* لا يحتوي على حزمة كاملة حتى الآن. بعد أن يتم تحليل حزمة مناسبة، إيفاد
* معالج يسمى DebuggerTransport.hooks.onPacket مع الحزمة
* المعلمة.
*/
_processIncoming: تعمل DT__processIncoming() {
//حسنا هذا القبيح.
اسمحوا سبتمبر = this._incoming.indexOf(':')؛
إذا (سبتمبر < 0) {
عودة كاذبة؛
}

اسمحوا العد = بارسينت (this._incoming.substring (0, سبتمبر))؛
إذا (this._incoming.length-(1 سبتمبر) < العد) {
//لا يزال طلب كامل.
عودة كاذبة؛
}

//أننا قد طلب كامل، ونتف من الخروج من البيانات وتحليل إجرائه.
هذا._incoming = this._incoming.substring (1 سبتمبر)؛
اسمحوا الحزمة = this._incoming.substring (0، العد)؛
هذا._incoming = this._incoming.substring(count)؛

حاول {
الحزمة = هذا._converter.ConvertToUnicode(packet)؛
فأر تحليل = JSON.parse(packet)؛
} catch(e) {
اسمحوا msg = "خطأ في توزيع الحزمة الواردة:" الحزمة "(" e e.stack "--" ")"؛
إذا (Cu.reportError) {
Cu.reportError(msg)؛
}
تفريغ (msg "
");
إرجاع true؛
}

دومبن ("حصلت على:" الحزمة)؛
اسمحوا النفس = هذا؛
Services.tm.currentThread.dispatch(makeInfallible(function() {
النفس.hooks.onPacket(parsed)؛
}، "this.hooks.onPacket ديبوجيرترانسبورت مثيل"), 0)؛

إرجاع true؛
}
}


/* *
* نقل محول الذي يتعامل مع البيانات بين العميل المصحح و
* الملقم عند تشغيل كلاهما في نفس العملية. وهو يعرض نفس API ك
* ديبوجيرترانسبورت، ولكن بدلاً من أن يحيل بها تسلسل الرسائل عبر
* اتصال فإنه يستدعي مجرد مرسل الحزمة من الجانب الآخر.
*
* @param أوثير لوكالديبوجيرترانسبورت
* نقطة النهاية الأخرى لهذا الاتصال مصحح الأخطاء.
*
* @see ديبوجيرترانسبورت
*/
هذا.لوكالديبوجيرترانسبورت = دالة LocalDebuggerTransport(aOther)
{
this.other = أوثير؛
this.hooks = null؛

/*
* عدد حزم، المشتركة بين هذا و this.other. لا يتم استخدام هذا
* بموجب البروتوكول على الإطلاق، ولكن يجعل من الأسهل كثيرا على آثار حزمة
* اتبع.
*/
هذا._serial = this.other؟ this.other._serial: {العد: 0}؛
}

LocalDebuggerTransport.prototype = {
/* *
* يحيل رسالة واسطة مباشرة استدعاء معالج أونباكيت من الآخر
* نقطة النهاية.
*/
إرسال: تعمل LDT_send(aPacket) {
المسلسل = this._serial.count؛
إذا (وانتلوجينج) {
إذا (أباكيت.إلى) {
دومبن ("الحزمة" المسلسل "إرسال إلى" uneval(aPacket.to))؛
} وأﻻ إذا (aPacket.from) {
دومبن (uneval(aPacket.from)) "الحزمة" المسلسل "المرسلة من"؛
}
}
this._deepFreeze(aPacket)؛
اسمحوا الآخر = this.other;
Services.tm.currentThread.dispatch(makeInfallible(function() {
//تجنب تكلفة JSON.stringify() عندما يتم تسجيل معطل.
إذا (وانتلوجينج) {
دومبن ("الحزم المتلقاة" المسلسل ":" JSON.stringify (أباكيت، فارغة (null)، 2))؛
}
other.hooks.onPacket(aPacket)؛
}، "this.other.hooks.onPacket لوكالديبوجيرترانسبورت مثيل"), 0)؛


/* *
* إغلاق النقل.
*/
إغلاق: تعمل LDT_close() {
إذا (this.other) {
//إزالة الإشارة إلى نقطة النهاية الأخرى قبل استدعاء close ()، إلى
//تجنب العودية لانهائية.
اسمحوا الآخر = هذا.الأخرى؛
حذف other.close() this.other;
؛
}
this.hooks.onClosed()؛


/* *
* طريقة فارغة لمحاكاة API ديبوجيرترانسبورت.
*/
جاهزة: تعمل {} LDT_ready()،

/* *
* وظيفة المساعد الذي يجعل كائن الكامل غير قابل للتغيير.
*/
_deepFreeze: تعمل LDT_deepFreeze(aObject) {
Object.freeze(aObject)؛
ل (prop اسمحوا في أوبجيكت) {
//تجميد الخصائص التي كائنات، في النموذج، لا
يجري ترجمتها، يرجى الانتظار ..
النتائج (العربية) 3:[نسخ]
نسخ!
( * - * - وضع للجافا سكريبت; اللسان العرض: 2; بادئة ألسنة الوضع: لا شيء; ج - الاساسية: 2 - * - * /
/ * فيم: مجموعة متر=javascript TS=2 بالتوقيت الشرقي جنوب غرب=2 وزن السحب=80: * /
/ * هذا مصدر التعليمات البرمجية يخضع Mozilla الفولطية
* الترخيص العام، 2.0 إذا كانت نسخة من MPL لم توزع مع هذا الفائقة
* الملف ، يمكنك الحصول على واحدة http://mozilla.org/mpl/2.0/. * /

"متشددة" (
لمكونات utils " استيراد ( "الموارد://gre/modules/netutil.jsm");

/ * تحويل الخطأ إلى سلسلة، دون أي تأخير. * /
وظيفة safeerrorstring (aerror) { {

جرب VAR S = aerror"tostring ( ;
اذا typeof S === " سلسلة" )
العودة(
} المصيد )ه ه( { }ستفعل

عودة " <لم تحاول أن تجد خطأ description>";
}

/ **
* على وظيفة مدرب قد رمى العودة إلى المعصومين الفولطية
* وظيفة مدرب يطلب مدرب تشيرتش هاوس,وتسجيل أي استثناءات من الفولطية
* يلقي "
*
* @بارام ahandler الوظيفة الفولطية
* كمسؤول الوظيفة، التي قد تلقي "
* @بارام aname السلسلة الفائقة
* اسم ahandler في رسائل الخطأ. إذا حذفت، نستخدم الفولطية
* ahandler.name.
*
* (spidermonkey أسماء جيدة لا تولد الوظائف المجهولة، ولكننا الفولطية
* لا وسيلة إلى تجاوز للجافا سكريبت في الوقت الحالي" )
* /
الوظيفة makeinfallible (ahandler، aname) {
إذا كان ( !aname)
aname = ahandler.name;

عودة وظيفة (/ * الحجج * /( {

عودة يحاول {ahandler"تطبيق (هذه الحجج) ;
} المصيد العرضي (السابق) {
واسمحوا MSG = "وظيفة معالج " ;
اذا aname) {
رسالة = aname " " ; }

رسالة = " برمي استثناء: " safeerrorstring (ex( ;
إذا (السابق) مجموعة " {
رسالة = "
call المجموعة:
" السابق مجموعة"; مقلب ستفعل


} (رسالة "
" ) ;ستفعل

اذا ما كو.reporterror) {
( *
* ملاحظة أن xpcshell تسخير سجلات التجارب المراقب الفولطية
* رسائل وحدة التحكم، حتى عندما نقوم بتشغيل الاختبارات، سيؤدي ذلك الفولطية
* اختبار الانسحاب "
* /
كو " reporterror (الرسائل); }


} }
}

/ **
* محول يتناول نقل البيانات بين ستوديو العميل الفولطية
* الخادم. كما أن العمل مع كلا nsipipe و nsiserversocket ينقل ذلك الفولطية
* طالما أن بشكل صحيح إنشاء جداول المدخلات والمخرجات المحددة "
*
* @بارام ainput nsiinputstream الفولطية
* دفق الإدخال "
* @بارام aoutput nsiasyncoutputstream الفولطية
* إخراج تيار "
*
* على سبيل المثال DT debuggertransport:
* 1) DT " إلى حزمة كائن معالج (على النحو الوارد وصفه أدناه) .
* 2) الاتصال المكتبي " مستعدة () إلى بدء إدخال مشاهدة الحزم "
* 3) إرسال الحزم (packet) كما تشاء,و التعامل مع الحزم الواردة الى
* المصيدة "onpacket "
* 4) DT الاتصال الوثيق" () إلى إغلاقه، افصل من حالة الفولطية
* حلقة "
*
* حزمة كائن معالج كائن مع طريقتين :
*
* - onpacket (packet) - عندما تلقينا حزمة كاملة "
* | | هو حزمة تعريب شكل الحزمة --- JavaScript، ليس الفولطية
* json - سلسلة صيغة "
*
* - onclosed (مركز) - عندما يتم إغلاق الاتصال. | مركز | هو الفائقة
* nsresult من نوع إلى nsirequestobserver "
*
* البيانات يتم نقل حزمة json مسلسلة في سلسلة مع الفولطية
* سلسلة prepended طول الحزمة ثم رأسية الفولطية
* ( [طول] : [الحزمة] ). محتويات json الحزمة المحددة في الفولطية
* التصحيح عن بعد مواصفات بروتوكول "
* /
هذا " debuggertransport = الوظيفة debuggertransport (ainput، aoutput(
{
هذا " _input = ainput;
هذا " _output = aoutput;ستفعل

هذا " _converter = CC[ " @mozilla.org/intl/scriptableunicodeconverter"]
.createinstance (سي.nsiscriptableunicodeconverter) ;
هذا " _converter"مجموعة الأحرف الافتراضية = "يو-8 " (ستفعل

هذا " _outgoing = "" (
هذا " _incoming = "" (ستفعل

هذا " الخطافات = Null(
}

debuggertransport.prototype = {
( **
* إرسال حزمة "
*
* هذه الطريقة تعود فورا دون انتظار كامل الفولطية
* يتم إرسال حزمة، تسجيل حالة المتعاملين حسب الحاجة إلى الفائقة
* إرسال الحزمة (packet) بالكامل. الحزم المرسلة في الفولطية
* تحال إلى هذه الطريقة "
* /
إرسال: وظيفة dt_send (apacket) {
// المهمة (709088) خطأ : إزالة طباعة جميلة عندما البروتوكول"
دع البيانات = json.stringify (apacket لاغ وباطل، 2) ;
البيانات = هذا " _converter"convertfromunicode (البيانات) (
= البيانات البيانات"طول ' : 'البيانات
هذا " _outgoing = البيانات
هذا " _flushoutgoing ( ;
} "ستفعل

( *
* إغلاق النقل. /

* قريب: وظيفة dt_close () {
هذا " _input بالقرب ( ;
هذا " _output بالقرب ( ;
} "ستفعل

( *
* نظف مجرى السابق "
* /
_flushoutgoing: وظيفة dt_flushoutgoing () {
اذا هذا " _outgoing.طول > 0) بائع القيمة المضافة (VAR) {
threadmanager = تغير المناخ[ " @mozilla.org/thread-manager;1"].getservice();
هذا " _output"asyncwait (هذا, 0, 0, threadmanager"المؤشر الحالي); }

} "ستفعل

onoutputstreamready:
makeinfallible (وظيفة dt_onoutputstreamready (astream) {
دع النزلاء بواسطة = astream " الكتابة (هذا " _outgoing هذا " _outgoing " طول) ;
هذا " _outgoing = هذا " _outgoing " شريحة (كتابة) ;
هذا " _flushoutgoing ( ;
}"debuggertransport.prototype.onoutputstreamready"),

( *
* تهيئة دفق الإدخال للقراءة. كانت هذه الطريقة قد تم الفولطية
* دعا نشاهد الحزم على دفق الإدخال ، و تمريرها إلى الفائقة
* هذا " هوك " onpacket "
* /
جاهزة: وظيفة dt_ready () {
دع المضخة = CC[ " @mozilla.org/network/input-stream-pump;1"]
.createinstance (سي.nsiinputstreampump); "init
مضخة (هذا " _input و 1 و 1 و 0 و 0,خاطئة); مضخة
" asyncread (وهذا باطل ;
} "ستفعل

// nsistreamlistener الفولطية
onstartrequest:
makeinfallible (وظيفة dt_onstartrequest (arequest، acontext) { } .
" debuggertransport.prototype.onstartrequest"),

onstoprequest:
makeinfallible (وظيفة dt_onstoprequest (arequest، acontext، astatus) {
هذا بالقرب ( ;
هذا " مع " onclosed (astatus) ;
} "debuggertransport.prototype.onstoprequest"),

ondataavailable:
makeinfallible (وظيفة dt_ondataavailable (arequest، acontext "
astream، aoffset، ومليون) {
هذا " _incoming = netutil"readinputstreamtostring (astream "
astream" ( ) ;
أما هذا " _processincoming ()) { } ;
} "debuggertransport.prototype.ondataavailable"),

( *
* عملية الحزم الواردة. إذا كان يعود على الحزمة الواردة إما الفولطية
* إذا كان تعريب بشكل صحيح أو لا. يعود خاطئة إذا كان التدفق القادم لا الفولطية
* لا تحتوي الحزمة كاملة بعد. بعد على نحو سليم هو تعريب الحزمة، إيفاد الفولطية
* معالج debuggertransport " مع " onpacket يسمى مع الحزمة الفائقة
* المعلمة "
* /
_processincoming: وظيفة dt__processincoming () {
// هذا قبيح "
واسمحوا سبتمبر = هذا " _incoming"indexof ( ' : " ) ;
إذا (سبتمبر > 0) {

; عودة كاذبة}ستفعل

اسمحوا الاعتماد = parseint (هذا " _incoming " خيط ثانوي (0 سبتمبر ( ;
اذا هذا " _incoming " طول - (1 سبتمبر ) < الاعتماد) {
// لا يكون بعد إكمال الطلب "

عودة كاذبة } ; ستفعل

// لدينا طلب كامل، يبعدون من البيانات و إعراب "
هذا " _incoming = هذا " _incoming " خيط ثانوي (1 سبتمبر ( ;
واسمحوا الحزمة = هذا " _incoming " خيط ثانوي (0, الاعتماد) ;
هذا " _incoming = هذا " _incoming " خيط ثانوي (العدد) ;ستفعل

يحاول {
حزمة (packet) = هذا " _converter " converttounicode (packet); VAR
تعريب = json " إعراب (packet) ;
} المصيد العرضي (E) {
واسمحوا MSG = "خطأ تحليل حزمة (packet) واردة: " الحزمة (packet)" (" ه " - " ه " المجموعة " ) " (
اذا ما كو " reporterror) {
كو " reporterror (الرسائل); }

قلب (رسالة "
" ); عودة

} صحيح ; ستفعل

dumpn(" : " الحزمة) ;
دع الحكم الذاتي = هذا;
الخدمات.TM.المؤشر الحالي " إرسال (makeinfallible (وظيفة أو ( {
الحكم الذاتي.الخطافات"onpacket (تحليل) (
} "debuggertransport فعلى سبيل المثال هذا " مع " onpacket" )0 (; ; ستفعل

عودة حقيقية
}
}


/ **
* موفق ان يتعامل مع عمليات نقل البيانات بين ستوديو العميل الفولطية
* الخادم عندما تسير في نفس العملية. ويقدم نفس واجهة API (واجهة برمجة التطبيقات) في الفولطية
* debuggertransport ولكن بدلا من إرسال رسائل مسلسلة على الفولطية
* فيما يتعلق وإنما يدعو الحزمة مرسلة من جهة أخرى "
*
* @بارام aother localdebuggertransport الفولطية
* نقطة طرفية أخرى لهذا فيجوال ستوديو .
*
* @انظر debuggertransport الفولطية
* /هذا " localdebuggertransport = الوظيفة localdebuggertransport (aother(
{
هذا"; = aother
هذا " الخطافات = Null;ستفعل

( *
* حزمة عدد مشترك بين هذا و هذا". هذا لم يستخدم الفولطية
* البروتوكول، ولكنه يجعل الحزمة آثار أسهل على الفولطية
*" /

* هذا " _serial = هذا"؟ هذا." _serial : { ما } 0 (
}

localdebuggertransport.prototype = {
( *
* إرسال رسالة مباشرة على معالج onpacket من الفولطية
* نقطة النهاية "
* /
إرسال: وظيفة ldt_send (apacket) {
واسمحوا Serial = هذا " _serial " الاعتماد (
اذا wantlogging) {
اذا apacket.) {
dumpn ( "الحزمة " المسلسل " إلى " uneval (apacket. ( ;
} آخر اذا apacket " من) {
dumpn ( "الحزمة " المسلسل " من " uneval (apacket " من)); }


} هذا " _deepfreeze (apacket) ;
لنبرهن = هذا أخرى;
الخدمات.TM.المؤشر الحالي " إرسال (makeinfallible (وظيفة أو ( {
// تجنب تكلفة json " stringify () عند التدوين معطل "
اذا wantlogging) {
dumpn ( "تلقت الحزمة " المسلسل " : " json"stringify (apacket لاغ وباطل، 2)); }

" تثبيت " onpacket (apacket) ;
} "localdebuggertransport فعلى سبيل المثال هذا." مع " onpacket" (0) ;
} "ستفعل

( *
* إغلاق النقل. /

* قريب: وظيفة ldt_close () {
اذا هذا أخرى) {
// إزالة الإشارة إلى نقطة طرفية أخرى قبل إغلاق ( )، الفولطية
// تجنب التكرار عميق المطلقة "
لنبرهن = هذا.أخرى;
حذف هذا"; "وثيقة أخرى
( ;

} هذا " تثبيت " onclosed ( ;
} "ستفعل

( *
* فارغة طريقة محاكاة debuggertransport API. /

* الاستعداد: وظيفة ldt_ready () { } "ستفعل

( *
* وظيفة مساعد مما يجعل الجسم ثابتة تماما "
* /
_deepfreeze: وظيفة ldt_deepfreeze (aobject) {
موضوع "تجميد (aobject) ;
(واسمحوا سند في aobject) {
// تجميد الممتلكات التي تعترض,ليس في هذا النموذج،
يجري ترجمتها، يرجى الانتظار ..
 
لغات أخرى
دعم الترجمة أداة: الآيسلندية, الأذرية, الأردية, الأفريقانية, الألبانية, الألمانية, الأمهرية, الأوديا (الأوريا), الأوزبكية, الأوكرانية, الأويغورية, الأيرلندية, الإسبانية, الإستونية, الإنجليزية, الإندونيسية, الإيطالية, الإيغبو, الارمنية, الاسبرانتو, الاسكتلندية الغالية, الباسكية, الباشتوية, البرتغالية, البلغارية, البنجابية, البنغالية, البورمية, البوسنية, البولندية, البيلاروسية, التاميلية, التايلاندية, التتارية, التركمانية, التركية, التشيكية, التعرّف التلقائي على اللغة, التيلوجو, الجاليكية, الجاوية, الجورجية, الخؤوصا, الخميرية, الدانماركية, الروسية, الرومانية, الزولوية, الساموانية, الساندينيزية, السلوفاكية, السلوفينية, السندية, السنهالية, السواحيلية, السويدية, السيبيوانية, السيسوتو, الشونا, الصربية, الصومالية, الصينية, الطاجيكي, العبرية, العربية, الغوجراتية, الفارسية, الفرنسية, الفريزية, الفلبينية, الفنلندية, الفيتنامية, القطلونية, القيرغيزية, الكازاكي, الكانادا, الكردية, الكرواتية, الكشف التلقائي, الكورسيكي, الكورية, الكينيارواندية, اللاتفية, اللاتينية, اللاوو, اللغة الكريولية الهايتية, اللوكسمبورغية, الليتوانية, المالايالامية, المالطيّة, الماورية, المدغشقرية, المقدونية, الملايو, المنغولية, المهراتية, النرويجية, النيبالية, الهمونجية, الهندية, الهنغارية, الهوسا, الهولندية, الويلزية, اليورباية, اليونانية, الييدية, تشيتشوا, كلينجون, لغة هاواي, ياباني, لغة الترجمة.

Copyright ©2025 I Love Translation. All reserved.

E-mail: