mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-09 05:24:44 +01:00
fix some confusion between language name used as key (unlocalized
value that should have been the iso standard two-letter code) and localized language name, including subclass of ArrayAdapter that keeps a hash from visible/localized language and the corresponding code.
This commit is contained in:
parent
827b24b0ee
commit
34f1d4aeeb
6 changed files with 125 additions and 44 deletions
|
@ -18,6 +18,8 @@ public final class R {
|
||||||
public static final int force_radio_names=0x7f06000b;
|
public static final int force_radio_names=0x7f06000b;
|
||||||
public static final int game_summary_values=0x7f060009;
|
public static final int game_summary_values=0x7f060009;
|
||||||
public static final int language_codes=0x7f060007;
|
public static final int language_codes=0x7f060007;
|
||||||
|
/** These two arrays need to be kept in sync
|
||||||
|
*/
|
||||||
public static final int language_names=0x7f060006;
|
public static final int language_names=0x7f060006;
|
||||||
/** Keep in sync with LocSearcher SHOW_BYS enum
|
/** Keep in sync with LocSearcher SHOW_BYS enum
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -195,27 +195,28 @@
|
||||||
<item>86400</item>
|
<item>86400</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<!-- These two arrays need to be kept in sync -->
|
||||||
<string-array name="language_names">
|
<string-array name="language_names">
|
||||||
<item>@string/lang_unknown</item> <!-- Unknown -->
|
<item>@string/lang_unknown</item> <!-- Unknown -->
|
||||||
<item>@string/lang_name_english</item> <!-- 1 -->
|
<item>English</item> <!-- 1 -->
|
||||||
<item>@string/lang_name_french</item> <!-- 2 -->
|
<item>French</item> <!-- 2 -->
|
||||||
<item>@string/lang_name_german</item> <!-- 3 -->
|
<item>German</item> <!-- 3 -->
|
||||||
<item>@string/lang_name_turkish</item> <!-- 4 -->
|
<item>Turkish</item> <!-- 4 -->
|
||||||
<item>@string/lang_name_arabic</item> <!-- 5 -->
|
<item>Arabic</item> <!-- 5 -->
|
||||||
<item>@string/lang_name_spanish</item> <!-- 6 -->
|
<item>Spanish</item> <!-- 6 -->
|
||||||
<item>@string/lang_name_swedish</item> <!-- 7 -->
|
<item>Swedish</item> <!-- 7 -->
|
||||||
<item>@string/lang_name_polish</item> <!-- 8 -->
|
<item>Polish</item> <!-- 8 -->
|
||||||
<item>@string/lang_name_danish</item> <!-- 9 -->
|
<item>Danish</item> <!-- 9 -->
|
||||||
<item>@string/lang_name_italian</item> <!-- A -->
|
<item>Italian</item> <!-- A -->
|
||||||
<item>@string/lang_name_dutch</item> <!-- B -->
|
<item>Dutch</item> <!-- B -->
|
||||||
<item>@string/lang_name_catalan</item> <!-- C -->
|
<item>Catalan</item> <!-- C -->
|
||||||
<item>@string/lang_name_portuguese</item> <!-- D -->
|
<item>Portuguese</item> <!-- D -->
|
||||||
<item></item> <!-- E -->
|
<item></item> <!-- E -->
|
||||||
<item>@string/lang_name_russian</item>
|
<item>Russian</item>
|
||||||
<item></item> <!-- 10 -->
|
<item></item> <!-- 10 -->
|
||||||
<item>@string/lang_name_czech</item>
|
<item>Czech</item>
|
||||||
<item>@string/lang_name_greek</item>
|
<item>Greek</item>
|
||||||
<item>@string/lang_name_slovak</item>
|
<item>Slovak</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="language_codes">
|
<string-array name="language_codes">
|
||||||
|
|
|
@ -24,12 +24,16 @@ import android.content.Context;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import junit.framework.Assert;
|
import junit.framework.Assert;
|
||||||
|
|
||||||
import org.eehouse.android.xw4.DictUtils.DictAndLoc;
|
import org.eehouse.android.xw4.DictUtils.DictAndLoc;
|
||||||
|
@ -38,16 +42,77 @@ import org.eehouse.android.xw4.jni.JNIUtilsImpl;
|
||||||
import org.eehouse.android.xw4.jni.XwJNI;
|
import org.eehouse.android.xw4.jni.XwJNI;
|
||||||
import org.eehouse.android.xw4.jni.DictInfo;
|
import org.eehouse.android.xw4.jni.DictInfo;
|
||||||
import org.eehouse.android.xw4.jni.CommonPrefs;
|
import org.eehouse.android.xw4.jni.CommonPrefs;
|
||||||
|
import org.eehouse.android.xw4.loc.LocUtils;
|
||||||
|
|
||||||
public class DictLangCache {
|
public class DictLangCache {
|
||||||
private static String[] s_langNames;
|
private static String[] s_langNames;
|
||||||
private static HashMap<String, Integer> s_langCodes;
|
private static HashMap<String, Integer> s_langCodes;
|
||||||
|
|
||||||
private static int s_adaptedLang = -1;
|
private static int s_adaptedLang = -1;
|
||||||
private static ArrayAdapter<String> s_langsAdapter;
|
private static LangsArrayAdapter s_langsAdapter;
|
||||||
private static ArrayAdapter<String> s_dictsAdapter;
|
private static ArrayAdapter<String> s_dictsAdapter;
|
||||||
private static String s_last;
|
private static String s_last;
|
||||||
private static Handler s_handler;
|
private static Handler s_handler;
|
||||||
|
|
||||||
|
|
||||||
|
public static class LangsArrayAdapter extends ArrayAdapter<String> {
|
||||||
|
private Context m_context;
|
||||||
|
private Map<String, String> m_map;
|
||||||
|
|
||||||
|
public LangsArrayAdapter( Context context, int itemLayout ) {
|
||||||
|
super( context, itemLayout );
|
||||||
|
m_context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rebuild()
|
||||||
|
{
|
||||||
|
m_map = new HashMap<String, String>();
|
||||||
|
DictAndLoc[] dals = DictUtils.dictList( m_context );
|
||||||
|
for ( DictAndLoc dal : dals ) {
|
||||||
|
String lang = getLangName( m_context, dal.name );
|
||||||
|
if ( null != lang && 0 != lang.length() ) {
|
||||||
|
if ( ! m_map.containsValue( lang ) ) {
|
||||||
|
String locName = LocUtils.xlateLang( m_context, lang );
|
||||||
|
locName = Utils.capitalize( locName );
|
||||||
|
m_map.put( locName, lang );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now build the array data
|
||||||
|
clear();
|
||||||
|
for ( Iterator<String> iter = m_map.keySet().iterator();
|
||||||
|
iter.hasNext(); ) {
|
||||||
|
String locName = iter.next();
|
||||||
|
add( locName );
|
||||||
|
}
|
||||||
|
if ( null != s_last ) {
|
||||||
|
add( s_last );
|
||||||
|
}
|
||||||
|
sort( KeepLast );
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPosForLang( String lang )
|
||||||
|
{
|
||||||
|
int result = -1;
|
||||||
|
for ( int ii = 0; ii < getCount(); ++ii ) {
|
||||||
|
String code = getLangAtPosition( ii );
|
||||||
|
if ( code.equals( lang ) ) {
|
||||||
|
result = ii;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLangAtPosition( int position )
|
||||||
|
{
|
||||||
|
String locName = getItem( position );
|
||||||
|
String result = m_map.get( locName );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static Comparator<String> KeepLast =
|
private static Comparator<String> KeepLast =
|
||||||
new Comparator<String>() {
|
new Comparator<String>() {
|
||||||
public int compare( String str1, String str2 )
|
public int compare( String str1, String str2 )
|
||||||
|
@ -280,8 +345,7 @@ public class DictLangCache {
|
||||||
s_adaptedLang ) );
|
s_adaptedLang ) );
|
||||||
}
|
}
|
||||||
if ( null != s_langsAdapter ) {
|
if ( null != s_langsAdapter ) {
|
||||||
rebuildAdapter( s_langsAdapter,
|
s_langsAdapter.rebuild();
|
||||||
DictLangCache.listLangs( context ) );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
@ -345,13 +409,13 @@ public class DictLangCache {
|
||||||
s_handler = new Handler();
|
s_handler = new Handler();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArrayAdapter<String> getLangsAdapter( Context context )
|
public static LangsArrayAdapter getLangsAdapter( Context context )
|
||||||
{
|
{
|
||||||
if ( null == s_langsAdapter ) {
|
if ( null == s_langsAdapter ) {
|
||||||
s_langsAdapter =
|
s_langsAdapter =
|
||||||
new ArrayAdapter<String>( context,
|
new LangsArrayAdapter( context,
|
||||||
android.R.layout.simple_spinner_item );
|
android.R.layout.simple_spinner_item );
|
||||||
rebuildAdapter( s_langsAdapter, listLangs( context ) );
|
s_langsAdapter.rebuild();
|
||||||
}
|
}
|
||||||
return s_langsAdapter;
|
return s_langsAdapter;
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,16 +111,14 @@ public class DictsDelegate extends ListDelegateBase
|
||||||
private static class DictInfo implements Comparable {
|
private static class DictInfo implements Comparable {
|
||||||
public String m_name;
|
public String m_name;
|
||||||
public String m_lang;
|
public String m_lang;
|
||||||
public String m_langLoc;
|
|
||||||
public int m_nWords;
|
public int m_nWords;
|
||||||
public long m_nBytes;
|
public long m_nBytes;
|
||||||
public String m_note;
|
public String m_note;
|
||||||
public DictInfo( String name, String lang, String langLoc, int nWords,
|
public DictInfo( String name, String lang, int nWords,
|
||||||
long nBytes, String note )
|
long nBytes, String note )
|
||||||
{
|
{
|
||||||
m_name = name;
|
m_name = name;
|
||||||
m_lang = lang;
|
m_lang = lang;
|
||||||
m_langLoc = langLoc;
|
|
||||||
m_nWords = nWords;
|
m_nWords = nWords;
|
||||||
m_nBytes = nBytes;
|
m_nBytes = nBytes;
|
||||||
m_note = note;
|
m_note = note;
|
||||||
|
@ -189,8 +187,9 @@ public class DictsDelegate extends ListDelegateBase
|
||||||
int langCode = DictLangCache.getLangLangCode( m_context,
|
int langCode = DictLangCache.getLangLangCode( m_context,
|
||||||
langName );
|
langName );
|
||||||
boolean expanded = ! m_closedLangs.contains( langName );
|
boolean expanded = ! m_closedLangs.contains( langName );
|
||||||
|
String locLangName = LocUtils.xlateLang( m_context, langName );
|
||||||
String name = getQuantityString( R.plurals.lang_name_fmt, info.m_numDicts,
|
String name = getQuantityString( R.plurals.lang_name_fmt, info.m_numDicts,
|
||||||
langName, info.m_numDicts );
|
locLangName, info.m_numDicts );
|
||||||
result = ListGroup.make( m_context, convertView,
|
result = ListGroup.make( m_context, convertView,
|
||||||
DictsDelegate.this, groupPos, name,
|
DictsDelegate.this, groupPos, name,
|
||||||
expanded );
|
expanded );
|
||||||
|
@ -1267,15 +1266,14 @@ public class DictsDelegate extends ListDelegateBase
|
||||||
for ( int ii = 0; !isCancelled() && ii < nLangs; ++ii ) {
|
for ( int ii = 0; !isCancelled() && ii < nLangs; ++ii ) {
|
||||||
JSONObject langObj = langs.getJSONObject( ii );
|
JSONObject langObj = langs.getJSONObject( ii );
|
||||||
String langName = langObj.getString( "lang" );
|
String langName = langObj.getString( "lang" );
|
||||||
String locLangName = LocUtils.xlateLang( m_context, langName );
|
|
||||||
|
|
||||||
if ( null != m_filterLang &&
|
if ( null != m_filterLang &&
|
||||||
! m_filterLang.equals( locLangName ) ) {
|
! m_filterLang.equals( langName ) ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! curLangs.contains( locLangName ) ) {
|
if ( ! curLangs.contains( langName ) ) {
|
||||||
closedLangs.add( locLangName );
|
closedLangs.add( langName );
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONArray dicts = langObj.getJSONArray( "dicts" );
|
JSONArray dicts = langObj.getJSONArray( "dicts" );
|
||||||
|
@ -1293,14 +1291,13 @@ public class DictsDelegate extends ListDelegateBase
|
||||||
if ( 0 == note.length() ) {
|
if ( 0 == note.length() ) {
|
||||||
note = null;
|
note = null;
|
||||||
}
|
}
|
||||||
DictInfo info =
|
DictInfo info = new DictInfo( name, langName, nWords,
|
||||||
new DictInfo( name, langName, locLangName,
|
nBytes, note );
|
||||||
nWords, nBytes, note );
|
|
||||||
|
|
||||||
if ( !m_quickFetchMode ) {
|
if ( !m_quickFetchMode ) {
|
||||||
// Check if we have it and it needs an update
|
// Check if we have it and it needs an update
|
||||||
if ( DictLangCache.haveDict( m_activity,
|
if ( DictLangCache.haveDict( m_activity,
|
||||||
locLangName, name )){
|
langName, name )){
|
||||||
boolean matches = true;
|
boolean matches = true;
|
||||||
String curSum = DictLangCache
|
String curSum = DictLangCache
|
||||||
.getDictMD5Sum( m_activity, name );
|
.getDictMD5Sum( m_activity, name );
|
||||||
|
@ -1331,7 +1328,7 @@ public class DictsDelegate extends ListDelegateBase
|
||||||
DictInfo[] asArray = new DictInfo[dictNames.size()];
|
DictInfo[] asArray = new DictInfo[dictNames.size()];
|
||||||
asArray = dictNames.toArray( asArray );
|
asArray = dictNames.toArray( asArray );
|
||||||
Arrays.sort( asArray );
|
Arrays.sort( asArray );
|
||||||
m_remoteInfo.put( locLangName, asArray );
|
m_remoteInfo.put( langName, asArray );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,7 @@ import org.eehouse.android.xw4.jni.*;
|
||||||
import org.eehouse.android.xw4.jni.CurGameInfo.DeviceRole;
|
import org.eehouse.android.xw4.jni.CurGameInfo.DeviceRole;
|
||||||
import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType;
|
import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType;
|
||||||
import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnTypeSet;
|
import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnTypeSet;
|
||||||
|
import org.eehouse.android.xw4.DictLangCache.LangsArrayAdapter;
|
||||||
|
|
||||||
public class GameConfigDelegate extends DelegateBase
|
public class GameConfigDelegate extends DelegateBase
|
||||||
implements View.OnClickListener
|
implements View.OnClickListener
|
||||||
|
@ -527,7 +528,7 @@ public class GameConfigDelegate extends DelegateBase
|
||||||
case REQUEST_LANG:
|
case REQUEST_LANG:
|
||||||
String langName = data.getStringExtra( DictsDelegate.RESULT_LAST_LANG );
|
String langName = data.getStringExtra( DictsDelegate.RESULT_LAST_LANG );
|
||||||
selLangChanged( langName );
|
selLangChanged( langName );
|
||||||
setSpinnerSelection( m_langSpinner, langName );
|
setLangSpinnerSelection( langName );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Assert.fail();
|
Assert.fail();
|
||||||
|
@ -868,6 +869,8 @@ public class GameConfigDelegate extends DelegateBase
|
||||||
if ( null == m_langSpinner ) {
|
if ( null == m_langSpinner ) {
|
||||||
m_langSpinner = (Spinner)findViewById( R.id.lang_spinner );
|
m_langSpinner = (Spinner)findViewById( R.id.lang_spinner );
|
||||||
|
|
||||||
|
final LangsArrayAdapter adapter = DictLangCache.getLangsAdapter( m_activity );
|
||||||
|
|
||||||
OnItemSelectedListener onSel =
|
OnItemSelectedListener onSel =
|
||||||
new OnItemSelectedListener() {
|
new OnItemSelectedListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -879,7 +882,8 @@ public class GameConfigDelegate extends DelegateBase
|
||||||
if ( chosen.equals( m_browseText ) ) {
|
if ( chosen.equals( m_browseText ) ) {
|
||||||
DictsDelegate.downloadForResult( m_activity, REQUEST_LANG );
|
DictsDelegate.downloadForResult( m_activity, REQUEST_LANG );
|
||||||
} else {
|
} else {
|
||||||
selLangChanged( chosen );
|
String langName = adapter.getLangAtPosition( position );
|
||||||
|
selLangChanged( langName );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -887,7 +891,6 @@ public class GameConfigDelegate extends DelegateBase
|
||||||
public void onNothingSelected(AdapterView<?> parentView) {}
|
public void onNothingSelected(AdapterView<?> parentView) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
ArrayAdapter adapter = DictLangCache.getLangsAdapter( m_activity );
|
|
||||||
String lang = DictLangCache.getLangName( m_activity, m_gi.dictLang );
|
String lang = DictLangCache.getLangName( m_activity, m_gi.dictLang );
|
||||||
configSpinnerWDownload( m_langSpinner, adapter, onSel, lang );
|
configSpinnerWDownload( m_langSpinner, adapter, onSel, lang );
|
||||||
}
|
}
|
||||||
|
@ -909,7 +912,20 @@ public class GameConfigDelegate extends DelegateBase
|
||||||
adapter.setDropDownViewResource( resID );
|
adapter.setDropDownViewResource( resID );
|
||||||
spinner.setAdapter( adapter );
|
spinner.setAdapter( adapter );
|
||||||
spinner.setOnItemSelectedListener( onSel );
|
spinner.setOnItemSelectedListener( onSel );
|
||||||
setSpinnerSelection( spinner, curSel );
|
if ( m_langSpinner == spinner ) {
|
||||||
|
setLangSpinnerSelection( curSel );
|
||||||
|
} else {
|
||||||
|
setSpinnerSelection( spinner, curSel );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setLangSpinnerSelection( String sel )
|
||||||
|
{
|
||||||
|
LangsArrayAdapter adapter = (LangsArrayAdapter)m_langSpinner.getAdapter();
|
||||||
|
int pos = adapter.getPosForLang( sel );
|
||||||
|
if ( 0 <= pos ) {
|
||||||
|
m_langSpinner.setSelection( pos, true );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setSpinnerSelection( Spinner spinner, String sel )
|
private void setSpinnerSelection( Spinner spinner, String sel )
|
||||||
|
|
|
@ -1211,6 +1211,7 @@ public class GamesListDelegate extends ListDelegateBase
|
||||||
XWPrefs.setPrefsString( m_activity,
|
XWPrefs.setPrefsString( m_activity,
|
||||||
R.string.key_default_language,
|
R.string.key_default_language,
|
||||||
lang );
|
lang );
|
||||||
|
name = DictUtils.removeDictExtn( name );
|
||||||
int[] ids = { R.string.key_default_dict,
|
int[] ids = { R.string.key_default_dict,
|
||||||
R.string.key_default_robodict };
|
R.string.key_default_robodict };
|
||||||
for ( int id : ids ) {
|
for ( int id : ids ) {
|
||||||
|
|
Loading…
Reference in a new issue