Compare commits
41 Commits
1.0.beta29
...
master
Author | SHA1 | Date |
---|---|---|
Matthieu | 187c29a751 | |
Balaraz | f9a07a5dd0 | |
Alexandre NICOLADIE | fb9296187a | |
Matthieu | 04324577ea | |
Matthieu | 73f08e5a5f | |
Matthieu | a7feab380b | |
Matthieu | 1a4e023091 | |
Regu_Miabyss | 2fb4c91ffd | |
Matthieu | 720c099f0a | |
Matthieu | 869479d53f | |
Matthieu | 018f893388 | |
Matthieu | f27ae611be | |
Matthieu | 234be72f59 | |
Matthieu | 7eaac2e903 | |
Matthieu | a9849c13e6 | |
Matthieu | d1562f18e9 | |
Matthieu | 4a1248bcab | |
Regu_Miabyss | e9122e6d72 | |
Matthieu | 76eac62d73 | |
Matthieu | dd27555d83 | |
Matthieu | c0feb8a37d | |
Matthieu | 7acd4cface | |
Matthieu | 10e93c90b7 | |
Matthieu | 2311627473 | |
Regu_Miabyss | 6c7ab2333e | |
Matthieu | 54711d4e81 | |
Matthieu | 908d1a54c9 | |
Matthieu | 2b91543137 | |
Matthieu | 0688dd4d02 | |
Matthieu | 319da7c11c | |
Matthieu | 7b327fc0d6 | |
Matthieu | 64ab2c2ac5 | |
Matthieu | 37b83f5ae2 | |
Matthieu | 1516452ab5 | |
Matthieu | cb50db7730 | |
Matthieu | afe6f71152 | |
Matthieu | d66c365934 | |
Matthieu | 7815ecba08 | |
Matthieu | b4533014b3 | |
Fred | f15c23cceb | |
Fred | d9da842df7 |
|
@ -3,4 +3,4 @@
|
|||
url = https://gitlab.com/artectrex/scrambler.git
|
||||
[submodule "pixel_common"]
|
||||
path = pixel_common
|
||||
url = git@gitlab.shinice.net:pixeldroid/pixel_common.git
|
||||
url = https://gitlab.shinice.net/pixeldroid/pixel_common.git
|
||||
|
|
|
@ -9,13 +9,16 @@ Free (as in freedom) Android client for Pixelfed, the federated image sharing pl
|
|||
<img src="https://pixeldroid.org/badge-fdroid.png" alt="Get it on F-Droid" width="206">
|
||||
</a>
|
||||
|
||||
Come talk to us on Matrix, at <a href="https://matrix.to/#/#pixeldroid:gnugen.ch">#pixeldroid:gnugen.ch</a> !
|
||||
|
||||
## 🔧 Compiling the code yourself
|
||||
If you want to try out PixelDroid on your own device, you can compile the source code yourself. To do that you can install [Android Studio](https://developer.android.com/studio/).
|
||||
|
||||
## 🎨 Art attribution
|
||||
Our mascot was commissioned using funds from NLnet. The original file is `pixeldroid_mascot.svg` and it is adapted to work as an Android Drawable. This work is licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/) (CC BY-SA).
|
||||
|
||||
Various works have been used from the pixelfed branding repository ( https://github.com/pixelfed/brand-assets ). In addition, a drawing of a red panda is used for some error messages ( https://thenounproject.com/search/?q=red+panda&i=2877785 ).
|
||||
Various works have been used from the pixelfed branding repository ( https://github.com/pixelfed/brand-assets ).
|
||||
|
||||
## 🤝 Contribute
|
||||
If you want to contribute, you can check out [CONTRIBUTING.md](CONTRIBUTING.md) and/or [TRANSLATION.md](TRANSLATION.md)
|
||||
|
||||
|
|
|
@ -8,6 +8,21 @@ plugins {
|
|||
id("kotlin-parcelize")
|
||||
id("com.google.devtools.ksp")
|
||||
}
|
||||
// Map for the version code that gives each ABI a value.
|
||||
ext.abiCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, x86: 3, x86_64: 4]
|
||||
|
||||
//Different version codes per architecture (for F-Droid support)
|
||||
android.applicationVariants.configureEach { variant ->
|
||||
variant.outputs.each { output ->
|
||||
def baseAbiVersionCode = project.ext.abiCodes.get(output.getFilter(com.android.build.OutputFile.ABI))
|
||||
if (baseAbiVersionCode != null) {
|
||||
output.versionCodeOverride = (100 * project.android.defaultConfig.versionCode) + baseAbiVersionCode
|
||||
} else {
|
||||
output.versionCodeOverride = 100 * project.android.defaultConfig.versionCode
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
android {
|
||||
|
||||
|
@ -30,8 +45,8 @@ android {
|
|||
}
|
||||
defaultConfig {
|
||||
minSdkVersion 23
|
||||
versionCode 29
|
||||
targetSdkVersion 34
|
||||
versionCode 33
|
||||
versionName "1.0.beta" + versionCode
|
||||
|
||||
//TODO add resConfigs("en", "fr", "ja",...) ?
|
||||
|
@ -80,6 +95,30 @@ android {
|
|||
proguardFiles 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
splits {
|
||||
// Configures multiple APKs based on ABI.
|
||||
abi {
|
||||
|
||||
// Enables building multiple APKs per ABI.
|
||||
enable true
|
||||
|
||||
// By default all ABIs are included, so use reset() and include to specify that we only
|
||||
// want APKs for "x86", "x86_64", "arm64-v8a" and "armeabi-v7a".
|
||||
|
||||
// Resets the list of ABIs for Gradle to create APKs for to none.
|
||||
reset()
|
||||
|
||||
// Specifies a list of ABIs for Gradle to create APKs for.
|
||||
//noinspection ChromeOsAbiSupport
|
||||
include project.ext.abiCodes.keySet() as String[]
|
||||
|
||||
// Specifies that we don't want to also generate a universal APK that includes all ABIs.
|
||||
universalApk false
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a string with the application_id (available in xml etc)
|
||||
*/
|
||||
|
@ -136,13 +175,13 @@ dependencies {
|
|||
implementation 'androidx.core:core-ktx:1.12.0'
|
||||
implementation 'androidx.preference:preference-ktx:1.2.1'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.6'
|
||||
implementation 'androidx.navigation:navigation-ui-ktx:2.7.6'
|
||||
implementation "androidx.browser:browser:1.7.0"
|
||||
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
|
||||
implementation 'androidx.navigation:navigation-ui-ktx:2.7.7'
|
||||
implementation "androidx.browser:browser:1.8.0"
|
||||
implementation 'androidx.recyclerview:recyclerview:1.3.2'
|
||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
||||
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.6'
|
||||
implementation 'androidx.navigation:navigation-ui-ktx:2.7.6'
|
||||
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
|
||||
implementation 'androidx.navigation:navigation-ui-ktx:2.7.7'
|
||||
implementation 'androidx.paging:paging-runtime-ktx:3.2.1'
|
||||
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'
|
||||
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
|
||||
|
@ -159,7 +198,7 @@ dependencies {
|
|||
|
||||
|
||||
// Use the most recent version of CameraX
|
||||
def cameraX_version = '1.3.1'
|
||||
def cameraX_version = '1.3.2'
|
||||
implementation "androidx.camera:camera-core:$cameraX_version"
|
||||
implementation "androidx.camera:camera-camera2:$cameraX_version"
|
||||
// CameraX Lifecycle library
|
||||
|
@ -184,21 +223,21 @@ dependencies {
|
|||
implementation 'com.google.android.material:material:1.11.0'
|
||||
|
||||
//Dagger (dependency injection)
|
||||
implementation 'com.google.dagger:dagger:2.50'
|
||||
ksp 'com.google.dagger:dagger-compiler:2.50'
|
||||
implementation 'com.google.dagger:dagger:2.51'
|
||||
ksp 'com.google.dagger:dagger-compiler:2.51'
|
||||
|
||||
implementation("com.google.dagger:hilt-android:2.50")
|
||||
ksp "com.google.dagger:hilt-compiler:2.50"
|
||||
implementation('com.google.dagger:hilt-android:2.51')
|
||||
ksp 'com.google.dagger:hilt-compiler:2.51'
|
||||
|
||||
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
|
||||
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
|
||||
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
|
||||
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
|
||||
implementation 'com.squareup.retrofit2:retrofit:2.10.0'
|
||||
implementation 'com.squareup.retrofit2:converter-gson:2.10.0'
|
||||
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.10.0'
|
||||
implementation 'io.reactivex.rxjava3:rxjava:3.1.8'
|
||||
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
|
||||
implementation 'com.github.connyduck:sparkbutton:4.1.0'
|
||||
|
||||
implementation 'org.pixeldroid.pixeldroid:android-media-editor:1.6'
|
||||
implementation 'org.pixeldroid.pixeldroid:android-media-editor:2.0'
|
||||
implementation project(path: ':scrambler')
|
||||
implementation project(path: ':pixel_common')
|
||||
|
||||
|
@ -248,7 +287,7 @@ dependencies {
|
|||
testImplementation "androidx.room:room-testing:$room_version"
|
||||
|
||||
|
||||
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
|
||||
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.3.0'
|
||||
androidTestImplementation 'androidx.test:runner:1.5.2'
|
||||
androidTestImplementation 'androidx.test:rules:1.5.0'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||
|
@ -261,6 +300,8 @@ dependencies {
|
|||
|
||||
}
|
||||
|
||||
|
||||
|
||||
tasks.withType(Test).configureEach {
|
||||
jacoco.includeNoLocationClasses = true
|
||||
jacoco.excludes = ['jdk.internal.*']
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package org.pixeldroid.app.postCreation
|
||||
|
||||
import android.content.ClipData
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import androidx.navigation.NavController
|
||||
import androidx.navigation.fragment.NavHostFragment
|
||||
|
@ -15,6 +19,31 @@ class PostCreationActivity : BaseActivity() {
|
|||
internal const val POST_REDRAFT = "post_redraft"
|
||||
internal const val POST_NSFW = "post_nsfw"
|
||||
internal const val TEMP_FILES = "temp_files"
|
||||
|
||||
fun intentForUris(context: Context, uris: List<Uri>) =
|
||||
Intent(Intent.ACTION_SEND_MULTIPLE).apply {
|
||||
// Pass downloaded images to new post creation activity
|
||||
putParcelableArrayListExtra(
|
||||
Intent.EXTRA_STREAM, ArrayList(uris)
|
||||
)
|
||||
|
||||
uris.forEach {
|
||||
// Why are we using ClipData in addition to parcelableArrayListExtra here?
|
||||
// Because the FLAG_GRANT_READ_URI_PERMISSION needs to be applied to the URIs, and
|
||||
// for some reason it doesn't get applied to all of them when not using ClipData
|
||||
if (clipData == null) {
|
||||
clipData = ClipData("", emptyArray(), ClipData.Item(it))
|
||||
} else {
|
||||
clipData!!.addItem(ClipData.Item(it))
|
||||
}
|
||||
}
|
||||
|
||||
setClass(context, PostCreationActivity::class.java)
|
||||
|
||||
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private lateinit var binding: ActivityPostCreationBinding
|
||||
|
@ -32,4 +61,5 @@ class PostCreationActivity : BaseActivity() {
|
|||
}
|
||||
|
||||
override fun onSupportNavigateUp() = navController.navigateUp() || super.onSupportNavigateUp()
|
||||
|
||||
}
|
|
@ -39,6 +39,8 @@ import org.pixeldroid.app.utils.bindingLifecycleAware
|
|||
import org.pixeldroid.app.utils.db.entities.InstanceDatabaseEntity
|
||||
import org.pixeldroid.app.utils.fileExtension
|
||||
import org.pixeldroid.app.utils.getMimeType
|
||||
import org.pixeldroid.media_editor.common.PICTURE_POSITION
|
||||
import org.pixeldroid.media_editor.common.PICTURE_URI
|
||||
import org.pixeldroid.media_editor.photoEdit.PhotoEditActivity
|
||||
import org.pixeldroid.media_editor.videoEdit.VideoEditActivity
|
||||
import java.io.File
|
||||
|
@ -47,7 +49,6 @@ import java.text.SimpleDateFormat
|
|||
import java.util.Locale
|
||||
|
||||
class PostCreationFragment : BaseFragment() {
|
||||
|
||||
private var binding: FragmentPostCreationBinding by bindingLifecycleAware()
|
||||
private val model: PostCreationViewModel by activityViewModels()
|
||||
|
||||
|
@ -307,7 +308,7 @@ class PostCreationFragment : BaseFragment() {
|
|||
ActivityResultContracts.StartActivityForResult()){
|
||||
result: ActivityResult? ->
|
||||
if (result?.resultCode == Activity.RESULT_OK && result.data != null) {
|
||||
val position: Int = result.data!!.getIntExtra(PhotoEditActivity.PICTURE_POSITION, 0)
|
||||
val position: Int = result.data!!.getIntExtra(PICTURE_POSITION, 0)
|
||||
model.modifyAt(position, result.data!!)
|
||||
?: Toast.makeText(requireActivity(), R.string.error_editing, Toast.LENGTH_SHORT).show()
|
||||
} else if(result?.resultCode != Activity.RESULT_CANCELED){
|
||||
|
@ -320,8 +321,8 @@ class PostCreationFragment : BaseFragment() {
|
|||
requireActivity(),
|
||||
if (model.getPhotoData().value!![position].video) VideoEditActivity::class.java else PhotoEditActivity::class.java
|
||||
)
|
||||
.putExtra(PhotoEditActivity.PICTURE_URI, model.getPhotoData().value!![position].imageUri)
|
||||
.putExtra(PhotoEditActivity.PICTURE_POSITION, position)
|
||||
.putExtra(PICTURE_URI, model.getPhotoData().value!![position].imageUri)
|
||||
.putExtra(PICTURE_POSITION, position)
|
||||
|
||||
editResultContract.launch(intent)
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ import org.pixeldroid.app.R
|
|||
import org.pixeldroid.app.utils.di.PixelfedAPIHolder
|
||||
import org.pixeldroid.app.utils.fileExtension
|
||||
import org.pixeldroid.app.utils.getMimeType
|
||||
import org.pixeldroid.media_editor.common.PICTURE_URI
|
||||
import org.pixeldroid.media_editor.videoEdit.VideoEditActivity
|
||||
import retrofit2.HttpException
|
||||
import java.io.File
|
||||
|
@ -101,15 +102,31 @@ data class PhotoData(
|
|||
class PostCreationViewModel @Inject constructor(
|
||||
private val state: SavedStateHandle,
|
||||
@ApplicationContext private val applicationContext: Context,
|
||||
db: AppDatabase
|
||||
db: AppDatabase,
|
||||
): ViewModel() {
|
||||
private var storyPhotoDataBackup: MutableList<PhotoData>? = null
|
||||
private val photoData: MutableLiveData<MutableList<PhotoData>> by lazy {
|
||||
//FIXME We should be able to access the Intent action somehow, to determine if there are
|
||||
// 1 or multiple Uris instead of relying on the ClassCastException
|
||||
|
||||
// This should not work like this (reading its source code, get() function should return null
|
||||
// if it's the wrong type but instead throws ClassCastException).
|
||||
// Lucky for us that it does though: we first try to get a single Uri (which we could be
|
||||
// getting from a share of a single picture to the app), when the cast to Uri fails
|
||||
// we try to get a list of Uris instead (casting ourselves from Parcelable as suggested
|
||||
// in get() documentation)
|
||||
val uris = try {
|
||||
val singleUri: Uri? = state[Intent.EXTRA_STREAM]
|
||||
listOfNotNull(singleUri)
|
||||
} catch (e: ClassCastException) {
|
||||
state.get<ArrayList<Parcelable>>(Intent.EXTRA_STREAM)?.map { it as Uri }
|
||||
}
|
||||
|
||||
MutableLiveData<MutableList<PhotoData>>(
|
||||
addPossibleImages(
|
||||
state.get<ArrayList<Uri>>(Intent.EXTRA_STREAM),
|
||||
uris,
|
||||
state.get<ArrayList<String>>(PostCreationActivity.PICTURE_DESCRIPTIONS),
|
||||
mutableListOf()
|
||||
previousList = mutableListOf()
|
||||
)
|
||||
)
|
||||
}
|
||||
|
@ -160,7 +177,7 @@ class PostCreationViewModel @Inject constructor(
|
|||
* as are legal (if any) and a dialog will be shown to the user alerting them of this fact.
|
||||
*/
|
||||
fun addPossibleImages(
|
||||
uris: ArrayList<Uri>?,
|
||||
uris: List<Uri>?,
|
||||
descriptions: List<String>?,
|
||||
previousList: MutableList<PhotoData>? = photoData.value,
|
||||
): MutableList<PhotoData> {
|
||||
|
@ -283,7 +300,7 @@ class PostCreationViewModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
} else {
|
||||
imageUri = data.getStringExtra(org.pixeldroid.media_editor.photoEdit.PhotoEditActivity.PICTURE_URI)!!.toUri()
|
||||
imageUri = data.getStringExtra(PICTURE_URI)!!.toUri()
|
||||
val (imageSize, imageVideo) = getSizeAndVideoValidate(imageUri, position)
|
||||
size = imageSize
|
||||
video = imageVideo
|
||||
|
|
|
@ -32,7 +32,7 @@ class CameraActivity : BaseActivity() {
|
|||
// If this CameraActivity wasn't started from the shortcut,
|
||||
// tell the fragment it's in an activity (so that it sends back the result instead of
|
||||
// starting a new post creation process)
|
||||
if (intent.action != "android.intent.action.VIEW") {
|
||||
if (intent.action != Intent.ACTION_VIEW) {
|
||||
val arguments = Bundle()
|
||||
arguments.putBoolean(CAMERA_ACTIVITY, true)
|
||||
arguments.putBoolean(CAMERA_ACTIVITY_STORY, story)
|
||||
|
@ -47,7 +47,7 @@ class CameraActivity : BaseActivity() {
|
|||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
// If this CameraActivity wasn't started from the shortcut, behave as usual
|
||||
if (intent.action != "android.intent.action.VIEW") return super.onOptionsItemSelected(item)
|
||||
if (intent.action != Intent.ACTION_VIEW) return super.onOptionsItemSelected(item)
|
||||
|
||||
// Else, start a new MainActivity when "going back" on this activity
|
||||
when (item.itemId) {
|
||||
|
|
|
@ -2,7 +2,6 @@ package org.pixeldroid.app.postCreation.camera
|
|||
|
||||
import android.Manifest
|
||||
import android.app.Activity
|
||||
import android.content.ClipData
|
||||
import android.content.ContentUris
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
|
@ -38,7 +37,6 @@ import kotlinx.coroutines.Dispatchers
|
|||
import kotlinx.coroutines.launch
|
||||
import org.pixeldroid.app.databinding.FragmentCameraBinding
|
||||
import org.pixeldroid.app.postCreation.PostCreationActivity
|
||||
import org.pixeldroid.app.posts.fromHtml
|
||||
import org.pixeldroid.app.utils.BaseFragment
|
||||
import java.io.File
|
||||
import java.util.concurrent.ExecutorService
|
||||
|
@ -450,16 +448,7 @@ class CameraFragment : BaseFragment() {
|
|||
|
||||
private fun startAlbumCreation(uris: ArrayList<String>) {
|
||||
|
||||
val intent = Intent(Intent.ACTION_SEND_MULTIPLE).apply {
|
||||
// Pass downloaded images to new post creation activity
|
||||
putParcelableArrayListExtra(
|
||||
Intent.EXTRA_STREAM, ArrayList(uris.map { it.toUri() })
|
||||
)
|
||||
setClass(requireContext(), PostCreationActivity::class.java)
|
||||
|
||||
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
|
||||
}
|
||||
val intent = PostCreationActivity.intentForUris(requireContext(), uris.map { it.toUri() })
|
||||
|
||||
if(inActivity && !addToStory){
|
||||
requireActivity().setResult(Activity.RESULT_OK, intent)
|
||||
|
|
|
@ -3,40 +3,99 @@ package org.pixeldroid.app.posts
|
|||
import android.os.Bundle
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import androidx.activity.viewModels
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.WindowCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.WindowInsetsControllerCompat
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
import androidx.viewpager2.widget.ViewPager2
|
||||
import kotlinx.coroutines.launch
|
||||
import org.pixeldroid.app.databinding.ActivityAlbumBinding
|
||||
import org.pixeldroid.app.utils.api.objects.Attachment
|
||||
|
||||
|
||||
class AlbumActivity : AppCompatActivity() {
|
||||
private val model: AlbumViewModel by viewModels()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
val binding = ActivityAlbumBinding.inflate(layoutInflater)
|
||||
|
||||
val binding = ActivityAlbumBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
val mediaAttachments = intent.getSerializableExtra("images") as ArrayList<Attachment>
|
||||
val index = intent.getIntExtra("index", 0)
|
||||
binding.albumPager.adapter = AlbumViewPagerAdapter(mediaAttachments,
|
||||
|
||||
binding.albumPager.adapter = AlbumViewPagerAdapter(
|
||||
model.uiState.value.mediaAttachments,
|
||||
sensitive = false,
|
||||
opened = true,
|
||||
//In the activity, we assume we want to show everything
|
||||
alwaysShowNsfw = true
|
||||
alwaysShowNsfw = true,
|
||||
clickCallback = ::clickCallback
|
||||
)
|
||||
binding.albumPager.currentItem = index
|
||||
|
||||
if(mediaAttachments.size == 1){
|
||||
binding.albumPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
|
||||
override fun onPageSelected(position: Int) { model.positionSelected(position) }
|
||||
})
|
||||
|
||||
if (model.uiState.value.mediaAttachments.size == 1) {
|
||||
binding.albumPager.isUserInputEnabled = false
|
||||
}
|
||||
else if((mediaAttachments.size) > 1) {
|
||||
} else if ((model.uiState.value.mediaAttachments.size) > 1) {
|
||||
binding.postIndicator.setViewPager(binding.albumPager)
|
||||
binding.postIndicator.visibility = View.VISIBLE
|
||||
} else {
|
||||
binding.postIndicator.visibility = View.GONE
|
||||
}
|
||||
|
||||
// Not really necessary because the ViewPager saves its state in onSaveInstanceState, but
|
||||
// it's good to stay consistent in case something gets out of sync
|
||||
binding.albumPager.setCurrentItem(model.uiState.value.index, false)
|
||||
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||
supportActionBar?.setDisplayShowTitleEnabled(false)
|
||||
supportActionBar?.setBackgroundDrawable(null)
|
||||
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||
model.uiState.collect { uiState ->
|
||||
binding.albumPager.currentItem = uiState.index
|
||||
}
|
||||
}
|
||||
}
|
||||
lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||
model.isActionBarHidden.collect { isActionBarHidden ->
|
||||
val windowInsetsController =
|
||||
WindowCompat.getInsetsController(this@AlbumActivity.window, binding.albumPager)
|
||||
if (isActionBarHidden) {
|
||||
// Configure the behavior of the hidden system bars
|
||||
windowInsetsController.systemBarsBehavior =
|
||||
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
||||
// Hide both the status bar and the navigation bar
|
||||
supportActionBar?.hide()
|
||||
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
|
||||
binding.postIndicator.visibility = View.GONE
|
||||
} else {
|
||||
// Configure the behavior of the hidden system bars
|
||||
windowInsetsController.systemBarsBehavior =
|
||||
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
||||
// Show both the status bar and the navigation bar
|
||||
supportActionBar?.show()
|
||||
windowInsetsController.show(WindowInsetsCompat.Type.systemBars())
|
||||
if ((model.uiState.value.mediaAttachments.size) > 1) {
|
||||
binding.postIndicator.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback passed to the AlbumViewPagerAdapter to signal a single click on the image
|
||||
*/
|
||||
private fun clickCallback(){
|
||||
model.barHide()
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
package org.pixeldroid.app.posts
|
||||
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import androidx.lifecycle.ViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.update
|
||||
import org.pixeldroid.app.utils.api.objects.Attachment
|
||||
import javax.inject.Inject
|
||||
|
||||
data class AlbumUiState(
|
||||
val mediaAttachments: ArrayList<Attachment> = arrayListOf(),
|
||||
val index: Int = 0,
|
||||
)
|
||||
|
||||
@HiltViewModel
|
||||
class AlbumViewModel @Inject constructor(state: SavedStateHandle) : ViewModel() {
|
||||
companion object {
|
||||
const val ALBUM_IMAGES = "AlbumViewImages"
|
||||
const val ALBUM_INDEX = "AlbumViewIndex"
|
||||
}
|
||||
|
||||
private val _uiState: MutableStateFlow<AlbumUiState>
|
||||
private val _isActionBarHidden: MutableStateFlow<Boolean>
|
||||
|
||||
init {
|
||||
_uiState = MutableStateFlow(AlbumUiState(
|
||||
mediaAttachments = state[ALBUM_IMAGES] ?: ArrayList(),
|
||||
index = state[ALBUM_INDEX] ?: 0
|
||||
))
|
||||
_isActionBarHidden = MutableStateFlow(false)
|
||||
}
|
||||
|
||||
val uiState: StateFlow<AlbumUiState> = _uiState.asStateFlow()
|
||||
val isActionBarHidden: StateFlow<Boolean> = _isActionBarHidden
|
||||
|
||||
fun barHide() {
|
||||
_isActionBarHidden.update { !it }
|
||||
}
|
||||
|
||||
fun positionSelected(position: Int) {
|
||||
_uiState.update { it.copy(index = position) }
|
||||
}
|
||||
}
|
|
@ -88,8 +88,8 @@ class NestedScrollableHost(context: Context, attrs: AttributeSet? = null) :
|
|||
}
|
||||
val intent = Intent(context, AlbumActivity::class.java)
|
||||
|
||||
intent.putExtra("images", images)
|
||||
intent.putExtra("index", (child as ViewPager2).currentItem)
|
||||
intent.putExtra(AlbumViewModel.ALBUM_IMAGES, images)
|
||||
intent.putExtra(AlbumViewModel.ALBUM_INDEX, (child as ViewPager2).currentItem)
|
||||
|
||||
context.startActivity(intent)
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package org.pixeldroid.app.posts
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager.PERMISSION_DENIED
|
||||
import android.graphics.Typeface
|
||||
|
@ -18,11 +17,7 @@ import android.view.View
|
|||
import android.view.ViewGroup
|
||||
import android.widget.*
|
||||
import androidx.activity.result.ActivityResultLauncher
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.WindowCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.WindowInsetsControllerCompat
|
||||
import androidx.lifecycle.LifecycleCoroutineScope
|
||||
import androidx.preference.PreferenceManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
|
@ -536,18 +531,7 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold
|
|||
).show()
|
||||
|
||||
// Create new post creation activity
|
||||
|
||||
//TODO use this instead of clipdata (everywhere)
|
||||
val intent = Intent(Intent.ACTION_SEND_MULTIPLE).apply {
|
||||
// Pass downloaded images to new post creation activity
|
||||
putParcelableArrayListExtra(
|
||||
Intent.EXTRA_STREAM, ArrayList(imageUris)
|
||||
)
|
||||
setClass(context, PostCreationActivity::class.java)
|
||||
|
||||
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
|
||||
|
||||
val intent = PostCreationActivity.intentForUris(context, imageUris).apply {
|
||||
putExtra(
|
||||
PostCreationActivity.PICTURE_DESCRIPTIONS,
|
||||
ArrayList(imageDescriptions)
|
||||
|
@ -817,17 +801,15 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold
|
|||
class AlbumViewPagerAdapter(
|
||||
private val media_attachments: List<Attachment>, private var sensitive: Boolean?,
|
||||
private val opened: Boolean, private val alwaysShowNsfw: Boolean,
|
||||
) :
|
||||
RecyclerView.Adapter<AlbumViewPagerAdapter.ViewHolder>() {
|
||||
|
||||
private var isActionBarHidden: Boolean = false
|
||||
private val clickCallback: (() -> Unit)? = null
|
||||
) : RecyclerView.Adapter<AlbumViewPagerAdapter.ViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||
return if(!opened) ViewHolderClosed(AlbumImageViewBinding.inflate(
|
||||
LayoutInflater.from(parent.context), parent, false
|
||||
)) else ViewHolderOpen(OpenedAlbumBinding.inflate(
|
||||
LayoutInflater.from(parent.context), parent, false
|
||||
))
|
||||
), clickCallback!!)
|
||||
}
|
||||
|
||||
override fun getItemCount() = media_attachments.size
|
||||
|
@ -858,24 +840,6 @@ class AlbumViewPagerAdapter(
|
|||
setDoubleTapZoomDpi(240)
|
||||
resetScaleAndCenter()
|
||||
}
|
||||
holder.image.setOnClickListener {
|
||||
val windowInsetsController = WindowCompat.getInsetsController((it.context as Activity).window, it)
|
||||
// Configure the behavior of the hidden system bars
|
||||
if (isActionBarHidden) {
|
||||
windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
||||
// Hide both the status bar and the navigation bar
|
||||
(it.context as AppCompatActivity).supportActionBar?.show()
|
||||
windowInsetsController.show(WindowInsetsCompat.Type.systemBars())
|
||||
isActionBarHidden = false
|
||||
} else {
|
||||
// Configure the behavior of the hidden system bars
|
||||
windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
||||
// Hide both the status bar and the navigation bar
|
||||
(it.context as AppCompatActivity).supportActionBar?.hide()
|
||||
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
|
||||
isActionBarHidden = true
|
||||
}
|
||||
}
|
||||
}
|
||||
else Glide.with(holder.binding.root)
|
||||
.asDrawable().fitCenter()
|
||||
|
@ -921,9 +885,13 @@ class AlbumViewPagerAdapter(
|
|||
abstract val videoPlayButton: ImageView
|
||||
}
|
||||
|
||||
class ViewHolderOpen(override val binding: OpenedAlbumBinding) : ViewHolder(binding) {
|
||||
class ViewHolderOpen(override val binding: OpenedAlbumBinding, clickCallback: () -> Unit) : ViewHolder(binding) {
|
||||
override val image: SubsamplingScaleImageView = binding.imageImageView
|
||||
override val videoPlayButton: ImageView = binding.videoPlayButton
|
||||
|
||||
init {
|
||||
image.setOnClickListener { clickCallback() }
|
||||
}
|
||||
}
|
||||
class ViewHolderClosed(override val binding: AlbumImageViewBinding) : ViewHolder(binding) {
|
||||
override val image: ImageView = binding.imageImageView
|
||||
|
|
|
@ -138,35 +138,45 @@
|
|||
<plurals name="nb_following">
|
||||
<item quantity="one">%d
|
||||
\nAbonnement</item>
|
||||
<item quantity="many">%d
|
||||
\nAbonnements</item>
|
||||
<item quantity="other">%d
|
||||
\nAbonnements</item>
|
||||
</plurals>
|
||||
<plurals name="nb_followers">
|
||||
<item quantity="one">%d
|
||||
\nAbonné·e</item>
|
||||
<item quantity="many">%d
|
||||
\nAbonné·e·s</item>
|
||||
<item quantity="other">%d
|
||||
\nAbonné·e·s</item>
|
||||
</plurals>
|
||||
<plurals name="nb_posts">
|
||||
<item quantity="one">%d
|
||||
\nPublication</item>
|
||||
<item quantity="many">%d
|
||||
\nPublications</item>
|
||||
<item quantity="other">%d
|
||||
\nPublications</item>
|
||||
</plurals>
|
||||
<plurals name="number_comments">
|
||||
<item quantity="one">%d commentaire</item>
|
||||
<item quantity="many">%d commentaires</item>
|
||||
<item quantity="other">%d commentaires</item>
|
||||
</plurals>
|
||||
<plurals name="shares">
|
||||
<item quantity="one">%d Partage</item>
|
||||
<item quantity="many">%d Partages</item>
|
||||
<item quantity="other">%d Partages</item>
|
||||
</plurals>
|
||||
<plurals name="likes">
|
||||
<item quantity="one">%d J\'aime</item>
|
||||
<item quantity="many">%d J\'aime</item>
|
||||
<item quantity="other">%d J\'aime</item>
|
||||
</plurals>
|
||||
<plurals name="description_max_characters">
|
||||
<item quantity="one">La description doit contenir au moins %d lettre.</item>
|
||||
<item quantity="many">La description doit contenir au moins %d lettres.</item>
|
||||
<item quantity="other">La description doit contenir au moins %d lettres.</item>
|
||||
</plurals>
|
||||
<string name="delete_post_failed_error">Impossible de supprimer la publication, erreur %1$d</string>
|
||||
|
@ -184,7 +194,7 @@
|
|||
<string name="followed_notification_channel">Nouveaux·elles abonné·e·s</string>
|
||||
<string name="mention_notification_channel">Mentions</string>
|
||||
<string name="shared_notification_channel">Partages</string>
|
||||
<string name="liked_notification_channel">Favoris</string>
|
||||
<string name="liked_notification_channel">J\'aime</string>
|
||||
<string name="comment_notification_channel">Commentaires</string>
|
||||
<string name="poll_notification_channel">Sondages</string>
|
||||
<string name="other_notification_channel">Autre</string>
|
||||
|
@ -223,6 +233,85 @@
|
|||
<string name="profile_saved">Modifications enregistrées !</string>
|
||||
<string name="change_profile_picture">Changer votre image de profil</string>
|
||||
<string name="switch_accounts">Permutation de comptes</string>
|
||||
<string name="edit_link_failed">Échec de l\'ouverture de la page de modifications</string>
|
||||
<string name="edit_link_failed">Impossible d\'ouvrir la page d\'édition</string>
|
||||
<string name="follow_requested">Abonnement demandé</string>
|
||||
<string name="comment_noun">Commentaire</string>
|
||||
<string name="redraft_dialog_launch">La reformulation de cet article vous permettra de modifier la photo et sa description, mais supprimera tous les commentaires et les mentions \"J\'aime\". Poursuivre ?</string>
|
||||
<string name="notification_thumbnail">Vignette de l\'image dans ce message</string>
|
||||
<string name="always_show_nsfw">Toujours afficher les contenus sensibles</string>
|
||||
<string name="post_preview">Aperçu d\'un message</string>
|
||||
<plurals name="notification_title_summary">
|
||||
<item quantity="one">%d nouvelle notification</item>
|
||||
<item quantity="many">%d nouvelles notifications</item>
|
||||
<item quantity="other">%d nouvelles notifications</item>
|
||||
</plurals>
|
||||
<plurals name="items_load_success">
|
||||
<item quantity="one">%d article chargé avec succès</item>
|
||||
<item quantity="many">%d articles chargés avec succès</item>
|
||||
<item quantity="other">%d articles chargés avec succès</item>
|
||||
</plurals>
|
||||
<string name="notification_summary_large">%1$s, %2$s, %3$s et %4$d autres</string>
|
||||
<string name="notification_summary_medium">%1$s, %2$s, et %3$s</string>
|
||||
<string name="video_not_supported">Le serveur que vous utilisez ne prend pas en charge les téléchargements de vidéos, il se peut que vous ne puissiez pas télécharger les vidéos incluses dans cet article</string>
|
||||
<string name="new_collection_link_failed">Échec de l\'ouverture de la page de création d\'une collection</string>
|
||||
<string name="bookmark">Favori</string>
|
||||
<string name="unknown_error_in_error">Erreur inconnue, vérifiez si le serveur est en panne : %1$s</string>
|
||||
<string name="profile_error">Impossible de charger le profil</string>
|
||||
<string name="add_images_error">Erreur lors de l\'ajout des images</string>
|
||||
<string name="description_template_summary">Remplir la description des nouveaux messages avec ceci</string>
|
||||
<string name="description_template">Modèle de description</string>
|
||||
<string name="explore_accounts">Explorer les comptes populaires de cette instance</string>
|
||||
<string name="explore_hashtags">Explorer les hashtags en vogue sur cette instance</string>
|
||||
<string name="daily_trending">Voir les messages populaires de la journée</string>
|
||||
<string name="notification_summary_small">%1$s et %2$s</string>
|
||||
<string name="extraneous_pictures_stories">Les images après la première ont été supprimées mais peuvent être restaurées en revenant à la création d\'un message</string>
|
||||
<string name="summary_always_show_nsfw">Les messages NSFW/CW ne seront pas floutés et seront affichés par défaut.</string>
|
||||
<string name="encode_progress">Encodage de %1$d%%</string>
|
||||
<string name="still_encoding">Une ou plusieurs vidéos sont en cours d\'encodage. Attendez qu\'elles soient terminées avant d\'envoyer</string>
|
||||
<string name="notifications_settings_summary">Gérer les notifications que vous souhaitez recevoir</string>
|
||||
<string name="login_notifications">Impossible de récupérer les dernières notifications</string>
|
||||
<string name="no_camera_permission">L\'autorisation pour l\'appareil photo n\'est pas accordée, accordez cette autorisation dans les paramètres si vous voulez permettre à PixelDroid d\'utiliser l\'appareil photo</string>
|
||||
<string name="play_video">Lire la vidéo</string>
|
||||
<string name="public_feed">Publique</string>
|
||||
<string name="accentColorTitle">Couleur d\'accentuation</string>
|
||||
<string name="accentColorSummary">Choisir une couleur d\'accentuation</string>
|
||||
<string name="color_choice_button">Choisir cette couleur d\'accentuation</string>
|
||||
<string name="explore_posts">Explorer aléatoirement les messages d\'aujourd\'hui</string>
|
||||
<string name="grid_view">Vue en grille</string>
|
||||
<string name="feed_view">Vue du flux</string>
|
||||
<string name="encode_error">Erreur d\'encodage</string>
|
||||
<string name="encode_success">Encodage réussi !</string>
|
||||
<string name="more_profile_settings">Autres paramètres du profil</string>
|
||||
<string name="private_account_explanation">Quand votre compte est privé, seules les personnes que vous autorisez peuvent voir vos photos et vidéos sur PixelFed. Les personnes qui vous suivent déjà ne seront pas affectées.</string>
|
||||
<string name="saving_profile">Sauvegarde de votre profil</string>
|
||||
<string name="use_dynamic_color">Utiliser la couleur dynamique de votre système</string>
|
||||
<string name="type_story">Story</string>
|
||||
<string name="story_image">Image de la Story</string>
|
||||
<string name="replyToStory">Répondre à %1$s</string>
|
||||
<string name="story_reply_error">Un problème s\'est produit lors de l\'envoi de la réponse</string>
|
||||
<string name="error_fetch_story">Un problème s\'est produit lors de la récupération du carrousel</string>
|
||||
<string name="sent_reply_story">Envoyer la réponse</string>
|
||||
<string name="fetching_profile">Recherche de votre profil…</string>
|
||||
<string name="redraft_dialog_cancel">Si vous annulez ce remaniement, le message original ne figurera plus sur votre compte. Poursuivre sans réécrire ?</string>
|
||||
<string name="redraft_post_failed_error">Impossible de réécrire le message, erreur %1$d</string>
|
||||
<string name="redraft_post_failed_io_except">Impossible de réécrire le message, vérifiez votre connexion ?</string>
|
||||
<string name="bookmark_post_failed_error">Impossible de mettre/enlever le message en favoris, erreur %1$d</string>
|
||||
<string name="bookmark_post_failed_io_except">Impossible de mettre/enlever le message des favoris, vérifiez votre connexion ?</string>
|
||||
<string name="no_storage_permission">L\'autorisation pour le stockage n\'est pas accordée, accordez l\'autorisation dans les paramètres si vous voulez permettre à PixelDroid d\'afficher la vignette</string>
|
||||
<string name="analyzing_stabilization">Analyse pour stabiliser %1$d%%</string>
|
||||
<string name="color_chosen">Couleur d\'accentuation choisie</string>
|
||||
<string name="error_profile">Un problème s\'est produit. Appuyez pour réessayer</string>
|
||||
<string name="delete_collection_warning">Êtes-vous sûr de vouloir supprimer cette collection ?</string>
|
||||
<string name="added_post_to_collection">Ajouter le message à la collection</string>
|
||||
<string name="error_add_post_to_collection">Échec de l\'ajout du message à la collection</string>
|
||||
<string name="removed_post_from_collection">Enlever le message de la collection</string>
|
||||
<string name="error_remove_post_from_collection">Échec pour retirer le message de la collection</string>
|
||||
<string name="contains_nsfw">Contient des médias NSFW</string>
|
||||
<string name="add_story">Ajouter une Story</string>
|
||||
<string name="story_could_not_see">Erreur : Impossible de marquer la Story comme vu</string>
|
||||
<string name="story_pause">Démarrer ou interrompre les Stories</string>
|
||||
<string name="my_story">Ma Story</string>
|
||||
<string name="type_post">Message</string>
|
||||
<string name="continue_post_creation">Continuer</string>
|
||||
<string name="story_duration">Durée de la Story</string>
|
||||
</resources>
|
|
@ -9,7 +9,7 @@
|
|||
<string name="theme_header">Тема</string>
|
||||
<string name="mention_notification">%1$s вас згадує</string>
|
||||
<string name="description">Опис…</string>
|
||||
<string name="post">надіслати</string>
|
||||
<string name="post">Оприлюднити</string>
|
||||
<string name="save_to_gallery">Зберегти до галереї…</string>
|
||||
<string name="image_download_downloading">Завантаження…</string>
|
||||
<string name="image_download_success">Зображення успішно завантажено</string>
|
||||
|
@ -146,13 +146,13 @@
|
|||
<string name="default_nfollowing">-
|
||||
\nпідписок</string>
|
||||
<string name="search">Пошук</string>
|
||||
<string name="edit_profile">Редагувати</string>
|
||||
<string name="edit_profile">Редагувати профіль</string>
|
||||
<string name="posts">ДОПИСИ</string>
|
||||
<string name="accounts">ОБЛІКОВІ ЗАПИСИ</string>
|
||||
<string name="license_info">PixelDroid — вільне й відкрите програмне забезпечення, доступне на умовах Загальної громадської ліцензії GNU (версії 3 чи новішої)</string>
|
||||
<string name="about">Про застосунок</string>
|
||||
<string name="post_title">Допис %1$s</string>
|
||||
<string name="reported">Скаргу надіслано {gmd_check_circle}</string>
|
||||
<string name="reported">Скаргу надіслано</string>
|
||||
<string name="profile_picture">Зображення профілю</string>
|
||||
<string name="open_drawer_menu">Відкрити висувне меню</string>
|
||||
<string name="something_went_wrong">Щось пішло не так…</string>
|
||||
|
@ -223,4 +223,108 @@
|
|||
<string name="video_not_supported">Використовуваний сервер не підтримує вивантаження відео. Ймовірно, вивантажити відео цього допису не вдасться</string>
|
||||
<string name="post_is_video">Це відеодопис</string>
|
||||
<string name="play_video">Відтворити відео</string>
|
||||
<string name="bookmarks">Закладки</string>
|
||||
<string name="collections">Колекції</string>
|
||||
<string name="delete_collection">Видалити колекцію</string>
|
||||
<string name="collection_add_post">Додати публікацію</string>
|
||||
<string name="collection_remove_post">Вилучити публікацію</string>
|
||||
<string name="comment_noun">Коментар</string>
|
||||
<string name="add_to_collection">Оберіть публікацію для додавання</string>
|
||||
<plurals name="replies_count">
|
||||
<item quantity="one">%d відповідь</item>
|
||||
<item quantity="few">%d відповіді</item>
|
||||
<item quantity="many">%d відповідей</item>
|
||||
<item quantity="other">%d відповідей</item>
|
||||
</plurals>
|
||||
<string name="delete_from_collection">Оберіть публікацію для вилучення</string>
|
||||
<string name="redraft_dialog_cancel">Якщо ви скасуєте цю переробку, оригінального допису більше не буде у вашому акаунті. Продовжити без перепосту?</string>
|
||||
<string name="accentColorTitle">Акцентний колір</string>
|
||||
<string name="explore_posts">Ознайомтеся з випадковими дописами дня</string>
|
||||
<string name="private_account_explanation">Коли ваш акаунт приватний, тільки люди, яких ви схвалите, зможуть бачити ваші фотографії та відео на pixelfed. На ваших існуючих підписників це не вплине.</string>
|
||||
<string name="always_show_nsfw">Завжди показувати чутливий вміст</string>
|
||||
<string name="profile_error">Не вдалося завантажити профіль</string>
|
||||
<string name="explore_accounts">Ознайомтеся з популярними акаунтами на цьому екземплярі</string>
|
||||
<string name="added_post_to_collection">Публікацію додано в колекцію</string>
|
||||
<string name="summary_always_show_nsfw">Дописи NSFW/CW не будуть розмиті і відображатимуться за замовчуванням.</string>
|
||||
<string name="type_story">Історія</string>
|
||||
<string name="new_collection_link_failed">Не вдалося відкрити сторінку створення колекції</string>
|
||||
<string name="redraft_dialog_launch">При переробці цього допису ви зможете відредагувати фотографію та її опис, але при цьому будуть видалені всі поточні коментарі та вподобання. Продовжити?</string>
|
||||
<string name="notification_thumbnail">Ескіз зображення в дописі цього повідомлення</string>
|
||||
<string name="redraft">Переробити</string>
|
||||
<string name="delete_collection_warning">Ви впевнені що хочете видалити цю колекцію?</string>
|
||||
<string name="error_add_post_to_collection">Не вдалося додати публікацію до колекції</string>
|
||||
<string name="use_dynamic_color">Використовувати динамічні кольори з вашої системи</string>
|
||||
<string name="story_could_not_see">Помилка: не вдалося позначити історію як побачену</string>
|
||||
<string name="encode_error">Помилка кодування</string>
|
||||
<string name="encode_success">Кодування успішно завершено!</string>
|
||||
<string name="encode_progress">Кодувати %1$d%%</string>
|
||||
<string name="still_encoding">Одне або кілька відео все ще кодуються. Зачекайте, поки кодування завершиться, перш ніж завантажувати</string>
|
||||
<string name="new_post_shortcut_short">Нова публікація</string>
|
||||
<string name="follow_request">%1$s надіслав запит на відстеження вас</string>
|
||||
<plurals name="items_load_success">
|
||||
<item quantity="one">%d елемент успішно завантажено</item>
|
||||
<item quantity="few">%d елемента успішно завантажено</item>
|
||||
<item quantity="many">%d елементів успішно завантажено</item>
|
||||
<item quantity="other">%d елементів успішно завантажено</item>
|
||||
</plurals>
|
||||
<string name="home_feed">Домівка</string>
|
||||
<string name="search_discover_feed">Пошук</string>
|
||||
<string name="story_image">Зображення історії</string>
|
||||
<string name="replyToStory">Відповісти на %1$s</string>
|
||||
<string name="fetching_profile">Отримання вашого профілю…</string>
|
||||
<string name="continue_post_creation">Продовжити</string>
|
||||
<string name="extraneous_pictures_stories">Зображення після першого були вилучені, але їх можна відновити, повернувшись до створення публікації</string>
|
||||
<string name="upload_next_step">Наступний крок</string>
|
||||
<string name="add_details">Додати деякі деталі</string>
|
||||
<string name="unknown_error_in_error">Невідома помилка, перевірте, чи не працює сервер: %1$s</string>
|
||||
<string name="collection_title">%1$s колекція</string>
|
||||
<string name="bookmark">Закладка</string>
|
||||
<string name="unbookmark">Видалити закладку</string>
|
||||
<string name="feed_view">Вигляд стрічки</string>
|
||||
<string name="redraft_post_failed_error">Не вдалося переробити пост, помилка %1$d</string>
|
||||
<string name="redraft_post_failed_io_except">Не вдалося переписати пост, перевірити ваше зʼєднання?</string>
|
||||
<string name="bookmark_post_failed_error">Не вдалося додати/видалити закладку, помилка %1$d</string>
|
||||
<string name="bookmark_post_failed_io_except">Не вдалося додати/видалити закладку, перевірити зʼєднання?</string>
|
||||
<string name="analyzing_stabilization">Аналіз для стабілізації %1$d%%</string>
|
||||
<string name="new_post_shortcut_long">Створити нову публікацію</string>
|
||||
<string name="status_notification">%1$s створив публікацію</string>
|
||||
<string name="create_feed">Створити</string>
|
||||
<string name="notifications_feed">Оновлення</string>
|
||||
<string name="public_feed">Публічний</string>
|
||||
<string name="accentColorSummary">Виберіть акцентний колір</string>
|
||||
<string name="color_choice_button">Вибрати цей колір як акцентний</string>
|
||||
<string name="color_chosen">Обрано акцентний колір</string>
|
||||
<string name="from_other_domain">з %1$s</string>
|
||||
<string name="add_images_error">Помилка під час додавання зображень</string>
|
||||
<string name="post_preview">Попередній перегляд публікації</string>
|
||||
<string name="description_template_summary">Доповніть опис нових дописів цим</string>
|
||||
<string name="description_template">Шаблон опису</string>
|
||||
<string name="popular_accounts">Популярні акаунти</string>
|
||||
<string name="explore_hashtags">Дослідіть популярні хештеги на цьому екземплярі</string>
|
||||
<string name="trending_hashtags">Популярні хештеги</string>
|
||||
<string name="daily_trending">Переглядайте щоденні популярні дописи</string>
|
||||
<string name="trending_posts">Популярні публікації</string>
|
||||
<string name="grid_view">Вигляд сітки</string>
|
||||
<string name="error_remove_post_from_collection">Не вдалося вилучити публікацію з колекції</string>
|
||||
<string name="removed_post_from_collection">Публікацію вилучено з колекції</string>
|
||||
<string name="save">Зберегти</string>
|
||||
<string name="more_profile_settings">Більше налаштувань профілю</string>
|
||||
<string name="private_account">Приватний обліковий запис</string>
|
||||
<string name="your_bio">Ваша біографія</string>
|
||||
<string name="your_name">Ваге імʼя</string>
|
||||
<string name="profile_save_changes">Ви не зберегли зміни. Вийти?</string>
|
||||
<string name="saving_profile">Збереження вашого профілю</string>
|
||||
<string name="profile_saved">Зміни збережено!</string>
|
||||
<string name="error_profile">Щось пішло не так. Натисніть, щоб повторити спробу</string>
|
||||
<string name="change_profile_picture">Змінити зображення профілю</string>
|
||||
<string name="contains_nsfw">Містить носії NSFW</string>
|
||||
<string name="switch_accounts">Змінити обліковий запис</string>
|
||||
<string name="story_reply_error">Щось пішло не так під час надсилання відповіді</string>
|
||||
<string name="error_fetch_story">Щось пішло не так з каруселлю</string>
|
||||
<string name="sent_reply_story">Відповідь надіслано</string>
|
||||
<string name="add_story">Додати історію</string>
|
||||
<string name="story_pause">Запустити або призупинити історії</string>
|
||||
<string name="my_story">Моя історія</string>
|
||||
<string name="type_post">Публікація</string>
|
||||
<string name="story_duration">Тривалість історії</string>
|
||||
</resources>
|
|
@ -0,0 +1,291 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="menu_settings">設定</string>
|
||||
<string name="menu_account">關於我</string>
|
||||
<string name="invalid_domain">無效的網域</string>
|
||||
<string name="registration_failed">無法在此伺服器上註冊</string>
|
||||
<string name="auth_failed">無法認證</string>
|
||||
<string name="verify_credentials">無法獲取使用者資訊</string>
|
||||
<string name="token_error">獲取Token的時候發生錯誤</string>
|
||||
<string name="instance_error">無法獲取實例資訊</string>
|
||||
<string name="instance_not_pixelfed_continue">無論如何繼續</string>
|
||||
<string name="instance_not_pixelfed_cancel">取消登入</string>
|
||||
<string name="title_activity_settings2">設定</string>
|
||||
<string name="theme_title">應用主題</string>
|
||||
<string name="theme_header">主題</string>
|
||||
<string name="default_system">默認(跟隨系統)</string>
|
||||
<string name="light_theme">明亮</string>
|
||||
<string name="dark_theme">黑暗</string>
|
||||
<string name="always_show_nsfw">總是展示敏感內容</string>
|
||||
<string name="followed_notification">%1$s 追蹤了你</string>
|
||||
<string name="mention_notification">%1$s 提及了你</string>
|
||||
<string name="shared_notification">%1$s 分享了你的貼文</string>
|
||||
<string name="comment_notification">%1$s 在你的貼文下留言了</string>
|
||||
<string name="poll_notification">%1$s的投票已經結束</string>
|
||||
<string name="other_notification">從%1$s的通知</string>
|
||||
<string name="followed_notification_channel">新的追蹤者</string>
|
||||
<string name="mention_notification_channel">提及</string>
|
||||
<string name="shared_notification_channel">分享</string>
|
||||
<string name="liked_notification_channel">喜歡</string>
|
||||
<string name="comment_notification_channel">留言</string>
|
||||
<string name="poll_notification_channel">投票</string>
|
||||
<string name="other_notification_channel">其他</string>
|
||||
<string name="notification_summary_large">%1$s, %2$s, %3$s 和 %4$d 更多</string>
|
||||
<string name="notification_summary_medium">%1$s, %2$s, 和 %3$s</string>
|
||||
<string name="notification_summary_small">%1$s 和 %2$s</string>
|
||||
<string name="whats_an_instance">「實例」是什麼?</string>
|
||||
<string name="domain_of_your_instance">你所在實例的網域</string>
|
||||
<string name="connect_to_pixelfed">連接至Pixelfed</string>
|
||||
<string name="login_connection_required_once">你需要連上網際網路才能新增第一個賬戶來使用PixelDroid :(</string>
|
||||
<string name="api_not_enabled_dialog">這個實例上的API並沒有被啟用。請與你的管理員聯絡。</string>
|
||||
<string name="logout">登出</string>
|
||||
<plurals name="description_max_characters">
|
||||
<item quantity="other">介紹必須含有最少%d個字元。</item>
|
||||
</plurals>
|
||||
<string name="upload_picture_failed">上載圖片失敗!</string>
|
||||
<string name="picture_format_error">上載失敗:錯誤的圖片格式。</string>
|
||||
<string name="request_format_error">上載失敗:請求格式錯誤</string>
|
||||
<string name="upload_post_failed">貼文上載失敗</string>
|
||||
<string name="upload_post_error">貼文上載錯誤</string>
|
||||
<string name="description">介紹……</string>
|
||||
<string name="post">貼文</string>
|
||||
<string name="upload_next_step">下一步</string>
|
||||
<string name="add_details">新增點細節</string>
|
||||
<string name="add_photo">新增圖片</string>
|
||||
<string name="post_image">本貼文中的一個圖片</string>
|
||||
<string name="switch_to_grid">切換到網格視圖</string>
|
||||
<string name="save_image_description">保存圖片介紹</string>
|
||||
<string name="no_media_description">在這裡新增媒體描述……</string>
|
||||
<string name="size_exceeds_instance_limit">第%1$d個圖片超過了實例所允許的最大大小(%2$dkB,限制為%3$dkB),你可能無法上載。</string>
|
||||
<string name="upload_error">伺服器返回了「%1$d」的錯誤碼</string>
|
||||
<string name="capture_button_alt">拍照</string>
|
||||
<string name="switch_camera_button_alt">切換攝像頭</string>
|
||||
<string name="gallery_button_alt">相簿</string>
|
||||
<string name="loading_toast">載入時發生錯誤</string>
|
||||
<string name="feed_failed">無法獲得Feed</string>
|
||||
<string name="unknown_error_in_error">未知錯誤,看看伺服器是否停運:%1$s</string>
|
||||
<string name="browser_launch_failed">無法拉起瀏覽器,你有安裝嗎?</string>
|
||||
<string name="app_name">PixelDroid</string>
|
||||
<string name="instance_not_pixelfed_warning">這看起來不是個Pixelfed實例,應用可能會以意想不到的方式崩潰。</string>
|
||||
<string name="liked_notification">%1$s 喜歡了你的貼文</string>
|
||||
<string name="upload_post_success">成功上載了貼文</string>
|
||||
<string name="switch_to_carousel">切換到輪播</string>
|
||||
<string name="video_not_supported">你選擇的伺服器不支援上載影片,你可能無法在此貼文中新增影片</string>
|
||||
<plurals name="notification_title_summary">
|
||||
<item quantity="other">%d 則新通知</item>
|
||||
</plurals>
|
||||
<string name="whats_an_instance_explanation">你可能因被要求填入「實例」而困惑。
|
||||
\n
|
||||
\nPixelfed是個聯邦平台,「聯邦宇宙」的一員,可以和其他平台上相同語言的使用者相互交談,就像Mastodon(去https://joinmastodon.org看看)
|
||||
\n
|
||||
\n也就是說你必須選擇一個伺服器,或者是Pixelfed的「實例」來使用。如果沒有的話請訪問https://pixelfed.org/join
|
||||
\n
|
||||
\n欲瞭解Pixelfed的更多資訊,請訪問https://pixelfed.org</string>
|
||||
<string name="add_account_name">新增賬戶</string>
|
||||
<string name="add_account_description">新增另一個Pixelfed賬戶</string>
|
||||
<string name="total_exceeds_album_limit">你可以選擇該伺服器最多允許的圖片數量(%1$s個)。超過限制的會被忽略。</string>
|
||||
<string name="share_picture">分享相片……</string>
|
||||
<string name="save_to_gallery">存儲至相簿……</string>
|
||||
<string name="image_download_failed">下載失敗,請重試</string>
|
||||
<string name="image_download_downloading">下載中……</string>
|
||||
<string name="image_download_success">相片下載成功</string>
|
||||
<plurals name="items_load_success">
|
||||
<item quantity="other">%d個物件已被成功載入</item>
|
||||
</plurals>
|
||||
<string name="no_description">沒有描述</string>
|
||||
<plurals name="likes">
|
||||
<item quantity="other">%d個喜歡</item>
|
||||
</plurals>
|
||||
<plurals name="shares">
|
||||
<item quantity="other">%d個分享</item>
|
||||
</plurals>
|
||||
<string name="posted_on">在%1$s發表</string>
|
||||
<string name="NoCommentsToShow">此貼文下沒有回覆……</string>
|
||||
<string name="empty_comment">回覆内容不能為空!</string>
|
||||
<string name="share_image">分享相片</string>
|
||||
<string name="comment_error">回覆失敗!</string>
|
||||
<string name="comment_posted">回覆「%1$s」已發表!</string>
|
||||
<string name="comment_verb">回覆</string>
|
||||
<string name="comment_noun">回覆</string>
|
||||
<plurals name="number_comments">
|
||||
<item quantity="other">%d則回覆</item>
|
||||
</plurals>
|
||||
<string name="add_comment">發表回覆</string>
|
||||
<string name="submit_comment">發表回覆</string>
|
||||
<string name="post_is_album">這則貼文是一個集合</string>
|
||||
<string name="post_is_video">這則貼文是一支影片</string>
|
||||
<plurals name="nb_posts">
|
||||
<item quantity="other">%d
|
||||
\n貼文</item>
|
||||
</plurals>
|
||||
<plurals name="nb_followers">
|
||||
<item quantity="other">%d
|
||||
\n追蹤者</item>
|
||||
</plurals>
|
||||
<string name="edit">編輯</string>
|
||||
<string name="save_image_failed">無法儲存相片</string>
|
||||
<string name="save_image_success">相片成功存儲</string>
|
||||
<string name="follow_status_failed">無法獲取追蹤狀態</string>
|
||||
<string name="edit_link_failed">無法打開編輯頁面</string>
|
||||
<string name="empty_feed">本來無一物,何處惹塵埃</string>
|
||||
<string name="follow_button_failed">無法顯示追蹤按鈕</string>
|
||||
<string name="follow_error">無法追蹤</string>
|
||||
<string name="action_not_allowed">不允許此操作</string>
|
||||
<string name="unfollow_error">無法取消追蹤</string>
|
||||
<string name="access_token_invalid">這個access token無效</string>
|
||||
<string name="default_nposts">-
|
||||
\n貼文</string>
|
||||
<string name="default_nfollowers">-
|
||||
\n追蹤者</string>
|
||||
<string name="default_nfollowing">-
|
||||
\n追蹤中</string>
|
||||
<string name="no_username">無使用者名稱</string>
|
||||
<string name="follow">追蹤</string>
|
||||
<string name="follow_requested">請求已送出</string>
|
||||
<string name="dialog_message_cancel_follow_request">取消追蹤申請嗎?</string>
|
||||
<string name="edit_profile">編輯個人資料</string>
|
||||
<string name="search">搜尋</string>
|
||||
<string name="posts">貼文</string>
|
||||
<string name="accounts">使用者</string>
|
||||
<string name="hashtags">推標</string>
|
||||
<string name="media_upload_completed">媒體上載成功</string>
|
||||
<string name="media_upload_failed">媒體上載失敗,重新試試,或者檢查下網路</string>
|
||||
<string name="posting_image_accessibility_hint">準備要貼出的相片</string>
|
||||
<string name="retry">重試</string>
|
||||
<string name="nothing_to_see_here">空無一物!</string>
|
||||
<string name="about_pixeldroid">關於PixelDroid</string>
|
||||
<string name="dependencies_licenses">依賴和許可</string>
|
||||
<string name="about">關於</string>
|
||||
<string name="post_title">%1$s的貼文</string>
|
||||
<string name="collection_title">%1$s的合集</string>
|
||||
<string name="followers_title">%1$s的追蹤者</string>
|
||||
<string name="hashtag_title">#%1$s</string>
|
||||
<string name="follows_title">%1$s的追蹤</string>
|
||||
<string name="search_empty_error">搜尋的關鍵詞不能為空</string>
|
||||
<string name="status_more_options">更多</string>
|
||||
<string name="report">回報</string>
|
||||
<string name="bookmark">書簽</string>
|
||||
<string name="unbookmark">從書簽中移除</string>
|
||||
<string name="share_link">分享連結</string>
|
||||
<string name="reported">已報告貼文</string>
|
||||
<string name="profile_picture">個人資料相片</string>
|
||||
<string name="open_drawer_menu">打開抽屜菜單</string>
|
||||
<string name="discover">發現</string>
|
||||
<string name="something_went_wrong">發生錯誤……</string>
|
||||
<string name="panda_pull_to_refresh_to_try_again">這隻熊貓不開心。下拉重載以重試。</string>
|
||||
<string name="redraft">重擬</string>
|
||||
<string name="redraft_dialog_cancel">如果你取消這次重擬,原貼文將會被從你的賬戶中移除。繼續嗎?</string>
|
||||
<string name="delete">刪除</string>
|
||||
<string name="delete_dialog">刪除這則貼文嗎?</string>
|
||||
<string name="language">語言</string>
|
||||
<string name="help_translate">幫助將PixelDroid翻譯成你的語言吧:</string>
|
||||
<string name="issues_contribute">報告問題或是給這個軟體貢獻:</string>
|
||||
<string name="redraft_post_failed_error">無法重擬這則貼文,錯誤%1$d</string>
|
||||
<string name="redraft_post_failed_io_except">無法重擬貼文,檢查你的網路?</string>
|
||||
<string name="delete_post_failed_error">無法刪除這則貼文,錯誤%1$d</string>
|
||||
<string name="delete_post_failed_io_except">無法刪除這則貼文,檢查你的網路?</string>
|
||||
<string name="bookmark_post_failed_error">無法對此貼文進行書簽操作,錯誤%1$d</string>
|
||||
<string name="file_not_found">沒找到檔案%1$s</string>
|
||||
<string name="notifications_settings">通知設定</string>
|
||||
<string name="notifications_settings_summary">管理你想接收到的通知</string>
|
||||
<string name="login_notifications">無法獲取最新通知</string>
|
||||
<string name="no_storage_permission">存儲權限未獲取。如果想查看縮圖的話請在設定中允許該權限</string>
|
||||
<string name="play_video">播放影片</string>
|
||||
<string name="encode_error">編碼錯誤</string>
|
||||
<string name="encode_success">編碼成功!</string>
|
||||
<string name="encode_progress">編碼%1$d%%</string>
|
||||
<string name="analyzing_stabilization">穩定性分析%1$d%%</string>
|
||||
<string name="still_encoding">有影片還在編碼。請在上載前等待編碼完成</string>
|
||||
<string name="new_post_shortcut_long">建立新貼文</string>
|
||||
<string name="new_post_shortcut_short">新貼文</string>
|
||||
<string name="follow_request">%1$s請求追蹤</string>
|
||||
<string name="home_feed">主頁面</string>
|
||||
<string name="search_discover_feed">搜尋</string>
|
||||
<string name="create_feed">建立</string>
|
||||
<string name="notifications_feed">更新</string>
|
||||
<string name="public_feed">公共</string>
|
||||
<string name="accentColorTitle">色調</string>
|
||||
<string name="color_choice_button">選擇這個色調</string>
|
||||
<string name="color_chosen">色調已選擇</string>
|
||||
<string name="profile_error">無法載入資料</string>
|
||||
<string name="from_other_domain">來自%1$s</string>
|
||||
<string name="add_images_error">加入相片時發生錯誤</string>
|
||||
<string name="post_preview">貼文預覽</string>
|
||||
<string name="description_template_summary">在新貼文的描述中預填入</string>
|
||||
<string name="description_template">描述模板</string>
|
||||
<string name="explore_accounts">探索這個實例上熱門的使用者</string>
|
||||
<string name="popular_accounts">熱門使用者</string>
|
||||
<string name="explore_hashtags">探索此實例中急上升的推標</string>
|
||||
<string name="trending_hashtags">急上升推標</string>
|
||||
<string name="daily_trending">瀏覽每日熱門貼文</string>
|
||||
<string name="trending_posts">熱門貼文</string>
|
||||
<string name="grid_view">網格視圖</string>
|
||||
<string name="feed_view">饋送視圖</string>
|
||||
<string name="bookmarks">書簽</string>
|
||||
<string name="collections">合集</string>
|
||||
<string name="delete_collection">刪除合集</string>
|
||||
<string name="collection_add_post">加入貼文</string>
|
||||
<string name="collection_remove_post">移除貼文</string>
|
||||
<string name="add_to_collection">選取貼文以新增</string>
|
||||
<string name="delete_from_collection">選取貼文已移除</string>
|
||||
<string name="added_post_to_collection">已新增貼文到合集中</string>
|
||||
<string name="error_add_post_to_collection">無法將貼文新增至合集中</string>
|
||||
<string name="error_remove_post_from_collection">無法將貼文從合集中移除</string>
|
||||
<string name="removed_post_from_collection">已將貼文從合集中移除</string>
|
||||
<plurals name="replies_count">
|
||||
<item quantity="other">%d則回覆</item>
|
||||
</plurals>
|
||||
<string name="save">保存</string>
|
||||
<string name="more_profile_settings">更多資料設定</string>
|
||||
<string name="private_account">私密使用者</string>
|
||||
<string name="your_bio">你的自述</string>
|
||||
<string name="your_name">你的名字</string>
|
||||
<string name="profile_save_changes">不保存而退出嗎?</string>
|
||||
<string name="fetching_profile">獲取你的資料……</string>
|
||||
<string name="saving_profile">存儲你的資料中</string>
|
||||
<string name="profile_saved">更改已保存!</string>
|
||||
<string name="error_profile">發生錯誤。點按重試</string>
|
||||
<string name="change_profile_picture">修改你的資料相片</string>
|
||||
<string name="switch_accounts">切換使用者</string>
|
||||
<string name="summary_always_show_nsfw">敏感媒體將不會被模糊,默認展示。</string>
|
||||
<string name="contains_nsfw">包含敏感媒體</string>
|
||||
<string name="story_image">故事相片</string>
|
||||
<string name="replyToStory">回覆%1$s</string>
|
||||
<string name="error_fetch_story">獲取旋轉視圖的時候出了點問題</string>
|
||||
<string name="sent_reply_story">傳送了回覆</string>
|
||||
<string name="add_story">新增故事</string>
|
||||
<string name="story_could_not_see">錯誤:不能將故事標注為已看過</string>
|
||||
<string name="story_pause">開始或暫停故事</string>
|
||||
<string name="my_story">我的故事</string>
|
||||
<string name="type_story">故事</string>
|
||||
<string name="type_post">貼文</string>
|
||||
<string name="continue_post_creation">繼續</string>
|
||||
<string name="extraneous_pictures_stories">第一張相片后的相片已刪除,不過可以透過切換回創建貼文來恢復</string>
|
||||
<string name="story_duration">故事時長</string>
|
||||
<string name="write_permission_download_pic">你需要允許存儲空間權限才能保存相片!</string>
|
||||
<string name="unfollow">取消追蹤</string>
|
||||
<string name="cw_nsfw_hidden_media_n_click_to_show">敏感媒體
|
||||
\n (點按閲覽)</string>
|
||||
<string name="project_website">項目網站:https://pixeldroid.org</string>
|
||||
<plurals name="nb_following">
|
||||
<item quantity="other">%d
|
||||
\n追蹤中</item>
|
||||
</plurals>
|
||||
<string name="optional_report_comment">給管理員的附加資訊</string>
|
||||
<string name="new_collection_link_failed">無法打開合集創建頁面</string>
|
||||
<string name="license_info">PixelDroid是一個免費且開源的軟體,由GNU General Public License (version 3或更新版)授權</string>
|
||||
<string name="report_target">報告@%1$s的貼文</string>
|
||||
<string name="report_error">無法傳送報告</string>
|
||||
<string name="redraft_dialog_launch">重擬這則貼文將允許你編輯它的相片和描述,但會刪除現在所有的回覆和按讚。繼續?</string>
|
||||
<string name="notification_thumbnail">在這則貼文通知中的縮圖</string>
|
||||
<string name="private_account_explanation">當你的使用者為私密時,只有你認可的使用者才能看到你在Pixelfed上的相片和影片。現存的追蹤者不受影響。</string>
|
||||
<string name="mascot_description">一個展示了一隻紅熊貓(Pixelfed的吉祥物)用手機的相片</string>
|
||||
<string name="use_dynamic_color">用系統的動態顔色</string>
|
||||
<string name="story_reply_error">發表回覆的時候出了點問題</string>
|
||||
<string name="bookmark_post_failed_io_except">無法對此貼文進行書簽操作,檢查你的網路?</string>
|
||||
<string name="status_notification">%1$s建立了一個貼文</string>
|
||||
<string name="no_camera_permission">相機權限未獲取。如果想用攝影功能的話請在設定中允許該權限</string>
|
||||
<string name="accentColorSummary">選擇一個色調</string>
|
||||
<string name="explore_posts">瀏覽隨機貼文</string>
|
||||
<string name="delete_collection_warning">你確定要刪除此合集嗎?</string>
|
||||
</resources>
|
|
@ -6,7 +6,7 @@ buildscript {
|
|||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.2.2'
|
||||
classpath 'com.android.tools.build:gradle:8.3.1'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Fix bug that was breaking the image editing feature in release mode
|
|
@ -0,0 +1,3 @@
|
|||
* Fix crash when sharing an image from gallery etc to the app
|
||||
|
||||
* Fix permission issue causing images to throw a permission denied error
|
|
@ -0,0 +1 @@
|
|||
Split APKs per CPU architecture, makes the APKs a lot smaller (100MB to 25MB)
|
|
@ -0,0 +1,3 @@
|
|||
Try again to split the apks
|
||||
|
||||
Update dependencies
|
|
@ -0,0 +1,3 @@
|
|||
* Montage vidéo ! Supprimez le son, découper les vidéos
|
||||
* Ouvrez les images en plein écran et zoomez dessus :)
|
||||
* Mises à jour des traductions
|
|
@ -0,0 +1 @@
|
|||
Correctif pour les plantages dans l'activité d'édition qui ne se produisaient qu'en mode release
|
|
@ -0,0 +1 @@
|
|||
Ajout de la traduction en hongrois (Magyar) à l'application. Merci à Balázs :)
|
|
@ -0,0 +1,4 @@
|
|||
* Ajout de règles gson proguard pour corriger les crashs sur les instances Mastodon
|
||||
* Ajout de thèmes de couleur avec 4 thèmes différents
|
||||
* Passage à Material 3
|
||||
* Améliorer la cohérence de l'interface utilisateur
|
|
@ -0,0 +1,7 @@
|
|||
* Commentaires : leur ouverture permet de voir les réponses et l'avatar de l'auteur, l'aimer, etc
|
||||
* MAJ des traductions. Merci aux traducteurs :) Aidez à la traduction sur weblate.pixeldroid.org
|
||||
* Sécurité : altération des dépendances vérifiée, refus des connexions HTTP
|
||||
* Utilisation du User Agent "PixelDroid"
|
||||
* Suppression des chaînes codées en dur, tout est maintenant traduisible
|
||||
* Quelques améliorations du code
|
||||
* Correction de la sauvegarde des images et d'un crash sur des instances Mastodon
|
|
@ -0,0 +1,11 @@
|
|||
* Ajout d'un graphique d'erreur personnalisé panda rouge
|
||||
|
||||
* Autoriser le recadrage libre dans l'édition d'image
|
||||
|
||||
* Amélioration des métadonnées pour F-Droid
|
||||
|
||||
* Mises à jour des traductions
|
||||
|
||||
* Mise à jour des dépendances
|
||||
|
||||
* Correction de bugs
|
|
@ -0,0 +1,9 @@
|
|||
* Métadonnées des photos supprimées avant de les envoyer
|
||||
* Favoris !
|
||||
* Voir un profil comme un flux ou une grille
|
||||
* Définir un modèle pour vos descriptions
|
||||
* Badge sur l'icône de notification pour indiquer les nouvelles notifications
|
||||
* Fonctionnalités d'édition vidéo : recadrer, changer la vitesse, stabilisation
|
||||
* Implémentation de couleurs dynamiques : PixelDroid peut suive la couleur de votre arrière-plan (Android 12 et plus)
|
||||
* Correction de bugs
|
||||
* Mise à jour des traductions
|
|
@ -0,0 +1,7 @@
|
|||
* Mises à jour des traductions : Merci aux traducteurs ❤️ ! Allez sur notre weblate pour nous aider à la traduction.
|
||||
|
||||
#️⃣ Prise en charge des hashtags. Possibilité de parcourir les hashtags, au lieu d'afficher un "toast" message 😜
|
||||
|
||||
* Cliquez sur l'onglet pour revenir au début. Une fois dans la page, il suffit de cliquer sur l'onglet dans lequel vous vous trouvez pour revenir en haut :)
|
||||
|
||||
* Essai de correction d'un bug qui faisait planter l'application. Merci pour vos rapports de crash ! ❤️
|
|
@ -0,0 +1,4 @@
|
|||
- Suppression et reformulation des messages existants
|
||||
- Les collections d'articles peuvent désormais être visualisées et modifiées.
|
||||
- La création d'un message se fait désormais en deux étapes, avec une nouvelle prise en charge des éléments suivants : sensibilité NSFW, changement de compte, etc
|
||||
- Beaucoup d'autres changements et améliorations :)
|
|
@ -0,0 +1,4 @@
|
|||
* Messages d'avertissement moins agressifs si vous désactivez la caméra ou les permissions de fichiers
|
||||
* Mise à jour des traductions
|
||||
* Correction de l'interruption de l'envoi de vidéos
|
||||
* Amélioration de la gestion des erreurs
|
|
@ -0,0 +1,4 @@
|
|||
* Prise en charge des Stories !
|
||||
* Mises à jour des dépendances
|
||||
* Accélération matériel pour l'encodage vidéo
|
||||
* Beaucoup de travail en coulisse :)
|
|
@ -0,0 +1 @@
|
|||
Corrections de bugs et améliorations ;)
|
|
@ -0,0 +1,7 @@
|
|||
Correction d'un bug lors de l'ouverture d'un album en plein écran.
|
||||
|
||||
Utiliser l'accélération matérielle (OpenGL ! Shaders !) pour l'édition d'images. Pour l'instant, nous essayons juste d'imiter l'implémentation précédente, mais cela fournira des blocs de construction pour des choses bien plus cool par la suite :)
|
||||
|
||||
Dites-nous si quelque chose ne fonctionne pas correctement ! (email, Mastodon)
|
||||
|
||||
Il y a aussi des mises à jour de traduction dans cette version :)
|
|
@ -0,0 +1,7 @@
|
|||
* Ajout d'une langue (Malayalam)
|
||||
|
||||
* Correction de quelques mauvaises réponses de l'API
|
||||
|
||||
* Mise à jour des dépendances
|
||||
|
||||
* Mise à jour des traductions
|
|
@ -0,0 +1 @@
|
|||
Correction d'un bug qui cassait la fonction d'édition d'images en mode release
|
|
@ -0,0 +1,3 @@
|
|||
* Correction d'un crash lors du partage d'une image (de la galerie, etc.) vers l'application
|
||||
|
||||
* Correction d'un problème de permission qui causait de la part des images une erreur "permission refusée"
|
|
@ -0,0 +1 @@
|
|||
Séparation des APKs par architecture CPU, rendant les APKs beaucoup plus petits (passage de 100Mo à 25Mo)
|
|
@ -0,0 +1,3 @@
|
|||
Nouvelle tentative de séparation des apks
|
||||
|
||||
Mise à jour des dépendances
|
|
@ -0,0 +1,7 @@
|
|||
- Support des notifications ! Encore un peu rudimentaire :)
|
||||
- Correction : rotation EXIF ignorée, photos tournées dans le mauvais sens
|
||||
- Correction #300
|
||||
- Correction : navigateurs webview affichant une erreur à la connexion quand l'URL contenait des espaces
|
||||
- Correction : vidage des caches, flux vides aux lancements, performance, photos de profil et appareil photo en erreur après changement d'onglet
|
||||
- Traduction : ajout du Tchèque et mise à jour des autres langues
|
||||
- Dépendances mises à jour
|
|
@ -0,0 +1,5 @@
|
|||
* Mises à jour des traductions
|
||||
* Amélioration de l'affichage des informations sur les licences
|
||||
* Correction des problèmes de permission dans l'onglet caméra
|
||||
* Correction de l'analyseur de liens
|
||||
* Correction de la vue découverte (peut nécessiter des mises à jour de l'instance)
|
|
@ -0,0 +1,2 @@
|
|||
* Mises à jour des traductions
|
||||
* Autoriser l'envoi d'images distantes (ex. Nextcloud)
|
|
@ -0,0 +1,4 @@
|
|||
* Ajout d'un support pour la lecture et l'envoi de vidéos
|
||||
* Amélioration des notifications
|
||||
* Mise à jour des traductions
|
||||
* Mise à jour des dépendances
|
|
@ -0,0 +1,3 @@
|
|||
* Correction d'un crash lors de l'affichage de la liste des licences
|
||||
* Amélioration considérable des performances dans l'activité affichant le profil
|
||||
* Mise à jour des dépendances
|
|
@ -0,0 +1,11 @@
|
|||
PixelDroid est un client Android gratuit, libre et open source pour Pixelfed, la plateforme fédérée de partage d'images.
|
||||
|
||||
Parcourez les flux et les profils, envoyez de nouveaux messages, découvrez des messages, interagissez avec d'autres personnes sur le fediverse.
|
||||
|
||||
- Support multi-compte
|
||||
- Thèmes sombres et clairs
|
||||
- Appliquez des filtres, recadrez, modifiez la luminosité/contraste/saturation
|
||||
- Prend en compte la configuration de votre serveur Pixelfed
|
||||
- Logiciel 100% libre et open source. Aucune dépendances propriétaires.
|
||||
|
||||
Visitez https://pixelfed.org pour en savoir plus sur Pixelfed.
|
|
@ -0,0 +1 @@
|
|||
Client pour Pixelfed, la plateforme fédérée de partage d'images
|
|
@ -0,0 +1 @@
|
|||
PixelDroid
|
|
@ -0,0 +1,3 @@
|
|||
* Редагування відео! Вимкнення звуку, обрізка відео
|
||||
* Відкривайте зображення на весь екран, масштабуйте та переміщуйте їх :)
|
||||
* Оновлення перекладів
|
|
@ -0,0 +1 @@
|
|||
Виправлення збоїв під час редагування, які траплялися лише у режимі релізу
|
|
@ -0,0 +1 @@
|
|||
Додано переклад угорською (мадярською) мовою до додатку. Дякуємо Balazs :)
|
|
@ -0,0 +1,4 @@
|
|||
* Додано правила gson proguard для виправлення збоїв на екземплярах Mastodon
|
||||
* Додано кольорове оформлення з 4 різними темами
|
||||
* Перейшли до Material 3
|
||||
* Покращено узгодженість інтерфейсу користувача
|
|
@ -0,0 +1,8 @@
|
|||
* покращено роботу з коментарями: Тепер ви можете відкрити коментар, щоб побачити відповіді, поставити вподобайку, у коментарях відображається аватар його автора тощо.
|
||||
* Оновлення перекладів. Дякуємо перекладачам :). Допоможіть перекласти PixelDroid на вашу мову на weblate.pixeldroid.org
|
||||
* Безпека: перевірка залежностей гарантує, що залежності, включені в додаток, не були підроблені, PixelDroid тепер відмовлятиметься від будь-яких не-HTTPS з'єднань
|
||||
* PixelDroid тепер використовує власний агент користувача "PixelDroid" замість бібліотечного OkHttp.
|
||||
* Видалено всі жорстко закодовані рядки з програми, тепер все нормально перекладається.
|
||||
* Деякі покращення коду
|
||||
* Виправлено збереження зображень, що надходять до програми з бібліотеки або надаються у спільний доступ
|
||||
* Виправлено ще один збій при використанні екземплярів Mastodon
|
|
@ -0,0 +1 @@
|
|||
Виправлено помилку, яка порушувала роботу функції редагування зображень у режимі релізу
|
|
@ -0,0 +1,3 @@
|
|||
* Виправлено збій під час надання доступу до зображення з галереї тощо у додатку
|
||||
|
||||
* Виправлено проблему з дозволами, через яку зображення видавали помилку відмови в доступі
|
|
@ -0,0 +1 @@
|
|||
Розділення APK-файлів по архітектурах процесорів, що робить APK-файли значно меншими (від 100 МБ до 25 МБ)
|
|
@ -0,0 +1,3 @@
|
|||
Спробуйте ще раз розділити apk файли
|
||||
|
||||
Оновити залежності
|
|
@ -1 +1 @@
|
|||
Subproject commit 956bd5f88d6189009f2ba0a8cb2860a1bfee0ee6
|
||||
Subproject commit 702d14fe701343958337efa1b4eb31f0250849f6
|
|
@ -1 +1 @@
|
|||
Subproject commit 7c67b911930b4344a2917f2944493e08fdd04b57
|
||||
Subproject commit 23d4d94b45a848f0c64a042985eb03d0acc2f18b
|
Loading…
Reference in New Issue