Merge pull request #26 from lucasnlm/add-translators-to-about

Add Translators to About
This commit is contained in:
Lucas Nunes 2020-03-26 10:04:35 -03:00 committed by GitHub
commit 68873da0ed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
43 changed files with 810 additions and 312 deletions

View file

@ -122,7 +122,12 @@
</activity>
<activity
android:name="dev.lucasnlm.antimine.about.thirds.ThirdPartiesActivity"
android:name="dev.lucasnlm.antimine.about.views.thirds.ThirdPartiesFragment"
android:label="@string/licenses"
android:theme="@style/AppTheme" />
<activity
android:name="dev.lucasnlm.antimine.about.views.translators.TranslatorsFragment"
android:theme="@style/AppTheme" />
<activity

View file

@ -14,7 +14,6 @@ import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat
import androidx.core.os.HandlerCompat.postDelayed
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
@ -37,7 +36,6 @@ import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModelFactory
import dev.lucasnlm.antimine.core.analytics.AnalyticsManager
import dev.lucasnlm.antimine.core.analytics.models.Analytics
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.core.utils.isDarkModeEnabled
import dev.lucasnlm.antimine.instant.InstantAppManager
import dev.lucasnlm.antimine.level.view.CustomLevelDialogFragment
import dev.lucasnlm.antimine.level.view.EndGameDialogFragment
@ -216,11 +214,6 @@ class GameActivity : DaggerAppCompatActivity() {
R.string.open_menu,
R.string.close_menu
).apply {
if (!isDarkModeEnabled(applicationContext)) {
drawerArrowDrawable.color =
ContextCompat.getColor(applicationContext, R.color.primary)
}
syncState()
}
)

View file

@ -5,25 +5,59 @@ import android.net.Uri
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.view.MenuItem
import dev.lucasnlm.antimine.BuildConfig
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.about.thirds.ThirdPartiesActivity
import kotlinx.android.synthetic.main.activity_about.*
import dev.lucasnlm.antimine.about.views.AboutInfoFragment
import dev.lucasnlm.antimine.about.models.AboutEvent
import dev.lucasnlm.antimine.about.views.translators.TranslatorsFragment
import dev.lucasnlm.antimine.about.views.thirds.ThirdPartiesFragment
import dev.lucasnlm.antimine.about.viewmodel.AboutViewModel
class AboutActivity : AppCompatActivity() {
private lateinit var aboutViewModel: AboutViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_about)
setContentView(R.layout.activity_empty)
bindToolbar()
version.text = getString(
R.string.version_s,
getString(R.string.app_name), BuildConfig.VERSION_NAME
)
aboutViewModel = ViewModelProviders.of(this).get(AboutViewModel::class.java)
thirdsParties.setOnClickListener { openThirdParties() }
sourceCode.setOnClickListener { openSourceCode() }
aboutViewModel.eventObserver.observe(this, Observer { event ->
when (event) {
AboutEvent.ThirdPartyLicenses -> {
replaceFragment(ThirdPartiesFragment(), ThirdPartiesFragment::class.simpleName)
}
AboutEvent.SourceCode -> {
openSourceCode()
}
AboutEvent.Translators -> {
replaceFragment(TranslatorsFragment(), TranslatorsFragment::class.simpleName)
}
else -> {
replaceFragment(AboutInfoFragment(), null)
}
}
})
replaceFragment(AboutInfoFragment(), null)
}
private fun replaceFragment(fragment: Fragment, stackName: String?) {
supportFragmentManager.beginTransaction().apply {
if (stackName != null) {
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
addToBackStack(stackName)
}
replace(R.id.content, fragment)
}.commitAllowingStateLoss()
}
private fun openSourceCode() {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(SOURCE_CODE)))
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
@ -43,11 +77,7 @@ class AboutActivity : AppCompatActivity() {
}
}
private fun openThirdParties() {
startActivity(Intent(this, ThirdPartiesActivity::class.java))
}
private fun openSourceCode() {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/lucasnlm/antimine-android")))
companion object {
private const val SOURCE_CODE = "https://github.com/lucasnlm/antimine-android"
}
}

View file

