Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[Android] Multi-language support (or at least the basic foundation of…
… it).

Added an example translation (Japanese). So now the Android version can both display in English and Japanese, depending on what the Android device's system language is set to.

Also did a tiny clean-up of InputConfigItem.java so that the parameters are slightly more descriptive.

Now, to do a translation in [x] language, all you have to do is take the normal English strings.xml and translate the XML entries into said language, and simply make a folder in the /res/ sub-directory in the form of values-[region code]. IE) With the Japanese translation, it is in the folder /res/values-ja

No configuration other than that is needed. After doing the above, the language should load fine on any device when set to that specific system language.

By default, if a translation file does not exist for a given system language. The app will automatically fall back to using the English translation.

This *should* be bug-free since I did check everything multiple times. But if any issues occur, please report them so that I can fix them.
  • Loading branch information
lioncash committed Aug 13, 2013
1 parent 3b272d8 commit b823983
Show file tree
Hide file tree
Showing 11 changed files with 244 additions and 77 deletions.
16 changes: 8 additions & 8 deletions Source/Android/res/layout/prefs.xml
Expand Up @@ -2,23 +2,23 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
>
<PreferenceCategory
android:summary="Settings"
android:title="CPU Settings"
android:summary="@string/settings"
android:title="@string/cpu_settings"
android:key="cpuprefcat">
<CheckBoxPreference
android:key="dualcorepref"
android:summary="On/Off"
android:title="Dual Core" />
android:summary="@string/on_off"
android:title="@string/dual_core" />
</PreferenceCategory>
<PreferenceCategory
android:summary="Settings"
android:title="Video Settings"
android:summary="@string/settings"
android:title="@string/video_settings"
android:key="videoprefcat">
<ListPreference
android:entries="@array/gpuOptions"
android:entryValues="@array/gpuValues"
android:key="gpupref"
android:summary="Video backend to use"
android:title="Video Backend" />
android:summary="@string/video_backend_to_use"
android:title="@string/video_backend" />
</PreferenceCategory>
</PreferenceScreen>
83 changes: 83 additions & 0 deletions Source/Android/res/values-ja/strings.xml
@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>

<!-- Title of the app -->
<string name="app_name">Dolphin Emulator</string>

<!-- Navigation-related Strings -->
<string name="drawer_open">ナビゲーションウィンドウを開く</string>
<string name="drawer_close">ナビゲーションウィンドウを閉じる</string>

<!-- About Fragment -->
<string name="build_revision">ビルドのバージョン:</string>
<string name="supports_gles3">サポートのOpenGL ES 3:</string>

<!-- Folder Browser -->
<string name="current_dir">現在のディレクトリ: </string>
<string name="parent_directory">親ディレクトリ</string>
<string name="folder">フォルダ</string>
<string name="file_size">ファイルサイズ: </string>
<string name="cant_use_compressed_filetypes">圧縮ファイル形式はサポートされていません</string>

<!-- Game List Activity -->
<string name="game_list">ゲームリスト</string>
<string name="browse_folder">フォルダの参照</string>
<string name="settings">設定</string>
<string name="gamepad_config">ゲームパッド設定</string>
<string name="about">について</string>
<string name="loading_browser">ファイルブラウザのロード</string>
<string name="loading_settings">設定のロード</string>
<string name="loading_gamepad">ゲームパッド設定のロード</string>
<string name="loading_about">メニューについてのロード</string>

<!-- Game List Fragment -->
<string name="file_clicked">クリックされたファイル: </string>

<!-- Input Config Fragment -->
<string name="draw_onscreen_controls">画面上のコントロールを描画</string>
<string name="button_a">Aボタン</string>
<string name="button_b">Bボタン</string>
<string name="button_start">スタートボタン</string>
<string name="button_x">Xボタン</string>
<string name="button_y">Yボタン</string>
<string name="button_z">Zボタン</string>
<string name="dpad_up">D-Pad: ↑</string>
<string name="dpad_down">D-Pad: ↓</string>
<string name="dpad_left">D-Pad: ←</string>
<string name="dpad_right">D-Pad: →</string>
<string name="main_stick_up">コントロールスティック: ↑</string>
<string name="main_stick_down">コントロールスティック: ↓</string>
<string name="main_stick_left">コントロールスティック: ←</string>
<string name="main_stick_right">コントロールスティック: →</string>
<string name="c_stick_up">C-スティック: ↑</string>
<string name="c_stick_down">C-スティック: ↓</string>
<string name="c_stick_left">C-スティック: ←</string>
<string name="c_stick_right">C-スティック: →</string>
<string name="trigger_left">左のトリガー</string>
<string name="trigger_right">右のトリガー</string>

