שינוי שפת תוכנה
-
@ארי הכיוון נכון וככה צריך לעשות.
רק שאני מציע א) כן לכתוב בשפה העיקרית הכל (ולא קודים), ככה יותר קל בזמן עיצוב וגם שזה יישאר לכל טקסט שלא נמצא לו תרגום.
ושמנגנון התרגום יחפש בשפה הראשית את הכפתור כקוד בצירוף השם שלו ו/או שם הטופס.
ב) תוכל גם לעשות קוד קצר שמייצר שורות עבור טקסטים קיימים שעדיין לא בטבלת התרגום, וככה חוסך ממך תחזוקה של השורות.כמדומני שהחלק הקשה באקסס הוא התמיכה בדו כיווניות, כי מנגנון הפריסה לא מספיק משוכלל שהכל יתהפך - הכל מתבסס רק על מרחק מקצה עליון שמאל/ימין, וממילא אלמנטים שהטקסט שלהם ארוך יותר בשפה אחת יסתירו את שכיניהם.
-
@ארי לענ"ד הפתרון שלך הוא הנכון. כמה נקודות למחשבה:
1.צור טבלה עם הערכים השונים לכל שפה.
2. אם תתן שם ראוי לכל פקד, התחזוקה של טבלת השפה תהיה קלה ביותר.
3. מבנה הטבלה הוא כזה:FormName ControlName HebrewCaption EnglishCaption frmSomeForm cmdView הצג View אחר כך אתה מריץ קוד בארוע טעינה של הטופס שרץ על כל הפקדים ומשנה את ערך המאפיין.
רק שים לב שאתה בודק את סוג הפקד ומשנה את המאפיין הנכון, לתוית את Caption ולתיבת טקסט את Value.עריכה:
תוך כדי כתיבה ראיתי שכבר דוד קדמני. בכל מקרה אני מוסיף כאן את הקוד בטעינת טופס:
בהנחה ששם השפה נמצא במשתנה CurrentLanguageName:Dim ctrl As Control For Each ctrl In Me.Controls Select Case ctrl.ControlType Case acLabel, acTextBox Dim TextValue As String TextValue = Nz(DLookup(CurrentLanguageName & "Caption", "LangTable", _ "FormName='" & Me.Name & "' AND ControlName='" & ctrl.Name &"'"),"") If Len(TextValue) > 0) Then If ctrl.ControlType = acLabel Then ctrl.Caption = TextValue Else ctrl.Value = TextValue End If End If End Select Next ctrl
-
תודה!
אז לדעתכם עדיף לתת שמות רגילים לתוויות ובטבלה להפנות לפי שם טופס ושם פקד?
שימו לב שמדובר בעיקר (או רק) על תוויות וכיתוביות על לחצנים, ולא על תיבות טקסט וכדו'.
ולכן חשבתי תמיד לכתוב טקסט בשפה העיקרית כמו ש@dovid כתב, אבל את השם של הפקד לכתוב בתור קוד, כי ככה יותר קל להפנות לטבלה.
לא עדיף? -
@ארי אמר בשינוי שפת תוכנה:
כי ככה יותר קל להפנות לטבלה.
לדעתי להשתמש בשם הפקד כמזהה בטבלה זה עדיף, כי כך הטבלה הרבה יותר קריאה, וממילא הרבה יותר קלה לתחזוקה. וכן הטופס מכיל פקדים עם שמות תיאוריים ולא קודים עלומים.
אם השיקול שלך זה יעילות בזמן ריצה, גם לו יצוייר שחיפוש לפי מפתח עם ערך מספרי הוא מהיר יותר, אתה תבזבז זמן ארוך פי מאה בתחזוקה של הטבלה...
חוץ מזה, כמה זמן לדעתך יקח לחפש אפילו 100 פקדים בטבלה לפי מחרוזת? (אני מקווה שאין לך 100 פקדים בטופס...) זה זניח לגמרי. -
@odeddvir
שינוי קטנטן שהייתי מציע (זה זניח כמו שכתבת)
במקום לעבור על הפקדים בטופס ואז עם DlookUp לחפש את ההתאמה שלהם בטבלה, לקחת מהטבלה את כל מה שמתאים ואז לרוץ בלופ על הטבלה
קוד לדוגמא: (אני כותב כאן בשליפה אז ייתכנו טעויות כתיב...)
כמובן שכל הקוד נכתב כאן אז לצערי אין הזחות וכו.... (אין לי אקסס זמין הרגע)dim rs as recordset set rs=currentdb.openrecordset("select * from LangTable Where FormName='" & Me.Name & "'" do until rs.eof if me(rs!ControlName).ControlType= acLabel Then me(rs!ControlName).Caption=rs(CurrentLanguageName & "Caption") Else me(rs!ControlName).Value=rs(CurrentLanguageName & "Caption") End If rs.movenext loop
-
@ארי אמר בשינוי שפת תוכנה:
עריכה, איך אפשר לכתוב תנאי כזה?
הנה הקוד של @clickone , בשינויים קלים (והזחה
)
Public Function ControlExistsInForm(frm As Form, ctrlName As String) As Boolean On Error Resume Next ControlExistsInForm = Not frm.Controls(ctrlName) Is Nothing On Error GoTo 0 End Function Private Sub Form_Load() Dim rs As Recordset Set rs = CurrentDb.OpenRecordset("SELECT * FROM LangTable WHERE FormName='" & Me.Name & "'") While Not rs.EOF If ControlExistsInForm(Me, rs!ControlName) Then If Me(rs!ControlName).ControlType = acLabel Then Me(rs!ControlName).Caption = rs(CurrentLanguageName & "Caption") Else Me(rs!ControlName).Value = rs(CurrentLanguageName & "Caption") End If rs.MoveNext End If Wend End Sub
הקוד הזה הוא יותר מהיר מלולאה על כל הפקדים בטופס?
כן, כי הוא בודק רק את הפקדים שבטבלת התרגום.
-
@clickone אמר בשינוי שפת תוכנה:
צריך להתייחס גם לפקדים של כפתור
מתאים שתהיה פונקציה חיצונית שתעשה את זה בחוץ ורק תקבל את הטופסנו נו, אין מסרבין לגדול:
Public Function ControlExistsInForm(frm As Form, ctrlName As String) As Boolean On Error Resume Next ControlExistsInForm = Not frm.Controls(ctrlName) Is Nothing On Error GoTo 0 End Function Public Sub TranslateForm(frm As Form, CurrentLanguageName As String) Dim rs As Recordset Set rs = CurrentDb.OpenRecordset("SELECT * FROM LangTable WHERE FormName='" & frm.Name & "'") While Not rs.EOF Dim ctrlName As String ctrlName = rs!ControlName ctrlCaption = rs(CurrentLanguageName & "Caption") If ControlExistsInForm(frm, ctrlName) Then Select Case frm.Controls(ctrlName).ControlType Case acLabel, acCommandButton frm(ctrlName).Caption = ctrlCaption Case Else frm(ctrlName).Value = ctrlCaption End Select End If rs.MoveNext Wend End Sub Private Sub Form_Load() TranslateForm Me, "English" End Sub
-
O OdedDvir התייחס לנושא זה ב