الانتقال إلى المحتوى

كيفية عمل نظام متعدد اللغات


mmsalman87

Recommended Posts

  • الردود 38
  • البداية
  • اخر رد

أكثر المشاركين في هذا الموضوع

  • mmsalman87

    9

  • المبرمج الصاعد

    3

  • ramy ahmed

    3

  • ocp_em

    3

الاخ الكريم
كل عام وانت بخير
الحمد لله ربنا وفقنى فى انشاء نظام بلغات متعددة وبفضل الله وحده ثم بمجهودى الشخصى
ويمكن تقديم العون لمن اراد ذلك
وفى انتظار باقى شرحك للنظام لافادة باقى الزملاء
وجزاك الله خيرا
ومعكم ولكم نتواصل

رابط هذا التعليق
شارك

اخي الحبيب اذا كانت عندك طريقة اخرى او افكار اخرى ارجو منك تزويدنا بها وبارك الله فيك

رابط هذا التعليق
شارك

نستكمل ما بدأناه من قبل وكنا قد تحدثنا عن انشاء الجدول الماستر ووضحنا كيفية العمل به
الان سنتحدث عن الجدول الثاني الديتيل Detail

CREATE TABLE MODULES_FMD_DET
(
 FMD_FORM		  VARCHAR2(100 BYTE),
 FMD_BLOCK 		VARCHAR2(30 BYTE),
 FMD_ITEM		  VARCHAR2(30 BYTE),
 FMD_ITEM_TYPE 	VARCHAR2(20 BYTE),
 FMD_DESC_A		VARCHAR2(100 BYTE),
 FMD_DESC_E		VARCHAR2(100 BYTE),
 FMD_TOOLTIP_A 	VARCHAR2(100 BYTE),
 FMD_TOOLTIP_E 	VARCHAR2(100 BYTE),
 FMD_HINT_A		VARCHAR2(100 BYTE),
 FMD_HINT_E		VARCHAR2(100 BYTE),
 FMD_GROUP 		NUMBER(3)		   		DEFAULT 1,
 FMD_ACTIVE   	number				DEFAULT NULL,
 ENTRY_ID		  NUMBER,
 ENTRY_DATE		DATE,
 LAST_UPDATE_ID	NUMBER,
 LAST_UPDATE_DATE  DATE
)




المحددات على الجدول

اضافة foreign key لتصبح العلاقة بين الجدول الاول والثاني وهي علاقة One to Many


ALTER TABLE MODULES_FMD_DET ADD (
 CONSTRAINT FMD_DET_R01
FOREIGN KEY (FMD_FORM)
REFERENCES MODULES_FM_MSTR (FM_FORM));



شرح الجدول

FMD_FORM : اسم الفورم وهو ياخذ من الجدول الاول
FMD_BLOCK : اسم البلوك ( القطعة )
FMD_ITEM : اسم الحقل في الفورم
FMD_ITEM_TYPE : نوع الحقل في الفورم هل هو text or button or list ... etc
FMD_DESC_A : الوصف باللغة العربية
FMD_DESC_E : الوصف بالانجليزية
FMD_DESC_F : الوصف بالفرنسية
FMD_TOOLTIP_A : اداة التلميح بالعربية
FMD_TOOLTIP_E : اداة التلميح بالانجليزية
FMD_HINT_A : اداة التلميح بالعربية
FMD_HINT_E : اداة التلميح بالانجليزية
FMD_ACTIVE : هل الحقل فعال وياخذ الرقم 1 اذا كان فعال

الان ناتي لحقول المراقبة على الجدول

ENTRY_ID : رقم المستخدم
ENTRY_DATE : تاريخ الادخال
LAST_UPDATE_ID : رقم اخر مستخدم قام بالتعديل
LAST_UPDATE_DATE : تاريخ اخر تعديل

الى هنا ينتهي درسنا اليوم وفي الشرح القادم سنستعرض كيفية تطبيق الفكرة في الفورم ان شالله تعالى

تم تعديل بواسطة Ahmad.Hasan
رابط هذا التعليق
شارك