@ -2,7 +2,6 @@ package dev.lucasnlm.antimine.about
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.util.Log
import android.view.MenuItem
import android.view.View
import dev.lucasnlm.antimine.R
@ -13,10 +12,6 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.ByteArrayOutputStream
import java.io.IOException
import java.io.InputStream
class TextActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@ -24,8 +19,6 @@ class TextActivity : AppCompatActivity() {
setContentView(R.layout.activity_text)
bindToolbar()
progressBar.isIndeterminate = true
GlobalScope.launch {
withContext(Dispatchers.Main) {
progressBar.visibility = View.VISIBLE
@ -33,45 +26,22 @@ class TextActivity : AppCompatActivity() {
withContext(Dispatchers.IO) {
val rawPath = intent.getIntExtra(Constants.TEXT_PATH, -1)
var result: String? = null
if (rawPath > 0) {
resources.openRawResource(rawPath).use { inputStream ->
val result = resources.openRawResource(rawPath)
.bufferedReader()
.readLines()
.joinToString("\n")
result = readTextFile(inputStream)
withContext(Dispatchers.Main) {
textView.text = result
progressBar.visibility = View.GONE
}
}
withContext(Dispatchers.Main) {
textView.text = result
progressBar.visibility = View.GONE
}
}
}
}
private fun readTextFile(inputStream: InputStream): String {
var result = ""
ByteArrayOutputStream().use { outputStream ->
val buf = ByteArray(4096)
var len: Int
try {
while (true) {
len = inputStream.read(buf)
if (len != -1) {
outputStream.write(buf, 0, len)
} else {
break
}
}
} catch (e: IOException) {
Log.e(TAG, "Fail to read file.", e)
}
result = outputStream.toString()
}
return result
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
var handled = false
@ -90,8 +60,4 @@ class TextActivity : AppCompatActivity() {
setHomeButtonEnabled(true)
}
}
companion object {
private const val TAG = "TextActivity"
}
}

View file

@ -0,0 +1,7 @@
package dev.lucasnlm.antimine.about.models
enum class AboutEvent {
ThirdPartyLicenses,
SourceCode,
Translators
}

View file

@ -1,8 +1,8 @@
package dev.lucasnlm.antimine.about.thirds.data
package dev.lucasnlm.antimine.about.models
import androidx.annotation.RawRes
internal data class ThirdParty(
data class ThirdParty(
val name: String,
@RawRes val license: Int
)

View file

@ -0,0 +1,6 @@
package dev.lucasnlm.antimine.about.models
data class TranslationInfo(
val language: String,
val translators: Sequence<String>
)

View file

@ -1,78 +0,0 @@
package dev.lucasnlm.antimine.about.thirds
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.view.MenuItem
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.about.thirds.data.ThirdParty
import dev.lucasnlm.antimine.about.thirds.view.ThirdPartyAdapter
import kotlinx.android.synthetic.main.activity_third_party.*
class ThirdPartiesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_third_party)
bindToolbar()
licenses.apply {
setHasFixedSize(true)
addItemDecoration(
DividerItemDecoration(context, DividerItemDecoration.VERTICAL)
)
layoutManager = LinearLayoutManager(context)
}
loadLicenses()
}
private fun loadLicenses() {
licenses.adapter = ThirdPartyAdapter(
listOf(
ThirdParty(
"Android SDK License",
R.raw.android_sdk
),
ThirdParty(
"Material Design Icons",
R.raw.apache2
),
ThirdParty(
"Dagger",
R.raw.apache2
),
ThirdParty(
"Moshi",
R.raw.apache2
),
ThirdParty(
"Mockito",
R.raw.mockito
),
ThirdParty(
"Sounds",
R.raw.sounds
)
)
)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when (item.itemId) {
android.R.id.home -> {
onBackPressed()
true
}
else -> super.onOptionsItemSelected(item)
}
private fun bindToolbar() {
supportActionBar?.apply {
setTitle(R.string.licenses)
setDisplayHomeAsUpEnabled(true)
setHomeButtonEnabled(true)
}
}
}

View file

@ -1,38 +0,0 @@
package dev.lucasnlm.antimine.about.thirds.view
import android.content.Intent
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.about.Constants
import dev.lucasnlm.antimine.about.TextActivity
import dev.lucasnlm.antimine.about.thirds.data.ThirdParty
internal class ThirdPartyAdapter(
private val thirdParties: List<ThirdParty>
) : RecyclerView.Adapter<ThirdPartyItemHolder>() {
override fun getItemCount(): Int = thirdParties.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThirdPartyItemHolder {
val view = LayoutInflater
.from(parent.context)
.inflate(R.layout.view_third_party, parent, false)
return ThirdPartyItemHolder(view)
}
override fun onBindViewHolder(holder: ThirdPartyItemHolder, position: Int) {
val thirdParty = thirdParties[position]
holder.title.text = thirdParty.name
holder.itemView.setOnClickListener { view ->
val intent = Intent(view.context, TextActivity::class.java).apply {
putExtra(Constants.TEXT_TITLE, thirdParty.name)
putExtra(Constants.TEXT_PATH, thirdParty.license)
}
view.context.startActivity(intent)
}
}
}

View file

@ -0,0 +1,76 @@
package dev.lucasnlm.antimine.about.viewmodel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.about.models.AboutEvent
import dev.lucasnlm.antimine.about.models.ThirdParty
import dev.lucasnlm.antimine.about.models.TranslationInfo
import dev.lucasnlm.antimine.about.views.thirds.ThirdPartyAdapter
import dev.lucasnlm.antimine.about.views.translators.TranslatorsAdapter
class AboutViewModel : ViewModel() {
val eventObserver = MutableLiveData<AboutEvent>()
fun getTranslators() = TranslatorsAdapter(
listOf(
TranslationInfo(
"Czech",
sequenceOf("novas78@xda")
),
TranslationInfo(
"French",
sequenceOf("Just Humeau")
),
TranslationInfo(
"German",
sequenceOf("Oswald Boelcke", "wlls_ftn")
),
TranslationInfo(
"Portuguese (BR)",
sequenceOf("Lucas Lima")
),
TranslationInfo(
"Spanish",
sequenceOf("Alfredo Jara")
),
TranslationInfo(
"Turkish",
sequenceOf("Fatih Fırıncı")
),
TranslationInfo(
"Vietnamese",
sequenceOf("pnhpnh")
)
)
)
fun getLicenses() = ThirdPartyAdapter(
listOf(
ThirdParty(
"Android SDK License",
R.raw.android_sdk
),
ThirdParty(
"Material Design Icons",
R.raw.apache2
),
ThirdParty(
"Dagger",
R.raw.apache2
),
ThirdParty(
"Moshi",
R.raw.apache2
),
ThirdParty(
"Mockito",
R.raw.mockito
),
ThirdParty(
"Sounds",
R.raw.sounds
)
)
)
}

View file

@ -0,0 +1,49 @@
package dev.lucasnlm.antimine.about.views
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import dev.lucasnlm.antimine.BuildConfig
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.about.models.AboutEvent
import dev.lucasnlm.antimine.about.viewmodel.AboutViewModel
import kotlinx.android.synthetic.main.fragment_about_info.*
class AboutInfoFragment : Fragment() {
private var aboutViewModel: AboutViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activity?.run {
aboutViewModel = ViewModelProviders.of(this).get(AboutViewModel::class.java)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? =
inflater.inflate(R.layout.fragment_about_info, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
version.text = getString(R.string.version_s, BuildConfig.VERSION_NAME)
thirdsParties.setOnClickListener {
aboutViewModel?.eventObserver?.postValue(AboutEvent.ThirdPartyLicenses)
}
sourceCode.setOnClickListener {
aboutViewModel?.eventObserver?.postValue(AboutEvent.SourceCode)
}
translation.setOnClickListener {
aboutViewModel?.eventObserver?.postValue(AboutEvent.Translators)
}
}
}

View file

@ -0,0 +1,46 @@
package dev.lucasnlm.antimine.about.views.thirds
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.about.viewmodel.AboutViewModel
import kotlinx.android.synthetic.main.fragment_third_party.*
class ThirdPartiesFragment : Fragment() {
private var aboutViewModel: AboutViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activity?.run {
aboutViewModel = ViewModelProviders.of(this).get(AboutViewModel::class.java)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? =
inflater.inflate(R.layout.fragment_third_party, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
licenses.apply {
setHasFixedSize(true)
addItemDecoration(
DividerItemDecoration(context, DividerItemDecoration.VERTICAL)
)
layoutManager = LinearLayoutManager(context)
}
licenses.adapter = aboutViewModel?.getLicenses()
}
}

View file

@ -0,0 +1,40 @@
package dev.lucasnlm.antimine.about.views.thirds
import android.content.Intent
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.about.Constants
import dev.lucasnlm.antimine.about.TextActivity
import dev.lucasnlm.antimine.about.models.ThirdParty
class ThirdPartyAdapter(
private val thirdParties: List<ThirdParty>
) : RecyclerView.Adapter<ThirdPartyViewHolder>() {
override fun getItemCount(): Int = thirdParties.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThirdPartyViewHolder {
val view = LayoutInflater
.from(parent.context)
.inflate(R.layout.view_third_party, parent, false)
return ThirdPartyViewHolder(view)
}
override fun onBindViewHolder(holder: ThirdPartyViewHolder, position: Int) {
val thirdParty = thirdParties[position]
holder.apply {
title.text = thirdParty.name
itemView.setOnClickListener { view ->
val intent = Intent(view.context, TextActivity::class.java).apply {
putExtra(Constants.TEXT_TITLE, thirdParty.name)
putExtra(Constants.TEXT_PATH, thirdParty.license)
}
view.context.startActivity(intent)
}
}
}
}

View file

@ -1,4 +1,4 @@
package dev.lucasnlm.antimine.about.thirds.view
package dev.lucasnlm.antimine.about.views.thirds
import androidx.recyclerview.widget.RecyclerView
import android.view.View
@ -6,6 +6,6 @@ import android.widget.TextView
import dev.lucasnlm.antimine.R
internal class ThirdPartyItemHolder(view: View) : RecyclerView.ViewHolder(view) {
class ThirdPartyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val title: TextView = view.findViewById(R.id.third_name)
}

View file

@ -0,0 +1,28 @@
package dev.lucasnlm.antimine.about.views.translators
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.about.models.TranslationInfo
class TranslatorsAdapter(
private val translators: List<TranslationInfo>
) : RecyclerView.Adapter<TranslatorsViewHolder>() {
override fun getItemCount(): Int = translators.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TranslatorsViewHolder {
val view = LayoutInflater
.from(parent.context)
.inflate(R.layout.view_translator, parent, false)
return TranslatorsViewHolder(view)
}
override fun onBindViewHolder(holder: TranslatorsViewHolder, position: Int) {
with(translators[position]) {
holder.language.text = language
holder.translators.text = translators.joinToString("\n")
}
}
}

View file

@ -0,0 +1,44 @@
package dev.lucasnlm.antimine.about.views.translators
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.about.viewmodel.AboutViewModel
import kotlinx.android.synthetic.main.fragment_translators.*
class TranslatorsFragment : Fragment() {
private var aboutViewModel: AboutViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activity?.run {
aboutViewModel = ViewModelProviders.of(this).get(AboutViewModel::class.java)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? =
inflater.inflate(R.layout.fragment_translators, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
translators.apply {
addItemDecoration(
DividerItemDecoration(view.context, DividerItemDecoration.VERTICAL)
)
layoutManager = LinearLayoutManager(view.context)
}
translators.adapter = aboutViewModel?.getTranslators()
}
}

View file

@ -0,0 +1,11 @@
package dev.lucasnlm.antimine.about.views.translators
import android.view.View
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.R
class TranslatorsViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val language: TextView = view.findViewById(R.id.language)
val translators: TextView = view.findViewById(R.id.translators)
}

View file

@ -10,17 +10,17 @@ import dev.lucasnlm.antimine.R
class PreferencesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_empty)
PreferenceManager.setDefaultValues(this, R.xml.preferences, false)
// Load the preferences from an XML resource
supportFragmentManager
.beginTransaction()
.replace(android.R.id.content, PrefsFragment())
.commitAllowingStateLoss()
.beginTransaction()
.replace(R.id.content, PrefsFragment())
.commitAllowingStateLoss()
}
class PrefsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences)

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="dev.lucasnlm.antimine.about.AboutActivity" />

