Italian Una o più traduzioni: qual è il sistema migliore secondo voi?

udg

Expert
Licensed User
Longtime User
For Each objFTF As B4XFloatTextField
Appunto. In questo modo dici che ogni oggetto della recursive è un B4xFTF.
Se invece lo leggi come oggetto generico o come View e poi esegui il test, otterrai di operare solo su quelli del tipo corretto.
 

Elric

Well-Known Member
Licensed User
Ottimo! Grazie!

Ultimissima cosa: il B4XFloatTextField cambia l'HintText se lo aggiorno con .Update, infatti questo codice funziona.
B4X:
    B4XFloatTextField1.HintText = language.Value(B4XFloatTextField1.HintText)
    B4XFloatTextField1.Update
    B4XFloatTextField2.HintText = language.Value(B4XFloatTextField2.HintText)
    B4XFloatTextField2.Update

Questo, invece, no:
B4X:
    For Each objFTF As Object In Root.GetAllViewsRecursive
        If objFTF Is B4XFloatTextField Then
            Dim ftf As B4XFloatTextField = objFTF
            Log(ftf.HintText)
            ftf.HintText = language.Value(ftf.HintText)
            ftf.Update
        End If
    Next
🤔 🤔 🤔
 
D

Deleted member 103

Guest
Più che complicarla, vorrei semplificarla. Non solo seguendo il n. 8 di questi suggerimenti ma il tuo suggerimento mi va bene se ho qualcosa di "piccolo" ma se ho 8 pagine con 10 o più controlli ciascuna, devo scrivere righe e righe di codice. Così, invece, ho uno snippet che ripeto in ciascuna pagina (oppure creo una sub nella clsLanguage2 che richiamo in ciascuna pagina) e fa da solo pescando dal file creato conla tua ottima app. :)
Io la uso sempre in questo modo, perchè così mi rispario di scrivere nel designer e posso controllare meglio il Textsize delle View.
 

LucaMs

Expert
Licensed User
Longtime User
Ottimo! Grazie!

Ultimissima cosa: il B4XFloatTextField cambia l'HintText se lo aggiorno con .Update, infatti questo codice funziona.
B4X:
    B4XFloatTextField1.HintText = language.Value(B4XFloatTextField1.HintText)
    B4XFloatTextField1.Update
    B4XFloatTextField2.HintText = language.Value(B4XFloatTextField2.HintText)
    B4XFloatTextField2.Update

Questo, invece, no:
B4X:
    For Each objFTF As Object In Root.GetAllViewsRecursive
        If objFTF Is B4XFloatTextField Then
            Dim ftf As B4XFloatTextField = objFTF
            Log(ftf.HintText)
            ftf.HintText = language.Value(ftf.HintText)
            ftf.Update
        End If
    Next
🤔 🤔 🤔
Mah, strano. Forse nel ciclo qualcosa viene messo in cache ed è più veloce. Aggiungici uno Sleep(0) (o qualcosina di più, max 30).
 

Elric

Well-Known Member
Licensed User
Consiglio Soresina48 o caciocavallo e, in questo secondo caso, una bella fetta spessa da "arrostire"! 🥴
 
D

Deleted member 103

Guest
Neanche con Sleep(3000)...
Scusa, ma in questo caso per risparmiare 2 righe ne scrivi 6?
B4X:
    B4XFloatTextField1.HintText = language.Value("Username")
    B4XFloatTextField2.HintText = language.Value("Password")

B4X:
    For Each Vw As View In Root.GetAllViewsRecursive
        If Vw.Tag Is B4XFloatTextField Then
            Dim ftf As B4XFloatTextField = Vw.Tag
            ftf.HintText = language.Value(ftf.HintText)
            ftf.Update
        End If
    Next
 

LucaMs

Expert
Licensed User
Longtime User
Scusa, ma in questo caso per risparmiare 2 righe ne scrivi 6?
B4X:
    B4XFloatTextField1.HintText = language.Value("Username")
    B4XFloatTextField2.HintText = language.Value("Password")

B4X:
    For Each Vw As View In Root.GetAllViewsRecursive
        If Vw.Tag Is B4XFloatTextField Then
            Dim ftf As B4XFloatTextField = Vw.Tag
            ftf.HintText = language.Value(ftf.HintText)
            ftf.Update
        End If
    Next
Sarà stato un esempio, visto anche che B4XFloatTextField1, come nome di una View, è orripilante e gli manderei un drone che lo bacchettasse 😄
 

Elric

Well-Known Member
Licensed User
Il motivo è che

If objFTF Is B4XFloatTextField Then

non funziona, ergo non entra mai all'interno del blocco If-End If.
Numero 1!!!

Scusa, ma in questo caso per risparmiare 2 righe ne scrivi 6?
B4X:
    B4XFloatTextField1.HintText = language.Value("Username")
    B4XFloatTextField2.HintText = language.Value("Password")

B4X:
    For Each Vw As View In Root.GetAllViewsRecursive
        If Vw.Tag Is B4XFloatTextField Then
            Dim ftf As B4XFloatTextField = Vw.Tag
            ftf.HintText = language.Value(ftf.HintText)
            ftf.Update
        End If
    Next
Corretta osservazione.

... e infatti, come dice LucaMs, è solo un esempio per capire come funziona il metodo.

