B4A Library AHLocale library

With this library you can convert dates, timestamps, numbers and normal texts to the format your device uses. You can even translate your apps to different languages.

The AHLocale object provides many information about your devices locale settings like Currency symbol, month names, weekday names etc.

The AHTranslator object provides methods for creating multilanguage apps.

The AHDateTime object provides methods for formatting and parsing date strings. The internal DateTime object of B4A has the problem that it uses localized format identifier so it is not possible to parse a date string in the format "2011/05/19 12:15 AM" on a german device because the "AM" is "vorm." on it. With the AHDateTime object you can parse and format dates in any locale.

The AHTimeZone object provides methods to get information about timezones (like offset to UTC, DST offset etc.)

The AHDateUtils object provides methods to format dates and date ranges and display them localized.

The AHNumeric object provides methods to handle different (localized) number formats.

The example app starts always in english. Translation files for german, italian and japanese are provided. Try to select another language with the topmost spinner and see how the language of the user interface changes.

AHLocale
Author:
Markus Stipp
Version: 1.16
  • AHDateTime
    Fields:
    • DEFAULT As Int
    • FULL As Int
    • LONG As Int
    • MEDIUM As Int
    • SHORT As Int
    Methods:
    • Format (ticks As Long) As String
      Formats the specified ticks value to a string with the specified pattern.
    • GetDefaultDatePattern (Style As Int) As String
      Gets the default DatePattern of the device default locale

      Style - Use constants SHORT, MEDIUM, LONG, FULL, DEFAULT
    • GetDefaultDatePattern2 (Style As Int, Locale As AHLocale) As String
      Gets the default DatePattern of given locale

      Style - Use constants SHORT, MEDIUM, LONG, FULL, DEFAULT
      Locale - Reference to an AHLocale object
    • GetDefaultDateTimePattern (DateStyle As Int, TimeStyle As Int) As String
      Gets the device default DateTimePattern

      DateStyle - Style for Date
      TimeStyle - Style for Time
    • GetDefaultDateTimePattern2 (DateStyle As Int, TimeStyle As Int, Locale As AHLocale) As String
      Gets the DateTimePattern for the given Locale

      DateStyle - Style for Date
      TimeStyle - Style for Time
    • GetDefaultTimePattern (Style As Int) As String
      Gets the default TimePattern of the device default locale

      Style - Use constants SHORT, MEDIUM, LONG, FULL, DEFAULT
    • GetDefaultTimePattern2 (Style As Int, Locale As AHLocale) As String
      Gets the default TimePattern of given locale

      Style - Use constants SHORT, MEDIUM, LONG, FULL, DEFAULT
      Locale - Reference to an AHLocale object
    • GetShortDatePatternWithoutYear As String
      Return a short date pattern without year information
    • Initialize
      Initializes the AHDateTime object with the default locale.
    • Initialize2 (locale As AHLocale)
      Initializes the AHDateTime object with the given AHLocale object
    • InitializeUS
      Initializes the AHDateTime object with the <strong>en_US</strong> locale.
    • Parse (date As String) As Long
      Parses the specified string and returns a tick value.

      Throws an exception if the string can not be parsed.
    • is24HourFormat As Boolean
      Returns true if the user preference settings is 24 hour format.
    Properties:
    • Lenient As Boolean
      If you set this to true the parser is not very strict on his date format.
    • Pattern As String
      Sets or gets the Date/Time pattern

      Default pattern is: <strong>yyyy-MM-dd HH:mm:ss</strong>

      For allowed placeholders look here: <link>SimpleDateFormat|http://developer.android.com/reference/java/text/SimpleDateFormat.html</link>
    • TimeZone As AHTimezone
      Sets or gets the timezone for the AHDateTime object
  • AHDateUtils
    Fields:
    • FORMAT_12HOUR As Int
    • FORMAT_24HOUR As Int
    • FORMAT_ABBREV_ALL As Int
    • FORMAT_ABBREV_MONTH As Int
    • FORMAT_ABBREV_RELIVE As Int
    • FORMAT_ABBREV_TIME As Int
    • FORMAT_ABBREV_WEEKDAY As Int
    • FORMAT_CAP_AMPM As Int
    • FORMAT_CAP_MIDNIGHT As Int
    • FORMAT_CAP_NOON As Int
    • FORMAT_CAP_NOON_MIDNIGHT As Int
    • FORMAT_NO_MIDNIGHT As Int
    • FORMAT_NO_MONTH_DAY As Int
    • FORMAT_NO_NOON As Int
    • FORMAT_NO_NOON_MIDNIGHT As Int
    • FORMAT_NO_YEAR As Int
    • FORMAT_NUMERIC_DATE As Int
    • FORMAT_SHOW_DATE As Int
    • FORMAT_SHOW_TIME As Int
    • FORMAT_SHOW_WEEKDAY As Int
    • FORMAT_SHOW_YEAR As Int
    • FORMAT_UTC As Int
    • LENGTH_LONG As Int
    • LENGTH_MEDIUM As Int
    • LENGTH_SHORT As Int
    • LENGTH_SHORTER As Int
    • LENGTH_SHORTEST As Int
    Methods:
    • FormatDateRange (StartTicks As Long, EndTicks As Long, Flags As Int) As String
      Formats a date or a time range according to the local conventions.

      Note that this is a convenience method. Using it involves creating an
      internal Formatter instance on-the-fly, which is somewhat costly in terms
      of memory and time.

      StartTicks - start time
      EndTicks - end time
      Flags - a bit mask of options
    • FormatDateTime (Ticks As Long, Flags As Int) As String
      Formats a date or a time according to the local conventions. There are
      lots of options that allow the caller to control, for example, if the
      time is shown, if the day of the week is shown, if the month name is
      abbreviated, if noon is shown instead of 12pm, and so on.

      Ticks - time/date to format
      Flags - a bit mask of options
    • FormatElapsedTime (Seconds As Long) As String
      Formats an elapsed time in the form "MM:SS" or "H:MM:SS" for display on
      the call-in-progress screen.

      Seconds - the elapsed time in seconds.
    • GetRelativeDateTimeString (Ticks As Long, MinResolution As Long, TransitionResolution As Long, Flags As Int) As CharSequence
      Return string describing the elapsed time since startTime formatted like
      "[relative time/date], [time]".

      <b>Ticks</b> - some time in the past.

      <b>MinResolution</b> - the minimum elapsed time (in milliseconds) to
      report when showing relative times. For example, a time 3 seconds in the
      past will be reported as "0 minutes ago" if this is set to
      MINUTE_IN_MILLIS.

      <b>TransitionResolution</b> - the elapsed time (in milliseconds) at which
      to stop reporting relative measurements. Elapsed times greater than this
      resolution will default to normal date formatting. For example, will
      transition from "6 days ago" to "Dec 12" when using WEEK_IN_MILLIS.

      <b>Flags</b> - a bit mask of options
    • GetRelativeTimeSpanString (Ticks As Long, Now As Long, MinResolution As Long, Flags As Int) As CharSequence
      Returns a string describing 'time' as a time relative to 'now'.

      Time spans in the past are formatted like "42 minutes ago". Time spans in
      the future are formatted like "in 42 minutes". Can use
      FORMAT_ABBREV_RELATIVE flag to use abbreviated relative times, like
      "42 mins ago".

      <b>Ticks</b> - the time to describe, in milliseconds

      <b>Now</b> - the current time in
      milliseconds

      <b>MinResolution</b> - the minimum timespan to report. For example,
      a time 3 seconds in the past will be reported as "0 minutes ago" if this
      is set to MINUTE_IN_MILLIS. Pass one of 0, MINUTE_IN_MILLIS,
      HOUR_IN_MILLIS, DAY_IN_MILLIS, WEEK_IN_MILLIS

      <b>Flags</b> - a bit mask of
      formatting options, such as FORMAT_NUMERIC_DATE or FORMAT_ABBREV_RELATIVE
    • IsToday (Ticks As Long) As Boolean
      Returns true if the supplied Ticks value is today else false
  • AHLocale
    Methods:
    • Initialize
      Initializes the AHLocale object with the default locale.
    • Initialize2 (language As String)
      Initializes the AHLocale object using the specified language.
    • Initialize3 (language As String, country As String)
      Initializes the AHLocale object using the specified language and country.
    • InitializeUS
      Initializes the AHLocale Object with <strong>en_US</strong> locale. This locale is
      available on every device.
    Properties:
    • AmPmStrings() As String [read only]
      Returns the array of strings which represent AM and PM.
    • AvailableLocales As List [read only]
      Returns the system's installed locales. These are returned as a B4A List of AHLocale Objects.
      There are only locales in this list which have a non empty country and language.
    • Country As String [read only]
      Returns the country/region code for this locale, which will either be the
      empty string or an uppercase ISO 3166 2-letter code.
    • CurrencyCode As String [read only]
      Returns this currency's ISO 4217 currency code.
    • CurrencyFractionDigits As Int [read only]
      Returns the default number of fraction digits for this currency.
    • CurrencySymbol As String [read only]
      Returns the localized currency symbol for this currency in locale.
    • DisplayCountry As String [read only]
      Returns the name of this locale's country, localized to locale. Returns
      the empty string if this locale does not correspond to a specific country
    • DisplayLanguage As String [read only]
      Returns the name of this locale's language, localized to locale. If the
      language name is unknown, the language code is returned.
    • DisplayName As String [read only]
      Returns this locale's language name, country name, and variant, localized
      to locale. The exact output form depends on whether this locale
      corresponds to a specific language, country and variant, such as:
      English, English (United States), English (United States,Computer),
      anglais (?tats-Unis), anglais (?tats-Unis,informatique).
    • EnglishCountry As String [read only]
      Returns the name of this locale's country in english. Returns
      the empty string if this locale does not correspond to a specific country
    • EnglishLanguage As String [read only]
      Returns the name of this locale's language in english. If the
      language name is unknown, the language code is returned.
    • EnglishName As String [read only]
      Returns this locale's language name, country name, and variant in english.
      The exact output form depends on whether this locale
      corresponds to a specific language, country and variant, such as:
      English, English (United States), English (United States,Computer),
      anglais (?tats-Unis), anglais (?tats-Unis,informatique).
    • FirstDayOfWeek As Int [read only]
      Gets the first day of the week
    • ISO3Country As String [read only]
      Gets the three letter ISO country code which corresponds to the country
      code for this Locale.
    • ISO3Language As String [read only]
      Gets the three letter ISO language code which corresponds to the language
      code for this Locale.
    • ISOCode As String [read only]
      Returns the ISO Code for this Locale such as <strong>en_US</strong> or <strong>de_DE</strong>
    • ISOCountries() As String [read only]
      Gets the list of two letter ISO country codes which can be used as the
      country code for a Locale.
    • ISOLanguages() As String [read only]
      Gets the list of two letter ISO language codes which can be used as the
      language code for a Locale.
    • Initialized As Boolean [read only]
      Returns if the object is initialized
    • Language As String [read only]
      Gets the language code for this Locale or the empty string if no language
      was set.
    • Months() As String [read only]
      Returns the array of strings containing the full names of the months.
    • ShortMonths() As String [read only]
      Returns the array of strings containing the abbreviated names of the months.
    • ShortWeekDays() As String [read only]
      Returns the array of strings containing the abbreviated names of the days of the week.
    • WeekDays() As String [read only]
      Returns the array of strings containing the full names of the days of the week.
  • AHNumeric
    Methods:
    • Format (Value As Double) As String
      Format the number to a string using the pattern and rules of this object.
    • Initialize
      Initializes a standard NumberFormat object with the standard locale
    • Initialize2 (Locale As AHLocale)
      Initializes a standard NumberFormat object with the given locale.
    • InitializeCurrency
      Initializes a currency NumberFormat object with the standard locale
    • InitializeCurrency2 (Locale As AHLocale)
      Initializes a currency NumberFormat object with the given locale.
    • InitializeInteger
      Initializes an integer NumberFormat object with the standard locale
    • InitializeInteger2 (Locale As AHLocale)
      Initializes an integer NumberFormat object with the given locale.
    • InitializeNumber
      Initializes a standard NumberFormat object with the standard locale
    • InitializeNumber2 (Locale As AHLocale)
      Initializes a standard NumberFormat object with the given locale.
    • InitializePercent
      Initializes a percent NumberFormat object with the standard locale
    • InitializePercent2 (Locale As AHLocale)
      Initializes a percent NumberFormat object with the given locale.
    • Parse (Value As String) As Number
      Parse the given string and convert it to a number. This may throw a
      ParseException if the format of the string is not correct.
    Properties:
    • MaximumFractionDigits As Int
      Set or get the maximum fraction digits.
    • MaximumIntegerDigits As Int
      Set or get the maximum integer digits.
    • MinimumFractionDigits As Int
      Set or get the minimum fraction digits.
    • MinimumIntegerDigits As Int
      Set or get the minimum integer digits
    • Pattern As String
      Set or get the pattern that is used for formatting and parsing.
  • AHTimeZone
    Fields:
    • STYLE_LONG As Int
    • STYLE_SHORT As Int
    Methods:
    • GetDisplayName (DaylightTime As Boolean, Style As Int) As String
      Returns the Display name of this timezone

      DaylightTime - Set to true if you want to have DST included into the name
      Style - AHTimeZone.SHORT or AHTimeZone.LONG format
    • GetDisplayName2 (DaylightTime As Boolean, Style As Int, Locale As AHLocale) As String
      Returns the Display name of this timezone

      DaylightTime - Set to true if you want to have DST included into the name
      Style - AHTimeZone.SHORT or AHTimeZone.LONG format
      Locale - a AHLocale object to set in which language you want the displayname
    • GetOffset (Date As Long) As Long
      Returns the offset in milliseconds from UTC for this time zone at time.
      The offset includes daylight savings time if the specified date is within the daylight savings time period.

      Date - Date for which you want to have the info
    • InDaylightTime (Date As Long) As Boolean
      Returns true if Date is in a daylight savings time period for this time zone.

      Date - Date for which you want to get the info
    • Initialize
      Initialize a AHTimeZone object with default timezone
    • Initialize2 (ID As String)
      Initializes a AHTimeZone object with the given TimeZone ID

      ID - TimeZone ID like "Europe/Berlin"
    Properties:
    • AvailableIds As List [read only]
      Returns a list of available timezone IDs on this device.
      One of the results can be passed to the Initialize2() Method to reinitialize
      an AHTimeZone object with a different timezone
    • DSTSavings As Long [read only]
      Returns the daylight savings offset in milliseconds for this time zone.
      The base implementation returns 3600000 (1 hour) for time zones that use daylight savings
      time and 0 for timezones that do not.
      Note that this method doesn't tell you whether or not to apply the offset: you need to call
      InDaylightTime() for the specific time you're interested in. If this method returns a non-zero
      offset, that only tells you that this TimeZone sometimes observes daylight savings.
    • ID As String
      Gets or sets the timezone ID as String for this timezone
    • RawOffset As Long
      Sets or gets the Raw offset for this timezone
  • AHTranslator
    Methods:
    • GetText (text As String) As String
      Searches for the text in the translation table. If a translation is
      available it will be returned. If no translation is available the text is
      added to the missing translation table and the original text is returned.
      So you can write your whole program in a default language. If a
      translation is available it will be used, if not, the text will be
      returned in the default language.
    • GetText2 (text As String, params As List) As String
      Searches for the text in the translation table and returns the translated
      text.

      You can use Placeholders in the form of {1} {2} etc. which will be
      replaced with the content of the second parameter. {1} will be replaced
      with the first item in the Array/List, {2} with the second one and so on.
    • Initialize (dir As String, basename As String)
      Initializes a translation object with the device language. Tries to read a
      translation file with the following name convention: basename_language.lng
    • Initialize2 (dir As String, basename As String, language As String)
      Initializes a translation object with the given language. Tries to read a
      translation file with the following name convention: basename_language.lng
    • Initialize3 (dir As String, basename As String, language As String, country As String)
      Initializes a translation object with the given language and country code.
      Tries to read a translation file with the following name
      convention: basename_language_country.lng
    • WriteTranslation (dir As String, filename As String)
      Writes two files to the specified dir. The current translation Map is
      written to [filename]_[language].lng and the missing translation Map is
      written to [filename]_miss_[language].lng
    Properties:
    • CurrentCountry As String [read only]
      Returns the current County code
    • CurrentFile As String [read only]
      Returns current file name of language file
    • CurrentLanguage As String [read only]
      Returns current Language code
    • DefaultLanguage As String
      Sets or gets the default language. This is the language used when no language file is found.
      If you don't set it the default language will be empty and is not used.
    • Extension As String
      Sets or gets the current file extension
    • MissingTranslationMap As Map [read only]
      Returns a Map object with all text phrases which are missing in the
      translation file.
    • TranslationMap As Map
      Returns a Map object with the current translations

