Merge branch 'translation_tweaks' into 'master'

Translation tweaks (#265)

Closes #265

See merge request pixeldroid/PixelDroid!266
This commit is contained in:
Matthieu 2020-12-16 22:17:31 +01:00
commit 6483989c09
41 changed files with 314 additions and 172 deletions

19
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,19 @@
If you want to contribute to PixelDroid, you can do so in several ways:
# Translation
You can help to translate PixelDroid to your favourite language. Please do not submit Merge Requests directly, but use our weblate at https://weblate.pixeldroid.org/projects/pixeldroid/pixeldroid/ .
You can add a new language by using the "Start new translation" button on the bottom left of the page.
Before translating, please take a look at the [TRANSLATION.md](TRANSLATION.md) file for details and some guidance.
# Creating issues on the issue tracker
If you encounter a problem or have an idea about how to make PixelDroid better, you should make an issue about it on our [GitLab project](https://gitlab.shinice.net/pixeldroid/PixelDroid/-/issues). If you encountered a problem, please make sure to document how to reproduce it, and include screenshots if possible. If you are making a suggestion, please try to be detailed in your description.
# Contribute changes or fix bugs
You can also help us solve one of the existing issues, or improve the application in some other way, by contributing changes yourself. To do this you can fork the project and submit a Merge Request.
Before starting to work on an issue or an improvement, you can ask us on our Matrix channel (#pixeldroid:gnugen.ch) what we think, or make a comment on the relevant issue, so that we might point you in the right direction, and to make sure someone else is not already working on it.

15
TRANSLATION.md Normal file
View File

@ -0,0 +1,15 @@
# Register on our Weblate instance
Sign up on our instance and go to the PixelDroid project here: https://weblate.pixeldroid.org/projects/pixeldroid/pixeldroid/
No need to specify your real name, obviously, unless you want to.
# Start translating
Go to the project's page ( https://weblate.pixeldroid.org/projects/pixeldroid/pixeldroid ). Click on the language you want to work with (for example, Catalan would be at https://weblate.pixeldroid.org/projects/pixeldroid/pixeldroid/ca/ ). Then click the "Translate" button on the right. You can then edit the missing translations and review existing ones.
For more details, you can check out Weblate's documentation: https://docs.weblate.org/en/latest/user/translating.html
## Glossaries
When translating something containing a term specific to Pixelfed, PixelDroid, or the fediverse in general, be sure to add the items to the glossary of the language you are translating to, this helps to keep translating consistent. When translating, make sure to check the glossary to use the proper terms, and if you change an entry in the glossary make sure to also edit the entries containing that term.

View File

@ -2,10 +2,9 @@ package com.h.pixeldroid
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_about.*
class AboutActivity : AppCompatActivity() {
class AboutActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_about)

View File

@ -0,0 +1,58 @@
package com.h.pixeldroid
import android.content.Context
import android.content.res.Configuration
import android.content.res.Resources
import android.os.Build
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceManager
import com.h.pixeldroid.db.AppDatabase
import com.h.pixeldroid.di.PixelfedAPIHolder
import java.util.*
import javax.inject.Inject
open class BaseActivity : AppCompatActivity() {
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var apiHolder: PixelfedAPIHolder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
(this.application as Pixeldroid).getAppComponent().inject(this)
}
override fun attachBaseContext(base: Context) {
super.attachBaseContext(updateBaseContextLocale(base))
}
private fun updateBaseContextLocale(context: Context): Context {
val language = PreferenceManager.getDefaultSharedPreferences(context).getString("language", "default") ?: "default"
if(language == "default"){
return context
}
val locale = Locale.forLanguageTag(language)
Locale.setDefault(locale)
return if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
updateResourcesLocale(context, locale)
} else updateResourcesLocaleLegacy(context, locale)
}
private fun updateResourcesLocale(context: Context, locale: Locale): Context =
context.createConfigurationContext(
Configuration(context.resources.configuration)
.apply { setLocale(locale) }
)
@Suppress("DEPRECATION")
private fun updateResourcesLocaleLegacy(context: Context, locale: Locale): Context {
val resources: Resources = context.resources
val configuration: Configuration = resources.configuration
configuration.locale = locale
resources.updateConfiguration(configuration, resources.displayMetrics)
return context
}
}

View File

@ -1,10 +1,9 @@
package com.h.pixeldroid
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.h.pixeldroid.fragments.CameraFragment
class CameraActivity : AppCompatActivity() {
class CameraActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_camera)

View File

@ -1,25 +1,19 @@
package com.h.pixeldroid
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.h.pixeldroid.db.AppDatabase
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.accountLists.AccountListFragment
import com.h.pixeldroid.objects.Account
import com.h.pixeldroid.objects.Account.Companion.ACCOUNT_ID_TAG
import com.h.pixeldroid.objects.Account.Companion.ACCOUNT_TAG
import com.h.pixeldroid.objects.Account.Companion.FOLLOWERS_TAG
import javax.inject.Inject
class FollowsActivity : AppCompatActivity() {
class FollowsActivity : BaseActivity() {
private var followsFragment = AccountListFragment()
@Inject
lateinit var db: AppDatabase
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_followers)
(this.application as Pixeldroid).getAppComponent().inject(this)
supportActionBar?.setDisplayHomeAsUpEnabled(true)

View File

@ -1,11 +1,10 @@
package com.h.pixeldroid
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_licenses.*
class LicenseActivity : AppCompatActivity() {
class LicenseActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_licenses)

View File

@ -10,11 +10,8 @@ import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity
import androidx.browser.customtabs.CustomTabsIntent
import com.h.pixeldroid.api.PixelfedAPI
import com.h.pixeldroid.db.AppDatabase
import com.h.pixeldroid.di.PixelfedAPIHolder
import com.h.pixeldroid.objects.*
import com.h.pixeldroid.utils.DBUtils
import com.h.pixeldroid.utils.Utils
@ -30,7 +27,6 @@ import okhttp3.HttpUrl
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import javax.inject.Inject
/**
Overview of the flow of the login process: (boxes are requests done in parallel,
@ -48,7 +44,7 @@ since they do not depend on each other)
*/
class LoginActivity : AppCompatActivity() {
class LoginActivity : BaseActivity() {
companion object {
private const val PACKAGE_ID = BuildConfig.APPLICATION_ID
@ -58,11 +54,6 @@ class LoginActivity : AppCompatActivity() {
private lateinit var oauthScheme: String
private lateinit var appName: String
private lateinit var preferences: SharedPreferences
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var apiHolder: PixelfedAPIHolder
private lateinit var pixelfedAPI: PixelfedAPI
private var inputVisibility: Int = View.GONE
@ -71,7 +62,6 @@ class LoginActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
(application as Pixeldroid).getAppComponent().inject(this)
loadingAnimation(true)
appName = getString(R.string.app_name)
oauthScheme = getString(R.string.auth_scheme)

View File

@ -16,15 +16,13 @@ import androidx.paging.ExperimentalPagingApi
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.bumptech.glide.Glide
import com.google.android.material.tabs.TabLayoutMediator
import com.h.pixeldroid.db.AppDatabase
import com.h.pixeldroid.db.entities.HomeStatusDatabaseEntity
import com.h.pixeldroid.db.entities.PublicFeedStatusDatabaseEntity
import com.h.pixeldroid.db.entities.UserDatabaseEntity
import com.h.pixeldroid.di.PixelfedAPIHolder
import com.h.pixeldroid.fragments.CameraFragment
import com.h.pixeldroid.fragments.SearchDiscoverFragment
import com.h.pixeldroid.fragments.feeds.cachedFeeds.postFeeds.PostFeedFragment
import com.h.pixeldroid.fragments.feeds.cachedFeeds.notifications.NotificationsFragment
import com.h.pixeldroid.fragments.feeds.cachedFeeds.postFeeds.PostFeedFragment
import com.h.pixeldroid.objects.Account
import com.h.pixeldroid.utils.DBUtils
import com.h.pixeldroid.utils.Utils.Companion.hasInternet
@ -42,15 +40,8 @@ import org.ligi.tracedroid.sending.TraceDroidEmailSender
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import java.lang.IllegalArgumentException
import javax.inject.Inject
class MainActivity : AppCompatActivity() {
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var apiHolder: PixelfedAPIHolder
class MainActivity : BaseActivity() {
private lateinit var header: AccountHeaderView
private var user: UserDatabaseEntity? = null
@ -65,11 +56,8 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
TraceDroidEmailSender.sendStackTraces("contact@pixeldroid.org", this)
(this.application as Pixeldroid).getAppComponent().inject(this)
//get the currently active user
user = db.userDao().getActiveUser()

View File

@ -21,7 +21,6 @@ import android.view.MenuItem
import android.view.View.GONE
import android.view.View.VISIBLE
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.net.toFile
@ -59,7 +58,7 @@ private const val REQUEST_CODE_PERMISSIONS_SEND_PHOTO = 7
private val REQUIRED_PERMISSIONS = arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
class PhotoEditActivity : AppCompatActivity(), FilterListFragmentListener, EditImageFragmentListener {
class PhotoEditActivity : BaseActivity(), FilterListFragmentListener, EditImageFragmentListener {
internal var saving: Boolean = false
private val BITMAP_CONFIG = Bitmap.Config.ARGB_8888

View File

@ -3,41 +3,27 @@ package com.h.pixeldroid
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.h.pixeldroid.api.PixelfedAPI
import com.h.pixeldroid.db.AppDatabase
import com.h.pixeldroid.di.PixelfedAPIHolder
import com.h.pixeldroid.fragments.PostFragment
import com.h.pixeldroid.objects.DiscoverPost
import com.h.pixeldroid.objects.Status
import com.h.pixeldroid.objects.Status.Companion.DISCOVER_TAG
import com.h.pixeldroid.objects.Status.Companion.DOMAIN_TAG
import com.h.pixeldroid.objects.Status.Companion.POST_TAG
import com.h.pixeldroid.utils.DBUtils
import kotlinx.android.synthetic.main.activity_post.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import javax.inject.Inject
class PostActivity : AppCompatActivity() {
class PostActivity : BaseActivity() {
private lateinit var postFragment : PostFragment
lateinit var domain : String
private lateinit var accessToken : String
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var apiHolder: PixelfedAPIHolder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
(this.application as Pixeldroid).getAppComponent().inject(this)
val status = intent.getSerializableExtra(POST_TAG) as Status?
val discoverPost: DiscoverPost? = intent.getSerializableExtra(DISCOVER_TAG) as DiscoverPost?

View File

@ -11,16 +11,13 @@ import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.net.toFile
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.android.material.textfield.TextInputLayout
import com.h.pixeldroid.api.PixelfedAPI
import com.h.pixeldroid.db.AppDatabase
import com.h.pixeldroid.db.entities.UserDatabaseEntity
import com.h.pixeldroid.di.PixelfedAPIHolder
import com.h.pixeldroid.interfaces.PostCreationListener
import com.h.pixeldroid.objects.Attachment
import com.h.pixeldroid.objects.Instance
@ -35,13 +32,12 @@ import okhttp3.MultipartBody
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import javax.inject.Inject
private val TAG = "Post Creation Activity"
private val MORE_PICTURES_REQUEST_CODE = 0xffff
class PostCreationActivity : AppCompatActivity(), PostCreationListener {
class PostCreationActivity : BaseActivity(), PostCreationListener {
private lateinit var recycler : RecyclerView
private lateinit var adapter : PostCreationAdapter
@ -58,19 +54,10 @@ class PostCreationActivity : AppCompatActivity(), PostCreationListener {
private var posts: ArrayList<String> = ArrayList()
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var apiHolder: PixelfedAPIHolder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_post_creation)
(this.application as Pixeldroid).getAppComponent().inject(this)
// get image URIs
if(intent.clipData != null) {
val count = intent.clipData!!.itemCount

View File

@ -8,7 +8,6 @@ import android.util.Log
import android.view.View
import android.widget.*
import androidx.annotation.StringRes
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.GridLayoutManager
@ -16,9 +15,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.h.pixeldroid.adapters.ProfilePostsRecyclerViewAdapter
import com.h.pixeldroid.api.PixelfedAPI
import com.h.pixeldroid.db.AppDatabase
import com.h.pixeldroid.db.entities.UserDatabaseEntity
import com.h.pixeldroid.di.PixelfedAPIHolder
import com.h.pixeldroid.objects.Account
import com.h.pixeldroid.objects.Relationship
import com.h.pixeldroid.objects.Status
@ -27,9 +24,8 @@ import com.h.pixeldroid.utils.ImageConverter
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import javax.inject.Inject
class ProfileActivity : AppCompatActivity() {
class ProfileActivity : BaseActivity() {
private lateinit var pixelfedAPI : PixelfedAPI
private lateinit var adapter : ProfilePostsRecyclerViewAdapter
private lateinit var recycler : RecyclerView
@ -38,20 +34,12 @@ class ProfileActivity : AppCompatActivity() {
private lateinit var domain : String
private var user: UserDatabaseEntity? = null
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var apiHolder: PixelfedAPIHolder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_profile)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
(this.application as Pixeldroid).getAppComponent().inject(this)
user = db.userDao().getActiveUser()
domain = user?.instance_uri.orEmpty()

View File

@ -1,26 +1,16 @@
package com.h.pixeldroid
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import com.h.pixeldroid.db.AppDatabase
import com.h.pixeldroid.di.PixelfedAPIHolder
import com.h.pixeldroid.objects.Report
import com.h.pixeldroid.objects.Status
import kotlinx.android.synthetic.main.activity_report.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import javax.inject.Inject
class ReportActivity : AppCompatActivity() {
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var apiHolder: PixelfedAPIHolder
class ReportActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -30,7 +20,6 @@ class ReportActivity : AppCompatActivity() {
val status = intent.getSerializableExtra(Status.POST_TAG) as Status?
(this.application as Pixeldroid).getAppComponent().inject(this)
//get the currently active user
val user = db.userDao().getActiveUser()

View File

@ -3,8 +3,6 @@ package com.h.pixeldroid
import android.app.SearchManager
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
@ -15,7 +13,7 @@ import com.h.pixeldroid.fragments.feeds.uncachedFeeds.search.SearchHashtagFragme
import com.h.pixeldroid.fragments.feeds.uncachedFeeds.search.SearchPostsFragment
import com.h.pixeldroid.objects.Results
class SearchActivity : AppCompatActivity() {
class SearchActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -99,18 +97,5 @@ class SearchActivity : AppCompatActivity() {
}
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (intent.action == Intent.ACTION_SEARCH) {
intent.getStringExtra(SearchManager.QUERY)?.also { query ->
search(query)
}
}
}
private fun search(query: String){
Log.e("search", "")
}
}

View File

@ -3,14 +3,12 @@ package com.h.pixeldroid
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager
import com.h.pixeldroid.utils.ThemeUtils.Companion.setThemeFromPreferences
class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
private var restartActivitiesOnExit = false
class SettingsActivity : BaseActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
private var restartMainOnExit = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -21,11 +19,8 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen
.replace(R.id.settings, SettingsFragment())
.commit()
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
private fun restartCurrentActivity() {
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
super.startActivity(intent)
restartMainOnExit = intent.getBooleanExtra("restartMain", false)
}
override fun onResume() {
@ -42,16 +37,43 @@ class SettingsActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferen
)
}
override fun onBackPressed() {
// If a setting (for example language or theme) was changed, the main activity should be
// started without history so that the change is applied to the whole back stack
if (restartMainOnExit) {
val intent = Intent(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
super.startActivity(intent)
} else {
super.onBackPressed()
}
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
when (key) {
"theme" -> setThemeFromPreferences(sharedPreferences, resources)
"theme" -> {
setThemeFromPreferences(sharedPreferences, resources)
recreateWithRestartStatus()
}
"language" -> {
recreateWithRestartStatus()
}
}
restartActivitiesOnExit = true
restartCurrentActivity()
}
class SettingsFragment : PreferenceFragmentCompat() {
/**
* Mark main activity to be changed and recreate the current one
*/
private fun recreateWithRestartStatus() {
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
val savedInstanceState = Bundle().apply {
putBoolean("restartMain", true)
}
intent.putExtras(savedInstanceState)
super.startActivity(intent)
finish()
}
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey)
}

View File

@ -2,14 +2,11 @@ package com.h.pixeldroid.di
import android.app.Application
import android.content.Context
import com.h.pixeldroid.*
import com.h.pixeldroid.BaseActivity
import com.h.pixeldroid.Pixeldroid
import com.h.pixeldroid.db.AppDatabase
import com.h.pixeldroid.fragments.BaseFragment
import com.h.pixeldroid.fragments.PostFragment
import com.h.pixeldroid.fragments.SearchDiscoverFragment
import com.h.pixeldroid.fragments.feeds.cachedFeeds.notifications.NotificationsFragment
import dagger.Component
import javax.inject.Singleton
@ -17,19 +14,8 @@ import javax.inject.Singleton
@Component(modules = [ApplicationModule::class, DatabaseModule::class, APIModule::class])
interface ApplicationComponent {
fun inject(application: Pixeldroid?)
fun inject(activity: LoginActivity?)
fun inject(activity: PostActivity?)
fun inject(activity: PostCreationActivity?)
fun inject(activity: ProfileActivity?)
fun inject(mainActivity: MainActivity?)
fun inject(activity: ReportActivity?)
fun inject(fragment: PostFragment)
fun inject(fragment: SearchDiscoverFragment)
fun inject(fragment: NotificationsFragment)
fun inject(activity: BaseActivity?)
fun inject(feedFragment: BaseFragment)
fun inject(followsActivity: FollowsActivity)
val context: Context?
val application: Application?

View File

@ -43,7 +43,7 @@ import javax.inject.Inject
* This fragment lets you search and use Pixelfed's Discover feature
*/
class SearchDiscoverFragment : Fragment() {
class SearchDiscoverFragment : BaseFragment() {
private lateinit var api: PixelfedAPI
private lateinit var recycler : RecyclerView
private lateinit var adapter : DiscoverRecyclerViewAdapter
@ -51,14 +51,6 @@ class SearchDiscoverFragment : Fragment() {
private lateinit var discoverProgressBar: ProgressBar
private lateinit var discoverRefreshLayout: SwipeRefreshLayout
@Inject
lateinit var db: AppDatabase
@Inject
lateinit var apiHolder: PixelfedAPIHolder
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
@ -66,9 +58,6 @@ class SearchDiscoverFragment : Fragment() {
val view = inflater.inflate(R.layout.fragment_search, container, false)
val search = view.findViewById<SearchView>(R.id.search)
(requireActivity().application as Pixeldroid).getAppComponent().inject(this)
//Configure the search widget (see https://developer.android.com/guide/topics/search/search-dialog#ConfiguringWidget)
val searchManager = requireActivity().getSystemService(Context.SEARCH_SERVICE) as SearchManager
search.setSearchableInfo(searchManager.getSearchableInfo(requireActivity().componentName))

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z"
android:fillColor="@color/colorDrawing"/>
</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="24"
android:viewportHeight="24">
<path
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"
android:fillColor="@color/colorDrawing"/>
</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="24"
android:viewportHeight="24">
<path
android:pathData="M12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9c0.83,0 1.5,-0.67 1.5,-1.5 0,-0.39 -0.15,-0.74 -0.39,-1.01 -0.23,-0.26 -0.38,-0.61 -0.38,-0.99 0,-0.83 0.67,-1.5 1.5,-1.5L16,16c2.76,0 5,-2.24 5,-5 0,-4.42 -4.03,-8 -9,-8zM6.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,9 6.5,9 8,9.67 8,10.5 7.33,12 6.5,12zM9.5,8C8.67,8 8,7.33 8,6.5S8.67,5 9.5,5s1.5,0.67 1.5,1.5S10.33,8 9.5,8zM14.5,8c-0.83,0 -1.5,-0.67 -1.5,-1.5S13.67,5 14.5,5s1.5,0.67 1.5,1.5S15.33,8 14.5,8zM17.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.67,9 17.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z"
android:fillColor="@color/colorDrawing"/>
</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="24"
android:viewportHeight="24">
<path
android:pathData="M12.87,15.07l-2.54,-2.51 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53L17,6L17,4h-7L10,2L8,2v2L1,4v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z"
android:fillColor="@color/colorDrawing"/>
</vector>

View File

@ -11,6 +11,7 @@
tools:context=".AboutActivity">
<ImageView
android:importantForAccessibility="no"
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -61,11 +62,64 @@
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:autoLink="web"
android:textAlignment="center"
android:text="@string/project_website"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/aboutAppDescription" />
<TextView
android:id="@+id/contributeTranslationsText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:autoLink="web"
android:drawablePadding="6dp"
android:textAlignment="center"
android:text="@string/help_translate"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/aboutWebsite"
app:drawableLeftCompat="@drawable/translate_black_24dp" />
<TextView
android:id="@+id/contributeTranslationsUrl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="web"
android:textAlignment="center"
android:text="https://weblate.pixeldroid.org"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/contributeTranslationsText"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/contributeForgeText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:autoLink="web"
android:drawablePadding="6dp"
android:textAlignment="center"
android:text="@string/issues_contribute"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/contributeTranslationsUrl"
app:drawableLeftCompat="@drawable/bug_report_black_24dp" />
<TextView
android:id="@+id/contributeForgeUrl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="web"
android:textAlignment="center"
android:text="https://gitlab.shinice.net/pixeldroid/PixelDroid"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/contributeForgeText"
tools:ignore="HardcodedText" />
<Button
android:id="@+id/licensesButton"
android:layout_width="wrap_content"
@ -74,7 +128,8 @@
android:text="@string/dependencies_licenses"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/aboutWebsite" />
app:layout_constraintTop_toBottomOf="@+id/contributeForgeUrl" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

View File

@ -47,7 +47,7 @@
<string name="dark_theme">داكن</string>
<string name="light_theme">فاتح</string>
<string name="save_image_success">تم حفظ الصورة بنجاح</string>
<string name="default_theme">افتراضي (يتبع النظام)</string>
<string name="default_system">افتراضي (يتبع النظام)</string>
<string name="description_max_characters">يجب أن يحتوي الوصف على %1$s حرفًا على الأكثر.</string>
<string name="upload_post_success">تم تحميل المنشور بنجاح</string>
<string name="upload_post_failed">فشل في تحميل المنشور</string>

View File

@ -93,7 +93,7 @@
<string name="permission_denied">Permís denegat</string>
<string name="dark_theme">Fosc</string>
<string name="light_theme">Clar</string>
<string name="default_theme">Per defecte (seguint el sistema)</string>
<string name="default_system">Per defecte (seguint el sistema)</string>
<string name="media_upload_completed">{gmd_cloud_done} S\'ha completat l\'enviament multimèdia</string>
<string name="media_upload_failed">{gmd_cloud_off} L\'enviament multimèdia ha fallat, torna-ho a provar o comprova les condicions de la xarxa</string>
<string name="posting_image_accessibility_hint">Imatge que s\'està publicant</string>

View File

@ -41,7 +41,7 @@
<string name="registration_failed">Konnte die App nicht mit diesem Server verbinden</string>
<string name="instance_error">Konnte die Informationen der Instanz nicht abrufen</string>
<string name="upload_picture_failed">Fehler beim Hochladen!</string>
<string name="default_theme">Standard (Systemeinstellung)</string>
<string name="default_system">Standard (Systemeinstellung)</string>
<string name="permission_denied">Berechtigung verweigert</string>
<string name="save_image_failed">Bild kann nicht gespeichert werden</string>
<string name="description_max_characters">Die Beschreibung darf höchstens %1$s Zeichen enthalten.</string>

View File

@ -97,7 +97,7 @@
<string name="permission_denied">Permiso denegado</string>
<string name="dark_theme">Oscuro</string>
<string name="light_theme">Claro</string>
<string name="default_theme">Por defecto (Sistema)</string>
<string name="default_system">Por defecto (Sistema)</string>
<string name="crop_result_error">No se pudo recuperar la imagen después del recorte</string>
<string name="busy_dialog_ok_button">Bien, espera.</string>
<string name="busy_dialog_text">Procesando imagen, ¡Espera a que termine!</string>

View File

@ -59,7 +59,7 @@
<string name="save_image_failed">Ezinezkoa irudia gordetzea</string>
<string name="dark_theme">Iluna</string>
<string name="light_theme">Argia</string>
<string name="default_theme">Lehenetsia (Sistemaren lehentsia)</string>
<string name="default_system">Lehenetsia (Sistemaren lehentsia)</string>
<string name="no_description">Deskribapenik ez</string>
<string name="description_max_characters">Deskribapenak %1$s karaktere izan behar ditu gehienez.</string>
<string name="save_image_success">Irudia behar bezala gorde da</string>

View File

@ -45,7 +45,7 @@
<string name="permission_denied">ممنوعیت دسترسی</string>
<string name="save_image_failed">نتوانستیم تصویر را ذخیره کنیم</string>
<string name="description_max_characters">توضیحات حداکثر می‌توانند تا %1$s حرف داشته باشند.</string>
<string name="default_theme">پیش‌گزیده (پیروی از سامانه)</string>
<string name="default_system">پیش‌گزیده (پیروی از سامانه)</string>
<string name="light_theme">روشن</string>
<string name="dark_theme">تاریک</string>
<string name="upload_post_error">بارگذاری مطلب ناموفق بود</string>

View File

@ -51,7 +51,7 @@
<string name="permission_denied">Permission refusée</string>
<string name="dark_theme">Sombre</string>
<string name="light_theme">Clair</string>
<string name="default_theme">Par défaut (selon votre système)</string>
<string name="default_system">Par défaut (selon votre système)</string>
<string name="upload_post_failed">Échec du téléversement de la publication</string>
<string name="upload_post_success">Téléversement de la publication avec succès</string>
<string name="posted_on">Publié le %1$s</string>

View File

@ -93,7 +93,7 @@
<string name="permission_denied">Permiso denegado</string>
<string name="dark_theme">Escuro</string>
<string name="light_theme">Claro</string>
<string name="default_theme">Por omisión (do sistema)</string>
<string name="default_system">Por omisión (do sistema)</string>
<string name="media_upload_failed">{gmd_cloud_off} Fallou a subida do ficheiro, inténtao outra vez e comproba a conexión</string>
<string name="posting_image_accessibility_hint">Imaxe que se publicou</string>
<string name="media_upload_completed">{gmd_cloud_done} Subida do ficheiro completada</string>

View File

@ -97,7 +97,7 @@
<string name="media_upload_failed">{gmd_cloud_off} Caricamento dei contenuti non riuscito, riprovare o verificare le condizioni della rete</string>
<string name="follow_button_failed">Impossibile visualizzare il tasto segui</string>
<string name="follow_status_failed">Impossibile ottenere lo stato segui</string>
<string name="default_theme">Predefinito (Segue il sistema)</string>
<string name="default_system">Predefinito (Segue il sistema)</string>
<string name="crop_result_error">Impossibile recuperare l\'immagine dopo il ritaglio</string>
<string name="busy_dialog_ok_button">Ok, aspetta.</string>
<string name="busy_dialog_text">Elaborando ancora l\'immagine, attendi che finisca prima!</string>

View File

@ -97,7 +97,7 @@
<string name="permission_denied">権限がありません</string>
<string name="dark_theme">ダーク</string>
<string name="light_theme">ライト</string>
<string name="default_theme">デフォルト(システム設定)</string>
<string name="default_system">デフォルト(システム設定)</string>
<string name="busy_dialog_ok_button">お待ちください。</string>
<string name="busy_dialog_text">画像を処理しています。しばらくお待ちください。</string>
<string name="nothing_to_see_here">ここには何もありません!</string>

View File

@ -74,7 +74,7 @@
<string name="upload_post_failed">Kon post niet uploaden</string>
<string name="save_image_failed">Kon afbeelding niet opslaan</string>
<string name="permission_denied">Toestemming geweigerd</string>
<string name="default_theme">Standaard (systeem instelling)</string>
<string name="default_system">Standaard (systeem instelling)</string>
<string name="instance_error">Kon instance-informatie niet ophalen</string>
<string name="likes">%1$s Vind-ik-leuks</string>
<string name="request_format_error">Fout bij het uploaden: slecht verzoekformaat</string>

View File

@ -58,7 +58,7 @@
<string name="registration_failed">Nie udało się zarejestrować aplikacji na tym serwerze</string>
<string name="instance_error">Nie udało się pobrać informacji o instancji</string>
<string name="instance_not_pixelfed_warning">To chyba nie jest instancja Pixelfed. Aplikacja może zachowywać się nieprzewidywalnie.</string>
<string name="default_theme">Systemowy</string>
<string name="default_system">Systemowy</string>
<string name="followed_notification">%1$s obserwujących</string>
<string name="liked_notification">%1$s polubień</string>
<string name="whats_an_instance">Co to jest instancja\?</string>

View File

@ -74,7 +74,7 @@
<string name="permission_denied">Недостаточно прав</string>
<string name="dark_theme">Тёмная</string>
<string name="light_theme">Светлая</string>
<string name="default_theme">По умолчанию (как в системе)</string>
<string name="default_system">По умолчанию (как в системе)</string>
<string name="follow_status_failed">Не удалось получить статус подписки</string>
<string name="follow_error">Не удалось подписаться</string>
<string name="action_not_allowed">Это действие запрещено</string>

View File

@ -97,7 +97,7 @@
<string name="permission_denied">Åtkomst nekas</string>
<string name="dark_theme">Mörkt</string>
<string name="light_theme">Ljust</string>
<string name="default_theme">Standard (Följer systemet)</string>
<string name="default_system">Standard (Följer systemet)</string>
<string name="nothing_to_see_here">Det finns inget här!</string>
<string name="crop_result_error">Kunde inte hämta bilden efter beskärning</string>
<string name="busy_dialog_ok_button">OK, vänta på det.</string>

View File

@ -95,7 +95,7 @@
<string name="save_image_success">图片成功保存</string>
<string name="save_image_failed">无法保存图像</string>
<string name="permission_denied">没有权限</string>
<string name="default_theme">默认(跟随系统设置)</string>
<string name="default_system">默认(跟随系统设置)</string>
<string name="light_theme">浅色</string>
<string name="dark_theme">深色</string>
<string name="nothing_to_see_here">这里什么也没有!</string>

View File

@ -6,8 +6,53 @@
</string-array>
<string-array name="theme_entries">
<item>@string/default_theme</item>
<item>@string/default_system</item>
<item>@string/light_theme</item>
<item>@string/dark_theme</item>
</string-array>
<string-array name="languages_entries">
<item>@string/default_system</item>
<item>العربية</item>
<item>বাংলা (বাংলাদেশ)</item>
<item>Català</item>
<item>Deutsch</item>
<item>Esperanto</item>
<item>Euskara</item>
<item>فارسی</item>
<item>Français</item>
<item>Gaeilge</item>
<item>Italiano</item>
<item>日本語</item>
<item>Nederlands</item>
<item>Polski</item>
<item>Português (Brasil)</item>
<item>Русский</item>
<item>Svenska</item>
<item>Українська</item>
<item>中文(简体)</item>
</string-array>
<string-array name="languages_values">
<item>default</item>
<item>ar</item>
<item>bn-bd</item>
<item>ca</item>
<item>de</item>
<item>es</item>
<item>eu</item>
<item>fa</item>
<item>fr</item>
<item>gl</item>
<item>it</item>
<item>ja</item>
<item>nl</item>
<item>pl</item>
<item>pt-br</item>
<item>ru</item>
<item>sv</item>
<item>uk</item>
<item>zh-CN</item>
</string-array>
</resources>

View File

@ -16,7 +16,7 @@
<!-- Theme Preferences -->
<string name="theme_title">Application Theme</string>
<string name="theme_header">Theme</string>
<string name="default_theme">Default (Follows system)</string>
<string name="default_system">Default (Follows system)</string>
<string name="light_theme">Light</string>
<string name="dark_theme">Dark</string>
<string name="followed_notification">%1$s followed you</string>
@ -143,6 +143,9 @@
<string name="OK">OK</string>
<string name="delete_dialog">Delete this post?</string>
<string name="cancel">Cancel</string>
<string name="language">Language</string>
<string name="help_translate">Help translate PixelDroid to your language:</string>
<string name="issues_contribute">Report issues or contribute to the application:</string>
</resources>

View File

@ -8,12 +8,23 @@
app:entryValues="@array/theme_values"
app:key="theme"
app:title="@string/theme_title"
app:useSimpleSummaryProvider="true" />
app:useSimpleSummaryProvider="true"
app:icon="@drawable/palette_black_24dp"/>
</PreferenceCategory>
<ListPreference
app:defaultValue="default"
app:entries="@array/languages_entries"
app:entryValues="@array/languages_values"
app:key="language"
app:title="@string/language"
app:useSimpleSummaryProvider="true"
app:icon="@drawable/translate_black_24dp" />
<Preference android:title="@string/about"
android:key="about"
android:summary="@string/about_pixeldroid">
android:summary="@string/about_pixeldroid"
app:icon="@drawable/info_black_24dp">
<intent
android:targetPackage="com.h.pixeldroid"
android:targetClass="com.h.pixeldroid.AboutActivity"/>