اخواني واخواتي الاعضاء
تحية طيبة وبعد
اقدم لكم اليوم شرح لكيفية عمل نظام متعدد اللغات بمعنى انك تستطيع ان تجعل نظامك يعمل باللغة العربية والانجليزية والفرنسية واي لغة اخرى انت تحبها
وذلك بتحويل كل ما هو مكتوب في الشاشة الى اللغة المختارة ، وللامانة العلمية اني انقل لكم هذا الموضوع من احدى المشاركات القديمة جدا في المنتدى والهدف هو ان ابرز الموضوع للاخوة والاخوات كي يكون لهم فيه هذا الموضوع الحل النهائي لمشاكل التحويل بين اللغات ومن اليمين اللى اليسار ... الخ

اول خطوة : انشاء الجداول في قاعدة البيانات

CREATE TABLE MODULES_FM_MSTR
(
FM_FORM VARCHAR2(100 BYTE),
FM_DESC_A VARCHAR2(100 BYTE),
FM_DESC_E VARCHAR2(100 BYTE),
FM_DESC_F VARCHAR2(100 BYTE),
FM_ACTIVE NUMBER(1),
ENTRY_ID NUMBER,
ENTRY_DATE DATE,
LAST_UPDATE_ID NUMBER,
LAST_UPDATE_DATE DATE
)

المحددات على الجدول

اضافة حقل اساسي يعني Primary key