History:
V1.1:
  • fixed Documentation
  • fixed some bugs (DisplayXXX methods)
  • new AHDateTime object
  • some minor improvements

V1.11:
  • fixed problem with AvailableLocales not working on all devices

V1.12:
  • new AHTimeZone object to get information from timezones

V1.13: (never released)
  • Add TimeZone property to AHDateTime object

V1.14:
  • AHTranslator.java - Removed log output
  • Timezone.java - fixed type

V1.15:
  • AHDateUtils object - new
  • AHNumeric object - new
V1.16:
  • AHDateTime - Methods for getting default date and time format strings
  • AHTranslation - Support for Countries
  • AHTranslation - Support for default language
  • AHTranslation - Support for different file extensions
 

Attachments

  • LocaleExample.zip
    8.3 KB · Views: 3,673
  • TimeZoneExample.zip
    5.7 KB · Views: 1,820
  • DateUtilsExample.zip
    6.1 KB · Views: 1,787
  • AHLocale1_16.zip
    17.3 KB · Views: 3,743
Last edited:

corwin42

Expert
Licensed User
Longtime User
AHTimeZone.AvailableIds returns a lot of zones, but ...
is posible to sort then by TimeOffset?

I think AHTimeZone.AvailableIds is s list, and then is posible to sort with sortType?

