Merge pull request #169 from lucasnlm/add-tutorial

Add tutorial
This commit is contained in:
Lucas Nunes 2020-09-17 09:39:33 -03:00 committed by GitHub
commit 861524fea5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
91 changed files with 2451 additions and 469 deletions

View file

@ -12,8 +12,8 @@ android {
defaultConfig { defaultConfig {
// versionCode and versionName must be hardcoded to support F-droid // versionCode and versionName must be hardcoded to support F-droid
versionCode 800111 versionCode 800101
versionName '8.0.11' versionName '8.1.0'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
multiDexEnabled true multiDexEnabled true
@ -126,7 +126,7 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
// Google // Google
implementation 'com.google.android.material:material:1.2.0' implementation 'com.google.android.material:material:1.2.1'
// Koin // Koin
implementation 'org.koin:koin-android:2.1.6' implementation 'org.koin:koin-android:2.1.6'

View file

@ -2,11 +2,13 @@ package dev.lucasnlm.antimine
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.text.format.DateUtils import android.text.format.DateUtils
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.Toast
import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.TooltipCompat import androidx.appcompat.widget.TooltipCompat
@ -39,13 +41,14 @@ import dev.lucasnlm.antimine.share.ShareManager
import dev.lucasnlm.antimine.stats.StatsActivity import dev.lucasnlm.antimine.stats.StatsActivity
import dev.lucasnlm.antimine.support.SupportAppDialogFragment import dev.lucasnlm.antimine.support.SupportAppDialogFragment
import dev.lucasnlm.antimine.theme.ThemeActivity import dev.lucasnlm.antimine.theme.ThemeActivity
import dev.lucasnlm.antimine.tutorial.view.TutorialCompleteDialogFragment
import dev.lucasnlm.antimine.tutorial.view.TutorialLevelFragment
import dev.lucasnlm.external.IBillingManager import dev.lucasnlm.external.IBillingManager
import dev.lucasnlm.external.IInstantAppManager import dev.lucasnlm.external.IInstantAppManager
import dev.lucasnlm.external.IPlayGamesManager import dev.lucasnlm.external.IPlayGamesManager
import dev.lucasnlm.external.ReviewWrapper import dev.lucasnlm.external.ReviewWrapper
import dev.lucasnlm.external.model.PurchaseInfo import dev.lucasnlm.external.model.PurchaseInfo
import kotlinx.android.synthetic.main.activity_game.* import kotlinx.android.synthetic.main.activity_game.*
import kotlinx.android.synthetic.main.activity_game.ad_placeholder
import kotlinx.android.synthetic.main.activity_game.minesCount import kotlinx.android.synthetic.main.activity_game.minesCount
import kotlinx.android.synthetic.main.activity_game.timer import kotlinx.android.synthetic.main.activity_game.timer
import kotlinx.android.synthetic.main.activity_tv_game.* import kotlinx.android.synthetic.main.activity_tv_game.*
@ -101,7 +104,11 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
findViewById<FrameLayout>(R.id.levelContainer).doOnLayout { findViewById<FrameLayout>(R.id.levelContainer).doOnLayout {
if (!isFinishing) { if (!isFinishing) {
loadGameFragment() if (!preferencesRepository.isTutorialCompleted()) {
loadGameTutorial()
} else {
loadGameFragment()
}
} }
} }
@ -181,6 +188,13 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
currentSaveId = it currentSaveId = it
} }
) )
tips.observe(
this@GameActivity,
{
tipsCounter.text = it.toString()
}
)
} }
override fun onBackPressed() { override fun onBackPressed() {
@ -241,8 +255,45 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
) )
} }
private fun refreshShortcutIcon(isEndGame: Boolean = false) { private fun disableShortcutIcon(hide: Boolean = false) {
if (isEndGame || instantAppManager.isEnabled(this)) { tipsCounter.visibility = View.GONE
shortcutIcon.apply {
visibility = if (hide) View.GONE else View.VISIBLE
isClickable = false
animate().alpha(0.3f).start()
}
}
private fun refreshTipShortcutIcon() {
tipsCounter.apply {
visibility = View.VISIBLE
text = gameViewModel.getTips().toString()
}
shortcutIcon.apply {
TooltipCompat.setTooltipText(this, getString(R.string.help))
setImageResource(R.drawable.tip)
setColorFilter(minesCount.currentTextColor)
visibility = View.VISIBLE
animate().alpha(1.0f).start()
setOnClickListener {
lifecycleScope.launch {
analyticsManager.sentEvent(Analytics.UseTip)
if (gameViewModel.getTips() > 0) {
if (!gameViewModel.revealRandomMine()) {
Toast.makeText(applicationContext, R.string.cant_do_it_now, Toast.LENGTH_SHORT).show()
}
} else {
Toast.makeText(applicationContext, R.string.help_win_a_game, Toast.LENGTH_SHORT).show()
}
}
}
}
}
private fun refreshEndGameShortcutIcon(victory: Boolean = false, isOldGame: Boolean) {
if ((isOldGame || !victory) && !instantAppManager.isEnabled(this)) {
shortcutIcon.apply { shortcutIcon.apply {
TooltipCompat.setTooltipText(this, getString(R.string.new_game)) TooltipCompat.setTooltipText(this, getString(R.string.new_game))
setImageResource(R.drawable.retry) setImageResource(R.drawable.retry)
@ -277,6 +328,7 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} }
} }
tipsCounter.visibility = View.GONE
shortcutIcon.apply { shortcutIcon.apply {
when (status) { when (status) {
is Status.Over, is Status.Running -> { is Status.Over, is Status.Running -> {
@ -317,7 +369,7 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} }
override fun onDrawerClosed(drawerView: View) { override fun onDrawerClosed(drawerView: View) {
if (hasNoOtherFocusedDialog()) { if (hasNoOtherFocusedDialog() && hasActiveGameFragment()) {
gameViewModel.resumeGame() gameViewModel.resumeGame()
} }
@ -330,7 +382,9 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} }
) )
if (preferencesRepository.isFirstUse()) { if (preferencesRepository.isFirstUse() &&
(preferencesRepository.isTutorialCompleted())
) {
openDrawer(GravityCompat.START) openDrawer(GravityCompat.START)
preferencesRepository.completeFirstUse() preferencesRepository.completeFirstUse()
} }
@ -356,7 +410,9 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
R.id.previous_games -> openSaveHistory() R.id.previous_games -> openSaveHistory()
R.id.stats -> openStats() R.id.stats -> openStats()
R.id.play_games -> googlePlay() R.id.play_games -> googlePlay()
R.id.translation -> openCrowdIn()
R.id.remove_ads -> showSupportAppDialog() R.id.remove_ads -> showSupportAppDialog()
R.id.tutorial -> loadGameTutorial()
else -> handled = false else -> handled = false
} }
@ -377,6 +433,7 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
// New Features // New Features
findItem(R.id.themes).setActionView(R.layout.new_icon) findItem(R.id.themes).setActionView(R.layout.new_icon)
findItem(R.id.tutorial).setActionView(R.layout.new_icon)
} }
} }
@ -423,8 +480,27 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
private fun loadGameFragment() { private fun loadGameFragment() {
supportFragmentManager.apply { supportFragmentManager.apply {
popBackStack() findFragmentByTag(TutorialLevelFragment.TAG)?.let { it ->
beginTransaction().apply {
remove(it)
commitAllowingStateLoss()
}
}
if (findFragmentByTag(LevelFragment.TAG) == null) {
beginTransaction().apply {
replace(R.id.levelContainer, LevelFragment(), LevelFragment.TAG)
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
commitAllowingStateLoss()
}
}
}
}
private fun loadGameTutorial() {
disableShortcutIcon(true)
supportFragmentManager.apply {
findFragmentById(R.id.levelContainer)?.let { it -> findFragmentById(R.id.levelContainer)?.let { it ->
beginTransaction().apply { beginTransaction().apply {
remove(it) remove(it)
@ -433,8 +509,8 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} }
beginTransaction().apply { beginTransaction().apply {
replace(R.id.levelContainer, LevelFragment()) replace(R.id.levelContainer, TutorialLevelFragment(), TutorialLevelFragment.TAG)
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
commitAllowingStateLoss() commitAllowingStateLoss()
} }
} }
@ -503,6 +579,12 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} }
} }
private fun showCompletedTutorialDialog() {
TutorialCompleteDialogFragment().run {
showAllowingStateLoss(supportFragmentManager, TutorialCompleteDialogFragment.TAG)
}
}
private fun showEndGameDialog(victory: Boolean) { private fun showEndGameDialog(victory: Boolean) {
val currentGameStatus = status val currentGameStatus = status
if (currentGameStatus is Status.Over && !isFinishing && !drawer.isDrawerOpen(GravityCompat.START)) { if (currentGameStatus is Status.Over && !isFinishing && !drawer.isDrawerOpen(GravityCompat.START)) {
@ -514,7 +596,8 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
victory, victory,
score?.rightMines ?: 0, score?.rightMines ?: 0,
score?.totalMines ?: 0, score?.totalMines ?: 0,
currentGameStatus.time currentGameStatus.time,
if (victory) 1 else 0
).apply { ).apply {
showAllowingStateLoss(supportFragmentManager, EndGameDialogFragment.TAG) showAllowingStateLoss(supportFragmentManager, EndGameDialogFragment.TAG)
} }
@ -534,13 +617,17 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} }
private fun changeDifficulty(newDifficulty: Difficulty) { private fun changeDifficulty(newDifficulty: Difficulty) {
preferencesRepository.completeTutorial()
if (status == Status.PreGame) { if (status == Status.PreGame) {
GlobalScope.launch { loadGameFragment()
lifecycleScope.launch {
gameViewModel.startNewGame(newDifficulty) gameViewModel.startNewGame(newDifficulty)
} }
} else { } else {
newGameConfirmation { newGameConfirmation {
GlobalScope.launch { loadGameFragment()
lifecycleScope.launch {
gameViewModel.startNewGame(newDifficulty) gameViewModel.startNewGame(newDifficulty)
} }
} }
@ -551,19 +638,34 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
when (event) { when (event) {
Event.ResumeGame -> { Event.ResumeGame -> {
status = Status.Running status = Status.Running
refreshShortcutIcon() refreshTipShortcutIcon()
} }
Event.StartNewGame -> { Event.StartNewGame -> {
status = Status.PreGame status = Status.PreGame
refreshShortcutIcon() disableShortcutIcon()
refreshAds() refreshAds()
} }
Event.Resume, Event.Running -> { Event.Resume, Event.Running -> {
status = Status.Running status = Status.Running
gameViewModel.runClock() gameViewModel.runClock()
refreshShortcutIcon() refreshTipShortcutIcon()
keepScreenOn(true) keepScreenOn(true)
} }
Event.StartTutorial -> {
status = Status.PreGame
gameViewModel.stopClock()
disableShortcutIcon(true)
loadGameTutorial()
}
Event.FinishTutorial -> {
gameViewModel.startNewGame(Difficulty.Beginner)
disableShortcutIcon()
loadGameFragment()
status = Status.Over(0, Score(4, 4, 25))
analyticsManager.sentEvent(Analytics.TutorialCompleted)
preferencesRepository.completeTutorial()
showCompletedTutorialDialog()
}
Event.Victory -> { Event.Victory -> {
val isResuming = (status == Status.PreGame) val isResuming = (status == Status.PreGame)
val score = Score( val score = Score(
@ -573,12 +675,14 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
) )
status = Status.Over(currentTime, score) status = Status.Over(currentTime, score)
gameViewModel.stopClock() gameViewModel.stopClock()
gameViewModel.revealAllEmptyAreas() gameViewModel.showAllEmptyAreas()
gameViewModel.victory() gameViewModel.victory()
refreshShortcutIcon(true) refreshEndGameShortcutIcon(true, isResuming)
keepScreenOn(false) keepScreenOn(false)
if (!isResuming) { if (!isResuming) {
gameViewModel.addNewTip()
waitAndShowEndGameDialog( waitAndShowEndGameDialog(
victory = true, victory = true,
await = false await = false
@ -593,7 +697,7 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
totalArea totalArea
) )
status = Status.Over(currentTime, score) status = Status.Over(currentTime, score)
refreshShortcutIcon(true) refreshEndGameShortcutIcon(false, isResuming)
keepScreenOn(false) keepScreenOn(false)
gameViewModel.stopClock() gameViewModel.stopClock()
@ -653,6 +757,10 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} == 0 } == 0
} }
private fun hasActiveGameFragment(): Boolean {
return supportFragmentManager.findFragmentByTag(LevelFragment.TAG) != null
}
override fun onDismiss(dialog: DialogInterface?) { override fun onDismiss(dialog: DialogInterface?) {
gameViewModel.run { gameViewModel.run {
refreshUserPreferences() refreshUserPreferences()
@ -708,6 +816,12 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} }
} }
private fun openCrowdIn() {
Intent(Intent.ACTION_VIEW, Uri.parse("https://crowdin.com/project/antimine-android")).let {
startActivity(it)
}
}
private fun showSupportAppDialog() { private fun showSupportAppDialog() {
if (supportFragmentManager.findFragmentByTag(SupportAppDialogFragment.TAG) == null && if (supportFragmentManager.findFragmentByTag(SupportAppDialogFragment.TAG) == null &&
!instantAppManager.isEnabled(this) !instantAppManager.isEnabled(this)

View file

@ -5,6 +5,7 @@ import dev.lucasnlm.antimine.common.level.di.LevelModule
import dev.lucasnlm.antimine.core.analytics.IAnalyticsManager import dev.lucasnlm.antimine.core.analytics.IAnalyticsManager
import dev.lucasnlm.antimine.core.analytics.models.Analytics import dev.lucasnlm.antimine.core.analytics.models.Analytics
import dev.lucasnlm.antimine.core.di.CommonModule import dev.lucasnlm.antimine.core.di.CommonModule
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.di.AppModule import dev.lucasnlm.antimine.di.AppModule
import dev.lucasnlm.antimine.di.ViewModelModule import dev.lucasnlm.antimine.di.ViewModelModule
import dev.lucasnlm.external.IAdsManager import dev.lucasnlm.external.IAdsManager
@ -14,6 +15,7 @@ import org.koin.core.context.startKoin
open class MainApplication : MultiDexApplication() { open class MainApplication : MultiDexApplication() {
private val analyticsManager: IAnalyticsManager by inject() private val analyticsManager: IAnalyticsManager by inject()
private val preferencesRepository: IPreferencesRepository by inject()
private val adsManager: IAdsManager by inject() private val adsManager: IAdsManager by inject()
@ -29,6 +31,10 @@ open class MainApplication : MultiDexApplication() {
sentEvent(Analytics.Open) sentEvent(Analytics.Open)
} }
if (BuildConfig.FLAVOR == "foss") {
preferencesRepository.setPremiumFeatures(true)
}
adsManager.start(applicationContext) adsManager.start(applicationContext)
} }
} }

View file

@ -31,12 +31,13 @@ class AboutViewModel(
"Hungarian" to sequenceOf("Hermann Márk"), "Hungarian" to sequenceOf("Hermann Márk"),
"Italian" to sequenceOf("Mattia - MisterWeeMan", "Nicola Lorenzetti"), "Italian" to sequenceOf("Mattia - MisterWeeMan", "Nicola Lorenzetti"),
"Japanese" to sequenceOf("Ryota Hasegawa"), "Japanese" to sequenceOf("Ryota Hasegawa"),
"Korean" to sequenceOf("Forever_"),
"Norwegian" to sequenceOf("Eule Hecking"), "Norwegian" to sequenceOf("Eule Hecking"),
"Polish" to sequenceOf("Sebastian Jasiński", "Sebastian Skibiński"), "Polish" to sequenceOf("Sebastian Jasiński", "Sebastian Skibiński"),
"Portuguese (BR)" to sequenceOf("Lucas Lima"), "Portuguese (BR)" to sequenceOf("Lucas Lima"),
"Russian" to sequenceOf("gaich@xda", "ask45t", "Ekaterina543"), "Russian" to sequenceOf("gaich@xda", "ask45t", "Ekaterina543"),
"Spanish" to sequenceOf("Alfredo Jara", "Aldo Rodriguez", "Inail"), "Spanish" to sequenceOf("Alfredo Jara", "Aldo Rodriguez", "Inail"),
"Turkish" to sequenceOf("creuzwagen", "Fatih Fırıncı"), "Turkish" to sequenceOf("arda şahin", "creuzwagen", "Fatih Fırıncı"),
"Ukrainian" to sequenceOf("Dmitry Shuba"), "Ukrainian" to sequenceOf("Dmitry Shuba"),
"Vietnamese" to sequenceOf("pnhpnh"), "Vietnamese" to sequenceOf("pnhpnh"),
).map { ).map {

View file

@ -10,6 +10,7 @@ import dev.lucasnlm.antimine.playgames.viewmodel.PlayGamesViewModel
import dev.lucasnlm.antimine.stats.viewmodel.StatsViewModel import dev.lucasnlm.antimine.stats.viewmodel.StatsViewModel
import dev.lucasnlm.antimine.text.viewmodel.TextViewModel import dev.lucasnlm.antimine.text.viewmodel.TextViewModel
import dev.lucasnlm.antimine.theme.viewmodel.ThemeViewModel import dev.lucasnlm.antimine.theme.viewmodel.ThemeViewModel
import dev.lucasnlm.antimine.tutorial.viewmodel.TutorialViewModel
import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module import org.koin.dsl.module
@ -24,6 +25,9 @@ val ViewModelModule = module {
viewModel { TextViewModel(get()) } viewModel { TextViewModel(get()) }
viewModel { ThemeViewModel(get(), get(), get(), get()) } viewModel { ThemeViewModel(get(), get(), get(), get()) }
viewModel { viewModel {
GameViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) GameViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get())
}
viewModel {
TutorialViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get())
} }
} }

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
@ -12,11 +13,8 @@ import androidx.fragment.app.FragmentManager
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import dev.lucasnlm.antimine.R import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.level.viewmodel.EndGameDialogEvent import dev.lucasnlm.antimine.level.viewmodel.EndGameDialogEvent
import dev.lucasnlm.antimine.level.viewmodel.EndGameDialogViewModel import dev.lucasnlm.antimine.level.viewmodel.EndGameDialogViewModel
import dev.lucasnlm.external.Ads
import dev.lucasnlm.external.IAdsManager
import dev.lucasnlm.external.IInstantAppManager import dev.lucasnlm.external.IInstantAppManager
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
@ -25,9 +23,6 @@ import org.koin.androidx.viewmodel.ext.android.viewModel
class EndGameDialogFragment : AppCompatDialogFragment() { class EndGameDialogFragment : AppCompatDialogFragment() {
private val instantAppManager: IInstantAppManager by inject() private val instantAppManager: IInstantAppManager by inject()
private val adsManager: IAdsManager by inject()
private val preferencesRepository: IPreferencesRepository by inject()
private val endGameViewModel by viewModel<EndGameDialogViewModel>() private val endGameViewModel by viewModel<EndGameDialogViewModel>()
private val gameViewModel by sharedViewModel<GameViewModel>() private val gameViewModel by sharedViewModel<GameViewModel>()
@ -40,7 +35,8 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
isVictory = if (getInt(DIALOG_TOTAL_MINES, 0) > 0) getBoolean(DIALOG_IS_VICTORY) else null, isVictory = if (getInt(DIALOG_TOTAL_MINES, 0) > 0) getBoolean(DIALOG_IS_VICTORY) else null,
time = getLong(DIALOG_TIME, 0L), time = getLong(DIALOG_TIME, 0L),
rightMines = getInt(DIALOG_RIGHT_MINES, 0), rightMines = getInt(DIALOG_RIGHT_MINES, 0),
totalMines = getInt(DIALOG_TOTAL_MINES, 0) totalMines = getInt(DIALOG_TOTAL_MINES, 0),
received = getInt(DIALOG_RECEIVED, -1)
) )
) )
} }
@ -72,6 +68,15 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
} }
} }
findViewById<TextView>(R.id.received_message).apply {
if (state.received > 0 && state.isVictory == true) {
visibility = View.VISIBLE
text = getString(R.string.you_have_received, state.received)
} else {
visibility = View.GONE
}
}
if (state.isVictory == true) { if (state.isVictory == true) {
if (!instantAppManager.isEnabled(context)) { if (!instantAppManager.isEnabled(context)) {
setNeutralButton(R.string.share) { _, _ -> setNeutralButton(R.string.share) { _, _ ->
@ -81,12 +86,6 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
} else { } else {
setNeutralButton(R.string.retry) { _, _ -> setNeutralButton(R.string.retry) { _, _ ->
gameViewModel.retryObserver.postValue(Unit) gameViewModel.retryObserver.postValue(Unit)
activity?.let {
if (!preferencesRepository.isPremiumEnabled()) {
adsManager.requestRewarded(it, Ads.RewardsAds)
}
}
} }
} }
} }
@ -101,20 +100,27 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
}.create() }.create()
companion object { companion object {
fun newInstance(victory: Boolean, rightMines: Int, totalMines: Int, time: Long) = fun newInstance(
EndGameDialogFragment().apply { victory: Boolean,
arguments = Bundle().apply { rightMines: Int,
putBoolean(DIALOG_IS_VICTORY, victory) totalMines: Int,
putInt(DIALOG_RIGHT_MINES, rightMines) time: Long,
putInt(DIALOG_TOTAL_MINES, totalMines) received: Int,
putLong(DIALOG_TIME, time) ) = EndGameDialogFragment().apply {
} arguments = Bundle().apply {
putBoolean(DIALOG_IS_VICTORY, victory)
putInt(DIALOG_RIGHT_MINES, rightMines)
putInt(DIALOG_TOTAL_MINES, totalMines)
putInt(DIALOG_RECEIVED, received)
putLong(DIALOG_TIME, time)
} }
}
const val DIALOG_IS_VICTORY = "dialog_state" const val DIALOG_IS_VICTORY = "dialog_state"
private const val DIALOG_TIME = "dialog_time" private const val DIALOG_TIME = "dialog_time"
private const val DIALOG_RIGHT_MINES = "dialog_right_mines" private const val DIALOG_RIGHT_MINES = "dialog_right_mines"
private const val DIALOG_TOTAL_MINES = "dialog_total_mines" private const val DIALOG_TOTAL_MINES = "dialog_total_mines"
private const val DIALOG_RECEIVED = "dialog_received"
val TAG = EndGameDialogFragment::class.simpleName!! val TAG = EndGameDialogFragment::class.simpleName!!
} }

View file

@ -24,7 +24,6 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
recyclerGrid = view.findViewById(R.id.recyclerGrid)
recyclerGrid.doOnLayout { recyclerGrid.doOnLayout {
lifecycleScope.launch { lifecycleScope.launch {
val loadGameUid = checkLoadGameDeepLink() val loadGameUid = checkLoadGameDeepLink()
@ -35,7 +34,7 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
loadGameUid != null -> gameViewModel.loadGame(loadGameUid) loadGameUid != null -> gameViewModel.loadGame(loadGameUid)
newGameDeepLink != null -> gameViewModel.startNewGame(newGameDeepLink) newGameDeepLink != null -> gameViewModel.startNewGame(newGameDeepLink)
retryDeepLink != null -> gameViewModel.retryGame(retryDeepLink) retryDeepLink != null -> gameViewModel.retryGame(retryDeepLink)
else -> gameViewModel.loadLastGame() else -> gameViewModel.loadGame()
} }
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
@ -58,9 +57,9 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
levelSetup.observe( levelSetup.observe(
viewLifecycleOwner, viewLifecycleOwner,
{ { minefield ->
getView()?.let { view -> getView()?.doOnLayout { view ->
setupRecyclerViewSize(view, it) setupRecyclerViewSize(view, minefield)
} }
} }
) )
@ -76,7 +75,7 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
Event.Resume, Event.Resume,
Event.ResumeGame, Event.ResumeGame,
Event.StartNewGame -> areaAdapter.setClickEnabled(true) Event.StartNewGame -> areaAdapter.setClickEnabled(true)
null -> { } else -> { }
} }
} }
) )
@ -113,4 +112,8 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
null null
} }
} }
companion object {
val TAG = LevelFragment::class.simpleName
}
} }

View file

@ -8,6 +8,7 @@ sealed class EndGameDialogEvent {
val time: Long, val time: Long,
val rightMines: Int, val rightMines: Int,
val totalMines: Int, val totalMines: Int,
val received: Int,
) : EndGameDialogEvent() ) : EndGameDialogEvent()
data class ChangeEmoji( data class ChangeEmoji(

View file

@ -7,4 +7,5 @@ data class EndGameDialogState(
val title: String, val title: String,
val message: String, val message: String,
val isVictory: Boolean?, val isVictory: Boolean?,
val received: Int
) )

View file

@ -70,6 +70,7 @@ class EndGameDialogViewModel(
"", "",
"", "",
false, false,
0
) )
override suspend fun mapEventToState(event: EndGameDialogEvent) = flow { override suspend fun mapEventToState(event: EndGameDialogEvent) = flow {
@ -80,7 +81,8 @@ class EndGameDialogViewModel(
titleEmoji = randomVictoryEmoji(), titleEmoji = randomVictoryEmoji(),
title = context.getString(R.string.you_won), title = context.getString(R.string.you_won),
message = messageTo(event.time, event.isVictory), message = messageTo(event.time, event.isVictory),
isVictory = true isVictory = true,
received = event.received
) )
} }
false -> { false -> {
@ -88,7 +90,8 @@ class EndGameDialogViewModel(
titleEmoji = randomGameOverEmoji(), titleEmoji = randomGameOverEmoji(),
title = context.getString(R.string.you_lost), title = context.getString(R.string.you_lost),
message = messageTo(event.time, event.isVictory), message = messageTo(event.time, event.isVictory),
isVictory = false isVictory = false,
received = event.received
) )
} }
null -> { null -> {
@ -96,7 +99,8 @@ class EndGameDialogViewModel(
titleEmoji = randomNeutralEmoji(), titleEmoji = randomNeutralEmoji(),
title = context.getString(R.string.new_game), title = context.getString(R.string.new_game),
message = context.getString(R.string.new_game_request), message = context.getString(R.string.new_game_request),
isVictory = false isVictory = false,
received = event.received
) )
} }
} }

View file

@ -38,7 +38,7 @@ class SupportAppDialogFragment : AppCompatDialogFragment() {
return AlertDialog.Builder(requireContext()).apply { return AlertDialog.Builder(requireContext()).apply {
setView(R.layout.dialog_payments) setView(R.layout.dialog_payments)
setNeutralButton(R.string.rating_button_no) { _, _ -> setNeutralButton(R.string.no) { _, _ ->
analyticsManager.sentEvent(Analytics.DenyIapDialog) analyticsManager.sentEvent(Analytics.DenyIapDialog)
} }

View file

@ -0,0 +1,93 @@
package dev.lucasnlm.antimine.theme.view
import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.models.Mark
object ExampleField {
fun getField() = listOf(
Area(
0,
0,
0,
1,
hasMine = false,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
1,
1,
0,
0,
hasMine = true,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
2,
2,
0,
0,
hasMine = true,
mistake = false,
mark = Mark.None,
isCovered = true
),
Area(
3,
0,
1,
2,
hasMine = false,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
4,
1,
1,
3,
hasMine = false,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
5,
2,
1,
3,
hasMine = true,
mistake = false,
mark = Mark.Flag,
isCovered = true
),
Area(
6,
0,
2,
0,
hasMine = true,
mistake = false,
mark = Mark.Question,
isCovered = true
),
Area(
7,
1,
2,
4,
hasMine = false,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
8, 2, 2, 0,
hasMine = false, mistake = false, mark = Mark.None, isCovered = true, revealed = true
),
)
}

View file

@ -12,7 +12,6 @@ import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.R import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.common.level.models.Area import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.models.AreaPaintSettings import dev.lucasnlm.antimine.common.level.models.AreaPaintSettings
import dev.lucasnlm.antimine.common.level.models.Mark
import dev.lucasnlm.antimine.common.level.view.AreaView import dev.lucasnlm.antimine.common.level.view.AreaView
import dev.lucasnlm.antimine.core.themes.model.AppTheme import dev.lucasnlm.antimine.core.themes.model.AppTheme
import dev.lucasnlm.antimine.theme.viewmodel.ThemeEvent import dev.lucasnlm.antimine.theme.viewmodel.ThemeEvent
@ -25,18 +24,7 @@ class ThemeAdapter(
) : RecyclerView.Adapter<ThemeViewHolder>() { ) : RecyclerView.Adapter<ThemeViewHolder>() {
private val themes: List<AppTheme> = themeViewModel.singleState().themes private val themes: List<AppTheme> = themeViewModel.singleState().themes
private val minefield = ExampleField.getField()
private val minefield = listOf(
Area(0, 0, 0, 1, hasMine = false, mistake = false, mark = Mark.None, isCovered = false),
Area(1, 1, 0, 0, hasMine = true, mistake = false, mark = Mark.None, isCovered = false),
Area(2, 2, 0, 0, hasMine = true, mistake = false, mark = Mark.None, isCovered = true),
Area(3, 0, 1, 2, hasMine = false, mistake = false, mark = Mark.None, isCovered = false),
Area(4, 1, 1, 3, hasMine = false, mistake = false, mark = Mark.None, isCovered = false),
Area(5, 2, 1, 3, hasMine = true, mistake = false, mark = Mark.Flag, isCovered = true),
Area(6, 0, 2, 0, hasMine = true, mistake = false, mark = Mark.Question, isCovered = true),
Area(7, 1, 2, 4, hasMine = false, mistake = false, mark = Mark.None, isCovered = false),
Area(8, 2, 2, 0, hasMine = false, mistake = false, mark = Mark.None, isCovered = true),
)
init { init {
setHasStableIds(true) setHasStableIds(true)

View file

@ -0,0 +1,171 @@
package dev.lucasnlm.antimine.tutorial.view
import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.view.GestureDetector
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.models.AreaPaintSettings
import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.view.AreaAdapter
import dev.lucasnlm.antimine.common.level.view.AreaView
import dev.lucasnlm.antimine.common.level.view.AreaViewHolder
import dev.lucasnlm.antimine.core.control.ControlStyle
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.tutorial.viewmodel.TutorialViewModel
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
class TutorialAreaAdapter(
context: Context,
private val viewModel: TutorialViewModel,
private val preferencesRepository: IPreferencesRepository,
dimensionRepository: IDimensionRepository,
) : RecyclerView.Adapter<AreaViewHolder>() {
private var field = listOf<Area>()
private var isLowBitAmbient = false
private var isAmbientMode = false
private val paintSettings: AreaPaintSettings
private var clickEnabled: Boolean = false
init {
setHasStableIds(false)
paintSettings = AreaAdapter.createAreaPaintSettings(context.applicationContext, dimensionRepository.areaSize())
}
fun setAmbientMode(isAmbientMode: Boolean, isLowBitAmbient: Boolean) {
this.isLowBitAmbient = isLowBitAmbient
this.isAmbientMode = isAmbientMode
}
fun setClickEnabled(value: Boolean) {
clickEnabled = value
}
fun bindField(field: List<Area>) {
this.field = field
notifyDataSetChanged()
}
override fun getItemCount(): Int = field.size
private fun AreaView.onClickablePosition(position: Int, action: suspend (Int) -> Unit): Boolean {
return when {
position == RecyclerView.NO_POSITION -> {
Log.d(TAG, "Item no longer exists.")
false
}
clickEnabled -> {
requestFocus()
GlobalScope.launch {
action(position)
}
true
}
else -> false
}
}
@SuppressLint("ClickableViewAccessibility")
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AreaViewHolder {
val view = AreaView(parent.context)
return AreaViewHolder(view).apply {
val style = preferencesRepository.controlStyle()
if (style == ControlStyle.DoubleClick || style == ControlStyle.DoubleClickInverted) {
view.isClickable = true
view.setOnDoubleClickListener(
object : GestureDetector.OnDoubleTapListener {
override fun onDoubleTap(e: MotionEvent?): Boolean {
return view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onDoubleClick(it)
}
}
override fun onDoubleTapEvent(e: MotionEvent?): Boolean {
return false
}
override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
return view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onSingleClick(it)
}
}
}
)
} else {
view.setOnTouchListener { _, motionEvent ->
when (motionEvent.action) {
MotionEvent.ACTION_DOWN -> {
view.isPressed = true
true
}
MotionEvent.ACTION_UP -> {
view.isPressed = false
val dt = motionEvent.eventTime - motionEvent.downTime
if (dt > preferencesRepository.customLongPressTimeout()) {
view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onLongClick(it)
}
} else {
view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onSingleClick(it)
}
}
}
else -> false
}
}
}
view.setOnKeyListener { _, keyCode, keyEvent ->
var handled = false
if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
when (keyEvent.action) {
KeyEvent.ACTION_DOWN -> {
handled = true
view.isPressed = true
}
KeyEvent.ACTION_UP -> {
handled = true
view.isPressed = false
val dt = keyEvent.eventTime - keyEvent.downTime
if (dt > preferencesRepository.customLongPressTimeout()) {
view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onLongClick(it)
}
} else {
view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onSingleClick(it)
}
}
}
}
}
handled
}
}
}
private fun getItem(position: Int) = field[position]
override fun getItemId(position: Int): Long = getItem(position).id.toLong()
override fun onBindViewHolder(holder: AreaViewHolder, position: Int) {
val field = getItem(position)
holder.run {
val areaView = itemView as AreaView
areaView.bindField(field, viewModel.getAppTheme(), isAmbientMode, isLowBitAmbient, paintSettings)
}
}
companion object {
val TAG = TutorialAreaAdapter::class.simpleName!!
}
}

View file

@ -0,0 +1,57 @@
package dev.lucasnlm.antimine.tutorial.view
import android.annotation.SuppressLint
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDialogFragment
import androidx.fragment.app.FragmentManager
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.common.level.models.Difficulty
import dev.lucasnlm.antimine.common.level.models.Event
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
class TutorialCompleteDialogFragment : AppCompatDialogFragment() {
private val gameViewModel by sharedViewModel<GameViewModel>()
fun showAllowingStateLoss(manager: FragmentManager, tag: String?) {
val fragmentTransaction = manager.beginTransaction()
fragmentTransaction.add(this, tag)
fragmentTransaction.commitAllowingStateLoss()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
gameViewModel.startNewGame(Difficulty.Beginner)
}
@SuppressLint("InflateParams")
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
AlertDialog.Builder(requireContext()).apply {
val view = LayoutInflater
.from(context)
.inflate(R.layout.dialog_end_game, null, false)
.apply {
findViewById<TextView>(R.id.title).text = getString(R.string.tutorial_completed)
findViewById<TextView>(R.id.subtitle).visibility = View.GONE
findViewById<TextView>(R.id.received_message).visibility = View.GONE
findViewById<ImageView>(R.id.title_emoji)
.setImageResource(R.drawable.emoji_beaming_face_with_smiling_eyes)
}
setView(view)
setNeutralButton(R.string.retry) { _, _ ->
gameViewModel.eventObserver.postValue(Event.StartTutorial)
}
setPositiveButton(R.string.resume) { _, _ -> }
}.create()
companion object {
val TAG = TutorialCompleteDialogFragment::class.simpleName!!
}
}

View file

@ -0,0 +1,254 @@
package dev.lucasnlm.antimine.tutorial.view
import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.models.Mark
object TutorialField {
fun getStep0(): List<Area> {
return (0..24).map {
Area(it, 0, 0, isCovered = true)
}.toList()
}
private fun getDefaultStep(): MutableList<Area> {
return mutableListOf(
Area(
0, 0, 0, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
1, 1, 0, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
2, 2, 0, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
3, 3, 0, 2, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
4, 4, 0, 0, hasMine = true,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
5, 0, 1, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
6, 1, 1, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
7, 2, 1, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
8, 3, 1, 2, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
9, 4, 1, 0, hasMine = true,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
10, 0, 2, 0, hasMine = true,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
11, 1, 2, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
12, 2, 2, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
13, 3, 2, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
14, 4, 2, 1, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
15, 0, 3, 1, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
16, 1, 3, 2, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
17, 2, 3, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
18, 3, 3, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
19, 4, 3, 0, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
20, 0, 4, 0, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
21, 1, 4, 1, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
22, 2, 4, 0, hasMine = true,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
23, 3, 4, 1, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
24, 4, 4, 0, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
)
}
fun getStep1(): List<Area> {
return getDefaultStep().apply {
this[6] = this[6].copy(highlighted = true)
this[10] = this[10].copy(highlighted = true)
}
}
fun getStep2(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[11] = this[11].copy(highlighted = true)
this[15] = this[15].copy(highlighted = true)
}
}
fun getStep3(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(highlighted = true, isCovered = false)
this[20] = this[20].copy(highlighted = true)
this[21] = this[21].copy(highlighted = true)
}
}
fun getStep4(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[16] = this[16].copy(highlighted = true)
this[22] = this[22].copy(highlighted = true)
}
}
fun getStep5(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[17] = this[17].copy(highlighted = true)
this[23] = this[23].copy(highlighted = true)
this[22] = this[22].copy(mark = Mark.Flag)
}
}
fun getStep6(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[23] = this[23].copy(isCovered = false)
this[22] = this[22].copy(mark = Mark.Flag)
this[18] = this[18].copy(highlighted = true)
this[24] = this[24].copy(highlighted = true)
this[19] = this[19].copy(highlighted = true)
this[14] = this[14].copy(highlighted = true)
}
}
fun getStep7(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[23] = this[23].copy(isCovered = false)
this[22] = this[22].copy(mark = Mark.Flag)
this[24] = this[24].copy(isCovered = false)
this[19] = this[19].copy(isCovered = false)
this[14] = this[14].copy(isCovered = false)
this[13] = this[13].copy(highlighted = true)
this[9] = this[9].copy(highlighted = true)
}
}
fun getStep8(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[23] = this[23].copy(isCovered = false)
this[22] = this[22].copy(mark = Mark.Flag)
this[24] = this[24].copy(isCovered = false)
this[19] = this[19].copy(isCovered = false)
this[14] = this[14].copy(isCovered = false)
this[8] = this[8].copy(highlighted = true)
this[4] = this[4].copy(highlighted = true)
this[9] = this[9].copy(mark = Mark.Flag)
}
}
fun getStep9(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[23] = this[23].copy(isCovered = false)
this[22] = this[22].copy(mark = Mark.Flag)
this[24] = this[24].copy(isCovered = false)
this[19] = this[19].copy(isCovered = false)
this[14] = this[14].copy(isCovered = false)
this[4] = this[4].copy(mark = Mark.Flag)
this[9] = this[9].copy(mark = Mark.Flag)
}
}
}

View file

@ -0,0 +1,138 @@
package dev.lucasnlm.antimine.tutorial.view
import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.core.content.ContextCompat
import androidx.core.text.bold
import androidx.core.text.buildSpannedString
import androidx.core.text.color
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.common.level.models.Event
import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.view.SpaceItemDecoration
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.tutorial.viewmodel.TutorialViewModel
import kotlinx.android.synthetic.main.fragment_tutorial_level.*
import kotlinx.coroutines.flow.collect
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import org.koin.androidx.viewmodel.ext.android.viewModel
class TutorialLevelFragment : Fragment(R.layout.fragment_tutorial_level) {
private val dimensionRepository: IDimensionRepository by inject()
private val preferencesRepository: IPreferencesRepository by inject()
private val tutorialViewModel by viewModel<TutorialViewModel>()
private val gameViewModel by sharedViewModel<GameViewModel>()
private val areaAdapter by lazy {
TutorialAreaAdapter(requireContext(), tutorialViewModel, preferencesRepository, dimensionRepository).apply {
setClickEnabled(true)
}
}
private lateinit var recyclerGrid: RecyclerView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerGrid = view.findViewById(R.id.recyclerGrid)
recyclerGrid.apply {
addItemDecoration(SpaceItemDecoration(R.dimen.field_padding))
setHasFixedSize(true)
layoutManager = GridLayoutManager(view.context, 5)
adapter = areaAdapter
}
lifecycleScope.launchWhenCreated {
tutorialViewModel.run {
field.observe(
viewLifecycleOwner,
{ list ->
gameViewModel.stopClock()
gameViewModel.elapsedTimeSeconds.postValue(0L)
gameViewModel.mineCount.postValue(
list.count { it.hasMine }.coerceAtLeast(4) - list.count { it.mark.isFlag() }
)
areaAdapter.bindField(list)
if (tutorialState.value.completed) {
gameViewModel.eventObserver.postValue(Event.FinishTutorial)
}
}
)
}
}
lifecycleScope.launchWhenCreated {
tutorialViewModel.tutorialState.collect {
val flagAction = tutorialViewModel.flagActionLabel()
val openAction = tutorialViewModel.openActionLabel()
tutorial_top.apply {
text = buildSpannedString {
it.topMessage
.splitKeeping(flagAction, openAction)
.forEach {
when (it) {
flagAction, openAction -> {
bold { color(ContextCompat.getColor(context, R.color.accent)) { append(it) } }
}
else -> append(it)
}
}
}
setTextColor(
Color.argb(
255,
Color.red(tutorial_top.currentTextColor),
Color.green(tutorial_top.currentTextColor),
Color.blue(tutorial_top.currentTextColor),
),
)
}
tutorial_bottom.apply {
text = buildSpannedString {
it.bottomMessage
.splitKeeping(flagAction, openAction)
.forEach {
when (it) {
flagAction, openAction -> {
bold { color(ContextCompat.getColor(context, R.color.accent)) { append(it) } }
}
else -> append(it)
}
}
}
setTextColor(
Color.argb(
255,
Color.red(tutorial_top.currentTextColor),
Color.green(tutorial_top.currentTextColor),
Color.blue(tutorial_top.currentTextColor),
),
)
}
}
}
}
private fun String.splitKeeping(str: String): List<String> {
return this.split(str).flatMap { listOf(it, str) }.dropLast(1).filterNot { it.isEmpty() }
}
private fun String.splitKeeping(vararg targetStrings: String): List<String> {
var res = listOf(this)
targetStrings.forEach { str ->
res = res.flatMap { it.splitKeeping(str) }
}
return res
}
companion object {
val TAG = TutorialLevelFragment::class.simpleName
}
}

View file

@ -0,0 +1,8 @@
package dev.lucasnlm.antimine.tutorial.viewmodel
data class TutorialState(
val step: Int,
val topMessage: String,
val bottomMessage: String,
val completed: Boolean,
)

View file

@ -0,0 +1,220 @@
package dev.lucasnlm.antimine.tutorial.viewmodel
import android.content.Context
import dev.lucasnlm.antimine.common.R
import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.repository.IMinefieldRepository
import dev.lucasnlm.antimine.common.level.repository.ISavesRepository
import dev.lucasnlm.antimine.common.level.repository.IStatsRepository
import dev.lucasnlm.antimine.common.level.repository.ITipRepository
import dev.lucasnlm.antimine.common.level.utils.Clock
import dev.lucasnlm.antimine.common.level.utils.IHapticFeedbackManager
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
import dev.lucasnlm.antimine.core.analytics.IAnalyticsManager
import dev.lucasnlm.antimine.core.analytics.models.Analytics
import dev.lucasnlm.antimine.core.control.ControlStyle
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.core.sound.ISoundManager
import dev.lucasnlm.antimine.core.themes.repository.IThemeRepository
import dev.lucasnlm.antimine.tutorial.view.TutorialField
import dev.lucasnlm.external.IPlayGamesManager
import kotlinx.coroutines.flow.MutableStateFlow
class TutorialViewModel(
savesRepository: ISavesRepository,
statsRepository: IStatsRepository,
dimensionRepository: IDimensionRepository,
themeRepository: IThemeRepository,
soundManager: ISoundManager,
minefieldRepository: IMinefieldRepository,
analyticsManager: IAnalyticsManager,
playGamesManager: IPlayGamesManager,
tipRepository: ITipRepository,
private val clock: Clock,
private val context: Context,
private val hapticFeedbackManager: IHapticFeedbackManager,
private val preferencesRepository: IPreferencesRepository,
) : GameViewModel(
savesRepository,
statsRepository,
dimensionRepository,
preferencesRepository,
hapticFeedbackManager,
themeRepository,
soundManager,
minefieldRepository,
analyticsManager,
playGamesManager,
tipRepository,
clock,
) {
val tutorialState = MutableStateFlow(
TutorialState(
0,
context.getString(R.string.tutorial),
context.getString(R.string.tutorial_0_bottom, openActionLabel()),
completed = false,
)
)
init {
field.postValue(TutorialField.getStep0())
analyticsManager.sentEvent(Analytics.TutorialStarted)
}
private fun currentStep(): Int {
return tutorialState.value.step
}
fun openActionLabel(): String =
when (preferencesRepository.controlStyle()) {
ControlStyle.Standard -> context.getString(R.string.single_click)
ControlStyle.FastFlag -> context.getString(R.string.long_press)
ControlStyle.DoubleClick -> context.getString(R.string.double_click)
ControlStyle.DoubleClickInverted -> context.getString(R.string.single_click)
}
fun flagActionLabel(): String =
when (preferencesRepository.controlStyle()) {
ControlStyle.Standard -> context.getString(R.string.long_press)
ControlStyle.FastFlag -> context.getString(R.string.single_click)
ControlStyle.DoubleClick -> context.getString(R.string.single_click)
ControlStyle.DoubleClickInverted -> context.getString(R.string.double_click)
}
private fun postStep(step: List<Area>, top: String, bottom: String, completed: Boolean = false) {
field.postValue(step)
clock.stop()
tutorialState.value = tutorialState.value.copy(
completed = completed,
step = currentStep() + 1,
topMessage = top,
bottomMessage = bottom,
)
}
private fun openTileAction(index: Int) {
when (currentStep()) {
0 -> {
postStep(
TutorialField.getStep1(),
context.getString(R.string.tutorial_1_top),
context.getString(R.string.tutorial_1_bottom, flagActionLabel()),
)
}
2 -> {
if (index == 15) {
postStep(
TutorialField.getStep3(),
context.getString(R.string.tutorial_3_top),
context.getString(R.string.tutorial_3_bottom),
)
}
}
3 -> {
if (index == 20 || index == 21) {
postStep(
TutorialField.getStep4(),
context.getString(R.string.tutorial_4_top),
context.getString(R.string.tutorial_4_bottom, flagActionLabel()),
)
}
}
5 -> {
if (index == 23) {
postStep(
TutorialField.getStep6(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
)
}
}
6 -> {
if (index == 24 || index == 19 || index == 14) {
postStep(
TutorialField.getStep7(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
)
}
}
else -> {
hapticFeedbackManager.explosionFeedback()
}
}
}
private fun longTileAction(index: Int) {
when (currentStep()) {
1 -> {
if (index == 10) {
postStep(
TutorialField.getStep2(),
context.getString(R.string.tutorial_2_top),
context.getString(R.string.tutorial_2_bottom, openActionLabel()),
)
}
}
4 -> {
if (index == 22) {
postStep(
TutorialField.getStep5(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
)
}
}
7 -> {
if (index == 9) {
postStep(
TutorialField.getStep8(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
)
}
}
8 -> {
if (index == 4) {
postStep(
TutorialField.getStep9(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
completed = true
)
}
}
else -> {
hapticFeedbackManager.explosionFeedback()
}
}
}
override suspend fun onDoubleClick(index: Int) {
clock.stop()
when (preferencesRepository.controlStyle()) {
ControlStyle.DoubleClick -> openTileAction(index)
ControlStyle.DoubleClickInverted -> longTileAction(index)
else -> {}
}
}
override suspend fun onSingleClick(index: Int) {
clock.stop()
when (preferencesRepository.controlStyle()) {
ControlStyle.Standard -> openTileAction(index)
ControlStyle.FastFlag -> longTileAction(index)
ControlStyle.DoubleClick -> longTileAction(index)
ControlStyle.DoubleClickInverted -> openTileAction(index)
}
}
override suspend fun onLongClick(index: Int) {
clock.stop()
when (preferencesRepository.controlStyle()) {
ControlStyle.Standard -> longTileAction(index)
ControlStyle.FastFlag -> openTileAction(index)
else -> {}
}
}
}

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,3c-0.46,0 -0.93,0.04 -1.4,0.14C7.84,3.67 5.64,5.9 5.12,8.66c-0.48,2.61 0.48,5.01 2.22,6.56C7.77,15.6 8,16.13 8,16.69V19c0,1.1 0.9,2 2,2h0.28c0.35,0.6 0.98,1 1.72,1s1.38,-0.4 1.72,-1H14c1.1,0 2,-0.9 2,-2v-2.31c0,-0.55 0.22,-1.09 0.64,-1.46C18.09,13.95 19,12.08 19,10C19,6.13 15.87,3 12,3zM12.5,14h-1v-2.59L9.67,9.59l0.71,-0.71L12,10.5l1.62,-1.62l0.71,0.71l-1.83,1.83V14zM13.5,19c-0.01,0 -0.02,-0.01 -0.03,-0.01V19h-2.94v-0.01c-0.01,0 -0.02,0.01 -0.03,0.01c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5c0.01,0 0.02,0.01 0.03,0.01V18h2.94v0.01c0.01,0 0.02,-0.01 0.03,-0.01c0.28,0 0.5,0.22 0.5,0.5C14,18.78 13.78,19 13.5,19zM13.5,17h-3c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5h3c0.28,0 0.5,0.22 0.5,0.5C14,16.78 13.78,17 13.5,17z" />
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12.65,15.67c0.14,-0.36 0.05,-0.77 -0.23,-1.05l-2.09,-2.06 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53h1.94c0.54,0 0.99,-0.45 0.99,-0.99v-0.02c0,-0.54 -0.45,-0.99 -0.99,-0.99L10,4L10,3c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v1L1.99,4c-0.54,0 -0.99,0.45 -0.99,0.99 0,0.55 0.45,0.99 0.99,0.99h10.18C11.5,7.92 10.44,9.75 9,11.35c-0.81,-0.89 -1.49,-1.86 -2.06,-2.88 -0.16,-0.29 -0.45,-0.47 -0.78,-0.47 -0.69,0 -1.13,0.75 -0.79,1.35 0.63,1.13 1.4,2.21 2.3,3.21L3.3,16.87c-0.4,0.39 -0.4,1.03 0,1.42 0.39,0.39 1.02,0.39 1.42,0L9,14l2.02,2.02c0.51,0.51 1.38,0.32 1.63,-0.35zM17.5,10c-0.6,0 -1.14,0.37 -1.35,0.94l-3.67,9.8c-0.24,0.61 0.22,1.26 0.87,1.26 0.39,0 0.74,-0.24 0.88,-0.61l0.89,-2.39h4.75l0.9,2.39c0.14,0.36 0.49,0.61 0.88,0.61 0.65,0 1.11,-0.65 0.88,-1.26l-3.67,-9.8c-0.22,-0.57 -0.76,-0.94 -1.36,-0.94zM15.88,17l1.62,-4.33L19.12,17h-3.24z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M5,13.18v2.81c0,0.73 0.4,1.41 1.04,1.76l5,2.73c0.6,0.33 1.32,0.33 1.92,0l5,-2.73c0.64,-0.35 1.04,-1.03 1.04,-1.76v-2.81l-6.04,3.3c-0.6,0.33 -1.32,0.33 -1.92,0L5,13.18zM11.04,3.52l-8.43,4.6c-0.69,0.38 -0.69,1.38 0,1.76l8.43,4.6c0.6,0.33 1.32,0.33 1.92,0L21,10.09L21,16c0,0.55 0.45,1 1,1s1,-0.45 1,-1L23,9.59c0,-0.37 -0.2,-0.7 -0.52,-0.88l-9.52,-5.19c-0.6,-0.32 -1.32,-0.32 -1.92,0z"/>
</vector>

View file

@ -83,10 +83,26 @@
android:background="?selectableItemBackgroundBorderless" android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/new_game" android:contentDescription="@string/new_game"
android:padding="14dp" android:padding="14dp"
android:alpha="0.0"
android:clickable="false"
ads:layout_constraintRight_toRightOf="parent" ads:layout_constraintRight_toRightOf="parent"
ads:layout_constraintTop_toTopOf="parent" ads:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/retry" app:srcCompat="@drawable/retry"
tools:visibility="visible"/> tools:alpha="1.0"/>
<TextView
android:id="@+id/tipsCounter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="41dp"
android:textSize="12sp"
android:textStyle="bold"
android:visibility="gone"
tools:text="100"
tools:visibility="visible"
ads:layout_constraintBottom_toBottomOf="@+id/shortcutIcon"
ads:layout_constraintEnd_toEndOf="@+id/shortcutIcon"
ads:layout_constraintTop_toTopOf="parent" />
<FrameLayout <FrameLayout
android:id="@+id/levelContainer" android:id="@+id/levelContainer"

View file

@ -50,4 +50,19 @@
app:layout_constraintTop_toBottomOf="@+id/title" app:layout_constraintTop_toBottomOf="@+id/title"
tools:text="You did 5/12 in 34 seconds." /> tools:text="You did 5/12 in 34 seconds." />
<TextView
android:id="@+id/received_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/you_have_received"
android:layout_marginTop="4dp"
android:textSize="14sp"
android:textAlignment="center"
android:gravity="center"
app:drawableEndCompat="@drawable/tip"
app:drawableTint="@color/accent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/subtitle"/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_gravity="center">
<TextView
android:id="@+id/tutorial_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:paddingHorizontal="24dp"
android:gravity="center_horizontal"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/recyclerGrid"
tools:text="Tutorial"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerGrid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clipChildren="false"
android:clipToPadding="false"
android:contentDescription="@null"
android:fadeScrollbars="true"
android:importantForAccessibility="no"
android:overScrollMode="never"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:scrollbars="none" />
<TextView
android:id="@+id/tutorial_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:gravity="center_horizontal"
android:textSize="16sp"
android:paddingHorizontal="24dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/recyclerGrid"
tools:text="You can start by clicking at any random place." />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -78,6 +78,12 @@
android:checkable="false" android:checkable="false"
android:icon="@drawable/settings" android:icon="@drawable/settings"
android:title="@string/settings" /> android:title="@string/settings" />
<item
android:id="@+id/tutorial"
android:checkable="false"
android:icon="@drawable/tutorial"
android:title="@string/tutorial" />
</group> </group>
<group android:id="@+id/play_games_group"> <group android:id="@+id/play_games_group">
@ -103,6 +109,12 @@
android:checkable="false" android:checkable="false"
android:title="@string/rating" /> android:title="@string/rating" />
<item
android:id="@+id/translation"
android:icon="@drawable/translate"
android:checkable="false"
android:title="@string/translation" />
<item <item
android:id="@+id/about" android:id="@+id/about"
android:icon="@drawable/info" android:icon="@drawable/info"

View file

@ -25,6 +25,10 @@ class MockPreferencesRepository : IPreferencesRepository {
override fun completeFirstUse() { } override fun completeFirstUse() { }
override fun isTutorialCompleted(): Boolean = true
override fun completeTutorial() { }
override fun customLongPressTimeout(): Long = 400L override fun customLongPressTimeout(): Long = 400L
override fun themeId(): Long = 1L override fun themeId(): Long = 1L
@ -57,6 +61,14 @@ class MockPreferencesRepository : IPreferencesRepository {
override fun showSupport(): Boolean = true override fun showSupport(): Boolean = true
override fun getTips(): Int = 0
override fun setTips(tips: Int) { }
override fun getExtraTips(): Int = 5
override fun setExtraTips(tips: Int) { }
override fun useFlagAssistant(): Boolean = false override fun useFlagAssistant(): Boolean = false
override fun useHapticFeedback(): Boolean = true override fun useHapticFeedback(): Boolean = true

View file

@ -48,7 +48,8 @@ class ThemeViewModelTest : IntentViewModelTest() {
toolbarMine = R.drawable.mine, toolbarMine = R.drawable.mine,
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red, mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed,
) )
) )
@ -81,7 +82,8 @@ class ThemeViewModelTest : IntentViewModelTest() {
toolbarMine = R.drawable.mine_low, toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_white, mineExploded = R.drawable.mine_exploded_white,
mineLow = R.drawable.mine_low mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed,
) )
) )
@ -114,7 +116,8 @@ class ThemeViewModelTest : IntentViewModelTest() {
toolbarMine = R.drawable.mine_low, toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_white, mineExploded = R.drawable.mine_exploded_white,
mineLow = R.drawable.mine_low mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed,
) )
) )

View file

@ -8,8 +8,8 @@ android {
defaultConfig { defaultConfig {
// versionCode and versionName must be hardcoded to support F-droid // versionCode and versionName must be hardcoded to support F-droid
versionCode 800111 versionCode 800101
versionName '8.0.11' versionName '8.1.0'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

View file

@ -212,6 +212,15 @@ class GameController {
} }
} }
fun revealRandomMine(): Boolean {
val result: Boolean
field = MinefieldHandler(field.toMutableList(), false).run {
result = revealRandomMine()
result()
}
return result
}
fun hasAnyMineExploded(): Boolean = mines().firstOrNull { it.mistake } != null fun hasAnyMineExploded(): Boolean = mines().firstOrNull { it.mistake } != null
fun hasFlaggedAllMines(): Boolean = rightFlags() == minefield.mines fun hasFlaggedAllMines(): Boolean = rightFlags() == minefield.mines

View file

@ -18,7 +18,7 @@ import dev.lucasnlm.antimine.common.level.database.models.Stats
Save::class, Save::class,
Stats::class Stats::class
], ],
version = 6, version = 7,
exportSchema = false exportSchema = false
) )
@TypeConverters( @TypeConverters(

View file

@ -5,9 +5,11 @@ import dev.lucasnlm.antimine.common.level.database.AppDataBase
import dev.lucasnlm.antimine.common.level.repository.IMinefieldRepository import dev.lucasnlm.antimine.common.level.repository.IMinefieldRepository
import dev.lucasnlm.antimine.common.level.repository.ISavesRepository import dev.lucasnlm.antimine.common.level.repository.ISavesRepository
import dev.lucasnlm.antimine.common.level.repository.IStatsRepository import dev.lucasnlm.antimine.common.level.repository.IStatsRepository
import dev.lucasnlm.antimine.common.level.repository.ITipRepository
import dev.lucasnlm.antimine.common.level.repository.MinefieldRepository import dev.lucasnlm.antimine.common.level.repository.MinefieldRepository
import dev.lucasnlm.antimine.common.level.repository.SavesRepository import dev.lucasnlm.antimine.common.level.repository.SavesRepository
import dev.lucasnlm.antimine.common.level.repository.StatsRepository import dev.lucasnlm.antimine.common.level.repository.StatsRepository
import dev.lucasnlm.antimine.common.level.repository.TipRepository
import dev.lucasnlm.antimine.common.level.utils.Clock import dev.lucasnlm.antimine.common.level.utils.Clock
import dev.lucasnlm.antimine.common.level.utils.HapticFeedbackManager import dev.lucasnlm.antimine.common.level.utils.HapticFeedbackManager
import dev.lucasnlm.antimine.common.level.utils.IHapticFeedbackManager import dev.lucasnlm.antimine.common.level.utils.IHapticFeedbackManager
@ -48,4 +50,8 @@ val LevelModule = module {
single { single {
HapticFeedbackManager(get()) HapticFeedbackManager(get())
} bind IHapticFeedbackManager::class } bind IHapticFeedbackManager::class
single {
TipRepository(get())
} bind ITipRepository::class
} }

View file

@ -22,6 +22,13 @@ class MinefieldHandler(
.forEach { field[it.id] = it.copy(isCovered = false) } .forEach { field[it.id] = it.copy(isCovered = false) }
} }
fun revealRandomMine(): Boolean {
return field.filter { it.hasMine && it.mark.isNone() && !it.revealed }.shuffled().firstOrNull()?.run {
field[this.id] = this.copy(revealed = true)
true
} ?: false
}
fun turnOffAllHighlighted() { fun turnOffAllHighlighted() {
field.filter { it.highlighted } field.filter { it.highlighted }
.forEach { field[it.id] = it.copy(highlighted = false) } .forEach { field[it.id] = it.copy(highlighted = false) }

View file

@ -10,4 +10,5 @@ data class Area(
val isCovered: Boolean = true, val isCovered: Boolean = true,
val mark: Mark = Mark.None, val mark: Mark = Mark.None,
val highlighted: Boolean = false, val highlighted: Boolean = false,
val revealed: Boolean = false,
) )

View file

@ -8,4 +8,6 @@ enum class Event {
Running, Running,
Victory, Victory,
GameOver, GameOver,
StartTutorial,
FinishTutorial,
} }

View file

@ -0,0 +1,50 @@
package dev.lucasnlm.antimine.common.level.repository
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
interface ITipRepository {
fun setExtraTips(amount: Int)
fun removeTip(): Boolean
fun increaseTip()
fun getTotalTips(): Int
}
class TipRepository(
private val preferencesRepository: IPreferencesRepository
) : ITipRepository {
override fun setExtraTips(amount: Int) {
preferencesRepository.setExtraTips(amount)
}
override fun removeTip(): Boolean {
val tips = preferencesRepository.getTips()
val extra = preferencesRepository.getExtraTips()
return when {
tips >= 1 -> {
preferencesRepository.setTips(tips - 1)
true
}
preferencesRepository.getExtraTips() >= 1 -> {
preferencesRepository.setExtraTips(extra - 1)
true
}
else -> {
false
}
}
}
override fun increaseTip() {
val newValue = (preferencesRepository.getTips() + 1).coerceAtMost(MAX_TIPS).coerceAtLeast(0)
preferencesRepository.setTips(newValue)
}
override fun getTotalTips(): Int {
return preferencesRepository.getExtraTips() + preferencesRepository.getTips()
}
companion object {
const val MAX_TIPS = 15
}
}

View file

@ -79,7 +79,21 @@ fun Area.paintOnCanvas(
) )
question?.draw(canvas) question?.draw(canvas)
} }
else -> {} else -> {
if (revealed) {
val padding = minePadding ?: context.resources.getDimension(R.dimen.mine_padding).toInt()
val revealedDrawable = ContextCompat.getDrawable(context, theme.assets.revealed)
revealedDrawable?.setBounds(
rectF.left.toInt() + padding,
rectF.top.toInt() + padding,
rectF.right.toInt() - padding,
rectF.bottom.toInt() - padding
)
revealedDrawable?.draw(canvas)
}
}
} }
} else { } else {
if (isAmbientMode) { if (isAmbientMode) {

View file

@ -1,11 +1,12 @@
package dev.lucasnlm.antimine.common.level.view package dev.lucasnlm.antimine.common.level.view
import android.content.Context import android.content.Context
import android.text.format.DateUtils import android.os.Bundle
import android.view.View import android.view.View
import androidx.annotation.LayoutRes import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.common.R
import dev.lucasnlm.antimine.common.level.models.Minefield import dev.lucasnlm.antimine.common.level.models.Minefield
import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
@ -23,6 +24,11 @@ abstract class CommonLevelFragment(@LayoutRes val contentLayoutId: Int) : Fragme
} }
protected lateinit var recyclerGrid: RecyclerView protected lateinit var recyclerGrid: RecyclerView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerGrid = view.findViewById(R.id.recyclerGrid)
}
private fun makeNewLayoutManager(boardWidth: Int) = private fun makeNewLayoutManager(boardWidth: Int) =
FixedGridLayoutManager().apply { FixedGridLayoutManager().apply {
setTotalColumnCount(boardWidth) setTotalColumnCount(boardWidth)
@ -35,12 +41,6 @@ abstract class CommonLevelFragment(@LayoutRes val contentLayoutId: Int) : Fragme
setPadding(horizontalPadding, verticalPadding, 0, 0) setPadding(horizontalPadding, verticalPadding, 0, 0)
layoutManager = makeNewLayoutManager(levelSetup.width) layoutManager = makeNewLayoutManager(levelSetup.width)
adapter = areaAdapter adapter = areaAdapter
alpha = 0.0f
animate().apply {
alpha(1.0f)
duration = DateUtils.SECOND_IN_MILLIS
}.start()
} }
} }

View file

@ -15,6 +15,7 @@ import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.repository.IMinefieldRepository import dev.lucasnlm.antimine.common.level.repository.IMinefieldRepository
import dev.lucasnlm.antimine.common.level.repository.ISavesRepository import dev.lucasnlm.antimine.common.level.repository.ISavesRepository
import dev.lucasnlm.antimine.common.level.repository.IStatsRepository import dev.lucasnlm.antimine.common.level.repository.IStatsRepository
import dev.lucasnlm.antimine.common.level.repository.ITipRepository
import dev.lucasnlm.antimine.common.level.utils.Clock import dev.lucasnlm.antimine.common.level.utils.Clock
import dev.lucasnlm.antimine.common.level.utils.IHapticFeedbackManager import dev.lucasnlm.antimine.common.level.utils.IHapticFeedbackManager
import dev.lucasnlm.antimine.core.analytics.IAnalyticsManager import dev.lucasnlm.antimine.core.analytics.IAnalyticsManager
@ -35,7 +36,7 @@ import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class GameViewModel( open class GameViewModel(
private val savesRepository: ISavesRepository, private val savesRepository: ISavesRepository,
private val statsRepository: IStatsRepository, private val statsRepository: IStatsRepository,
private val dimensionRepository: IDimensionRepository, private val dimensionRepository: IDimensionRepository,
@ -46,6 +47,7 @@ class GameViewModel(
private val minefieldRepository: IMinefieldRepository, private val minefieldRepository: IMinefieldRepository,
private val analyticsManager: IAnalyticsManager, private val analyticsManager: IAnalyticsManager,
private val playGamesManager: IPlayGamesManager, private val playGamesManager: IPlayGamesManager,
private val tipRepository: ITipRepository,
private val clock: Clock, private val clock: Clock,
) : ViewModel() { ) : ViewModel() {
val eventObserver = MutableLiveData<Event>() val eventObserver = MutableLiveData<Event>()
@ -62,6 +64,7 @@ class GameViewModel(
val difficulty = MutableLiveData<Difficulty>() val difficulty = MutableLiveData<Difficulty>()
val levelSetup = MutableLiveData<Minefield>() val levelSetup = MutableLiveData<Minefield>()
val saveId = MutableLiveData<Long>() val saveId = MutableLiveData<Long>()
val tips = MutableLiveData(tipRepository.getTotalTips())
fun startNewGame(newDifficulty: Difficulty = currentDifficulty): Minefield { fun startNewGame(newDifficulty: Difficulty = currentDifficulty): Minefield {
clock.reset() clock.reset()
@ -203,6 +206,11 @@ class GameViewModel(
} }
} }
suspend fun loadGame(): Minefield {
val currentLevelSetup = levelSetup.value
return currentLevelSetup ?: loadLastGame()
}
fun pauseGame() { fun pauseGame() {
if (initialized) { if (initialized) {
if (gameController.hasMines()) { if (gameController.hasMines()) {
@ -245,7 +253,7 @@ class GameViewModel(
} }
} }
suspend fun onLongClick(index: Int) { open suspend fun onLongClick(index: Int) {
gameController gameController
.longPress(index) .longPress(index)
.filterNotNull() .filterNotNull()
@ -260,7 +268,7 @@ class GameViewModel(
} }
} }
suspend fun onDoubleClick(index: Int) { open suspend fun onDoubleClick(index: Int) {
gameController gameController
.doubleClick(index) .doubleClick(index)
.filterNotNull() .filterNotNull()
@ -271,7 +279,7 @@ class GameViewModel(
} }
} }
suspend fun onSingleClick(index: Int) { open suspend fun onSingleClick(index: Int) {
gameController gameController
.singleClick(index) .singleClick(index)
.filterNotNull() .filterNotNull()
@ -354,7 +362,22 @@ class GameViewModel(
clock.stop() clock.stop()
} }
fun revealAllEmptyAreas() = gameController.revealAllEmptyAreas() fun showAllEmptyAreas() {
gameController.revealAllEmptyAreas()
}
fun revealRandomMine(): Boolean {
return if (gameController.revealRandomMine()) {
if (tipRepository.removeTip()) {
refreshField()
}
tips.postValue(tipRepository.getTotalTips())
true
} else {
false
}
}
fun explosionDelay() = if (preferencesRepository.useAnimations()) 750L else 0L fun explosionDelay() = if (preferencesRepository.useAnimations()) 750L else 0L
@ -403,6 +426,14 @@ class GameViewModel(
} }
} }
fun addNewTip() {
tipRepository.increaseTip()
}
fun getTips(): Int {
return tipRepository.getTotalTips()
}
fun victory() { fun victory() {
gameController.run { gameController.run {
analyticsManager.sentEvent( analyticsManager.sentEvent(

View file

@ -91,6 +91,10 @@ sealed class Analytics(
object OpenThemes : Analytics("Open Themes") object OpenThemes : Analytics("Open Themes")
object TutorialStarted : Analytics("Tutorial Started")
object TutorialCompleted : Analytics("Tutorial Completed")
object OpenAchievements : Analytics("Open Achievements") object OpenAchievements : Analytics("Open Achievements")
object OpenLeaderboards : Analytics("Open Leaderboards") object OpenLeaderboards : Analytics("Open Leaderboards")
@ -115,5 +119,7 @@ sealed class Analytics(
object TapRatingRequest : Analytics("Rating Request") object TapRatingRequest : Analytics("Rating Request")
object UseTip : Analytics("Use Tip")
class TapGameReset(resign: Boolean) : Analytics("Game reset", mapOf("Resign" to resign.toString())) class TapGameReset(resign: Boolean) : Analytics("Game reset", mapOf("Resign" to resign.toString()))
} }

View file

@ -16,6 +16,9 @@ interface IPreferencesRepository {
fun isFirstUse(): Boolean fun isFirstUse(): Boolean
fun completeFirstUse() fun completeFirstUse()
fun isTutorialCompleted(): Boolean
fun completeTutorial()
fun customLongPressTimeout(): Long fun customLongPressTimeout(): Long
fun themeId(): Long fun themeId(): Long
@ -40,6 +43,11 @@ interface IPreferencesRepository {
fun setShowSupport(show: Boolean) fun setShowSupport(show: Boolean)
fun showSupport(): Boolean fun showSupport(): Boolean
fun getTips(): Int
fun setTips(tips: Int)
fun getExtraTips(): Int
fun setExtraTips(tips: Int)
fun useFlagAssistant(): Boolean fun useFlagAssistant(): Boolean
fun useHapticFeedback(): Boolean fun useHapticFeedback(): Boolean
fun areaSizeMultiplier(): Int fun areaSizeMultiplier(): Int

View file

@ -77,6 +77,14 @@ class PreferencesRepository(
preferencesManager.putBoolean(PREFERENCE_FIRST_USE, false) preferencesManager.putBoolean(PREFERENCE_FIRST_USE, false)
} }
override fun isTutorialCompleted(): Boolean {
return preferencesManager.getBoolean(PREFERENCE_TUTORIAL_COMPLETED, false)
}
override fun completeTutorial() {
preferencesManager.putBoolean(PREFERENCE_TUTORIAL_COMPLETED, true)
}
override fun customLongPressTimeout(): Long = override fun customLongPressTimeout(): Long =
preferencesManager.getInt(PREFERENCE_LONG_PRESS_TIMEOUT, ViewConfiguration.getLongPressTimeout()).toLong() preferencesManager.getInt(PREFERENCE_LONG_PRESS_TIMEOUT, ViewConfiguration.getLongPressTimeout()).toLong()
@ -155,6 +163,10 @@ class PreferencesRepository(
if (!preferencesManager.contains(PREFERENCE_LONG_PRESS_TIMEOUT)) { if (!preferencesManager.contains(PREFERENCE_LONG_PRESS_TIMEOUT)) {
preferencesManager.putInt(PREFERENCE_LONG_PRESS_TIMEOUT, defaultLongPressTimeout) preferencesManager.putInt(PREFERENCE_LONG_PRESS_TIMEOUT, defaultLongPressTimeout)
} }
if (preferencesManager.contains(PREFERENCE_FIRST_USE)) {
preferencesManager.putBoolean(PREFERENCE_TUTORIAL_COMPLETED, true)
}
} }
override fun setPremiumFeatures(status: Boolean) { override fun setPremiumFeatures(status: Boolean) {
@ -174,6 +186,22 @@ class PreferencesRepository(
return preferencesManager.getBoolean(PREFERENCE_SHOW_SUPPORT, true) return preferencesManager.getBoolean(PREFERENCE_SHOW_SUPPORT, true)
} }
override fun getTips(): Int {
return preferencesManager.getInt(PREFERENCE_TIPS, 5)
}
override fun setTips(tips: Int) {
preferencesManager.putInt(PREFERENCE_TIPS, tips)
}
override fun getExtraTips(): Int {
return preferencesManager.getInt(PREFERENCE_EXTRA_TIPS, 0)
}
override fun setExtraTips(tips: Int) {
preferencesManager.putInt(PREFERENCE_EXTRA_TIPS, tips)
}
private companion object { private companion object {
private const val PREFERENCE_VIBRATION = "preference_vibration" private const val PREFERENCE_VIBRATION = "preference_vibration"
private const val PREFERENCE_ASSISTANT = "preference_assistant" private const val PREFERENCE_ASSISTANT = "preference_assistant"
@ -192,9 +220,12 @@ class PreferencesRepository(
private const val PREFERENCE_PROGRESSIVE_VALUE = "preference_progressive_value" private const val PREFERENCE_PROGRESSIVE_VALUE = "preference_progressive_value"
private const val PREFERENCE_LONG_PRESS_TIMEOUT = "preference_long_press_timeout" private const val PREFERENCE_LONG_PRESS_TIMEOUT = "preference_long_press_timeout"
private const val PREFERENCE_FIRST_USE = "preference_first_use" private const val PREFERENCE_FIRST_USE = "preference_first_use"
private const val PREFERENCE_TUTORIAL_COMPLETED = "preference_tutorial_completed"
private const val PREFERENCE_USE_COUNT = "preference_use_count" private const val PREFERENCE_USE_COUNT = "preference_use_count"
private const val PREFERENCE_REQUEST_RATING = "preference_request_rating" private const val PREFERENCE_REQUEST_RATING = "preference_request_rating"
private const val PREFERENCE_PREMIUM_FEATURES = "preference_premium_features" private const val PREFERENCE_PREMIUM_FEATURES = "preference_premium_features"
private const val PREFERENCE_SHOW_SUPPORT = "preference_show_support" private const val PREFERENCE_SHOW_SUPPORT = "preference_show_support"
private const val PREFERENCE_TIPS = "preference_current_tips"
private const val PREFERENCE_EXTRA_TIPS = "preference_extra_tips"
} }
} }

View file

@ -10,4 +10,5 @@ data class Assets(
@DrawableRes val mine: Int, @DrawableRes val mine: Int,
@DrawableRes val mineExploded: Int, @DrawableRes val mineExploded: Int,
@DrawableRes val mineLow: Int, @DrawableRes val mineLow: Int,
@DrawableRes val revealed: Int,
) )

View file

@ -58,7 +58,8 @@ class ThemeRepository(
toolbarMine = R.drawable.mine, toolbarMine = R.drawable.mine,
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red, mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed
) )
private fun fromDefaultPalette(context: Context) = private fun fromDefaultPalette(context: Context) =

View file

@ -36,6 +36,7 @@ object Themes {
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red, mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
) )
@ -69,6 +70,7 @@ object Themes {
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_white, mineExploded = R.drawable.mine_exploded_white,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
) )
@ -102,6 +104,7 @@ object Themes {
mine = R.drawable.mine_low, mine = R.drawable.mine_low,
mineExploded = R.drawable.mine_low, mineExploded = R.drawable.mine_low,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
) )
@ -139,6 +142,7 @@ object Themes {
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_white, mineExploded = R.drawable.mine_exploded_white,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -171,6 +175,7 @@ object Themes {
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red, mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -203,6 +208,7 @@ object Themes {
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red, mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -235,6 +241,7 @@ object Themes {
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red, mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -267,6 +274,7 @@ object Themes {
mine = R.drawable.mine_white, mine = R.drawable.mine_white,
mineExploded = R.drawable.mine_white, mineExploded = R.drawable.mine_white,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
) )
), ),
AppTheme( AppTheme(
@ -299,6 +307,7 @@ object Themes {
mine = R.drawable.mine_pink, mine = R.drawable.mine_pink,
mineExploded = R.drawable.mine_pink_exploded, mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -331,6 +340,7 @@ object Themes {
mine = R.drawable.mine_pink, mine = R.drawable.mine_pink,
mineExploded = R.drawable.mine_pink_exploded, mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -362,7 +372,8 @@ object Themes {
toolbarMine = R.drawable.mine_low, toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_pink_exploded, mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -394,7 +405,8 @@ object Themes {
toolbarMine = R.drawable.mine_low, toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_pink_exploded, mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -427,6 +439,7 @@ object Themes {
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_pink_exploded, mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -458,7 +471,8 @@ object Themes {
toolbarMine = R.drawable.mine_low, toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_pink_exploded, mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
) )
), ),
AppTheme( AppTheme(
@ -491,6 +505,7 @@ object Themes {
mine = R.drawable.mine_white, mine = R.drawable.mine_white,
mineExploded = R.drawable.mine_white, mineExploded = R.drawable.mine_white,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
) )
), ),
AppTheme( AppTheme(
@ -522,7 +537,8 @@ object Themes {
toolbarMine = R.drawable.mine_low, toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine_white, mine = R.drawable.mine_white,
mineExploded = R.drawable.mine_white, mineExploded = R.drawable.mine_white,
mineLow = R.drawable.mine_low mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
) )
), ),
AppTheme( AppTheme(
@ -555,6 +571,7 @@ object Themes {
mine = R.drawable.mine_white, mine = R.drawable.mine_white,
mineExploded = R.drawable.mine_white, mineExploded = R.drawable.mine_white,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
) )
), ),
AppTheme( AppTheme(
@ -587,6 +604,7 @@ object Themes {
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red, mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
) )
), ),
AppTheme( AppTheme(
@ -619,6 +637,7 @@ object Themes {
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red, mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
) )
), ),
AppTheme( AppTheme(
@ -645,12 +664,13 @@ object Themes {
), ),
assets = Assets( assets = Assets(
wrongFlag = R.drawable.red_flag, wrongFlag = R.drawable.red_flag,
flag = R.drawable.flag, flag = R.drawable.flag_black,
questionMark = R.drawable.question, questionMark = R.drawable.question,
toolbarMine = R.drawable.mine, toolbarMine = R.drawable.mine,
mine = R.drawable.mine, mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red, mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low, mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
) )
) )
) )

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#33000000"
android:pathData="M331.722,124.091l-33.743,-67.204l-83.901,0l-33.84,65.28l-80.22,0l-37.443,65.714l37.443,67.649l-37.443,66.12l37.42,67.746l80.243,0l39.239,65.717l75.084,0l37.161,-66.643l79.759,-0.019l37.942,-66.801l-40.501,-65.64l40.501,-68.129l-38.02,-63.79z" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#33ffffff"
android:pathData="M331.722,124.091l-33.743,-67.204l-83.901,0l-33.84,65.28l-80.22,0l-37.443,65.714l37.443,67.649l-37.443,66.12l37.42,67.746l80.243,0l39.239,65.717l75.084,0l37.161,-66.643l79.759,-0.019l37.942,-66.801l-40.501,-65.64l40.501,-68.129l-38.02,-63.79z" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#33000000"
android:pathData="M331.722,124.091l-33.743,-67.204l-83.901,0l-33.84,65.28l-80.22,0l-37.443,65.714l37.443,67.649l-37.443,66.12l37.42,67.746l80.243,0l39.239,65.717l75.084,0l37.161,-66.643l79.759,-0.019l37.942,-66.801l-40.501,-65.64l40.501,-68.129l-38.02,-63.79z" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#33ffffff"
android:pathData="M331.722,124.091l-33.743,-67.204l-83.901,0l-33.84,65.28l-80.22,0l-37.443,65.714l37.443,67.649l-37.443,66.12l37.42,67.746l80.243,0l39.239,65.717l75.084,0l37.161,-66.643l79.759,-0.019l37.942,-66.801l-40.501,-65.64l40.501,-68.129l-38.02,-63.79z" />
</vector>

View file

@ -13,7 +13,6 @@
android:fadeScrollbars="true" android:fadeScrollbars="true"
android:overScrollMode="never" android:overScrollMode="never"
android:padding="78dp" android:padding="78dp"
android:scrollbars="none" android:scrollbars="none" />
android:alpha="0" />
</FrameLayout> </FrameLayout>

View file

@ -15,7 +15,6 @@
android:fadeScrollbars="true" android:fadeScrollbars="true"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:overScrollMode="never" android:overScrollMode="never"
android:scrollbars="none" android:scrollbars="none" />
android:alpha="0" />
</FrameLayout> </FrameLayout>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="af"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="af">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Verwyder versteekte myne van \'n mynveld.</string> <string name="app_description">Verwyder versteekte myne van \'n mynveld.</string>
<string name="tutorial">Handleiding</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Speletjies</string> <string name="games">Speletjies</string>
<string name="previous_games">Vorige Speletjies</string> <string name="previous_games">Vorige Speletjies</string>
<string name="minefield">Moeilikheidsgraad</string> <string name="minefield">Moeilikheidsgraad</string>
@ -21,20 +34,20 @@
<string name="height">Hoogte</string> <string name="height">Hoogte</string>
<string name="mines">Myne</string> <string name="mines">Myne</string>
<string name="retry_sure">Wil u \'n nuwe spel begin met hierdie kaart?</string> <string name="retry_sure">Wil u \'n nuwe spel begin met hierdie kaart?</string>
<string name="show_licenses">Show Licenses</string> <string name="show_licenses">Wys lisensies</string>
<string name="new_game_request">Wil u \'n nuwe spel begin met hierdie kaart?</string> <string name="new_game_request">Wil u \'n nuwe spel begin met hierdie kaart?</string>
<string name="mines_remaining">%d myne</string> <string name="mines_remaining">%d myne</string>
<string name="game_time">Game Time</string> <string name="game_time">Speeltyd</string>
<string name="mine">Myne</string> <string name="mine">Myne</string>
<string name="settings_general">Algemeen</string> <string name="settings_general">Algemeen</string>
<string name="settings_gameplay">Gameplay</string> <string name="settings_gameplay">Spel</string>
<string name="settings_accessibility">Toeganklikheid</string> <string name="settings_accessibility">Toeganklikheid</string>
<string name="size">Grootte</string> <string name="size">Grootte</string>
<string name="system">Stelsel</string> <string name="system">Stelsel</string>
<string name="rating">Terugvoer</string> <string name="rating">Terugvoer</string>
<string name="support_title">Ondersteun ons!</string> <string name="support_title">Ondersteun ons!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string> <string name="support_description">Met u hulp kan ons nuwe funksies implementeer en ons projek aktief hou.</string>
<string name="support_action">To support</string> <string name="support_action">Ondersteuning</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string> <string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</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="translators_text">This game was translated by the following people:</string>
@ -43,11 +56,11 @@
<string name="victories">Oorwinnings</string> <string name="victories">Oorwinnings</string>
<string name="you_lost">Jy het verloor!</string> <string name="you_lost">Jy het verloor!</string>
<string name="defeats">Nederlae</string> <string name="defeats">Nederlae</string>
<string name="game_over_desc_1">Good luck on your next game.</string> <string name="game_over_desc_1">Sterkte met u volgende wedstryd.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string> <string name="game_over_desc_4">U het die wedstryd binne %1$d sekondes voltooi.</string>
<string name="fail_to_share">Failed to share</string> <string name="fail_to_share">Kon nie deel nie</string>
<string name="version_s">Weergawe %1$s</string> <string name="version_s">Weergawe %1$s</string>
<string name="sound_effects">Sound Effects</string> <string name="sound_effects">Byklanke</string>
<string name="are_you_sure">Is jy seker?</string> <string name="are_you_sure">Is jy seker?</string>
<string name="enable_automatic_flags">Aktiveer outomatiese plasing van vlaggies</string> <string name="enable_automatic_flags">Aktiveer outomatiese plasing van vlaggies</string>
<string name="open_areas">Open Areas</string> <string name="open_areas">Open Areas</string>
@ -55,16 +68,19 @@
<string name="average_time">Average Time</string> <string name="average_time">Average Time</string>
<string name="performance">Werkverrigting</string> <string name="performance">Werkverrigting</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string> <string name="use_question_mark">Gebruik die vraagteken</string>
<string name="control">Kontrole</string> <string name="control">Kontrole</string>
<string name="arrow"></string> <string name="arrow"></string>
<string name="single_click">Single Click</string> <string name="single_click">Enkele tik</string>
<string name="double_click">Double Click</string> <string name="double_click">Dubbeltik</string>
<string name="long_press">Lang-druk</string> <string name="long_press">Lang-druk</string>
<string name="open_tile">Maak oop</string> <string name="open_tile">Maak oop</string>
<string name="flag_tile">Merk</string> <string name="flag_tile">Merk</string>
<string name="retry">Weer probeer</string> <string name="retry">Weer probeer</string>
<string name="empty">Leeg</string> <string name="empty">Leeg</string>
<string name="cant_do_it_now">Onmoontlik om dit nou te doen</string>
<string name="you_have_received">U het ontvang: +%1$d</string>
<string name="help_win_a_game">Vir meer hulp, moet u \'n wedstryd wen.</string>
<string name="unknown_error">Onbekende fout.</string> <string name="unknown_error">Onbekende fout.</string>
<string name="leaderboards">Leierbord</string> <string name="leaderboards">Leierbord</string>
<string name="cancel">Kanselleer</string> <string name="cancel">Kanselleer</string>
@ -72,7 +88,7 @@
<string name="yes">Ja</string> <string name="yes">Ja</string>
<string name="unlock">Ontsluit</string> <string name="unlock">Ontsluit</string>
<string name="achievements">Prestasies</string> <string name="achievements">Prestasies</string>
<string name="rating_button_no">Nee</string> <string name="no">Nee</string>
<string name="general">Algemeen</string> <string name="general">Algemeen</string>
<string name="source_code">Bron Kode</string> <string name="source_code">Bron Kode</string>
<string name="translation">Vertalings</string> <string name="translation">Vertalings</string>
@ -91,7 +107,7 @@
<string name="delete_all">Verwyder alles</string> <string name="delete_all">Verwyder alles</string>
<string name="themes">Temas</string> <string name="themes">Temas</string>
<string name="try_it">Încearcă</string> <string name="try_it">Încearcă</string>
<string name="delete_all_message">Delete all events permanently.</string> <string name="delete_all_message">Vee alle gebeure permanent uit.</string>
<string name="all_mines_disabled">All mines were disabled.</string> <string name="all_mines_disabled">All mines were disabled.</string>
<string name="desc_convered_area">Covered area</string> <string name="desc_convered_area">Covered area</string>
<string name="desc_marked_area">Marked area</string> <string name="desc_marked_area">Marked area</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string> <string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string> <string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Verwyder Advertensies</string> <string name="remove_ad">Verwyder Advertensies</string>
<string name="help">Help</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ar"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ar">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">يجب عليك مسح لوحة مستطيلة تحتوي على ألغام مخفية دون تفجير أي منها.</string> <string name="app_description">يجب عليك مسح لوحة مستطيلة تحتوي على ألغام مخفية دون تفجير أي منها.</string>
<string name="tutorial">الدورة التعليمية</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">ألعاب</string> <string name="games">ألعاب</string>
<string name="previous_games">الألعاب السابقة</string> <string name="previous_games">الألعاب السابقة</string>
<string name="minefield">الصعوبة</string> <string name="minefield">الصعوبة</string>
@ -65,6 +78,9 @@
<string name="flag_tile">علم</string> <string name="flag_tile">علم</string>
<string name="retry">إعادة المحاولة</string> <string name="retry">إعادة المحاولة</string>
<string name="empty">فارغ</string> <string name="empty">فارغ</string>
<string name="cant_do_it_now">من المستحيل القيام بذلك الآن</string>
<string name="you_have_received">لقد استملت مبلغ: +%1$d</string>
<string name="help_win_a_game">للمزيد من المساعدة، يجب أن تفوز بلعبة.</string>
<string name="unknown_error">خطأ غير معروف.</string> <string name="unknown_error">خطأ غير معروف.</string>
<string name="leaderboards">المتصدرين</string> <string name="leaderboards">المتصدرين</string>
<string name="cancel">الغاء</string> <string name="cancel">الغاء</string>
@ -72,7 +88,7 @@
<string name="yes">نعم</string> <string name="yes">نعم</string>
<string name="unlock">فتح القفل</string> <string name="unlock">فتح القفل</string>
<string name="achievements">الإنجازات</string> <string name="achievements">الإنجازات</string>
<string name="rating_button_no">لا</string> <string name="no">لا</string>
<string name="general">عام</string> <string name="general">عام</string>
<string name="source_code">رمز المصدر</string> <string name="source_code">رمز المصدر</string>
<string name="translation">الترجمة</string> <string name="translation">الترجمة</string>
@ -103,4 +119,5 @@
<string name="flag_placed">وضع العلم!</string> <string name="flag_placed">وضع العلم!</string>
<string name="flag_removed">إزالة العلم!</string> <string name="flag_removed">إزالة العلم!</string>
<string name="remove_ad">إزالة الإعلانات</string> <string name="remove_ad">إزالة الإعلانات</string>
<string name="help">مساعدة</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="bg"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="bg">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Вие трябва да изчистите квадратна дъска която има скрити мини без да взривите нито една от тях.</string> <string name="app_description">Вие трябва да изчистите квадратна дъска която има скрити мини без да взривите нито една от тях.</string>
<string name="tutorial">Туториал</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Игри</string> <string name="games">Игри</string>
<string name="previous_games">Предишни Игри</string> <string name="previous_games">Предишни Игри</string>
<string name="minefield">Трудност</string> <string name="minefield">Трудност</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Флаг</string> <string name="flag_tile">Флаг</string>
<string name="retry">Опитайте отново</string> <string name="retry">Опитайте отново</string>
<string name="empty">Празно</string> <string name="empty">Празно</string>
<string name="cant_do_it_now">Невъзможно е да се направи това сега</string>
<string name="you_have_received">Получихте: +%1$d</string>
<string name="help_win_a_game">За повече помощ трябва да спечелите игра.</string>
<string name="unknown_error">Неизвестна грешка.</string> <string name="unknown_error">Неизвестна грешка.</string>
<string name="leaderboards">Класиране</string> <string name="leaderboards">Класиране</string>
<string name="cancel">Отказ</string> <string name="cancel">Отказ</string>
@ -72,7 +88,7 @@
<string name="yes">Да</string> <string name="yes">Да</string>
<string name="unlock">Отключи</string> <string name="unlock">Отключи</string>
<string name="achievements">Постижения</string> <string name="achievements">Постижения</string>
<string name="rating_button_no">Не</string> <string name="no">Не</string>
<string name="general">Основни</string> <string name="general">Основни</string>
<string name="source_code">Програмен Код</string> <string name="source_code">Програмен Код</string>
<string name="translation">Превод</string> <string name="translation">Превод</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Флагът е сложен!</string> <string name="flag_placed">Флагът е сложен!</string>
<string name="flag_removed">Глагът е премахнат!</string> <string name="flag_removed">Глагът е премахнат!</string>
<string name="remove_ad">Премахване на реклами</string> <string name="remove_ad">Премахване на реклами</string>
<string name="help">Помощ</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ca"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ca">
<string name="app_name">Antimines</string> <string name="app_name">Antimines</string>
<string name="app_description">Has de netejar un tauler rectangular amb mines amagades sense detonar-ne cap.</string> <string name="app_description">Has de netejar un tauler rectangular amb mines amagades sense detonar-ne cap.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Jocs</string> <string name="games">Jocs</string>
<string name="previous_games">Partides prèvies</string> <string name="previous_games">Partides prèvies</string>
<string name="minefield">Camp de mines</string> <string name="minefield">Camp de mines</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bandera</string> <string name="flag_tile">Bandera</string>
<string name="retry">Reintenta</string> <string name="retry">Reintenta</string>
<string name="empty">Buida</string> <string name="empty">Buida</string>
<string name="cant_do_it_now">És impossible fer-ho ara</string>
<string name="you_have_received">Heu rebut: +%1$d</string>
<string name="help_win_a_game">Per obtenir més ajuda, heu de guanyar una partida.</string>
<string name="unknown_error">Error desconegut.</string> <string name="unknown_error">Error desconegut.</string>
<string name="leaderboards">Llista de líders</string> <string name="leaderboards">Llista de líders</string>
<string name="cancel">Cancel•lar</string> <string name="cancel">Cancel•lar</string>
@ -72,7 +88,7 @@
<string name="yes"></string> <string name="yes"></string>
<string name="unlock">Desbloqueja</string> <string name="unlock">Desbloqueja</string>
<string name="achievements">Assoliments</string> <string name="achievements">Assoliments</string>
<string name="rating_button_no">No</string> <string name="no">No</string>
<string name="general">General</string> <string name="general">General</string>
<string name="source_code">Codi font</string> <string name="source_code">Codi font</string>
<string name="translation">Traduccions</string> <string name="translation">Traduccions</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bandera col·locada!</string> <string name="flag_placed">Bandera col·locada!</string>
<string name="flag_removed">Has tret la bandera!</string> <string name="flag_removed">Has tret la bandera!</string>
<string name="remove_ad">Elimina els anuncis</string> <string name="remove_ad">Elimina els anuncis</string>
<string name="help">Ajuda</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="cs"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="cs">
<string name="app_name">Anti-Mine</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="app_description">Musíte vyčistit obdélníkovou desku obsahující skryté miny, aniž by kterákoliv z nich vybuchla.</string>
<string name="tutorial">Tutoriál</string>
<string name="tutorial_completed">Tutoriál dokončen</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Hry</string> <string name="games">Hry</string>
<string name="previous_games">Předchozí hry</string> <string name="previous_games">Předchozí hry</string>
<string name="minefield">Obtížnost</string> <string name="minefield">Obtížnost</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Vlajka</string> <string name="flag_tile">Vlajka</string>
<string name="retry">Opakovat</string> <string name="retry">Opakovat</string>
<string name="empty">Prázdné</string> <string name="empty">Prázdné</string>
<string name="cant_do_it_now">Není možné to nyní udělat</string>
<string name="you_have_received">Obdrželi jste: +%1$d</string>
<string name="help_win_a_game">Pro další pomoc musíte vyhrát hru.</string>
<string name="unknown_error">Neznámá chyba.</string> <string name="unknown_error">Neznámá chyba.</string>
<string name="leaderboards">Žebříčky</string> <string name="leaderboards">Žebříčky</string>
<string name="cancel">Zrušit</string> <string name="cancel">Zrušit</string>
@ -72,7 +88,7 @@
<string name="yes">Ano</string> <string name="yes">Ano</string>
<string name="unlock">Odemknout</string> <string name="unlock">Odemknout</string>
<string name="achievements">Úspěchy</string> <string name="achievements">Úspěchy</string>
<string name="rating_button_no">Ne</string> <string name="no">Ne</string>
<string name="general">Obecné</string> <string name="general">Obecné</string>
<string name="source_code">Zdrojový kód</string> <string name="source_code">Zdrojový kód</string>
<string name="translation">Překlad</string> <string name="translation">Překlad</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Vlajka umístěna!</string> <string name="flag_placed">Vlajka umístěna!</string>
<string name="flag_removed">Vlajka odstraněna!</string> <string name="flag_removed">Vlajka odstraněna!</string>
<string name="remove_ad">Odstranit reklamy</string> <string name="remove_ad">Odstranit reklamy</string>
<string name="help">Nápověda</string>
</resources> </resources>

View file

@ -2,97 +2,113 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="da"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="da">
<string name="app_name">Antimine</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="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="games">Games</string> <string name="tutorial">Vejledning</string>
<string name="previous_games">Previous Games</string> <string name="tutorial_completed">Tutorial Completed</string>
<string name="minefield">Difficulty</string> <string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Spil</string>
<string name="previous_games">Forrige Spil</string>
<string name="minefield">Sværhedsgrad</string>
<string name="standard">Standard</string> <string name="standard">Standard</string>
<string name="beginner">Beginner</string> <string name="beginner">Begynder</string>
<string name="intermediate">Intermediate</string> <string name="intermediate">Mellemliggende</string>
<string name="expert">Expert</string> <string name="expert">Ekspert</string>
<string name="open">Open</string> <string name="open">Åbn</string>
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="animations">Animations</string> <string name="animations">Animationer</string>
<string name="vibration">Haptic Feedback</string> <string name="vibration">Haptisk Feedback</string>
<string name="about">About</string> <string name="about">Om</string>
<string name="events">Statistics</string> <string name="events">Statistik</string>
<string name="custom">Custom</string> <string name="custom">Tilpasset</string>
<string name="start">Start</string> <string name="start">Start</string>
<string name="width">Width</string> <string name="width">Bredde</string>
<string name="height">Height</string> <string name="height">Højde</string>
<string name="mines">Mines</string> <string name="mines">Mines</string>
<string name="retry_sure">If you start a new game, your current progress will be lost.</string> <string name="retry_sure">Hvis du starter et nyt spil, vil dit nuværende fremskridt gå tabt.</string>
<string name="show_licenses">Show Licenses</string> <string name="show_licenses">Vis Licenser</string>
<string name="new_game_request">Do you want to start a new game?</string> <string name="new_game_request">Vil du starte et nyt spil?</string>
<string name="mines_remaining">%d mines</string> <string name="mines_remaining">%d miner</string>
<string name="game_time">Game Time</string> <string name="game_time">Spil Tid</string>
<string name="mine">Mine</string> <string name="mine">Mine</string>
<string name="settings_general">General</string> <string name="settings_general">Generelt</string>
<string name="settings_gameplay">Gameplay</string> <string name="settings_gameplay">Gameplay</string>
<string name="settings_accessibility">Accessibility</string> <string name="settings_accessibility">Tilgængelighed</string>
<string name="size">Size</string> <string name="size">Størrelse</string>
<string name="system">System</string> <string name="system">System</string>
<string name="rating">Feedback</string> <string name="rating">Tilbagemelding</string>
<string name="support_title">Support us!</string> <string name="support_title">Støt os!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string> <string name="support_description">Med din hjælp vil vi være i stand til at implementere nye funktioner og holde vores projekt aktivt.</string>
<string name="support_action">To support</string> <string name="support_action">Støtte</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string> <string name="rating_message">Hvis du kan lide dette spil, bedes du give os en feedback. Det vil hjælpe os meget.</string>
<string name="used_software_text">This game uses the following third parties software:</string> <string name="used_software_text">Dette spil bruger følgende tredjepartssoftware:</string>
<string name="translators_text">This game was translated by the following people:</string> <string name="translators_text">Dette spil blev oversat af følgende personer:</string>
<string name="sign_in_failed">Failed to sign in. Please check your network connection and try again.</string> <string name="sign_in_failed">Kan ikke forbinde. Tjek venligst din netværksforbindelse, og prøv igen.</string>
<string name="you_won">You won!</string> <string name="you_won">Du vandt!</string>
<string name="victories">Victories</string> <string name="victories">Sejre</string>
<string name="you_lost">You lost!</string> <string name="you_lost">Du tabte!</string>
<string name="defeats">Defeats</string> <string name="defeats">Nederlag</string>
<string name="game_over_desc_1">Good luck on your next game.</string> <string name="game_over_desc_1">Held og lykke med dit næste spil.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string> <string name="game_over_desc_4">Du færdiggjorde minefeltet om %1$d sekunder.</string>
<string name="fail_to_share">Failed to share</string> <string name="fail_to_share">Mislykkedes at dele</string>
<string name="version_s">Version %1$s</string> <string name="version_s">Version %1$s</string>
<string name="sound_effects">Sound Effects</string> <string name="sound_effects">Lyd effekter</string>
<string name="are_you_sure">Are you sure?</string> <string name="are_you_sure">Er du sikker?</string>
<string name="enable_automatic_flags">Enable automatic placing of flags</string> <string name="enable_automatic_flags">Aktivér automatisk placering af flag</string>
<string name="open_areas">Open Areas</string> <string name="open_areas">Åbne Områder</string>
<string name="total_time">Total Time</string> <string name="total_time">Total Tid</string>
<string name="average_time">Average Time</string> <string name="average_time">Gennemsnitlig Tid</string>
<string name="performance">Performance</string> <string name="performance">Ydeevne</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string> <string name="use_question_mark">Brug flag med spørgsmålstegn</string>
<string name="control">Controls</string> <string name="control">Controls</string>
<string name="arrow"></string> <string name="arrow"></string>
<string name="single_click">Single Click</string> <string name="single_click">Enkelt tryk</string>
<string name="double_click">Double Click</string> <string name="double_click">Dobbeltklik</string>
<string name="long_press">Long Press</string> <string name="long_press">Langt tryk</string>
<string name="open_tile">Open</string> <string name="open_tile">Åbn</string>
<string name="flag_tile">Flag</string> <string name="flag_tile">Flag</string>
<string name="retry">Retry</string> <string name="retry">Forsøg igen</string>
<string name="empty">Empty</string> <string name="empty">Tomt</string>
<string name="unknown_error">Unknown error.</string> <string name="cant_do_it_now">Umuligt at gøre det nu</string>
<string name="leaderboards">Leaderboards</string> <string name="you_have_received">Du har modtaget: +%1$d</string>
<string name="cancel">Cancel</string> <string name="help_win_a_game">For mere hjælp, skal du vinde et spil.</string>
<string name="resume">Resume</string> <string name="unknown_error">Ukendt fejl.</string>
<string name="yes">Yes</string> <string name="leaderboards">Turneringsskema</string>
<string name="unlock">Unlock</string> <string name="cancel">Annuller</string>
<string name="resume">Fortsæt</string>
<string name="yes">Ja</string>
<string name="unlock">Lås op</string>
<string name="achievements">Achievements</string> <string name="achievements">Achievements</string>
<string name="rating_button_no">No</string> <string name="no">Nej</string>
<string name="general">General</string> <string name="general">Generelt</string>
<string name="source_code">Source Code</string> <string name="source_code">Kildekode</string>
<string name="translation">Translation</string> <string name="translation">Oversættelser</string>
<string name="licenses">Licenses</string> <string name="licenses">Licenser</string>
<string name="google_play_games">Google Play Games</string> <string name="google_play_games">Google Play Spil</string>
<string name="connect">Connect</string> <string name="connect">Tilslut</string>
<string name="connecting">Connecting</string> <string name="connecting">Tilslutter</string>
<string name="disconnect">Disconnect</string> <string name="disconnect">Afbryd</string>
<string name="disconnected">Disconnected</string> <string name="disconnected">Afbrudt</string>
<string name="new_game">New Game</string> <string name="new_game">Nyt Spil</string>
<string name="share">Share</string> <string name="share">Del</string>
<string name="share_menu">Share</string> <string name="share_menu">Del</string>
<string name="no_network">No internet connection.</string> <string name="no_network">Ingen internetforbindelse.</string>
<string name="open_menu">Open Menu</string> <string name="open_menu">Åbn Menu</string>
<string name="close_menu">Close Menu</string> <string name="close_menu">Luk Menu</string>
<string name="delete_all">Delete all</string> <string name="delete_all">Slet alle</string>
<string name="themes">Themes</string> <string name="themes">Temaer</string>
<string name="try_it">Try It</string> <string name="try_it">Prøv det</string>
<string name="delete_all_message">Delete all events permanently.</string> <string name="delete_all_message">Slet alle begivenheder permanent.</string>
<string name="all_mines_disabled">All mines were disabled.</string> <string name="all_mines_disabled">Alle miner blev deaktiveret.</string>
<string name="desc_convered_area">Covered area</string> <string name="desc_convered_area">Covered area</string>
<string name="desc_marked_area">Marked area</string> <string name="desc_marked_area">Marked area</string>
<string name="desc_question_area">Doubtful area</string> <string name="desc_question_area">Doubtful area</string>
@ -102,5 +118,6 @@
<string name="you_exploded_a_mine">You exploded a mine!</string> <string name="you_exploded_a_mine">You exploded a mine!</string>
<string name="flag_placed">Flag placed!</string> <string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string> <string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string> <string name="remove_ad">Fjern annoncer</string>
<string name="help">Hjælp</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="de"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="de">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Du musst ein rechteckiges Spielfeld, das versteckte Minen enthält, räumen, ohne irgendeine davon zur Explosion zu bringen.</string> <string name="app_description">Du musst ein rechteckiges Spielfeld, das versteckte Minen enthält, räumen, ohne irgendeine davon zur Explosion zu bringen.</string>
<string name="tutorial">Anleitung</string>
<string name="tutorial_completed">Anleitung Abgeschlossen</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Spiele</string> <string name="games">Spiele</string>
<string name="previous_games">Vorherige Spiele</string> <string name="previous_games">Vorherige Spiele</string>
<string name="minefield">Schwierigkeitsgrad</string> <string name="minefield">Schwierigkeitsgrad</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flagge</string> <string name="flag_tile">Flagge</string>
<string name="retry">Erneut versuchen</string> <string name="retry">Erneut versuchen</string>
<string name="empty">Leer</string> <string name="empty">Leer</string>
<string name="cant_do_it_now">Das kann jetzt nicht gemacht werden</string>
<string name="you_have_received">Du hast erhalten: +%1$d</string>
<string name="help_win_a_game">Für mehr Hilfe musst du ein Spiel gewinnen.</string>
<string name="unknown_error">Unbekannter Fehler.</string> <string name="unknown_error">Unbekannter Fehler.</string>
<string name="leaderboards">Ranglisten</string> <string name="leaderboards">Ranglisten</string>
<string name="cancel">Abbrechen</string> <string name="cancel">Abbrechen</string>
@ -72,7 +88,7 @@
<string name="yes">Ja</string> <string name="yes">Ja</string>
<string name="unlock">Entsperren</string> <string name="unlock">Entsperren</string>
<string name="achievements">Erfolge</string> <string name="achievements">Erfolge</string>
<string name="rating_button_no">Nein</string> <string name="no">Nein</string>
<string name="general">Allgemein</string> <string name="general">Allgemein</string>
<string name="source_code">Quellcode</string> <string name="source_code">Quellcode</string>
<string name="translation">Übersetzung</string> <string name="translation">Übersetzung</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Markierung platziert!</string> <string name="flag_placed">Markierung platziert!</string>
<string name="flag_removed">Markierung entfernt!</string> <string name="flag_removed">Markierung entfernt!</string>
<string name="remove_ad">Werbung entfernen</string> <string name="remove_ad">Werbung entfernen</string>
<string name="help">Hilfe</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="el"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="el">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Πρέπει να καθαρίσετε μια ορθογώνια πλακέτα που περιέχει κρυμμένες \"νάρκες\" χωρίς να πυροδοτήσετε καμία από αυτές.</string> <string name="app_description">Πρέπει να καθαρίσετε μια ορθογώνια πλακέτα που περιέχει κρυμμένες \"νάρκες\" χωρίς να πυροδοτήσετε καμία από αυτές.</string>
<string name="tutorial">Οδηγίες</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Παιχνίδια</string> <string name="games">Παιχνίδια</string>
<string name="previous_games">Προηγούμενα Παιχνίδια</string> <string name="previous_games">Προηγούμενα Παιχνίδια</string>
<string name="minefield">Δυσκολία</string> <string name="minefield">Δυσκολία</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Σημαία</string> <string name="flag_tile">Σημαία</string>
<string name="retry">Ξαναδοκιμάστε</string> <string name="retry">Ξαναδοκιμάστε</string>
<string name="empty">Κενό</string> <string name="empty">Κενό</string>
<string name="cant_do_it_now">Αδύνατο να το κάνουμε τώρα</string>
<string name="you_have_received">Εχεις λάβει: +%1$d</string>
<string name="help_win_a_game">Για περισσότερη βοήθεια, πρέπει να κερδίσετε ένα παιχνίδι.</string>
<string name="unknown_error">Άγνωστο σφάλμα.</string> <string name="unknown_error">Άγνωστο σφάλμα.</string>
<string name="leaderboards">Πίνακες κατάταξης</string> <string name="leaderboards">Πίνακες κατάταξης</string>
<string name="cancel">Ακύρωση</string> <string name="cancel">Ακύρωση</string>
@ -72,7 +88,7 @@
<string name="yes">Ναι</string> <string name="yes">Ναι</string>
<string name="unlock">Ξεκλείδωμα</string> <string name="unlock">Ξεκλείδωμα</string>
<string name="achievements">Επιτεύγματα</string> <string name="achievements">Επιτεύγματα</string>
<string name="rating_button_no">Όχι</string> <string name="no">Όχι</string>
<string name="general">Γενικά</string> <string name="general">Γενικά</string>
<string name="source_code">Πηγαίος Κώδικας</string> <string name="source_code">Πηγαίος Κώδικας</string>
<string name="translation">Μετάφραση</string> <string name="translation">Μετάφραση</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Η Σημαία τοποθετήθηκε!</string> <string name="flag_placed">Η Σημαία τοποθετήθηκε!</string>
<string name="flag_removed">Η σημαία αφαιρέθηκε!</string> <string name="flag_removed">Η σημαία αφαιρέθηκε!</string>
<string name="remove_ad">Κατάργηση διαφημίσεων</string> <string name="remove_ad">Κατάργηση διαφημίσεων</string>
<string name="help">Βοήθεια</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
<string name="app_name">Antimine</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="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string> <string name="games">Games</string>
<string name="previous_games">Previous Games</string> <string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string> <string name="minefield">Difficulty</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flag</string> <string name="flag_tile">Flag</string>
<string name="retry">Retry</string> <string name="retry">Retry</string>
<string name="empty">Empty</string> <string name="empty">Empty</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: %1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">Unknown error.</string> <string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string> <string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string> <string name="cancel">Cancel</string>
@ -72,7 +88,7 @@
<string name="yes">Yes</string> <string name="yes">Yes</string>
<string name="unlock">Unlock</string> <string name="unlock">Unlock</string>
<string name="achievements">Achievements</string> <string name="achievements">Achievements</string>
<string name="rating_button_no">No</string> <string name="no">No</string>
<string name="general">General</string> <string name="general">General</string>
<string name="source_code">Source Code</string> <string name="source_code">Source Code</string>
<string name="translation">Translation</string> <string name="translation">Translation</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string> <string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string> <string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string> <string name="remove_ad">Remove Ads</string>
<string name="help">Help</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="es-rES"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="es-rES">
<string name="app_name">Anti-Mina</string> <string name="app_name">Anti-Mina</string>
<string name="app_description">Usted tiene que limpiar un tablero cuadrado que contiene minas escondidas sin detonarlas.</string> <string name="app_description">Usted tiene que limpiar un tablero cuadrado que contiene minas escondidas sin detonarlas.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">¡Tutorial Completado!</string>
<string name="tutorial_0_bottom">Puedes empezar por %1$s en cualquier cuadrado aleatorio.</string>
<string name="tutorial_1_top">Los números indican cuántas minas están adyacentes al cuadrado destacado.</string>
<string name="tutorial_1_bottom">Por lo tanto, si la esquina 1⃣ tiene sólo un cuadrado adyacente, debe ser una mina. %1$s para marcarlo.</string>
<string name="tutorial_2_top">El siguiente cuadrado sin abrir no tiene una mina porque el número es 1⃣ , no 2⃣ .</string>
<string name="tutorial_2_bottom">Puedes abrirlo com %1$s.</string>
<string name="tutorial_3_top">Puedes abrir todos los demás lugares sin abrir adyacentes a 1⃣ . Sabes dónde está la mina adyacente.</string>
<string name="tutorial_3_bottom">Puede abrir todos los otros cuadrados cerrados y adyacentes a 1⃣ .</string>
<string name="tutorial_4_top">Sabemos dónde está una de las minas, así que sólo hay una posibilidad para la otra.</string>
<string name="tutorial_4_bottom">%1$s para marcar la mina adyacente a 2⃣ .</string>
<string name="tutorial_5_top">Verifique el número resaltado.</string>
<string name="tutorial_5_bottom">%1$s para abrir o %2$s para marcar.</string>
<string name="games">Juegos</string> <string name="games">Juegos</string>
<string name="previous_games">Juegos anteriores</string> <string name="previous_games">Juegos anteriores</string>
<string name="minefield">Dificultad</string> <string name="minefield">Dificultad</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bandera</string> <string name="flag_tile">Bandera</string>
<string name="retry">Reintentar</string> <string name="retry">Reintentar</string>
<string name="empty">Vacío</string> <string name="empty">Vacío</string>
<string name="cant_do_it_now">Imposible hacer eso ahora</string>
<string name="you_have_received">Has recibido: +%1$d</string>
<string name="help_win_a_game">Para obtener más Ayuda, debes ganar una partida.</string>
<string name="unknown_error">Error desconocido.</string> <string name="unknown_error">Error desconocido.</string>
<string name="leaderboards">Ránking</string> <string name="leaderboards">Ránking</string>
<string name="cancel">Cancelar</string> <string name="cancel">Cancelar</string>
@ -72,7 +88,7 @@
<string name="yes"></string> <string name="yes"></string>
<string name="unlock">Desbloquear</string> <string name="unlock">Desbloquear</string>
<string name="achievements">Logros</string> <string name="achievements">Logros</string>
<string name="rating_button_no">No</string> <string name="no">No</string>
<string name="general">General</string> <string name="general">General</string>
<string name="source_code">Código Fuente</string> <string name="source_code">Código Fuente</string>
<string name="translation">Traducción</string> <string name="translation">Traducción</string>
@ -103,4 +119,5 @@
<string name="flag_placed">¡Bandera colocada!</string> <string name="flag_placed">¡Bandera colocada!</string>
<string name="flag_removed">¡Bandera eliminada!</string> <string name="flag_removed">¡Bandera eliminada!</string>
<string name="remove_ad">Eliminar anuncios</string> <string name="remove_ad">Eliminar anuncios</string>
<string name="help">Ayuda</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="fi"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="fi">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Sinun täytyy tyhjentää piileskeleviä miinoja sisältävä suorakulmainen taulu räjäyttämättä miinoja kertaakaan.</string> <string name="app_description">Sinun täytyy tyhjentää piileskeleviä miinoja sisältävä suorakulmainen taulu räjäyttämättä miinoja kertaakaan.</string>
<string name="tutorial">Opetusohjelma</string>
<string name="tutorial_completed">Opetuspeli Suoritettu</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Pelit</string> <string name="games">Pelit</string>
<string name="previous_games">Edelliset pelit</string> <string name="previous_games">Edelliset pelit</string>
<string name="minefield">Vaikeustaso</string> <string name="minefield">Vaikeustaso</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Lippu</string> <string name="flag_tile">Lippu</string>
<string name="retry">Yritä uudelleen</string> <string name="retry">Yritä uudelleen</string>
<string name="empty">Tyhjä</string> <string name="empty">Tyhjä</string>
<string name="cant_do_it_now">Ei mahdollista tehdä sitä nyt</string>
<string name="you_have_received">Olet saanut: +%1$d</string>
<string name="help_win_a_game">Saat enemmän apua, sinun täytyy voittaa pelin.</string>
<string name="unknown_error">Tuntematon virhe.</string> <string name="unknown_error">Tuntematon virhe.</string>
<string name="leaderboards">Tulostaulukot</string> <string name="leaderboards">Tulostaulukot</string>
<string name="cancel">Peruuta</string> <string name="cancel">Peruuta</string>
@ -72,7 +88,7 @@
<string name="yes">Kyllä</string> <string name="yes">Kyllä</string>
<string name="unlock">Avaa</string> <string name="unlock">Avaa</string>
<string name="achievements">Saavutukset</string> <string name="achievements">Saavutukset</string>
<string name="rating_button_no">No</string> <string name="no">Ei</string>
<string name="general">Yleiset</string> <string name="general">Yleiset</string>
<string name="source_code">Lähdekoodi</string> <string name="source_code">Lähdekoodi</string>
<string name="translation">Käännökset</string> <string name="translation">Käännökset</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Lippu asetettu!</string> <string name="flag_placed">Lippu asetettu!</string>
<string name="flag_removed">Lippu poistettu!</string> <string name="flag_removed">Lippu poistettu!</string>
<string name="remove_ad">Poista Mainokset</string> <string name="remove_ad">Poista Mainokset</string>
<string name="help">Apua</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="fr"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="fr">
<string name="app_name">Anti-Mine</string> <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="tutorial">Tutoriel</string>
<string name="tutorial_completed">Tutoriel Terminé</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Jeux</string> <string name="games">Jeux</string>
<string name="previous_games">Parties précédentes</string> <string name="previous_games">Parties précédentes</string>
<string name="minefield">Difficulté</string> <string name="minefield">Difficulté</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Drapeau</string> <string name="flag_tile">Drapeau</string>
<string name="retry">Réessayer</string> <string name="retry">Réessayer</string>
<string name="empty">Vide</string> <string name="empty">Vide</string>
<string name="cant_do_it_now">Impossible de faire cela maintenant</string>
<string name="you_have_received">Vous avez reçu : +%1$d</string>
<string name="help_win_a_game">Pour plus d\'Aide, vous devez gagner une partie.</string>
<string name="unknown_error">Erreur inconnue.</string> <string name="unknown_error">Erreur inconnue.</string>
<string name="leaderboards">Classements</string> <string name="leaderboards">Classements</string>
<string name="cancel">Annuler</string> <string name="cancel">Annuler</string>
@ -72,7 +88,7 @@
<string name="yes">Oui</string> <string name="yes">Oui</string>
<string name="unlock">Déverrouiller</string> <string name="unlock">Déverrouiller</string>
<string name="achievements">Succès</string> <string name="achievements">Succès</string>
<string name="rating_button_no">Non</string> <string name="no">Non</string>
<string name="general">Général</string> <string name="general">Général</string>
<string name="source_code">Code source</string> <string name="source_code">Code source</string>
<string name="translation">Traduction</string> <string name="translation">Traduction</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Drapeau placé !</string> <string name="flag_placed">Drapeau placé !</string>
<string name="flag_removed">Drapeau retiré !</string> <string name="flag_removed">Drapeau retiré !</string>
<string name="remove_ad">Supprimer les publicités</string> <string name="remove_ad">Supprimer les publicités</string>
<string name="help">Aide</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="hi"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="hi">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">लोकप्रिय लॉजिक पजल माइन्सवीपर. बोर्ड से माइंस साफ करता है वर्ग से संकेत को प्रयोग करते हुए जिसे आपने पहले से खोला है.</string> <string name="app_description">लोकप्रिय लॉजिक पजल माइन्सवीपर. बोर्ड से माइंस साफ करता है वर्ग से संकेत को प्रयोग करते हुए जिसे आपने पहले से खोला है.</string>
<string name="tutorial">ट्यूटोरियल</string>
<string name="tutorial_completed">ट्यूटोरियल पूरा हुआ</string>
<string name="tutorial_0_bottom">आप किसी भी यादृच्छिक क्षेत्र पर %1$s द्वारा शुरू कर सकते हैं।</string>
<string name="tutorial_1_top">संख्या इंगित करती है कि कितने खदान हाइलाइट किए गए क्षेत्र से सटे हैं।</string>
<string name="tutorial_1_bottom">इसलिए, यदि कोने 1, में केवल एक निकट क्षेत्र है, तो यह एक खदान होना चाहिए। इसे चिह्नित करने के लिए %1$s</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">गेम्स</string> <string name="games">गेम्स</string>
<string name="previous_games">पिछला गेम्स</string> <string name="previous_games">पिछला गेम्स</string>
<string name="minefield">कठिनाई</string> <string name="minefield">कठिनाई</string>
@ -32,9 +45,9 @@
<string name="size">आकार</string> <string name="size">आकार</string>
<string name="system">प्रणाली</string> <string name="system">प्रणाली</string>
<string name="rating">फीडबैक</string> <string name="rating">फीडबैक</string>
<string name="support_title">हमें सपॉर्ट कीजिये!</string> <string name="support_title">हमें सहयोग दीजिये!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string> <string name="support_description">आपकी मदद से, हम नई सुविधाओं को लागू करने और अपनी परियोजना को सक्रिय रखने में सक्षम होंगे।</string>
<string name="support_action">To support</string> <string name="support_action">हमें सहयोग दीजिये</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string> <string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</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="translators_text">This game was translated by the following people:</string>
@ -65,6 +78,9 @@
<string name="flag_tile">ध्वज</string> <string name="flag_tile">ध्वज</string>
<string name="retry">फिर प्रयास करें</string> <string name="retry">फिर प्रयास करें</string>
<string name="empty">खाली</string> <string name="empty">खाली</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: +%1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">अज्ञात त्रुटि।</string> <string name="unknown_error">अज्ञात त्रुटि।</string>
<string name="leaderboards">लीडरबोर्ड</string> <string name="leaderboards">लीडरबोर्ड</string>
<string name="cancel">रद्द करें</string> <string name="cancel">रद्द करें</string>
@ -72,7 +88,7 @@
<string name="yes">हाँ</string> <string name="yes">हाँ</string>
<string name="unlock">अनलॉक करें</string> <string name="unlock">अनलॉक करें</string>
<string name="achievements">उपलब्धियां</string> <string name="achievements">उपलब्धियां</string>
<string name="rating_button_no">नहीं</string> <string name="no">नहीं</string>
<string name="general">सामान्य</string> <string name="general">सामान्य</string>
<string name="source_code">सोर्स कोड</string> <string name="source_code">सोर्स कोड</string>
<string name="translation">अनुवाद</string> <string name="translation">अनुवाद</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string> <string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string> <string name="flag_removed">Flag removed!</string>
<string name="remove_ad">विज्ञापन निकालें</string> <string name="remove_ad">विज्ञापन निकालें</string>
<string name="help">मदद</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="hu"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="hu">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Meg kell tisztítanod egy rejtett aknákkal teli, négyszögletes pályát anélkül, hogy akár egyet is felrobbantanál.</string> <string name="app_description">Meg kell tisztítanod egy rejtett aknákkal teli, négyszögletes pályát anélkül, hogy akár egyet is felrobbantanál.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Játékok</string> <string name="games">Játékok</string>
<string name="previous_games">Előző játékok</string> <string name="previous_games">Előző játékok</string>
<string name="minefield">Nehézség</string> <string name="minefield">Nehézség</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Zászló</string> <string name="flag_tile">Zászló</string>
<string name="retry">Újra</string> <string name="retry">Újra</string>
<string name="empty">Üres</string> <string name="empty">Üres</string>
<string name="cant_do_it_now">Most lehetetlen ezt megtenni</string>
<string name="you_have_received">Kapott összeg: +%1$d</string>
<string name="help_win_a_game">További segítségért meg kell nyernie egy játékot.</string>
<string name="unknown_error">Ismeretlen hiba.</string> <string name="unknown_error">Ismeretlen hiba.</string>
<string name="leaderboards">Ranglista</string> <string name="leaderboards">Ranglista</string>
<string name="cancel">Mégse</string> <string name="cancel">Mégse</string>
@ -72,7 +88,7 @@
<string name="yes">Igen</string> <string name="yes">Igen</string>
<string name="unlock">Zárolás feloldása</string> <string name="unlock">Zárolás feloldása</string>
<string name="achievements">Trófeák</string> <string name="achievements">Trófeák</string>
<string name="rating_button_no">Nem</string> <string name="no">Nem</string>
<string name="general">Általános</string> <string name="general">Általános</string>
<string name="source_code">Forráskód</string> <string name="source_code">Forráskód</string>
<string name="translation">Fordítás</string> <string name="translation">Fordítás</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Zászló elhelyezve!</string> <string name="flag_placed">Zászló elhelyezve!</string>
<string name="flag_removed">Zászló eltávolítva!</string> <string name="flag_removed">Zászló eltávolítva!</string>
<string name="remove_ad">Reklámok eltávolítása</string> <string name="remove_ad">Reklámok eltávolítása</string>
<string name="help">Segítség</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="id"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="id">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Kosongkan ranjau tersembunyi dari medan ranjau</string> <string name="app_description">Kosongkan ranjau tersembunyi dari medan ranjau</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial selesai</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Permainan</string> <string name="games">Permainan</string>
<string name="previous_games">Tantangan Sebelumnya</string> <string name="previous_games">Tantangan Sebelumnya</string>
<string name="minefield">Kesulitan</string> <string name="minefield">Kesulitan</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bendera</string> <string name="flag_tile">Bendera</string>
<string name="retry">Ulangi</string> <string name="retry">Ulangi</string>
<string name="empty">Kosong</string> <string name="empty">Kosong</string>
<string name="cant_do_it_now">Tidak mungkin melakukan itu sekarang</string>
<string name="you_have_received">Anda telah menerima: +%1$d</string>
<string name="help_win_a_game">Untuk Bantuan lebih lanjut, Anda harus memenangkan permainan.</string>
<string name="unknown_error">Galat tak diketahui.</string> <string name="unknown_error">Galat tak diketahui.</string>
<string name="leaderboards">Papan Peringkat</string> <string name="leaderboards">Papan Peringkat</string>
<string name="cancel">Batal</string> <string name="cancel">Batal</string>
@ -72,7 +88,7 @@
<string name="yes">Ya</string> <string name="yes">Ya</string>
<string name="unlock">Buka</string> <string name="unlock">Buka</string>
<string name="achievements">Prestasi</string> <string name="achievements">Prestasi</string>
<string name="rating_button_no">Tidak</string> <string name="no">Tidak</string>
<string name="general">Umum</string> <string name="general">Umum</string>
<string name="source_code">Kode sumber</string> <string name="source_code">Kode sumber</string>
<string name="translation">Alih Bahasa</string> <string name="translation">Alih Bahasa</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bendera diletakkan!</string> <string name="flag_placed">Bendera diletakkan!</string>
<string name="flag_removed">Bendera dihapus!</string> <string name="flag_removed">Bendera dihapus!</string>
<string name="remove_ad">Hapus Iklan</string> <string name="remove_ad">Hapus Iklan</string>
<string name="help">Bantuan</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="it"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="it">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">L\'obbiettivo del gioco è ripulire un campo rettangolare che contiene mine nascoste senza detonarne nessuna.</string> <string name="app_description">L\'obbiettivo del gioco è ripulire un campo rettangolare che contiene mine nascoste senza detonarne nessuna.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completato</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Giochi</string> <string name="games">Giochi</string>
<string name="previous_games">Partite Precedenti</string> <string name="previous_games">Partite Precedenti</string>
<string name="minefield">Difficoltà</string> <string name="minefield">Difficoltà</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bandiera</string> <string name="flag_tile">Bandiera</string>
<string name="retry">Riprova</string> <string name="retry">Riprova</string>
<string name="empty">Vuoto</string> <string name="empty">Vuoto</string>
<string name="cant_do_it_now">Impossibile farlo ora</string>
<string name="you_have_received">Hai ricevuto: +%1$d</string>
<string name="help_win_a_game">Per ulteriori aiuti, devi vincere una partita.</string>
<string name="unknown_error">Errore sconosciuto.</string> <string name="unknown_error">Errore sconosciuto.</string>
<string name="leaderboards">Classifiche</string> <string name="leaderboards">Classifiche</string>
<string name="cancel">Annulla</string> <string name="cancel">Annulla</string>
@ -72,7 +88,7 @@
<string name="yes"></string> <string name="yes"></string>
<string name="unlock">Sblocca</string> <string name="unlock">Sblocca</string>
<string name="achievements">Progressi</string> <string name="achievements">Progressi</string>
<string name="rating_button_no">No</string> <string name="no">No</string>
<string name="general">Generale</string> <string name="general">Generale</string>
<string name="source_code">Codice sorgente</string> <string name="source_code">Codice sorgente</string>
<string name="translation">Traduzione</string> <string name="translation">Traduzione</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bandiera piazzata!</string> <string name="flag_placed">Bandiera piazzata!</string>
<string name="flag_removed">Bandiera rimossa!</string> <string name="flag_removed">Bandiera rimossa!</string>
<string name="remove_ad">Rimuovi gli Annunci</string> <string name="remove_ad">Rimuovi gli Annunci</string>
<string name="help">Help</string>
</resources> </resources>

View file

@ -1,106 +1,123 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="he"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="he">
<string name="app_name">Antimine</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="app_description">צריך לנקות את הלוח הריבועי המכיל מוקשים נסתרים מבלי לפוצץ אף אחד מהם.</string>
<string name="games">Games</string> <string name="tutorial">הדרכה</string>
<string name="previous_games">Previous Games</string> <string name="tutorial_completed">Tutorial Completed</string>
<string name="minefield">Difficulty</string> <string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="standard">Standard</string> <string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="beginner">Beginner</string> <string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="intermediate">Intermediate</string> <string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="expert">Expert</string> <string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="open">Open</string> <string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="settings">Settings</string> <string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="animations">Animations</string> <string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="vibration">Haptic Feedback</string> <string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="about">About</string> <string name="tutorial_5_top">Check the highlighted number.</string>
<string name="events">Statistics</string> <string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="custom">Custom</string> <string name="games">משחקים</string>
<string name="start">Start</string> <string name="previous_games">משחקים קודמים</string>
<string name="width">Width</string> <string name="minefield">רמת קושי</string>
<string name="height">Height</string> <string name="standard">רגיל</string>
<string name="mines">Mines</string> <string name="beginner">רמת התחלה</string>
<string name="retry_sure">If you start a new game, your current progress will be lost.</string> <string name="intermediate">רמה בינונית</string>
<string name="show_licenses">Show Licenses</string> <string name="expert">רמה גבוהה</string>
<string name="new_game_request">Do you want to start a new game?</string> <string name="open">פתיחה</string>
<string name="mines_remaining">%d mines</string> <string name="settings">הגדרות</string>
<string name="game_time">Game Time</string> <string name="animations">אנימציות</string>
<string name="mine">Mine</string> <string name="vibration">משוב רטט</string>
<string name="settings_general">General</string> <string name="about">אודות</string>
<string name="settings_gameplay">Gameplay</string> <string name="events">סטטיסטיקה</string>
<string name="settings_accessibility">Accessibility</string> <string name="custom">התאמה אישית</string>
<string name="size">Size</string> <string name="start">התחלה</string>
<string name="system">System</string> <string name="width">רוחב</string>
<string name="rating">Feedback</string> <string name="height">גובה</string>
<string name="support_title">Support us!</string> <string name="mines">מוקשים</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string> <string name="retry_sure">כאשר יתחיל משחק חדש, ההתקדמות הנוכחית שלך תיעלם.</string>
<string name="support_action">To support</string> <string name="show_licenses">הצג רשיונות</string>
<string name="new_game_request">האם ברצונך להתחיל משחק חדש?</string>
<string name="mines_remaining">%d מוקשים</string>
<string name="game_time">זמן משחק</string>
<string name="mine">מוקש</string>
<string name="settings_general">כללי</string>
<string name="settings_gameplay">משחק</string>
<string name="settings_accessibility">נגישות</string>
<string name="size">גודל</string>
<string name="system">מערכת</string>
<string name="rating">משוב</string>
<string name="support_title">תמכו בנו!</string>
<string name="support_description">עם עזרתך, נוכל להוסיף דברים חדשים ולשמור על הפרויקט שלנו פעיל.</string>
<string name="support_action">לתמוך</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string> <string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</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="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="sign_in_failed">אין אפשרות להתחבר. בדוק את חיבור הרשת ונסה שוב.</string>
<string name="you_won">You won!</string> <string name="you_won">ניצחת!</string>
<string name="victories">Victories</string> <string name="victories">נצחונות</string>
<string name="you_lost">You lost!</string> <string name="you_lost">הפסדת!</string>
<string name="defeats">Defeats</string> <string name="defeats">הפסדים</string>
<string name="game_over_desc_1">Good luck on your next game.</string> <string name="game_over_desc_1">בהצלחה במשחק הבא.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string> <string name="game_over_desc_4">סיימת את שדה המוקשים ב%1$d שניות.</string>
<string name="fail_to_share">Failed to share</string> <string name="fail_to_share">השיתוף נכשל</string>
<string name="version_s">Version %1$s</string> <string name="version_s">גרסה %1$s</string>
<string name="sound_effects">Sound Effects</string> <string name="sound_effects">אפקטי צליל</string>
<string name="are_you_sure">Are you sure?</string> <string name="are_you_sure">את/ה בטוח/ה?</string>
<string name="enable_automatic_flags">Enable automatic placing of flags</string> <string name="enable_automatic_flags">מיקום דגלים אוטומטי</string>
<string name="open_areas">Open Areas</string> <string name="open_areas">Open Areas</string>
<string name="total_time">Total Time</string> <string name="total_time">זמן כולל</string>
<string name="average_time">Average Time</string> <string name="average_time">זמן ממוצע</string>
<string name="performance">Performance</string> <string name="performance">ביצועים</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string> <string name="use_question_mark">סימן שאלה</string>
<string name="control">Controls</string> <string name="control">פקדים</string>
<string name="arrow"></string> <string name="arrow">🠨</string>
<string name="single_click">Single Click</string> <string name="single_click">לחיצה בודדת</string>
<string name="double_click">Double Click</string> <string name="double_click">לחיצה כפולה</string>
<string name="long_press">Long Press</string> <string name="long_press">לחץ לחיצה ארוכה</string>
<string name="open_tile">Open</string> <string name="open_tile">פתוח</string>
<string name="flag_tile">Flag</string> <string name="flag_tile">דגל</string>
<string name="retry">Retry</string> <string name="retry">נסה שנית</string>
<string name="empty">Empty</string> <string name="empty">ריק</string>
<string name="unknown_error">Unknown error.</string> <string name="cant_do_it_now">אי אפשר לעשות את זה עכשיו</string>
<string name="leaderboards">Leaderboards</string> <string name="you_have_received">קיבלת: +%1$d</string>
<string name="cancel">Cancel</string> <string name="help_win_a_game">לקבלת עזרה נוספת, עליך לנצח במשחק.</string>
<string name="resume">Resume</string> <string name="unknown_error">שגיאה לא ידועה.</string>
<string name="yes">Yes</string> <string name="leaderboards">לוח תוצאות</string>
<string name="unlock">Unlock</string> <string name="cancel">ביטול</string>
<string name="achievements">Achievements</string> <string name="resume">לְהַמשִׁיך</string>
<string name="rating_button_no">No</string> <string name="yes"> כן</string>
<string name="general">General</string> <string name="unlock">בטל את הנעילה</string>
<string name="source_code">Source Code</string> <string name="achievements">הישגים</string>
<string name="translation">Translation</string> <string name="no">לא</string>
<string name="licenses">Licenses</string> <string name="general">כללי</string>
<string name="source_code">קוד מקור</string>
<string name="translation">תרגומים</string>
<string name="licenses">רשיונות</string>
<string name="google_play_games">Google Play Games</string> <string name="google_play_games">Google Play Games</string>
<string name="connect">Connect</string> <string name="connect">התחבר</string>
<string name="connecting">Connecting…</string> <string name="connecting">מתחבר</string>
<string name="disconnect">Disconnect</string> <string name="disconnect">נתק</string>
<string name="disconnected">Disconnected</string> <string name="disconnected">מנותק</string>
<string name="new_game">New Game</string> <string name="new_game">משחק חדש</string>
<string name="share">Share</string> <string name="share">שותף</string>
<string name="share_menu">Share</string> <string name="share_menu">שותף</string>
<string name="no_network">No internet connection.</string> <string name="no_network">אין חיבור לאינטרנט.</string>
<string name="open_menu">Open Menu</string> <string name="open_menu">פתח תפריט</string>
<string name="close_menu">Close Menu</string> <string name="close_menu">סגור תפריט</string>
<string name="delete_all">Delete all</string> <string name="delete_all">מחק הכל</string>
<string name="themes">Themes</string> <string name="themes">ערכות נושא</string>
<string name="try_it">Try It</string> <string name="try_it">נסה את זה</string>
<string name="delete_all_message">Delete all events permanently.</string> <string name="delete_all_message">Delete all events permanently.</string>
<string name="all_mines_disabled">All mines were disabled.</string> <string name="all_mines_disabled">All mines were disabled.</string>
<string name="desc_convered_area">Covered area</string> <string name="desc_convered_area">Covered area</string>
<string name="desc_marked_area">Marked area</string> <string name="desc_marked_area">Marked area</string>
<string name="desc_question_area">Doubtful area</string> <string name="desc_question_area">Doubtful area</string>
<string name="desc_wrongly_marked_area">Wrongly marked area</string> <string name="desc_wrongly_marked_area">Wrongly marked area</string>
<string name="exploded_mine">Exploded Mine</string> <string name="exploded_mine">מוקש מפוצץ</string>
<string name="game_started">Game Started</string> <string name="game_started">המשחק החל</string>
<string name="you_exploded_a_mine">You exploded a mine!</string> <string name="you_exploded_a_mine">פוצצת מוקש!</string>
<string name="flag_placed">Flag placed!</string> <string name="flag_placed">דגל הונח!</string>
<string name="flag_removed">Flag removed!</string> <string name="flag_removed">דגל הוסר!</string>
<string name="remove_ad">Remove Ads</string> <string name="remove_ad">הסרת פרסומות</string>
<string name="help">עזרה</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ja"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ja">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">地雷が隠された長方形から1つも爆発させることなくクリアしましょう。</string> <string name="app_description">地雷が隠された長方形から1つも爆発させることなくクリアしましょう。</string>
<string name="tutorial">チュートリアル</string>
<string name="tutorial_completed">チュートリアル完了</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">ゲーム回数</string> <string name="games">ゲーム回数</string>
<string name="previous_games">前のゲーム</string> <string name="previous_games">前のゲーム</string>
<string name="minefield">難易度</string> <string name="minefield">難易度</string>
@ -65,6 +78,9 @@
<string name="flag_tile"></string> <string name="flag_tile"></string>
<string name="retry">リトライ</string> <string name="retry">リトライ</string>
<string name="empty"></string> <string name="empty"></string>
<string name="cant_do_it_now">今それを行うことは不可能です</string>
<string name="you_have_received">受け取りました: +%1$d</string>
<string name="help_win_a_game">ヘルプを増やすには、ゲームに勝つ必要があります。</string>
<string name="unknown_error">不明なエラーです。</string> <string name="unknown_error">不明なエラーです。</string>
<string name="leaderboards">リーダーボード</string> <string name="leaderboards">リーダーボード</string>
<string name="cancel">キャンセル</string> <string name="cancel">キャンセル</string>
@ -72,7 +88,7 @@
<string name="yes">はい</string> <string name="yes">はい</string>
<string name="unlock">ロック解除</string> <string name="unlock">ロック解除</string>
<string name="achievements">達成</string> <string name="achievements">達成</string>
<string name="rating_button_no">いいえ</string> <string name="no">いいえ</string>
<string name="general">全般</string> <string name="general">全般</string>
<string name="source_code">ソースコード</string> <string name="source_code">ソースコード</string>
<string name="translation">翻訳</string> <string name="translation">翻訳</string>
@ -103,4 +119,5 @@
<string name="flag_placed">フラグを立てました!</string> <string name="flag_placed">フラグを立てました!</string>
<string name="flag_removed">フラグを消しました!</string> <string name="flag_removed">フラグを消しました!</string>
<string name="remove_ad">広告を削除</string> <string name="remove_ad">広告を削除</string>
<string name="help">ヘルプ</string>
</resources> </resources>

View file

@ -1,106 +1,123 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ko"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ko">
<string name="app_name">Antimine</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="app_description">당신은 이 사각형 게임판에 숨겨진 지뢰를 하나도 터뜨리지 않고 게임을 끝내야 합니다.</string>
<string name="games">Games</string> <string name="tutorial">튜토리얼</string>
<string name="previous_games">Previous Games</string> <string name="tutorial_completed">튜토리얼 완료</string>
<string name="tutorial_0_bottom">아무 곳에나 %1$s해서 게임을 시작하세요.</string>
<string name="tutorial_1_top">이 숫자는 선택한 곳의 인접한 구간에 얼마나 많은 지뢰가 있는지 나타냅니다.</string>
<string name="tutorial_1_bottom">따라서, 1⃣ 으로 표시된 부분에 인접한 구역이 한 군데밖에 없다면, 그것은 지뢰일 것입니다. %1$s해서 깃발을 세우세요.</string>
<string name="tutorial_2_top">그 다음 열리지 않은 구역은 숫자가 2⃣ 가 아닌 1⃣ 이기에, 지뢰를 가지고 있지 않습니다.</string>
<string name="tutorial_2_bottom">%1$s해서 그 칸을 여세요.</string>
<string name="tutorial_3_top">이 1⃣ 이라 표시된 구역에 똑같은 상황이 나왔습니다. 인접한 지뢰가 어디 있는지 확인할 수 있을겁니다.</string>
<string name="tutorial_3_bottom">1⃣ 근처의 모든 칸을 열어도 됩니다.</string>
<string name="tutorial_4_top">이미 지뢰 하나는 어디 있는지 알고 있습니다. 그러니 나머지 하나가 있을 경우의 수는 단 한가지입니다.</string>
<string name="tutorial_4_bottom">%1$s해서 2⃣ 에 인접한 칸에 있는 지뢰에 깃발을 세우세요.</string>
<string name="tutorial_5_top">표시된 숫자를 확인하세요.</string>
<string name="tutorial_5_bottom">해당 구역이 안전하다고 생각하면 %1$s하고, 해당 구역에 지뢰가 있다고 생각하면 %2$s하세요.</string>
<string name="games">게임</string>
<string name="previous_games">이전 게임</string>
<string name="minefield">난이도</string> <string name="minefield">난이도</string>
<string name="standard">기본</string> <string name="standard">기본</string>
<string name="beginner">초급</string> <string name="beginner">초급</string>
<string name="intermediate">중급</string> <string name="intermediate">중급</string>
<string name="expert">고급</string> <string name="expert">고급</string>
<string name="open">Open</string> <string name="open">오픈</string>
<string name="settings">설정</string> <string name="settings">설정</string>
<string name="animations">Animations</string> <string name="animations">애니메이션</string>
<string name="vibration">Haptic Feedback</string> <string name="vibration">햅틱 피드백</string>
<string name="about">About</string> <string name="about">정보</string>
<string name="events">통계</string> <string name="events">통계</string>
<string name="custom">Custom</string> <string name="custom">사용자 지정</string>
<string name="start">시작</string> <string name="start">시작</string>
<string name="width">Width</string> <string name="width">가로</string>
<string name="height">Height</string> <string name="height">세로</string>
<string name="mines">지뢰 수</string> <string name="mines">지뢰 수</string>
<string name="retry_sure">If you start a new game, your current progress will be lost.</string> <string name="retry_sure">새 게임을 시작하면 현재 진행 상황이 손실됩니다.</string>
<string name="show_licenses">Show Licenses</string> <string name="show_licenses">저작권 표시</string>
<string name="new_game_request">Do you want to start a new game?</string> <string name="new_game_request">새로운 게임을 시작하시겠습니까?</string>
<string name="mines_remaining">%d mines</string> <string name="mines_remaining">%d </string>
<string name="game_time">Game Time</string> <string name="game_time">게임 시간</string>
<string name="mine">Mine</string> <string name="mine">지뢰</string>
<string name="settings_general">General</string> <string name="settings_general">일반</string>
<string name="settings_gameplay">Gameplay</string> <string name="settings_gameplay">게임 플레이</string>
<string name="settings_accessibility">Accessibility</string> <string name="settings_accessibility">접근성</string>
<string name="size">Size</string> <string name="size">크기</string>
<string name="system">System</string> <string name="system">시스템</string>
<string name="rating">Feedback</string> <string name="rating">피드백</string>
<string name="support_title">Support us!</string> <string name="support_title">우리를 지원해주세요!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string> <string name="support_description">새로운 기능을 구현하고 프로젝트가 계속 진행될 수 있게 도와주세요.</string>
<string name="support_action">To support</string> <string name="support_action">지원</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string> <string name="rating_message">이 게임이 좋으시다면, 피드백을 남겨주세요. 저희에게 많은 도움이 됩니다.</string>
<string name="used_software_text">This game uses the following third parties software:</string> <string name="used_software_text">이 게임은 해당 서드파티 소프트웨어를 사용합니다:</string>
<string name="translators_text">This game was translated by the following people:</string> <string name="translators_text">이 게임은 다음 사람들에 의해 번역되었습니다:</string>
<string name="sign_in_failed">Failed to sign in. Please check your network connection and try again.</string> <string name="sign_in_failed">게임에 접속할 수 없습니다. 네트워크 환경을 확인해고 다시 접속해주세요.</string>
<string name="you_won">You won!</string> <string name="you_won">성공!</string>
<string name="victories">Victories</string> <string name="victories">성공 횟수</string>
<string name="you_lost">You lost!</string> <string name="you_lost">실패!</string>
<string name="defeats">Defeats</string> <string name="defeats">실패 횟수</string>
<string name="game_over_desc_1">Good luck on your next game.</string> <string name="game_over_desc_1">다음 판에서는 잘하시길 빕니다.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string> <string name="game_over_desc_4">%1$d초만에 이번 판을 끝내셨습니다.</string>
<string name="fail_to_share">Failed to share</string> <string name="fail_to_share">공유 실패</string>
<string name="version_s">Version %1$s</string> <string name="version_s">버전: %1$s</string>
<string name="sound_effects">Sound Effects</string> <string name="sound_effects">효과음</string>
<string name="are_you_sure">Are you sure?</string> <string name="are_you_sure">확실합니까?</string>
<string name="enable_automatic_flags">Enable automatic placing of flags</string> <string name="enable_automatic_flags">자동으로 깃발 놓기 사용</string>
<string name="open_areas">Open Areas</string> <string name="open_areas">칸 열기</string>
<string name="total_time">Total Time</string> <string name="total_time">총 시간</string>
<string name="average_time">Average Time</string> <string name="average_time">평균 시간</string>
<string name="performance">Performance</string> <string name="performance">퍼포먼스</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string> <string name="use_question_mark">물음표 깃발 사용</string>
<string name="control">Controls</string> <string name="control">컨트롤</string>
<string name="arrow"></string> <string name="arrow"></string>
<string name="single_click">Single Click</string> <string name="single_click">단일 클릭</string>
<string name="double_click">Double Click</string> <string name="double_click">더블 클릭</string>
<string name="long_press">Long Press</string> <string name="long_press">길게 누르기</string>
<string name="open_tile">Open</string> <string name="open_tile">칸 열기</string>
<string name="flag_tile">Flag</string> <string name="flag_tile">깃발 세우기</string>
<string name="retry">Retry</string> <string name="retry">재시도</string>
<string name="empty">Empty</string> <string name="empty">비어있음</string>
<string name="unknown_error">Unknown error.</string> <string name="cant_do_it_now">지금은 불가능 해</string>
<string name="leaderboards">Leaderboards</string> <string name="you_have_received">당신은 받았습니다: +%1$d</string>
<string name="cancel">Cancel</string> <string name="help_win_a_game">더 많은 도움을 받으려면 게임에서 승리해야합니다.</string>
<string name="resume">Resume</string> <string name="unknown_error">알 수 없는 오류 발생</string>
<string name="yes">Yes</string> <string name="leaderboards">리더보드</string>
<string name="unlock">Unlock</string> <string name="cancel">취소</string>
<string name="achievements">Achievements</string> <string name="resume">계속하기</string>
<string name="rating_button_no">No</string> <string name="yes"></string>
<string name="general">General</string> <string name="unlock">잠금 해제</string>
<string name="source_code">Source Code</string> <string name="achievements">도전 과제</string>
<string name="translation">Translation</string> <string name="no">아니오</string>
<string name="licenses">Licenses</string> <string name="general">기본설정</string>
<string name="google_play_games">Google Play Games</string> <string name="source_code">소스 코드</string>
<string name="connect">Connect</string> <string name="translation">번역</string>
<string name="connecting">Connecting…</string> <string name="licenses">라이선스</string>
<string name="disconnect">Disconnect</string> <string name="google_play_games">Google Play 게임</string>
<string name="disconnected">Disconnected</string> <string name="connect">연결하기</string>
<string name="new_game">New Game</string> <string name="connecting">연결중…</string>
<string name="share">Share</string> <string name="disconnect">연결 해제</string>
<string name="share_menu">Share…</string> <string name="disconnected">연결 해제됨</string>
<string name="no_network">No internet connection.</string> <string name="new_game">새 게임</string>
<string name="open_menu">Open Menu</string> <string name="share">공유하기</string>
<string name="close_menu">Close Menu</string> <string name="share_menu">…을 통해 공유하기</string>
<string name="delete_all">Delete all</string> <string name="no_network">인터넷에 연결되어 있지 않습니다.</string>
<string name="themes">Themes</string> <string name="open_menu">메뉴 열기</string>
<string name="try_it">Try It</string> <string name="close_menu">메뉴 닫기</string>
<string name="delete_all_message">Delete all events permanently.</string> <string name="delete_all">모두 삭제</string>
<string name="all_mines_disabled">All mines were disabled.</string> <string name="themes">테마 선택</string>
<string name="desc_convered_area">Covered area</string> <string name="try_it">사용해보세요</string>
<string name="desc_marked_area">Marked area</string> <string name="delete_all_message">모든 이벤트 알림을 영구히 삭제합니다.</string>
<string name="desc_question_area">Doubtful area</string> <string name="all_mines_disabled">모든 지뢰를 찾았습니다.</string>
<string name="desc_wrongly_marked_area">Wrongly marked area</string> <string name="desc_convered_area">연 칸</string>
<string name="exploded_mine">Exploded Mine</string> <string name="desc_marked_area">깃발 꽂은 칸</string>
<string name="game_started">Game Started</string> <string name="desc_question_area">의심스러운 칸</string>
<string name="you_exploded_a_mine">You exploded a mine!</string> <string name="desc_wrongly_marked_area">깃발을 잘못 꽂은 칸</string>
<string name="flag_placed">Flag placed!</string> <string name="exploded_mine">터진 지뢰</string>
<string name="flag_removed">Flag removed!</string> <string name="game_started">게임 시작됨</string>
<string name="remove_ad">Remove Ads</string> <string name="you_exploded_a_mine">지뢰가 터졌습니다!</string>
<string name="flag_placed">깃발 설치 완료!</string>
<string name="flag_removed">깃발 제거 완료!</string>
<string name="remove_ad">광고 제거</string>
<string name="help">도움말</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="nl"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="nl">
<string name="app_name">Antimijn</string> <string name="app_name">Antimijn</string>
<string name="app_description">Je moet een rechthoekig bord met verborgen mijnen verwijderen zonder er een te ontploffen.</string> <string name="app_description">Je moet een rechthoekig bord met verborgen mijnen verwijderen zonder er een te ontploffen.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Voltooid</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string> <string name="games">Games</string>
<string name="previous_games">Vorige games</string> <string name="previous_games">Vorige games</string>
<string name="minefield">Moeilijkheidsgraad</string> <string name="minefield">Moeilijkheidsgraad</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Vlag</string> <string name="flag_tile">Vlag</string>
<string name="retry">Opnieuw</string> <string name="retry">Opnieuw</string>
<string name="empty">Leeg</string> <string name="empty">Leeg</string>
<string name="cant_do_it_now">Onmogelijk om dat nu te doen</string>
<string name="you_have_received">Je hebt ontvangen: +%1$d</string>
<string name="help_win_a_game">Voor meer hulp moet je een spel winnen.</string>
<string name="unknown_error">Onbekende fout.</string> <string name="unknown_error">Onbekende fout.</string>
<string name="leaderboards">Ranglijsten</string> <string name="leaderboards">Ranglijsten</string>
<string name="cancel">Anneleren</string> <string name="cancel">Anneleren</string>
@ -72,7 +88,7 @@
<string name="yes">Ja</string> <string name="yes">Ja</string>
<string name="unlock">Ontgrendelen</string> <string name="unlock">Ontgrendelen</string>
<string name="achievements">Achievements</string> <string name="achievements">Achievements</string>
<string name="rating_button_no">Nee</string> <string name="no">Nee</string>
<string name="general">Algemeen</string> <string name="general">Algemeen</string>
<string name="source_code">Bron code</string> <string name="source_code">Bron code</string>
<string name="translation">Vertaling</string> <string name="translation">Vertaling</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Vlag geplaatst!</string> <string name="flag_placed">Vlag geplaatst!</string>
<string name="flag_removed">Vlag verwijderd!</string> <string name="flag_removed">Vlag verwijderd!</string>
<string name="remove_ad">Verwijder advertenties</string> <string name="remove_ad">Verwijder advertenties</string>
<string name="help">Help</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="no"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="no">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Du må fjerne en rektangulær plate med skjulte miner uten å løsne noen av dem.</string> <string name="app_description">Du må fjerne en rektangulær plate med skjulte miner uten å løsne noen av dem.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Spill</string> <string name="games">Spill</string>
<string name="previous_games">Tidligere Spill</string> <string name="previous_games">Tidligere Spill</string>
<string name="minefield">Vanskelighet</string> <string name="minefield">Vanskelighet</string>
@ -33,8 +46,8 @@
<string name="system">System</string> <string name="system">System</string>
<string name="rating">Ttilbakemelding</string> <string name="rating">Ttilbakemelding</string>
<string name="support_title">Støtt oss!</string> <string name="support_title">Støtt oss!</string>
<string name="support_description">Med din hjelp kan vi implementere nye funksjoner og holde prosjektet vårt aktivt.</string> <string name="support_description">Med hjelpen din kan vi implementere nye funksjoner og holde prosjektet aktivt.</string>
<string name="support_action">Støtte</string> <string name="support_action">For å støtte</string>
<string name="rating_message">Hvis du liker dette spillet, gi oss en tilbakemelding. Det vil hjelpe oss mye.</string> <string name="rating_message">Hvis du liker dette spillet, gi oss en tilbakemelding. Det vil hjelpe oss mye.</string>
<string name="used_software_text">Dette spillet bruker følgende tredjeparter programvare:</string> <string name="used_software_text">Dette spillet bruker følgende tredjeparter programvare:</string>
<string name="translators_text">Dette spillet ble oversatt av følgende personer:</string> <string name="translators_text">Dette spillet ble oversatt av følgende personer:</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flagg</string> <string name="flag_tile">Flagg</string>
<string name="retry">Prøv på nytt</string> <string name="retry">Prøv på nytt</string>
<string name="empty">Tom</string> <string name="empty">Tom</string>
<string name="cant_do_it_now">Umulig å gjøre det nå</string>
<string name="you_have_received">Du har mottatt: +%1$d</string>
<string name="help_win_a_game">For mer hjelp, må du vinne et spill.</string>
<string name="unknown_error">Ukjent feil.</string> <string name="unknown_error">Ukjent feil.</string>
<string name="leaderboards">Leaderboards</string> <string name="leaderboards">Leaderboards</string>
<string name="cancel">Avbryt</string> <string name="cancel">Avbryt</string>
@ -72,7 +88,7 @@
<string name="yes">Ja</string> <string name="yes">Ja</string>
<string name="unlock">Lås opp</string> <string name="unlock">Lås opp</string>
<string name="achievements">Prestasjoner</string> <string name="achievements">Prestasjoner</string>
<string name="rating_button_no">Nei</string> <string name="no">Nei</string>
<string name="general">Generelt</string> <string name="general">Generelt</string>
<string name="source_code">Kildekode</string> <string name="source_code">Kildekode</string>
<string name="translation">Oversettelse</string> <string name="translation">Oversettelse</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flagg plassert!</string> <string name="flag_placed">Flagg plassert!</string>
<string name="flag_removed">Flagg fjernet!</string> <string name="flag_removed">Flagg fjernet!</string>
<string name="remove_ad">Fjern Reklame</string> <string name="remove_ad">Fjern Reklame</string>
<string name="help">Hjelp</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pl"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pl">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Znajdź wszystkie ukryte miny znajdujące się na kwadratowej planszy unikając ich detonacji.</string> <string name="app_description">Znajdź wszystkie ukryte miny znajdujące się na kwadratowej planszy unikając ich detonacji.</string>
<string name="tutorial">Samouczek</string>
<string name="tutorial_completed">Samouczek ukończony</string>
<string name="tutorial_0_bottom">%1$s na dowolnym polu, aby rozpocząć.</string>
<string name="tutorial_1_top">Liczby wskazują, jaka ilość min przylega do podświetlonego pola.</string>
<string name="tutorial_1_bottom">Z tego wynika, że jeśli do narożnika 1⃣ przylega tylko jedno pole, musi znajdować się tam mina. %1$s, aby ją oznaczyć.</string>
<string name="tutorial_2_top">Na kolejnym nieodkrytym polu nie znajduje się mina, ponieważ posiada ono liczbę 1⃣ , a nie 2⃣ .</string>
<string name="tutorial_2_bottom">Możesz je odkryć przez %1$s.</string>
<string name="tutorial_3_top">To samo dzieje się w przypadku tego 1⃣ . Z pewnością wiesz, gdzie jest przylegająca mina.</string>
<string name="tutorial_3_bottom">Możesz odkryć wszystkie pozostałe pola przylegające do 1⃣ .</string>
<string name="tutorial_4_top">Wiemy już, gdzie jest jedna z min. Istnieje więc tylko jedna możliwa pozycja dla drugiej.</string>
<string name="tutorial_4_bottom">%1$s, aby oznaczyć minę przylegającą do 2⃣ .</string>
<string name="tutorial_5_top">Sprawdź podświetlony numer.</string>
<string name="tutorial_5_bottom">%1$s, aby odkryć lub %2$s, aby oznaczyć.</string>
<string name="games">Rozgrywki</string> <string name="games">Rozgrywki</string>
<string name="previous_games">Poprzednie rozgrywki</string> <string name="previous_games">Poprzednie rozgrywki</string>
<string name="minefield">Rozgrywki</string> <string name="minefield">Rozgrywki</string>
@ -61,10 +74,13 @@
<string name="single_click">Pojedyncze kliknięcie</string> <string name="single_click">Pojedyncze kliknięcie</string>
<string name="double_click">Podwójne kliknięcie</string> <string name="double_click">Podwójne kliknięcie</string>
<string name="long_press">Długie naciśnięcie</string> <string name="long_press">Długie naciśnięcie</string>
<string name="open_tile">Otwórz</string> <string name="open_tile">Odkryj</string>
<string name="flag_tile">Oznacz</string> <string name="flag_tile">Oznacz</string>
<string name="retry">Jeszcze raz</string> <string name="retry">Jeszcze raz</string>
<string name="empty">Puste</string> <string name="empty">Puste</string>
<string name="cant_do_it_now">Nie można tego teraz zrobić</string>
<string name="you_have_received">Otrzymałeś: +%1$d</string>
<string name="help_win_a_game">Aby uzyskać więcej pomocy, musisz wygrać grę.</string>
<string name="unknown_error">Nieznany błąd.</string> <string name="unknown_error">Nieznany błąd.</string>
<string name="leaderboards">Tablica wyników</string> <string name="leaderboards">Tablica wyników</string>
<string name="cancel">Anuluj</string> <string name="cancel">Anuluj</string>
@ -72,7 +88,7 @@
<string name="yes">Tak</string> <string name="yes">Tak</string>
<string name="unlock">Odblokuj</string> <string name="unlock">Odblokuj</string>
<string name="achievements">Osiągnięcia</string> <string name="achievements">Osiągnięcia</string>
<string name="rating_button_no">Nie</string> <string name="no">Nie</string>
<string name="general">Ogólne</string> <string name="general">Ogólne</string>
<string name="source_code">Kod źródłowy</string> <string name="source_code">Kod źródłowy</string>
<string name="translation">Tłumaczenie</string> <string name="translation">Tłumaczenie</string>
@ -102,5 +118,6 @@
<string name="you_exploded_a_mine">Zdetonowano minę!</string> <string name="you_exploded_a_mine">Zdetonowano minę!</string>
<string name="flag_placed">Umieszczono flagę!</string> <string name="flag_placed">Umieszczono flagę!</string>
<string name="flag_removed">Usunięto flagę!</string> <string name="flag_removed">Usunięto flagę!</string>
<string name="remove_ad">Usunąć reklamy</string> <string name="remove_ad">Usuń reklamy</string>
<string name="help">Pomoc</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pt-rBR"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pt-rBR">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Você deve limpar um campo cheio de mines escondidas sem detonar nenhumas delas.</string> <string name="app_description">Você deve limpar um campo cheio de mines escondidas sem detonar nenhumas delas.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Concluído</string>
<string name="tutorial_0_bottom">Para começar dê um %1$s em qualquer quadrado aleatório.</string>
<string name="tutorial_1_top">Os números indicam quantas minas existem adjacentes ao quadrado destacado.</string>
<string name="tutorial_1_bottom">Portanto, se o canto 1⃣ tem apenas um quadrado adjacente, ele deve ter uma minha. Use %1$s para sinalizá-lo.</string>
<string name="tutorial_2_top">O próximo quadrado fechado não tem uma mina porque o número é 1⃣ , não 2⃣ .</string>
<string name="tutorial_2_bottom">Você pode abri-lo com %1$s.</string>
<string name="tutorial_3_top">O mesmo acontece nesse 1⃣ . Você sabe onde está a mina adjacente.</string>
<string name="tutorial_3_bottom">Você pode abrir todos os outros quadrados fechados adjacentes a 1⃣ .</string>
<string name="tutorial_4_top">Sabemos onde está uma das minas. Então, há apenas uma possibilidade para a outra.</string>
<string name="tutorial_4_bottom">%1$s para sinalizar a mina adjacente a 2⃣ .</string>
<string name="tutorial_5_top">Verifique o número destacado.</string>
<string name="tutorial_5_bottom">%1$s para abrir ou %2$s para sinalizar.</string>
<string name="games">Jogos</string> <string name="games">Jogos</string>
<string name="previous_games">Jogos anteriores</string> <string name="previous_games">Jogos anteriores</string>
<string name="minefield">Dificuldade</string> <string name="minefield">Dificuldade</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bandeira</string> <string name="flag_tile">Bandeira</string>
<string name="retry">Tentar de novo</string> <string name="retry">Tentar de novo</string>
<string name="empty">Vazio</string> <string name="empty">Vazio</string>
<string name="cant_do_it_now">Impossível fazer isso agora</string>
<string name="you_have_received">Você recebeu: +%1$d</string>
<string name="help_win_a_game">Para mais Ajuda, você deve ganhar um jogo.</string>
<string name="unknown_error">Erro Desconhecido.</string> <string name="unknown_error">Erro Desconhecido.</string>
<string name="leaderboards">Classificações</string> <string name="leaderboards">Classificações</string>
<string name="cancel">Cancelar</string> <string name="cancel">Cancelar</string>
@ -72,7 +88,7 @@
<string name="yes">Sim</string> <string name="yes">Sim</string>
<string name="unlock">Desbloquear</string> <string name="unlock">Desbloquear</string>
<string name="achievements">Conquistas</string> <string name="achievements">Conquistas</string>
<string name="rating_button_no">Não</string> <string name="no">Não</string>
<string name="general">Geral</string> <string name="general">Geral</string>
<string name="source_code">Código fonte</string> <string name="source_code">Código fonte</string>
<string name="translation">Tradução</string> <string name="translation">Tradução</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bandeira colocada!</string> <string name="flag_placed">Bandeira colocada!</string>
<string name="flag_removed">Bandeira removida!</string> <string name="flag_removed">Bandeira removida!</string>
<string name="remove_ad">Remover Propagandas</string> <string name="remove_ad">Remover Propagandas</string>
<string name="help">Ajuda</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pt-rPT"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pt-rPT">
<string name="app_name">Antimine</string> <string name="app_name">Antimine</string>
<string name="app_description">Você deve limpar um campo contendo minas escondidas sem detonar nenhuma delas.</string> <string name="app_description">Você deve limpar um campo contendo minas escondidas sem detonar nenhuma delas.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completo</string>
<string name="tutorial_0_bottom">Você pode começar por %1$s em qualquer quadrado aleatório.</string>
<string name="tutorial_1_top">Os números indicam quantas minas estão adjacentes ao quadrado em destaque.</string>
<string name="tutorial_1_bottom">Portanto, se o canto 1⃣ tem apenas um quadrado adjacente, ele deve ter uma mina. %1$s para sinalizá-lo.</string>
<string name="tutorial_2_top">O próximo quadrado não aberto não tem uma mina, porque o número é 1⃣ , não 2⃣ .</string>
<string name="tutorial_2_bottom">Você pode abri-lo com %1$s.</string>
<string name="tutorial_3_top">O mesmo acontece neste 1⃣ . Você sabe onde está a sua mina adjacente.</string>
<string name="tutorial_3_bottom">Você pode abrir todos os outros lugares não abertos adjacentes a 1⃣ .</string>
<string name="tutorial_4_top">Sabemos onde está uma das minas. Então, há apenas uma possibilidade para a outra.</string>
<string name="tutorial_4_bottom">%1$s para sinalizar a mina adjacente a 2⃣ .</string>
<string name="tutorial_5_top">Verifique o número destacado.</string>
<string name="tutorial_5_bottom">%1$s para abrir ou %2$s para marcar.</string>
<string name="games">Jogos</string> <string name="games">Jogos</string>
<string name="previous_games">Jogos anteriores</string> <string name="previous_games">Jogos anteriores</string>
<string name="minefield">Dificuldade</string> <string name="minefield">Dificuldade</string>
@ -58,13 +71,16 @@
<string name="use_question_mark">Usar Ponto de Interrogação</string> <string name="use_question_mark">Usar Ponto de Interrogação</string>
<string name="control">Controlos</string> <string name="control">Controlos</string>
<string name="arrow"></string> <string name="arrow"></string>
<string name="single_click">Clique único</string> <string name="single_click">Toque Único</string>
<string name="double_click">Duplo Clique</string> <string name="double_click">Toque Duplo</string>
<string name="long_press">Toque longo</string> <string name="long_press">Toque Longo</string>
<string name="open_tile">Abrir</string> <string name="open_tile">Abrir</string>
<string name="flag_tile">Bandeira</string> <string name="flag_tile">Bandeira</string>
<string name="retry">Tentar Novamente</string> <string name="retry">Tentar Novamente</string>
<string name="empty">Vazio</string> <string name="empty">Vazio</string>
<string name="cant_do_it_now">Impossível fazer isso agora</string>
<string name="you_have_received">Você recebeu: +%1$d</string>
<string name="help_win_a_game">Para mais Ajuda, você deve ganhar um jogo.</string>
<string name="unknown_error">Erro desconhecido.</string> <string name="unknown_error">Erro desconhecido.</string>
<string name="leaderboards">Líderes</string> <string name="leaderboards">Líderes</string>
<string name="cancel">Cancelar</string> <string name="cancel">Cancelar</string>
@ -72,7 +88,7 @@
<string name="yes">Sim</string> <string name="yes">Sim</string>
<string name="unlock">Desbloquear</string> <string name="unlock">Desbloquear</string>
<string name="achievements">Conquistas</string> <string name="achievements">Conquistas</string>
<string name="rating_button_no">Não</string> <string name="no">Não</string>
<string name="general">Geral</string> <string name="general">Geral</string>
<string name="source_code">Código Fonte</string> <string name="source_code">Código Fonte</string>
<string name="translation">Tradução</string> <string name="translation">Tradução</string>
@ -85,7 +101,7 @@
<string name="new_game">Novo Jogo</string> <string name="new_game">Novo Jogo</string>
<string name="share">Compartilhar</string> <string name="share">Compartilhar</string>
<string name="share_menu">Compartilhar…</string> <string name="share_menu">Compartilhar…</string>
<string name="no_network">Sem ligação à internet.</string> <string name="no_network">Sem ligação à Internet.</string>
<string name="open_menu">Abrir o Menu</string> <string name="open_menu">Abrir o Menu</string>
<string name="close_menu">Fechar menu</string> <string name="close_menu">Fechar menu</string>
<string name="delete_all">Apagar tudo</string> <string name="delete_all">Apagar tudo</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bandeira colocada!</string> <string name="flag_placed">Bandeira colocada!</string>
<string name="flag_removed">Bandeira removida!</string> <string name="flag_removed">Bandeira removida!</string>
<string name="remove_ad">Remover Anúncios</string> <string name="remove_ad">Remover Anúncios</string>
<string name="help">Ajuda</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ro"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ro">
<string name="app_name">Antimine</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="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial completat</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string> <string name="games">Games</string>
<string name="previous_games">Previous Games</string> <string name="previous_games">Previous Games</string>
<string name="minefield">Dificultate</string> <string name="minefield">Dificultate</string>
@ -26,56 +39,59 @@
<string name="mines_remaining">%d de mine</string> <string name="mines_remaining">%d de mine</string>
<string name="game_time">Durata Jocului</string> <string name="game_time">Durata Jocului</string>
<string name="mine">Mină</string> <string name="mine">Mină</string>
<string name="settings_general">General</string> <string name="settings_general">Generalități</string>
<string name="settings_gameplay">Gameplay</string> <string name="settings_gameplay">Joc</string>
<string name="settings_accessibility">Accessibility</string> <string name="settings_accessibility">Accesibilitate</string>
<string name="size">Size</string> <string name="size">Dimensiune</string>
<string name="system">System</string> <string name="system">Sistem</string>
<string name="rating">Feedback</string> <string name="rating">Opinii</string>
<string name="support_title">Support us!</string> <string name="support_title">Susțineți-ne!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string> <string name="support_description">Cu ajutorul tău, vom fi capabili să implementăm noi funcții și să menținem proiectul nostru activ.</string>
<string name="support_action">To support</string> <string name="support_action">Suport</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string> <string name="rating_message">Dacă vă place acest joc, vă rugăm să ne dați un feedback. Ne va ajuta foarte mult.</string>
<string name="used_software_text">This game uses the following third parties software:</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="translators_text">This game was translated by the following people:</string>
<string name="sign_in_failed">Nu se poate conecta. Te rugăm să îți verifici conexiunea la rețea și să încerci din nou.</string> <string name="sign_in_failed">Nu se poate conecta. Te rugăm să îți verifici conexiunea la rețea și să încerci din nou.</string>
<string name="you_won">You won!</string> <string name="you_won">Aţi câștigat!</string>
<string name="victories">Victories</string> <string name="victories">Victorii</string>
<string name="you_lost">You lost!</string> <string name="you_lost">Aţi pierdut!</string>
<string name="defeats">Defeats</string> <string name="defeats">Înfrângeri</string>
<string name="game_over_desc_1">Good luck on your next game.</string> <string name="game_over_desc_1">Mult noroc la următorul joc.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string> <string name="game_over_desc_4">Ai terminat câmpul minat în %1$d secunde.</string>
<string name="fail_to_share">Failed to share</string> <string name="fail_to_share">Share-uirea imaginii a eșuat</string>
<string name="version_s">Version %1$s</string> <string name="version_s">Versiunea %1$s</string>
<string name="sound_effects">Sound Effects</string> <string name="sound_effects">Efecte sonore</string>
<string name="are_you_sure">Are you sure?</string> <string name="are_you_sure">Sînteți sigur?</string>
<string name="enable_automatic_flags">Enable automatic placing of flags</string> <string name="enable_automatic_flags">Activează plasarea automată a steagurilor</string>
<string name="open_areas">Open Areas</string> <string name="open_areas">Open Areas</string>
<string name="total_time">Total Time</string> <string name="total_time">Timp total</string>
<string name="average_time">Average Time</string> <string name="average_time">Timp mediu</string>
<string name="performance">Performance</string> <string name="performance">Performanță</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string> <string name="use_question_mark">Folosește Semn de Întrebare</string>
<string name="control">Controls</string> <string name="control">Controale</string>
<string name="arrow"></string> <string name="arrow"></string>
<string name="single_click">Single Click</string> <string name="single_click">Atingere simplă</string>
<string name="double_click">Double Click</string> <string name="double_click">Apasare dubla</string>
<string name="long_press">Long Press</string> <string name="long_press">Atingeți lung</string>
<string name="open_tile">Open</string> <string name="open_tile">Deschide</string>
<string name="flag_tile">Flag</string> <string name="flag_tile">Steag</string>
<string name="retry">Încearcă din nou</string> <string name="retry">Încearcă din nou</string>
<string name="empty">Empty</string> <string name="empty">Gol</string>
<string name="cant_do_it_now">Nu se poate face acest lucru acum</string>
<string name="you_have_received">Ați primit: +%1$d</string>
<string name="help_win_a_game">Pentru mai mult ajutor, trebuie să câștigi un joc.</string>
<string name="unknown_error">Eroare necunoscută.</string> <string name="unknown_error">Eroare necunoscută.</string>
<string name="leaderboards">Clasamente</string> <string name="leaderboards">Clasamente</string>
<string name="cancel">Anulează</string> <string name="cancel">Anulează</string>
<string name="resume">Continuă</string> <string name="resume">Continuă</string>
<string name="yes">Da</string> <string name="yes">Da</string>
<string name="unlock">Unlock</string> <string name="unlock">Deblochează</string>
<string name="achievements">Achievements</string> <string name="achievements">Achievements</string>
<string name="rating_button_no">No</string> <string name="no">Nu</string>
<string name="general">General</string> <string name="general">General</string>
<string name="source_code">Cod sursă</string> <string name="source_code">Cod sursă</string>
<string name="translation">Translation</string> <string name="translation">Translare</string>
<string name="licenses">Licenţe</string> <string name="licenses">Licenţe</string>
<string name="google_play_games">Jocurile Google Play</string> <string name="google_play_games">Jocurile Google Play</string>
<string name="connect">Conectează-te</string> <string name="connect">Conectează-te</string>
@ -88,9 +104,9 @@
<string name="no_network">Lipseste conexiune la internet.</string> <string name="no_network">Lipseste conexiune la internet.</string>
<string name="open_menu">Deschide meniul</string> <string name="open_menu">Deschide meniul</string>
<string name="close_menu">Închide meniul</string> <string name="close_menu">Închide meniul</string>
<string name="delete_all">Delete all</string> <string name="delete_all">Șterge tot</string>
<string name="themes">Themes</string> <string name="themes">Teme</string>
<string name="try_it">Try It</string> <string name="try_it">Încearcă-l</string>
<string name="delete_all_message">Delete all events permanently.</string> <string name="delete_all_message">Delete all events permanently.</string>
<string name="all_mines_disabled">Toate minele au fost dezactivate.</string> <string name="all_mines_disabled">Toate minele au fost dezactivate.</string>
<string name="desc_convered_area">Covered area</string> <string name="desc_convered_area">Covered area</string>
@ -102,5 +118,6 @@
<string name="you_exploded_a_mine">Ai explodat o mină!</string> <string name="you_exploded_a_mine">Ai explodat o mină!</string>
<string name="flag_placed">Steagul a fost plasat!</string> <string name="flag_placed">Steagul a fost plasat!</string>
<string name="flag_removed">Steagul a fost eliminat!</string> <string name="flag_removed">Steagul a fost eliminat!</string>
<string name="remove_ad">Remove Ads</string> <string name="remove_ad">Eliminați Reclamele</string>
<string name="help">Ajutor</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ru"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ru">
<string name="app_name">Anti-Mine</string> <string name="app_name">Anti-Mine</string>
<string name="app_description">Вам необходимо расчистить прямоугольную площадь со спрятанными минами, не взорвав ни одну из них.</string> <string name="app_description">Вам необходимо расчистить прямоугольную площадь со спрятанными минами, не взорвав ни одну из них.</string>
<string name="tutorial">Обучение</string>
<string name="tutorial_completed">Обучение завершено</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Игры</string> <string name="games">Игры</string>
<string name="previous_games">Предыдущие игры</string> <string name="previous_games">Предыдущие игры</string>
<string name="minefield">Сложность</string> <string name="minefield">Сложность</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Флаг</string> <string name="flag_tile">Флаг</string>
<string name="retry">Повторить</string> <string name="retry">Повторить</string>
<string name="empty">Пусто</string> <string name="empty">Пусто</string>
<string name="cant_do_it_now">Невозможно сделать это сейчас</string>
<string name="you_have_received">Вы получили: +%1$d</string>
<string name="help_win_a_game">Для получения дополнительной помощи вы должны выиграть игру.</string>
<string name="unknown_error">Неизвестная ошибка.</string> <string name="unknown_error">Неизвестная ошибка.</string>
<string name="leaderboards">Списки лидеров</string> <string name="leaderboards">Списки лидеров</string>
<string name="cancel">Отмена</string> <string name="cancel">Отмена</string>
@ -72,7 +88,7 @@
<string name="yes">Да</string> <string name="yes">Да</string>
<string name="unlock">Разблокировать</string> <string name="unlock">Разблокировать</string>
<string name="achievements">Достижения</string> <string name="achievements">Достижения</string>
<string name="rating_button_no">Нет</string> <string name="no">Нет</string>
<string name="general">Общее</string> <string name="general">Общее</string>
<string name="source_code">Исходный код</string> <string name="source_code">Исходный код</string>
<string name="translation">Перевод</string> <string name="translation">Перевод</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Флаг установлен!</string> <string name="flag_placed">Флаг установлен!</string>
<string name="flag_removed">Флаг снят!</string> <string name="flag_removed">Флаг снят!</string>
<string name="remove_ad">Удалить рекламу</string> <string name="remove_ad">Удалить рекламу</string>
<string name="help">Помощь</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="sv-rSE"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="sv-rSE">
<string name="app_name">Antimine</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="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string> <string name="games">Games</string>
<string name="previous_games">Previous Games</string> <string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string> <string name="minefield">Difficulty</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flag</string> <string name="flag_tile">Flag</string>
<string name="retry">Retry</string> <string name="retry">Retry</string>
<string name="empty">Empty</string> <string name="empty">Empty</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: +%1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">Unknown error.</string> <string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string> <string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string> <string name="cancel">Cancel</string>
@ -72,7 +88,7 @@
<string name="yes">Yes</string> <string name="yes">Yes</string>
<string name="unlock">Unlock</string> <string name="unlock">Unlock</string>
<string name="achievements">Achievements</string> <string name="achievements">Achievements</string>
<string name="rating_button_no">No</string> <string name="no">No</string>
<string name="general">General</string> <string name="general">General</string>
<string name="source_code">Source Code</string> <string name="source_code">Source Code</string>
<string name="translation">Translation</string> <string name="translation">Translation</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string> <string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string> <string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string> <string name="remove_ad">Remove Ads</string>
<string name="help">Help</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="th"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="th">
<string name="app_name">Antimine</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="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string> <string name="games">Games</string>
<string name="previous_games">Previous Games</string> <string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string> <string name="minefield">Difficulty</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flag</string> <string name="flag_tile">Flag</string>
<string name="retry">Retry</string> <string name="retry">Retry</string>
<string name="empty">Empty</string> <string name="empty">Empty</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: +%1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">Unknown error.</string> <string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string> <string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string> <string name="cancel">Cancel</string>
@ -72,7 +88,7 @@
<string name="yes">Yes</string> <string name="yes">Yes</string>
<string name="unlock">Unlock</string> <string name="unlock">Unlock</string>
<string name="achievements">Achievements</string> <string name="achievements">Achievements</string>
<string name="rating_button_no">No</string> <string name="no">No</string>
<string name="general">General</string> <string name="general">General</string>
<string name="source_code">Source Code</string> <string name="source_code">Source Code</string>
<string name="translation">Translation</string> <string name="translation">Translation</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string> <string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string> <string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string> <string name="remove_ad">Remove Ads</string>
<string name="help">Help</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="tr"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="tr">
<string name="app_name">Anti-Mine</string> <string name="app_name">Anti-Mine</string>
<string name="app_description">Hiçbirini patlatmadan gizli mayın içeren dikdörtgen bir tahtayı temizlemelisiniz.</string> <string name="app_description">Hiçbirini patlatmadan gizli mayın içeren dikdörtgen bir tahtayı temizlemelisiniz.</string>
<string name="tutorial">Eğitim</string>
<string name="tutorial_completed">Eğitim tamamlandı</string>
<string name="tutorial_0_bottom">Rastgele karede %1$s ile başlayabilirsiniz.</string>
<string name="tutorial_1_top">Numaralar vurgulanan kareye kaç tane bitişik mayın olduğuna işaret eder.</string>
<string name="tutorial_1_bottom">Bu nedenle, köşe 1 sadece bir bitişik kareye sahipse, bu bir mayın olmalıdır. İşaretlemek için %1$s.</string>
<string name="tutorial_2_top">Bir sonraki açılmamış karede mayın yok çünkü sayı 2⃣değil, 1⃣.</string>
<string name="tutorial_2_bottom">%1$s ile açabilirsin.</string>
<string name="tutorial_3_top">Bu 1⃣\'de de aynı şey. Bitişik mayının nerede olduğunu biliyorsun.</string>
<string name="tutorial_3_bottom">1⃣\'e bitişik bütün açılmamış mayınları açabilirsin.</string>
<string name="tutorial_4_top">Mayınların bir tanesinin nerede olduğunu biliyoruz. Böylece diğer mayın için sadece bir olasılık var.</string>
<string name="tutorial_4_bottom">2⃣\'ye komşu olan mayını işaretlemek için %1$s.</string>
<string name="tutorial_5_top">Vurgulanan numarayı kontrol edin.</string>
<string name="tutorial_5_bottom">Açmak için %1$s ya da işaretlemek için %2$s.</string>
<string name="games">Oyunlar</string> <string name="games">Oyunlar</string>
<string name="previous_games">Önceki Oyunlar</string> <string name="previous_games">Önceki Oyunlar</string>
<string name="minefield">Zorluk</string> <string name="minefield">Zorluk</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bayrak</string> <string name="flag_tile">Bayrak</string>
<string name="retry">Yeniden dene</string> <string name="retry">Yeniden dene</string>
<string name="empty">Boş</string> <string name="empty">Boş</string>
<string name="cant_do_it_now">Bunu şimdi yapmak imkansız</string>
<string name="you_have_received">Aldın: +%1$d</string>
<string name="help_win_a_game">Daha fazla Yardım için bir oyun kazanmalısınız.</string>
<string name="unknown_error">Bilinmeyen hata.</string> <string name="unknown_error">Bilinmeyen hata.</string>
<string name="leaderboards">Liderlik Tablosu</string> <string name="leaderboards">Liderlik Tablosu</string>
<string name="cancel">İptal</string> <string name="cancel">İptal</string>
@ -72,7 +88,7 @@
<string name="yes">Evet</string> <string name="yes">Evet</string>
<string name="unlock">Kilidini Aç</string> <string name="unlock">Kilidini Aç</string>
<string name="achievements">Başarımlar</string> <string name="achievements">Başarımlar</string>
<string name="rating_button_no">Hayır</string> <string name="no">Hayır</string>
<string name="general">Genel</string> <string name="general">Genel</string>
<string name="source_code">Kaynak Kodu</string> <string name="source_code">Kaynak Kodu</string>
<string name="translation">Çeviri</string> <string name="translation">Çeviri</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bayrak yerleştirildi!</string> <string name="flag_placed">Bayrak yerleştirildi!</string>
<string name="flag_removed">Bayrak kaldırıldı!</string> <string name="flag_removed">Bayrak kaldırıldı!</string>
<string name="remove_ad">Reklamları kaldır</string> <string name="remove_ad">Reklamları kaldır</string>
<string name="help">Yardım</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="uk"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="uk">
<string name="app_name">Сапер</string> <string name="app_name">Сапер</string>
<string name="app_description">Вам потрібно очистити поле від схованих мін, не детонуючи їх.</string> <string name="app_description">Вам потрібно очистити поле від схованих мін, не детонуючи їх.</string>
<string name="tutorial">Навчальний посібник</string>
<string name="tutorial_completed">Навчання пройдено</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Ігри</string> <string name="games">Ігри</string>
<string name="previous_games">Попередня гра</string> <string name="previous_games">Попередня гра</string>
<string name="minefield">Складність</string> <string name="minefield">Складність</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Прапор</string> <string name="flag_tile">Прапор</string>
<string name="retry">Повторити</string> <string name="retry">Повторити</string>
<string name="empty">Пусто</string> <string name="empty">Пусто</string>
<string name="cant_do_it_now">Неможливо зробити це зараз</string>
<string name="you_have_received">Ви отримали: +%1$d</string>
<string name="help_win_a_game">Для отримання додаткової допомоги ви повинні виграти гру.</string>
<string name="unknown_error">Невідома помилка.</string> <string name="unknown_error">Невідома помилка.</string>
<string name="leaderboards">Таблиця лідерів</string> <string name="leaderboards">Таблиця лідерів</string>
<string name="cancel">Відмінити</string> <string name="cancel">Відмінити</string>
@ -72,7 +88,7 @@
<string name="yes">Так</string> <string name="yes">Так</string>
<string name="unlock">Розблокування</string> <string name="unlock">Розблокування</string>
<string name="achievements">Досягнення</string> <string name="achievements">Досягнення</string>
<string name="rating_button_no">Ні</string> <string name="no">Ні</string>
<string name="general">Загальне</string> <string name="general">Загальне</string>
<string name="source_code">Вихідний код</string> <string name="source_code">Вихідний код</string>
<string name="translation">Переклад</string> <string name="translation">Переклад</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Прапор розміщено!</string> <string name="flag_placed">Прапор розміщено!</string>
<string name="flag_removed">Прапор вилучено!</string> <string name="flag_removed">Прапор вилучено!</string>
<string name="remove_ad">Прибрати рекламу</string> <string name="remove_ad">Прибрати рекламу</string>
<string name="help">Help</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="vi"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="vi">
<string name="app_name">Dò mìn</string> <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="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="tutorial">Hướng dẫn</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Trò chơi</string> <string name="games">Trò chơi</string>
<string name="previous_games">Trò chơi Trước</string> <string name="previous_games">Trò chơi Trước</string>
<string name="minefield">Độ khó</string> <string name="minefield">Độ khó</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Cờ</string> <string name="flag_tile">Cờ</string>
<string name="retry">Thử lại</string> <string name="retry">Thử lại</string>
<string name="empty">Trống</string> <string name="empty">Trống</string>
<string name="cant_do_it_now">Không thể làm điều đó bây giờ</string>
<string name="you_have_received">Bạn đã nhận được: +%1$d</string>
<string name="help_win_a_game">Để có thêm Trợ giúp, bạn phải thắng một trò chơi.</string>
<string name="unknown_error">Lỗi không xác định.</string> <string name="unknown_error">Lỗi không xác định.</string>
<string name="leaderboards">Bảng xếp hạng</string> <string name="leaderboards">Bảng xếp hạng</string>
<string name="cancel">Huỷ</string> <string name="cancel">Huỷ</string>
@ -72,7 +88,7 @@
<string name="yes"></string> <string name="yes"></string>
<string name="unlock">Mở khoá</string> <string name="unlock">Mở khoá</string>
<string name="achievements">Thành tựu</string> <string name="achievements">Thành tựu</string>
<string name="rating_button_no">Không</string> <string name="no">Không</string>
<string name="general">Tổng quan</string> <string name="general">Tổng quan</string>
<string name="source_code">Mã nguồn</string> <string name="source_code">Mã nguồn</string>
<string name="translation">Dịch thuật</string> <string name="translation">Dịch thuật</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Đã cắm cờ!</string> <string name="flag_placed">Đã cắm cờ!</string>
<string name="flag_removed">Đã tháo cờ hiệu!</string> <string name="flag_removed">Đã tháo cờ hiệu!</string>
<string name="remove_ad">Loại bỏ quảng cáo</string> <string name="remove_ad">Loại bỏ quảng cáo</string>
<string name="help">Trợ Giúp</string>
</resources> </resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="zh-rCN"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="zh-rCN">
<string name="app_name">Antimine - 扫雷</string> <string name="app_name">Antimine - 扫雷</string>
<string name="app_description">你需要清除一个隐藏着地雷的矩形面板,不能使任何地雷爆炸。</string> <string name="app_description">你需要清除一个隐藏着地雷的矩形面板,不能使任何地雷爆炸。</string>
<string name="tutorial">教学模式</string>
<string name="tutorial_completed">已完成的教程</string>
<string name="tutorial_0_bottom">你可以在任意的正方形开始 %1$s.</string>
<string name="tutorial_1_top">数字表明有多少地雷与高亮的正方形相邻。</string>
<string name="tutorial_1_bottom">因此,如果角 1⃣ 只有一个相邻的正方形,它必须是一个地雷。 %1$s 来标记它。</string>
<string name="tutorial_2_top">下一个未打开的方块没有地雷,因为数字是 1⃣ , 而不是 2⃣ 。</string>
<string name="tutorial_2_bottom">您可以通过 %1$s 打开它。</string>
<string name="tutorial_3_top">此 1⃣ 发生同样的情况。您知道其相邻的矿藏在哪里。</string>
<string name="tutorial_3_bottom">您可以在 1⃣ 旁打开所有其他未打开的方块</string>
<string name="tutorial_4_top">我们知道其中一枚地雷在哪里,因此,另一枚地雷只有一种可能性。</string>
<string name="tutorial_4_bottom">%1$s 标记附近的 2⃣ 的矿。</string>
<string name="tutorial_5_top">检查高亮的数字。</string>
<string name="tutorial_5_bottom">%1$s 打开或 %2$s 标记。</string>
<string name="games">游戏</string> <string name="games">游戏</string>
<string name="previous_games">上一局</string> <string name="previous_games">上一局</string>
<string name="minefield">难度</string> <string name="minefield">难度</string>
@ -65,6 +78,9 @@
<string name="flag_tile">标志</string> <string name="flag_tile">标志</string>
<string name="retry">重试</string> <string name="retry">重试</string>
<string name="empty"></string> <string name="empty"></string>
<string name="cant_do_it_now">现在无法做到这一点。</string>
<string name="you_have_received">您已收到: +%1$d</string>
<string name="help_win_a_game">为了获得更多帮助,你必须赢得一场游戏。</string>
<string name="unknown_error">未知错误。</string> <string name="unknown_error">未知错误。</string>
<string name="leaderboards">排行榜</string> <string name="leaderboards">排行榜</string>
<string name="cancel">取消</string> <string name="cancel">取消</string>
@ -72,7 +88,7 @@
<string name="yes"></string> <string name="yes"></string>
<string name="unlock">解锁​​​​</string> <string name="unlock">解锁​​​​</string>
<string name="achievements">成就</string> <string name="achievements">成就</string>
<string name="rating_button_no"></string> <string name="no"></string>
<string name="general">通用</string> <string name="general">通用</string>
<string name="source_code">源代码</string> <string name="source_code">源代码</string>
<string name="translation">翻译</string> <string name="translation">翻译</string>
@ -103,4 +119,5 @@
<string name="flag_placed">标记已放置!</string> <string name="flag_placed">标记已放置!</string>
<string name="flag_removed">标记已移除!</string> <string name="flag_removed">标记已移除!</string>
<string name="remove_ad">去除广告</string> <string name="remove_ad">去除广告</string>
<string name="help">帮助</string>
</resources> </resources>

View file

@ -1,7 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en"> <resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
<string name="app_name">Antimine</string> <string name="tutorial">Tutorial</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string> <string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string> <string name="games">Games</string>
<string name="previous_games">Previous Games</string> <string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string> <string name="minefield">Difficulty</string>
@ -9,6 +20,7 @@
<string name="beginner">Beginner</string> <string name="beginner">Beginner</string>
<string name="intermediate">Intermediate</string> <string name="intermediate">Intermediate</string>
<string name="expert">Expert</string> <string name="expert">Expert</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="open">Open</string> <string name="open">Open</string>
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="animations">Animations</string> <string name="animations">Animations</string>
@ -33,7 +45,6 @@
<string name="system">System</string> <string name="system">System</string>
<string name="rating">Feedback</string> <string name="rating">Feedback</string>
<string name="support_title">Support us!</string> <string name="support_title">Support us!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="support_action">To support</string> <string name="support_action">To support</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string> <string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</string> <string name="used_software_text">This game uses the following third parties software:</string>
@ -65,6 +76,9 @@
<string name="flag_tile">Flag</string> <string name="flag_tile">Flag</string>
<string name="retry">Retry</string> <string name="retry">Retry</string>
<string name="empty">Empty</string> <string name="empty">Empty</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: +%1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">Unknown error.</string> <string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string> <string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string> <string name="cancel">Cancel</string>
@ -72,7 +86,7 @@
<string name="yes">Yes</string> <string name="yes">Yes</string>
<string name="unlock">Unlock</string> <string name="unlock">Unlock</string>
<string name="achievements">Achievements</string> <string name="achievements">Achievements</string>
<string name="rating_button_no">No</string> <string name="no">No</string>
<string name="general">General</string> <string name="general">General</string>
<string name="source_code">Source Code</string> <string name="source_code">Source Code</string>
<string name="translation">Translation</string> <string name="translation">Translation</string>
@ -103,4 +117,7 @@
<string name="flag_placed">Flag placed!</string> <string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string> <string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string> <string name="remove_ad">Remove Ads</string>
<string name="help">Help</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>
</resources> </resources>

View file

@ -6,8 +6,8 @@ android {
compileSdkVersion 30 compileSdkVersion 30
defaultConfig { defaultConfig {
versionCode 800111 versionCode 800101
versionName '8.0.11' versionName '8.1.0'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
} }

View file

@ -10,8 +10,8 @@ android {
compileSdkVersion 30 compileSdkVersion 30
defaultConfig { defaultConfig {
versionCode 800111 versionCode 800101
versionName '8.0.11' versionName '8.1.0'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
} }

View file

@ -8,8 +8,8 @@ android {
defaultConfig { defaultConfig {
// versionCode and versionName must be hardcoded to support F-droid // versionCode and versionName must be hardcoded to support F-droid
versionCode 800111 versionCode 800101
versionName '8.0.11' versionName '8.1.0'
applicationId 'dev.lucasnlm.antimine' applicationId 'dev.lucasnlm.antimine'
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 30 targetSdkVersion 30

View file

@ -17,8 +17,6 @@ class WatchLevelFragment : CommonLevelFragment(R.layout.fragment_level) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
recyclerGrid = view.findViewById(R.id.recyclerGrid)
recyclerGrid.doOnLayout { recyclerGrid.doOnLayout {
lifecycleScope.launch { lifecycleScope.launch {
val levelSetup = gameViewModel.loadLastGame() val levelSetup = gameViewModel.loadLastGame()

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="new_game">New Game</string> <string name="new_game">Nyt spil</string>
<string name="victory">You won!&#xA0;😎</string> <string name="victory">Du vandt!&#xA0;😎</string>
<string name="game_over">Exploded!&#xA0;😢</string> <string name="game_over">Eksploderet!&#xA0;😢</string>
</resources> </resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="new_game">New Game</string> <string name="new_game">משחק חדש</string>
<string name="victory">You won!&#xA0;😎</string> <string name="victory">נצחון!&#xA0;😎</string>
<string name="game_over">Exploded!&#xA0;😢</string> <string name="game_over">פיצוץ!&#xA0;😢</string>
</resources> </resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="new_game">New Game</string> <string name="new_game">새 게임</string>
<string name="victory">You won!&#xA0;😎</string> <string name="victory">승리!&#xA0;😎</string>
<string name="game_over">Exploded!&#xA0;😢</string> <string name="game_over">펑! 게임 오버!&#xA0;😢</string>
</resources> </resources>