घर
Top.Mail.Ru Yandeks.Metrika
मंच: "शुरुआती";
वर्तमान संग्रह: 2018.12.23;
डाउनलोड करें: [xml.tar.bz2];

नीचे

कृपया सेवा में प्रवाह में मेरी मदद करें इसी तरह की शाखाएँ खोजें


jcl   (2016-08-25 15:49) [0]

शुभ दिन!

सेवाओं और धाराओं वाला विषय मेरे लिए नया है, इसलिए भ्रम था।
एक सेवा बनाने के लिए, मैं मानक सेवा अनुप्रयोग का उपयोग करता हूं (मैं उदाहरण http://www.tolderlund.eu/delphi/service/service.htm का उपयोग करके सब कुछ करता हूं)। ऑनस्टार्ट, ऑनटॉप और ऑनशूटडाउन ईवेंट हैंडलर जोड़ें। पहला धागा onStart हैंडलर में बनाया गया है, और इसकी Execute पद्धति में मैं एक अनंत लूप को समाप्त होने तक करता हूं। वास्तव में कोड मानक है। अब मुझे कई प्रवाह बनाने की ज़रूरत है (आने वाले दस्तावेज़ों को पढ़ने के लिए, डिलीवरी के लिए रसीदें भेजने के लिए, आउटगोइंग दस्तावेज़ लिखने के लिए, दस्तावेज़ पंजीकरण के लिए रसीदें प्राप्त करने के लिए)। प्रश्न: इसे किस स्थान पर किया जाना चाहिए ताकि सेवा को मृत नहीं माना जाए (क्योंकि डेटाबेस तक पहुंच, डेटा के साथ काम करना माना जाता है)? सेवा की ऑनस्टार्ट विधि (जहां, वास्तव में, पहला थ्रेड बनाया जाता है) या पहले थ्रेड की एक्सक्यूट विधि में? और एक और सवाल: स्ट्रीम कक्षाओं की पदानुक्रम बनाने का सबसे अच्छा तरीका क्या है: आभासी तरीकों के साथ एक मूल धारा, और इसमें से वंशानुक्रम और पुनर्परिभाषित करना या मूर्खतापूर्ण रूप से कई स्ट्रीम कक्षाएं बनाना?

और एक और बात: Log4D के साथ लॉगिंग को एक अलग धागे के रूप में किया जाना चाहिए, या केवल श्रमिकों से कॉल करना चाहिए? यदि अलग है, तो नियंत्रण स्थानांतरित कैसे करें?

बहुत अधिक डांट मत करो, सामग्री मेरे लिए मुश्किल हो गई और इंटरनेट पर उदाहरण देखने में फिट नहीं हुई ...।

धन्यवाद !!!

D2007 का उपयोग कर पुनश्च



Игорь Шевченко ©   (2016-08-25 19:01) [1]

https://rsdn.org/article/baseserv/svcadmin-1.xml
https://rsdn.org/article/baseserv/svcadmin-2.xml

पढ़ने के लिए उपयोगी



KSergey ©   (2016-08-26 08:54) [2]

यहाँ - सभी विस्तार से
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1348



jcl   (2016-08-29 11:32) [3]


> KSergey © (26.08.16 08: 54) [2]

यह पढ़ा जाता है, पूरी तरह से नहीं मिला है।

धन्यवाद इगोर शेवचेंको।

हालाँकि, एक समस्या उत्पन्न हुई। सब कुछ किया गया था, जैसा कि डेल्फ़िक्यूशेड और टेलरलंड पर लेखों में है, लेकिन स्टार्ट हैंडलर में कोड काम नहीं करता है। लॉग नहीं लिखता है।

unit MainServiceUnit;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, Registry,
 MyServiceThreadUnit, MySecondThreadUnit, Log4D;

type
 TDirectum_Integration = class(TService)
   procedure ServiceAfterInstall(Sender: TService);
   procedure ServiceStart(Sender: TService; var Started: Boolean);
   procedure ServiceStop(Sender: TService; var Stopped: Boolean);
   procedure ServiceShutdown(Sender: TService);
 private
   MyServiceThread: TMyServiceThread;
   MySecondThread: TMySecondThread;
   procedure ServiceStopShutdown;
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
Directum_Integration: TDirectum_Integration;
 //Logger: TLogRollingFileAppender;
 Logger : TLogLogger;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 Directum_Integration.Controller(CtrlCode);
end;

function TDirectum_Integration.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

procedure TDirectum_Integration.ServiceAfterInstall(Sender: TService);
var
 Reg: TRegistry;
begin
 Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
 try
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   if Reg.OpenKey("\SYSTEM\CurrentControlSet\Services\" + Name, false) then
   begin
     Reg.WriteString("Description", "");
     Reg.CloseKey;
   end;
 finally
   Reg.Free;
 end;
end;

procedure TDirectum_Integration.ServiceStart(Sender: TService;
 var Started: Boolean);
 var
   FStream: TFileStream;
begin

 MyServiceThread := TMyServiceThread.Create;


 FStream:= TFileStream.Create("MyFileStreamLog.log",fmCreate or fmOpenWrite);
 FStream.WriteBuffer("ServiceStart работает!!!",Length("ServiceStart работает!!!"));

 MyServiceThread.Resume;

 FreeAndNil(FStream);
end;

procedure TDirectum_Integration.ServiceStop(Sender: TService;
 var Stopped: Boolean);
begin
 ServiceStopShutdown;
end;

procedure TDirectum_Integration.ServiceShutdown(
 Sender: TService);
begin
 ServiceStopShutdown;
end;

procedure TDirectum_Integration.ServiceStopShutdown;
begin

 if Assigned(MyServiceThread) then
 begin
 
   MyServiceThread.Terminate;
   MyServiceThread.WaitFor;
   FreeAndNil(MyServiceThread);
 end;
end;
end.


लॉग को प्रोजेक्ट फ़ाइल में जोड़ा गया था, और अर्जित किया गया था। लेकिन केवल स्थापना के साथ, सेवाओं की स्थापना रद्द करें !!! कृपया मुझे यह पता लगाने में मदद करें !! OnStart ईवेंट क्यों काम नहीं करता है (ServiceStart ऑब्जेक्ट इंस्पेक्टर के लिए ऑनस्टार्ट ईवेंट हैंडलर के रूप में जोड़ा गया था। सेवा फ़ाइल-न्यू-अदर-सर्विस एप्लिकेशन के माध्यम से बनाई गई थी। एक ही समय में एक फॉर्म बनाया गया था और इसमें एक हैंडलर जोड़ा गया था)? और सर्विस को इनस्टॉल / अनइंस्टॉल करने पर सर्विस प्रोजेक्ट कोड क्यों निष्पादित किया जाता है ??

शुक्रिया!

कार्यक्रम Directum_Integration; का उपयोग करता है SvcMgr, MainServiceUnit में "MainServiceUnit.pas" {Directum_Integration: TService}, "MyServiceThreadUnit.pas" में MyServiceThreadUnit कक्षाएं, SysUtils; {$ R * .RES} वर FStream: TFileStream; शुरू करना यदि नहीं तो Application.DelayInitialize या Application.Installing तो Application.Initialize; Application.CreateForm (TDirectum_Integration, Directum_Integration); Application.Run; FStream: = TFileStream.Create ("MyFileStreamLog.log", fmCreate या fmOpenWrite); FStream.WriteBuffer ("ServiceStart DOES NOT WORK !!!", लंबाई ("ServiceStart DOES NOT WORK !!!")); FreeAndNil (FStream); अंत।



jcl   (2016-08-29 11:34) [4]

इकाई MyServiceThreadUnit; इंटरफ़ेस का उपयोग करता है कक्षाएं {$ IFDEF MSWINDOWS}, विंडोज {$ ENDIF}, Log4D, Log4DXML; टाइप TMyServiceThread = वर्ग (TThread) निजी प्रक्रिया सेटनाम; संरक्षित प्रक्रिया निष्पादित; ओवरराइड; सार्वजनिक निर्माता बनाएँ; अंत; कार्यान्वयन {$ IFDEF MSWINDOWS} टाइप TThreadNameInfo = रिकॉर्ड एफटाइप: लॉन्गवर्ड; // 0x1000 होना चाहिए FName: PChar; // सूचक का नाम (उपयोगकर्ता पता स्थान में) एफट्रेडिड: लॉन्गवर्ड; // थ्रेड आईडी (-1 कॉलर थ्रेड को इंगित करता है) एफफ्लैग्स: लॉन्गवर्ड; // भविष्य में उपयोग के लिए आरक्षित, शून्य होना चाहिए अंत; {$ ENDIF} {} TMyServiceThread प्रक्रिया TMyServiceThread.SetName; {$ IFDEF MSWINDOWS} वर ThreadNameInfo: TThreadNameInfo; {$ ENDIF} शुरू करना {$ IFDEF MSWINDOWS} ThreadNameInfo.FType: = $ 1000; ThreadNameInfo.FName: = "MyServiceThread"; ThreadNameInfo.FThreadID: = $ FFFFFFFF; ThreadNameInfo.FFlags: = 0; कोशिश RaiseException ($ 406D1388, 0, sizeof (ThreadNameInfo) div sizeof (LongWord), @ThreadNameInfo); सिवाय अंत; {$ ENDIF} अंत; निर्माता TMyServiceThread.Create; शुरू करना FreeOnTerminate: = गलत; विरासत में मिला बनाएँ (सच); अंत; प्रक्रिया TMyServiceThread.Execute; स्थिरांक SecBetweenRuns = 10; वर गणना: पूर्णांक; शुरू करना SetName; जब तक हम बंद न करें, तब तक डॉ। लूप समाप्त न करें शुरू करना इंक (गणना); अगर गणना> = SecBetweenRuns तो शुरू करना गणना: = एक्सएनयूएमएक्स; {अपना सेवा कोड यहां रखें} {यह वह जगह है जहां कार्रवाई होती है} // SomeProcedureInAnotherUnit; अंत; नींद (0); अंत; अंत; अंत।



iop ©   (2016-08-29 11:40) [5]

OnStart ईवेंट क्यों काम नहीं करता है

सब कुछ वहाँ काम करता है।
और सब कुछ लॉग को लिखा है।
लेकिन वर्तमान सेवा निर्देशिका वह नहीं है जिसका आप उपयोग कर रहे हैं।



jcl   (2016-08-29 13:02) [6]

आहा !! धन्यवाद !!!



sniknik ©   (2016-08-29 13:32) [7]

लेकिन यह क्या है?
> प्रक्रिया TMyServiceThread.SetName;
> ...
> अंत;
क्या एक नाम के बिना एक धारा नहीं चल सकती? जहां तक ​​मुझे पता है कि यह केवल भाषाओं / आवेषण की स्क्रिप्टिंग के लिए आवश्यक है, देशी कोड के अंदर एक अतिरिक्त है, आप हमेशा किसी ऑब्जेक्ट पर सीधे काम कर सकते हैं।

पीएस शायद मुझे पता नहीं है और गुप्त अर्थ क्या है? (व्यावहारिक रूप से उपयोग नहीं किए जाने वाले नाम से किसी वस्तु की खोज के कार्यों की गिनती नहीं करना)



jcl   (2016-08-29 15:01) [8]


> स्निकनिक © (29.08.16 13: 32) [7]

यह थ्रेड ऑब्जेक्ट बनाते समय दिया गया नाम था। खैर, आप इसे हटा सकते हैं। मैं बस यह देखना चाहता था कि यह क्या है।

मेरा एक और सवाल है। सभी उपयोगी कोड थ्रेड के OnExecute में है। लेकिन वह पूरी नहीं हुई है! लॉग कोड को वहां रखा गया था
यदि गणना> = SecBetweenRuns तो शुरू करना गणना: = एक्सएनयूएमएक्स;

और काम नहीं करता है। क्या गलती हो सकती है?



iop ©   (2016-08-29 15:16) [9]

गलत जगह से इसके धागे के निर्माण का कारण बना



iop ©   (2016-08-29 15:22) [10]

और यह उम्मीद है कि एक थ्रेड में यह एक सेकंड में एक बार "टिक" करेगा।

नींद (1000);



jcl   (2016-08-29 15:29) [11]


> iop © (29.08.16 15: 16) [9]

क्या यह यहाँ गलत है?
प्रक्रिया TDirectum_Integration.ServiceStart .... MyServiceThread.Resume;

तो यह लेख में उदाहरण में था। और मैं कहाँ बुलाऊँ?


> iop © (29.08.16 15: 22) [10]

यहाँ क्या गलत है?



jcl   (2016-08-29 15:32) [12]


> iop © (29.08.16 15: 22) [10]

यही है, आप साइकिल को ऑनस्टार्ट सेवा में स्थानांतरित करने की पेशकश करते हैं, और केवल उपयोगी काम करने के लिए थ्रेड में?



iop ©   (2016-08-29 15:58) [13]

सेवा अपने ऑनसाइट में अपने सभी उपयोगी कार्य करती है
और यह onEkzekut एक क्रिएट और एक शुरुआत के रूप में गलत थ्रेड में निष्पादित होता है।



jcl   (2016-08-29 16:08) [14]


> iop © (29.08.16 15: 58) [13]
> सेवा अपने सभी उपयोगी कार्य को अपने onEkzekute में करती है

राज्य में एक लेख से कतरन:

आप सेवा को दो तरह से लागू कर सकते हैं।

विकल्प एक: सेवा शुरू होती है, आप कुछ करना शुरू करते हैं, समय-समय पर अपनी स्थिति की प्रणाली को सूचित करते हैं, फिर सेवा बंद हो जाती है।

विकल्प दो: सेवा शुरू होती है, वर्कफ़्लो बनाती है। सिस्टम से सूचना मिलने पर, थ्रेड बंद हो जाते हैं और सेवा बंद हो जाती है।

आमतौर पर, सेवाएं दूसरे विकल्प का उपयोग करती हैं, लेकिन यह आपकी पसंद है - हम दोनों के बारे में बात करेंगे।

दूसरे कार्यान्वयन विकल्प के लिए, आपको एक OnExecute हैंडलर असाइन करने की आवश्यकता नहीं है, लेकिन आपको कम से कम OnStart और OnStop को लागू करना होगा। पहले हैंडलर में, आप सेवा के वर्कफ़्लो शुरू करते हैं, और ओनसटॉप में, आप रुक जाते हैं

तो फिर गलती क्या है?



jcl   (2016-08-29 16:08) [15]

मैं दूसरा विकल्प बनाने की कोशिश कर रहा हूं



iop ©   (2016-08-29 16:18) [16]

मैं दूसरा विकल्प बनाने की कोशिश कर रहा हूं

तो कैसे? यह पता चला है?

ps आपको राज्यों पर वामपंथी लेख नहीं, बल्कि प्रलेखन पढ़ने की आवश्यकता है।



jcl   (2016-08-29 16:25) [17]


> iop © (29.08.16 16: 18) [16]

और अगर व्यंग्य के बिना, तो क्या समझाना सामान्य है?



jcl   (2016-08-29 17:21) [18]

समस्या हल हो गई, धन्यवाद आईओपी।

सेवा में निष्पादन विधि बनाई गई थी, इसे जोड़ा गया
MyServiceThread: = TMyServiceThread.Create; MyServiceThread.Resume; जबकि समाप्त नहीं है शुरू करना ServiceThread.ProcessRequests (सच); समाप्त;

सत्य या गलत विषय पर चर्चा http://www.sql.ru/forum/690236/prostenkiy-servis-cpu-usage-51-chto-posovetuete

और प्रक्रिया में TMyServiceThread.Execute; उपयोगी कोड जोड़ें।

एक अन्य उपयोगी लिंक http://delphi.xcjc.net/viewthread.php?tid=48065 है



Eraser ©   (2016-08-30 01:16) [19]


> jcl (25.08.16 15: 49)

ओह, कई कारणों से, मैं सेवा को लागू करने के लिए मानक वीसीएल कक्षाओं का उपयोग नहीं करने की अत्यधिक सलाह देता हूं। सब कुछ अत्यधिक भ्रामक है और खराब रूप से वहां मौजूद है। यह सब परियोजना और संपादन के साथ फ़ोल्डर में SvcMgr स्रोतों की नकल करके समाप्त होता है। यहां, उदाहरण के लिए, आपको सेवा से उपयोगकर्ता लॉगिंग / लॉगिंग के तथ्य को रोकना होगा।

यह दुर्लभ मामला है जब आपको खरोंच से लिखने की आवश्यकता होती है। वहाँ सब कुछ उतना जटिल नहीं है जितना लगता है, Rozych का मूल सेवा का एक अच्छा उदाहरण है http://rouse.drkb.ru/winapi.php#twoservicedemo
वहाँ कुछ भी जटिल नहीं है।



Игорь Шевченко ©   (2016-08-30 11:09) [20]

इरेज़र © (30.08.16 01: 16) [19]


> Rozych एक बुनियादी सेवा http: // rouse का एक अच्छा उदाहरण है।
> drkb.ru/winapi.php#twoservicedemo
> वहाँ कुछ भी जटिल नहीं है।


वहाँ सब कुछ अति भ्रामक और गैर विस्तार योग्य है।



jcl   (2016-08-30 15:49) [21]


> इरेज़र © (30.08.16 01: 16) [19]


बहुत-बहुत धन्यवाद, मैं देखूंगा।

> सेवा से उपयोगकर्ता के निकास / लॉगिन के तथ्य को रोकना आवश्यक होगा
> सिस्टम को


इस सेवा के लिए, सिद्धांत रूप में, इस तरह के कार्य को रोका नहीं जा सकता है। अब से मैं मानक कक्षाओं के बिना लिखूंगा, लेकिन प्रशिक्षण के स्तर पर उनके बिना ऐसा करना संभव नहीं था।



sniknik ©   (2016-08-30 16:32) [22]

> अब से मैं मानक कक्षाओं के बिना लिखूंगा, लेकिन प्रशिक्षण स्तर पर यह उनके बिना काम नहीं करता था।
:) मैंने इसके विपरीत किया ... समझने / जानने के लिए, मैंने वाइनपी पर एक सेवा लिखी, और फिर मानक कक्षाओं का उपयोग किया। वे विशुद्ध रूप से लेखन की सुविधा / गति के लिए हैं, न कि प्रशिक्षण के लिए। IMHO के।



Eraser ©   (2016-08-31 20:26) [23]


> इगोर शेवचेंको © (30.08.16 11: 09) [20]

यह कैसे गैर-एक्स्टेंसिबल हो सकता है, अगर यह शुद्ध एपीआई पर है, तो आप कल्पना के साथ जितना चाहें उतना बढ़ा सकते हैं।
लेकिन मानक वर्ग खराब तरीके से डिज़ाइन किया गया है और एक्सटेंसिबल नहीं है। लेखक वर्चुअल कीवर्ड से बहुत डरता था।
मैं बहुत आलसी नहीं था यह देखने के लिए कि वास्तव में वहां क्या सूट नहीं करता था। मुझे उम्मीद है कि शायद 10 कुछ वर्षों में फिर से लिखा। दोबारा नहीं लिखा गया।
समस्या वर्ग के दिल में है:

प्रक्रिया TService.Main (Argc: DWord; Argv: PLPWSTR); टाइप PPCharArray = ^ TPCharArray; TPCharArray = अरहर का [0..1024]; वर i: पूर्णांक; नियंत्रक: THANDlerFunction; शुरू करना i: = 0 से Argc - 1 करते हैं FParams.Add (PPCharArray (Argv) [i]); नियंत्रक: = GetServiceController (); FStatusHandle: = RegisterServiceCtrlHandler (PChar (नाम), @ नियंत्रक); अगर (FStatusHandle = 0) तब LogMessage (SysErrorMessage (GetLastError)) अन्यथा DoStart; अंत;
यह एक सामान्य, गैर-आभासी तरीका है।
लेखक ने RegisterServiceCtrlHandlerEx के अस्तित्व के बारे में नहीं सुना। इस प्रकार हम केवल win2K समय से नियंत्रण कोड को संसाधित कर सकते हैं, बाद में दिखाई देने वाली सब कुछ समर्थित नहीं है।
+ सेवा का विवरण निर्दिष्ट करने में कोई समस्या थी।


> jcl (30.08.16 15: 49) [21]


> मैं मानक कक्षाओं के बिना लिखना जारी रखूंगा

यहां आपको यह समझने की आवश्यकता है कि सामान्य तौर पर, मैं साइकिल के आविष्कार के इस दृष्टिकोण के खिलाफ हूं। सेवा के साथ एक विशेष मामले में, आपकी बाइक, उस लिंक के आधार पर, अधिक सक्षम और अधिक कार्यात्मक होगी।



Игорь Шевченко ©   (2016-08-31 23:08) [24]

इरेज़र © (31.08.16 20: 26) [23]


> यदि यह शुद्ध एपीआई पर है तो यह गैर-एक्स्टेंसिबल कैसे हो सकता है


इसलिए यह एक्स्टेंसिबल नहीं है। यदि कक्षाओं का एक सेट लिखा गया था, तो यह एक्स्टेंसिबल है, और मैं एपीआई पर एक फुटक्लॉथ की सिफारिश नहीं करूंगा। और हां, नामांकित पाइपों पर मेरे प्राचीन उदाहरण के लिए मुझे भी शर्म आती है :)