AHTimeZone.AvailableIds is just a wrapper to the TimeZone.getAvailableIDs() method. So there is no possibility to change the sort order in the library.
 

wimpie3

Well-Known Member
Licensed User
Longtime User
Can you please modify the library to accept also ".properties" files as the source? I'm using a java properties editor which writes .properties files. They cannot be read by AHLocale because of the file extension used.
 

wimpie3

Well-Known Member
Licensed User
Longtime User
The files cannot be opened in my resource editor when they don't have a ".properties" extension. I know I can rename the files every time I want to modify them, but why make life harder when it's (probably) a simple modification in AHLOCALE?
 

corwin42

Expert
Licensed User
Longtime User
Updated the library to V1.16
  • AHDateTime - Methods for getting default date and time format strings
  • AHTranslation - Support for Countries
  • AHTranslation - Support for default language
  • AHTranslation - Support for different file extensions
For the default language and file extension just set AHTranslator.Extension or AHTranslator.DefaultLanguage prior to initialize the Translator object and it will be initialized with the given options.

With the DefaultLanguage option you can create translations with real placeholder for the strings. Create a translation file with all translations in your default language ("en" for example). This translation file is loaded prior to other translation files. So if english is your default language you should supply a translation file for english which includes ALL translated strings. If your app then runs in german but your german translation file does not contain all strings, the english translation will be used if no german translation exists.