ALTER TABLE MODULES_FM_MSTR ADD (
CONSTRAINT FM_MSTR_PK
PRIMARY KEY
(FM_FORM)

شرح الجدول

FM_FORM هو حقل اسم الفورم مثال / employees
FM_DESC_A اسم الفورم بالعربية مثال / الموظفون
FM_DESC_F هذا الاسم بالفرنسية واذا اردت لغات اخرى تضيف حقول اخرى للغات التي تريدها
FM_ACTIVE المقصود بهذا الحقل هو هل الفورم فعال ام غير فعال
ملاحظة : اذا كان فعال ياخذ القيمة 1

الان ناتي لحقول المراقبة على الجدول

ENTRY_ID رقم المستخدم الذي ادخل العملية
ENTRY_DATE تاريخ الادخال
LAST_UPDATE_ID رقم المستخدم الذي عدل اخر تعديل
LAST_UPDATE_DATE تاريخ اخر تعديل


اخواني الى هنا اليوم ونكمل في وقت اخر ان شاء الله تعالى



الاختلاف في الراي لايفسد للود قضيه هذه الطريقه غير عمليه ابدا هناك طرق اسهل بكثير مع الاحترام
رابط هذا التعليق
شارك

السلام وعليكم ورحمة الله وبركاته اخي العزيز من قبل ان تكمل الموضوع هذه الطريقة ليست عمليه لاداعي لحفظ الحقول والعناصر والبلوووك في الجدول انها طريقه غير عملية
مع الاحترام لدي طريقه افضل وهي تم بناءها من قبل مع كل الاحترام وسوف اقوم بشرحها لاحقا بأذن الله تعالى

رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته..

وكل عام وأنتم بخير.. وتقبل الله من الجميع الصيام والقيام وصالح الأعمال....

أكمل يا مهندس ونتظر تكملة الشرح.. موضوع مهم جدا
وكنت احتاجة كثير....



موووفق...

رابط هذا التعليق
شارك

عيد مبارك وكل عام والامه الاسلاميه في عزه وخير وجزاك الله خير على هذا الموضوع ووفقك الله الى كل خير

رابط هذا التعليق
شارك

اخوي
ocp_em


هل لك ان ترشدنا الى طريقتك العملية ؟ ولن اكمل الشرح وبانتظار شرحك انت وبارك الله فيك

رابط هذا التعليق
شارك


اخوي
ocp_em


هل لك ان ترشدنا الى طريقتك العملية ؟ ولن اكمل الشرح وبانتظار شرحك انت وبارك الله فيك

هههههههههههههه لماذا لم تكمل شرحك زعلت اين الروح المعنوية كلنا نعمل لنرضي وجه الله تعالى لا لان نزعل من مجرد وجهة نظر
رابط هذا التعليق
شارك

الأخ / mmsalman87 الفاضل لإن موضوعك رائع جداً وممتاز وكذلك تسلسل الافكار في طريقة الشرح جميلة لانها بسيطة وسهلة يمكن ان توصل الفكرة مباشرة دون تعقيد وانا معجب بتواضعك للعلم الذي استهليت به الموضوع والذي يدل على رفعت خلقك وروعة انسانيتك في نشر العلم
وارجوا منك رجاء خاص إكمال الموضوع لأخوانك الباقين المنتظرين لانه سيفيدهم واشكرك من قلبي على ايجاد مساحة للوقت لتفيد الاخرين

اما بالنسبة للأخ ocp em الذي علق على الموضوع ان طريقة تخزين الحقول والعناصر والبلوك باأنها غير مجدية
في بداية تعليقك ان الخلاف لايوسد للود قضية كنت موفق اما انك تقول ان طريقة تخزين الحقول والعناصر والبلوك باأنها غير مجدية فهنا انت مخطئ جداً لان الاخ لم يكمل فكرة الموضوع كاملة وانت قد حكمت عليها وثانياً ان تقول للاخ بان لا تكمل الموضوع وانت عندك فكرة اخرى أخطئت مرة اخرى بعمق لان قد يكون الاخ صاحب الموضوع عنده افكار برمجية في كود البرمجة يمكن ان يستفد منها الكل بما فيهم انت لأنك كما تعلم كل المبرمجين يمكن يصلوا الى نفس الهذف في البرنامج لكن الافكار والاساليب البرمجية تخلتف و قد يكون في مضمون الكود البرمجي مقطع برمجي او دالة يمكن ان يستفد منها المتابعون للموضوع في برنامج اخر لا يمت لصلة لهذا الموضوع بتاتاً اللهم انها تسهل وظيفة في البرنامج الاخر كان الاحرى عليك تتبع الموضوع وإذا كان عدنك اضافة أضفها لاننا هنا لنكمل افكار بعض وليسى لتقييم افكار بعض والله من وراء القصد

رابط هذا التعليق
شارك

السلام عليكم

مهندس ماهر أكمل ولا تقطع الشرح لأنه موضوع مهم ومفيد جدا جدا جدا.....

أكمل على بركة الله....

رابط هذا التعليق
شارك

الاخ ماهر سلمان لماذا لم تكمل الموضوع

رابط هذا التعليق
شارك

  • بعد 2 أسابيع...

اخي العزيز / mmsalman87 المحترم

صحيح انني جديد في هذا المنتدى لكنني متابع لمواضيع هذا المنتدى الرائع منذ فترة .. وفعلاً وجدت ضالتي في مواضيعك و بالاخص في هذا الموضوع (كيفية عمل نظام متعدد اللغات) فأرجو ان تكمله حتى نستفيد منه

وجزاك الله خيرا وجعله الله في ميزان حسناتك

رابط هذا التعليق
شارك

  • بعد 4 أسابيع...

اخواني الكرام استكمالا لموضوع اللغات المتعددة اقدم لكم اليوم الكود الذي يجب وضعه في النظام كي يعمل بناءا على الجداول التي ذكرتها لكم سابقا

في الفورم المراد تطبيق الفكرة عليه نقوم بانشاء program unit
ونسميه TRANSLATE_FORM

ونضع فيه التالي :


 
PROCEDURE TRANSLATE_FORM( IN_FORM_PRM VARCHAR2 ,IN_LANG_PRM VARCHAR2) IS
I NUMBER(4);
lItemName VARCHAR2(100);

BEGIN  

FOR ITEM_REC
IN (SELECT DECODE(IN_LANG_PRM,'A',FM_DESC_A,'E',FM_DESC_E)FM_DESC,
DECODE(IN_LANG_PRM,'A',RIGHT_TO_LEFT,LEFT_TO_RIGHT)FM_DIRECTION,
FMD_BLOCK,FMD_ITEM,
DECODE(IN_LANG_PRM,'A',FMD_DESC_A ,'E',FMD_DESC_E)FMD_PROMPT,
DECODE(IN_LANG_PRM,'A',FMD_TOOLTIP_A ,'E',FMD_TOOLTIP_E)FMD_TOOLTIP,
DECODE(IN_LANG_PRM,'A',FMD_HINT_A ,'E',FMD_HINT_E)FMD_HINT,
FMD_ITEM_TYPE,
ROWNUM
FROM MODULES_FM_MSTR
,MODULES_FMD_DET
WHERE FM_FORM=FMD_FORM AND FM_FORM=IN_FORM_PRM AND FM_ACTIVE ='Y' AND FMD_ACTIVE='Y'
)

LOOP
--SET FORM DIRECTION
IF ITEM_REC.ROWNUM=1 THEN
SET_FORM_PROPERTY(IN_FORM_PRM,DIRECTION,ITEM_REC.FM_DIRECTION);

END IF;
/*IF_STRT_002*/
IF ITEM_REC.FMD_ITEM_TYPE IN ('TEXT_ITEM','LIST','DISPLAY_ITEM','BUTTON','ICONIC_BUTTON','CHECK_BOX','INIT_TEXT') AND GET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,ITEM_CANVAS)IS NOT NULL THEN
IF(ITEM_REC.FMD_ITEM_TYPE IN ('TEXT_ITEM'))THEN
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,PROMPT_TEXT,ITEM_REC.FMD_PROMPT);
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,TOOLTIP_TEXT,ITEM_REC.FMD_TOOLTIP);
--SET_ITEM_VALUE(IN_FORM_PRM,ITEM_REC.FMD_BLOCK,ITEM_REC.FMD_ITEM,IN_LANG_PRM);