Тимохов Дима ©   (2016-09-25 22:43) [25]


> स्निकनिक © (30.08.16 16: 32) [22]
उद्धरण 1 >> मैं मानक कक्षाओं के बिना लिखना जारी रखूंगा, लेकिन मंच पर
> प्रशिक्षण उनके बिना काम नहीं करता था।
> :) मैंने लिखने के लिए समझने / जानने के लिए इसके विपरीत ... किया
> winapi पर सेवा, और फिर मानक कक्षाओं का उपयोग कर।
> वे विशुद्ध रूप से लेखन की सुविधा / गति के लिए हैं, लेकिन
> प्रशिक्षण के लिए नहीं। IMHO के।


मैं पूरा समर्थन करता हूं।
पहले आपको सार को समझने की आवश्यकता है।
और फिर आप मानक कक्षाओं का उपयोग कर सकते हैं।



पन्ने: 1 पूरी शाखा

मंच: "शुरुआती";
वर्तमान संग्रह: 2018.12.23;
डाउनलोड करें: [xml.tar.bz2];

ऊपर





मेमोरी: 0.68 एमबी
समय: 0.023 c
15-1475703002
यूरी
2016-10-06 00:30
2018.12.23
आपको जन्मदिन की शुभकामनाएं! 6 अक्टूबर 2016 गुरुवार