View file

@ -48,18 +48,18 @@
android:drawableStart="@drawable/timer"
android:drawableLeft="@drawable/timer"
android:drawablePadding="8dp"
android:drawableTint="?android:attr/textColorPrimary"
android:gravity="center_vertical"
android:includeFontPadding="false"
android:visibility="gone"
android:minEms="2"
android:drawableTint="?android:attr/textColorPrimary"
android:text="@string/default_time_value"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size"
android:textStyle="bold"
android:text="@string/default_time_value"
tools:visibility="visible"
android:visibility="gone"
tools:targetApi="m"
tools:text="10:00"
tools:targetApi="m" />
tools:visibility="visible" />
<TextView
android:id="@+id/minesCount"
@ -69,17 +69,17 @@
android:drawableStart="@drawable/mine"
android:drawableLeft="@drawable/mine"
android:drawablePadding="8dp"
android:drawableTint="?android:attr/textColorPrimary"
android:gravity="center_vertical"
android:includeFontPadding="false"
android:minEms="3"
android:drawableTint="?android:attr/textColorPrimary"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size"
android:textStyle="bold"
android:visibility="gone"
tools:visibility="visible"
tools:targetApi="m"
tools:text="99"
tools:targetApi="m" />
tools:visibility="visible" />
</LinearLayout>
@ -93,15 +93,15 @@
android:id="@+id/install"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/install"
android:layout_margin="16dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_margin="16dp"
android:contentDescription="@string/install"
android:visibility="gone"
app:backgroundTint="@color/install_button"
app:pressedTranslationZ="6dp"
app:elevation="10dp"
app:pressedTranslationZ="6dp"
app:srcCompat="@drawable/install"
tools:visibility="visible"/>

View file