<string name="not_drawing_onscreen_controls">コントロールは画面上に描画されていない</string>
<string name="drawing_onscreen_controls">コントロールは画面上に描画されています</string>
<string name="press_button_to_config">%1$sを設定するにはボタンを押して</string>

<!-- Prefs Fragment -->
<string name="interpreter">Interpreter</string>
<string name="jit64_recompiler">JIT64 Recompiler</string>
<string name="jitil_recompiler">JITIL Recompiler</string>
<string name="jit_arm_recompiler">JIT ARM Recompiler</string>
<string name="cpu_core">CPUコア</string>
<string name="cpu_settings">CPU設定</string>
<string name="emu_core_to_use">使用するエミュレーションコア</string>
<string name="dual_core">デュアルコア</string>
<string name="on_off">有効/無効</string>

<string name="video_settings">ビデオ設定</string>
<string name="software_renderer">Software Renderer</string>
<string name="video_backend">ビデオレンダラ</string>
<string name="video_backend_to_use">使用するビデオレンダラー</string>

<!-- Miscellaneous -->
<string name="yes">はい</string>
<string name="no">いいえ</string>

</resources>
75 changes: 75 additions & 0 deletions Source/Android/res/values/strings.xml
@@ -1,8 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>

<!-- Title of the app -->
<string name="app_name">Dolphin Emulator</string>

<!-- Navigation-related Strings -->
<string name="drawer_open">Open navigation drawer</string>
<string name="drawer_close">Close navigation drawer</string>

<!-- About Fragment -->
<string name="build_revision">Build Revision:</string>
<string name="supports_gles3">Supports OpenGL ES 3:</string>

<!-- Folder Browser -->
<string name="current_dir">Current Dir: </string>
<string name="parent_directory">Parent Directory</string>
<string name="folder">Folder</string>
<string name="file_size">File Size: </string>
<string name="cant_use_compressed_filetypes">Can not use compressed file types</string>

<!-- Game List Activity -->
<string name="game_list">Game List</string>
<string name="browse_folder">Browse Folder</string>
<string name="settings">Settings</string>
<string name="gamepad_config">Gamepad Config</string>
<string name="about">About</string>
<string name="loading_browser">Loading up the browser</string>
<string name="loading_settings">Loading up settings</string>
<string name="loading_gamepad">Loading up gamepad config</string>
<string name="loading_about">Loading about menu</string>

<!-- Game List Fragment -->
<string name="file_clicked">File clicked: </string>

<!-- Input Config Fragment -->
<string name="draw_onscreen_controls">Draw on-screen controls</string>
<string name="button_a">Button A</string>
<string name="button_b">Button B</string>
<string name="button_start">Button Start</string>
<string name="button_x">Button X</string>
<string name="button_y">Button Y</string>
<string name="button_z">Button Z</string>
<string name="dpad_up">D-Pad Up</string>
<string name="dpad_down">D-Pad Down</string>
<string name="dpad_left">D-Pad Left</string>
<string name="dpad_right">D-Pad Right</string>
<string name="main_stick_up">Main Stick Up</string>
<string name="main_stick_down">Main Stick Down</string>
<string name="main_stick_left">Main Stick Left</string>
<string name="main_stick_right">Main Stick Right</string>
<string name="c_stick_up">C Stick Up</string>
<string name="c_stick_down">C Stick Down</string>
<string name="c_stick_left">C Stick Left</string>
<string name="c_stick_right">C Stick Right</string>
<string name="trigger_left">Trigger L</string>
<string name="trigger_right">Trigger R</string>

<string name="not_drawing_onscreen_controls">Not drawing on-screen controls</string>
<string name="drawing_onscreen_controls">Drawing on-screen controls</string>
<string name="press_button_to_config">Press button to configure %1$s</string>

<!-- Prefs Fragment -->
<string name="interpreter">Interpreter</string>
<string name="jit64_recompiler">JIT64 Recompiler</string>
<string name="jitil_recompiler">JITIL Recompiler</string>
<string name="jit_arm_recompiler">JIT ARM Recompiler</string>
<string name="cpu_core">CPU Core</string>
<string name="cpu_settings">CPU Settings</string>
<string name="emu_core_to_use">Emulation core to use</string>
<string name="dual_core">Dual Core</string>
<string name="on_off">On/Off</string>