4-1290160827
boatswain
2010-11-19 13:00
2018.12.23
कैट फ्लैश ड्राइव या कार्ड रीडर सीखते हैं


15-1475791274
हरमन
2016-10-07 01:01
2018.12.23
अनातोली Podgoretsky की धन्य स्मृति!


2-1475106928
आर्थर
2016-09-29 02:55
2018.12.23
फाइल से पढ़ना और लिखना


15-1475789401
यूरी
2016-10-07 00:30
2018.12.23
आपको जन्मदिन की शुभकामनाएं! 7 अक्टूबर 2016 शुक्रवार





अफ्रीकी अल्बानियन अरबी भाषा अर्मेनियाई आज़रबाइजानी बस्क बेलारूसी बल्गेरियाई कैटलन सरलीकृत चीनी) चीनी पारंपरिक) क्रोएशियाई चेक डेनिश डच अंग्रेज़ी एस्तोनियावासी फिलिपिनो फिनिश फ्रेंच
गैलिशियन् जॉर्जियाई जर्मन यूनानी हाईटियन यहूदी हिंदी हंगरी आइसलैंड का इन्डोनेशियाई आयरिश इतालवी जापानी कोरियाई लात्वीयावासी लिथुआनियाई मेसीडोनियन मलायी मोलतिज़ नार्वेजियन
फ़ारसी पोलिश पुर्तगाली रोमानियाई रूसी सर्बियाई स्लोवाक स्लोवेनियाई स्पेनिश स्वाहिली स्वीडिश थाई तुर्की यूक्रेनी उर्दू वियतनामी वेल्श यहूदी बंगाली बोस्नियाई
सिबुआनो एस्पेरांतो गुजराती हौसा हमोंग ईग्बो जावानीस कन्नड़ खमेर लाओ लैटिन माओरी मराठी मंगोलियन नेपाली पंजाबी सोमाली तामिल तेलुगु योरूबा
ज़ुलु
Английский Французский Немецкий Итальянский Португальский Русский Испанский