ELSIF(ITEM_REC.FMD_ITEM_TYPE IN ('LIST'))THEN
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,PROMPT_TEXT,ITEM_REC.FMD_PROMPT);
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,TOOLTIP_TEXT,ITEM_REC.FMD_TOOLTIP);
--BUILD_LIST(ITEM_REC.FMD_ITEM,IN_LANG_PRM);
ELSIF(ITEM_REC.FMD_ITEM_TYPE IN ('DISPLAY_ITEM'))THEN
--SET_ITEM_VALUE(IN_FORM_PRM,ITEM_REC.FMD_BLOCK,ITEM_REC.FMD_ITEM,IN_LANG_PRM);
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,PROMPT_TEXT,ITEM_REC.FMD_PROMPT);
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,TOOLTIP_TEXT,ITEM_REC.FMD_TOOLTIP);
-- SET_ITEM_VALUE(IN_FORM_PRM,ITEM_REC.FMD_BLOCK,ITEM_REC.FMD_ITEM,IN_LANG_PRM);
ELSIF(ITEM_REC.FMD_ITEM_TYPE IN ('INIT_TEXT'))THEN
COPY(ITEM_REC.FMD_PROMPT,ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM);
ELSIF ITEM_REC.FMD_ITEM_TYPE IN ('BUTTON') THEN
IF(GET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,ICONIC_BUTTON)='TRUE')THEN
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,PROMPT_TEXT,ITEM_REC.FMD_PROMPT);
ELSE
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,LABEL,ITEM_REC.FMD_PROMPT);
END IF;
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,TOOLTIP_TEXT,ITEM_REC.FMD_TOOLTIP);
ELSIF ITEM_REC.FMD_ITEM_TYPE IN ('ICONIC_BUTTON') THEN
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,TOOLTIP_TEXT,ITEM_REC.FMD_TOOLTIP);
ELSIF ITEM_REC.FMD_ITEM_TYPE IN ('CHECK_BOX') THEN
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,LABEL,ITEM_REC.FMD_PROMPT);
SET_ITEM_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||ITEM_REC.FMD_ITEM,TOOLTIP_TEXT,ITEM_REC.FMD_TOOLTIP);
END IF;
END IF;
IF ITEM_REC.FMD_ITEM_TYPE IN ('MAIN_WINDOW') THEN
SET_WINDOW_PROPERTY(ITEM_REC.FMD_ITEM,TITLE,ITEM_REC.FMD_PROMPT);
SET_WINDOW_PROPERTY(ITEM_REC.FMD_ITEM,DIRECTION,ITEM_REC.FM_DIRECTION);
SET_WINDOW_PROPERTY(ITEM_REC.FMD_ITEM,WINDOW_STATE,MAXIMIZE);
ELSIF ITEM_REC.FMD_ITEM_TYPE IN ('WINDOW') THEN
SET_WINDOW_PROPERTY(ITEM_REC.FMD_ITEM,TITLE,ITEM_REC.FMD_PROMPT);
SET_WINDOW_PROPERTY(ITEM_REC.FMD_ITEM,DIRECTION,ITEM_REC.FM_DIRECTION);
/*IF_END_003*/
ELSIF ITEM_REC.FMD_ITEM_TYPE IN ('SYSTEM') THEN
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,TITLE,ITEM_REC.FMD_PROMPT);
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,WINDOW_STATE,MAXIMIZE);
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,DIRECTION,ITEM_REC.FM_DIRECTION);
ELSIF ITEM_REC.FMD_ITEM_TYPE IN ('TAB_PAGE') THEN
SET_TAB_PAGE_PROPERTY(ITEM_REC.FMD_ITEM,LABEL,ITEM_REC.FMD_PROMPT);