<string name="video_settings">Video Settings</string>
<string name="software_renderer">Software Renderer</string>
<string name="video_backend">Video Backend</string>
<string name="video_backend_to_use">Video backend to use</string>

<!-- Miscellaneous -->
<string name="yes">Yes</string>
<string name="no">No</string>

</resources>
Expand Up @@ -35,10 +35,13 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.gamelist_listview, container, false);
mMainList = (ListView) rootView.findViewById(R.id.gamelist);

String yes = getString(R.string.yes);
String no = getString(R.string.no);

List<GameListItem> Input = new ArrayList<GameListItem>();
Input.add(new GameListItem(m_activity, "Build Revision", NativeLibrary.GetVersionString(), "", true));
Input.add(new GameListItem(m_activity, "Supports OpenGL ES 3", PrefsFragment.SupportsGLES3() ? "Yes" : "No", "", true));
Input.add(new GameListItem(m_activity, getString(R.string.build_revision), NativeLibrary.GetVersionString(), "", true));
Input.add(new GameListItem(m_activity, getString(R.string.supports_gles3), PrefsFragment.SupportsGLES3() ? yes : no, "", true));

adapter = new FolderBrowserAdapter(m_activity, R.layout.folderbrowser, Input);
mMainList.setAdapter(adapter);
Expand Down
Expand Up @@ -38,7 +38,7 @@ private void CopyAsset(String asset, String output) {
out.close();
out = null;
} catch(IOException e) {
Log.e("tag", "Failed to copy asset file: " + asset, e);
Log.e("DolphinEmulator", "Failed to copy asset file: " + asset, e);
}
}

