Android Question Localization in B4XPages

Sergey_New

Well-Known Member
Licensed User
Longtime User
In the B4XPages localization example, ListView is used to select the language.
Please help me replace ListView with B4XComboBox to select the language. Filling the ComboBox works, but then I got confused.
A simplified example is attached.
 

Attachments

  • LocalizatorB4XPages.zip
    15 KB · Views: 38
Solution
I tried this in B4J. I think it should work in B4A too.

B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Public loc As Localizator
    Private cmbLanguages As B4XComboBox
    Dim availableLangs() As String = Array As String ("en", "fr", "de", "ru")
    Dim availableLanguages As List
    Dim Selected As Int
End Sub

Public Sub Initialize

End Sub

Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    loc.Initialize(File.DirAssets, "strings.db")
    ResetLayout
End Sub

Private Sub ResetLayout
    Root.RemoveAllViews
    Root.LoadLayout("1")
    loc.LocalizeLayout(Root)
    availableLanguages = loc.LocalizeList(availableLangs)
    cmbLanguages.SetItems(availableLanguages)...

DonManfred

Expert
Licensed User
Longtime User
untested but maybe

B4X:
Private Sub cmbLanguages_SelectedIndexChanged (Index As Int)
    Dim langval As String = cmbLanguages.cmbBox.GetItem(Index)
    loc.ForceLocale(langval)
    ResetLayout
End Sub
 
Upvote 0

Sergey_New

Well-Known Member
Licensed User
Longtime User

Attachments

  • LocalizatorB4XPages2.zip
    13.3 KB · Views: 30
Upvote 0

John Naylor

Active Member
Licensed User
Longtime User
I tried, it doesn't work...
It works second time you select a language.

First time selecting French, your

B4X:
    Dim langval As String = cmbLanguages.GetItem(Index)

returns "French" but it then runs ResetLayout and next time you select French it returns "fr" which is what you want
 
Last edited:
Upvote 0

aeric

Expert
Licensed User
Longtime User
I tried this in B4J. I think it should work in B4A too.

B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Public loc As Localizator
    Private cmbLanguages As B4XComboBox
    Dim availableLangs() As String = Array As String ("en", "fr", "de", "ru")
    Dim availableLanguages As List
    Dim Selected As Int
End Sub

Public Sub Initialize

End Sub

Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    loc.Initialize(File.DirAssets, "strings.db")
    ResetLayout
End Sub

Private Sub ResetLayout
    Root.RemoveAllViews
    Root.LoadLayout("1")
    loc.LocalizeLayout(Root)
    availableLanguages = loc.LocalizeList(availableLangs)
    cmbLanguages.SetItems(availableLanguages)
    cmbLanguages.SelectedIndex = Selected
End Sub

Private Sub cmbLanguages_SelectedIndexChanged (Index As Int)
    Selected = Index
    loc.ForceLocale(availableLangs(Selected))
    ResetLayout
End Sub

Edit: Rearrange code in ResetLayout sub
 
Last edited:
Upvote 0
Solution

John Naylor

Active Member
Licensed User
Longtime User
Fix - Add
I tried this in B4J. I think it should work in B4A too.

B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Public loc As Localizator
    Private cmbLanguages As B4XComboBox
    Dim availableLangs() As String = Array As String ("en", "fr", "de", "ru")
    Dim availableLanguages As List
    Dim Selected As Int
End Sub

Public Sub Initialize

End Sub

Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    loc.Initialize(File.DirAssets, "strings.db")
    ResetLayout
End Sub

Private Sub ResetLayout
    Root.RemoveAllViews
    Root.LoadLayout("1")
    availableLanguages = loc.LocalizeList(availableLangs)
    cmbLanguages.SetItems(availableLanguages)
    loc.LocalizeLayout(Root)
    cmbLanguages.SelectedIndex = Selected
End Sub

Private Sub cmbLanguages_SelectedIndexChanged (Index As Int)
    Selected = Index
    loc.ForceLocale(availableLangs(Selected))
    ResetLayout
End Sub
Cleaner than mine

I added


B4X:
Public Sub GetCode(lang As String) As String
    If lang = Null Then Return "Error"
    lang = lang.Trim
    For Each k As String In strings.Keys
        Dim v As String = strings.Get(k)
        If v <> Null And v.EqualsIgnoreCase(lang) Then Return k
    Next
    Return "Error"
End Sub

into the Localizator code then

B4X:
loc.ForceLocale(loc.GetCode(langval))

into SelectedIndexChanged
 

Attachments

  • Project.zip
    17.4 KB · Views: 34
Upvote 0

Sergey_New

Well-Known Member
Licensed User
Longtime User
aeric, in cmbLanguages when creating a page, the language set by default on the device is not selected. I have "ru", and in cmbLanguages "Английский(English)" is displayed. Has something changed?
 
Upvote 0

aeric

Expert
Licensed User
Longtime User
aeric, in cmbLanguages when creating a page, the language set by default on the device is not selected. I have "ru", and in cmbLanguages "Английский(English)" is displayed. Has something changed?
Add line #4 to set the cmbLanguages to select the device locale:
B4X:
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    loc.Initialize(File.DirAssets, "strings.db")
    Selected = availableLangs.As(List).IndexOf(loc.Language)
    ResetLayout
End Sub

I have tested with French and Russian.
 
Last edited:
Upvote 0

aeric

Expert
Licensed User
Longtime User
Project uploaded here:
 
Upvote 0
Top