I think support for Countries needs a bit more testing. Translation files can be named xxxx_en_us.lng for example
 
Last edited:

corwin42

Expert
Licensed User
Longtime User
How to change Application Name for different languages ?
What do you want to do? The basename is a parameter to the initialize method.
 

enrico

Active Member
Licensed User
Longtime User
Is it not possible that an app is installed with a different name if the device language is different ?
 

corwin42

Expert
Licensed User
Longtime User
Is it not possible that an app is installed with a different name if the device language is different ?
If you want to translate your application name you have to use the "Android like" solution explained here
 

Richard Goh

Active Member
Licensed User
Longtime User
how can i add a new language file into the program and where to set it? i had created a new language file with "localeexample_zh.lng" and added the file into b4a. it's doesn't set the label text set in the file when I run the sample program and select the language with zh. where it's go wrong?
attached is the lng file. but i renamed it to .txt due to not a valid upload file for ".lng". pls advice. thank you.
 

Attachments

  • localeexample_zh.txt
    790 bytes · Views: 205

corwin42

Expert
Licensed User
Longtime User
Your file is UTF16 with DOS CR/LF encoding. Use UTF8 with Unix CR/LF.
You have to use unicode notation if you want to use non ASCII characters.
A online converter can be found here.
 

leitor79

Active Member
Licensed User
Longtime User
Hi!