Sono abituato mentalmente a programmare tutto in una lingua e poi, se necessario, fare alla fine le traduzioni. In più, al momento, mi trovo meglio a inserire Text e Hint con il Designer per tenere il più pulito possibile il codice, altrimenti, mi si incrociano gli occhi!

Quindi, finché non cambio metodo, le righe non sono più 2 ma 4 (devo aggiungere il .Update) e, per ogni B4XFloatTextField che inserisco, se ne aggiungono altre 2... per non parlare del fatto che mi piace tenermi "elastico" laddove possibile e l'iterazione con "For each" me lo permette. Infatti, se i cicli "for each" li metto in un modulo e li richiamo passandogli di volta in volta la Root, non mi resta che chiamare solo la sub e, per singola pagina, il tutto si riduce ad una sola riga. Non so sono riuscito a spiegarmi.
 

Elric

Well-Known Member
Licensed User
Scusate se vi scoccio ulteriormente ma mi capita una cosa che davvero non capisco.

B4X:
Error occurred on line: 29 (mdlTranslate)
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at anywheresoftware.b4a.keywords.Common.CallSubDebug2(Common.java:460)
    at b4j.B4XPageLanguageFil.b4xpagesmanager._createpageifneeded(b4xpagesmanager.java:868)
    at b4j.B4XPageLanguageFil.b4xpagesmanager._showpage(b4xpagesmanager.java:347)
    at b4j.B4XPageLanguageFil.b4xpagesmanager._addpage(b4xpagesmanager.java:176)
    at b4j.B4XPageLanguageFil.b4xpagesmanager._addpageandcreate(b4xpagesmanager.java:190)
    at b4j.B4XPageLanguageFil.b4xpagesmanager._initialize(b4xpagesmanager.java:126)
    at b4j.B4XPageLanguageFil.main._appstart(main.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:632)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:237)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:167)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:91)
    at anywheresoftware.b4a.shell.ShellBA.raiseEvent2(ShellBA.java:98)
    at anywheresoftware.b4a.BA.raiseEvent(BA.java:78)
    at b4j.B4XPageLanguageFil.main.start(main.java:38)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at anywheresoftware.b4a.debug.Debug.CallSub4(Debug.java:134)
    at anywheresoftware.b4a.debug.Debug.CallSubNew2(Debug.java:81)
    ... 35 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at anywheresoftware.b4a.debug.Debug.CallSub4(Debug.java:115)
    ... 36 more
Caused by: java.lang.ClassCastException: anywheresoftware.b4j.objects.PaneWrapper$ConcretePaneWrapper$NonResizePane cannot be cast to javafx.scene.control.Control
    at b4j.B4XPageLanguageFil.mdltranslate._translateallcontrols(mdltranslate.java:110)
    at b4j.B4XPageLanguageFil.b4xmainpage$ResumableSub_B4XPage_Created.resume(b4xmainpage.java:86)
    at b4j.B4XPageLanguageFil.b4xmainpage._b4xpage_created(b4xmainpage.java:50)
    ... 41 more

Questo errore mi viene generato se avvio (in modalità debug) senza alcun Breakpoint.

Se invece inserisco un breakpoint alla riga 29, quando ci arriva tolgo il breakpoint e clicco su esegui, tutto fila liscio e il codice funziona!

Tutto quello che ho fatto è creare un modulo mdlTranslate:
B4X:
'Static code module
Sub Process_Globals
    Private fx As JFX
  
    Public language As clsLanguage2
End Sub

Public Sub TranslateAllControls(myRoot As B4XView)
  
    language.Initialize
  
    For Each objTEXT As B4XView In myRoot.GetAllViewsRecursive
        If (objTEXT Is Button Or objTEXT Is Label Or objTEXT Is CheckBox) Then
            Log(objTEXT.Text)
            objTEXT.Text = language.Value(objTEXT.Text)
        Else If objTEXT Is ComboBox Then
            Private cmbbx As ComboBox = objTEXT
            Private cmbbxLst As List = cmbbx.Items
            For i = 0  To cmbbxLst.Size - 1
                Log(cmbbx.Items.Get(i))
                cmbbx.Items.Set(i, language.Value(cmbbx.Items.Get(i)))
            Next
        End If
    Next
  
    For Each objTOOLTIPTEXT As Control In myRoot.GetAllViewsRecursive
        If (objTOOLTIPTEXT Is Button Or objTOOLTIPTEXT Is Label Or objTOOLTIPTEXT Is CheckBox) Then
            Private myString As String = objTOOLTIPTEXT.TooltipText
            If myString.Length > 0 Then
                Log(myString)
                objTOOLTIPTEXT.TooltipText = language.Value(objTOOLTIPTEXT.TooltipText)
            End If
        End If
    Next
  
    For Each vw As B4XView In myRoot.GetAllViewsRecursive
        If vw.tag Is B4XFloatTextField Then
            Dim ftf As B4XFloatTextField = vw.Tag
            Log(ftf.HintText)
            ftf.HintText = language.Value(ftf.HintText)
            ftf.Update
        End If
    Next
  
End Sub

e richiamare con un wait for la sub "TranslateAllControls":
B4X:
Wait For (mdlTranslate.TranslateAllControls(Root)) Complete

Confermo che essendo un esempio per capire e sperimentare, il tooltiptext nel Button1 "This is a label" è solo per sperimentare.
 

Attachments

  • B4XPageLanguageFil.zip
    13.9 KB · Views: 97
Last edited:
Top