דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. שינוי שפת תוכנה

שינוי שפת תוכנה

מתוזמן נעוץ נעול הועבר תכנות
13 פוסטים 4 כותבים 340 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מחובר
    dovidD מחובר
    dovid ניהול
    השיב לארי ב נערך לאחרונה על ידי dovid
    #2

    @ארי הכיוון נכון וככה צריך לעשות.
    רק שאני מציע א) כן לכתוב בשפה העיקרית הכל (ולא קודים), ככה יותר קל בזמן עיצוב וגם שזה יישאר לכל טקסט שלא נמצא לו תרגום.
    ושמנגנון התרגום יחפש בשפה הראשית את הכפתור כקוד בצירוף השם שלו ו/או שם הטופס.
    ב) תוכל גם לעשות קוד קצר שמייצר שורות עבור טקסטים קיימים שעדיין לא בטבלת התרגום, וככה חוסך ממך תחזוקה של השורות.

    כמדומני שהחלק הקשה באקסס הוא התמיכה בדו כיווניות, כי מנגנון הפריסה לא מספיק משוכלל שהכל יתהפך - הכל מתבסס רק על מרחק מקצה עליון שמאל/ימין, וממילא אלמנטים שהטקסט שלהם ארוך יותר בשפה אחת יסתירו את שכיניהם.

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    תגובה 1 תגובה אחרונה
    8
    • OdedDvirO מנותק
      OdedDvirO מנותק
      OdedDvir
      השיב לארי ב נערך לאחרונה על ידי OdedDvir
      #3

      @ארי לענ"ד הפתרון שלך הוא הנכון. כמה נקודות למחשבה:
      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
      
      clickoneC תגובה 1 תגובה אחרונה
      7
      • א מנותק
        א מנותק
        ארי
        כתב ב נערך לאחרונה על ידי
        #4

        תודה!
        אז לדעתכם עדיף לתת שמות רגילים לתוויות ובטבלה להפנות לפי שם טופס ושם פקד?
        שימו לב שמדובר בעיקר (או רק) על תוויות וכיתוביות על לחצנים, ולא על תיבות טקסט וכדו'.
        ולכן חשבתי תמיד לכתוב טקסט בשפה העיקרית כמו ש@dovid כתב, אבל את השם של הפקד לכתוב בתור קוד, כי ככה יותר קל להפנות לטבלה.
        לא עדיף?

        OdedDvirO תגובה 1 תגובה אחרונה
        0
        • OdedDvirO מנותק
          OdedDvirO מנותק
          OdedDvir
          השיב לארי ב נערך לאחרונה על ידי OdedDvir
          #5

          @ארי אמר בשינוי שפת תוכנה:

          כי ככה יותר קל להפנות לטבלה.

          לדעתי להשתמש בשם הפקד כמזהה בטבלה זה עדיף, כי כך הטבלה הרבה יותר קריאה, וממילא הרבה יותר קלה לתחזוקה. וכן הטופס מכיל פקדים עם שמות תיאוריים ולא קודים עלומים.
          אם השיקול שלך זה יעילות בזמן ריצה, גם לו יצוייר שחיפוש לפי מפתח עם ערך מספרי הוא מהיר יותר, אתה תבזבז זמן ארוך פי מאה בתחזוקה של הטבלה...
          חוץ מזה, כמה זמן לדעתך יקח לחפש אפילו 100 פקדים בטבלה לפי מחרוזת? (אני מקווה שאין לך 100 פקדים בטופס...) זה זניח לגמרי.

          א תגובה 1 תגובה אחרונה
          4
          • א מנותק
            א מנותק
            ארי
            השיב לOdedDvir ב נערך לאחרונה על ידי
            #6

            @odeddvir מקבל.
            שוב תודה רבה!

            תגובה 1 תגובה אחרונה
            0
            • clickoneC מנותק
              clickoneC מנותק
              clickone
              השיב לOdedDvir ב נערך לאחרונה על ידי clickone
              #7

              @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
              

              אין טסט כמו פרודקשן.

              המייל שלי urivpn@gmail.com

              א תגובה 1 תגובה אחרונה
              8
              • א מנותק
                א מנותק
                ארי
                השיב לclickone ב נערך לאחרונה על ידי ארי
                #8

                @clickone הבעיה היא שאם יש בטבלה שדה שהפקד שלו נמחק לדוג' אז זה יחזיר שגיאה.
                אבל תמיד אפשר לעשות תנאי לפני זה שאם אין פקד כזה הוא יעבור הלאה.
                עריכה, איך אפשר לכתוב תנאי כזה?
                הקוד הזה הוא יותר מהיר מלולאה על כל הפקדים בטופס?
                תודה!

                OdedDvirO תגובה 1 תגובה אחרונה
                0
                • OdedDvirO מנותק
                  OdedDvirO מנותק
                  OdedDvir
                  השיב לארי ב נערך לאחרונה על ידי
                  #9

                  @ארי אמר בשינוי שפת תוכנה:

                  עריכה, איך אפשר לכתוב תנאי כזה?

                  הנה הקוד של @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
                  
                  

                  הקוד הזה הוא יותר מהיר מלולאה על כל הפקדים בטופס?

                  כן, כי הוא בודק רק את הפקדים שבטבלת התרגום.

                  clickoneC תגובה 1 תגובה אחרונה
                  5
                  • clickoneC מנותק
                    clickoneC מנותק
                    clickone
                    השיב לOdedDvir ב נערך לאחרונה על ידי clickone
                    #10

                    @odeddvir תודה על ההזחה 🙂 (והקוד...)
                    2 דברים קטנים נוספים

                    1. צריך להתייחס גם לפקדים של כפתור
                    2. מתאים שתהיה פונקציה חיצונית שתעשה את זה בחוץ ורק תקבל את הטופס (ואתה אלוף בזה, כרגיל)

                    אין טסט כמו פרודקשן.

                    המייל שלי urivpn@gmail.com

                    OdedDvirO תגובה 1 תגובה אחרונה
                    4
                    • OdedDvirO מנותק
                      OdedDvirO מנותק
                      OdedDvir
                      השיב לclickone ב נערך לאחרונה על ידי OdedDvir
                      #11

                      @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
                      
                      א תגובה 1 תגובה אחרונה
                      6
                      • א מנותק
                        א מנותק
                        ארי
                        השיב לOdedDvir ב נערך לאחרונה על ידי
                        #12

                        @odeddvir חוזר לי שגיאה על השורה הזאת

                        ctrlName = rs(ControlName)
                        
                        OdedDvirO תגובה 1 תגובה אחרונה
                        0
                        • OdedDvirO מנותק
                          OdedDvirO מנותק
                          OdedDvir
                          השיב לארי ב נערך לאחרונה על ידי OdedDvir
                          #13

                          @ארי אמר בשינוי שפת תוכנה:

                          ctrlName = rs(ControlName)

                          צודק. צ"ל ctrlName = rs("ControlName") או ctrlName = rs!ControlName
                          תיקנתי במקור.

                          תגובה 1 תגובה אחרונה
                          3
                          • OdedDvirO OdedDvir התייחס לנושא זה ב

                          בא תתחבר לדף היומי!
                          • התחברות

                          • אין לך חשבון עדיין? הרשמה

                          • התחברו או הירשמו כדי לחפש.
                          • פוסט ראשון
                            פוסט אחרון
                          0
                          • דף הבית
                          • קטגוריות
                          • פוסטים אחרונים
                          • משתמשים
                          • חיפוש
                          • חוקי הפורום