@ -3,7 +3,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<ScrollView
android:id="@+id/scrollView"
@ -18,9 +19,9 @@
<TextView
android:id="@+id/textView"
android:textColor="?android:attr/textColorPrimary"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"
android:textColor="?android:attr/textColorPrimary" />
</FrameLayout>
</ScrollView>
@ -36,4 +37,5 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -13,28 +13,43 @@
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:contentDescription="@string/app_name"
android:src="@drawable/title"
app:layout_constraintBottom_toTopOf="@+id/version"
app:layout_constraintBottom_toTopOf="@+id/version_layout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/title" />
<TextView
android:id="@+id/version"
android:layout_width="wrap_content"
<LinearLayout
android:id="@+id/version_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="16dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/buttons"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/logo"
tools:text="Anti-mine - Version 1.0" />
app:layout_constraintTop_toBottomOf="@+id/logo">
<TextView
android:id="@+id/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:text="@string/app_name"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
android:textStyle="bold" />
<TextView
android:id="@+id/version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
tools:text="Version 7.1.0" />
</LinearLayout>
<LinearLayout
android:id="@+id/buttons"
@ -44,7 +59,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/version">
app:layout_constraintTop_toBottomOf="@+id/version_layout">
<Button
android:id="@+id/thirdsParties"
@ -55,7 +70,18 @@
<Space
android:layout_width="match_parent"
android:layout_height="8dp"/>
android:layout_height="4dp" />
<Button
android:id="@+id/translation"
style="?android:attr/borderlessButtonStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/translation" />
<Space
android:layout_width="match_parent"
android:layout_height="4dp" />
<Button
android:id="@+id/sourceCode"
@ -63,6 +89,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/source_code" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -6,17 +6,20 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
tools:context="dev.lucasnlm.antimine.about.thirds.ThirdPartiesActivity">
tools:context="dev.lucasnlm.antimine.about.views.thirds.ThirdPartiesFragment">
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:textColor="?android:attr/textColorPrimary"
android:paddingLeft="16dp"
android:paddingTop="24dp"
android:paddingRight="16dp"
android:paddingBottom="24dp"
android:text="@string/used_software_text"
android:id="@+id/summary"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
android:textColor="?android:attr/textColorPrimary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/licenses"
@ -26,6 +29,6 @@
android:overScrollMode="never"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/summary" />
app:layout_constraintTop_toBottomOf="@+id/description" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
tools:context="dev.lucasnlm.antimine.about.views.translators.TranslatorsFragment">
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingTop="24dp"
android:paddingRight="16dp"
android:paddingBottom="24dp"
android:text="@string/translators_text"
android:textColor="?android:attr/textColorPrimary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/translators"
android:layout_width="match_parent"
android:layout_height="0dp"
android:clipToPadding="false"
android:overScrollMode="never"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/description" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -5,15 +5,16 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:foreground="?android:attr/selectableItemBackground">
android:foreground="?android:attr/selectableItemBackground"
tools:targetApi="m">
<TextView
android:id="@+id/third_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:textStyle="bold"
android:textColor="?android:attr/textColorSecondary"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Third Name" />

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:foreground="?android:attr/selectableItemBackground"
android:padding="16dp"
tools:targetApi="m">
<TextView
android:id="@+id/language"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorSecondary"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Language" />
<TextView
android:id="@+id/translators"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Person A\nPerson B" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -2,7 +2,6 @@
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="cs">
<string name="app_name">Antimine</string>
<string name="app_description">Musíte vyčistit obdélníkovou desku obsahující skryté miny, aniž by kterákoliv z nich vybuchla.</string>
<string name="app_name">Anti-Mine</string>
<string name="app_description">Musíte vyčistit obdélníkovou desku obsahující skryté \"miny\", aniž by kterákoliv z nich vybuchla.</string>
<string name="remaining_mines">Zbývající miny</string>
<string name="install">Instalovat</string>
<string name="minefield">Obtížnost</string>
@ -23,6 +23,7 @@
<string name="resume">Pokračovat</string>
<string name="show_licenses">Zobrazit licence</string>
<string name="source_code">Zdrojový kód</string>
<string name="translation">Překlad</string>
<string name="licenses">Licence</string>
<string name="google_play_games">Google Play Games</string>
<string name="leaderboards">Žebříčky</string>
@ -47,6 +48,7 @@
<string name="flag_placed">Vlajka umístěna!</string>
<string name="flag_removed">Vlajka odstraněna!</string>
<string name="used_software_text">Tato hra používá následující software třetích stran:</string>
<string name="translators_text">Tato hra byla přeložena těmito lidmi:</string>
<string name="sign_in_failed">Nelze se přihlásit. Zkontrolujte síťové připojení a akci opakujte.</string>
<string name="unknown_error">Neznámá chyba.</string>
<string name="retry">Opakovat</string>
@ -62,7 +64,7 @@
<string name="share_body_text">Dokončil jsem %1$d/%2$d za %3$d sekund.</string>
<string name="share_body_text_generic">Hraju %1$s</string>
<string name="fail_to_share">Sdílení hra se nezdařilo</string>
<string name="version_s">%1$s - %2$s</string>
<string name="version_s">Verze %1$s</string>
<string name="sound_effects">Zvukové efekty</string>
<string name="quit">Ukončit</string>
<string name="are_you_sure">Jste si jisti?</string>

View file

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="de">
<string name="app_name">Anti-Mine</string>
<string name="app_description">Du musst eine rechteckige Tafel mit versteckten minen räumen, ohne dass eine davon explodiert.</string>
<string name="remaining_mines">Verbleibende Minen</string>
<string name="install">Installieren</string>
<string name="minefield">Schwierigkeitsgrad</string>
<string name="standard">Voreinstellung</string>
<string name="beginner">Anfänger</string>
<string name="intermediate">Mittleres Niveau</string>
<string name="expert">Experte</string>
<string name="open_menu">Menü öffnen</string>
<string name="close_menu">Menü schließen</string>
<string name="settings">Einstellungen</string>
<string name="animations">Animationen</string>
<string name="vibration">Haptische Rückmeldung</string>
<string name="about">Über</string>
<string name="no_network">Keine Internetverbindung.</string>
<string name="events">Statisken</string>
<string name="start_over">Neues Spiel</string>
<string name="retry_sure">Wenn du ein neues Spiel startest,\nwird dein aktueller Verlauf verloren gehen.</string>
<string name="cancel">Abbrechen</string>
<string name="resume">Fortfahren</string>
<string name="show_licenses">Lizenzen anzeigen</string>
<string name="source_code">Quellcode</string>
<string name="translation">Übersetzung</string>
<string name="licenses">Lizenzen</string>
<string name="google_play_games">Google Play Games</string>
<string name="leaderboards">Ranglisten</string>
<string name="connect">Verbinden</string>
<string name="connecting">Verbindung wird hergestellt…</string>
<string name="disconnect">Trennen</string>
<string name="disconnected">Getrennt</string>
<string name="new_game">Neues Spiel</string>
<string name="share">Teilen</string>
<string name="share_menu">Teilen…</string>
<string name="new_game_request">Möchtest du ein neues Spiel beginnen?</string>
<string name="yes">Ja</string>
<string name="general">Allgemein</string>
<string name="all_mines_disabled">Alle Minen wurden wirkungslos gemacht.</string>
<string name="mines_remaining">%d Minen</string>
<string name="game_time">Spielzeit</string>
<string name="covered_field">Abgedecktes Feld</string>
<string name="mine">Mine</string>
<string name="exploded_mine">Explodierte Mine</string>
<string name="game_started">Spiel wurde gestartet</string>
<string name="you_exploded_a_mine">Du hast eine Mine zur Explosion gebracht!</string>
<string name="flag_placed">Markierung platziert!</string>
<string name="flag_removed">Markierung entfernt!</string>
<string name="used_software_text">Dieses Spiel benutzt folgende Software von Drittanbietern:</string>
<string name="translators_text">Dieses Spiel wurde von den folgenden Personen übersetzt:</string>
<string name="sign_in_failed">Login fehlgeschlagen. Überprüfe Deine Netzwerkverbindung und versuche es erneut.</string>
<string name="unknown_error">Unbekannter Fehler.</string>
<string name="retry">Erneut versuchen</string>
<string name="empty">Leer</string>
<string name="quit_confirm">Du verlierst deinen aktuellen Spielfortschritt.\n Du kannst die Partie aber auch vor dem Beenden installieren.</string>
<string name="you_won">Du hast gewonnen!</string>
<string name="you_lost">Du hast verloren!</string>
<string name="game_over_desc_0">Drücken lange auf das Quadrat, um die Flagge zu setzen.</string>
<string name="game_over_desc_1">Viel Glück für dein nächstes Spiel.</string>
<string name="game_over_desc_2">Du hast %1$d/%2$d in %3$d Sekunden gemacht.</string>
<string name="game_over_desc_3">Du hast es fast geschafft!</string>
<string name="game_over_desc_4">Du gast das Minenfeld in %1$d Sekunden vollendet.</string>
<string name="share_body_text">Du hast %1$d/%2$d in %3$d Sekunden gemacht.</string>
<string name="share_body_text_generic">Ich spiele %1$s</string>
<string name="fail_to_share">Teilen des Spieles gescheitert</string>
<string name="version_s">Version %1$s</string>
<string name="sound_effects">Sound-Effekte</string>
<string name="quit">Beenden</string>
<string name="are_you_sure">Bist du sicher?</string>
<string name="custom">Benutzerdefiniert</string>
<string name="start">Start</string>
<string name="width">Breite</string>
<string name="height">Höhe</string>
<string name="mines">Minen</string>
<string name="auto_flag">Spielassistent</string>
<string name="desc_convered_area">Bedeckte Fläche</string>
<string name="desc_marked_area">Markierte Fläche</string>
<string name="desc_question_area">Fragwürdige Fläche</string>
<string name="desc_wrongly_marked_area">Falsch markierter Bereich</string>
<string name="settings_general">Allgemein</string>
<string name="settings_vibration_desc">Vibriert bei einer Explosion oder beim Umschalten der Flagge</string>
<string name="settings_sound_desc">Erzeugt ein Explosionsgeräusch</string>
<string name="settings_auto_flag_desc">Fügt bei aufgelösten Minen automatisch eine Flagge hinzu</string>
<string name="settings_accessibility">Barrierefreiheit</string>
<string name="settings_large_areas">Große Bereiche verwenden</string>
<string name="settings_large_areas_desc">Vergrößert den Touchbereich</string>
<string name="rating">Feedback</string>
<string name="rating_menu">Feedback ❤</string>
<string name="rating_message">Wenn dir dieses Spiel gefällt, gib uns bitte ein Feedback. Es wird uns sehr helfen.</string>
<string name="rating_button">Ja ❤️️️</string>
<string name="rating_button_no">Nein</string>
</resources>