Expand Down
16 changes: 9 additions & 7 deletions Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowser.java
Expand Up @@ -24,7 +24,7 @@ public class FolderBrowser extends Fragment {
// Populates the FolderView with the given currDir's contents.
private void Fill(File currDir)
{
m_activity.setTitle("Current Dir: " + currDir.getName());
m_activity.setTitle(getString(R.string.current_dir) + currDir.getName());
File[] dirs = currDir.listFiles();
List<GameListItem>dir = new ArrayList<GameListItem>();
List<GameListItem>fls = new ArrayList<GameListItem>();
Expand All @@ -44,17 +44,17 @@ private void Fill(File currDir)
{
if(entry.isDirectory())
{
dir.add(new GameListItem(m_activity, entryName,"Folder",entry.getAbsolutePath(), true));
dir.add(new GameListItem(m_activity, entryName, getString(R.string.folder), entry.getAbsolutePath(), true));
}
else
{
if (validExts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.'))))
{
fls.add(new GameListItem(m_activity, entryName,"File Size: "+entry.length(),entry.getAbsolutePath(), true));
fls.add(new GameListItem(m_activity, entryName,getString(R.string.file_size)+entry.length(),entry.getAbsolutePath(), true));
}
else if (archiveExts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.'))))
{
fls.add(new GameListItem(m_activity, entryName,"File Size: "+entry.length(),entry.getAbsolutePath(), false));
fls.add(new GameListItem(m_activity, entryName,getString(R.string.file_size)+entry.length(),entry.getAbsolutePath(), false));
}
}
}
Expand All @@ -70,7 +70,7 @@ else if (archiveExts.contains(entryName.toLowerCase().substring(entryName.lastIn

// Check for a parent directory to the one we're currently in.
if (!currDir.getPath().equalsIgnoreCase("/"))
dir.add(0, new GameListItem(m_activity, "..", "Parent Directory", currDir.getParent(), true));
dir.add(0, new GameListItem(m_activity, "..", getString(R.string.parent_directory), currDir.getParent(), true));

adapter = new FolderBrowserAdapter(m_activity, R.layout.folderbrowser, dir);
mDrawerList = (ListView) rootView.findViewById(R.id.gamelist);
Expand All @@ -95,16 +95,18 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
GameListItem o = adapter.getItem(position);
if(o.getData().equalsIgnoreCase("folder") || o.getData().equalsIgnoreCase("parent directory"))
if(o.getData().equalsIgnoreCase(getString(R.string.folder)) || o.getData().equalsIgnoreCase(getString(R.string.parent_directory)))
{
currentDir = new File(o.getPath());
Fill(currentDir);
}
else
{
if (o.isValid())
FolderSelected();
else
Toast.makeText(m_activity, "Can not use compressed file types.", Toast.LENGTH_LONG).show();
Toast.makeText(m_activity, getString(R.string.cant_use_compressed_filetypes), Toast.LENGTH_LONG).show();
}
}
};

Expand Down
Expand Up @@ -52,11 +52,11 @@ protected void onCreate(Bundle savedInstanceState) {
mDrawerList = (ListView) findViewById(R.id.left_drawer);

List<SideMenuItem> dir = new ArrayList<SideMenuItem>();
dir.add(new SideMenuItem("Game List", 0));
dir.add(new SideMenuItem("Browse Folder", 1));
dir.add(new SideMenuItem("Settings", 2));
dir.add(new SideMenuItem("Gamepad Config", 3));
dir.add(new SideMenuItem("About", 4));
dir.add(new SideMenuItem(getString(R.string.game_list), 0));
dir.add(new SideMenuItem(getString(R.string.browse_folder), 1));
dir.add(new SideMenuItem(getString(R.string.settings), 2));
dir.add(new SideMenuItem(getString(R.string.gamepad_config), 3));
dir.add(new SideMenuItem(getString(R.string.about), 4));

mDrawerAdapter = new SideMenuAdapter(this, R.layout.sidemenu, dir);
mDrawerList.setAdapter(mDrawerAdapter);
Expand Down Expand Up @@ -179,7 +179,7 @@ public void SwitchPage(int toPage)
break;
case 1:
{
Toast.makeText(mMe, "Loading up the browser", Toast.LENGTH_SHORT).show();
Toast.makeText(mMe, getString(R.string.loading_browser), Toast.LENGTH_SHORT).show();
mCurFragmentNum = 1;
mCurFragment = new FolderBrowser();
FragmentManager fragmentManager = getFragmentManager();
Expand All @@ -188,7 +188,7 @@ public void SwitchPage(int toPage)
break;
case 2:
{
Toast.makeText(mMe, "Loading up settings", Toast.LENGTH_SHORT).show();
Toast.makeText(mMe, getString(R.string.loading_settings), Toast.LENGTH_SHORT).show();
mCurFragmentNum = 2;
mCurFragment = new PrefsFragment();
FragmentManager fragmentManager = getFragmentManager();
Expand All @@ -197,7 +197,7 @@ public void SwitchPage(int toPage)
break;
case 3:
{
Toast.makeText(mMe, "Loading up gamepad config", Toast.LENGTH_SHORT).show();
Toast.makeText(mMe, getString(R.string.loading_gamepad), Toast.LENGTH_SHORT).show();
mCurFragmentNum = 3;
mCurFragment = new InputConfigFragment();
FragmentManager fragmentManager = getFragmentManager();
Expand All @@ -206,7 +206,7 @@ public void SwitchPage(int toPage)
break;
case 4:
{
Toast.makeText(mMe, "Loading up About", Toast.LENGTH_SHORT).show();
Toast.makeText(mMe, getString(R.string.about), Toast.LENGTH_SHORT).show();
mCurFragmentNum = 4;
mCurFragment = new AboutFragment();
FragmentManager fragmentManager = getFragmentManager();
Expand Down
Expand Up @@ -63,7 +63,7 @@ private void Fill()
if(!entry.isDirectory())
{
if (exts.contains(entryName.toLowerCase().substring(entryName.lastIndexOf('.'))))
fls.add(new GameListItem(mMe.getApplicationContext(), entryName,"File Size: "+entry.length(),entry.getAbsolutePath(), true));
fls.add(new GameListItem(mMe.getApplicationContext(), entryName, getString(R.string.file_size)+entry.length(),entry.getAbsolutePath(), true));
}
}
}
Expand Down Expand Up @@ -96,15 +96,15 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
GameListItem o = mGameAdapter.getItem(position);
if(!(o.getData().equalsIgnoreCase("folder")||o.getData().equalsIgnoreCase("parent directory")))
if(!(o.getData().equalsIgnoreCase(getString(R.string.folder))||o.getData().equalsIgnoreCase(getString(R.string.parent_directory))))
{
onFileClick(o.getPath());
}
}
};
private void onFileClick(String o)
{
Toast.makeText(mMe, "File Clicked: " + o, Toast.LENGTH_SHORT).show();
Toast.makeText(mMe, getString(R.string.file_clicked) + o, Toast.LENGTH_SHORT).show();

Intent intent = new Intent();
intent.putExtra("Select", o);
Expand Down

0 comments on commit b823983

Please sign in to comment.