Compare commits

...

2 Commits

Author SHA1 Message Date
crueter
52d4728987 remove old string
Signed-off-by: crueter <swurl@swurl.xyz>
2025-06-09 04:43:52 -04:00
crueter
c1401c7ffc Improved netplay fragment
- Runtime validation rather than toasts
- Refactored some minor details
- Improved language clarity
- add TODOs

Signed-off-by: crueter <swurl@swurl.xyz>
Co-authored-by: Aleksandr Popovich <alekpopo@pm.me>
2025-06-09 03:39:39 -04:00
28 changed files with 326 additions and 171 deletions

View File

@@ -4,6 +4,7 @@
package org.yuzu.yuzu_emu.dialogs
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.Configuration
import android.os.Bundle
@@ -35,6 +36,10 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) {
private lateinit var chatAdapter: ChatAdapter
private val handler = Handler(Looper.getMainLooper())
// TODO(alekpop, crueter): Top drawer for message notifications, perhaps use system notifs?
// TODO(alekpop, crueter): Context menu actions for chat users
// TODO(alekpop, crueter): Block users (depends on the above)
@SuppressLint("NotifyDataSetChanged")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DialogChatBinding.inflate(LayoutInflater.from(context))
@@ -47,7 +52,6 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) {
behavior.state = BottomSheetBehavior.STATE_EXPANDED
behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
handler.post {
chatAdapter.notifyDataSetChanged()
binding.chatRecyclerView.post {
@@ -76,6 +80,7 @@ class ChatDialog(context: Context) : BottomSheetDialog(context) {
super.dismiss()
}
@SuppressLint("NotifyDataSetChanged")
private fun sendMessage(message: String) {
val username = NetPlayManager.getUsername(context)
NetPlayManager.netPlaySendMessage(message)

View File

@@ -5,15 +5,18 @@ package org.yuzu.yuzu_emu.dialogs
import android.annotation.SuppressLint
import android.content.Context
import org.yuzu.yuzu_emu.R
import android.content.res.Configuration
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.EditText
import android.widget.PopupMenu
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
@@ -21,6 +24,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.databinding.DialogMultiplayerConnectBinding
import org.yuzu.yuzu_emu.databinding.DialogMultiplayerLobbyBinding
@@ -28,9 +32,10 @@ import org.yuzu.yuzu_emu.databinding.DialogMultiplayerRoomBinding
import org.yuzu.yuzu_emu.databinding.ItemBanListBinding
import org.yuzu.yuzu_emu.databinding.ItemButtonNetplayBinding
import org.yuzu.yuzu_emu.databinding.ItemTextNetplayBinding
import org.yuzu.yuzu_emu.utils.CompatUtils
import org.yuzu.yuzu_emu.network.NetPlayManager
import org.yuzu.yuzu_emu.utils.CompatUtils
import org.yuzu.yuzu_emu.utils.GameHelper
import java.net.InetAddress
class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
private lateinit var adapter: NetPlayAdapter
@@ -43,7 +48,8 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
behavior.state = BottomSheetBehavior.STATE_EXPANDED
behavior.state = BottomSheetBehavior.STATE_EXPANDED
behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
behavior.skipCollapsed =
context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
when {
NetPlayManager.netPlayIsJoined() -> DialogMultiplayerLobbyBinding.inflate(layoutInflater)
@@ -63,12 +69,14 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
refreshAdapterItems()
btnModeration.visibility = if (NetPlayManager.netPlayIsModerator()) View.VISIBLE else View.GONE
btnModeration.visibility =
if (NetPlayManager.netPlayIsModerator()) View.VISIBLE else View.GONE
btnModeration.setOnClickListener {
showModerationDialog()
}
}
else -> {
DialogMultiplayerConnectBinding.inflate(layoutInflater).apply {
setContentView(root)
@@ -117,17 +125,21 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
}
}
// TODO(alekpop, crueter): Disable context menu for self and if not moderator
inner class NetPlayAdapter : RecyclerView.Adapter<NetPlayAdapter.NetPlayViewHolder>() {
val netPlayItems = mutableListOf<NetPlayItems>()
abstract inner class NetPlayViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
abstract inner class NetPlayViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener {
init {
itemView.setOnClickListener(this)
}
abstract fun bind(item: NetPlayItems)
}
inner class TextViewHolder(private val binding: ItemTextNetplayBinding) : NetPlayViewHolder(binding.root) {
inner class TextViewHolder(private val binding: ItemTextNetplayBinding) :
NetPlayViewHolder(binding.root) {
private lateinit var netPlayItem: NetPlayItems
override fun onClick(clicked: View) {}
@@ -149,7 +161,8 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
}
}
inner class ButtonViewHolder(private val binding: ItemButtonNetplayBinding) : NetPlayViewHolder(binding.root) {
inner class ButtonViewHolder(private val binding: ItemButtonNetplayBinding) :
NetPlayViewHolder(binding.root) {
private lateinit var netPlayItems: NetPlayItems
private val isModerator = NetPlayManager.netPlayIsModerator()
@@ -193,11 +206,35 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
val infos = NetPlayManager.netPlayRoomInfo()
if (infos.isNotEmpty()) {
val roomInfo = infos[0].split("|")
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_TEXT, roomInfo[0], NetPlayItems.TYPE_TEXT))
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_COUNT, "${infos.size - 1}/${roomInfo[1]}", NetPlayItems.TYPE_TEXT))
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_SEPARATOR, "", NetPlayItems.TYPE_SEPARATOR))
netPlayItems.add(
NetPlayItems(
NetPlayItems.MULTIPLAYER_ROOM_TEXT,
roomInfo[0],
NetPlayItems.TYPE_TEXT
)
)
netPlayItems.add(
NetPlayItems(
NetPlayItems.MULTIPLAYER_ROOM_COUNT,
"${infos.size - 1}/${roomInfo[1]}",
NetPlayItems.TYPE_TEXT
)
)
netPlayItems.add(
NetPlayItems(
NetPlayItems.MULTIPLAYER_SEPARATOR,
"",
NetPlayItems.TYPE_SEPARATOR
)
)
for (i in 1 until infos.size) {
netPlayItems.add(NetPlayItems(NetPlayItems.MULTIPLAYER_ROOM_MEMBER, infos[i], NetPlayItems.TYPE_BUTTON))
netPlayItems.add(
NetPlayItems(
NetPlayItems.MULTIPLAYER_ROOM_MEMBER,
infos[i],
NetPlayItems.TYPE_BUTTON
)
)
}
}
}
@@ -207,12 +244,33 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NetPlayViewHolder {
val inflater = LayoutInflater.from(parent.context)
return when (viewType) {
NetPlayItems.TYPE_TEXT -> TextViewHolder(ItemTextNetplayBinding.inflate(inflater, parent, false))
NetPlayItems.TYPE_BUTTON -> ButtonViewHolder(ItemButtonNetplayBinding.inflate(inflater, parent, false))
NetPlayItems.TYPE_SEPARATOR -> object : NetPlayViewHolder(inflater.inflate(R.layout.item_separator_netplay, parent, false)) {
NetPlayItems.TYPE_TEXT -> TextViewHolder(
ItemTextNetplayBinding.inflate(
inflater,
parent,
false
)
)
NetPlayItems.TYPE_BUTTON -> ButtonViewHolder(
ItemButtonNetplayBinding.inflate(
inflater,
parent,
false
)
)
NetPlayItems.TYPE_SEPARATOR -> object : NetPlayViewHolder(
inflater.inflate(
R.layout.item_separator_netplay,
parent,
false
)
) {
override fun bind(item: NetPlayItems) {}
override fun onClick(clicked: View) {}
}
else -> throw IllegalStateException("Unsupported view type")
}
}
@@ -237,14 +295,54 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
}
}
abstract class TextValidatorWatcher(
private val btnConfirm: Button,
private val view: EditText,
private val errorMessage: String
) : TextWatcher {
companion object {
val validStates: HashMap<EditText, Boolean> = hashMapOf()
}
abstract fun validate(s: String): Boolean
override fun beforeTextChanged(
s: CharSequence?,
start: Int,
count: Int,
after: Int
) {
}
override fun onTextChanged(
s: CharSequence?,
start: Int,
before: Int,
count: Int
) {
}
override fun afterTextChanged(s: Editable?) {
val input = s.toString()
val isValid = validate(input)
view.error = if (isValid) null else errorMessage
validStates.put(view, isValid)
btnConfirm.isEnabled = !validStates.containsValue(false)
}
}
// TODO(alekpop, crueter): Properly handle getting banned (both during and in future connects)
private fun showNetPlayInputDialog(isCreateRoom: Boolean) {
val activity = CompatUtils.findActivity(context)
val dialog = BottomSheetDialog(activity)
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
dialog.behavior.skipCollapsed = context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
val validStates: HashMap<EditText, Boolean> = hashMapOf()
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
dialog.behavior.skipCollapsed =
context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
val binding = DialogMultiplayerRoomBinding.inflate(LayoutInflater.from(activity))
dialog.setContentView(binding.root)
@@ -254,93 +352,177 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
else R.string.multiplayer_join_room
)
binding.ipAddress.setText(
if (isCreateRoom) NetPlayManager.getIpAddressByWifi(activity)
else NetPlayManager.getRoomAddress(activity)
)
// setup listeners etc
val roomNameWatcher = object : TextValidatorWatcher(
binding.btnConfirm, // TODO(alekpop, crueter): Figure out a better way to deal with this?
binding.roomName,
context.getString(
R.string.multiplayer_room_name_error
)
) {
override fun validate(s: String): Boolean {
return s.length in 3..20
}
}
val preferredWatcher = object : TextValidatorWatcher(
binding.btnConfirm,
binding.dropdownPreferredGameName,
context.getString(R.string.multiplayer_required)
) {
override fun validate(s: String): Boolean {
return s.isNotEmpty()
}
override fun afterTextChanged(s: Editable?) {
super.afterTextChanged(s)
// special case: remove dropdown arrow
val input = s.toString()
binding.preferredGameName.isEndIconVisible = validate(input)
}
}
val ipWatcher = object : TextValidatorWatcher(
binding.btnConfirm,
binding.ipAddress,
context.getString(R.string.multiplayer_ip_error)
) {
override fun validate(s: String): Boolean {
return try {
InetAddress.getByName(s)
s.length >= 7
} catch (_: Exception) {
false
}
}
}
val usernameWatcher = object : TextValidatorWatcher(
binding.btnConfirm,
binding.username,
context.getString(R.string.multiplayer_username_error)
) {
override fun validate(s: String): Boolean {
return s.length >= 5
}
}
val portWatcher = object : TextValidatorWatcher(
binding.btnConfirm,
binding.ipPort,
context.getString(R.string.multiplayer_port_error)
) {
override fun validate(s: String): Boolean {
return s.toIntOrNull() in 1..65535
}
}
if (isCreateRoom) {
binding.roomName.addTextChangedListener(roomNameWatcher)
binding.dropdownPreferredGameName.addTextChangedListener(preferredWatcher)
binding.dropdownPreferredGameName.apply {
setAdapter(
ArrayAdapter(
activity,
R.layout.dropdown_item,
gameNameList.map { it[0] }
)
)
}
}
binding.ipAddress.addTextChangedListener(ipWatcher)
binding.ipPort.addTextChangedListener(portWatcher)
binding.username.addTextChangedListener(usernameWatcher)
binding.ipPort.setText(NetPlayManager.getRoomPort(activity))
binding.username.setText(NetPlayManager.getUsername(activity))
binding.dropdownPreferredGameName.apply {
setAdapter(
ArrayAdapter(
activity,
R.layout.dropdown_item,
gameNameList.map { it[0] }
)
)
// manually trigger text listeners
if (isCreateRoom) {
roomNameWatcher.afterTextChanged(binding.roomName.text)
preferredWatcher.afterTextChanged(binding.dropdownPreferredGameName.text)
}
ipWatcher.afterTextChanged(binding.ipAddress.text)
portWatcher.afterTextChanged(binding.ipPort.text)
usernameWatcher.afterTextChanged(binding.username.text)
binding.preferredGameName.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
binding.roomName.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
binding.maxPlayersContainer.visibility = if (isCreateRoom) View.VISIBLE else View.GONE
binding.maxPlayersLabel.text = context.getString(R.string.multiplayer_max_players_value, binding.maxPlayers.value.toInt())
binding.maxPlayersLabel.text = context.getString(
R.string.multiplayer_max_players_value,
binding.maxPlayers.value.toInt()
)
binding.maxPlayers.addOnChangeListener { _, value, _ ->
binding.maxPlayersLabel.text = context.getString(R.string.multiplayer_max_players_value, value.toInt())
binding.maxPlayersLabel.text =
context.getString(R.string.multiplayer_max_players_value, value.toInt())
}
// TODO(alekpop, crueter): Room descriptions
// TODO(alekpop, crueter): Public room creation
// TODO(alekpop, crueter): Preview preferred games
binding.btnConfirm.setOnClickListener {
binding.btnConfirm.isEnabled = false
binding.btnConfirm.text = activity.getString(R.string.disabled_button_text)
binding.btnConfirm.text =
activity.getString(
if (isCreateRoom) R.string.multiplayer_creating
else R.string.multiplayer_joining
)
// We don't need to worry about validation because it's already been done.
val ipAddress = binding.ipAddress.text.toString()
val username = binding.username.text.toString()
val portStr = binding.ipPort.text.toString()
val preferredGameName = binding.dropdownPreferredGameName.text.toString()
val preferredGameId = gameIdList[gameNameList.indexOfFirst { it[0] == preferredGameName }][0]
val password = binding.password.text.toString()
val port = portStr.toIntOrNull() ?: run {
Toast.makeText(activity, R.string.multiplayer_port_invalid, Toast.LENGTH_LONG).show()
binding.btnConfirm.isEnabled = true
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
return@setOnClickListener
}
val port = portStr.toInt()
val roomName = binding.roomName.text.toString()
val maxPlayers = binding.maxPlayers.value.toInt()
if (isCreateRoom && (roomName.length !in 3..20)) {
Toast.makeText(activity, R.string.multiplayer_room_name_invalid, Toast.LENGTH_LONG).show()
binding.btnConfirm.isEnabled = true
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
return@setOnClickListener
}
val preferredGameName = binding.dropdownPreferredGameName.text.toString()
val preferredIdx = gameNameList.indexOfFirst { it[0] == preferredGameName }
val preferredGameId = if (preferredIdx == -1) 0 else gameIdList[preferredIdx][0]
if (isCreateRoom && preferredGameName.isEmpty()) {
Toast.makeText(activity, R.string.multiplayer_preferred_game_name_invalid, Toast.LENGTH_LONG).show();
binding.btnConfirm.isEnabled = false
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
return@setOnClickListener
}
Handler(Looper.getMainLooper()).post {
val result = if (isCreateRoom) {
NetPlayManager.netPlayCreateRoom(
ipAddress,
port,
username,
preferredGameName,
preferredGameId,
password,
roomName,
maxPlayers
)
} else {
NetPlayManager.netPlayJoinRoom(ipAddress, port, username, password)
}
if (ipAddress.length < 7 || username.length < 5) {
Toast.makeText(activity, R.string.multiplayer_input_invalid, Toast.LENGTH_LONG).show()
binding.btnConfirm.isEnabled = true
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
} else {
Handler(Looper.getMainLooper()).post {
val result = if (isCreateRoom) {
NetPlayManager.netPlayCreateRoom(ipAddress, port, username, preferredGameName, preferredGameId, password, roomName, maxPlayers)
} else {
NetPlayManager.netPlayJoinRoom(ipAddress, port, username, password)
}
if (result == 0) {
NetPlayManager.setUsername(activity, username)
NetPlayManager.setRoomPort(activity, portStr)
if (!isCreateRoom) NetPlayManager.setRoomAddress(activity, ipAddress)
Toast.makeText(
YuzuApplication.appContext,
if (isCreateRoom) R.string.multiplayer_create_room_success
else R.string.multiplayer_join_room_success,
Toast.LENGTH_LONG
).show()
dialog.dismiss()
} else {
Toast.makeText(activity, R.string.multiplayer_could_not_connect, Toast.LENGTH_LONG).show()
binding.btnConfirm.isEnabled = true
binding.btnConfirm.text = activity.getString(R.string.original_button_text)
}
if (result == 0) {
// TODO(alekpop, crueter): These need to be moved as settings, editable in a tab
NetPlayManager.setUsername(activity, username)
NetPlayManager.setRoomPort(activity, portStr)
if (!isCreateRoom) NetPlayManager.setRoomAddress(activity, ipAddress)
Toast.makeText(
YuzuApplication.appContext,
if (isCreateRoom) R.string.multiplayer_create_room_success
else R.string.multiplayer_join_room_success,
Toast.LENGTH_LONG
).show()
dialog.dismiss()
} else {
Toast.makeText(
activity,
R.string.multiplayer_could_not_connect,
Toast.LENGTH_LONG
).show()
binding.btnConfirm.isEnabled = true
binding.btnConfirm.text = activity.getString(R.string.ok)
}
}
}
@@ -399,13 +581,15 @@ class NetPlayDialog(context: Context) : BottomSheetDialog(context) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = ItemBanListBinding.inflate(
LayoutInflater.from(parent.context), parent, false)
LayoutInflater.from(parent.context), parent, false
)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val isUsername = position < usernameBans.size
val item = if (isUsername) usernameBans[position] else ipBans[position - usernameBans.size]
val item =
if (isUsername) usernameBans[position] else ipBans[position - usernameBans.size]
holder.binding.apply {
banText.text = item

View File

@@ -8,7 +8,10 @@ import org.yuzu.yuzu_emu.utils.NativeConfig
enum class StringSetting(override val key: String) : AbstractStringSetting {
DRIVER_PATH("driver_path"),
DEVICE_NAME("device_name"),
// TODO(crueter, alekpop): Netplay/settings needs to be properly worked into settings
WEB_TOKEN("yuzu_token"),
WEB_USERNAME("yuzu_username"),
;
override fun getString(needsGlobal: Boolean): String = NativeConfig.getString(key, needsGlobal)

View File

@@ -7,15 +7,13 @@ import android.app.Activity
import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.wifi.WifiManager
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.text.format.Formatter
import android.widget.Toast
import androidx.preference.PreferenceManager
import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.dialogs.ChatMessage
import java.net.Inet4Address
@@ -213,6 +211,7 @@ object NetPlayManager {
Handler(Looper.getMainLooper()).post {
if (!isChatOpen) {
// TODO(alekpop, crueter): Improve this, potentially a drawer at the top?
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}

View File

@@ -71,7 +71,8 @@
android:id="@+id/dropdown_preferred_game_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none" />
android:inputType="none"
/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout

View File

@@ -145,7 +145,6 @@
<string name="multiplayer_join_room_success">تم الانضمام!</string>
<string name="multiplayer_create_room_failed">فشل الإنشاء!</string>
<string name="multiplayer_join_room_failed">فشل الانضمام!</string>
<string name="multiplayer_input_invalid">عنوان أو اسم غير صالح!</string>
<string name="multiplayer_port_invalid">منفذ غير صالح!</string>
<string name="multiplayer_exit_room">مغادرة الغرفة</string>
<string name="multiplayer_network_error">خطأ في الشبكة</string>
@@ -177,8 +176,7 @@
<string name="multiplayer_kick_member">طرد</string>
<string name="multiplayer_chat_input_hint">إرسال رسالة...</string>
<string name="multiplayer_password">كلمة المرور</string>
<string name="original_button_text">انضمام</string>
<string name="disabled_button_text">جاري الانضمام...</string>
<string name="multiplayer_joining">جاري الانضمام...</string>
<string name="multiplayer_room_name">اسم الغرفة</string>
<string name="multiplayer_room_name_invalid">الاسم يجب أن يكون بين 3 و20 حرفاً</string>
<string name="multiplayer_max_players">الحد الأقصى (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">بە سەرکەوتوویی بەشداریکرا!</string>
<string name="multiplayer_create_room_failed">دروستکردنی ژوور شکستی هێنا!</string>
<string name="multiplayer_join_room_failed">بەشداریکردن شکستی هێنا!</string>
<string name="multiplayer_input_invalid">ناونیشانی نادروست یان ناو زۆر کورتە!</string>
<string name="multiplayer_port_invalid">پۆرتی نادروست!</string>
<string name="multiplayer_exit_room">دەرچوون لە ژوور</string>
<string name="multiplayer_network_error">هەڵەی تۆڕ</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">لابردن</string>
<string name="multiplayer_chat_input_hint">ناردنی نامە...</string>
<string name="multiplayer_password">تێپەڕەوشە</string>
<string name="original_button_text">بەشداریکردن</string>
<string name="disabled_button_text">لە پڕۆسەی بەشداریکردن...</string>
<string name="multiplayer_joining">لە پڕۆسەی بەشداریکردن...</string>
<string name="multiplayer_room_name">ناوی ژوور</string>
<string name="multiplayer_room_name_invalid">ناوی ژوور دەبێت لەنێوان ٣ بۆ ٢٠ پیت بێت</string>
<string name="multiplayer_max_players">زۆرترین یاریکەر (١٦)</string>

View File

@@ -140,7 +140,6 @@
<string name="multiplayer_join_room_success">Úspěšné připojení</string>
<string name="multiplayer_create_room_failed">Chyba při vytváření</string>
<string name="multiplayer_join_room_failed">Chyba při připojování</string>
<string name="multiplayer_input_invalid">Neplatná adresa nebo jméno</string>
<string name="multiplayer_port_invalid">Neplatný port</string>
<string name="multiplayer_exit_room">Opustit místnost</string>
<string name="multiplayer_network_error">Chyba sítě</string>
@@ -172,8 +171,7 @@
<string name="multiplayer_kick_member">Vyhodit</string>
<string name="multiplayer_chat_input_hint">Zpráva…</string>
<string name="multiplayer_password">Heslo</string>
<string name="original_button_text">Připojit</string>
<string name="disabled_button_text">Připojování…</string>
<string name="multiplayer_joining">Připojování…</string>
<string name="multiplayer_room_name">Název místnosti</string>
<string name="multiplayer_room_name_invalid">Název musí mít 3-20 znaků</string>
<string name="multiplayer_max_players">Max hráčů (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Beitritt erfolgreich</string>
<string name="multiplayer_create_room_failed">Fehler beim Erstellen</string>
<string name="multiplayer_join_room_failed">Fehler beim Beitreten</string>
<string name="multiplayer_input_invalid">Ungültige Eingabe</string>
<string name="multiplayer_port_invalid">Ungültiger Port</string>
<string name="multiplayer_exit_room">Raum verlassen</string>
<string name="multiplayer_network_error">Netzwerkfehler</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Kicken</string>
<string name="multiplayer_chat_input_hint">Nachricht senden…</string>
<string name="multiplayer_password">Passwort</string>
<string name="original_button_text">Beitreten</string>
<string name="disabled_button_text">Beitritt läuft…</string>
<string name="multiplayer_joining">Beitritt läuft…</string>
<string name="multiplayer_room_name">Raumname</string>
<string name="multiplayer_room_name_invalid">Name: 3-20 Zeichen</string>
<string name="multiplayer_max_players">Max Spieler (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Unido a sala</string>
<string name="multiplayer_create_room_failed">Error al crear sala</string>
<string name="multiplayer_join_room_failed">Error al unirse</string>
<string name="multiplayer_input_invalid">Dirección o nombre inválido</string>
<string name="multiplayer_port_invalid">Puerto inválido</string>
<string name="multiplayer_exit_room">Salir</string>
<string name="multiplayer_network_error">Error de red</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Expulsar</string>
<string name="multiplayer_chat_input_hint">Enviar mensaje...</string>
<string name="multiplayer_password">Contraseña</string>
<string name="original_button_text">Unirse</string>
<string name="disabled_button_text">Uniéndose...</string>
<string name="multiplayer_joining">Uniéndose...</string>
<string name="multiplayer_room_name">Nombre de sala</string>
<string name="multiplayer_room_name_invalid">Nombre inválido (3-20 caracteres)</string>
<string name="multiplayer_max_players">Máx. jugadores (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">با موفقیت به اتاق پیوستید!</string>
<string name="multiplayer_create_room_failed">ایجاد اتاق ناموفق بود!</string>
<string name="multiplayer_join_room_failed">پیوستن به اتاق ناموفق بود!</string>
<string name="multiplayer_input_invalid">آدرس نامعتبر یا نام کوتاه است!</string>
<string name="multiplayer_port_invalid">پورت نامعتبر است!</string>
<string name="multiplayer_exit_room">خروج از اتاق</string>
<string name="multiplayer_network_error">خطای شبکه</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">اخراج</string>
<string name="multiplayer_chat_input_hint">ارسال پیام...</string>
<string name="multiplayer_password">رمز عبور</string>
<string name="original_button_text">پیوستن</string>
<string name="disabled_button_text">در حال پیوستن...</string>
<string name="multiplayer_joining">در حال پیوستن...</string>
<string name="multiplayer_room_name">نام اتاق</string>
<string name="multiplayer_room_name_invalid">نام اتاق باید بین 3 تا 20 کاراکتر باشد</string>
<string name="multiplayer_max_players">حداکثر بازیکنان (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Rejoint</string>
<string name="multiplayer_create_room_failed">Échec création</string>
<string name="multiplayer_join_room_failed">Échec connexion</string>
<string name="multiplayer_input_invalid">IP/nom invalide</string>
<string name="multiplayer_port_invalid">Port invalide</string>
<string name="multiplayer_exit_room">Quitter</string>
<string name="multiplayer_network_error">Erreur réseau</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Expulser</string>
<string name="multiplayer_chat_input_hint">Message...</string>
<string name="multiplayer_password">Mot de passe</string>
<string name="original_button_text">Rejoindre</string>
<string name="disabled_button_text">Connexion...</string>
<string name="multiplayer_joining">Connexion...</string>
<string name="multiplayer_room_name">Nom salon</string>
<string name="multiplayer_room_name_invalid">Nom invalide (3-20 caractères)</string>
<string name="multiplayer_max_players">Joueurs max (16)</string>

View File

@@ -142,7 +142,6 @@
<string name="multiplayer_join_room_success">הצטרפת לחדר בהצלחה!</string>
<string name="multiplayer_create_room_failed">יצירת חדר נכשלה!</string>
<string name="multiplayer_join_room_failed">הצטרפות לחדר נכשלה!</string>
<string name="multiplayer_input_invalid">כתובת לא תקינה או שם קצר מדי!</string>
<string name="multiplayer_port_invalid">פורט לא תקין!</string>
<string name="multiplayer_exit_room">צא מהחדר</string>
<string name="multiplayer_network_error">שגיאת רשת</string>
@@ -174,8 +173,7 @@
<string name="multiplayer_kick_member">הסר משתמש</string>
<string name="multiplayer_chat_input_hint">שלח הודעה...</string>
<string name="multiplayer_password">סיסמה</string>
<string name="original_button_text">הצטרף</string>
<string name="disabled_button_text">מצטרף...</string>
<string name="multiplayer_joining">מצטרף...</string>
<string name="multiplayer_room_name">שם חדר</string>
<string name="multiplayer_room_name_invalid">שם חדר חייב להיות בין 3-20 תווים</string>
<string name="multiplayer_max_players">משתמשים מרביים (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Sikeres csatlakozás</string>
<string name="multiplayer_create_room_failed">Szoba létrehozása sikertelen</string>
<string name="multiplayer_join_room_failed">Csatlakozás sikertelen</string>
<string name="multiplayer_input_invalid">Érvénytelen cím vagy név</string>
<string name="multiplayer_port_invalid">Érvénytelen port</string>
<string name="multiplayer_exit_room">Kilépés</string>
<string name="multiplayer_network_error">Hálózati hiba</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Kirúgás</string>
<string name="multiplayer_chat_input_hint">Üzenet küldése…</string>
<string name="multiplayer_password">Jelszó</string>
<string name="original_button_text">Csatlakozás</string>
<string name="disabled_button_text">Csatlakozás…</string>
<string name="multiplayer_joining">Csatlakozás</string>
<string name="multiplayer_room_name">Szoba név</string>
<string name="multiplayer_room_name_invalid">A szoba neve 3-20 karakter hosszú legyen</string>
<string name="multiplayer_max_players">Max játékosok (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Berhasil bergabung dengan ruang!</string>
<string name="multiplayer_create_room_failed">Gagal membuat ruang!</string>
<string name="multiplayer_join_room_failed">Gagal bergabung dengan ruang!</string>
<string name="multiplayer_input_invalid">Alamat tidak valid atau nama terlalu pendek!</string>
<string name="multiplayer_port_invalid">Port tidak valid!</string>
<string name="multiplayer_exit_room">Keluar Ruang</string>
<string name="multiplayer_network_error">Error jaringan</string>
@@ -171,10 +170,9 @@
<string name="multiplayer_member_banned">%1$s dilarang</string>
<string name="multiplayer_address_unbanned">Alamat diizinkan</string>
<string name="multiplayer_kick_member">Kick Anggota</string>
<string name="multiplayer_chat_input_hint">Kirim pesan…</string>
<string name="multiplayer_chat_input_hint">Kirim pesan…</string>
<string name="multiplayer_password">Password</string>
<string name="original_button_text">Gabung</string>
<string name="disabled_button_text">Bergabung...</string>
<string name="multiplayer_joining">Bergabung...</string>
<string name="multiplayer_room_name">Nama Ruang</string>
<string name="multiplayer_room_name_invalid">Nama ruang harus antara 3 dan 20 karakter</string>
<string name="multiplayer_max_players">Maks Pemain (16)</string>
@@ -184,7 +182,7 @@
<string name="multiplayer_ip_copied">Alamat IP disalin ke clipboard</string>
<string name="multiplayer_server_address">Alamat Server</string>
<string name="chat">Chat</string>
<string name="type_message">Ketik pesan…</string>
<string name="type_message">Ketik pesan…</string>
<string name="send">Kirim</string>
<string name="send_message">Kirim Pesan</string>
<string name="multiplayer_moderation">Moderasi</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Unito alla stanza</string>
<string name="multiplayer_create_room_failed">Errore creazione stanza</string>
<string name="multiplayer_join_room_failed">Errore unione</string>
<string name="multiplayer_input_invalid">Indirizzo o nome non valido</string>
<string name="multiplayer_port_invalid">Porta non valida</string>
<string name="multiplayer_exit_room">Esci</string>
<string name="multiplayer_network_error">Errore rete</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Kick</string>
<string name="multiplayer_chat_input_hint">Messaggio…</string>
<string name="multiplayer_password">Password</string>
<string name="original_button_text">Unisciti</string>
<string name="disabled_button_text">Unione in corso…</string>
<string name="multiplayer_joining">Unione in corso…</string>
<string name="multiplayer_room_name">Nome stanza</string>
<string name="multiplayer_room_name_invalid">Nome tra 3-20 caratteri</string>
<string name="multiplayer_max_players">Max giocatori (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">参加成功</string>
<string name="multiplayer_create_room_failed">ルーム作成失敗</string>
<string name="multiplayer_join_room_failed">参加失敗</string>
<string name="multiplayer_input_invalid">無効な入力</string>
<string name="multiplayer_port_invalid">無効なポート</string>
<string name="multiplayer_exit_room">退出</string>
<string name="multiplayer_network_error">ネットワークエラー</string>
@@ -171,10 +170,9 @@
<string name="multiplayer_member_banned">%1$sをBAN</string>
<string name="multiplayer_address_unbanned">BAN解除</string>
<string name="multiplayer_kick_member">キック</string>
<string name="multiplayer_chat_input_hint">メッセージを送信…</string>
<string name="multiplayer_chat_input_hint">メッセージを送信…</string>
<string name="multiplayer_password">パスワード</string>
<string name="original_button_text">参加</string>
<string name="disabled_button_text">参加中...</string>
<string name="multiplayer_joining">参加中...</string>
<string name="multiplayer_room_name">ルーム名</string>
<string name="multiplayer_room_name_invalid">ルーム名は3-20文字</string>
<string name="multiplayer_max_players">最大人数 (16)</string>
@@ -184,7 +182,7 @@
<string name="multiplayer_ip_copied">IPコピー済み</string>
<string name="multiplayer_server_address">サーバーアドレス</string>
<string name="chat">チャット</string>
<string name="type_message">メッセージ入力…</string>
<string name="type_message">メッセージ入力…</string>
<string name="send">送信</string>
<string name="send_message">メッセージ送信</string>
<string name="multiplayer_moderation">管理</string>

View File

@@ -140,7 +140,6 @@
<string name="multiplayer_join_room_success">참여 성공</string>
<string name="multiplayer_create_room_failed">방 생성 실패</string>
<string name="multiplayer_join_room_failed">참여 실패</string>
<string name="multiplayer_input_invalid">잘못된 주소 또는 이름</string>
<string name="multiplayer_port_invalid">잘못된 포트</string>
<string name="multiplayer_exit_room">방 나가기</string>
<string name="multiplayer_network_error">네트워크 오류</string>
@@ -172,8 +171,7 @@
<string name="multiplayer_kick_member">추방</string>
<string name="multiplayer_chat_input_hint">메시지 입력...</string>
<string name="multiplayer_password">비밀번호</string>
<string name="original_button_text">참여</string>
<string name="disabled_button_text">참여 중...</string>
<string name="multiplayer_joining">참여 중...</string>
<string name="multiplayer_room_name">방 이름</string>
<string name="multiplayer_room_name_invalid">방 이름(3-20자)</string>
<string name="multiplayer_max_players">최대 인원 (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Ble med i rom</string>
<string name="multiplayer_create_room_failed">Kunne ikke opprette rom</string>
<string name="multiplayer_join_room_failed">Kunne ikke bli med</string>
<string name="multiplayer_input_invalid">Ugyldig adresse eller navn</string>
<string name="multiplayer_port_invalid">Ugyldig port</string>
<string name="multiplayer_exit_room">Forlat rom</string>
<string name="multiplayer_network_error">Nettverksfeil</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Spark ut</string>
<string name="multiplayer_chat_input_hint">Send melding...</string>
<string name="multiplayer_password">Passord</string>
<string name="original_button_text">Bli med</string>
<string name="disabled_button_text">Blir med...</string>
<string name="multiplayer_joining">Blir med...</string>
<string name="multiplayer_room_name">Romnavn</string>
<string name="multiplayer_room_name_invalid">Romnavn må være 3-20 tegn</string>
<string name="multiplayer_max_players">Maks spillere (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Dołączono do pokoju!</string>
<string name="multiplayer_create_room_failed">Błąd tworzenia pokoju!</string>
<string name="multiplayer_join_room_failed">Błąd dołączania do pokoju!</string>
<string name="multiplayer_input_invalid">Nieprawidłowy adres lub nazwa!</string>
<string name="multiplayer_port_invalid">Nieprawidłowy port!</string>
<string name="multiplayer_exit_room">Opuść pokój</string>
<string name="multiplayer_network_error">Błąd sieci</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Wyrzuć</string>
<string name="multiplayer_chat_input_hint">Wyślij wiadomość…</string>
<string name="multiplayer_password">Hasło</string>
<string name="original_button_text">Dołącz</string>
<string name="disabled_button_text">Dołączanie…</string>
<string name="multiplayer_joining">Dołączanie…</string>
<string name="multiplayer_room_name">Nazwa pokoju</string>
<string name="multiplayer_room_name_invalid">Nazwa pokoju musi mieć 3-20 znaków</string>
<string name="multiplayer_max_players">Maks. graczy (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Entrou na sala</string>
<string name="multiplayer_create_room_failed">Falha ao criar sala</string>
<string name="multiplayer_join_room_failed">Falha ao entrar</string>
<string name="multiplayer_input_invalid">Endereço ou nome inválido</string>
<string name="multiplayer_port_invalid">Porta inválida</string>
<string name="multiplayer_exit_room">Sair da sala</string>
<string name="multiplayer_network_error">Erro de rede</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Remover</string>
<string name="multiplayer_chat_input_hint">Enviar mensagem...</string>
<string name="multiplayer_password">Senha</string>
<string name="original_button_text">Entrar</string>
<string name="disabled_button_text">Entrando...</string>
<string name="multiplayer_joining">Entrando...</string>
<string name="multiplayer_room_name">Nome da sala</string>
<string name="multiplayer_room_name_invalid">Nome deve ter 3 a 20 caracteres</string>
<string name="multiplayer_max_players">Máx. jogadores (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Entrou na sala.</string>
<string name="multiplayer_create_room_failed">Falha ao criar.</string>
<string name="multiplayer_join_room_failed">Falha ao entrar.</string>
<string name="multiplayer_input_invalid">IP/nome inválido.</string>
<string name="multiplayer_port_invalid">Porta inválida.</string>
<string name="multiplayer_exit_room">Sair</string>
<string name="multiplayer_network_error">Erro de rede.</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Expulsar</string>
<string name="multiplayer_chat_input_hint">Mensagem...</string>
<string name="multiplayer_password">Senha</string>
<string name="original_button_text">Entrar</string>
<string name="disabled_button_text">Entrando...</string>
<string name="multiplayer_joining">Entrando...</string>
<string name="multiplayer_room_name">Nome da Sala</string>
<string name="multiplayer_room_name_invalid">Nome inválido (3-20 caracteres).</string>
<string name="multiplayer_max_players">Máx. Jogadores (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Подключение успешно</string>
<string name="multiplayer_create_room_failed">Ошибка создания</string>
<string name="multiplayer_join_room_failed">Ошибка подключения</string>
<string name="multiplayer_input_invalid">Неверный адрес или имя</string>
<string name="multiplayer_port_invalid">Неверный порт</string>
<string name="multiplayer_exit_room">Выйти</string>
<string name="multiplayer_network_error">Ошибка сети</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Кикнуть</string>
<string name="multiplayer_chat_input_hint">Сообщение...</string>
<string name="multiplayer_password">Пароль</string>
<string name="original_button_text">Подключиться</string>
<string name="disabled_button_text">Подключение...</string>
<string name="multiplayer_joining">Подключение...</string>
<string name="multiplayer_room_name">Название комнаты</string>
<string name="multiplayer_room_name_invalid">Название: 3-20 символов</string>
<string name="multiplayer_max_players">Макс. игроков (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Приєднано до кімнати</string>
<string name="multiplayer_create_room_failed">Помилка створення</string>
<string name="multiplayer_join_room_failed">Помилка приєднання</string>
<string name="multiplayer_input_invalid">Невірні дані</string>
<string name="multiplayer_port_invalid">Невірний порт</string>
<string name="multiplayer_exit_room">Вийти</string>
<string name="multiplayer_network_error">Помилка мережі</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Вигнати</string>
<string name="multiplayer_chat_input_hint">Повідомлення...</string>
<string name="multiplayer_password">Пароль</string>
<string name="original_button_text">Приєднатися</string>
<string name="disabled_button_text">Приєднання...</string>
<string name="multiplayer_joining">Приєднання...</string>
<string name="multiplayer_room_name">Назва кімнати</string>
<string name="multiplayer_room_name_invalid">Невірна назва</string>
<string name="multiplayer_max_players">Макс. гравців (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">Tham gia phòng thành công!</string>
<string name="multiplayer_create_room_failed">Lỗi tạo phòng!</string>
<string name="multiplayer_join_room_failed">Lỗi tham gia phòng!</string>
<string name="multiplayer_input_invalid">Địa chỉ hoặc tên không hợp lệ!</string>
<string name="multiplayer_port_invalid">Cổng không hợp lệ!</string>
<string name="multiplayer_exit_room">Thoát phòng</string>
<string name="multiplayer_network_error">Lỗi mạng</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">Đá thành viên</string>
<string name="multiplayer_chat_input_hint">Nhập tin nhắn...</string>
<string name="multiplayer_password">Mật khẩu</string>
<string name="original_button_text">Tham gia</string>
<string name="disabled_button_text">Đang tham gia...</string>
<string name="multiplayer_joining">Đang tham gia...</string>
<string name="multiplayer_room_name">Tên phòng</string>
<string name="multiplayer_room_name_invalid">Tên phòng từ 3-20 ký tự</string>
<string name="multiplayer_max_players">Tối đa (16)</string>

View File

@@ -141,7 +141,6 @@
<string name="multiplayer_join_room_success">加入成功</string>
<string name="multiplayer_create_room_failed">创建失败</string>
<string name="multiplayer_join_room_failed">加入失败</string>
<string name="multiplayer_input_invalid">地址无效或名称过短</string>
<string name="multiplayer_port_invalid">端口无效</string>
<string name="multiplayer_exit_room">退出房间</string>
<string name="multiplayer_network_error">网络错误</string>
@@ -173,8 +172,7 @@
<string name="multiplayer_kick_member">踢出</string>
<string name="multiplayer_chat_input_hint">发送消息...</string>
<string name="multiplayer_password">密码</string>
<string name="original_button_text">加入</string>
<string name="disabled_button_text">加入中...</string>
<string name="multiplayer_joining">加入中...</string>
<string name="multiplayer_room_name">房间名称</string>
<string name="multiplayer_room_name_invalid">名称需3-20字符</string>
<string name="multiplayer_max_players">最大人数(16)</string>

View File

@@ -146,7 +146,6 @@
<string name="multiplayer_join_room_success">成功加入房間!</string>
<string name="multiplayer_create_room_failed">房間建立失敗!</string>
<string name="multiplayer_join_room_failed">加入房間失敗!</string>
<string name="multiplayer_input_invalid">無效的位址或名稱過短!</string>
<string name="multiplayer_port_invalid">無效的埠號!</string>
<string name="multiplayer_exit_room">離開房間</string>
<string name="multiplayer_network_error">網路錯誤</string>
@@ -176,10 +175,9 @@
<string name="multiplayer_member_banned">%1$s 已封鎖</string>
<string name="multiplayer_address_unbanned">位址已解封</string>
<string name="multiplayer_kick_member">踢出成員</string>
<string name="multiplayer_chat_input_hint">輸入訊息…</string>
<string name="multiplayer_chat_input_hint">輸入訊息…</string>
<string name="multiplayer_password">密碼</string>
<string name="original_button_text">加入</string>
<string name="disabled_button_text">加入中...</string>
<string name="multiplayer_joining">加入中...</string>
<string name="multiplayer_room_name">房間名稱</string>
<string name="multiplayer_room_name_invalid">房間名稱需為3-20字元</string>
<string name="multiplayer_max_players">最大玩家數16</string>
@@ -189,7 +187,7 @@
<string name="multiplayer_ip_copied">IP位址已複製</string>
<string name="multiplayer_server_address">伺服器位址</string>
<string name="chat">聊天</string>
<string name="type_message">輸入訊息…</string>
<string name="type_message">輸入訊息…</string>
<string name="send">傳送</string>
<string name="send_message">傳送訊息</string>
<string name="multiplayer_moderation">管理</string>

View File

@@ -111,17 +111,18 @@
<string name="multiplayer_username">Username</string>
<string name="multiplayer_ip_address">IP Address</string>
<string name="multiplayer_ip_port">Port</string>
<string name="multiplayer_create_room_success">Room created successfully!</string>
<string name="multiplayer_join_room_success">Join the room successfully!</string>
<string name="multiplayer_create_room_failed">Failed to create room!</string>
<string name="multiplayer_join_room_failed">Failed to join room!</string>
<string name="multiplayer_input_invalid">Invalid address or name is too short!</string>
<string name="multiplayer_create_room_success">Room created successfully</string>
<string name="multiplayer_join_room_success">Joined room successfully</string>
<string name="multiplayer_create_room_failed">Failed to create room</string>
<string name="multiplayer_join_room_failed">Failed to join room</string>
<string name="multiplayer_name_invalid">Name is too short</string>
<string name="multiplayer_address_invalid">Invalid address</string>
<string name="multiplayer_port_invalid">Invalid port!</string>
<string name="multiplayer_exit_room">Exit Room</string>
<string name="multiplayer_network_error">Network error</string>
<string name="multiplayer_lost_connection">Lost connection</string>
<string name="multiplayer_name_collision">Name collision</string>
<string name="multiplayer_mac_collision">Mac collision</string>
<string name="multiplayer_mac_collision">MAC Address collision</string>
<string name="multiplayer_console_id_collision">Console ID collision</string>
<string name="multiplayer_wrong_version">Wrong version</string>
<string name="multiplayer_wrong_password">Wrong password</string>
@@ -133,7 +134,7 @@
<string name="multiplayer_already_in_room">Already in room</string>
<string name="multiplayer_create_room_error">Create room error</string>
<string name="multiplayer_host_kicked">Host kicked</string>
<string name="multiplayer_unknown_error">unknown error</string>
<string name="multiplayer_unknown_error">Unknown error</string>
<string name="multiplayer_room_uninitialized">Room uninitialized</string>
<string name="multiplayer_room_idle">Room idle</string>
<string name="multiplayer_room_joining">Room joining</string>
@@ -143,12 +144,12 @@
<string name="multiplayer_member_leave">%1$s left</string>
<string name="multiplayer_member_kicked">%1$s kicked</string>
<string name="multiplayer_member_banned">%1$s banned</string>
<string name="multiplayer_address_unbanned">address unbanned</string>
<string name="multiplayer_address_unbanned">Address unbanned</string>
<string name="multiplayer_kick_member">Kick Out</string>
<string name="multiplayer_chat_input_hint">Send messages…</string>
<string name="multiplayer_chat_input_hint">Send messages…</string>
<string name="multiplayer_password">Password</string>
<string name="original_button_text">Join</string>
<string name="disabled_button_text">Joining...</string>
<string name="multiplayer_joining">Joining…</string>
<string name="multiplayer_creating">Creating…</string>
<string name="multiplayer_room_name">Room Name</string>
<string name="multiplayer_room_name_invalid">Room name must be between 3 and 20 characters</string>
<string name="multiplayer_max_players">Max Players (16)</string>
@@ -158,7 +159,7 @@
<string name="multiplayer_ip_copied">IP Address copied to clipboard</string>
<string name="multiplayer_server_address">Server Address</string>
<string name="chat">Chat</string>
<string name="type_message">Type message…</string>
<string name="type_message">Type message…</string>
<string name="send">Send</string>
<string name="send_message">Send Message</string>
<string name="multiplayer_moderation">Moderation</string>
@@ -184,11 +185,17 @@
<string name="multiplayer_preferred_game_name">Preferred Game</string>
<string name="multiplayer_no_game">No Games Found</string>
<string name="multiplayer_preferred_game_name_invalid">You must choose a Preferred Game to host a room.</string>
<string name="multiplayer_room_name_error">Must be between 3 and 20 characters</string>
<string name="multiplayer_required">Required</string>
<string name="multiplayer_ip_error">Invalid IP format</string>
<string name="multiplayer_username_error">Must be at least 5 characters</string>
<string name="multiplayer_port_error">Must be between 1 and 65535</string>
<string name="cancel">Cancel</string>
<string name="ok">Ok</string>
<string name="refresh">Refresh</string>
<string name="room_list">Room List</string>
<!-- Setup strings -->
<string name="welcome">Welcome!</string>
<string name="welcome_description">Learn how to setup &lt;b>eden&lt;/b> and jump into emulation.</string>