View file

@ -1,95 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="es">
<string name="app_name">Anti-Mine</string>
<string name="app_description">Deshabilitar las minas ocultas del campo de minas.</string>
<string name="remaining_mines">Minas Restantes</string>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="es-rES">
<string name="app_name">Anti-Mina</string>
<string name="app_description">Usted tiene que limpiar un tablero cuadrado que contiene minas escondidas sin detornarlas.</string>
<string name="remaining_mines">Minas restantes</string>
<string name="install">Instalar</string>
<string name="minefield">Dificultad</string>
<string name="standard">Estándar</string>
<string name="beginner">Principiante</string>
<string name="intermediate">Intermediario</string>
<string name="expert">Especialista</string>
<string name="open_menu">Abrir Menú</string>
<string name="close_menu">Cerrar Menú</string>
<string name="settings">Ajustes</string>
<string name="standard">Patrón</string>
<string name="beginner">Novato</string>
<string name="intermediate">Intermedio</string>
<string name="expert">Experto</string>
<string name="open_menu">Abra menú</string>
<string name="close_menu">Cerrar menú</string>
<string name="settings">Configuración</string>
<string name="animations">Animaciones</string>
<string name="vibration">Respuesta táctil</string>
<string name="vibration">Respuesta háptica</string>
<string name="about">Acerca de</string>
<string name="no_network">Sin conexión a Internet.</string>
<string name="events">Estadística</string>
<string name="start_over">Nuevo juego</string>
<string name="retry_sure">Si iniciar un nuevo juego\nse perderá su progreso actual.</string>
<string name="no_network">No hay conexión a Internet.</string>
<string name="events">Estadísticas</string>
<string name="start_over">Nuevo Juego</string>
<string name="retry_sure">Si comienzas una partida nueva,\ntu progreso actual se perderá.</string>
<string name="cancel">Cancelar</string>
<string name="resume">Continuar</string>
<string name="show_licenses">Mostrar Licencias</string>
<string name="show_licenses">Ver Licencias</string>
<string name="source_code">Código Fuente</string>
<string name="translation">Traducción</string>
<string name="licenses">Licencias</string>
<string name="google_play_games">Google Play Games</string>
<string name="leaderboards">Tablas de Clasificación</string>
<string name="leaderboards">Ránking</string>
<string name="connect">Conectar</string>
<string name="connecting">Conectando…</string>
<string name="disconnect">Desconectar</string>
<string name="disconnected">Desconectado</string>
<string name="new_game">Nuevo juego</string>
<string name="new_game">Nuevo Juego</string>
<string name="share">Compartir</string>
<string name="share_menu">Compartir…</string>
<string name="new_game_request">¿Quieres iniciar un nuevo juego?</string>
<string name="new_game_request">¿Deseas empezar una nueva partida?</string>
<string name="yes"></string>
<string name="general">General</string>
<string name="all_mines_disabled">Todas las minas fueron desactivadas.</string>
<string name="mines_remaining">%d minas</string>
<string name="game_time">Tiempo de juego</string>
<string name="covered_field">Campo Cubierto</string>
<string name="covered_field">Campo cubierto</string>
<string name="mine">Mina</string>
<string name="exploded_mine">Mina despiezada</string>
<string name="game_started">El juego comienza ahora</string>
<string name="you_exploded_a_mine">¡Usted ha estallado una mina!</string>
<string name="flag_placed">Bandera colocada!</string>
<string name="flag_removed">Bandera retirada!</string>
<string name="used_software_text">Este juego utiliza el siguiente software:</string>
<string name="sign_in_failed">No se ha podido iniciar sesión. Por favor, compruebe la conexión de red y vuelve a intentarlo.</string>
<string name="exploded_mine">Mina Explotada</string>
<string name="game_started">Inicio de Juego</string>
<string name="you_exploded_a_mine">¡Has explotado una mina!</string>
<string name="flag_placed">¡Bandera colocada!</string>
<string name="flag_removed">¡Bandera eliminada!</string>
<string name="used_software_text">Este juego utiliza el siguiente software de terceros:</string>
<string name="translators_text">Este juego fue traducido por las siguientes personas:</string>
<string name="sign_in_failed">Imposible conectar. Por favor, revisa tu conexión de datos e inténtalo nuevamente.</string>
<string name="unknown_error">Error desconocido.</string>
<string name="retry">Rever</string>
<string name="retry">Reintentar</string>
<string name="empty">Vacío</string>
<string name="quit_confirm">Perderá todos los movimientos en el juego actual.\nPero también puedes instalar el juego antes de salir.</string>
<string name="quit_confirm">Vas a perder todas los movimientos en la partida acutal.\nPero también puedes instalar el juego antes de salir.</string>
<string name="you_won">¡Ganaste!</string>
<string name="you_lost">¡Perdiste!</string>
<string name="game_over_desc_0">Mantenga presionada un área para marcarla.</string>
<string name="game_over_desc_1">Buena suerte en el próximo juego.</string>
<string name="game_over_desc_0">Mantenga presionado un cuadrado para poner una bandera.</string>
<string name="game_over_desc_1">Buena suerte en tu próxima partida.</string>
<string name="game_over_desc_2">Hiciste %1$d/%2$d en %3$d segundos.</string>
<string name="game_over_desc_3">¡Fue cerca! Sabes como hacerlo.</string>
<string name="game_over_desc_4">Terminaste el campo en %1$d segundos.</string>
<string name="game_over_desc_3">¡Casi lo ha conseguido!</string>
<string name="game_over_desc_4">Has terminado el campo de minas en %1$d segundos.</string>
<string name="share_body_text">Hice %1$d/%2$d en %3$d segundos.</string>
<string name="share_body_text_generic">Estoy jugando %1$s</string>
<string name="fail_to_share">No se pudo compartir el juego</string>
<string name="version_s">%1$s - %2$s</string>
<string name="sound_effects">Efectos de Sonido</string>
<string name="quit">Dejar</string>
<string name="fail_to_share">Falla en compartir el juego</string>
<string name="version_s">Versión %1$s</string>
<string name="sound_effects">Efectos Sonoros</string>
<string name="quit">Salir</string>
<string name="are_you_sure">¿Estás seguro?</string>
<string name="custom">Personalizado</string>
<string name="start">Empezar</string>
<string name="width">Anchura</string>
<string name="height">Altura</string>
<string name="width">Ancho</string>
<string name="height">Alto</string>
<string name="mines">Minas</string>
<string name="auto_flag">Bandera Automática</string>
<string name="auto_flag">Asistente de Juego</string>
<string name="desc_convered_area">Área cubierta</string>
<string name="desc_marked_area">Área marcada</string>
<string name="desc_question_area">Área dudosa</string>
<string name="desc_wrongly_marked_area">Área marcada incorrectamente</string>
<string name="settings_general">General</string>
<string name="settings_vibration_desc">Vibra al explotar o al alternar la marcacion</string>
<string name="settings_vibration_desc">Vibrar al activar la explosión o la bandera</string>
<string name="settings_sound_desc">Hace un sonido de explosión</string>
<string name="settings_auto_flag_desc">Agrega una marca en minas resueltas automáticamente</string>
<string name="settings_auto_flag_desc">Añade una bandera en minas resueltas automáticamente</string>
<string name="settings_accessibility">Accesibilidad</string>
<string name="settings_large_areas">Use áreas grandes</string>
<string name="settings_large_areas_desc">Aumenta el área táctil</string>
<string name="rating">Nos califica</string>
<string name="rating_menu">Nos califica ❤</string>
<string name="rating_message">Si te gusta este juego, danos un comentario. Nos ayudará mucho.</string>
<string name="rating_button">Si ❤️️️</string>
<string name="settings_large_areas">Usar áreas grandes</string>
<string name="settings_large_areas_desc">Aumenta la zona táctil</string>
<string name="rating">Comentarios</string>
<string name="rating_menu">Comentarios ❤</string>
<string name="rating_message">Si te gusta este juego, por favor danos un comentario. Nos ayudará mucho.</string>
<string name="rating_button">Sí ❤️️️</string>
<string name="rating_button_no">No</string>
</resources>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="fr">
<string name="app_name">Anti-Mine</string>
<string name="app_description">Vous devez vider un tableau rectangulaire contenant des mines cachées sans en détonner.</string>
<string name="app_description">Vous devez vider un tableau rectangulaire contenant des \"mines\" cachées sans en détonner.</string>
<string name="remaining_mines">Mines restantes</string>
<string name="install">Installer</string>
<string name="minefield">Difficulté</string>
@ -23,6 +23,7 @@
<string name="resume">Reprendre</string>
<string name="show_licenses">Montrer les licenses</string>
<string name="source_code">Code source</string>
<string name="translation">Traduction</string>
<string name="licenses">Licences</string>
<string name="google_play_games">Google Play Games</string>
<string name="leaderboards">Classements</string>
@ -33,7 +34,7 @@
<string name="new_game">Nouvelle partie</string>
<string name="share">Partager</string>
<string name="share_menu">Partager…</string>
<string name="new_game_request">Voulez-vous commencer une nouvelle partie?</string>
<string name="new_game_request">Voulez-vous commencer une nouvelle partie ?</string>
<string name="yes">Oui</string>
<string name="general">Général</string>
<string name="all_mines_disabled">Toutes les mines ont été désamorcées.</string>
@ -43,10 +44,11 @@
<string name="mine">Mine</string>
<string name="exploded_mine">Mine explosée</string>
<string name="game_started">La partie a commencé</string>
<string name="you_exploded_a_mine">Vous avez touché une mine!</string>
<string name="you_exploded_a_mine">Vous avez touché une mine !</string>
<string name="flag_placed">Drapeau placé !</string>
<string name="flag_removed">Drapeau retiré !</string>
<string name="used_software_text">Ce jeu utilise ces logiciels tiers suivants :</string>
<string name="translators_text">Ce jeu a été traduit par les personnes suivantes :</string>
<string name="sign_in_failed">Erreur lors de la connexion. Vérifiez l\'état de votre connexion Internet et réessayez.</string>
<string name="unknown_error">Erreur inconnue.</string>
<string name="retry">Réessayer</string>
@ -62,10 +64,10 @@
<string name="share_body_text">J\'ai obtenu le score de %1$d/%2$d en %3$d secondes.</string>
<string name="share_body_text_generic">Je joue à %1$s</string>
<string name="fail_to_share">Échec du partage de la partie</string>
<string name="version_s">%1$s à %2$s</string>
<string name="version_s">Version %1$s</string>
<string name="sound_effects">Effets sonores</string>
<string name="quit">Quitter</string>
<string name="are_you_sure">Vraiment?</string>
<string name="are_you_sure">Vraiment ?</string>
<string name="custom">Personnalisé</string>
<string name="start">Commencer</string>
<string name="width">Largeur</string>

