Android String Compare fails with Turkish Locale

Monkey Forums/Monkey Bug Reports/Android String Compare fails with Turkish Locale

therevills(Posted 2016) [#1]
When doing something like this:
If string1.ToUpper() = string2.ToUpper()

Can fail with the Turkish language.

Also the Get in a String Map can fail.

I've created an extern for Android to get around the String compare:
	#If TARGET="android" Then
		Function EqualIgnoreCase:Bool(lhs:String, rhs:String) = "diddy.equalIgnoreCase"
	#Else
		Public
			Function EqualIgnoreCase:Bool(lhs:String, rhs:String)
				If lhs.ToUpper() = rhs.ToUpper()
					Return True
				End
				Return False
			End
	#End


Java:
	static boolean equalIgnoreCase(String lhs, String rhs)
	{
		if (lhs.equalsIgnoreCase(rhs)) {
			return true;
		}
		return false;
	}


But looks like I need to create my own Map class now as I dont want to alter the javatranslator.monkey file...


therevills(Posted 2016) [#2]
We need to change the .ToUpper and .ToLower calls to use the locale. I've created custom methods and replaced all my calls:
MX1:
#If TARGET="android" Then
	Function DiddyToUpper:String(lhs:String) = "diddy.toUpper"
	Function DiddyToLower:String(lhs:String) = "diddy.toLower"
#Else
	Public
		Function DiddyToUpper:String(lhs:String)
			Return lhs.ToUpper()
		End
		Function DiddyToLower:String(lhs:String)
			Return lhs.ToLower()
		End
#End

Android:
static String toUpper(String lhs)
{
	return lhs.toUpperCase(Locale.ENGLISH);
}

static String toLower(String lhs)
{
	return lhs.toLowerCase(Locale.ENGLISH);
}


And I've created my own version of StringMap:
Class DiddyStringMap<V> Extends Map<String,V>
	Method Compare:Int( lhs$,rhs$ )
		Return CompareWithLocale(lhs, rhs)
	End
End


#If TARGET="android" Then
	Function CompareWithLocale:Int(lhs:String, rhs:String) = "diddy.compareWithLocale"
#Else
	Public
		Function CompareWithLocale:Int(lhs:String, rhs:String)
			Return lhs.Compare(rhs)
		End
#End


Android:
	static int compareWithLocale(String lhs, String rhs)
	{
		String newLhs = lhs.toLowerCase(Locale.ENGLISH);
		String newRhs = rhs.toLowerCase(Locale.ENGLISH);
		return (newLhs.compareTo(newRhs));
	}



therevills(Posted 2016) [#3]
Thought about a better, simpler solution and it seems to work fine: Setting the locale for the activity:

 static void setLocale(String language, String country)
    {
        System.out.println("setLocale = " + language + " " + country);
        Activity activity = BBAndroidGame.AndroidGame().GetActivity();
        Context context = activity.getApplicationContext();
        
        Configuration config = context.getResources().getConfiguration();
        Locale locale = new Locale(language, country);
        Locale.setDefault(locale);
        config.locale = locale;
        context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    }


In Diddy's Oncreate and OnResume it now calls:
            SetLocale(localeLanguage, localeCountry)

Field localeLanguage:String = "en"
Field localeCountry:String = "US"