Could someone explain the file format? I have this, from the example:

Currency\:=valuta\:
First\ day\ of\ Week\:=Primo giorno della settimana\:
Current\ Language\:=Lingua attuale\:
Select\ Month=Selezionare mese
Select\ weekday=Selezionare giorno
Locale\ Example=Esempio Locale
Translation\ with\ variable\ values=Traduzione con variabli locali
You\ are\ in\ {1}\ and\ your\ Currency\ is\ {2}=Ti trovi in {1} e la tua valuta {2}

Although I could copy the format, I'd like to understand why the \ and the \:

Thank you!
 

corwin42

Expert
Licensed User
Longtime User
Could someone explain the file format? I have this, from the example:

Although I could copy the format, I'd like to understand why the \ and the \:

It is a standard java properties file. See here for more information
 

Richard Goh

Active Member
Licensed User
Longtime User
Hi!

Could someone explain the file format? I have this, from the example:



Although I could copy the format, I'd like to understand why the \ and the \:

Thank you!

I think it's an escape code used for space and some special characters... it's will not work without "\" is placed in.
 

Richard Goh

Active Member
Licensed User
Longtime User
I managed to translate the file to the language I required. Just for a reference to those like me facing the same problem.
Below is the steps I do for my translation. I did it in windows.
1. create or copy the sample file from the sample program and name the file to your language with the language code.
eg. Language_zh.lng (chinese)

2. add in the word or sentense to translate.
eg. Login\ Password=

3. translate the words to the language you required. (I used google translator)
eg. Login\ Password=登录密码

4. translate the language to java unicode by using the link provide by corwin42 (http://itpro.cz/juniconv/) and replace with the unicode.
eg. Login\ Password=\u767B\u5F55\u5BC6\u7801

5. then convert your language file to unix format using dos2unix programs. Can be found at http://dos2unix.sourceforge.net/

6. then add the tranlate function into the program. Please refer to the sample program.
trans.Initialize2(File.DirAssets, "Language", locale.Language)
passwordLabel.Text = trans.GetText("Login Password")
Note:
Remember to use "\" for space between the search words.
It's a case sensitive so the words must be match exactly.
This is what I had discover during this task. Please correct me if I am wrong.

Thank you.
 

Informatix

Expert
Licensed User
Longtime User
There's an issue with the map returned by AHTranslator. The order of keys is random compared to the original file because you use ReadMap (which mixes them for an obscure reason). It's a real problem when you want to display a menu or a list. You cannot use the order returned by your lib and have to sort the map yourself (which is not quick and easy because there's no sort function for maps and, in some cases, you don't want to sort, just to display things in a certain order). I'm currently in a case where I have to keep a pair of lines together, which is impossible, so it would be nice to change the way you convert files into maps. I can write the Java function if you wish.
 
Last edited:

corwin42

Expert
Licensed User
Longtime User
There's an issue with the map returned by AHTranslator. The order of keys is random compared to the original file because you use ReadMap (which mixes them for an obscure reason). It's a real problem when you want to display a menu or a list. You cannot use the order returned by your lib and have to sort the map yourself (which is not quick and easy because there's no sort function for maps and, in some cases, you don't want to sort, just to display things in a certain order). I'm currently in a case where I have to keep a pair of lines together, which is impossible, so it would be nice to change the way you convert files into maps. I can write the Java function if you wish.

I don't really understand why you need the entries in a sorted order. You normally should get the strings with the GetText methods. I never use the translationmaps in my apps directly. They are intended for creating a translation file in development time.

But if you really need them in sorted order just write the Java function and I will add it.
 

Informatix

Expert
Licensed User
Longtime User
I don't really understand why you need the entries in a sorted order. You normally should get the strings with the GetText methods. I never use the translationmaps in my apps directly. They are intended for creating a translation file in development time.

But if you really need them in sorted order just write the Java function and I will add it.
Suppose that you have a variable menu depending on the state of the app or the user profile (e.g. in some cases, you read menu1_fr.lng, in other cases, you read menu2_fr.lng or menu3_fr.lng for a given menu). You want to display the menu in the exact order of the entries. You have to get the map values by index, not by key. In my particular case, the file content can change during the application life so I have no idea of the number of lines and keys that it contains when I want to display the menu.
That being said, I finally solved my problem by writing my own routine in Basic4Android:
B4X:
Private Sub DecoderFichierTexte(Fichier As String, CodeLangue As String, TradMap As Map)
    Fichier = "trad/" & Fichier.ToLowerCase & "_" & CodeLangue.ToLowerCase & ".lng"
    Dim Reader As TextReader
    Reader.Initialize2(File.OpenInput(File.DirAssets, Fichier), "ISO-8859-1")
    TradMap.Initialize
    Dim S As String, PosEgal As Int
    S = Reader.ReadLine
    Do While S <> Null
        PosEgal = S.IndexOf("=")
        If PosEgal = -1 Then Continue
        TradMap.Put(S.SubString2(0, PosEgal), S.SubString(PosEgal + 1))
        S = Reader.ReadLine
    Loop
    Reader.Close
End Sub
Another problem (that I solved in the above code) is the encoding. ReadMap does not seem to support UTF-8.
 
Top