View file

@ -22,7 +22,6 @@
<color name="text_color">#FFFFFF</color>
<color name="highlight">#FFFFFF</color>
<color name="stroke_cover">#757575</color>
<color name="view_cover">#171717</color>
<color name="view_clean">#ff424242</color>

View file

@ -23,6 +23,7 @@
<string name="resume">Continuar</string>
<string name="show_licenses">Mostar Licenças</string>
<string name="source_code">Código Fonte</string>
<string name="translation">Tradução</string>
<string name="licenses">Licenças</string>
<string name="google_play_games">Google Play Games</string>
<string name="leaderboards">Placares</string>
@ -47,6 +48,7 @@
<string name="flag_placed">Bandeira posicionada!</string>
<string name="flag_removed">Bandeira removida!</string>
<string name="used_software_text">Esse jogo foi desenvolvido utilizando as seguintes bibliotecas:</string>
<string name="translators_text">Esse jogo foi traduzido pelas seguintes pessoas:</string>
<string name="sign_in_failed">Falha ao conectar. Por favor, verifique sua conexão com a internet e tente novamente.</string>
<string name="unknown_error">Erro desconhecido.</string>
<string name="retry">Reiniciar</string>
@ -62,23 +64,20 @@
<string name="share_body_text">Eu fiz %1$d/%2$d em %3$d segundos.</string>
<string name="share_body_text_generic">Estou jogando %1$s</string>
<string name="fail_to_share">Falha ao compartilhar jogo</string>
<string name="version_s">%1$s - %2$s</string>
<string name="version_s">Versão %1$s</string>
<string name="sound_effects">Efeitos Sonoros</string>
<string name="quit">Sair</string>
<string name="are_you_sure">Você tem certeza?</string>
<string name="custom">Personalizado</string>
<string name="start">Iniciar</string>
<string name="width">Largura</string>
<string name="height">Altura</string>
<string name="mines">Minas</string>
<string name="auto_flag">Bandeiras Automáticas</string>
<string name="desc_convered_area">Área coberta</string>
<string name="desc_marked_area">Área marcada</string>
<string name="desc_question_area">Área duvidosa</string>
<string name="desc_wrongly_marked_area">Área marcada erroneamente</string>
<string name="settings_general">Geral</string>
<string name="settings_vibration_desc">Vibra ao explodir ou alternar marcação</string>
<string name="settings_sound_desc">Faz um som ao explodir</string>
@ -86,7 +85,6 @@
<string name="settings_accessibility">Acessibilidade</string>
<string name="settings_large_areas">Usar Área Grande</string>
<string name="settings_large_areas_desc">Aumenta a área tocável</string>
<string name="rating">Avalie o app</string>
<string name="rating_menu">Avaliar o app ❤</string>
<string name="rating_message">Se você está gostando do jogo, por favor deixe um comentário! Isso nos ajuda muito.</string>