ELSIF ITEM_REC.FMD_ITEM_TYPE IN ('RADIO_BUTTON') THEN
I:=INSTR(ITEM_REC.FMD_ITEM,'.');
IF GET_RADIO_BUTTON_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||SUBSTR(ITEM_REC.FMD_ITEM,1,I-1),
SUBSTR(ITEM_REC.FMD_ITEM,I+1),PROMPT_TEXT)<>'' THEN
SET_RADIO_BUTTON_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||SUBSTR(ITEM_REC.FMD_ITEM,1,I-1),
SUBSTR(ITEM_REC.FMD_ITEM,I+1),PROMPT_TEXT,ITEM_REC.FMD_PROMPT);
ELSE
SET_RADIO_BUTTON_PROPERTY(ITEM_REC.FMD_BLOCK||'.'||SUBSTR(ITEM_REC.FMD_ITEM,1,I-1),
SUBSTR(ITEM_REC.FMD_ITEM,I+1),LABEL,ITEM_REC.FMD_PROMPT);
END IF;
END IF;

END LOOP;

END;




مع ملاحظة انه يجب ان تكون انوع العناصر
SYSTEM
RADIO_BUTTON
MAIN_WINDOW
LIST
TEXT_ITEM
ICONIC_BUTTON
BUTTON
TAB_PAGE
WINDOW
CHECK_BOX

وفي تريغر WHEN - NEW - FORM - INSTANCE
نكتب الكود التالي :

 
declare
 V_MODULE_NAME varchar2(1000);

 begin


   V_MODULE_NAME :=:system.current_form;
 IF :GLOBAL.P_USER_LANGUAGE = 1 THEN
  TRANSLATE_FORM(V_MODULE_NAME, 'A') ;

 ELSIF :GLOBAL.P_USER_LANGUAGE =2 THEN
TRANSLATE_FORM(V_MODULE_NAME, 'E') ;
 END IF;

 end;


وبهذا سيعمل النظام باللغتين العربية والانجليزية
ما زال هناك الكثير من الافكار لتحسين تعدد الانظمة سيتم التحدث عنها لاحقا

وبالتوفيق للجميع

رابط هذا التعليق
شارك

  • بعد 2 شهور...

مشكور أخي ماهر على الموضوع الرائع...
واسمح لي بإضافة بسيطة...
اذا أردت تغيير لغة النظام من داخل النظام، يتم استخدام الكود التالي على ترجر Key-Menu على مستوى الموديول:


Begin
Translate_Form(:System.Current_Form, 1 - To_Number(:Global.language));
 If :Global.language = 'A' Then
  :Global.language := 'B';
 Else
:Global.language := 'A';
 End If;  
End;



وبذلك يتم تغيير لغة البرنامج من خلال الضغط على F5....

تحياتي.

رابط هذا التعليق
شارك

  • بعد 4 شهور...
  • بعد 5 شهور...

أخي مااهر الحبيب ممكن طلب
إنك تعمل جميع مشاركات على ملف وورد لكي نقدر من عمل ماشرحت لانه بصراحة شرح وفركة جيدة
لنه والله قد تعبت لأني عملت نظام بلغتين وعملت 2 من كل فورمة وحست وتلخبطت كثير الكثير...


ياااليت ..

وشكرا على الشرح موووفق..

اخوك

رابط هذا التعليق
شارك

  • بعد 1 شهر...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية