Add ko [Korean] translations

Add partial translations for korean.
This commit is contained in:
OxygenCobalt 2021-02-14 10:35:22 -07:00
parent 62572e7e52
commit b6ac897314
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
17 changed files with 141 additions and 56 deletions

View file

@ -1,6 +1,5 @@
package org.oxycblt.auxio
import android.animation.LayoutTransition
import android.content.res.ColorStateList
import android.os.Bundle
import android.view.LayoutInflater
@ -10,7 +9,6 @@ import android.view.ViewGroup
import androidx.core.graphics.ColorUtils
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import androidx.navigation.NavController
import androidx.navigation.NavOptions
import androidx.navigation.fragment.NavHostFragment
@ -71,13 +69,6 @@ class MainFragment : Fragment() {
binding.lifecycleOwner = this
// Apply custom interpolation effects
// The container layout types differ in the land/port layouts so it has to be cast to their parent instead.
(binding.controlsContainer as ViewGroup).layoutTransition = LayoutTransition().apply {
setInterpolator(LayoutTransition.APPEARING, FastOutSlowInInterpolator())
setInterpolator(LayoutTransition.DISAPPEARING, FastOutSlowInInterpolator())
}
binding.navBar.apply {
itemIconTintList = navTints
itemTextColor = navTints

View file

@ -13,7 +13,7 @@ import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.recycler.DiffCallback
import org.oxycblt.auxio.recycler.viewholders.BaseHolder
import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder
import org.oxycblt.auxio.recycler.viewholders.Highlightable
import org.oxycblt.auxio.ui.Accent
import org.oxycblt.auxio.ui.applyAccents
@ -107,7 +107,7 @@ class AlbumDetailAdapter(
inner class AlbumHeaderViewHolder(
private val binding: ItemAlbumHeaderBinding
) : BaseHolder<Album>(binding) {
) : BaseViewHolder<Album>(binding) {
override fun onBind(data: Album) {
binding.album = data
@ -126,7 +126,7 @@ class AlbumDetailAdapter(
inner class AlbumSongViewHolder(
private val binding: ItemAlbumSongBinding,
) : BaseHolder<Song>(binding, doOnClick, doOnLongClick), Highlightable {
) : BaseViewHolder<Song>(binding, doOnClick, doOnLongClick), Highlightable {
private val normalTextColor = binding.songName.currentTextColor
private val inactiveTextColor = binding.songTrack.currentTextColor

View file

@ -13,7 +13,7 @@ import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.recycler.DiffCallback
import org.oxycblt.auxio.recycler.viewholders.BaseHolder
import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder
import org.oxycblt.auxio.recycler.viewholders.Highlightable
import org.oxycblt.auxio.ui.Accent
import org.oxycblt.auxio.ui.applyAccents
@ -106,7 +106,7 @@ class ArtistDetailAdapter(
inner class ArtistHeaderViewHolder(
private val binding: ItemArtistHeaderBinding
) : BaseHolder<Artist>(binding) {
) : BaseViewHolder<Artist>(binding) {
override fun onBind(data: Artist) {
binding.artist = data
@ -126,7 +126,7 @@ class ArtistDetailAdapter(
// Generic ViewHolder for a detail album
inner class ArtistAlbumViewHolder(
private val binding: ItemArtistAlbumBinding,
) : BaseHolder<Album>(binding, doOnClick, doOnLongClick), Highlightable {
) : BaseViewHolder<Album>(binding, doOnClick, doOnLongClick), Highlightable {
private val normalTextColor = binding.albumName.currentTextColor
override fun onBind(data: Album) {

View file

@ -13,7 +13,7 @@ import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.recycler.DiffCallback
import org.oxycblt.auxio.recycler.viewholders.BaseHolder
import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder
import org.oxycblt.auxio.recycler.viewholders.Highlightable
import org.oxycblt.auxio.ui.Accent
import org.oxycblt.auxio.ui.applyAccents
@ -108,7 +108,7 @@ class GenreDetailAdapter(
inner class GenreHeaderViewHolder(
private val binding: ItemGenreHeaderBinding
) : BaseHolder<Genre>(binding) {
) : BaseViewHolder<Genre>(binding) {
override fun onBind(data: Genre) {
binding.genre = data
binding.detailModel = detailModel
@ -126,7 +126,7 @@ class GenreDetailAdapter(
inner class GenreSongViewHolder(
private val binding: ItemGenreSongBinding,
) : BaseHolder<Song>(binding, doOnClick, doOnLongClick), Highlightable {
) : BaseViewHolder<Song>(binding, doOnClick, doOnLongClick), Highlightable {
private val normalTextColor = binding.songName.currentTextColor
override fun onBind(data: Song) {

View file

@ -16,8 +16,6 @@ import android.support.v4.media.MediaMetadataCompat
import android.support.v4.media.session.MediaSessionCompat
import android.view.KeyEvent
import androidx.core.app.NotificationCompat
import androidx.media2.session.MediaController
import androidx.media2.session.MediaSession
import com.google.android.exoplayer2.C
import com.google.android.exoplayer2.ExoPlaybackException
import com.google.android.exoplayer2.MediaItem

View file

@ -3,6 +3,7 @@ package org.oxycblt.auxio.playback.queue
import android.annotation.SuppressLint
import android.view.MotionEvent
import android.view.ViewGroup
import androidx.appcompat.widget.TooltipCompat
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
@ -15,7 +16,7 @@ import org.oxycblt.auxio.music.Header
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.PlaybackViewModel
import org.oxycblt.auxio.recycler.DiffCallback
import org.oxycblt.auxio.recycler.viewholders.BaseHolder
import org.oxycblt.auxio.recycler.viewholders.BaseViewHolder
import org.oxycblt.auxio.recycler.viewholders.HeaderViewHolder
import org.oxycblt.auxio.ui.inflater
@ -132,7 +133,7 @@ class QueueAdapter(
*/
inner class QueueSongViewHolder(
private val binding: ItemQueueSongBinding,
) : BaseHolder<Song>(binding) {
) : BaseViewHolder<Song>(binding) {
@SuppressLint("ClickableViewAccessibility")
override fun onBind(data: Song) {
@ -159,12 +160,13 @@ class QueueAdapter(
*/
inner class UserQueueHeaderViewHolder(
private val binding: ItemActionHeaderBinding
) : BaseHolder<Header>(binding) {
) : BaseViewHolder<Header>(binding) {
init {
binding.headerButton.contentDescription = binding.headerButton.context.getString(
R.string.description_clear_user_queue
)
binding.headerButton.apply {
contentDescription = context.getString(R.string.description_clear_user_queue)
TooltipCompat.setTooltipText(this, contentDescription)
}
}
override fun onBind(data: Header) {

View file

@ -13,7 +13,7 @@ import org.oxycblt.auxio.music.BaseModel
* @param doOnLongClick (Optional, defaults to null) Functions that specifics what to do on a long click. Null if nothing should be done.
* @author OxygenCobalt
*/
abstract class BaseHolder<T : BaseModel>(
abstract class BaseViewHolder<T : BaseModel>(
private val binding: ViewDataBinding,
private val doOnClick: ((data: T) -> Unit)? = null,
private val doOnLongClick: ((view: View, data: T) -> Unit)? = null
@ -52,7 +52,7 @@ abstract class BaseHolder<T : BaseModel>(
/**
* Function that performs binding operations unique to the inheriting viewholder.
* Add any specialized code to an override of this instead of [BaseHolder] itself.
* Add any specialized code to an override of this instead of [BaseViewHolder] itself.
*/
protected abstract fun onBind(data: T)
}

View file

@ -38,7 +38,7 @@ class SongViewHolder private constructor(
private val binding: ItemSongBinding,
doOnClick: (data: Song) -> Unit,
doOnLongClick: (view: View, data: Song) -> Unit
) : BaseHolder<Song>(binding, doOnClick, doOnLongClick) {
) : BaseViewHolder<Song>(binding, doOnClick, doOnLongClick) {
override fun onBind(data: Song) {
binding.song = data
@ -73,7 +73,7 @@ class AlbumViewHolder private constructor(
private val binding: ItemAlbumBinding,
doOnClick: (data: Album) -> Unit,
doOnLongClick: (view: View, data: Album) -> Unit
) : BaseHolder<Album>(binding, doOnClick, doOnLongClick) {
) : BaseViewHolder<Album>(binding, doOnClick, doOnLongClick) {
override fun onBind(data: Album) {
binding.album = data
@ -106,7 +106,7 @@ class ArtistViewHolder private constructor(
private val binding: ItemArtistBinding,
doOnClick: (Artist) -> Unit,
doOnLongClick: (view: View, data: Artist) -> Unit
) : BaseHolder<Artist>(binding, doOnClick, doOnLongClick) {
) : BaseViewHolder<Artist>(binding, doOnClick, doOnLongClick) {
override fun onBind(data: Artist) {
binding.artist = data
@ -139,7 +139,7 @@ class GenreViewHolder private constructor(
private val binding: ItemGenreBinding,
doOnClick: (Genre) -> Unit,
doOnLongClick: (view: View, data: Genre) -> Unit
) : BaseHolder<Genre>(binding, doOnClick, doOnLongClick) {
) : BaseViewHolder<Genre>(binding, doOnClick, doOnLongClick) {
override fun onBind(data: Genre) {
binding.genre = data
@ -168,7 +168,7 @@ class GenreViewHolder private constructor(
/**
* The Shared ViewHolder for a [Header]. Instantiation should be done with [from]
*/
class HeaderViewHolder(private val binding: ItemHeaderBinding) : BaseHolder<Header>(binding) {
class HeaderViewHolder(private val binding: ItemHeaderBinding) : BaseViewHolder<Header>(binding) {
override fun onBind(data: Header) {
binding.header = data

View file

@ -1,18 +1,23 @@
package org.oxycblt.auxio.ui
import android.animation.LayoutTransition
import android.content.Context
import android.graphics.Canvas
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.interpolator.view.animation.FastOutSlowInInterpolator
import org.oxycblt.auxio.logD
import org.oxycblt.auxio.logE
import java.lang.reflect.Field
/**
* Hack layout that fixes an issue where disappearing views would draw over non-disappearing
* views when animated with a stock LayoutTransition. Adapted from this StackOverflow answer:
* views when animated with a stock LayoutTransition. If something breaks on the playback controls
* or nav bar, this is probably the culprit.
*
* Adapted from this StackOverflow answer:
* https://stackoverflow.com/a/35087229
*/
class SlideLinearLayout @JvmOverloads constructor(
@ -35,8 +40,14 @@ class SlideLinearLayout @JvmOverloads constructor(
private var doDrawingTrick: Boolean = false
init {
// Apply custom interpolation for the slide animations
layoutTransition.apply {
setInterpolator(LayoutTransition.APPEARING, FastOutSlowInInterpolator())
setInterpolator(LayoutTransition.DISAPPEARING, FastOutSlowInInterpolator())
}
if (disappearingChildrenField != null) {
// Create a junk view and add it, which makes all the magic happen [I think??].
// Create a junk view and add it, which makes all the magic happen [I think].
dumpView = View(context)
addView(dumpView, 0, 0)
}
@ -54,15 +65,14 @@ class SlideLinearLayout @JvmOverloads constructor(
override fun drawChild(canvas: Canvas?, child: View?, drawingTime: Long): Boolean {
val children = getDisappearingChildren()
// I have no idea what this code does.
if (doDrawingTrick && children != null) {
if (child == dumpView) {
if (child == dumpView) { // Use the dump view as a marker for when to do the trick
var more = false
children.forEach {
more = more or super.drawChild(canvas, it, drawingTime)
more = more or super.drawChild(canvas, it, drawingTime) // What????
}
return more
} else if (children.contains(child)) {
} else if (children.contains(child)) { // Ignore the disappearing children
return false
}
}
@ -73,7 +83,9 @@ class SlideLinearLayout @JvmOverloads constructor(
private fun beforeDispatchDraw(): Boolean {
val children = getDisappearingChildren()
if (children == null || children.isEmpty() || childCount <= 1) { // Junk view included
// Dont do trick if there are no disappearing children or if there arent any children other
// than the dump view.
if (children == null || children.isEmpty() || childCount <= 1) {
return false
}
@ -86,10 +98,9 @@ class SlideLinearLayout @JvmOverloads constructor(
return disappearingChildren
}
// If there is no list of disappearing children yet, attempt to get it.
try {
disappearingChildren = disappearingChildrenField.get(this) as List<View>?
} catch (e: IllegalAccessException) {
} catch (e: Exception) {
logD("Could not get list of disappearing children.")
}

View file

@ -26,21 +26,21 @@
android:id="@+id/controls_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:animateLayoutChanges="true"
android:background="?android:attr/windowBackground"
android:baselineAligned="false"
android:animateLayoutChanges="true"
android:elevation="@dimen/elevation_normal"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_bar"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1.5"
android:background="@color/background"
android:elevation="0dp"
app:elevation="0dp"
android:layout_weight="1.5"
app:menu="@menu/menu_nav" />
<androidx.fragment.app.FragmentContainerView

View file

@ -210,11 +210,11 @@
<ImageButton
android:id="@+id/playback_shuffle"
style="@style/Widget.Button.Unbounded"
android:layout_marginEnd="@dimen/margin_mid_small"
android:background="@drawable/ui_unbounded_ripple"
android:contentDescription="@{playbackModel.isShuffling() ? @string/description_shuffle_off : @string/description_shuffle_on"
android:onClick="@{() -> playbackModel.invertShuffleStatus()}"
android:src="@drawable/ic_shuffle"
android:layout_marginEnd="@dimen/margin_mid_small"
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_next"
app:layout_constraintEnd_toEndOf="@+id/playback_song_duration"
app:layout_constraintTop_toTopOf="@+id/playback_skip_next" />

View file

@ -26,10 +26,10 @@
android:id="@+id/controls_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="?android:attr/windowBackground"
android:animateLayoutChanges="true"
android:background="?android:attr/windowBackground"
android:elevation="@dimen/elevation_normal"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.fragment.app.FragmentContainerView

View file

@ -13,9 +13,7 @@
android:title="@string/label_sort"
app:showAsAction="always">
<menu>
<group
android:id="@+id/group_sorting"
android:checkableBehavior="single">
<group android:checkableBehavior="single">
<item
android:id="@+id/option_sort_none"
android:contentDescription="@string/description_sort_none"

View file

@ -7,9 +7,7 @@
android:title="@string/label_filter"
app:showAsAction="ifRoom">
<menu>
<group
android:id="@+id/group_filtering"
android:checkableBehavior="single">
<group android:checkableBehavior="single">
<item
android:id="@+id/option_filter_all"
android:title="@string/label_filter_all"

View file

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Label Namespace | Static Labels -->
<string name="label_retry">재시도</string>
<string name="label_grant">허가</string>
<string name="label_library">보관함</string>
<string name="label_genres">장르</string>
<string name="label_artists">아티스트</string>
<string name="label_albums">앨범</string>
<string name="label_songs">노래</string>
<string name="label_all_songs">노래</string>
<string name="label_search">검색</string>
<string name="label_filter">필터</string>
<string name="label_filter_all">전부</string>
<string name="label_sort">분류</string>
<string name="label_sort_none">기본</string>
<string name="label_sort_alpha_down">А-Z</string>
<string name="label_sort_alpha_up">Z-A</string>
<string name="label_play">재생</string>
<string name="label_shuffle">모든 곡 랜덤 재생</string>
<string name="label_playback">지금 재생 중</string>
<string name="label_queue">대기열</string>
<string name="label_queue_add">대기열에 추가</string>
<string name="label_queue_added">가 대기열에 추가되었습니다</string>
<string name="label_next_user_queue">다음 곡</string>
<string name="label_go_artist">아티스트로 가기</string>
<string name="label_go_album">앨범으로 가기</string>
<string name="label_about">정보</string>
<string name="label_version">버전</string>
<string name="label_code">GitHub에서 보기</string>
<string name="label_faq">FAQ</string>
<string name="label_licenses">라이선스</string>
<!-- Settings namespace | Settings-related labels -->
<string name="setting_title">설정</string>
<string name="setting_ui">스타일</string>
<string name="setting_theme">테마</string>
<string name="setting_theme_auto">자동</string>
<string name="setting_theme_day">밝은 테마</string>
<string name="setting_theme_night">어두운 테마</string>
<string name="setting_accent">강조</string>
<string name="setting_color_notif">색상화된 알림</string>
<string name="setting_quality_covers">미디어 스토어 앨범 커버 무시</string>
<string name="setting_audio">오디오</string>
<string name="setting_audio_focus">오디오 포커스</string>
<string name="setting_audio_plug_mgt">헤드셋 연결</string>
<string name="setting_behavior">동작</string>
<string name="setting_behavior_end_loop">계속</string>
<string name="setting_behavior_end_stop">중단</string>
<!-- Error Namespace | Error Labels -->
<string name="error_no_music">노래를 찾을 수 없습니다</string>
<!-- Description Namespace | Accessibility Strings -->
<string name="description_track_number">트랙 %d</string>
<string name="description_play_pause">재생/일시 정지</string>
<string name="description_clear_user_queue">재생 대기열 비우기</string>
<string name="description_error">오류</string>
<!-- Hint Namespace | EditText Hints -->
<string name="hint_search_library">저장소 검색…</string>
<!-- Format Namespace | Value formatting/plurals -->
<string name="format_songs_loaded">찾은 노래 수: %d</string>
<plurals name="format_song_count">
<item quantity="other">노래</item>
</plurals>
<plurals name="format_album_count">
<item quantity="other">앨범</item>
</plurals>
</resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Label Namespace | Static Labels -->
<!-- Label Namespace | Static Labels -->
<string name="label_retry">Reîncearcă</string>
<string name="label_grant">Permiteți</string>

View file

@ -52,6 +52,5 @@
<!-- Misc -->
<dimen name="elevation_normal">4dp</dimen>
<dimen name="elevation_high">8dp</dimen>
<dimen name="offset_thumb">4dp</dimen>
</resources>