View file

@ -23,6 +23,7 @@
<string name="resume">Devam et</string>
<string name="show_licenses">Lisansları Göster</string>
<string name="source_code">Kaynak Kodu</string>
<string name="translation">Çeviri</string>
<string name="licenses">Lisanslar</string>
<string name="google_play_games">Google Play Oyunlar</string>
<string name="leaderboards">Liderlik Tablosu</string>
@ -47,6 +48,7 @@
<string name="flag_placed">Bayrak yerleştirildi!</string>
<string name="flag_removed">Bayrak kaldırıldı!</string>
<string name="used_software_text">Bu oyun aşağıdaki üçüncü taraf yazılımlarını kullanır:</string>
<string name="translators_text">Bu oyun aşağıdaki kişi tarafından çevrilmiştir: </string>
<string name="sign_in_failed">Oturum açılamadı. Lütfen ağ bağlantınızı kontrol edip tekrar deneyin.</string>
<string name="unknown_error">Bilinmeyen hata.</string>
<string name="retry">Yeniden dene</string>
@ -62,7 +64,7 @@
<string name="share_body_text">%3$d saniyede %1$d/%2$d yaptım.</string>
<string name="share_body_text_generic">%1$s oynuyorum</string>
<string name="fail_to_share">Oyun paylaşılamıyor</string>
<string name="version_s">%1$s - %2$s</string>
<string name="version_s">Versiyon %1$s</string>
<string name="sound_effects">Ses Efektleri</string>
<string name="quit">Çık</string>
<string name="are_you_sure">Emin misiniz?</string>

View file

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.DayNight">
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/accent</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

View file

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="vi">
<string name="app_name">Dò mìn</string>
<string name="app_description">Bạn phải mở tất cả các ô trên một bãi mìn mà không làm nổ cục mìn nào.</string>
<string name="remaining_mines">Số mìn còn lại</string>
<string name="install">Cài đặt</string>
<string name="minefield">Độ khó</string>
<string name="standard">Tiêu chuẩn</string>
<string name="beginner">Dễ</string>
<string name="intermediate">Trung bình</string>
<string name="expert">Khó</string>
<string name="open_menu">Mở menu</string>
<string name="close_menu">Đóng menu</string>
<string name="settings">Cài đặt</string>
<string name="animations">Hiệu ứng động</string>
<string name="vibration">Phản hồi rung</string>
<string name="about">Giới thiệu</string>
<string name="no_network">Không có kết nối mạng.</string>
<string name="events">Thống kê</string>
<string name="start_over">Trò chơi mới</string>
<string name="retry_sure">Nếu chơi trò chơi mới,\ntrò chơi đang chơi dở sẽ bị mất.</string>
<string name="cancel">Huỷ</string>
<string name="resume">Tiếp tục</string>
<string name="show_licenses">Hiển thị giấy phép</string>
<string name="source_code">Mã nguồn</string>
<string name="translation">Dịch thuật</string>
<string name="licenses">Giấy phép</string>
<string name="google_play_games">Google Play Trò chơi</string>
<string name="leaderboards">Bảng xếp hạng</string>
<string name="connect">Kết nối</string>
<string name="connecting">Đang kết nối…</string>
<string name="disconnect">Ngừng kết nối</string>
<string name="disconnected">Đã ngắt kết nối</string>
<string name="new_game">Trò chơi mới</string>
<string name="share">Chia sẻ</string>
<string name="share_menu">Chia sẻ…</string>
<string name="new_game_request">Bạn có chắc muốn bắt đầu trò chơi mới?</string>
<string name="yes"></string>
<string name="general">Tổng quan</string>
<string name="all_mines_disabled">Đã phá hết mìn.</string>
<string name="mines_remaining">%d mìn</string>
<string name="game_time">Thời gian chơi</string>
<string name="covered_field">Số ô đã mở</string>
<string name="mine">Mìn</string>
<string name="exploded_mine">Mìn đã nổ</string>
<string name="game_started">Trò chơi bắt đầu</string>
<string name="you_exploded_a_mine">Bạn làm nổ mìn rồi!</string>
<string name="flag_placed">Đã cắm cờ!</string>
<string name="flag_removed">Đã tháo cờ hiệu!</string>
<string name="used_software_text">Trò chơi này sử dụng các phần mềm bên thứ ba sau:</string>
<string name="translators_text">Trò chơi này đã được dịch bởi những người này:</string>
<string name="sign_in_failed">Không đăng nhập được. Hãy kiểm tra lại kết nối mạng và thử lại.</string>
<string name="unknown_error">Lỗi không xác định.</string>
<string name="retry">Thử lại</string>
<string name="empty">Trống</string>
<string name="quit_confirm">Trò chơi bạn đang chơi sẽ bị mất.\nNhưng bạn có thể cài đặt trò chơi trước khi thoát.</string>
<string name="you_won">Thắng rồi!</string>
<string name="you_lost">Thua rồi!</string>
<string name="game_over_desc_0">Nhấn giữ ô vuông để cắm cờ.</string>
<string name="game_over_desc_1">Chúc bạn may mắn lần sau.</string>
<string name="game_over_desc_2">Bạn dò được %1$d/%2$d mìn trong vòng %3$d giây.</string>
<string name="game_over_desc_3">Suýt chút nữa là thắng rồi!</string>
<string name="game_over_desc_4">Bạn giải xong trò chơi trong vòng %1$d giây.</string>
<string name="share_body_text">Tôi đã dò được %1$d/%2$d mìn trong vòng %3$d giây.</string>
<string name="share_body_text_generic">Tôi đang chơi %1$s</string>
<string name="fail_to_share">Không chia sẻ được trò chơi</string>
<string name="version_s">Phiên bản %1$s</string>
<string name="sound_effects">Hiệu ứng âm thanh</string>
<string name="quit">Thoát</string>
<string name="are_you_sure">Bạn chắc chứ?</string>
<string name="custom">Tuỳ chỉnh</string>
<string name="start">Bắt đầu</string>
<string name="width">Chiều rộng</string>
<string name="height">Chiều cao</string>
<string name="mines">Mìn</string>
<string name="auto_flag">Trợ lí trò chơi</string>
<string name="desc_convered_area">Ô đã mở</string>
<string name="desc_marked_area">Ô đã đánh dấu</string>
<string name="desc_question_area">Ô còn nghi ngờ</string>
<string name="desc_wrongly_marked_area">Ô đánh dấu sai</string>
<string name="settings_general">Tổng quan</string>
<string name="settings_vibration_desc">Rung khi mìn nổ hoặc cắm/dỡ cờ</string>
<string name="settings_sound_desc">Phát âm thanh nổ mìn</string>
<string name="settings_auto_flag_desc">Tự cắm cờ vào những chỗ chắc chắn có mìn</string>
<string name="settings_accessibility">Trợ năng</string>
<string name="settings_large_areas">Vùng chạm lớn</string>
<string name="settings_large_areas_desc">Tăng kích cỡ các vùng chạm</string>
<string name="rating">Phản hồi</string>
<string name="rating_menu">Phản hồi ❤</string>
<string name="rating_message">Nếu bạn thích trò chơi này, hãy gửi phản hồi cho chúng tôi. Nhận xét của bạn sẽ giúp chúng tôi rất nhiều.</string>
<string name="rating_button">Có ❤️️️</string>
<string name="rating_button_no">Không</string>
</resources>

View file

@ -23,6 +23,7 @@
<string name="resume">恢复</string>
<string name="show_licenses">显示许可证</string>
<string name="source_code">源代码</string>
<string name="translation">翻译</string>
<string name="licenses">许可证</string>
<string name="google_play_games">Google Play 游戏</string>
<string name="leaderboards">排行榜</string>
@ -47,6 +48,7 @@
<string name="flag_placed">标记已放置!</string>
<string name="flag_removed">标记已移除!</string>
<string name="used_software_text">该游戏使用以下第三方软件:</string>
<string name="translators_text">这场游戏被以下人员翻译:</string>
<string name="sign_in_failed">登录失败。请检查你的网络连接,然后重试。</string>
<string name="unknown_error">未知错误。</string>
<string name="retry">重试</string>
@ -62,7 +64,7 @@
<string name="share_body_text">我在 %1$d秒内完成了%2$d / %3$d。</string>
<string name="share_body_text_generic">我正在播放 %1$s</string>
<string name="fail_to_share">分享游戏失败</string>
<string name="version_s">%1$s - %2$s</string>
<string name="version_s">版本%1$s</string>
<string name="sound_effects">声音特效</string>
<string name="quit">退出</string>
<string name="are_you_sure">确定吗?</string>

View file

@ -3,8 +3,8 @@
<color name="black">#000000</color>
<color name="white">#FFFFFF</color>
<color name="primary">#212121</color>
<color name="primary_dark">#212121</color>
<color name="primary">#FFFFFF</color>
<color name="primary_dark">#9E9E9E</color>
<color name="mines_around_1">#527F8D</color>
<color name="mines_around_2">#2B8D43</color>
@ -22,7 +22,6 @@
<color name="text_color">#212121</color>
<color name="highlight">#212121</color>
<color name="stroke_cover">#000</color>
<color name="view_cover">#424242</color>
<color name="view_clean">#d5d2cc</color>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
<string name="app_name">Anti-Mine</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="app_name">Antimine</string>
<string name="app_description">You have to clear a rectangular board containing hidden \"mines\" without detonating any of them.</string>
<string name="remaining_mines">Remaining mines</string>
<string name="install">Install</string>
<string name="minefield">Difficulty</string>
@ -23,6 +23,7 @@
<string name="resume">Resume</string>
<string name="show_licenses">Show Licenses</string>
<string name="source_code">Source Code</string>
<string name="translation">Translation</string>
<string name="licenses">Licenses</string>
<string name="google_play_games">Google Play Games</string>
<string name="leaderboards">Leaderboards</string>
@ -47,6 +48,7 @@
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="used_software_text">This game uses the following third parties software:</string>
<string name="translators_text">This game was translated by the following people:</string>
<string name="sign_in_failed">Failed to sign in. Please check your network connection and try again.</string>
<string name="unknown_error">Unknown error.</string>
<string name="retry">Retry</string>
@ -62,23 +64,20 @@
<string name="share_body_text">I did %1$d/%2$d in %3$d seconds.</string>
<string name="share_body_text_generic">I\'m playing %1$s</string>
<string name="fail_to_share">Failed to share game</string>
<string name="version_s">%1$s - %2$s</string>
<string name="version_s">Version %1$s</string>
<string name="sound_effects">Sound Effects</string>
<string name="quit">Quit</string>
<string name="are_you_sure">Are you sure?</string>
<string name="custom">Custom</string>
<string name="start">Start</string>
<string name="width">Width</string>
<string name="height">Height</string>
<string name="mines">Mines</string>
<string name="auto_flag">Game Assistant</string>
<string name="desc_convered_area">Covered area</string>
<string name="desc_marked_area">Marked area</string>
<string name="desc_question_area">Doubtful area</string>
<string name="desc_wrongly_marked_area">Wrongly marked area</string>
<string name="settings_general">General</string>
<string name="settings_vibration_desc">Vibrates on explosion or flag toggle</string>
<string name="settings_sound_desc">Makes a sound of explosion</string>
@ -86,7 +85,6 @@
<string name="settings_accessibility">Accessibility</string>
<string name="settings_large_areas">Use Large Areas</string>
<string name="settings_large_areas_desc">Increases the touch area</string>
<string name="rating">Feedback</string>
<string name="rating_menu">Feedback ❤</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>

View file

@ -14,7 +14,7 @@
<item name="colorAccent">@color/accent</item>
</style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

View file

@ -1,6 +1,6 @@
ext.buildVersion = [
versionCode : 61,
versionName : '6.1.5',
versionCode : 62,
versionName : '6.2.0',
targetSdk : 29,
minAppSdk : 16,
wearMinAppSdk: 23,

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="new_game">Neues Spiel</string>
<string name="victory">Du hast gewonnen!&#xA0;😎</string>
<string name="game_over">Explosion!&#xA0;😢</string>
</resources>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="new_game">Trò chơi mới</string>
<string name="victory">Thắng rồi!&#xA0;😎</string>
<string name="game_over">Nổ rồi!&#xA0;😢</string>
</resources>