Compare commits
259 Commits
feature/re
...
v1.2.3+for
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99f0817bdb | ||
|
|
220cd35d82 | ||
|
|
07f4ef1697 | ||
|
|
f20732ddc2 | ||
|
|
b1e0dc5843 | ||
|
|
285eb25706 | ||
|
|
ec556511e6 | ||
|
|
85c3d9f65f | ||
|
|
a7ebadf269 | ||
|
|
94c09d46c2 | ||
|
|
f6f08d176c | ||
|
|
66cdd63496 | ||
|
|
8b502b605c | ||
|
|
2c0ec28803 | ||
|
|
a9ab9cb249 | ||
|
|
961c69b525 | ||
|
|
c70f393559 | ||
|
|
9abdc174f4 | ||
|
|
2e5bfa1d9c | ||
|
|
33cbd85e19 | ||
|
|
8cb1f3f387 | ||
|
|
3f0c6fcec5 | ||
|
|
797cf893da | ||
|
|
a3564b70e1 | ||
|
|
43004307b8 | ||
|
|
acd1e4ced3 | ||
|
|
6717070f93 | ||
|
|
387499ae49 | ||
|
|
8ab140c55d | ||
|
|
914abb95dd | ||
|
|
5360c0f0f7 | ||
|
|
243d803b51 | ||
|
|
b343fe3835 | ||
|
|
3c42c1120f | ||
|
|
ad840dcef6 | ||
|
|
f73072d95e | ||
|
|
95cb9b5079 | ||
|
|
c6684d3c9b | ||
|
|
5c5989d8c0 | ||
|
|
60e92d30b0 | ||
|
|
8bf8e3f86b | ||
|
|
891ee2d06b | ||
|
|
b450bc7ae8 | ||
|
|
4ca1e0d5db | ||
|
|
859213dd9e | ||
|
|
ad2857791d | ||
|
|
497827f2e2 | ||
|
|
967e333022 | ||
|
|
8df1406006 | ||
|
|
4af42fafdc | ||
|
|
a9e6a452c1 | ||
|
|
a4a4632397 | ||
|
|
421f39e414 | ||
|
|
f8121e2dc4 | ||
|
|
b1784fc51c | ||
|
|
96db0d7de7 | ||
|
|
3837ed9cb1 | ||
|
|
2be789a43c | ||
|
|
fd8d96169a | ||
|
|
1562dc32c1 | ||
|
|
38f377ca09 | ||
|
|
cc28bba884 | ||
|
|
beb3081918 | ||
|
|
1b3c9106b5 | ||
|
|
385b91761b | ||
|
|
d7b76ed70a | ||
|
|
43600756c0 | ||
|
|
3c3e0633ad | ||
|
|
f819ad6917 | ||
|
|
2e84faa505 | ||
|
|
e7e8d13d9e | ||
|
|
a683c2cb11 | ||
|
|
addf7de316 | ||
|
|
44d4eada51 | ||
|
|
40bfdea5b1 | ||
|
|
55138c1e86 | ||
|
|
e7ad396fc6 | ||
|
|
0aef680572 | ||
|
|
6dc37d6bde | ||
|
|
60ea7cedf6 | ||
|
|
c986b10e14 | ||
|
|
d52174bd9e | ||
|
|
c65d138911 | ||
|
|
ad9bb8ad58 | ||
|
|
63e536c66c | ||
|
|
b5a08b1b98 | ||
|
|
226e2a7cdc | ||
|
|
4d7c4aed4c | ||
|
|
c9bcd000c3 | ||
|
|
b1cb4d4257 | ||
|
|
de42145f30 | ||
|
|
7bcdd6070a | ||
|
|
8a215e90d0 | ||
|
|
b736fa18bb | ||
|
|
43c19e4942 | ||
|
|
ffc18029bb | ||
|
|
b88b3d15f8 | ||
|
|
c817886a2d | ||
|
|
aae239494e | ||
|
|
b0b2daa5d5 | ||
|
|
eea2e38f1b | ||
|
|
f894ecd25b | ||
|
|
e0b6ed7103 | ||
|
|
a78e75747a | ||
|
|
3b25e367bb | ||
|
|
08b29dff3d | ||
|
|
2f2e053d26 | ||
|
|
191d582c30 | ||
|
|
8d3380ff6e | ||
|
|
ba85d18574 | ||
|
|
0f53b17515 | ||
|
|
cb9c869712 | ||
|
|
aa3d9e7b8f | ||
|
|
b3a9b5824d | ||
|
|
b6186a349f | ||
|
|
100bd4b062 | ||
|
|
7da09d9b37 | ||
|
|
f46eb07228 | ||
|
|
7627b5eb25 | ||
|
|
c710448c6b | ||
|
|
1ad270b1d6 | ||
|
|
099e253b2b | ||
|
|
66de4a5b91 | ||
|
|
41437d91d5 | ||
|
|
d33d5a6efa | ||
|
|
4f9248d040 | ||
|
|
f40c0e41f3 | ||
|
|
15fcb0e25d | ||
|
|
2dae662333 | ||
|
|
3ad46926f1 | ||
|
|
2385d102ae | ||
|
|
deeb03ff2b | ||
|
|
5c2a09e243 | ||
|
|
2473c999db | ||
|
|
ea2cc265e3 | ||
|
|
a0cd2d42cf | ||
|
|
0a17ceb984 | ||
|
|
4ef18f1f4a | ||
|
|
0de227ab9c | ||
|
|
19cb8703a6 | ||
|
|
e18567dd82 | ||
|
|
bfb3bcdbfb | ||
|
|
565cd14d88 | ||
|
|
ebc37eac75 | ||
|
|
c3702db577 | ||
|
|
e15c4fa342 | ||
|
|
8330b9f1c5 | ||
|
|
f759150982 | ||
|
|
6af177b596 | ||
|
|
657bb94975 | ||
|
|
3c946212b1 | ||
|
|
b4e80f7fca | ||
|
|
c9efc2cb2b | ||
|
|
0d62e33dc7 | ||
|
|
ac88b9e19c | ||
|
|
871dfda79e | ||
|
|
e0c2c208ae | ||
|
|
22ac112bdb | ||
|
|
afd0cca176 | ||
|
|
c083c8bce5 | ||
|
|
63bde032b3 | ||
|
|
49492c0788 | ||
|
|
b439c64add | ||
|
|
1868bfe8e3 | ||
|
|
f240a3d996 | ||
|
|
788e5bd12e | ||
|
|
a55fed4502 | ||
|
|
a8fdaf1a47 | ||
|
|
4a758bd488 | ||
|
|
2c9731ec2a | ||
|
|
eef33266fc | ||
|
|
58d2c3e5a6 | ||
|
|
9e6a355db0 | ||
|
|
0d10e09fd6 | ||
|
|
f85bb995ba | ||
|
|
268e5639f6 | ||
|
|
51809df8ca | ||
|
|
94fb676b0c | ||
|
|
a47106594b | ||
|
|
d93d66f702 | ||
|
|
b2f9f7ae54 | ||
|
|
de7b908c78 | ||
|
|
75d3c2fdce | ||
|
|
ea1b6c5835 | ||
|
|
cb7887da41 | ||
|
|
a80313ee6b | ||
|
|
e1a821bc43 | ||
|
|
924ea2d03a | ||
|
|
55270fe654 | ||
|
|
a125fab57b | ||
|
|
395ee0aa99 | ||
|
|
0f50fa6ba1 | ||
|
|
adb7df3c71 | ||
|
|
5d7bcb629b | ||
|
|
a00f1417d2 | ||
|
|
8efd7e8ebf | ||
|
|
b016d277e0 | ||
|
|
fdb39617d1 | ||
|
|
89f83fbf62 | ||
|
|
ecee9e01a6 | ||
|
|
20dc9bb8b9 | ||
|
|
2c47d0e9ed | ||
|
|
8e13d52e51 | ||
|
|
cc40198c9e | ||
|
|
290897ea41 | ||
|
|
b9e1c84304 | ||
|
|
3c44c80e2e | ||
|
|
dffa4e4594 | ||
|
|
fa2d9fec58 | ||
|
|
09c1a2cfa0 | ||
|
|
d1f90eb231 | ||
|
|
1f7d97134b | ||
|
|
79be91784d | ||
|
|
de2654def3 | ||
|
|
56343dacff | ||
|
|
0e677f8ce7 | ||
|
|
aa911896d6 | ||
|
|
c62a8635b9 | ||
|
|
4e900247c5 | ||
|
|
b3bd62bc6c | ||
|
|
8e5fd48ecd | ||
|
|
b2bca9dd2c | ||
|
|
b8c0dc3181 | ||
|
|
cccdc5292e | ||
|
|
76d77a0e7a | ||
|
|
e737f4bf9a | ||
|
|
391db2f1c9 | ||
|
|
359d61183c | ||
|
|
46fd05d88e | ||
|
|
cde22a0945 | ||
|
|
111b7e25c5 | ||
|
|
4f8d8f0c8d | ||
|
|
915b0603d0 | ||
|
|
075aab8074 | ||
|
|
6ebe4c86af | ||
|
|
0925c8c582 | ||
|
|
a683fdce62 | ||
|
|
b958299446 | ||
|
|
3f80be8377 | ||
|
|
ced0accde5 | ||
|
|
b454ff5ec7 | ||
|
|
45af198f32 | ||
|
|
ff374f8899 | ||
|
|
faecb3bc4b | ||
|
|
6b893fadef | ||
|
|
c328467a41 | ||
|
|
182325470b | ||
|
|
f330ad71ac | ||
|
|
ba0c064f36 | ||
|
|
8d7aaee5b9 | ||
|
|
68cba2de63 | ||
|
|
5a914f9c0e | ||
|
|
b0e6805a20 | ||
|
|
21e7e44c01 | ||
|
|
f7df4abdae | ||
|
|
7674ceefe9 | ||
|
|
4be575c534 | ||
|
|
dd0f0a7d5a | ||
|
|
759b44c224 |
11
.github/workflows/validate-gradle-wrapper.yml
vendored
Normal file
11
.github/workflows/validate-gradle-wrapper.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
name: Validate Gradle Wrapper
|
||||
|
||||
on: [pull_request, push]
|
||||
|
||||
jobs:
|
||||
validation:
|
||||
name: Validation
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: gradle/wrapper-validation-action@v1
|
||||
@@ -5,7 +5,7 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.3.1'
|
||||
classpath 'com.android.tools.build:gradle:8.0.0'
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
}
|
||||
|
||||
@@ -17,3 +17,6 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
||||
android.useAndroidX=true
|
||||
# Automatically convert third-party libraries to use AndroidX
|
||||
android.enableJetifier=false
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.nonTransitiveRClass=true
|
||||
android.nonFinalResIds=false
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
7
gradle/wrapper/gradle-wrapper.properties
vendored
7
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,7 @@
|
||||
#Thu Jan 13 11:33:43 MSK 2022
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
distributionSha256Sum=e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
||||
networkTimeout=10000
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
288
gradlew
vendored
288
gradlew
vendored
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env sh
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright 2015 the original author or authors.
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -17,67 +17,98 @@
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
@@ -87,9 +118,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
@@ -98,7 +129,7 @@ Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
@@ -106,80 +137,109 @@ location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
case $i in
|
||||
0) set -- ;;
|
||||
1) set -- "$args0" ;;
|
||||
2) set -- "$args0" "$args1" ;;
|
||||
3) set -- "$args0" "$args1" "$args2" ;;
|
||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=`save "$@"`
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
if ! command -v xargs >/dev/null 2>&1
|
||||
then
|
||||
die "xargs is not available"
|
||||
fi
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
|
||||
11
gradlew.bat
vendored
11
gradlew.bat
vendored
@@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
@rem This is normally unused
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
@@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
@@ -2,6 +2,12 @@ plugins {
|
||||
id 'com.android.application'
|
||||
}
|
||||
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion = JavaLanguageVersion.of(17)
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdk 33
|
||||
defaultConfig {
|
||||
@@ -10,9 +16,9 @@ android {
|
||||
minSdk 23
|
||||
targetSdk 33
|
||||
versionCode 83
|
||||
versionName "1.2.0+fork.83"
|
||||
versionName "1.2.3+fork.83"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
resConfigs "ar-rSA", "ar-rDZ", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "da-rDK", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fa-rIR", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "ig-rNG", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "my-rMM", "nl-rNL", "no-rNO", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW"
|
||||
resourceConfigurations += ['ar-rSA', 'ar-rDZ', 'be-rBY', 'bn-rBD', 'bs-rBA', 'ca-rES', 'cs-rCZ', 'da-rDK', 'de-rDE', 'el-rGR', 'es-rES', 'eu-rES', 'fa-rIR', 'fi-rFI', 'fil-rPH', 'fr-rFR', 'ga-rIE', 'gd-rGB', 'gl-rES', 'hi-rIN', 'hr-rHR', 'hu-rHU', 'hy-rAM', 'ig-rNG', 'in-rID', 'is-rIS', 'it-rIT', 'iw-rIL', 'ja-rJP', 'kab', 'ko-rKR', 'my-rMM', 'nl-rNL', 'no-rNO', 'oc-rFR', 'pl-rPL', 'pt-rBR', 'pt-rPT', 'ro-rRO', 'ru-rRU', 'si-rLK', 'sl-rSI', 'sv-rSE', 'th-rTH', 'tr-rTR', 'uk-rUA', 'ur-rIN', 'vi-rVN', 'zh-rCN', 'zh-rTW']
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
@@ -49,14 +55,19 @@ android {
|
||||
setRoot "src/github"
|
||||
}
|
||||
}
|
||||
lintOptions{
|
||||
checkReleaseBuilds false
|
||||
namespace 'org.joinmastodon.android'
|
||||
lint {
|
||||
abortOnError false
|
||||
checkReleaseBuilds false
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
buildConfig true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api 'androidx.annotation:annotation:1.3.0'
|
||||
api 'androidx.annotation:annotation:1.6.0'
|
||||
implementation 'com.squareup.okhttp3:okhttp:3.14.9'
|
||||
implementation 'me.grishka.litex:recyclerview:1.2.1.1'
|
||||
implementation 'me.grishka.litex:swiperefreshlayout:1.1.0.1'
|
||||
@@ -65,7 +76,7 @@ dependencies {
|
||||
implementation 'me.grishka.litex:viewpager:1.0.0'
|
||||
implementation 'me.grishka.litex:viewpager2:1.0.0'
|
||||
implementation 'me.grishka.appkit:appkit:1.2.7'
|
||||
implementation 'com.google.code.gson:gson:2.8.9'
|
||||
implementation 'com.google.code.gson:gson:2.9.0'
|
||||
implementation 'org.jsoup:jsoup:1.14.3'
|
||||
implementation 'com.squareup:otto:1.3.8'
|
||||
implementation 'de.psdev:async-otto:1.0.3'
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.joinmastodon.android">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.joinmastodon.android">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||
@@ -39,6 +38,22 @@
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".PanicResponderActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleInstance"
|
||||
android:noHistory="true"
|
||||
android:theme="@android:style/Theme.NoDisplay">
|
||||
<intent-filter>
|
||||
<action android:name="info.guardianproject.panic.action.TRIGGER" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".ExitActivity"
|
||||
android:exported="false"
|
||||
android:theme="@android:style/Theme.NoDisplay" />
|
||||
<activity android:name=".OAuthActivity" android:exported="true" android:configChanges="orientation|screenSize" android:launchMode="singleTask">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
# lists.d Mastodon Blocklist (c) 2022 Greyhat Academy LICENSED UNDER: CC-BY-NC-SA 4.0
|
||||
# https://raw.githubusercontent.com/greyhat-academy/lists.d/main/mastodon.domains.block.list.tsv
|
||||
# This list contains domains of toxic mastodon instances
|
||||
# Last-Modified: 1672044500
|
||||
|
||||
# gab - a neonazi social network
|
||||
gab.ai
|
||||
gab.com
|
||||
gab.protohype.net
|
||||
|
||||
# consequence-free speech
|
||||
social.unzensiert.to
|
||||
freeatlantis.com
|
||||
|
||||
# reactionary bigotry and hatespeech against magrinalized groups
|
||||
poa.st
|
||||
freespeechextremist.com
|
||||
rdrama.cc
|
||||
outpoa.st
|
||||
anime.website
|
||||
gameliberty.club
|
||||
social.byoblu.com
|
||||
yggdrasil.social
|
||||
smuglo.li
|
||||
dogeposting.social
|
||||
unsafe.space
|
||||
freezepeach.xyz
|
||||
|
||||
# + CSAM
|
||||
rojogato.com
|
||||
|
||||
# antivaxxer shitposting & fearmongering
|
||||
shadowsocial.org
|
||||
|
||||
# Kiwifarms
|
||||
kiwifarms.net
|
||||
kiwifarms.cc
|
||||
kiwifarms.is
|
||||
kiwifarms.pleroma.net
|
||||
|
||||
|
||||
# https://mastodon.art/@Curator/109649354849593592
|
||||
|
||||
poa.st antisemitic racist homophobic
|
||||
nicecrew.digital antisemitic
|
||||
beefyboys.win antisemitic racist homophobic harassment
|
||||
cawfee.club antisemitic racist homophobic
|
||||
comfyboy.club antisemitic racist homophobic
|
||||
freespeechextremist.com racist homophobic
|
||||
cum.salon racist misogynist
|
||||
bae.st racist
|
||||
natehiggers.online racist
|
||||
rapemeat.solutions misogynist
|
||||
rapist.town misogynist
|
||||
rapefeminists.network misogynist
|
||||
kiwifarms.cc harassment
|
||||
noagendasocial.com noagenda
|
||||
posting.lolicon.rocks underage
|
||||
urchan.org harassment homophobic racist
|
||||
ryona.agency harassment
|
||||
yggdrasil.social antisemitic homophobic racist
|
||||
genderheretics.xyz transphobic
|
||||
baraag.net underage
|
||||
lolison.top underage
|
||||
shota.house underage
|
||||
shota.social underage
|
||||
aethy.com underage
|
||||
taullo.social underage
|
||||
childpawn.shop underage
|
||||
posting.lolicon.rocks underage
|
||||
loli.best underage
|
||||
gothloli.club underage
|
||||
smuglo.li underage
|
||||
youjo.love underage
|
||||
pedo.school underage
|
||||
lolison.network underage
|
||||
freak.university underage
|
||||
mirr0r.city underage
|
||||
xhais.love underage
|
||||
refusal.biz underage
|
||||
refusal.llc underage
|
||||
mirr0r.city underage
|
||||
nnia.space underage
|
||||
ignorelist.com malicious
|
||||
repl.co malicious
|
||||
|
||||
# custom
|
||||
|
||||
pawoo.net csam
|
||||
|
171
mastodon/src/main/assets/blocks.txt
Normal file
171
mastodon/src/main/assets/blocks.txt
Normal file
@@ -0,0 +1,171 @@
|
||||
13bells.com
|
||||
4aem.com
|
||||
aethy.com
|
||||
anime.website
|
||||
annihilation.social
|
||||
anon-kenkai.com
|
||||
asbestos.cafe
|
||||
bae.st
|
||||
bajax.us
|
||||
banepo.st
|
||||
baraag.net
|
||||
beefyboys.win
|
||||
beepboop.ga
|
||||
berserker.town
|
||||
bikeshed.party
|
||||
boks.moe
|
||||
brainsoap.net
|
||||
breastmilk.club
|
||||
brighteon.social
|
||||
cawfee.club
|
||||
clew.lol
|
||||
clubcyberia.co
|
||||
collapsitarian.io
|
||||
comfyboy.club
|
||||
contrapointsfan.club
|
||||
cum.camp
|
||||
cum.salon
|
||||
cybercriminal.eu
|
||||
darknight-coffee.org
|
||||
dembased.xyz
|
||||
desupost.soy
|
||||
detroitriotcity.com
|
||||
eatthebugs.social
|
||||
eientei.org
|
||||
elementality.org
|
||||
eveningzoo.club
|
||||
firedragonstudios.com
|
||||
firefaithfellowship.com
|
||||
fluf.club
|
||||
foxfam.club
|
||||
freak.university
|
||||
freeatlantis.com
|
||||
freecumextremist.com
|
||||
freedomstrike.org
|
||||
freesoftwareextremist.com
|
||||
freespeech.group
|
||||
freespeechextremist.com
|
||||
freetalklive.com
|
||||
froth.zone
|
||||
fulltermprivacy.com
|
||||
gameliberty.club
|
||||
gearlandia.haus
|
||||
genderheretics.xyz
|
||||
geofront.rocks
|
||||
gleasonator.com
|
||||
glee.li
|
||||
glindr.org
|
||||
goyim.app
|
||||
goyslop.cafe
|
||||
haeder.net
|
||||
handholding.io
|
||||
hidamari.apartments
|
||||
hitchhiker.social
|
||||
hunk.city
|
||||
iddqd.social
|
||||
intkos.link
|
||||
justicewarrior.social
|
||||
kawa-kun.com
|
||||
kitsunemimi.club
|
||||
kiwifarms.cc
|
||||
kompost.cz
|
||||
kurosawa.moe
|
||||
leafposter.club
|
||||
leftychan.net
|
||||
lewdieheaven.com
|
||||
liberdon.com
|
||||
ligma.pro
|
||||
lizards.live
|
||||
lolicon.rocks
|
||||
lolison.top
|
||||
lovingexpressions.net
|
||||
lucasvl.nl
|
||||
mahodou.moe
|
||||
makemysarcophagus.com
|
||||
maladaptive.art
|
||||
masochi.st
|
||||
mastinator.com
|
||||
merovingian.club
|
||||
midwaytrades.com
|
||||
mirr0r.city
|
||||
moa.st
|
||||
mouse.services
|
||||
mugicha.club
|
||||
narrativerry.xyz
|
||||
natehiggers.online
|
||||
neckbeard.xyz
|
||||
needs.vodka
|
||||
neenster.org
|
||||
nicecrew.digital
|
||||
nnia.space
|
||||
noagendasocial.com
|
||||
noagendasocial.nl
|
||||
noagendatube.com
|
||||
nobodyhasthe.biz
|
||||
nukem.biz
|
||||
obo.sh
|
||||
onionfarms.org
|
||||
outpoa.st
|
||||
pawlicker.com
|
||||
pawoo.net
|
||||
pedo.school
|
||||
piazza.today
|
||||
pibvt.net
|
||||
pieville.net
|
||||
pisskey.io
|
||||
plagu.ee
|
||||
pmth.us
|
||||
poa.st
|
||||
poast.org
|
||||
poast.tv
|
||||
poster.place
|
||||
prospeech.space
|
||||
quodverum.com
|
||||
rakket.app
|
||||
rapemeat.solutions
|
||||
rdrama.cc
|
||||
rebelbase.site
|
||||
retardedniggers.forsale
|
||||
rojogato.com
|
||||
ryona.agency
|
||||
schwartzwelt.xyz
|
||||
seal.cafe
|
||||
shigusegubu.club
|
||||
shitpost.cloud
|
||||
shitposter.club
|
||||
shota.house
|
||||
silliness.observer
|
||||
skinheads.eu
|
||||
skinheads.io
|
||||
skinheads.social
|
||||
skinheads.uk
|
||||
skippers-bin.com
|
||||
skyshanty.xyz
|
||||
slash.cl
|
||||
sleepy.cafe
|
||||
smuglo.li
|
||||
sneed.social
|
||||
sonichu.com
|
||||
spinster.xyz
|
||||
springbo.cc
|
||||
starnix.network
|
||||
stereophonic.space
|
||||
strelizia.net
|
||||
syspxl.xyz
|
||||
tastingtraffic.net
|
||||
teci.world
|
||||
theapex.social
|
||||
thepostearthdestination.com
|
||||
tkammer.de
|
||||
trumpislovetrumpis.life
|
||||
truthsocial.co.in
|
||||
urchan.org
|
||||
varishangout.net
|
||||
whinge.house
|
||||
whinge.town
|
||||
wideboys.org
|
||||
wolfgirl.bar
|
||||
xn--p1abe3d.xn--80asehdb
|
||||
yggdrasil.social
|
||||
youjo.love
|
||||
zztails.gay
|
||||
@@ -0,0 +1,24 @@
|
||||
package org.joinmastodon.android;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
public class ExitActivity extends Activity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
finishAndRemoveTask();
|
||||
}
|
||||
|
||||
public static void exit(Context context) {
|
||||
Intent intent = new Intent(context, ExitActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import android.content.SharedPreferences;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import org.joinmastodon.android.model.ContentType;
|
||||
import org.joinmastodon.android.model.TimelineDefinition;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
@@ -53,10 +54,13 @@ public class GlobalUserPreferences{
|
||||
|
||||
private final static Type recentLanguagesType = new TypeToken<Map<String, List<String>>>() {}.getType();
|
||||
private final static Type pinnedTimelinesType = new TypeToken<Map<String, List<TimelineDefinition>>>() {}.getType();
|
||||
private final static Type accountsDefaultContentTypesType = new TypeToken<Map<String, ContentType>>() {}.getType();
|
||||
public static Map<String, List<String>> recentLanguages;
|
||||
public static Map<String, List<TimelineDefinition>> pinnedTimelines;
|
||||
public static Set<String> accountsWithLocalOnlySupport;
|
||||
public static Set<String> accountsInGlitchMode;
|
||||
public static Set<String> accountsWithContentTypesEnabled;
|
||||
public static Map<String, ContentType> accountsDefaultContentTypes;
|
||||
|
||||
/**
|
||||
* Pleroma
|
||||
@@ -111,6 +115,8 @@ public class GlobalUserPreferences{
|
||||
accountsWithLocalOnlySupport=prefs.getStringSet("accountsWithLocalOnlySupport", new HashSet<>());
|
||||
accountsInGlitchMode=prefs.getStringSet("accountsInGlitchMode", new HashSet<>());
|
||||
replyVisibility=prefs.getString("replyVisibility", null);
|
||||
accountsWithContentTypesEnabled=prefs.getStringSet("accountsWithContentTypesEnabled", new HashSet<>());
|
||||
accountsDefaultContentTypes=fromJson(prefs.getString("accountsDefaultContentTypes", null), accountsDefaultContentTypesType, new HashMap<>());
|
||||
|
||||
try {
|
||||
color=ColorPreference.valueOf(prefs.getString("color", ColorPreference.PINK.name()));
|
||||
@@ -158,6 +164,8 @@ public class GlobalUserPreferences{
|
||||
.putStringSet("accountsWithLocalOnlySupport", accountsWithLocalOnlySupport)
|
||||
.putStringSet("accountsInGlitchMode", accountsInGlitchMode)
|
||||
.putString("replyVisibility", replyVisibility)
|
||||
.putStringSet("accountsWithContentTypesEnabled", accountsWithContentTypesEnabled)
|
||||
.putString("accountsDefaultContentTypes", gson.toJson(accountsDefaultContentTypes))
|
||||
.apply();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
package org.joinmastodon.android;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.joinmastodon.android.api.requests.oauth.RevokeOauthToken;
|
||||
import org.joinmastodon.android.api.session.AccountSession;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
|
||||
import me.grishka.appkit.api.Callback;
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
|
||||
|
||||
public class PanicResponderActivity extends Activity {
|
||||
public static final String PANIC_TRIGGER_ACTION = "info.guardianproject.panic.action.TRIGGER";
|
||||
|
||||
@Override
|
||||
protected void onCreate(final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
final Intent intent = getIntent();
|
||||
if (intent != null && PANIC_TRIGGER_ACTION.equals(intent.getAction())) {
|
||||
AccountSessionManager.getInstance().getLoggedInAccounts().forEach(accountSession -> logOut(accountSession.getID()));
|
||||
ExitActivity.exit(this);
|
||||
}
|
||||
finishAndRemoveTask();
|
||||
}
|
||||
|
||||
private void logOut(String accountID){
|
||||
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
|
||||
new RevokeOauthToken(session.app.clientId, session.app.clientSecret, session.token.accessToken)
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(Object result){
|
||||
onLoggedOut(accountID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error){
|
||||
onLoggedOut(accountID);
|
||||
}
|
||||
})
|
||||
.exec(accountID);
|
||||
}
|
||||
|
||||
private void onLoggedOut(String accountID){
|
||||
AccountSessionManager.getInstance().removeAccount(accountID);
|
||||
}
|
||||
}
|
||||
@@ -74,10 +74,8 @@ public class CacheController{
|
||||
int flags=cursor.getInt(1);
|
||||
status.hasGapAfter=((flags & POST_FLAG_GAP_AFTER)!=0);
|
||||
newMaxID=status.id;
|
||||
for(Filter filter:filters){
|
||||
if(filter.matches(status))
|
||||
if (!new StatusFilterPredicate(filters, Filter.FilterContext.HOME).test(status))
|
||||
continue outer;
|
||||
}
|
||||
result.add(status);
|
||||
}while(cursor.moveToNext());
|
||||
String _newMaxID=newMaxID;
|
||||
@@ -92,7 +90,7 @@ public class CacheController{
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(List<Status> result){
|
||||
callback.onSuccess(new CacheablePaginatedResponse<>(result.stream().filter(new StatusFilterPredicate(filters)).collect(Collectors.toList()), result.isEmpty() ? null : result.get(result.size()-1).id, false));
|
||||
callback.onSuccess(new CacheablePaginatedResponse<>(result.stream().filter(new StatusFilterPredicate(filters, Filter.FilterContext.HOME)).collect(Collectors.toList()), result.isEmpty() ? null : result.get(result.size()-1).id, false));
|
||||
putHomeTimeline(result, maxID==null);
|
||||
}
|
||||
|
||||
@@ -148,11 +146,9 @@ public class CacheController{
|
||||
ntf.postprocess();
|
||||
newMaxID=ntf.id;
|
||||
if(ntf.status!=null){
|
||||
for(Filter filter:filters){
|
||||
if(filter.matches(ntf.status))
|
||||
if (!new StatusFilterPredicate(filters, Filter.FilterContext.NOTIFICATIONS).test(ntf.status))
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
result.add(ntf);
|
||||
}while(cursor.moveToNext());
|
||||
String _newMaxID=newMaxID;
|
||||
@@ -170,11 +166,7 @@ public class CacheController{
|
||||
public void onSuccess(List<Notification> result){
|
||||
callback.onSuccess(new CacheablePaginatedResponse<>(result.stream().filter(ntf->{
|
||||
if(ntf.status!=null){
|
||||
for(Filter filter:filters){
|
||||
if(filter.matches(ntf.status)){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return new StatusFilterPredicate(filters, Filter.FilterContext.NOTIFICATIONS).test(ntf.status);
|
||||
}
|
||||
return true;
|
||||
}).collect(Collectors.toList()), result.isEmpty() ? null : result.get(result.size()-1).id, false));
|
||||
|
||||
@@ -28,6 +28,7 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -51,7 +52,9 @@ public class MastodonAPIController{
|
||||
.registerTypeAdapter(Status.class, new Status.StatusDeserializer())
|
||||
.create();
|
||||
private static WorkerThread thread=new WorkerThread("MastodonAPIController");
|
||||
private static OkHttpClient httpClient=new OkHttpClient.Builder().build();
|
||||
private static OkHttpClient httpClient=new OkHttpClient.Builder()
|
||||
.readTimeout(5, TimeUnit.MINUTES)
|
||||
.build();
|
||||
|
||||
private AccountSession session;
|
||||
private static List<String> badDomains = new ArrayList<>();
|
||||
@@ -60,7 +63,7 @@ public class MastodonAPIController{
|
||||
thread.start();
|
||||
try {
|
||||
final BufferedReader reader = new BufferedReader(new InputStreamReader(
|
||||
MastodonApp.context.getAssets().open("blocks.tsv")
|
||||
MastodonApp.context.getAssets().open("blocks.txt")
|
||||
));
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
@@ -91,7 +94,7 @@ public class MastodonAPIController{
|
||||
Request.Builder builder=new Request.Builder()
|
||||
.url(req.getURL().toString())
|
||||
.method(req.getMethod(), req.getRequestBody())
|
||||
.header("User-Agent", "MastodonAndroid/"+BuildConfig.VERSION_NAME);
|
||||
.header("User-Agent", "MegalodonAndroid/"+BuildConfig.VERSION_NAME);
|
||||
|
||||
String token=null;
|
||||
if(session!=null)
|
||||
|
||||
@@ -5,8 +5,6 @@ import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
|
||||
public class MastodonErrorResponse extends ErrorResponse{
|
||||
@@ -22,7 +20,7 @@ public class MastodonErrorResponse extends ErrorResponse{
|
||||
|
||||
@Override
|
||||
public void bindErrorView(View view){
|
||||
TextView text=view.findViewById(R.id.error_text);
|
||||
TextView text=view.findViewById(me.grishka.appkit.R.id.error_text);
|
||||
text.setText(error);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.joinmastodon.android.api.requests.statuses;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.ContentType;
|
||||
import org.joinmastodon.android.model.ScheduledStatus;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.model.StatusPrivacy;
|
||||
@@ -46,6 +47,7 @@ public class CreateStatus extends MastodonAPIRequest<Status>{
|
||||
public String language;
|
||||
|
||||
public String quoteId;
|
||||
public ContentType contentType;
|
||||
|
||||
public static class Poll{
|
||||
public ArrayList<String> options=new ArrayList<>();
|
||||
|
||||
@@ -2,17 +2,22 @@ package org.joinmastodon.android.api.requests.statuses;
|
||||
|
||||
import org.joinmastodon.android.api.AllFieldsAreRequired;
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.api.RequiredField;
|
||||
import org.joinmastodon.android.model.BaseModel;
|
||||
import org.joinmastodon.android.model.ContentType;
|
||||
|
||||
public class GetStatusSourceText extends MastodonAPIRequest<GetStatusSourceText.Response>{
|
||||
public GetStatusSourceText(String id){
|
||||
super(HttpMethod.GET, "/statuses/"+id+"/source", Response.class);
|
||||
}
|
||||
|
||||
@AllFieldsAreRequired
|
||||
public static class Response extends BaseModel{
|
||||
@RequiredField
|
||||
public String id;
|
||||
@RequiredField
|
||||
public String text;
|
||||
@RequiredField
|
||||
public String spoilerText;
|
||||
public ContentType contentType;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,10 +3,6 @@ package org.joinmastodon.android.fragments;
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.animation.TranslateAnimation;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.accounts.GetAccountStatuses;
|
||||
@@ -64,7 +60,12 @@ public class AccountTimelineFragment extends StatusListFragment{
|
||||
@Override
|
||||
public void onSuccess(List<Status> result){
|
||||
if(getActivity()==null) return;
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, Filter.FilterContext.ACCOUNT)).collect(Collectors.toList());
|
||||
AccountSessionManager asm = AccountSessionManager.getInstance();
|
||||
result=result.stream().filter(status -> {
|
||||
// don't hide own posts in own profile
|
||||
if (asm.isSelf(accountID, user) && asm.isSelf(accountID, status.account)) return true;
|
||||
else return new StatusFilterPredicate(accountID, getFilterContext()).test(status);
|
||||
}).collect(Collectors.toList());
|
||||
onDataLoaded(result, !result.isEmpty());
|
||||
}
|
||||
})
|
||||
@@ -122,4 +123,10 @@ public class AccountTimelineFragment extends StatusListFragment{
|
||||
protected void onRemoveAccountPostsEvent(RemoveAccountPostsEvent ev){
|
||||
// no-op
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.ACCOUNT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,6 @@ import org.joinmastodon.android.ui.photoviewer.PhotoViewer;
|
||||
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
|
||||
import org.joinmastodon.android.ui.utils.MediaAttachmentViewController;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.ui.views.MediaGridLayout;
|
||||
import org.joinmastodon.android.utils.TypedObjectPool;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -69,7 +68,7 @@ import me.grishka.appkit.utils.BindableViewHolder;
|
||||
import me.grishka.appkit.utils.V;
|
||||
import me.grishka.appkit.views.UsableRecyclerView;
|
||||
|
||||
public abstract class BaseStatusListFragment<T extends DisplayItemsParent> extends RecyclerFragment<T> implements PhotoViewerHost, ScrollableToTop{
|
||||
public abstract class BaseStatusListFragment<T extends DisplayItemsParent> extends RecyclerFragment<T> implements PhotoViewerHost, ScrollableToTop, HasFab{
|
||||
protected ArrayList<StatusDisplayItem> displayItems=new ArrayList<>();
|
||||
protected DisplayItemsAdapter adapter;
|
||||
protected String accountID;
|
||||
@@ -83,10 +82,10 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
|
||||
public BaseStatusListFragment(){
|
||||
super(20);
|
||||
if (withComposeButton()) setListLayoutId(R.layout.recycler_fragment_with_fab);
|
||||
if (wantsComposeButton()) setListLayoutId(R.layout.recycler_fragment_with_fab);
|
||||
}
|
||||
|
||||
protected boolean withComposeButton() {
|
||||
protected boolean wantsComposeButton() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -102,8 +101,6 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
setRetainInstance(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected RecyclerView.Adapter getAdapter(){
|
||||
return adapter=new DisplayItemsAdapter();
|
||||
@@ -272,17 +269,29 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
fab=view.findViewById(R.id.fab);
|
||||
list.addOnScrollListener(new RecyclerView.OnScrollListener(){
|
||||
@Override
|
||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){
|
||||
if(currentPhotoViewer!=null)
|
||||
currentPhotoViewer.offsetView(-dx, -dy);
|
||||
public @Nullable View getFab() {
|
||||
if (getParentFragment() instanceof HasFab l) return l.getFab();
|
||||
else return fab;
|
||||
}
|
||||
|
||||
if (fab!=null && GlobalUserPreferences.autoHideFab) {
|
||||
if (dy > 0 && fab.getVisibility() == View.VISIBLE) {
|
||||
@Override
|
||||
public void showFab() {
|
||||
View fab = getFab();
|
||||
if (fab == null || fab.getVisibility() == View.VISIBLE) return;
|
||||
fab.setVisibility(View.VISIBLE);
|
||||
TranslateAnimation animate = new TranslateAnimation(
|
||||
0,
|
||||
0,
|
||||
fab.getHeight() * 2,
|
||||
0);
|
||||
animate.setDuration(300);
|
||||
fab.startAnimation(animate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideFab() {
|
||||
View fab = getFab();
|
||||
if (fab == null || fab.getVisibility() != View.VISIBLE) return;
|
||||
TranslateAnimation animate = new TranslateAnimation(
|
||||
0,
|
||||
0,
|
||||
@@ -292,16 +301,26 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
fab.startAnimation(animate);
|
||||
fab.setVisibility(View.INVISIBLE);
|
||||
scrollDiff = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
fab=view.findViewById(R.id.fab);
|
||||
|
||||
list.addOnScrollListener(new RecyclerView.OnScrollListener(){
|
||||
@Override
|
||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){
|
||||
if(currentPhotoViewer!=null)
|
||||
currentPhotoViewer.offsetView(-dx, -dy);
|
||||
|
||||
View fab = getFab();
|
||||
if (fab!=null && GlobalUserPreferences.autoHideFab) {
|
||||
if (dy > 0 && fab.getVisibility() == View.VISIBLE) {
|
||||
hideFab();
|
||||
} else if (dy < 0 && fab.getVisibility() != View.VISIBLE) {
|
||||
if (list.getChildAt(0).getTop() == 0 || scrollDiff > 400) {
|
||||
fab.setVisibility(View.VISIBLE);
|
||||
TranslateAnimation animate = new TranslateAnimation(
|
||||
0,
|
||||
0,
|
||||
fab.getHeight() * 2,
|
||||
0);
|
||||
animate.setDuration(300);
|
||||
fab.startAnimation(animate);
|
||||
showFab();
|
||||
scrollDiff = 0;
|
||||
} else {
|
||||
scrollDiff += Math.abs(dy);
|
||||
@@ -344,10 +363,12 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
((UsableRecyclerView) list).setIncludeMarginsInItemHitbox(true);
|
||||
updateToolbar();
|
||||
|
||||
if (withComposeButton()) {
|
||||
if (wantsComposeButton() && !getArguments().getBoolean("__disable_fab", false)) {
|
||||
fab.setVisibility(View.VISIBLE);
|
||||
fab.setOnClickListener(this::onFabClick);
|
||||
fab.setOnLongClickListener(this::onFabLongClick);
|
||||
} else if (fab != null) {
|
||||
fab.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -656,13 +677,13 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
currentPhotoViewer.onPause();
|
||||
}
|
||||
|
||||
protected void onFabClick(View v){
|
||||
public void onFabClick(View v){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
Nav.go(getActivity(), ComposeFragment.class, args);
|
||||
}
|
||||
|
||||
protected boolean onFabLongClick(View v) {
|
||||
public boolean onFabLongClick(View v) {
|
||||
return UiUtils.pickAccountForCompose(getActivity(), accountID);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.app.Activity;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.statuses.GetBookmarkedStatuses;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.HeaderPaginationList;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
|
||||
@@ -35,4 +36,9 @@ public class BookmarkedStatusListFragment extends StatusListFragment{
|
||||
})
|
||||
.exec(accountID);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.ACCOUNT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,6 +91,7 @@ import org.joinmastodon.android.events.StatusCreatedEvent;
|
||||
import org.joinmastodon.android.events.StatusUpdatedEvent;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.Attachment;
|
||||
import org.joinmastodon.android.model.ContentType;
|
||||
import org.joinmastodon.android.model.Emoji;
|
||||
import org.joinmastodon.android.model.EmojiCategory;
|
||||
import org.joinmastodon.android.model.Instance;
|
||||
@@ -179,8 +180,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
private int charCount, charLimit, trimmedCharCount;
|
||||
|
||||
private Button publishButton, languageButton, scheduleTimeBtn, draftsBtn;
|
||||
private PopupMenu languagePopup, visibilityPopup, draftOptionsPopup;
|
||||
private ImageButton mediaBtn, pollBtn, emojiBtn, spoilerBtn, visibilityBtn, scheduleDraftDismiss;
|
||||
private PopupMenu languagePopup, contentTypePopup, visibilityPopup, draftOptionsPopup;
|
||||
private ImageButton mediaBtn, pollBtn, emojiBtn, spoilerBtn, visibilityBtn, scheduleDraftDismiss, contentTypeBtn;
|
||||
private ImageView sensitiveIcon;
|
||||
private ComposeMediaLayout attachmentsView;
|
||||
private TextView replyText;
|
||||
@@ -234,6 +235,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
private Runnable updateUploadEtaRunnable;
|
||||
|
||||
private String language, encoding;
|
||||
private ContentType contentType;
|
||||
private MastodonLanguage.LanguageResolver languageResolver;
|
||||
|
||||
@Override
|
||||
@@ -242,6 +244,12 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
setRetainInstance(true);
|
||||
|
||||
accountID=getArguments().getString("account");
|
||||
contentType = GlobalUserPreferences.accountsDefaultContentTypes.get(accountID);
|
||||
if (contentType == null && GlobalUserPreferences.accountsWithContentTypesEnabled.contains(accountID)) {
|
||||
// if formatting is enabled, use plain to avoid confusing unspecified default setting
|
||||
contentType = ContentType.PLAIN;
|
||||
}
|
||||
|
||||
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
|
||||
self=session.self;
|
||||
instanceDomain=session.domain;
|
||||
@@ -330,6 +338,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
emojiBtn=view.findViewById(R.id.btn_emoji);
|
||||
spoilerBtn=view.findViewById(R.id.btn_spoiler);
|
||||
visibilityBtn=view.findViewById(R.id.btn_visibility);
|
||||
contentTypeBtn=view.findViewById(R.id.btn_content_type);
|
||||
scheduleDraftView=view.findViewById(R.id.schedule_draft_view);
|
||||
scheduleDraftText=view.findViewById(R.id.schedule_draft_text);
|
||||
scheduleDraftDismiss=view.findViewById(R.id.schedule_draft_dismiss);
|
||||
@@ -364,6 +373,10 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
visibilityBtn.setOnClickListener(v->visibilityPopup.show());
|
||||
visibilityBtn.setOnTouchListener(visibilityPopup.getDragToOpenListener());
|
||||
|
||||
buildContentTypePopup(contentTypeBtn);
|
||||
contentTypeBtn.setOnClickListener(v->contentTypePopup.show());
|
||||
contentTypeBtn.setOnTouchListener(contentTypePopup.getDragToOpenListener());
|
||||
|
||||
scheduleDraftDismiss.setOnClickListener(v->updateScheduledAt(null));
|
||||
scheduleTimeBtn.setOnClickListener(v->pickScheduledDateTime());
|
||||
|
||||
@@ -466,7 +479,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
}
|
||||
}
|
||||
|
||||
if(editingStatus!=null && editingStatus.visibility!=null) {
|
||||
if (savedInstanceState != null) {
|
||||
statusVisibility = (StatusPrivacy) savedInstanceState.getSerializable("visibility");
|
||||
} else if (editingStatus != null && editingStatus.visibility != null) {
|
||||
statusVisibility = editingStatus.visibility;
|
||||
} else {
|
||||
loadDefaultStatusVisibility(savedInstanceState);
|
||||
@@ -482,6 +497,20 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
}).setChecked(true);
|
||||
visibilityPopup.getMenu().findItem(R.id.local_only).setChecked(localOnly);
|
||||
|
||||
|
||||
if (savedInstanceState != null && savedInstanceState.containsKey("contentType")) {
|
||||
contentType = (ContentType) savedInstanceState.getSerializable("contentType");
|
||||
} else if (getArguments().containsKey("sourceContentType")) {
|
||||
try {
|
||||
String val = getArguments().getString("sourceContentType");
|
||||
contentType = val == null ? null : ContentType.valueOf(val);
|
||||
} catch (IllegalArgumentException ignored) {}
|
||||
}
|
||||
|
||||
int contentTypeId = ContentType.getContentTypeRes(contentType);
|
||||
contentTypePopup.getMenu().findItem(contentTypeId).setChecked(true);
|
||||
contentTypeBtn.setSelected(contentTypeId != R.id.content_type_null && contentTypeId != R.id.content_type_plain);
|
||||
|
||||
autocompleteViewController=new ComposeAutocompleteViewController(getActivity(), accountID);
|
||||
autocompleteViewController.setCompletionSelectedListener(this::onAutocompleteOptionSelected);
|
||||
View autocompleteView=autocompleteViewController.getView();
|
||||
@@ -518,6 +547,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
outState.putParcelableArrayList("attachments", serializedAttachments);
|
||||
}
|
||||
outState.putSerializable("visibility", statusVisibility);
|
||||
outState.putSerializable("contentType", contentType);
|
||||
if (scheduledAt != null) outState.putSerializable("scheduledAt", scheduledAt);
|
||||
if (scheduledStatus != null) outState.putParcelable("scheduledStatus", Parcels.wrap(scheduledStatus));
|
||||
}
|
||||
@@ -907,6 +937,17 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
});
|
||||
}
|
||||
|
||||
private int getContentTypeName(String id) {
|
||||
return switch (id) {
|
||||
case "text/plain" -> R.string.sk_content_type_plain;
|
||||
case "text/html" -> R.string.sk_content_type_html;
|
||||
case "text/markdown" -> R.string.sk_content_type_markdown;
|
||||
case "text/bbcode" -> R.string.sk_content_type_bbcode;
|
||||
case "text/x.misskeymarkdown" -> R.string.sk_content_type_mfm;
|
||||
default -> throw new IllegalArgumentException("Invalid content type");
|
||||
};
|
||||
}
|
||||
|
||||
private void addBottomLanguage(Menu menu) {
|
||||
if (menu.findItem(allLanguages.size()) == null) {
|
||||
menu.add(0, allLanguages.size(), Menu.NONE, "bottom (\uD83E\uDD7A\uD83D\uDC49\uD83D\uDC48)");
|
||||
@@ -1053,6 +1094,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
req.visibility=localOnly && instance.pleroma != null ? StatusPrivacy.LOCAL : statusVisibility;
|
||||
req.sensitive=sensitive;
|
||||
req.language=language;
|
||||
req.contentType=contentType;
|
||||
req.scheduledAt = scheduledAt;
|
||||
if(!attachments.isEmpty()){
|
||||
req.mediaIds=attachments.stream().map(a->a.serverAttachment.id).collect(Collectors.toList());
|
||||
@@ -1547,6 +1589,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
if(att.isUploadingOrProcessing())
|
||||
att.cancelUpload();
|
||||
attachments.remove(att);
|
||||
if(!areThereAnyUploadingAttachments())
|
||||
uploadNextQueuedAttachment();
|
||||
attachmentsView.removeView(att.view);
|
||||
if(getMediaAttachmentsCount()==0)
|
||||
@@ -1894,14 +1937,36 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
});
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
private void buildContentTypePopup(View btn) {
|
||||
contentTypePopup=new PopupMenu(getActivity(), btn);
|
||||
contentTypePopup.inflate(R.menu.compose_content_type);
|
||||
Menu m = contentTypePopup.getMenu();
|
||||
ContentType.adaptMenuToInstance(m, instance);
|
||||
if (contentType != null) m.findItem(R.id.content_type_null).setVisible(false);
|
||||
|
||||
contentTypePopup.setOnMenuItemClickListener(i->{
|
||||
int id=i.getItemId();
|
||||
if (id == R.id.content_type_null) contentType = null;
|
||||
else if (id == R.id.content_type_plain) contentType = ContentType.PLAIN;
|
||||
else if (id == R.id.content_type_html) contentType = ContentType.HTML;
|
||||
else if (id == R.id.content_type_markdown) contentType = ContentType.MARKDOWN;
|
||||
else if (id == R.id.content_type_bbcode) contentType = ContentType.BBCODE;
|
||||
else if (id == R.id.content_type_misskey_markdown) contentType = ContentType.MISSKEY_MARKDOWN;
|
||||
else return false;
|
||||
btn.setSelected(id != R.id.content_type_null && id != R.id.content_type_plain);
|
||||
i.setChecked(true);
|
||||
return true;
|
||||
});
|
||||
|
||||
if (!GlobalUserPreferences.accountsWithContentTypesEnabled.contains(accountID)) {
|
||||
btn.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
private void loadDefaultStatusVisibility(Bundle savedInstanceState) {
|
||||
if(replyTo != null) statusVisibility = replyTo.visibility;
|
||||
|
||||
// A saved privacy setting from a previous compose session wins over the reply visibility
|
||||
if(savedInstanceState !=null){
|
||||
statusVisibility = (StatusPrivacy) savedInstanceState.getSerializable("visibility");
|
||||
}
|
||||
|
||||
AccountSessionManager asm = AccountSessionManager.getInstance();
|
||||
Preferences prefs = asm.getAccount(accountID).preferences;
|
||||
if (prefs != null) {
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.app.Activity;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.statuses.GetFavoritedStatuses;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.HeaderPaginationList;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
|
||||
@@ -35,4 +36,9 @@ public class FavoritedStatusListFragment extends StatusListFragment{
|
||||
})
|
||||
.exec(accountID);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.ACCOUNT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
public interface HasFab {
|
||||
View getFab();
|
||||
void showFab();
|
||||
void hideFab();
|
||||
}
|
||||
@@ -39,7 +39,7 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
|
||||
private MenuItem followButton;
|
||||
|
||||
@Override
|
||||
protected boolean withComposeButton() {
|
||||
protected boolean wantsComposeButton() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
|
||||
@Override
|
||||
public void onSuccess(List<Status> result){
|
||||
if (getActivity() == null) return;
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, Filter.FilterContext.PUBLIC)).collect(Collectors.toList());
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, getFilterContext())).collect(Collectors.toList());
|
||||
onDataLoaded(result, !result.isEmpty());
|
||||
}
|
||||
})
|
||||
@@ -138,12 +138,12 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onFabLongClick(View v) {
|
||||
public boolean onFabLongClick(View v) {
|
||||
return UiUtils.pickAccountForCompose(getActivity(), accountID, '#'+hashtag+' ');
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFabClick(View v){
|
||||
public void onFabClick(View v){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putString("prefilledText", '#'+hashtag+' ');
|
||||
@@ -154,4 +154,9 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
|
||||
protected void onSetFabBottomInset(int inset){
|
||||
((ViewGroup.MarginLayoutParams) fab.getLayoutParams()).bottomMargin=V.dp(24)+inset;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.PUBLIC;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +104,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
content.setOrientation(LinearLayout.VERTICAL);
|
||||
|
||||
FrameLayout fragmentContainer=new FrameLayout(getActivity());
|
||||
fragmentContainer.setId(R.id.fragment_wrap);
|
||||
fragmentContainer.setId(me.grishka.appkit.R.id.fragment_wrap);
|
||||
content.addView(fragmentContainer, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f));
|
||||
|
||||
inflater.inflate(R.layout.tab_bar, content);
|
||||
@@ -128,10 +128,10 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
|
||||
if(savedInstanceState==null){
|
||||
getChildFragmentManager().beginTransaction()
|
||||
.add(R.id.fragment_wrap, homeTabFragment)
|
||||
.add(R.id.fragment_wrap, searchFragment).hide(searchFragment)
|
||||
.add(R.id.fragment_wrap, notificationsFragment).hide(notificationsFragment)
|
||||
.add(R.id.fragment_wrap, profileFragment).hide(profileFragment)
|
||||
.add(me.grishka.appkit.R.id.fragment_wrap, homeTabFragment)
|
||||
.add(me.grishka.appkit.R.id.fragment_wrap, searchFragment).hide(searchFragment)
|
||||
.add(me.grishka.appkit.R.id.fragment_wrap, notificationsFragment).hide(notificationsFragment)
|
||||
.add(me.grishka.appkit.R.id.fragment_wrap, profileFragment).hide(profileFragment)
|
||||
.commit();
|
||||
|
||||
String defaultTab=getArguments().getString("tab");
|
||||
@@ -160,6 +160,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
notificationsFragment=(NotificationsFragment) getChildFragmentManager().getFragment(savedInstanceState, "notificationsFragment");
|
||||
profileFragment=(ProfileFragment) getChildFragmentManager().getFragment(savedInstanceState, "profileFragment");
|
||||
currentTab=savedInstanceState.getInt("selectedTab");
|
||||
tabBar.selectTab(currentTab);
|
||||
Fragment current=fragmentForTab(currentTab);
|
||||
getChildFragmentManager().beginTransaction()
|
||||
.hide(homeTabFragment)
|
||||
@@ -227,6 +228,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
}
|
||||
getChildFragmentManager().beginTransaction().hide(fragmentForTab(currentTab)).show(newFragment).commit();
|
||||
maybeTriggerLoading(newFragment);
|
||||
if (newFragment instanceof HasFab fabulous) fabulous.showFab();
|
||||
currentTab=tab;
|
||||
((FragmentStackActivity)getActivity()).invalidateSystemBarColors(this);
|
||||
}
|
||||
@@ -291,7 +293,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
Instance instance = AccountSessionManager.getInstance().getInstanceInfo(session.domain);
|
||||
if (instance == null) return;
|
||||
|
||||
new GetNotifications(null, 1, EnumSet.allOf(Notification.Type.class), instance.pleroma != null)
|
||||
new GetNotifications(null, 1, EnumSet.allOf(Notification.Type.class), instance != null && instance.pleroma != null)
|
||||
.setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(List<Notification> notifications) {
|
||||
|
||||
@@ -24,6 +24,7 @@ import android.view.ViewParent;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.Button;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.PopupMenu;
|
||||
import android.widget.TextView;
|
||||
@@ -70,7 +71,7 @@ import me.grishka.appkit.fragments.OnBackPressedListener;
|
||||
import me.grishka.appkit.utils.CubicBezierInterpolator;
|
||||
import me.grishka.appkit.utils.V;
|
||||
|
||||
public class HomeTabFragment extends MastodonToolbarFragment implements ScrollableToTop, OnBackPressedListener {
|
||||
public class HomeTabFragment extends MastodonToolbarFragment implements ScrollableToTop, OnBackPressedListener, HasFab {
|
||||
private static final int ANNOUNCEMENTS_RESULT = 654;
|
||||
|
||||
private String accountID;
|
||||
@@ -98,6 +99,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
|
||||
private PopupMenu overflowPopup;
|
||||
private View overflowActionView = null;
|
||||
private boolean announcementsBadged, settingsBadged;
|
||||
private ImageButton fab;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
@@ -122,6 +124,10 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
|
||||
@Override
|
||||
public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
|
||||
FrameLayout view = new FrameLayout(getContext());
|
||||
inflater.inflate(R.layout.compose_fab, view);
|
||||
fab = view.findViewById(R.id.fab);
|
||||
fab.setOnClickListener(this::onFabClick);
|
||||
fab.setOnLongClickListener(this::onFabLongClick);
|
||||
pager = new ViewPager2(getContext());
|
||||
toolbarFrame = (FrameLayout) LayoutInflater.from(getContext()).inflate(R.layout.home_toolbar, getToolbar(), false);
|
||||
|
||||
@@ -129,6 +135,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
|
||||
Bundle args = new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putBoolean("__is_tab", true);
|
||||
args.putBoolean("__disable_fab", true);
|
||||
args.putBoolean("onlyPosts", true);
|
||||
|
||||
for (int i = 0; i < timelineDefinitions.size(); i++) {
|
||||
@@ -280,6 +287,20 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
private void onFabClick(View v){
|
||||
if (fragments[pager.getCurrentItem()] instanceof BaseStatusListFragment<?> l) {
|
||||
l.onFabClick(v);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean onFabLongClick(View v) {
|
||||
if (fragments[pager.getCurrentItem()] instanceof BaseStatusListFragment<?> l) {
|
||||
return l.onFabLongClick(v);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void addListsToOverflowMenu() {
|
||||
Context ctx = getContext();
|
||||
listsMenu.clear();
|
||||
@@ -427,9 +448,20 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
|
||||
updateSwitcherIcon(i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showFab() {
|
||||
if (fragments[pager.getCurrentItem()] instanceof BaseStatusListFragment<?> l) l.showFab();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideFab() {
|
||||
if (fragments[pager.getCurrentItem()] instanceof BaseStatusListFragment<?> l) l.hideFab();
|
||||
}
|
||||
|
||||
private void updateSwitcherIcon(int i) {
|
||||
timelineIcon.setImageResource(timelines[i].getIcon().iconRes);
|
||||
timelineTitle.setText(timelines[i].getTitle(getContext()));
|
||||
showFab();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -657,6 +689,10 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
|
||||
return hashtagsItems.values();
|
||||
}
|
||||
|
||||
public ImageButton getFab() {
|
||||
return fab;
|
||||
}
|
||||
|
||||
private class HomePagerAdapter extends RecyclerView.Adapter<SimpleViewHolder> {
|
||||
@NonNull
|
||||
@Override
|
||||
|
||||
@@ -8,8 +8,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.markers.SaveMarkers;
|
||||
import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
@@ -38,7 +36,7 @@ public class HomeTimelineFragment extends StatusListFragment {
|
||||
private String lastSavedMarkerID;
|
||||
|
||||
@Override
|
||||
protected boolean withComposeButton() {
|
||||
protected boolean wantsComposeButton() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -150,7 +148,7 @@ public class HomeTimelineFragment extends StatusListFragment {
|
||||
result.get(result.size()-1).hasGapAfter=true;
|
||||
toAdd=result;
|
||||
}
|
||||
StatusFilterPredicate filterPredicate=new StatusFilterPredicate(accountID, Filter.FilterContext.HOME);
|
||||
StatusFilterPredicate filterPredicate=new StatusFilterPredicate(accountID, getFilterContext());
|
||||
toAdd=toAdd.stream().filter(filterPredicate).collect(Collectors.toList());
|
||||
if(!toAdd.isEmpty()){
|
||||
prependItems(toAdd, true);
|
||||
@@ -229,7 +227,7 @@ public class HomeTimelineFragment extends StatusListFragment {
|
||||
List<StatusDisplayItem> targetList=displayItems.subList(gapPos, gapPos+1);
|
||||
targetList.clear();
|
||||
List<Status> insertedPosts=data.subList(gapPostIndex+1, gapPostIndex+1);
|
||||
StatusFilterPredicate filterPredicate=new StatusFilterPredicate(accountID, Filter.FilterContext.HOME);
|
||||
StatusFilterPredicate filterPredicate=new StatusFilterPredicate(accountID, getFilterContext());
|
||||
for(Status s:result){
|
||||
if(idsBelowGap.contains(s.id))
|
||||
break;
|
||||
@@ -282,4 +280,9 @@ public class HomeTimelineFragment extends StatusListFragment {
|
||||
protected boolean shouldRemoveAccountPostsWhenUnfollowing(){
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.HOME;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ public class ListTimelineFragment extends PinnableStatusListFragment {
|
||||
private ListTimeline.RepliesPolicy repliesPolicy;
|
||||
|
||||
@Override
|
||||
protected boolean withComposeButton() {
|
||||
protected boolean wantsComposeButton() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -137,7 +137,7 @@ public class ListTimelineFragment extends PinnableStatusListFragment {
|
||||
@Override
|
||||
public void onSuccess(List<Status> result) {
|
||||
if (getActivity() == null) return;
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, Filter.FilterContext.HOME)).collect(Collectors.toList());
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, getFilterContext())).collect(Collectors.toList());
|
||||
onDataLoaded(result, !result.isEmpty());
|
||||
}
|
||||
})
|
||||
@@ -152,7 +152,7 @@ public class ListTimelineFragment extends PinnableStatusListFragment {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFabClick(View v){
|
||||
public void onFabClick(View v){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
Nav.go(getActivity(), ComposeFragment.class, args);
|
||||
@@ -162,4 +162,10 @@ public class ListTimelineFragment extends PinnableStatusListFragment {
|
||||
protected void onSetFabBottomInset(int inset) {
|
||||
((ViewGroup.MarginLayoutParams) fab.getLayoutParams()).bottomMargin=V.dp(24)+inset;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.HOME;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,14 +16,15 @@ import org.joinmastodon.android.events.PollUpdatedEvent;
|
||||
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.CacheablePaginatedResponse;
|
||||
import org.joinmastodon.android.model.Emoji;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.Notification;
|
||||
import org.joinmastodon.android.model.PaginatedResponse;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.displayitems.AccountCardStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.text.HtmlParser;
|
||||
import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper;
|
||||
import org.joinmastodon.android.ui.utils.InsetStatusItemDecoration;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
@@ -48,8 +49,8 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
private final DiscoverInfoBannerHelper bannerHelper = new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.POST_NOTIFICATIONS);
|
||||
|
||||
@Override
|
||||
protected boolean withComposeButton() {
|
||||
return true;
|
||||
protected boolean wantsComposeButton() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -83,6 +84,13 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
protected List<StatusDisplayItem> buildDisplayItems(Notification n){
|
||||
Account reportTarget = n.report == null ? null : n.report.targetAccount == null ? null :
|
||||
n.report.targetAccount;
|
||||
Emoji emoji = new Emoji();
|
||||
if(n.emojiUrl!=null){
|
||||
emoji.shortcode=n.emoji.substring(1,n.emoji.length()-1);
|
||||
emoji.url=n.emojiUrl;
|
||||
emoji.staticUrl=n.emojiUrl;
|
||||
emoji.visibleInPicker=false;
|
||||
}
|
||||
String extraText=switch(n.type){
|
||||
case FOLLOW -> getString(R.string.user_followed_you);
|
||||
case FOLLOW_REQUEST -> getString(R.string.user_sent_follow_request);
|
||||
@@ -93,8 +101,10 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
case UPDATE -> getString(R.string.sk_post_edited);
|
||||
case SIGN_UP -> getString(R.string.sk_signed_up);
|
||||
case REPORT -> getString(R.string.sk_reported);
|
||||
case REACTION, PLEROMA_EMOJI_REACTION ->
|
||||
n.emoji != null ? getString(R.string.sk_reacted_with, n.emoji) : getString(R.string.sk_reacted);
|
||||
};
|
||||
HeaderStatusDisplayItem titleItem=extraText!=null ? new HeaderStatusDisplayItem(n.id, n.account, n.createdAt, this, accountID, n.status, extraText, n, null) : null;
|
||||
HeaderStatusDisplayItem titleItem=extraText!=null ? new HeaderStatusDisplayItem(n.id, n.account, n.createdAt, this, accountID, n.status, n.emojiUrl!=null ? HtmlParser.parseCustomEmoji(extraText, Collections.singletonList(emoji)) : extraText, n, null) : null;
|
||||
if(n.status!=null){
|
||||
ArrayList<StatusDisplayItem> items=StatusDisplayItem.buildItems(this, n.status, accountID, n, knownAccounts, titleItem!=null, titleItem==null, n, false, Filter.FilterContext.NOTIFICATIONS);
|
||||
if(titleItem!=null)
|
||||
@@ -144,6 +154,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
if(offset==0 && !result.items.isEmpty() && !result.isFromCache()){
|
||||
E.post(new AllNotificationsSeenEvent());
|
||||
new SaveMarkers(null, result.items.get(0).id).exec(accountID);
|
||||
if (AccountSessionManager.getInstance().getAccount(accountID).markers != null)
|
||||
AccountSessionManager.getInstance().getAccount(accountID).markers
|
||||
.notifications.lastReadId = result.items.get(0).id;
|
||||
AccountSessionManager.getInstance().writeAccountsFile();
|
||||
@@ -196,7 +207,6 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
list.addItemDecoration(new InsetStatusItemDecoration(this));
|
||||
if (getParentFragment() instanceof NotificationsFragment) fab.setVisibility(View.GONE);
|
||||
if (onlyPosts) bannerHelper.maybeAddBanner(contentWrap);
|
||||
}
|
||||
|
||||
|
||||
@@ -337,7 +337,7 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
|
||||
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState){
|
||||
super.onSelectedChanged(viewHolder, actionState);
|
||||
if(actionState==ItemTouchHelper.ACTION_STATE_DRAG){
|
||||
viewHolder.itemView.setTag(R.id.item_touch_helper_previous_elevation, viewHolder.itemView.getElevation()); // prevents the default behavior of changing elevation in onDraw()
|
||||
viewHolder.itemView.setTag(me.grishka.appkit.R.id.item_touch_helper_previous_elevation, viewHolder.itemView.getElevation()); // prevents the default behavior of changing elevation in onDraw()
|
||||
viewHolder.itemView.animate().translationZ(V.dp(1)).setDuration(200).setInterpolator(CubicBezierInterpolator.DEFAULT).start();
|
||||
draggedViewHolder=viewHolder;
|
||||
}
|
||||
|
||||
@@ -19,13 +19,11 @@ import android.os.Bundle;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.TextUtils;
|
||||
import android.text.style.ImageSpan;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.SubMenu;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -112,7 +110,7 @@ import me.grishka.appkit.utils.CubicBezierInterpolator;
|
||||
import me.grishka.appkit.utils.V;
|
||||
import me.grishka.appkit.views.UsableRecyclerView;
|
||||
|
||||
public class ProfileFragment extends LoaderFragment implements OnBackPressedListener, ScrollableToTop{
|
||||
public class ProfileFragment extends LoaderFragment implements OnBackPressedListener, ScrollableToTop, HasFab{
|
||||
private static final int AVATAR_RESULT=722;
|
||||
private static final int COVER_RESULT=343;
|
||||
|
||||
@@ -152,7 +150,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
private WindowInsets childInsets;
|
||||
private PhotoViewer currentPhotoViewer;
|
||||
private boolean editModeLoading;
|
||||
protected int scrollDiff = 0;
|
||||
|
||||
private static final int MAX_FIELDS=4;
|
||||
|
||||
@@ -761,6 +758,16 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
return fab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showFab() {
|
||||
if (getFragmentForPage(pager.getCurrentItem()) instanceof HasFab fabulous) fabulous.showFab();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideFab() {
|
||||
if (getFragmentForPage(pager.getCurrentItem()) instanceof HasFab fabulous) fabulous.hideFab();
|
||||
}
|
||||
|
||||
private void onScrollChanged(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY){
|
||||
int topBarsH=getToolbar().getHeight()+statusBarHeight;
|
||||
if(scrollY>avatarBorder.getTop()-topBarsH){
|
||||
@@ -791,35 +798,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
if(currentPhotoViewer!=null){
|
||||
currentPhotoViewer.offsetView(0, oldScrollY-scrollY);
|
||||
}
|
||||
|
||||
if (GlobalUserPreferences.autoHideFab) {
|
||||
int dy = scrollY - oldScrollY;
|
||||
if (dy > 0 && fab.getVisibility() == View.VISIBLE) {
|
||||
TranslateAnimation animate = new TranslateAnimation(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
fab.getHeight() * 2);
|
||||
animate.setDuration(300);
|
||||
fab.startAnimation(animate);
|
||||
fab.setVisibility(View.INVISIBLE);
|
||||
scrollDiff = 0;
|
||||
} else if (dy < 0 && fab.getVisibility() != View.VISIBLE) {
|
||||
if (v.getScrollY() == 0 || scrollDiff > 400) {
|
||||
fab.setVisibility(View.VISIBLE);
|
||||
TranslateAnimation animate = new TranslateAnimation(
|
||||
0,
|
||||
0,
|
||||
fab.getHeight() * 2,
|
||||
0);
|
||||
animate.setDuration(300);
|
||||
fab.startAnimation(animate);
|
||||
scrollDiff = 0;
|
||||
} else {
|
||||
scrollDiff += Math.abs(dy);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Fragment getFragmentForPage(int page){
|
||||
@@ -1375,7 +1353,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState){
|
||||
super.onSelectedChanged(viewHolder, actionState);
|
||||
if(actionState==ItemTouchHelper.ACTION_STATE_DRAG){
|
||||
viewHolder.itemView.setTag(R.id.item_touch_helper_previous_elevation, viewHolder.itemView.getElevation()); // prevents the default behavior of changing elevation in onDraw()
|
||||
viewHolder.itemView.setTag(me.grishka.appkit.R.id.item_touch_helper_previous_elevation, viewHolder.itemView.getElevation()); // prevents the default behavior of changing elevation in onDraw()
|
||||
viewHolder.itemView.animate().translationZ(V.dp(1)).setDuration(200).setInterpolator(CubicBezierInterpolator.DEFAULT).start();
|
||||
draggedViewHolder=viewHolder;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
||||
private static final int SCHEDULED_STATUS_LIST_OPENED = 161;
|
||||
|
||||
@Override
|
||||
protected boolean withComposeButton() {
|
||||
protected boolean wantsComposeButton() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFabClick(View v) {
|
||||
public void onFabClick(View v) {
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putSerializable("scheduledAt", CreateStatus.getDraftInstant());
|
||||
@@ -64,7 +64,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onFabLongClick(View v) {
|
||||
public boolean onFabLongClick(View v) {
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putSerializable("scheduledAt", CreateStatus.getDraftInstant());
|
||||
@@ -79,7 +79,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
||||
|
||||
@Override
|
||||
protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) {
|
||||
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, null, true);
|
||||
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, null, true, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -96,6 +96,8 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
||||
args.putString("sourceText", status.text);
|
||||
args.putString("sourceSpoiler", status.spoilerText);
|
||||
args.putBoolean("redraftStatus", true);
|
||||
args.putString("sourceContentType", scheduledStatus.params.contentType != null ?
|
||||
scheduledStatus.params.contentType.name() : null);
|
||||
setResult(true, null);
|
||||
|
||||
// closing this scheduled status list if another status list is opened from compose fragment
|
||||
|
||||
@@ -14,6 +14,7 @@ import android.util.LruCache;
|
||||
import android.util.TypedValue;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -48,6 +49,7 @@ import org.joinmastodon.android.api.session.AccountSession;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.SelfUpdateStateChangedEvent;
|
||||
import org.joinmastodon.android.fragments.onboarding.InstanceRulesFragment;
|
||||
import org.joinmastodon.android.model.ContentType;
|
||||
import org.joinmastodon.android.model.Instance;
|
||||
import org.joinmastodon.android.fragments.onboarding.AccountActivationFragment;
|
||||
import org.joinmastodon.android.model.PushNotification;
|
||||
@@ -64,6 +66,7 @@ import java.util.function.Consumer;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
@@ -80,7 +83,8 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
private ArrayList<Item> items=new ArrayList<>();
|
||||
private ThemeItem themeItem;
|
||||
private NotificationPolicyItem notificationPolicyItem;
|
||||
private SwitchItem showNewPostsButtonItem, glitchModeItem, compactReblogReplyLineItem;
|
||||
private SwitchItem showNewPostsItem, glitchModeItem, compactReblogReplyLineItem;
|
||||
private ButtonItem defaultContentTypeButtonItem;
|
||||
private String accountID;
|
||||
private boolean needUpdateNotificationSettings;
|
||||
private boolean needAppRestart;
|
||||
@@ -89,7 +93,9 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
private ImageView themeTransitionWindowView;
|
||||
private TextItem checkForUpdateItem, clearImageCacheItem;
|
||||
private ImageCache imageCache;
|
||||
private Menu contentTypeMenu;
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState){
|
||||
super.onCreate(savedInstanceState);
|
||||
@@ -239,15 +245,15 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_settings_load_new_posts, R.drawable.ic_fluent_arrow_sync_24_regular, GlobalUserPreferences.loadNewPosts, i->{
|
||||
GlobalUserPreferences.loadNewPosts=i.checked;
|
||||
showNewPostsButtonItem.enabled = i.checked;
|
||||
showNewPostsItem.enabled = i.checked;
|
||||
if (!i.checked) {
|
||||
GlobalUserPreferences.showNewPostsButton = false;
|
||||
showNewPostsButtonItem.checked = false;
|
||||
showNewPostsItem.checked = false;
|
||||
}
|
||||
if (list.findViewHolderForAdapterPosition(items.indexOf(showNewPostsButtonItem)) instanceof SwitchViewHolder svh) svh.rebind();
|
||||
if (list.findViewHolderForAdapterPosition(items.indexOf(showNewPostsItem)) instanceof SwitchViewHolder svh) svh.rebind();
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(showNewPostsButtonItem = new SwitchItem(R.string.sk_settings_see_new_posts_button, R.drawable.ic_fluent_arrow_up_24_regular, GlobalUserPreferences.showNewPostsButton, i->{
|
||||
items.add(showNewPostsItem = new SwitchItem(R.string.sk_settings_see_new_posts_button, R.drawable.ic_fluent_arrow_up_24_regular, GlobalUserPreferences.showNewPostsButton, i->{
|
||||
GlobalUserPreferences.showNewPostsButton=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
@@ -330,6 +336,36 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
if (!TextUtils.isEmpty(instance.version)) items.add(new SmallTextItem(getString(R.string.sk_settings_server_version, instance.version)));
|
||||
|
||||
items.add(new HeaderItem(R.string.sk_instance_features));
|
||||
items.add(new SwitchItem(R.string.sk_settings_content_types, 0, GlobalUserPreferences.accountsWithContentTypesEnabled.contains(accountID), (i)->{
|
||||
if (i.checked) {
|
||||
GlobalUserPreferences.accountsWithContentTypesEnabled.add(accountID);
|
||||
if (GlobalUserPreferences.accountsDefaultContentTypes.get(accountID) == null) {
|
||||
GlobalUserPreferences.accountsDefaultContentTypes.put(accountID, ContentType.PLAIN);
|
||||
}
|
||||
} else {
|
||||
GlobalUserPreferences.accountsWithContentTypesEnabled.remove(accountID);
|
||||
GlobalUserPreferences.accountsDefaultContentTypes.remove(accountID);
|
||||
}
|
||||
if (list.findViewHolderForAdapterPosition(items.indexOf(defaultContentTypeButtonItem))
|
||||
instanceof ButtonViewHolder bvh) bvh.rebind();
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(new SmallTextItem(getString(R.string.sk_settings_content_types_explanation)));
|
||||
items.add(defaultContentTypeButtonItem = new ButtonItem(R.string.sk_settings_default_content_type, 0, b->{
|
||||
PopupMenu popupMenu=new PopupMenu(getActivity(), b, Gravity.CENTER_HORIZONTAL);
|
||||
popupMenu.inflate(R.menu.compose_content_type);
|
||||
popupMenu.setOnMenuItemClickListener(item -> this.onContentTypeChanged(item, b));
|
||||
b.setOnTouchListener(popupMenu.getDragToOpenListener());
|
||||
b.setOnClickListener(v->popupMenu.show());
|
||||
ContentType contentType = GlobalUserPreferences.accountsDefaultContentTypes.get(accountID);
|
||||
b.setText(getContentTypeString(contentType));
|
||||
contentTypeMenu = popupMenu.getMenu();
|
||||
contentTypeMenu.findItem(ContentType.getContentTypeRes(contentType)).setChecked(true);
|
||||
ContentType.adaptMenuToInstance(contentTypeMenu, instance);
|
||||
contentTypeMenu.findItem(R.id.content_type_null).setVisible(
|
||||
!GlobalUserPreferences.accountsWithContentTypesEnabled.contains(accountID));
|
||||
}));
|
||||
items.add(new SmallTextItem(getString(R.string.sk_settings_default_content_type_explanation)));
|
||||
items.add(new SwitchItem(R.string.sk_settings_support_local_only, 0, GlobalUserPreferences.accountsWithLocalOnlySupport.contains(accountID), i->{
|
||||
glitchModeItem.enabled = i.checked;
|
||||
if (i.checked) {
|
||||
@@ -500,6 +536,34 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
}
|
||||
}
|
||||
|
||||
private @StringRes int getContentTypeString(@Nullable ContentType contentType) {
|
||||
if (contentType == null) return R.string.sk_content_type_unspecified;
|
||||
return switch (contentType) {
|
||||
case PLAIN -> R.string.sk_content_type_plain;
|
||||
case HTML -> R.string.sk_content_type_html;
|
||||
case MARKDOWN -> R.string.sk_content_type_markdown;
|
||||
case BBCODE -> R.string.sk_content_type_bbcode;
|
||||
case MISSKEY_MARKDOWN -> R.string.sk_content_type_mfm;
|
||||
};
|
||||
}
|
||||
|
||||
private boolean onContentTypeChanged(MenuItem item, Button btn){
|
||||
int id = item.getItemId();
|
||||
ContentType contentType = switch (id) {
|
||||
case R.id.content_type_plain -> ContentType.PLAIN;
|
||||
case R.id.content_type_html -> ContentType.HTML;
|
||||
case R.id.content_type_markdown -> ContentType.MARKDOWN;
|
||||
case R.id.content_type_bbcode -> ContentType.BBCODE;
|
||||
case R.id.content_type_misskey_markdown -> ContentType.MISSKEY_MARKDOWN;
|
||||
default -> null;
|
||||
};
|
||||
GlobalUserPreferences.accountsDefaultContentTypes.put(accountID, contentType);
|
||||
GlobalUserPreferences.save();
|
||||
btn.setText(getContentTypeString(contentType));
|
||||
item.setChecked(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean onReplyVisibilityChanged(MenuItem item, Button btn){
|
||||
String pref = null;
|
||||
int id = item.getItemId();
|
||||
@@ -1007,7 +1071,11 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
@Override
|
||||
public void onBind(ButtonItem item){
|
||||
text.setText(item.text);
|
||||
if (item.icon == 0) {
|
||||
icon.setVisibility(View.GONE);
|
||||
} else {
|
||||
icon.setImageResource(item.icon);
|
||||
}
|
||||
item.buttonConsumer.accept(button);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,43 +1,47 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.os.Bundle;
|
||||
import android.text.SpannableString;
|
||||
import android.text.style.ReplacementSpan;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.WindowInsets;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Button;
|
||||
|
||||
import org.joinmastodon.android.MastodonApp;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.instance.GetInstance;
|
||||
import org.joinmastodon.android.fragments.onboarding.InstanceCatalogSignupFragment;
|
||||
import org.joinmastodon.android.fragments.onboarding.InstanceChooserLoginFragment;
|
||||
import org.joinmastodon.android.fragments.onboarding.InstanceRulesFragment;
|
||||
import org.joinmastodon.android.model.Instance;
|
||||
import org.joinmastodon.android.ui.InterpolatingMotionEffect;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.ui.views.SizeListenerFrameLayout;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.viewpager2.widget.ViewPager2;
|
||||
import me.grishka.appkit.Nav;
|
||||
import me.grishka.appkit.api.Callback;
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
import me.grishka.appkit.fragments.AppKitFragment;
|
||||
import me.grishka.appkit.utils.V;
|
||||
import me.grishka.appkit.views.BottomSheet;
|
||||
|
||||
public class SplashFragment extends AppKitFragment{
|
||||
|
||||
private static final String DEFAULT_SERVER="mastodon.social";
|
||||
|
||||
private SizeListenerFrameLayout contentView;
|
||||
private View artContainer, blueFill, greenFill;
|
||||
private ViewPager2 pager;
|
||||
private ViewGroup pagerDots;
|
||||
private InterpolatingMotionEffect motionEffect;
|
||||
private View artClouds, artPlaneElephant, artRightHill, artLeftHill, artCenterHill;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState){
|
||||
super.onCreate(savedInstanceState);
|
||||
motionEffect=new InterpolatingMotionEffect(MastodonApp.context);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -46,44 +50,26 @@ public class SplashFragment extends AppKitFragment{
|
||||
contentView=(SizeListenerFrameLayout) inflater.inflate(R.layout.fragment_splash, container, false);
|
||||
contentView.findViewById(R.id.btn_get_started).setOnClickListener(this::onButtonClick);
|
||||
contentView.findViewById(R.id.btn_log_in).setOnClickListener(this::onButtonClick);
|
||||
Button joinDefault=contentView.findViewById(R.id.btn_join_default_server);
|
||||
joinDefault.setText(getString(R.string.join_default_server, DEFAULT_SERVER));
|
||||
joinDefault.setOnClickListener(this::onJoinDefaultServerClick);
|
||||
contentView.findViewById(R.id.btn_learn_more).setOnClickListener(this::onLearnMoreClick);
|
||||
|
||||
artClouds=contentView.findViewById(R.id.art_clouds);
|
||||
artPlaneElephant=contentView.findViewById(R.id.art_plane_elephant);
|
||||
artRightHill=contentView.findViewById(R.id.art_right_hill);
|
||||
artLeftHill=contentView.findViewById(R.id.art_left_hill);
|
||||
artCenterHill=contentView.findViewById(R.id.art_center_hill);
|
||||
pager=contentView.findViewById(R.id.pager);
|
||||
pagerDots=contentView.findViewById(R.id.pager_dots);
|
||||
pager.setAdapter(new PagerAdapter());
|
||||
pager.setOffscreenPageLimit(3);
|
||||
pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback(){
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels){
|
||||
for(int i=0;i<pagerDots.getChildCount();i++){
|
||||
float alpha;
|
||||
if(i==position){
|
||||
alpha=0.3f+0.7f*(1f-positionOffset);
|
||||
}else if(i==position+1){
|
||||
alpha=0.3f+0.7f*positionOffset;
|
||||
}else{
|
||||
alpha=0.3f;
|
||||
}
|
||||
pagerDots.getChildAt(i).setAlpha(alpha);
|
||||
}
|
||||
|
||||
float parallaxProgress=(position+positionOffset)/2f;
|
||||
artClouds.setTranslationX(V.dp(-27)*(position>=1 ? 1f : positionOffset));
|
||||
artPlaneElephant.setTranslationX(V.dp(101.55f)*parallaxProgress);
|
||||
artLeftHill.setTranslationX(V.dp(-88)*parallaxProgress);
|
||||
artLeftHill.setTranslationY(V.dp(24)*parallaxProgress);
|
||||
artRightHill.setTranslationX(V.dp(-88)*parallaxProgress);
|
||||
artRightHill.setTranslationY(V.dp(-24)*parallaxProgress);
|
||||
artCenterHill.setTranslationX(V.dp(-40)*parallaxProgress);
|
||||
}
|
||||
});
|
||||
|
||||
artContainer=contentView.findViewById(R.id.art_container);
|
||||
blueFill=contentView.findViewById(R.id.blue_fill);
|
||||
greenFill=contentView.findViewById(R.id.green_fill);
|
||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artClouds, V.dp(-5), V.dp(5), V.dp(-5), V.dp(5)));
|
||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artRightHill, V.dp(-15), V.dp(25), V.dp(-10), V.dp(10)));
|
||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artLeftHill, V.dp(-25), V.dp(15), V.dp(-15), V.dp(15)));
|
||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artCenterHill, V.dp(-14), V.dp(14), V.dp(-5), V.dp(25)));
|
||||
motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artPlaneElephant, V.dp(-20), V.dp(12), V.dp(-20), V.dp(12)));
|
||||
artContainer.setOnTouchListener(motionEffect);
|
||||
|
||||
contentView.setSizeListener(new SizeListenerFrameLayout.OnSizeChangedListener(){
|
||||
@Override
|
||||
@@ -109,6 +95,38 @@ public class SplashFragment extends AppKitFragment{
|
||||
Nav.go(getActivity(), isSignup ? InstanceCatalogSignupFragment.class : InstanceChooserLoginFragment.class, extras);
|
||||
}
|
||||
|
||||
private void onJoinDefaultServerClick(View v){
|
||||
new GetInstance()
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(Instance result){
|
||||
if(getActivity()==null)
|
||||
return;
|
||||
Bundle args=new Bundle();
|
||||
args.putParcelable("instance", Parcels.wrap(result));
|
||||
Nav.go(getActivity(), InstanceRulesFragment.class, args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error){
|
||||
if(getActivity()==null)
|
||||
return;
|
||||
error.showToast(getActivity());
|
||||
}
|
||||
})
|
||||
.wrapProgress(getActivity(), R.string.loading_instance, true)
|
||||
.execNoAuth(DEFAULT_SERVER);
|
||||
}
|
||||
|
||||
private void onLearnMoreClick(View v){
|
||||
View sheetView=getActivity().getLayoutInflater().inflate(R.layout.intro_bottom_sheet, null);
|
||||
BottomSheet sheet=new BottomSheet(getActivity());
|
||||
sheet.setContentView(sheetView);
|
||||
sheet.setNavigationBarBackground(new ColorDrawable(UiUtils.alphaBlendColors(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Surface),
|
||||
UiUtils.getThemeColor(getActivity(), R.attr.colorM3Primary), 0.05f)), !UiUtils.isDarkTheme());
|
||||
sheet.show();
|
||||
}
|
||||
|
||||
private void updateArtSize(int w, int h){
|
||||
float scale=w/(float)V.dp(360);
|
||||
artContainer.setScaleX(scale);
|
||||
@@ -139,60 +157,15 @@ public class SplashFragment extends AppKitFragment{
|
||||
return true;
|
||||
}
|
||||
|
||||
private class PagerAdapter extends RecyclerView.Adapter<PagerViewHolder>{
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public PagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
|
||||
return new PagerViewHolder(viewType);
|
||||
protected void onShown(){
|
||||
super.onShown();
|
||||
motionEffect.activate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull PagerViewHolder holder, int position){}
|
||||
|
||||
@Override
|
||||
public int getItemCount(){
|
||||
return 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position){
|
||||
return position;
|
||||
}
|
||||
}
|
||||
|
||||
private class PagerViewHolder extends RecyclerView.ViewHolder{
|
||||
public PagerViewHolder(int page){
|
||||
super(new LinearLayout(getActivity()));
|
||||
LinearLayout ll=(LinearLayout) itemView;
|
||||
ll.setOrientation(LinearLayout.VERTICAL);
|
||||
int pad=V.dp(16);
|
||||
ll.setPadding(pad, pad, pad, pad);
|
||||
ll.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
|
||||
TextView title=new TextView(getActivity());
|
||||
title.setTextAppearance(R.style.m3_headline_medium);
|
||||
title.setText(switch(page){
|
||||
case 0 -> getString(R.string.welcome_page1_title);
|
||||
case 1 -> getString(R.string.welcome_page2_title);
|
||||
case 2 -> getString(R.string.welcome_page3_title);
|
||||
default -> throw new IllegalStateException("Unexpected value: "+page);
|
||||
});
|
||||
title.setTextColor(0xFF17063B);
|
||||
LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(page==0 ? 46 : 36));
|
||||
lp.bottomMargin=V.dp(page==0 ? 4 : 14);
|
||||
ll.addView(title, lp);
|
||||
|
||||
TextView text=new TextView(getActivity());
|
||||
text.setTextAppearance(R.style.m3_body_medium);
|
||||
text.setText(switch(page){
|
||||
case 0 -> R.string.welcome_page1_text;
|
||||
case 1 -> R.string.welcome_page2_text;
|
||||
case 2 -> R.string.welcome_page3_text;
|
||||
default -> throw new IllegalStateException("Unexpected value: "+page);
|
||||
});
|
||||
text.setTextColor(0xFF17063B);
|
||||
ll.addView(text, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||
}
|
||||
protected void onHidden(){
|
||||
super.onHidden();
|
||||
motionEffect.deactivate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.view.View;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.statuses.GetStatusEditHistory;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.displayitems.ReblogOrReplyLineStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
@@ -55,7 +56,7 @@ public class StatusEditHistoryFragment extends StatusListFragment{
|
||||
|
||||
@Override
|
||||
protected List<StatusDisplayItem> buildDisplayItems(Status s){
|
||||
List<StatusDisplayItem> items=StatusDisplayItem.buildItems(this, s, accountID, s, knownAccounts, true, false, null);
|
||||
List<StatusDisplayItem> items=StatusDisplayItem.buildItems(this, s, accountID, s, knownAccounts, true, false, null, null);
|
||||
int idx=data.indexOf(s);
|
||||
if(idx>=0){
|
||||
String date=UiUtils.DATE_TIME_FORMATTER.format(s.createdAt.atZone(ZoneId.systemDefault()));
|
||||
@@ -156,4 +157,9 @@ public class StatusEditHistoryFragment extends StatusListFragment{
|
||||
public boolean isItemEnabled(String id){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,9 +34,11 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>{
|
||||
protected List<StatusDisplayItem> buildDisplayItems(Status s){
|
||||
boolean addFooter = !GlobalUserPreferences.spectatorMode ||
|
||||
(this instanceof ThreadFragment t && s.id.equals(t.mainStatus.id));
|
||||
return StatusDisplayItem.buildItems(this, s, accountID, s, knownAccounts, false, addFooter, null, Filter.FilterContext.HOME);
|
||||
return StatusDisplayItem.buildItems(this, s, accountID, s, knownAccounts, false, addFooter, null, getFilterContext());
|
||||
}
|
||||
|
||||
protected abstract Filter.FilterContext getFilterContext();
|
||||
|
||||
@Override
|
||||
protected void addAccountToKnown(Status s){
|
||||
if(!knownAccounts.containsKey(s.account.id))
|
||||
|
||||
@@ -137,7 +137,7 @@ public class ThreadFragment extends StatusListFragment{
|
||||
}
|
||||
|
||||
private List<Status> filterStatuses(List<Status> statuses){
|
||||
StatusFilterPredicate statusFilterPredicate=new StatusFilterPredicate(accountID,Filter.FilterContext.THREAD);
|
||||
StatusFilterPredicate statusFilterPredicate=new StatusFilterPredicate(accountID,getFilterContext());
|
||||
return statuses.stream()
|
||||
.filter(statusFilterPredicate)
|
||||
.collect(Collectors.toList());
|
||||
@@ -181,4 +181,10 @@ public class ThreadFragment extends StatusListFragment{
|
||||
public boolean wantsLightNavigationBar(){
|
||||
return !UiUtils.isDarkTheme();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.THREAD;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ public class DiscoverPostsFragment extends StatusListFragment implements IsOnTop
|
||||
@Override
|
||||
public void onSuccess(List<Status> result){
|
||||
if (getActivity() == null) return;
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, Filter.FilterContext.PUBLIC)).collect(Collectors.toList());
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, getFilterContext())).collect(Collectors.toList());
|
||||
onDataLoaded(result, !result.isEmpty());
|
||||
}
|
||||
}).exec(accountID);
|
||||
@@ -42,4 +42,10 @@ public class DiscoverPostsFragment extends StatusListFragment implements IsOnTop
|
||||
public boolean isOnTop() {
|
||||
return isRecyclerViewOnTop(list);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.PUBLIC;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ public class FederatedTimelineFragment extends StatusListFragment {
|
||||
private String maxID;
|
||||
|
||||
@Override
|
||||
protected boolean withComposeButton() {
|
||||
protected boolean wantsComposeButton() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ public class FederatedTimelineFragment extends StatusListFragment {
|
||||
if(!result.isEmpty())
|
||||
maxID=result.get(result.size()-1).id;
|
||||
if (getActivity() == null) return;
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, Filter.FilterContext.PUBLIC)).collect(Collectors.toList());
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, getFilterContext())).collect(Collectors.toList());
|
||||
onDataLoaded(result, !result.isEmpty());
|
||||
}
|
||||
})
|
||||
@@ -47,4 +47,9 @@ public class FederatedTimelineFragment extends StatusListFragment {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
bannerHelper.maybeAddBanner(contentWrap);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.PUBLIC;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ public class LocalTimelineFragment extends StatusListFragment {
|
||||
private String maxID;
|
||||
|
||||
@Override
|
||||
protected boolean withComposeButton() {
|
||||
protected boolean wantsComposeButton() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ public class LocalTimelineFragment extends StatusListFragment {
|
||||
if(!result.isEmpty())
|
||||
maxID=result.get(result.size()-1).id;
|
||||
if (getActivity() == null) return;
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, Filter.FilterContext.PUBLIC)).collect(Collectors.toList());
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, getFilterContext())).collect(Collectors.toList());
|
||||
onDataLoaded(result, !result.isEmpty());
|
||||
}
|
||||
})
|
||||
@@ -46,4 +46,9 @@ public class LocalTimelineFragment extends StatusListFragment {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
bannerHelper.maybeAddBanner(contentWrap);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return Filter.FilterContext.PUBLIC;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.joinmastodon.android.fragments.IsOnTop;
|
||||
import org.joinmastodon.android.fragments.ProfileFragment;
|
||||
import org.joinmastodon.android.fragments.ThreadFragment;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.Hashtag;
|
||||
import org.joinmastodon.android.model.SearchResult;
|
||||
import org.joinmastodon.android.model.SearchResults;
|
||||
@@ -80,7 +81,7 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult> impleme
|
||||
return switch(s.type){
|
||||
case ACCOUNT -> Collections.singletonList(new AccountStatusDisplayItem(s.id, this, s.account));
|
||||
case HASHTAG -> Collections.singletonList(new HashtagStatusDisplayItem(s.id, this, s.hashtag));
|
||||
case STATUS -> StatusDisplayItem.buildItems(this, s.status, accountID, s, knownAccounts, false, true, null);
|
||||
case STATUS -> StatusDisplayItem.buildItems(this, s.status, accountID, s, knownAccounts, false, true, null, Filter.FilterContext.PUBLIC);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ import org.joinmastodon.android.api.requests.accounts.GetAccountStatuses;
|
||||
import org.joinmastodon.android.events.FinishReportFragmentsEvent;
|
||||
import org.joinmastodon.android.fragments.StatusListFragment;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.displayitems.AudioStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
|
||||
@@ -261,4 +262,9 @@ public class ReportAddPostsChoiceFragment extends StatusListFragment{
|
||||
protected boolean wantsOverlaySystemNavigation(){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Filter.FilterContext getFilterContext() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
package org.joinmastodon.android.model;
|
||||
|
||||
import android.view.Menu;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
|
||||
public enum ContentType {
|
||||
@SerializedName("text/plain")
|
||||
PLAIN,
|
||||
@SerializedName("text/html")
|
||||
HTML,
|
||||
@SerializedName("text/markdown")
|
||||
MARKDOWN,
|
||||
@SerializedName("text/bbcode")
|
||||
BBCODE, // akkoma
|
||||
@SerializedName("text/x.misskeymarkdown")
|
||||
MISSKEY_MARKDOWN; // akkoma/*key
|
||||
|
||||
public static int getContentTypeRes(@Nullable ContentType contentType) {
|
||||
return contentType == null ? R.id.content_type_null : switch(contentType) {
|
||||
case PLAIN -> R.id.content_type_plain;
|
||||
case HTML -> R.id.content_type_html;
|
||||
case MARKDOWN -> R.id.content_type_markdown;
|
||||
case BBCODE -> R.id.content_type_bbcode;
|
||||
case MISSKEY_MARKDOWN -> R.id.content_type_misskey_markdown;
|
||||
};
|
||||
}
|
||||
|
||||
public static void adaptMenuToInstance(Menu m, Instance i) {
|
||||
if (i.pleroma == null) {
|
||||
// memo: change this if glitch or another mastodon fork supports bbcode or mfm
|
||||
m.findItem(R.id.content_type_bbcode).setVisible(false);
|
||||
m.findItem(R.id.content_type_misskey_markdown).setVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,22 +2,22 @@ package org.joinmastodon.android.model;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
import org.joinmastodon.android.api.ObjectValidationException;
|
||||
import org.joinmastodon.android.api.RequiredField;
|
||||
import org.parceler.Parcel;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@Parcel
|
||||
public class Filter extends BaseModel{
|
||||
@RequiredField
|
||||
public String id;
|
||||
@RequiredField
|
||||
public String phrase;
|
||||
public String title;
|
||||
public transient EnumSet<FilterContext> context=EnumSet.noneOf(FilterContext.class);
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
package org.joinmastodon.android.model;
|
||||
|
||||
import org.joinmastodon.android.api.ObjectValidationException;
|
||||
import org.parceler.Parcel;
|
||||
|
||||
@Parcel
|
||||
public class FilterResult extends BaseModel {
|
||||
public Filter filter;
|
||||
|
||||
@Override
|
||||
public void postprocess() throws ObjectValidationException {
|
||||
super.postprocess();
|
||||
if (filter != null) filter.postprocess();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@ public class Notification extends BaseModel implements DisplayItemsParent{
|
||||
public Account account;
|
||||
public Status status;
|
||||
public Report report;
|
||||
public String emoji;
|
||||
public String emojiUrl;
|
||||
|
||||
@Override
|
||||
public void postprocess() throws ObjectValidationException{
|
||||
@@ -51,6 +53,10 @@ public class Notification extends BaseModel implements DisplayItemsParent{
|
||||
STATUS,
|
||||
@SerializedName("update")
|
||||
UPDATE,
|
||||
@SerializedName("reaction")
|
||||
REACTION,
|
||||
@SerializedName("pleroma:emoji_reaction")
|
||||
PLEROMA_EMOJI_REACTION,
|
||||
@SerializedName("admin.sign_up")
|
||||
SIGN_UP,
|
||||
@SerializedName("admin.report")
|
||||
|
||||
@@ -39,6 +39,7 @@ public class ScheduledStatus extends BaseModel implements DisplayItemsParent{
|
||||
public String idempotency;
|
||||
public String applicationId;
|
||||
public List<String> mediaIds;
|
||||
public ContentType contentType;
|
||||
}
|
||||
|
||||
@Parcel
|
||||
|
||||
@@ -101,6 +101,9 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
card.postprocess();
|
||||
if(reblog!=null)
|
||||
reblog.postprocess();
|
||||
if(filtered!=null)
|
||||
for(FilterResult fr : filtered)
|
||||
fr.postprocess();
|
||||
|
||||
spoilerRevealed=GlobalUserPreferences.alwaysExpandContentWarnings || !sensitive;
|
||||
if (visibility.equals(StatusPrivacy.LOCAL)) localOnly = true;
|
||||
|
||||
@@ -1,17 +1,25 @@
|
||||
package org.joinmastodon.android.ui;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.Surface;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.view.animation.PathInterpolator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class InterpolatingMotionEffect implements SensorEventListener{
|
||||
import androidx.dynamicanimation.animation.DynamicAnimation;
|
||||
import androidx.dynamicanimation.animation.FloatValueHolder;
|
||||
import androidx.dynamicanimation.animation.SpringAnimation;
|
||||
import androidx.dynamicanimation.animation.SpringForce;
|
||||
|
||||
public class InterpolatingMotionEffect implements SensorEventListener, View.OnTouchListener{
|
||||
|
||||
private SensorManager sm;
|
||||
private WindowManager wm;
|
||||
@@ -20,6 +28,34 @@ public class InterpolatingMotionEffect implements SensorEventListener{
|
||||
private Sensor accelerometer;
|
||||
private boolean accelerometerEnabled;
|
||||
private ArrayList<ViewEffect> views=new ArrayList<>();
|
||||
private float pitch, roll;
|
||||
private float touchDownX, touchDownY, touchAddX, touchAddY, touchAddLastAnimX, touchAddLastAnimY;
|
||||
private PathInterpolator touchInterpolator=new PathInterpolator(0.5f, 1f, 0.89f, 1f);
|
||||
private SpringAnimation touchSpringX, touchSpringY;
|
||||
private FloatValueHolder touchSpringXHolder=new FloatValueHolder(){
|
||||
@Override
|
||||
public float getValue(){
|
||||
return touchAddX;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(float value){
|
||||
touchAddX=value;
|
||||
updateEffects();
|
||||
}
|
||||
};
|
||||
private FloatValueHolder touchSpringYHolder=new FloatValueHolder(){
|
||||
@Override
|
||||
public float getValue(){
|
||||
return touchAddY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(float value){
|
||||
touchAddY=value;
|
||||
updateEffects();
|
||||
}
|
||||
};
|
||||
|
||||
public InterpolatingMotionEffect(Context context){
|
||||
sm=context.getSystemService(SensorManager.class);
|
||||
@@ -50,8 +86,8 @@ public class InterpolatingMotionEffect implements SensorEventListener{
|
||||
float z=event.values[2]/SensorManager.GRAVITY_EARTH;
|
||||
|
||||
|
||||
float pitch=(float) (Math.atan2(x, Math.sqrt(y*y+z*z))/Math.PI*2.0);
|
||||
float roll=(float) (Math.atan2(y, Math.sqrt(x*x+z*z))/Math.PI*2.0);
|
||||
pitch=(float) (Math.atan2(x, Math.sqrt(y*y+z*z))/Math.PI*2.0);
|
||||
roll=(float) (Math.atan2(y, Math.sqrt(x*x+z*z))/Math.PI*2.0);
|
||||
|
||||
switch(rotation){
|
||||
case Surface.ROTATION_0:
|
||||
@@ -88,9 +124,7 @@ public class InterpolatingMotionEffect implements SensorEventListener{
|
||||
}else if(roll<-1f){
|
||||
roll=-2f-roll;
|
||||
}
|
||||
for(ViewEffect view:views){
|
||||
view.update(pitch, roll);
|
||||
}
|
||||
updateEffects();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -110,6 +144,62 @@ public class InterpolatingMotionEffect implements SensorEventListener{
|
||||
views.clear();
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent ev){
|
||||
switch(ev.getAction()){
|
||||
case MotionEvent.ACTION_DOWN -> {
|
||||
if(touchSpringX!=null){
|
||||
touchAddLastAnimX=touchAddX;
|
||||
touchSpringX.cancel();
|
||||
touchSpringX=null;
|
||||
}else{
|
||||
touchAddLastAnimX=0;
|
||||
}
|
||||
if(touchSpringY!=null){
|
||||
touchAddLastAnimY=touchAddY;
|
||||
touchSpringY.cancel();
|
||||
touchSpringY=null;
|
||||
}else{
|
||||
touchAddLastAnimY=0;
|
||||
}
|
||||
touchDownX=ev.getX();
|
||||
touchDownY=ev.getY();
|
||||
}
|
||||
case MotionEvent.ACTION_MOVE -> {
|
||||
touchAddX=touchInterpolator.getInterpolation(Math.min(1f, Math.abs((ev.getX()-touchDownX)/(v.getWidth()/2f))));
|
||||
touchAddY=touchInterpolator.getInterpolation(Math.min(1f, Math.abs((ev.getY()-touchDownY)/(v.getHeight()/2f))));
|
||||
if(ev.getX()>touchDownX)
|
||||
touchAddX=-touchAddX;
|
||||
if(ev.getY()<touchDownY)
|
||||
touchAddY=-touchAddY;
|
||||
touchAddX+=touchAddLastAnimX;
|
||||
touchAddY+=touchAddLastAnimY;
|
||||
updateEffects();
|
||||
}
|
||||
case MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||
touchSpringX=new SpringAnimation(touchSpringXHolder, 0f);
|
||||
touchSpringX.setMinimumVisibleChange(0.01f);
|
||||
touchSpringX.getSpring().setStiffness(SpringForce.STIFFNESS_LOW).setDampingRatio(0.85f);
|
||||
touchSpringX.addEndListener((animation, canceled, value, velocity)->touchSpringX=null);
|
||||
touchSpringX.start();
|
||||
touchSpringY=new SpringAnimation(touchSpringYHolder, 0f);
|
||||
touchSpringY.setMinimumVisibleChange(0.01f);
|
||||
touchSpringY.getSpring().setStiffness(SpringForce.STIFFNESS_LOW).setDampingRatio(0.85f);
|
||||
touchSpringY.addEndListener((animation, canceled, value, velocity)->touchSpringY=null);
|
||||
touchSpringY.start();
|
||||
updateEffects();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void updateEffects(){
|
||||
for(ViewEffect view:views){
|
||||
view.update(Math.min(1f, Math.max(-1f, pitch+touchAddX)), Math.min(1f, Math.max(-1f, roll+touchAddY)));
|
||||
}
|
||||
}
|
||||
|
||||
public static class ViewEffect{
|
||||
private View view;
|
||||
private float minX, maxX, minY, maxY;
|
||||
|
||||
@@ -44,6 +44,7 @@ import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.Announcement;
|
||||
import org.joinmastodon.android.model.Attachment;
|
||||
import org.joinmastodon.android.model.ContentType;
|
||||
import org.joinmastodon.android.model.Notification;
|
||||
import org.joinmastodon.android.model.Relationship;
|
||||
import org.joinmastodon.android.model.ScheduledStatus;
|
||||
@@ -83,13 +84,13 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
public final Status status;
|
||||
private boolean hasVisibilityToggle;
|
||||
boolean needBottomPadding;
|
||||
private String extraText;
|
||||
private CharSequence extraText;
|
||||
private Notification notification;
|
||||
private ScheduledStatus scheduledStatus;
|
||||
private Announcement announcement;
|
||||
private Consumer<String> consumeReadAnnouncement;
|
||||
|
||||
public HeaderStatusDisplayItem(String parentID, Account user, Instant createdAt, BaseStatusListFragment parentFragment, String accountID, Status status, String extraText, Notification notification, ScheduledStatus scheduledStatus){
|
||||
public HeaderStatusDisplayItem(String parentID, Account user, Instant createdAt, BaseStatusListFragment parentFragment, String accountID, Status status, CharSequence extraText, Notification notification, ScheduledStatus scheduledStatus){
|
||||
super(parentID, parentFragment);
|
||||
user=scheduledStatus != null ? AccountSessionManager.getInstance().getAccount(accountID).self : user;
|
||||
this.user=user;
|
||||
@@ -114,6 +115,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
}
|
||||
}
|
||||
this.extraText=extraText;
|
||||
emojiHelper.addText(extraText);
|
||||
}
|
||||
|
||||
public static HeaderStatusDisplayItem fromAnnouncement(Announcement a, Status fakeStatus, Account instanceUser, BaseStatusListFragment parentFragment, String accountID, Consumer<String> consumeReadID) {
|
||||
@@ -216,6 +218,9 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
public void onSuccess(GetStatusSourceText.Response result){
|
||||
args.putString("sourceText", result.text);
|
||||
args.putString("sourceSpoiler", result.spoilerText);
|
||||
if (result.contentType != null) {
|
||||
args.putString("sourceContentType", result.contentType.name());
|
||||
}
|
||||
if (redraft) {
|
||||
UiUtils.confirmDeletePost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, s->{
|
||||
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package org.joinmastodon.android.ui.displayitems;
|
||||
|
||||
import static org.joinmastodon.android.ui.utils.MediaAttachmentViewController.altWrapPadding;
|
||||
import static org.joinmastodon.android.GlobalUserPreferences.*;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
@@ -55,7 +55,7 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{
|
||||
for(Attachment att:attachments){
|
||||
requests.add(new UrlImageLoaderRequest(switch(att.type){
|
||||
case IMAGE -> att.url;
|
||||
case VIDEO, GIFV -> att.previewUrl;
|
||||
case VIDEO, GIFV -> att.previewUrl != null ? att.previewUrl : att.url;
|
||||
default -> throw new IllegalStateException("Unexpected value: "+att.type);
|
||||
}, 1000, 1000));
|
||||
}
|
||||
@@ -183,10 +183,11 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{
|
||||
altTextIndex=index;
|
||||
Attachment att=item.attachments.get(index);
|
||||
boolean hasAltText = !TextUtils.isEmpty(att.description);
|
||||
altTextButton.setVisibility(hasAltText && GlobalUserPreferences.showAltIndicator ? View.VISIBLE : View.GONE);
|
||||
noAltTextButton.setVisibility(!hasAltText && GlobalUserPreferences.showNoAltIndicator ? View.VISIBLE : View.GONE);
|
||||
altText.setVisibility(hasAltText && GlobalUserPreferences.showAltIndicator ? View.VISIBLE : View.GONE);
|
||||
noAltText.setVisibility(!hasAltText && GlobalUserPreferences.showNoAltIndicator ? View.VISIBLE : View.GONE);
|
||||
if ((hasAltText && !showAltIndicator) || (!hasAltText && !showNoAltIndicator)) return;
|
||||
altTextButton.setVisibility(hasAltText && showAltIndicator ? View.VISIBLE : View.GONE);
|
||||
noAltTextButton.setVisibility(!hasAltText && showNoAltIndicator ? View.VISIBLE : View.GONE);
|
||||
altText.setVisibility(hasAltText && showAltIndicator ? View.VISIBLE : View.GONE);
|
||||
noAltText.setVisibility(!hasAltText && showNoAltIndicator ? View.VISIBLE : View.GONE);
|
||||
altText.setText(att.description);
|
||||
altTextWrapper.setVisibility(View.VISIBLE);
|
||||
altTextWrapper.setBackgroundResource(hasAltText ? R.drawable.bg_image_alt_overlay : R.drawable.bg_image_no_alt_overlay);
|
||||
@@ -202,15 +203,16 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{
|
||||
btnL-=loc[0];
|
||||
btnT-=loc[1];
|
||||
|
||||
ViewGroup.MarginLayoutParams margins = (ViewGroup.MarginLayoutParams) altTextWrapper.getLayoutParams();
|
||||
ArrayList<Animator> anims=new ArrayList<>();
|
||||
anims.add(ObjectAnimator.ofFloat(altTextButton, View.ALPHA, 1, 0));
|
||||
anims.add(ObjectAnimator.ofFloat(noAltTextButton, View.ALPHA, 1, 0));
|
||||
anims.add(ObjectAnimator.ofFloat(altTextScroller, View.ALPHA, 0, 1));
|
||||
anims.add(ObjectAnimator.ofFloat(altTextClose, View.ALPHA, 0, 1));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "left", btnL+altWrapPadding[0], altTextWrapper.getLeft()));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "top", btnT+altWrapPadding[1], altTextWrapper.getTop()));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "right", btnL+v.getWidth()-altWrapPadding[2], altTextWrapper.getRight()));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "bottom", btnT+v.getHeight()-altWrapPadding[3], altTextWrapper.getBottom()));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "left", btnL+margins.leftMargin, altTextWrapper.getLeft()));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "top", btnT+margins.topMargin, altTextWrapper.getTop()));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "right", btnL+v.getWidth()-margins.rightMargin, altTextWrapper.getRight()));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "bottom", btnT+v.getHeight()-margins.bottomMargin, altTextWrapper.getBottom()));
|
||||
for(Animator a:anims)
|
||||
a.setDuration(300);
|
||||
|
||||
@@ -252,8 +254,7 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{
|
||||
boolean hasAltText = !TextUtils.isEmpty(item.attachments.get(i).description);
|
||||
if(c.btnsWrap!=null
|
||||
&& c.btnsWrap!=btn
|
||||
&& ((hasAltText && GlobalUserPreferences.showAltIndicator)
|
||||
|| (!hasAltText && GlobalUserPreferences.showNoAltIndicator))
|
||||
&& ((hasAltText && showAltIndicator) || (!hasAltText && showNoAltIndicator))
|
||||
) c.btnsWrap.setVisibility(View.VISIBLE);
|
||||
i++;
|
||||
}
|
||||
@@ -265,15 +266,16 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{
|
||||
btnL-=loc[0];
|
||||
btnT-=loc[1];
|
||||
|
||||
ViewGroup.MarginLayoutParams margins = (ViewGroup.MarginLayoutParams) altTextWrapper.getLayoutParams();
|
||||
ArrayList<Animator> anims=new ArrayList<>();
|
||||
anims.add(ObjectAnimator.ofFloat(altTextButton, View.ALPHA, 1));
|
||||
anims.add(ObjectAnimator.ofFloat(noAltTextButton, View.ALPHA, 1));
|
||||
anims.add(ObjectAnimator.ofFloat(altTextScroller, View.ALPHA, 0));
|
||||
anims.add(ObjectAnimator.ofFloat(altTextClose, View.ALPHA, 0));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "left", btnL+altWrapPadding[0]));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "top", btnT+altWrapPadding[1]));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "right", btnL+btn.getWidth()-altWrapPadding[2]));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "bottom", btnT+btn.getHeight()-altWrapPadding[3]));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "left", btnL+margins.leftMargin));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "top", btnT+margins.topMargin));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "right", btnL+btn.getWidth()-margins.rightMargin));
|
||||
anims.add(ObjectAnimator.ofInt(altTextWrapper, "bottom", btnT+btn.getHeight()-margins.bottomMargin));
|
||||
for(Animator a:anims)
|
||||
a.setDuration(300);
|
||||
|
||||
|
||||
@@ -81,18 +81,10 @@ public abstract class StatusDisplayItem{
|
||||
};
|
||||
}
|
||||
|
||||
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment<?> fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean addFooter, Notification notification){
|
||||
return buildItems(fragment, status, accountID, parentObject, knownAccounts, inset, addFooter, notification, false, Filter.FilterContext.HOME);
|
||||
}
|
||||
|
||||
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment<?> fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean addFooter, Notification notification, Filter.FilterContext filterContext){
|
||||
return buildItems(fragment, status, accountID, parentObject, knownAccounts, inset, addFooter, notification, false, filterContext);
|
||||
}
|
||||
|
||||
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment<?> fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean addFooter, Notification notification, boolean disableTranslate){
|
||||
return buildItems(fragment, status, accountID, parentObject, knownAccounts, inset, addFooter, notification, disableTranslate, Filter.FilterContext.HOME);
|
||||
}
|
||||
|
||||
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment<?> fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean addFooter, Notification notification, boolean disableTranslate, Filter.FilterContext filterContext){
|
||||
String parentID=parentObject.getID();
|
||||
ArrayList<StatusDisplayItem> items=new ArrayList<>();
|
||||
@@ -102,12 +94,8 @@ public abstract class StatusDisplayItem{
|
||||
args.putString("account", accountID);
|
||||
ScheduledStatus scheduledStatus = parentObject instanceof ScheduledStatus ? (ScheduledStatus) parentObject : null;
|
||||
|
||||
List<Filter> filters = AccountSessionManager.getInstance().getAccount(accountID).wordFilters.stream()
|
||||
.filter(f -> f.context.contains(filterContext)).collect(Collectors.toList());
|
||||
StatusFilterPredicate filterPredicate = new StatusFilterPredicate(filters);
|
||||
|
||||
if (!statusForContent.filterRevealed) {
|
||||
statusForContent.filterRevealed = filterPredicate.testWithWarning(status);
|
||||
statusForContent.filterRevealed = new StatusFilterPredicate(accountID, filterContext, Filter.FilterAction.WARN).test(status);
|
||||
}
|
||||
|
||||
ReblogOrReplyLineStatusDisplayItem replyLine = null;
|
||||
@@ -201,8 +189,6 @@ public abstract class StatusDisplayItem{
|
||||
}
|
||||
if(addFooter){
|
||||
items.add(new FooterStatusDisplayItem(parentID, fragment, statusForContent, accountID));
|
||||
if(status.hasGapAfter && !(fragment instanceof ThreadFragment))
|
||||
items.add(new GapStatusDisplayItem(parentID, fragment));
|
||||
}
|
||||
int i=1;
|
||||
for(StatusDisplayItem item:items){
|
||||
@@ -210,13 +196,16 @@ public abstract class StatusDisplayItem{
|
||||
item.index=i++;
|
||||
}
|
||||
|
||||
if (!statusForContent.filterRevealed) {
|
||||
return new ArrayList<>(List.of(
|
||||
new WarningFilteredStatusDisplayItem(parentID, fragment, statusForContent, items)
|
||||
));
|
||||
ArrayList<StatusDisplayItem> result = statusForContent.filterRevealed ? items :
|
||||
new ArrayList<>(List.of(new WarningFilteredStatusDisplayItem(parentID, fragment, statusForContent, items)));
|
||||
|
||||
if (addFooter && status.hasGapAfter && !(fragment instanceof ThreadFragment)) {
|
||||
StatusDisplayItem gap = new GapStatusDisplayItem(parentID, fragment);
|
||||
gap.index = i++;
|
||||
result.add(gap);
|
||||
}
|
||||
|
||||
return items;
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void buildPollItems(String parentID, BaseStatusListFragment fragment, Poll poll, List<StatusDisplayItem> items){
|
||||
|
||||
@@ -29,6 +29,16 @@ public class CustomEmojiHelper{
|
||||
}
|
||||
}
|
||||
|
||||
public void addText(CharSequence text) {
|
||||
if(!(text instanceof Spanned))
|
||||
return;
|
||||
CustomEmojiSpan[] spans=((Spanned) text).getSpans(0, text.length(), CustomEmojiSpan.class);
|
||||
for(List<CustomEmojiSpan> group:Arrays.stream(spans).collect(Collectors.groupingBy(s->s.emoji)).values()){
|
||||
this.spans.add(group);
|
||||
requests.add(group.get(0).createImageLoaderRequest());
|
||||
}
|
||||
}
|
||||
|
||||
public int getImageCount(){
|
||||
return requests.size();
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ public class MediaAttachmentViewController{
|
||||
public final MediaGridStatusDisplayItem.GridItemType type;
|
||||
public final ImageView photo;
|
||||
public final View altButton, noAltButton, btnsWrap;
|
||||
public static int[] altWrapPadding = null;
|
||||
private BlurhashCrossfadeDrawable crossfadeDrawable=new BlurhashCrossfadeDrawable();
|
||||
private final Context context;
|
||||
private boolean didClear;
|
||||
@@ -37,9 +36,6 @@ public class MediaAttachmentViewController{
|
||||
btnsWrap=view.findViewById(R.id.alt_badges);
|
||||
this.type=type;
|
||||
this.context=context;
|
||||
if (altWrapPadding == null) {
|
||||
altWrapPadding = new int[] { btnsWrap.getPaddingLeft(), btnsWrap.getPaddingTop(), btnsWrap.getPaddingRight(), btnsWrap.getPaddingBottom() };
|
||||
}
|
||||
}
|
||||
|
||||
public void bind(Attachment attachment, Status status){
|
||||
|
||||
@@ -6,6 +6,8 @@ import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import me.grishka.appkit.utils.V;
|
||||
|
||||
/**
|
||||
* A LinearLayout for TextViews. First child TextView will get truncated if it doesn't fit, remaining will always wrap content.
|
||||
*/
|
||||
@@ -36,7 +38,8 @@ public class HeaderSubtitleLinearLayout extends LinearLayout{
|
||||
}
|
||||
View first=getChildAt(0);
|
||||
if(first instanceof TextView){
|
||||
((TextView) first).setMaxWidth(remainingWidth);
|
||||
// guaranteeing at least 64dp of width for the display name
|
||||
((TextView) first).setMaxWidth(Math.max(remainingWidth, V.dp(64)));
|
||||
}
|
||||
}else{
|
||||
View first=getChildAt(0);
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -8,52 +8,53 @@ import java.time.Instant;
|
||||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class StatusFilterPredicate implements Predicate<Status>{
|
||||
private final List<Filter> filters;
|
||||
private final Filter.FilterContext context;
|
||||
private final Filter.FilterAction action;
|
||||
|
||||
public StatusFilterPredicate(List<Filter> filters){
|
||||
public StatusFilterPredicate(List<Filter> filters, Filter.FilterContext context){
|
||||
this.filters=filters;
|
||||
this.context = context;
|
||||
this.action = Filter.FilterAction.HIDE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param context null makes the predicate pass automatically
|
||||
*/
|
||||
public StatusFilterPredicate(String accountID, Filter.FilterContext context){
|
||||
this(accountID, context, Filter.FilterAction.HIDE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param context null makes the predicate pass automatically
|
||||
* @param action defines what the predicate should check:
|
||||
* should not be hidden or should not display with warning
|
||||
*/
|
||||
public StatusFilterPredicate(String accountID, Filter.FilterContext context, Filter.FilterAction action){
|
||||
filters=AccountSessionManager.getInstance().getAccount(accountID).wordFilters.stream().filter(f->f.context.contains(context)).collect(Collectors.toList());
|
||||
this.context = context;
|
||||
this.action = action;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(Status status){
|
||||
if(status.filtered!=null){
|
||||
if (status.filtered.isEmpty()){
|
||||
return true;
|
||||
}
|
||||
boolean matches=status.filtered.stream()
|
||||
.map(filterResult->filterResult.filter)
|
||||
.filter(filter->filter.expiresAt==null||filter.expiresAt.isAfter(Instant.now()))
|
||||
.anyMatch(filter->filter.filterAction==Filter.FilterAction.HIDE);
|
||||
return !matches;
|
||||
}
|
||||
for(Filter filter:filters){
|
||||
if(filter.matches(status))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (context == null) return true;
|
||||
|
||||
public boolean testWithWarning(Status status) {
|
||||
if(status.filtered!=null){
|
||||
if (status.filtered.isEmpty()){
|
||||
return true;
|
||||
}
|
||||
boolean matches=status.filtered.stream()
|
||||
.map(filterResult->filterResult.filter)
|
||||
Stream<Filter> stream = status.filtered != null
|
||||
// use server-provided per-status info (status.filtered) if available
|
||||
? status.filtered.stream().map(f -> f.filter)
|
||||
// or fall back to cached filters
|
||||
: filters.stream().filter(filter -> filter.matches(status));
|
||||
|
||||
return stream
|
||||
// discard expired filters
|
||||
.filter(filter -> filter.expiresAt == null || filter.expiresAt.isAfter(Instant.now()))
|
||||
.anyMatch(filter->filter.filterAction==Filter.FilterAction.WARN);
|
||||
return !matches;
|
||||
}
|
||||
for(Filter filter:filters){
|
||||
if(filter.matches(status))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
// only apply filters for given context
|
||||
.filter(filter -> filter.context.contains(context))
|
||||
// treating filterAction = null (from filters list) as FilterAction.HIDE
|
||||
.noneMatch(filter -> filter.filterAction == null ? action == Filter.FilterAction.HIDE : filter.filterAction == action);
|
||||
}
|
||||
}
|
||||
|
||||
4
mastodon/src/main/res/color/m3_on_surface_overlay.xml
Normal file
4
mastodon/src/main/res/color/m3_on_surface_overlay.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:color="?colorM3OnSurface" android:alpha="0.12"/>
|
||||
</selector>
|
||||
@@ -2,8 +2,14 @@
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<shape>
|
||||
<solid android:color="?colorWindowBackground"/>
|
||||
<corners android:topLeftRadius="12dp" android:topRightRadius="12dp"/>
|
||||
<solid android:color="?colorM3Surface"/>
|
||||
<corners android:topLeftRadius="28dp" android:topRightRadius="28dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape android:tint="?colorM3Primary">
|
||||
<solid android:color="#0D000000"/>
|
||||
<corners android:topLeftRadius="28dp" android:topRightRadius="28dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</layer-list>
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:gravity="center" android:width="36dp" android:height="4dp">
|
||||
<shape>
|
||||
<solid android:color="?android:textColorSecondary"/>
|
||||
<item android:gravity="center" android:width="32dp" android:height="4dp">
|
||||
<shape android:tint="?colorM3Outline">
|
||||
<solid android:color="#66000000"/>
|
||||
<corners android:radius="2dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
25
mastodon/src/main/res/drawable/bg_button_m3_outlined.xml
Normal file
25
mastodon/src/main/res/drawable/bg_button_m3_outlined.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple android:color="@color/m3_primary_overlay" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<selector>
|
||||
<item android:state_enabled="true">
|
||||
<shape>
|
||||
<stroke android:color="?colorM3Outline" android:width="1dp"/>
|
||||
<corners android:radius="20dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape>
|
||||
<stroke android:color="@color/m3_on_surface_overlay" android:width="1dp"/>
|
||||
<corners android:radius="20dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
</item>
|
||||
<item android:id="@android:id/mask">
|
||||
<shape>
|
||||
<solid android:color="#000"/>
|
||||
<corners android:radius="20dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple android:color="#1effffff" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<selector>
|
||||
<item android:state_enabled="true">
|
||||
<shape>
|
||||
<stroke android:color="?colorM3Outline" android:width="1dp"/>
|
||||
<corners android:radius="20dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape>
|
||||
<stroke android:color="@color/m3_on_surface_overlay" android:width="1dp"/>
|
||||
<corners android:radius="20dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
</item>
|
||||
<item android:id="@android:id/mask">
|
||||
<shape>
|
||||
<solid android:color="#000"/>
|
||||
<corners android:radius="20dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple android:color="#1effffff" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@android:id/mask">
|
||||
<shape>
|
||||
<solid android:color="#000"/>
|
||||
<corners android:radius="20dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
||||
@@ -0,0 +1,3 @@
|
||||
<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.063 8.445c1.256 1.258 1.255 3.295-0.002 4.551l-7.114 7.102c-0.271 0.272-0.608 0.469-0.978 0.573l-4.613 1.303c-0.57 0.162-1.094-0.373-0.92-0.94l1.387-4.543c0.107-0.354 0.3-0.675 0.562-0.936l7.124-7.112c1.258-1.256 3.297-1.255 4.554 0.002zM8.15 2.37L8.2 2.475l3.253 8.249-1.157 1.155L9.556 10H5.443l-0.995 2.52c-0.14 0.354-0.518 0.542-0.876 0.454l-0.098-0.031c-0.353-0.14-0.54-0.518-0.452-0.876l0.03-0.098 3.754-9.495C7.042 1.88 7.85 1.844 8.151 2.37zM7.503 4.792L6.036 8.5h2.928L7.503 4.792z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<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.063 8.445c1.256 1.258 1.255 3.295-0.002 4.551l-7.123 7.112c-0.263 0.262-0.587 0.455-0.943 0.562l-4.293 1.29c-0.529 0.159-1.086-0.141-1.245-0.67-0.058-0.194-0.056-0.402 0.006-0.594l1.361-4.228c0.11-0.34 0.3-0.65 0.552-0.903l7.133-7.121c1.258-1.256 3.297-1.255 4.554 0.002zm-3.494 1.06l-7.133 7.12c-0.084 0.085-0.147 0.188-0.184 0.301l-1.07 3.323 3.382-1.015c0.119-0.036 0.227-0.1 0.314-0.188L19 11.936c0.672-0.671 0.672-1.76 0.002-2.43-0.672-0.672-1.76-0.673-2.433-0.002zM8.15 2.37L8.2 2.475l3.253 8.249-1.157 1.155L9.556 10H5.443l-0.995 2.52c-0.14 0.354-0.518 0.542-0.876 0.454l-0.098-0.031c-0.353-0.14-0.54-0.518-0.452-0.876l0.03-0.098 3.754-9.495C7.042 1.88 7.85 1.844 8.151 2.37zM7.503 4.792L6.036 8.5h2.928L7.503 4.792z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--~ Copyright (c) 2023. ~ Microsoft Corporation. All rights reserved.-->
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/ic_fluent_text_edit_style_24_filled" android:state_activated="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_text_edit_style_24_filled" android:state_checked="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_text_edit_style_24_filled" android:state_selected="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_text_edit_style_24_regular"/>
|
||||
</selector>
|
||||
27
mastodon/src/main/res/drawable/splash_logo.xml
Normal file
27
mastodon/src/main/res/drawable/splash_logo.xml
Normal file
@@ -0,0 +1,27 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="134dp"
|
||||
android:height="34dp"
|
||||
android:viewportWidth="313"
|
||||
android:viewportHeight="81">
|
||||
<path
|
||||
android:pathData="M72.95,18.45C71.82,9.95 64.5,3.24 55.85,1.95C54.38,1.73 48.85,0.93 36.02,0.93H35.92C23.09,0.93 20.34,1.73 18.87,1.95C10.44,3.22 2.76,9.23 0.88,17.84C-0,22.08 -0.1,26.78 0.07,31.09C0.31,37.27 0.36,43.43 0.91,49.6C1.29,53.69 1.95,57.74 2.9,61.73C4.68,69.11 11.86,75.25 18.9,77.75C26.43,80.35 34.53,80.79 42.29,79C43.14,78.79 43.98,78.56 44.82,78.29C46.71,77.68 48.92,77 50.55,75.81C50.57,75.8 50.59,75.77 50.6,75.75C50.61,75.72 50.62,75.7 50.62,75.66V69.7C50.62,69.7 50.62,69.65 50.6,69.62C50.6,69.6 50.57,69.58 50.55,69.56C50.53,69.55 50.5,69.54 50.48,69.53C50.45,69.53 50.43,69.53 50.41,69.53C45.43,70.73 40.33,71.34 35.23,71.33C26.43,71.33 24.06,67.09 23.39,65.34C22.85,63.82 22.5,62.22 22.36,60.61C22.36,60.59 22.36,60.57 22.37,60.54C22.37,60.52 22.39,60.49 22.42,60.48C22.44,60.47 22.46,60.46 22.49,60.44H22.57C27.46,61.64 32.48,62.25 37.51,62.25C38.72,62.25 39.92,62.25 41.14,62.21C46.19,62.06 51.52,61.81 56.51,60.82C56.63,60.8 56.76,60.77 56.87,60.75C64.72,59.21 72.19,54.42 72.95,42.27C72.97,41.79 73.04,37.25 73.04,36.76C73.04,35.07 73.58,24.79 72.96,18.48L72.95,18.45Z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startX="36.62"
|
||||
android:startY="0.93"
|
||||
android:endX="36.62"
|
||||
android:endY="80.07"
|
||||
android:type="linear">
|
||||
<item android:offset="0" android:color="#FF6364FF"/>
|
||||
<item android:offset="1" android:color="#FF563ACC"/>
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:pathData="M14.81,23.2C14.81,20.72 16.77,18.72 19.2,18.72C21.62,18.72 23.58,20.73 23.58,23.2C23.58,25.67 21.62,27.68 19.2,27.68C16.77,27.68 14.81,25.67 14.81,23.2Z"
|
||||
android:fillColor="#fff"/>
|
||||
<path
|
||||
android:pathData="M80.02,27.06V47.66H72.03V27.67C72.03,23.45 70.3,21.32 66.83,21.32C63,21.32 61.07,23.87 61.07,28.87V39.82H53.14V28.87C53.14,23.84 51.24,21.32 47.38,21.32C43.92,21.32 42.18,23.45 42.18,27.67V47.65H34.21V27.06C34.21,22.86 35.25,19.51 37.35,17.03C39.53,14.54 42.37,13.29 45.89,13.29C49.97,13.29 53.07,14.9 55.11,18.11L57.11,21.52L59.1,18.11C61.14,14.91 64.23,13.29 68.32,13.29C71.84,13.29 74.69,14.55 76.86,17.03C78.96,19.51 80.01,22.83 80.01,27.06H80.02ZM107.49,37.3C109.15,35.51 109.93,33.29 109.93,30.59C109.93,27.89 109.14,25.65 107.49,23.94C105.91,22.15 103.89,21.3 101.45,21.3C99.02,21.3 97.01,22.15 95.41,23.94C93.83,25.65 93.04,27.89 93.04,30.59C93.04,33.29 93.83,35.53 95.41,37.3C97,39 99.02,39.87 101.45,39.87C103.89,39.87 105.9,39.02 107.49,37.3ZM109.93,14.12H117.8V47.06H109.93V43.18C107.55,46.41 104.26,48 99.99,48C95.71,48 92.42,46.36 89.5,43C86.64,39.64 85.18,35.48 85.18,30.61C85.18,25.74 86.65,21.65 89.5,18.29C92.43,14.93 95.92,13.23 99.99,13.23C104.06,13.23 107.55,14.81 109.93,18.02V14.14V14.12ZM144.26,29.97C146.58,31.76 147.73,34.25 147.67,37.41C147.67,40.77 146.52,43.41 144.14,45.24C141.76,47.03 138.89,47.94 135.41,47.94C129.13,47.94 124.87,45.3 122.61,40.11L129.43,35.96C130.34,38.78 132.35,40.25 135.41,40.25C138.22,40.25 139.62,39.33 139.62,37.42C139.62,36.03 137.79,34.78 134.07,33.8C132.66,33.41 131.5,33.01 130.6,32.68C129.31,32.16 128.22,31.56 127.31,30.83C125.05,29.04 123.9,26.68 123.9,23.65C123.9,20.42 124.99,17.85 127.19,16C129.45,14.09 132.19,13.18 135.48,13.18C140.73,13.18 144.56,15.48 147.07,20.16L140.37,24.1C139.4,21.86 137.74,20.74 135.48,20.74C133.11,20.74 131.95,21.65 131.95,23.44C131.95,24.83 133.78,26.08 137.5,27.06C140.37,27.72 142.63,28.7 144.26,29.97H144.27H144.26ZM169.26,22.27H162.37V35.98C162.37,37.63 162.98,38.63 164.15,39.08C165,39.4 166.71,39.47 169.27,39.34V47.05C163.98,47.71 160.14,47.17 157.88,45.41C155.62,43.7 154.53,40.53 154.53,36V22.27H149.23V14.1H154.53V7.46L162.39,4.89V14.12H169.29V22.29H169.27L169.26,22.27ZM194.34,37.1C195.92,35.4 196.71,33.22 196.71,30.58C196.71,27.94 195.92,25.78 194.34,24.05C192.74,22.35 190.79,21.48 188.42,21.48C186.04,21.48 184.09,22.33 182.49,24.05C180.97,25.84 180.18,28 180.18,30.58C180.18,33.16 180.97,35.31 182.49,37.1C184.08,38.81 186.04,39.67 188.42,39.67C190.79,39.67 192.74,38.82 194.34,37.1ZM176.96,42.96C173.85,39.6 172.32,35.52 172.32,30.58C172.32,25.63 173.85,21.62 176.96,18.26C180.07,14.9 183.91,13.19 188.42,13.19C192.92,13.19 196.77,14.9 199.87,18.26C202.97,21.62 204.57,25.77 204.57,30.58C204.57,35.39 202.97,39.6 199.87,42.96C196.76,46.32 192.98,47.96 188.42,47.96C183.85,47.96 180.06,46.32 176.96,42.96ZM230.86,37.29C232.45,35.5 233.24,33.28 233.24,30.58C233.24,27.87 232.45,25.63 230.86,23.93C229.28,22.14 227.26,21.29 224.82,21.29C222.39,21.29 220.37,22.14 218.73,23.93C217.14,25.63 216.35,27.87 216.35,30.58C216.35,33.28 217.14,35.52 218.73,37.29C220.38,38.99 222.45,39.86 224.82,39.86C227.2,39.86 229.27,39 230.86,37.29ZM233.24,0.92H241.11V47.05H233.24V43.17C230.93,46.39 227.63,47.99 223.36,47.99C219.09,47.99 215.75,46.35 212.8,42.98C209.93,39.62 208.48,35.47 208.48,30.6C208.48,25.73 209.95,21.64 212.8,18.28C215.72,14.92 219.26,13.22 223.36,13.22C227.45,13.22 230.93,14.8 233.24,18.01V0.93V0.92ZM268.74,37.07C270.32,35.36 271.12,33.18 271.12,30.54C271.12,27.9 270.32,25.74 268.74,24.01C267.15,22.31 265.21,21.45 262.82,21.45C260.43,21.45 258.5,22.3 256.9,24.01C255.37,25.8 254.58,27.96 254.58,30.54C254.58,33.12 255.37,35.28 256.9,37.07C258.48,38.77 260.44,39.64 262.82,39.64C265.2,39.64 267.14,38.78 268.74,37.07ZM251.36,42.92C248.26,39.56 246.73,35.48 246.73,30.54C246.73,25.6 248.25,21.58 251.36,18.22C254.47,14.86 258.32,13.15 262.82,13.15C267.32,13.15 271.18,14.86 274.27,18.22C277.38,21.58 278.97,25.73 278.97,30.54C278.97,35.35 277.38,39.56 274.27,42.92C271.16,46.28 267.38,47.93 262.82,47.93C258.26,47.93 254.46,46.28 251.36,42.92ZM313,26.78V47.01H305.14V27.84C305.14,25.66 304.59,24.01 303.48,22.77C302.45,21.65 300.98,21.07 299.09,21.07C294.65,21.07 292.39,23.77 292.39,29.24V47.03H284.53V14.1H292.39V17.81C294.28,14.71 297.28,13.19 301.47,13.19C304.82,13.19 307.57,14.37 309.71,16.81C311.91,19.24 313,22.54 313,26.82"
|
||||
android:fillColor="#fff"/>
|
||||
</vector>
|
||||
@@ -27,7 +27,7 @@
|
||||
android:gravity="center"
|
||||
android:includeFontPadding="false"
|
||||
android:paddingHorizontal="5dp"
|
||||
android:paddingVertical="1dp"
|
||||
android:paddingVertical="2dp"
|
||||
android:background="@drawable/bg_image_alt_overlay"
|
||||
android:text="@string/sk_alt_button"/>
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="13dp"
|
||||
android:paddingEnd="4dp"
|
||||
android:paddingStart="16dp">
|
||||
|
||||
@@ -11,6 +10,7 @@
|
||||
android:id="@+id/more"
|
||||
android:layout_width="36dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginTop="13dp"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:background="?android:actionBarItemBackground"
|
||||
@@ -23,6 +23,7 @@
|
||||
android:id="@+id/delete_notification"
|
||||
android:layout_width="36dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginTop="13dp"
|
||||
android:layout_toStartOf="@id/more"
|
||||
android:visibility="gone"
|
||||
android:background="?android:actionBarItemBackground"
|
||||
@@ -36,6 +37,7 @@
|
||||
android:id="@+id/visibility"
|
||||
android:layout_width="36dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginTop="13dp"
|
||||
android:layout_toStartOf="@id/delete_notification"
|
||||
android:background="?android:actionBarItemBackground"
|
||||
android:scaleType="center"
|
||||
@@ -46,6 +48,7 @@
|
||||
android:id="@+id/collapse_btn"
|
||||
android:layout_width="36dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginTop="13dp"
|
||||
android:layout_toStartOf="@id/visibility"
|
||||
android:background="?android:actionBarItemBackground"
|
||||
android:visibility="gone"
|
||||
@@ -70,6 +73,7 @@
|
||||
android:id="@+id/unread_indicator"
|
||||
android:layout_width="36dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginTop="13dp"
|
||||
android:layout_toStartOf="@id/collapse_btn"
|
||||
android:visibility="gone"
|
||||
android:tint="?android:colorAccent"
|
||||
@@ -83,18 +87,16 @@
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginTop="3dp" />
|
||||
android:layout_marginTop="16dp" />
|
||||
|
||||
<org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout
|
||||
android:id="@+id/name_wrap"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginTop="3dp"
|
||||
android:paddingTop="3sp"
|
||||
android:layout_toStartOf="@id/unread_indicator"
|
||||
android:layout_toEndOf="@id/avatar"
|
||||
android:minHeight="24sp">
|
||||
android:layout_above="@+id/username_wrap">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
@@ -121,13 +123,15 @@
|
||||
</org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout>
|
||||
|
||||
<org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout
|
||||
android:id="@id/username_wrap"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/name_wrap"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_toStartOf="@id/unread_indicator"
|
||||
android:layout_toEndOf="@id/avatar"
|
||||
android:layout_alignBottom="@id/avatar"
|
||||
android:layoutDirection="locale"
|
||||
android:paddingBottom="3sp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
|
||||
@@ -73,7 +73,6 @@
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:paddingLeft="16dp">
|
||||
|
||||
@@ -81,6 +80,7 @@
|
||||
android:id="@+id/self_avatar"
|
||||
android:layout_width="46sp"
|
||||
android:layout_height="46sp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_marginEnd="12dp" />
|
||||
@@ -90,8 +90,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toEndOf="@id/self_avatar"
|
||||
android:paddingTop="3sp"
|
||||
android:minHeight="24sp"
|
||||
android:layout_above="@+id/self_username"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="@style/m3_title_medium"
|
||||
@@ -103,7 +102,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8sp"
|
||||
android:layout_toEndOf="@id/self_name"
|
||||
android:paddingTop="3sp"
|
||||
android:layout_above="@id/self_username"
|
||||
android:ellipsize="end"
|
||||
android:fontFamily="sans-serif"
|
||||
android:singleLine="true"
|
||||
@@ -112,14 +111,15 @@
|
||||
tools:text="@string/sk_local_only" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/self_username"
|
||||
android:id="@id/self_username"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/self_name"
|
||||
android:layout_toEndOf="@id/self_avatar"
|
||||
android:layout_alignBottom="@id/self_avatar"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="@style/m3_title_small"
|
||||
android:paddingBottom="3sp"
|
||||
tools:text="\@Gargron" />
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -416,6 +416,19 @@
|
||||
android:tooltipText="@string/post_visibility"
|
||||
android:src="@drawable/ic_fluent_earth_24_regular"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/btn_content_type"
|
||||
android:layout_width="36dp"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:background="?android:attr/actionBarItemBackground"
|
||||
android:padding="0px"
|
||||
android:tint="@color/compose_button"
|
||||
android:tintMode="src_in"
|
||||
android:contentDescription="@string/sk_content_type"
|
||||
android:tooltipText="@string/sk_content_type"
|
||||
android:src="@drawable/ic_fluent_text_edit_style_24_selector"/>
|
||||
|
||||
<Space
|
||||
android:layout_width="0px"
|
||||
android:layout_height="1px"
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
android:clipToPadding="false">
|
||||
android:clipToPadding="false"
|
||||
android:theme="@style/Theme.Mastodon.Dark.SplashFragment">
|
||||
|
||||
<View
|
||||
android:id="@+id/blue_fill"
|
||||
@@ -26,7 +27,8 @@
|
||||
android:id="@+id/art_clouds"
|
||||
android:layout_width="414dp"
|
||||
android:layout_height="541dp"
|
||||
android:layout_marginTop="91dp"
|
||||
android:layout_marginTop="37dp"
|
||||
android:layout_marginLeft="-27dp"
|
||||
android:layout_gravity="top|left"
|
||||
android:alpha="0.3"
|
||||
android:importantForAccessibility="no"
|
||||
@@ -36,8 +38,8 @@
|
||||
android:id="@+id/art_plane_elephant"
|
||||
android:layout_width="245.64dp"
|
||||
android:layout_height="72.65dp"
|
||||
android:layout_marginLeft="-101.55dp"
|
||||
android:layout_marginTop="238.12dp"
|
||||
android:layout_marginLeft="-50.775dp"
|
||||
android:layout_marginTop="184.12dp"
|
||||
android:layout_gravity="left|top"
|
||||
android:alpha="0.3"
|
||||
android:importantForAccessibility="no"
|
||||
@@ -48,8 +50,8 @@
|
||||
android:layout_width="150.84dp"
|
||||
android:layout_height="176.44dp"
|
||||
android:layout_gravity="top|left"
|
||||
android:layout_marginLeft="322dp"
|
||||
android:layout_marginTop="310dp"
|
||||
android:layout_marginLeft="278dp"
|
||||
android:layout_marginTop="244dp"
|
||||
android:importantForAccessibility="no"
|
||||
android:src="@drawable/splash_art_layer1"/>
|
||||
|
||||
@@ -58,7 +60,8 @@
|
||||
android:layout_width="197.2dp"
|
||||
android:layout_height="153.61dp"
|
||||
android:layout_gravity="top|left"
|
||||
android:layout_marginTop="294dp"
|
||||
android:layout_marginTop="252dp"
|
||||
android:layout_marginLeft="-44dp"
|
||||
android:importantForAccessibility="no"
|
||||
android:src="@drawable/splash_art_layer2"/>
|
||||
|
||||
@@ -67,7 +70,8 @@
|
||||
android:layout_width="400dp"
|
||||
android:layout_height="346dp"
|
||||
android:layout_gravity="top|left"
|
||||
android:layout_marginTop="294dp"
|
||||
android:layout_marginTop="240dp"
|
||||
android:layout_marginLeft="-20dp"
|
||||
android:importantForAccessibility="no"
|
||||
android:src="@drawable/splash_art_layer3"/>
|
||||
|
||||
@@ -87,59 +91,107 @@
|
||||
android:clipToPadding="false"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.viewpager2.widget.ViewPager2
|
||||
android:id="@+id/pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
<ImageView
|
||||
android:layout_width="300dp"
|
||||
android:layout_height="78dp"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="32dp"
|
||||
android:importantForAccessibility="no"
|
||||
android:src="@drawable/splash_logo"/>
|
||||
|
||||
<Space
|
||||
android:layout_width="1px"
|
||||
android:layout_height="0px"
|
||||
android:layout_weight="1"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/pager_dots"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<View
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:background="@drawable/white_circle"/>
|
||||
|
||||
<View
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:alpha="0.3"
|
||||
android:background="@drawable/white_circle"/>
|
||||
|
||||
<View
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:alpha="0.3"
|
||||
android:background="@drawable/white_circle"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_log_in"
|
||||
android:id="@+id/btn_join_default_server"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
style="@style/Widget.Mastodon.M3.Button.Text"
|
||||
android:textColor="#fff"
|
||||
android:text="@string/already_have_account"/>
|
||||
style="@style/Widget.Mastodon.M3.Button.Filled"
|
||||
tools:text="@string/join_default_server"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_get_started"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
style="@style/Widget.Mastodon.M3.Button.Filled"
|
||||
android:text="@string/get_started"/>
|
||||
android:layout_marginTop="8dp"
|
||||
android:textColor="#FFF"
|
||||
style="@style/Widget.Mastodon.M3.Button.Outlined"
|
||||
android:background="@drawable/bg_button_m3_outlined_white"
|
||||
android:text="@string/pick_server"/>
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:background="#B2FFFFFF"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="20dp"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginRight="8dp"
|
||||
android:textAllCaps="true"
|
||||
android:textAppearance="@style/m3_label_large"
|
||||
android:textColor="#B2FFFFFF"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/signup_or_login"/>
|
||||
|
||||
<View
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:background="#B2FFFFFF"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginRight="8dp">
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_learn_more"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_weight="1"
|
||||
android:textColor="#FFF"
|
||||
style="@style/Widget.Mastodon.M3.Button.Text"
|
||||
android:background="@drawable/bg_button_m3_text_white"
|
||||
android:text="@string/learn_more"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn_log_in"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_weight="1"
|
||||
android:textColor="#FFF"
|
||||
style="@style/Widget.Mastodon.M3.Button.Text"
|
||||
android:background="@drawable/bg_button_m3_text_white"
|
||||
android:text="@string/log_in"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</org.joinmastodon.android.ui.views.SizeListenerFrameLayout>
|
||||
50
mastodon/src/main/res/layout/intro_bottom_sheet.xml
Normal file
50
mastodon/src/main/res/layout/intro_bottom_sheet.xml
Normal file
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<LinearLayout
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/bg_bottom_sheet"
|
||||
android:padding="16dp">
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="4dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:background="@drawable/bg_bottom_sheet_handle"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="@style/m3_headline_medium"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
android:text="@string/welcome_to_mastodon"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:textAppearance="@style/m3_body_large"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
android:text="@string/welcome_paragraph1"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="24dp"
|
||||
android:textAppearance="@style/m3_headline_medium"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
android:text="@string/what_are_servers"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:textAppearance="@style/m3_body_large"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
android:text="@string/welcome_paragraph2"/>
|
||||
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
@@ -56,9 +56,9 @@
|
||||
<TextView
|
||||
android:id="@+id/username"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="20dp"
|
||||
android:layout_alignLeft="@id/name"
|
||||
android:layout_alignRight="@id/name"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignStart="@id/name"
|
||||
android:layout_alignEnd="@id/name"
|
||||
android:layout_below="@id/name"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
@@ -87,15 +87,18 @@
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingBottom="16dp"
|
||||
android:layout_marginStart="16dp">
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_gravity="bottom"
|
||||
android:paddingTop="4dp"
|
||||
android:gravity="center_vertical"
|
||||
android:minHeight="44dp">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/posts_btn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
@@ -122,7 +125,7 @@
|
||||
android:id="@+id/following_btn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical">
|
||||
@@ -149,7 +152,7 @@
|
||||
android:id="@+id/followers_btn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical">
|
||||
<TextView
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="32dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:importantForAccessibility="no"
|
||||
android:tint="?android:textColorPrimary"
|
||||
tools:src="@drawable/ic_fluent_color_24_regular"/>
|
||||
@@ -24,6 +24,7 @@
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:paddingVertical="8dp"
|
||||
android:gravity="center_vertical"
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
android:gravity="center"
|
||||
android:includeFontPadding="false"
|
||||
android:paddingHorizontal="5dp"
|
||||
android:paddingVertical="1dp"
|
||||
android:paddingVertical="2dp"
|
||||
android:text="@string/sk_alt_button"/>
|
||||
|
||||
<ImageButton
|
||||
|
||||
11
mastodon/src/main/res/menu/compose_content_type.xml
Normal file
11
mastodon/src/main/res/menu/compose_content_type.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<group android:id="@+id/content_type_group" android:checkableBehavior="single">
|
||||
<item android:id="@+id/content_type_null" android:title="@string/sk_content_type_unspecified" />
|
||||
<item android:id="@+id/content_type_plain" android:title="@string/sk_content_type_plain" />
|
||||
<item android:id="@+id/content_type_markdown" android:title="@string/sk_content_type_markdown" />
|
||||
<item android:id="@+id/content_type_html" android:title="@string/sk_content_type_html" />
|
||||
<item android:id="@+id/content_type_bbcode" android:title="@string/sk_content_type_bbcode" />
|
||||
<item android:id="@+id/content_type_misskey_markdown" android:title="@string/sk_content_type_mfm" />
|
||||
</group>
|
||||
</menu>
|
||||
@@ -10,13 +10,11 @@
|
||||
<string name="ok">حسنًا</string>
|
||||
<string name="preparing_auth">جَارٍ الإعدَادُ لِلمُصادَقَة…</string>
|
||||
<string name="finishing_auth">يُنهي المصادقة…</string>
|
||||
<string name="user_boosted">أعادَ %s تَدوينَها</string>
|
||||
<string name="in_reply_to">ردًا على %s</string>
|
||||
<string name="notifications">الإشعارات</string>
|
||||
<string name="user_followed_you">بَدَأ بِمُتابَعَتِك</string>
|
||||
<string name="user_sent_follow_request">أرسَلَ طَلَبًا لِمُتابَعَتِك</string>
|
||||
<string name="user_favorited">فَضَّلَ مَنشُورَك</string>
|
||||
<string name="notification_boosted">أعادَ تَدوينَ مَنشُورِك</string>
|
||||
<string name="poll_ended">انتهى استطلاعُ الرأي</string>
|
||||
<string name="time_seconds">%d ثا</string>
|
||||
<string name="time_minutes">%d د</string>
|
||||
@@ -222,7 +220,6 @@
|
||||
<string name="report_sent_subtitle">في أثناء مراجعتنا للبلاغ، يمكنك اتخاذ إجراء ضد @%s.</string>
|
||||
<string name="unfollow_user">ألغ متابعة %s</string>
|
||||
<string name="unfollow">ألغ المتابعة</string>
|
||||
<string name="mute_user_explain">لن ترى منشوراتهم أو إعادة تدوينهم في التغذية الرئيسية. ولن يعلموا أنهم كتموا.</string>
|
||||
<string name="block_user_explain">لن يتمكنوا من متابعتك أو رؤية منشوراتك، وسيكون بديهيًا لهم أنهم حجبوا.</string>
|
||||
<string name="report_personal_title">لاترغب في مشاهدة هذا؟</string>
|
||||
<string name="report_personal_subtitle">عندما ترى ما لا يعجبك في ماستدون، يمكنك إزالة صاحبها من تجربتك كمستخدم.</string>
|
||||
@@ -279,7 +276,6 @@
|
||||
<string name="skip">تخطى</string>
|
||||
<string name="notification_type_follow">متابعُون جُدُد</string>
|
||||
<string name="notification_type_favorite">المفضلة</string>
|
||||
<string name="notification_type_reblog">المعاد تدوينها</string>
|
||||
<string name="notification_type_mention">الذِكر</string>
|
||||
<string name="notification_type_poll">استطلاع رأي</string>
|
||||
<string name="choose_account">اختر حسابًا</string>
|
||||
@@ -310,7 +306,6 @@
|
||||
<string name="notify_none">لَا أحد</string>
|
||||
<string name="notify_favorites">بِالإعْجاب بِمَنشوري</string>
|
||||
<string name="notify_follow">بمتابعتي</string>
|
||||
<string name="notify_reblog">بإعادة تدوين مَنشوري</string>
|
||||
<string name="notify_mention">بِالإشارَةِ إليّ</string>
|
||||
<string name="settings_boring">المنطِقَةُ المُملَّة</string>
|
||||
<string name="settings_account">إعدادات الحساب</string>
|
||||
@@ -331,7 +326,6 @@
|
||||
<string name="hide_content">اخف المحتوى</string>
|
||||
<string name="new_post">منشور جديد</string>
|
||||
<string name="button_reply">ردّ</string>
|
||||
<string name="button_reblog">أعد تدوين</string>
|
||||
<string name="button_favorite">فضّل</string>
|
||||
<string name="button_share">شارك</string>
|
||||
<string name="media_no_description">وسائط بدون وصف</string>
|
||||
@@ -346,8 +340,6 @@
|
||||
<string name="unfollowed_user">ألغ متابعة %s</string>
|
||||
<string name="followed_user">أنت تتابع %s</string>
|
||||
<string name="open_in_browser">افتح في المتصفح</string>
|
||||
<string name="hide_boosts_from_user">اخف ما أعاد %s تدوينه</string>
|
||||
<string name="show_boosts_from_user">أظهر ما أعاد %s تدوينه</string>
|
||||
<string name="signup_reason">لماذا تريد الانضمام؟</string>
|
||||
<string name="signup_reason_note">هذا سوف يساعدنا في مراجعة تطبيقك.</string>
|
||||
<string name="clear">امسح</string>
|
||||
@@ -401,17 +393,8 @@
|
||||
<item quantity="many">%,d تفضيلًا</item>
|
||||
<item quantity="other">%,d تفضيل</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="zero">لا إعادات تدوين</item>
|
||||
<item quantity="one">إعاد تدوين واحدة</item>
|
||||
<item quantity="two">إعادتا تدوين</item>
|
||||
<item quantity="few">%,d إعادات تدوين</item>
|
||||
<item quantity="many">%,d إعادة تدوين</item>
|
||||
<item quantity="other">%,d إعادة تدوين</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s عبر %2$s</string>
|
||||
<string name="time_now">الآن</string>
|
||||
<string name="post_info_reblogs">إعادات التدوين</string>
|
||||
<string name="post_info_favorites">المفضلة</string>
|
||||
<string name="edit_history">تاريخ التعديل</string>
|
||||
<string name="last_edit_at_x">آخر تعديل %s</string>
|
||||
@@ -478,12 +461,6 @@
|
||||
<string name="login_title">مرحبا بك مجددًا</string>
|
||||
<string name="login_subtitle">قم بتسجيل الدخول باستخدام الخادم حيث قمتَ بإنشاء حسابك فيه.</string>
|
||||
<string name="server_url">رابط الخادم</string>
|
||||
<string name="welcome_page1_title">ما هو ماستدون؟</string>
|
||||
<string name="welcome_page1_text">تخيل أن لديك عنوان بريد إلكتروني ينتهي بـ @example.com.\n\n رغم ذلك يمكنك إرسال واستقبال رسائل البريد الإلكتروني من أي شخص، حتى إذا كان بريدهم الإلكتروني الخاص ينتهي بـ @gmail.com أو @icloud.com أو @example.com.</string>
|
||||
<string name="welcome_page2_title">ماستدون هكذا.</string>
|
||||
<string name="welcome_page2_text">قد يكون مُعرّفُك @gothgirl654@example.social ، ولكنه بإمكانك متابعة وإعادة تدوين ومحادثة @fallout5ever@example.online.</string>
|
||||
<string name="welcome_page3_title">كيف يمكنني اختيار خادم؟</string>
|
||||
<string name="welcome_page3_text">يختار الأشخاص المختلفون خوادم مختلفة لأي عدد من الأسباب. يعد art.example مكانًا رائعًا للفنانين ، بينما قد يكون glasgow.example اختيارًا جيدًا للاسكتلنديين. \n\n لا يمكنك أن تخطئ في أي من الخوادم التي نوصي بها ، لذلك بغض النظر عن أي واحد تختاره (أو إذا قمت بإدخال الخادم الخاص بك في شريط البحث) ، فلن يفوتك أي شيء في أي مكان.</string>
|
||||
<string name="signup_random_server_explain">سوف نختار خادماً بناءً على لغتك إذا قمت بالمتابعة دون إجراء إختيار.</string>
|
||||
<string name="server_filter_any_language">أي لغة</string>
|
||||
<string name="server_filter_instant_signup">تسجيل فوري</string>
|
||||
|
||||
@@ -10,13 +10,11 @@
|
||||
<string name="ok">Добра</string>
|
||||
<string name="preparing_auth">Падрыхтоўка да аўтэнтыфікацыі…</string>
|
||||
<string name="finishing_auth">Завяршэнне аўтэнтыфікацыі…</string>
|
||||
<string name="user_boosted">%s пашырыў</string>
|
||||
<string name="in_reply_to">У адказ %s</string>
|
||||
<string name="notifications">Апавяшчэнні</string>
|
||||
<string name="user_followed_you">падпісаўся(-лася) на вас</string>
|
||||
<string name="user_sent_follow_request">адправіў запыт на падпіску</string>
|
||||
<string name="user_favorited">упадабаў(-ла) ваш допіс</string>
|
||||
<string name="notification_boosted">пашырыў(-ла) ваш допіс</string>
|
||||
<string name="poll_ended">апытанне завершана</string>
|
||||
<string name="time_seconds">%dсек</string>
|
||||
<string name="time_minutes">%dхв</string>
|
||||
@@ -194,7 +192,6 @@
|
||||
<string name="report_sent_subtitle">Пакуль мы разглядаем яе, вы можаце прыняць меры супраць %s.</string>
|
||||
<string name="unfollow_user">Адпісацца ад %s</string>
|
||||
<string name="unfollow">Адпісацца</string>
|
||||
<string name="mute_user_explain">Вы не ўбачыце іх допісы або пашырэнні ў сваёй хатняй стужцы. Яны не даведаюцца, што вы іх ігнаруеце.</string>
|
||||
<string name="block_user_explain">Яны больш не змогуць падпісвацца на вас або бачыць вашыя допісы, але змогуць бачыць, што яны былі заблакіраваны.</string>
|
||||
<string name="report_personal_title">Не хочаце бачыць гэта?</string>
|
||||
<string name="report_personal_subtitle">Калі вы бачыце на Mastodon нешта, што вам не падабаецца, вы можаце выдаліць чалавека са свайго асяроддзя.</string>
|
||||
@@ -203,6 +200,7 @@
|
||||
<string name="instance_catalog_subtitle">Выбірайце сервер у залежнасці ад вашых інтарэсаў, рэгіёна або выберыце сервер агульнага прызначэння. Вы па-ранейшаму можаце ўзаемадзейнічаць з усімі, незалежна ад сервера.</string>
|
||||
<string name="search_communities">Назва сервера або URL</string>
|
||||
<string name="instance_rules_title">Правілы сервера</string>
|
||||
<string name="instance_rules_subtitle">Працягваючы, вы згаджаецеся выконваць правілы, устаноўленыя мадэратарам %s.</string>
|
||||
<string name="signup_title">Стварыць уліковы запіс</string>
|
||||
<string name="edit_photo">рэдагаваць</string>
|
||||
<string name="display_name">Імя</string>
|
||||
@@ -226,6 +224,8 @@
|
||||
<string name="category_tech">Тэхналогіі</string>
|
||||
<string name="confirm_email_title">Праверце паштовую скрыню</string>
|
||||
<!-- %s is the email address -->
|
||||
<string name="confirm_email_subtitle">Націсніце на спасылку, якую мы адправілі, каб спраўдзіць %s. Мы вас пачакаем тут.</string>
|
||||
<string name="confirm_email_didnt_get">Не атрымалі спасылку?</string>
|
||||
<string name="resend">Адправіць паўторна</string>
|
||||
<string name="open_email_app">Адкрыць праграму для пошты</string>
|
||||
<string name="resent_email">Электронны ліст з пацвярджэннем адпраўлены</string>
|
||||
@@ -248,7 +248,6 @@
|
||||
<string name="skip">Прапусціць</string>
|
||||
<string name="notification_type_follow">Новыя падпісчыкі</string>
|
||||
<string name="notification_type_favorite">Абраныя</string>
|
||||
<string name="notification_type_reblog">Пашырэнні</string>
|
||||
<string name="notification_type_mention">Згадванні</string>
|
||||
<string name="notification_type_poll">Апытанні</string>
|
||||
<string name="choose_account">Выберыце ўліковы запіс</string>
|
||||
@@ -277,7 +276,6 @@
|
||||
<string name="notify_none">ніхто</string>
|
||||
<string name="notify_favorites">Дадае мой допіс у абранае</string>
|
||||
<string name="notify_follow">Падпісаўся на мяне</string>
|
||||
<string name="notify_reblog">Пашырае мой допіс</string>
|
||||
<string name="notify_mention">Згадвае мяне</string>
|
||||
<string name="settings_boring">Нудная зона</string>
|
||||
<string name="settings_account">Налады ўліковага запісу</string>
|
||||
@@ -298,7 +296,6 @@
|
||||
<string name="hide_content">Схаваць змест</string>
|
||||
<string name="new_post">Новы допіс</string>
|
||||
<string name="button_reply">Адказаць</string>
|
||||
<string name="button_reblog">Пашырыць</string>
|
||||
<string name="button_favorite">Абранае</string>
|
||||
<string name="button_share">Абагуліць</string>
|
||||
<string name="media_no_description">Медыя без апісання</string>
|
||||
@@ -312,9 +309,9 @@
|
||||
<string name="follow_user">Падпісацца на %s</string>
|
||||
<string name="unfollowed_user">Адпісацца ад %s</string>
|
||||
<string name="followed_user">Цяпер вы падпісаны на %s</string>
|
||||
<string name="following_user_requested">Запытана падпісацца на %s</string>
|
||||
<string name="open_in_browser">Адкрыць у браўзеры</string>
|
||||
<string name="hide_boosts_from_user">Схаваць пашырэнні ад %s</string>
|
||||
<string name="show_boosts_from_user">Паказаць пашырэнні ад %s</string>
|
||||
<string name="signup_reason">Чаму вы хочаце далучыцца?</string>
|
||||
<string name="signup_reason_note">Гэта дапаможа нам разгледзець вашу заяўку.</string>
|
||||
<string name="clear">Ачысціць</string>
|
||||
<string name="profile_header">Відарыс шапкі</string>
|
||||
@@ -361,15 +358,8 @@
|
||||
<item quantity="many">%,d абраных</item>
|
||||
<item quantity="other">%,d абраных</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">%,d рэпост</item>
|
||||
<item quantity="few">%,d рэпосты</item>
|
||||
<item quantity="many">%,d пашырэнняў</item>
|
||||
<item quantity="other">%,d пашырэнняў</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s праз %2$s</string>
|
||||
<string name="time_now">толькі што</string>
|
||||
<string name="post_info_reblogs">Пашырэнні</string>
|
||||
<string name="post_info_favorites">Абраныя</string>
|
||||
<string name="edit_history">Гісторыя рэдагавання</string>
|
||||
<string name="last_edit_at_x">Апошняе рэдагаванне %s</string>
|
||||
@@ -419,6 +409,8 @@
|
||||
<!-- %s is file size -->
|
||||
<string name="download_update">Спампаваць (%s)</string>
|
||||
<string name="install_update">Усталяваць</string>
|
||||
<string name="privacy_policy_title">Ваша прыватнасць</string>
|
||||
<string name="privacy_policy_subtitle">Нягледзячы на тое, што праграма Mastodon не збірае даных, сервер, на якім вы рэгіструецеся, можа мець іншую палітыку.\n\nКалі вы адмовіцеся ад палітыкі %s, вы можаце вярнуцца і выбраць іншы сервер.</string>
|
||||
<string name="i_agree">Я згодны</string>
|
||||
<string name="empty_list">Гэты ліст пусты</string>
|
||||
<string name="instance_signup_closed">Гэты сервер не прымае новыя рэгістрацыі.</string>
|
||||
@@ -430,20 +422,35 @@
|
||||
<string name="login_title">З вяртаннем</string>
|
||||
<string name="login_subtitle">Увайдзіце з дапамогай сервера, на якім вы стварылі свой уліковы запіс.</string>
|
||||
<string name="server_url">URL-адрас сервера</string>
|
||||
<string name="welcome_page1_text">Уявіце, што ў вас ёсць адрас электроннай пошты, які заканчваецца на @example.com.\n\nВы па-ранейшаму можаце адпраўляць і атрымліваць электронныя лісты ад каго захочаце, нават калі іх электронная пошта заканчваецца на @gmail.com, @icloud.com або @example.com.</string>
|
||||
<string name="welcome_page2_title">Mastodon такі.</string>
|
||||
<string name="welcome_page2_text">Ваш ідэнтыфікатар можа быць @gothgirl654@example.social, але вы ўсё яшчэ можаце падпісвацца, пашыраць і перапісвацца з @fallout5ever@example.online.</string>
|
||||
<string name="welcome_page3_title">Як выбраць сервер?</string>
|
||||
<string name="welcome_page3_text">Розныя людзі выбіраюць розныя серверы па розных прычынах. art.example з\'яўляецца выдатным месцам для мастакоў, у той час як glasgow.example можа быць добрым выбарам для шатландцаў.\n\nВы не памыліцеся ні з адным з нашых рэкамендаваных сервераў, так што незалежна ад таго, які вы выбераце (або калі ўведзяце ваш уласны ў радку пошуку сервера), вы нідзе нічога не прапусціце.</string>
|
||||
<string name="signup_random_server_explain">Мы абярэм сервер на аснове вашай мовы, калі вы працягнеце без выбару.</string>
|
||||
<string name="server_filter_any_language">Любая мова</string>
|
||||
<string name="server_filter_instant_signup">Імгненная рэгістрацыя</string>
|
||||
<string name="server_filter_manual_review">Ручная праверка</string>
|
||||
<string name="server_filter_any_signup_speed">Любая хуткасць рэгістрацыі</string>
|
||||
<string name="server_filter_region_europe">Еўропа</string>
|
||||
<string name="server_filter_region_north_america">Паўночная Амерыка</string>
|
||||
<string name="server_filter_region_south_america">Паўднёвая Амерыка</string>
|
||||
<string name="server_filter_region_africa">Афрыка</string>
|
||||
<string name="server_filter_region_asia">Азія</string>
|
||||
<string name="server_filter_region_oceania">Акіянія</string>
|
||||
<string name="not_accepting_new_members">Не прымае новых удзельнікаў</string>
|
||||
<string name="category_special_interests">Асаблівыя інтарэсы</string>
|
||||
<string name="signup_passwords_dont_match">Паролі не супадаюць</string>
|
||||
<string name="pick_server_for_me">Падбяры для мяне</string>
|
||||
<string name="profile_add_row">Дадаць радок</string>
|
||||
<string name="profile_setup">Налады профілю</string>
|
||||
<string name="profile_setup_subtitle">Вы можаце завяршыць гэта пазней на ўкладцы Профіль.</string>
|
||||
<string name="profile_setup_explanation">Вы можаце дадаць да чатырох палёў профіля для ўсяго, што хочаце. Месцазнаходжанне, спасылкі, займеннікі - няма мяжы магчымасцям.</string>
|
||||
<string name="popular_on_mastodon">Папулярна на Mastodon</string>
|
||||
<string name="follow_all">Падпісацца на ўсіх</string>
|
||||
<string name="server_rules_disagree">Не згодны</string>
|
||||
<string name="privacy_policy_explanation">Мы нічога не збіраем і не апрацоўваем.</string>
|
||||
<!-- %s is server domain -->
|
||||
<string name="server_policy_disagree">Не згодны з %s</string>
|
||||
<string name="profile_bio">Пра мяне</string>
|
||||
<!-- Shown in a progress dialog when you tap "follow all" -->
|
||||
<string name="sending_follows">Падпісваемся…</string>
|
||||
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
|
||||
<string name="signup_email_domain_blocked">%1$s не прымае рэгістрацыю ад %2$s. Паспрабуйце іншы <a>выберыце іншы сервер</a>.</string>
|
||||
<string name="signup_username_taken">Гэта імя карыстальніка занята.</string>
|
||||
</resources>
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
<string name="user_followed_you">আপনাকে ফলো করেছেন</string>
|
||||
<string name="user_sent_follow_request">ফলো করার জন্য অনুরোধ পাঠানো হয়েছে</string>
|
||||
<string name="user_favorited">আপনার পোস্টটি পছন্দ করেছেন</string>
|
||||
<string name="notification_boosted">আপনার পোস্টের প্রচার করা হয়েছে</string>
|
||||
<string name="poll_ended">ভোট শেষ</string>
|
||||
<string name="time_seconds">%d সে.</string>
|
||||
<string name="time_minutes">%d মি.</string>
|
||||
|
||||
@@ -123,7 +123,6 @@
|
||||
<string name="report_sent_subtitle">Dok ovo razmatramo, možete poduzeti potrebno za %s.</string>
|
||||
<string name="unfollow_user">Prestani pratiti %s</string>
|
||||
<string name="unfollow">Prestani pratiti</string>
|
||||
<string name="mute_user_explain">Nećete vidjeti objave i odgovore na vašem zidu. Osoba neče znati da ste je isključili.</string>
|
||||
<string name="block_user_explain">Neće moći više pratiti vaše objave, ali mogu vidjeti ako su blokirani.</string>
|
||||
<string name="report_personal_title">Ne želite ovo vidjeti?</string>
|
||||
<string name="report_personal_subtitle">Kada vidite nešto nepoželjno na Mastodon-u, možete blokirati odredjeni profil.</string>
|
||||
@@ -193,7 +192,6 @@
|
||||
<string name="notify_none">nikoga</string>
|
||||
<string name="notify_favorites">Svidjanje objave</string>
|
||||
<string name="notify_follow">Prati me</string>
|
||||
<string name="notify_reblog">Ponovio/la moju objavu</string>
|
||||
<string name="notify_mention">Spominjanje</string>
|
||||
<string name="settings_boring">Zona dosade</string>
|
||||
<string name="settings_account">Postavke računa</string>
|
||||
@@ -214,7 +212,6 @@
|
||||
<string name="hide_content">Sakrij sadžaj</string>
|
||||
<string name="new_post">Nova objava</string>
|
||||
<string name="button_reply">Odgovori</string>
|
||||
<string name="button_reblog">Dupliraj</string>
|
||||
<string name="button_favorite">Svidja mi se</string>
|
||||
<string name="button_share">Dijeli</string>
|
||||
<string name="media_no_description">Medija bez opisa</string>
|
||||
|
||||
@@ -10,13 +10,11 @@
|
||||
<string name="ok">D\'acord</string>
|
||||
<string name="preparing_auth">Preparant l\'autenticació…</string>
|
||||
<string name="finishing_auth">Finalitzant l\'autenticació…</string>
|
||||
<string name="user_boosted">%s ha impulsat</string>
|
||||
<string name="in_reply_to">En resposta a %s</string>
|
||||
<string name="notifications">Notificacions</string>
|
||||
<string name="user_followed_you">t\'ha seguit</string>
|
||||
<string name="user_sent_follow_request">ha sol·licitat seguir-te</string>
|
||||
<string name="user_favorited">ha afavorit la teva publicació</string>
|
||||
<string name="notification_boosted">ha impulsat la teva publicació</string>
|
||||
<string name="poll_ended">l\'enquesta ha finalitzat</string>
|
||||
<string name="time_seconds">%d s</string>
|
||||
<string name="time_minutes">%d min</string>
|
||||
@@ -166,7 +164,6 @@
|
||||
<string name="report_sent_subtitle">Mentre ho revisem, pots prendre mesures contra %s.</string>
|
||||
<string name="unfollow_user">Deixar de seguir %s</string>
|
||||
<string name="unfollow">Deixar de seguir</string>
|
||||
<string name="mute_user_explain">No veuràs les seves publicacions o impulsos a la teva línia de temps personal. No sabran que han estat silenciats.</string>
|
||||
<string name="block_user_explain">Ja no podran seguir ni veure les teves publicacions, però poden veure si han estat bloquejats.</string>
|
||||
<string name="report_personal_title">No vols veure això?</string>
|
||||
<string name="report_personal_subtitle">Quan veus alguna cosa que no t\'agrada a Mastodon, pots eliminar la persona de la vostra experiència.</string>
|
||||
@@ -221,7 +218,6 @@
|
||||
<string name="skip">Omet</string>
|
||||
<string name="notification_type_follow">Seguidors nous</string>
|
||||
<string name="notification_type_favorite">Favorits</string>
|
||||
<string name="notification_type_reblog">Impulsos</string>
|
||||
<string name="notification_type_mention">Mencions</string>
|
||||
<string name="notification_type_poll">Enquestes</string>
|
||||
<string name="choose_account">Selecciona un compte</string>
|
||||
@@ -248,7 +244,6 @@
|
||||
<string name="notify_none">ningú</string>
|
||||
<string name="notify_favorites">Ha afavorit la meva publicació</string>
|
||||
<string name="notify_follow">Em segueix</string>
|
||||
<string name="notify_reblog">Impulsa la meva publicació</string>
|
||||
<string name="notify_mention">Em menciona</string>
|
||||
<string name="settings_boring">La zona avorrida</string>
|
||||
<string name="settings_account">Configuració del compte</string>
|
||||
@@ -269,7 +264,6 @@
|
||||
<string name="hide_content">Amaga el contingut</string>
|
||||
<string name="new_post">Nova publicació</string>
|
||||
<string name="button_reply">Respon</string>
|
||||
<string name="button_reblog">Impulsa</string>
|
||||
<string name="button_favorite">Favorit</string>
|
||||
<string name="button_share">Comparteix</string>
|
||||
<string name="media_no_description">Multimèdia sense descripció</string>
|
||||
@@ -284,8 +278,6 @@
|
||||
<string name="unfollowed_user">S\'ha deixat de seguir %s</string>
|
||||
<string name="followed_user">Ara estàs seguint %s</string>
|
||||
<string name="open_in_browser">Obre al navegador</string>
|
||||
<string name="hide_boosts_from_user">Amaga els impulsos de %s</string>
|
||||
<string name="show_boosts_from_user">Mostra els impulsos de %s</string>
|
||||
<string name="signup_reason_note">Això ens ajudarà a revisar la teva petició.</string>
|
||||
<string name="clear">Esborra</string>
|
||||
<string name="profile_header">Imatge de capçalera</string>
|
||||
@@ -326,13 +318,8 @@
|
||||
<item quantity="one">%,d favorit</item>
|
||||
<item quantity="other">%,d favorits</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">%,d impuls</item>
|
||||
<item quantity="other">%,d impulsos</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s través de %2$s</string>
|
||||
<string name="time_now">ara</string>
|
||||
<string name="post_info_reblogs">Impulsos</string>
|
||||
<string name="post_info_favorites">Favorits</string>
|
||||
<string name="edit_history">Editar l’historial</string>
|
||||
<string name="last_edit_at_x">Darrera edició: %s</string>
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
<string name="sk_translated_using">Traduït amb %s</string>
|
||||
<string name="sk_post_language">Llengua: %s</string>
|
||||
<string name="sk_available_languages">Llengües disponibles</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_language_name">%1$s (%2$s)</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Segur que vols esborrar les llengües recents\?</string>
|
||||
<string name="sk_welcome_text">El tauró et saluda! Per a començar, introdueix el domini de la instància a continuació.</string>
|
||||
<string name="sk_tabs_disable_swipe">Desactiva el desplaçament entre pestanyes</string>
|
||||
|
||||
@@ -10,13 +10,11 @@
|
||||
<string name="ok">OK</string>
|
||||
<string name="preparing_auth">Příprava na autentizaci…</string>
|
||||
<string name="finishing_auth">Dokončení autentizace…</string>
|
||||
<string name="user_boosted">Uživatel %s boostnul</string>
|
||||
<string name="in_reply_to">V odpovědi na %s</string>
|
||||
<string name="notifications">Upozornění</string>
|
||||
<string name="user_followed_you">vás začal(a) sledovat</string>
|
||||
<string name="user_sent_follow_request">vám poslal(a) žádost o sledování</string>
|
||||
<string name="user_favorited">si oblíbil(a) váš příspěvek</string>
|
||||
<string name="notification_boosted">boostnul(a) váš příspěvek</string>
|
||||
<string name="poll_ended">anketa skončila</string>
|
||||
<string name="time_seconds">%d s</string>
|
||||
<string name="time_minutes">%d m</string>
|
||||
@@ -194,14 +192,22 @@
|
||||
<string name="report_sent_subtitle">Zatímco to posuzujeme, můžete podniknout akce proti %s.</string>
|
||||
<string name="unfollow_user">Přestat sledovat %s</string>
|
||||
<string name="unfollow">Přestat sledovat</string>
|
||||
<string name="mute_user_explain">Neuvidíte příspěvky nebo boosty tohoto uživatele ve svém domovském kanálu. Nebude vědět, že je skryt.</string>
|
||||
<string name="block_user_explain">Tento uživatel vás již nebude moci sledovat ani vidět vaše příspěvky, ale může zjistit, že je blokován.</string>
|
||||
<string name="report_personal_title">Nechcete tohle vidět?</string>
|
||||
<string name="report_personal_subtitle">Když uvidíte něco, co se vám nelíbí na Mastodonu, můžete odstranit tuto osobu ze svého zážitku.</string>
|
||||
<string name="back">Zpět</string>
|
||||
<string name="instance_catalog_title">Mastodon tvoří uživatelé z různých serverů.</string>
|
||||
<string name="instance_catalog_subtitle">Vyberte si server podle na svých zájmů, regionu nebo obecného účelu. Stále se můžete spojit se všemi bez ohledu na server.</string>
|
||||
<string name="search_communities">Název nebo URL serveru</string>
|
||||
<string name="instance_rules_title">Pravidla serveru</string>
|
||||
<string name="instance_rules_subtitle">Pokračováním souhlasíte s následujícími pravidly, která jsou nastavena a prosazována moderátory %s.</string>
|
||||
<string name="signup_title">Vytvořit účet</string>
|
||||
<string name="edit_photo">upravit</string>
|
||||
<string name="display_name">Jméno</string>
|
||||
<string name="username">Uživatelské jméno</string>
|
||||
<string name="email">E-mail</string>
|
||||
<string name="password">Heslo</string>
|
||||
<string name="confirm_password">Potvrdit heslo</string>
|
||||
<string name="password_note">Použijte velká písmena, speciální znaky a čísla, abyste zvýšili sílu hesla.</string>
|
||||
<string name="category_academia">Akademická sféra</string>
|
||||
<string name="category_activism">Aktivismus</string>
|
||||
@@ -216,7 +222,10 @@
|
||||
<string name="category_music">Hudba</string>
|
||||
<string name="category_regional">Regionální</string>
|
||||
<string name="category_tech">Technologie</string>
|
||||
<string name="confirm_email_title">Zkontrolujte si příchozí poštu</string>
|
||||
<!-- %s is the email address -->
|
||||
<string name="confirm_email_subtitle">Klepněte na odkaz, který jsme vám poslali, abyste ověřili %s. Budeme tu na vás čekat.</string>
|
||||
<string name="confirm_email_didnt_get">Nedostali jste odkaz?</string>
|
||||
<string name="resend">Poslat znovu</string>
|
||||
<string name="open_email_app">Otevřít e-mailovou aplikaci</string>
|
||||
<string name="resent_email">Potvrzující e-mail byl odeslán</string>
|
||||
@@ -239,7 +248,6 @@
|
||||
<string name="skip">Přeskočit</string>
|
||||
<string name="notification_type_follow">Noví sledující</string>
|
||||
<string name="notification_type_favorite">Oblíbené</string>
|
||||
<string name="notification_type_reblog">Boosty</string>
|
||||
<string name="notification_type_mention">Zmínky</string>
|
||||
<string name="notification_type_poll">Ankety</string>
|
||||
<string name="choose_account">Vybrat účet</string>
|
||||
@@ -268,7 +276,6 @@
|
||||
<string name="notify_none">nikoho</string>
|
||||
<string name="notify_favorites">Oblíbí si můj příspěvek</string>
|
||||
<string name="notify_follow">Začne mě sledovat</string>
|
||||
<string name="notify_reblog">Boostne můj příspěvek</string>
|
||||
<string name="notify_mention">Zmíní mě</string>
|
||||
<string name="settings_boring">Nudná část</string>
|
||||
<string name="settings_account">Nastavení účtu</string>
|
||||
@@ -289,7 +296,6 @@
|
||||
<string name="hide_content">Skrýt obsah</string>
|
||||
<string name="new_post">Nový příspěvek</string>
|
||||
<string name="button_reply">Odpovědět</string>
|
||||
<string name="button_reblog">Boostnout</string>
|
||||
<string name="button_favorite">Oblíbit</string>
|
||||
<string name="button_share">Sdílet</string>
|
||||
<string name="media_no_description">Média bez popisu</string>
|
||||
@@ -303,9 +309,9 @@
|
||||
<string name="follow_user">Sledovat %s</string>
|
||||
<string name="unfollowed_user">Sledování %s bylo zrušeno</string>
|
||||
<string name="followed_user">Nyní sledujete %s</string>
|
||||
<string name="following_user_requested">Požádáno o sledování %s</string>
|
||||
<string name="open_in_browser">Otevřít v prohlížeči</string>
|
||||
<string name="hide_boosts_from_user">Skrýt boosty od %s</string>
|
||||
<string name="show_boosts_from_user">Zobrazit boosty od %s</string>
|
||||
<string name="signup_reason">Proč se chcete připojit?</string>
|
||||
<string name="signup_reason_note">Toto nám pomůže posoudit vaši žádost.</string>
|
||||
<string name="clear">Vyčistit</string>
|
||||
<string name="profile_header">Obrázek v záhlaví</string>
|
||||
@@ -352,15 +358,8 @@
|
||||
<item quantity="many">%,d oblíbení</item>
|
||||
<item quantity="other">%,d oblíbení</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">%,d boostnul</item>
|
||||
<item quantity="few">%,d boosty</item>
|
||||
<item quantity="many">%,d boostů</item>
|
||||
<item quantity="other">%,d boostů</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s přes %2$s</string>
|
||||
<string name="time_now">teď</string>
|
||||
<string name="post_info_reblogs">Boosty</string>
|
||||
<string name="post_info_favorites">Oblíbení</string>
|
||||
<string name="edit_history">Historie úprav</string>
|
||||
<string name="last_edit_at_x">Poslední úprava %s</string>
|
||||
@@ -410,6 +409,8 @@
|
||||
<!-- %s is file size -->
|
||||
<string name="download_update">Stáhnout (%s)</string>
|
||||
<string name="install_update">Instalovat</string>
|
||||
<string name="privacy_policy_title">Vaše soukromí</string>
|
||||
<string name="privacy_policy_subtitle">Přestože aplikace Mastodon neshromažďuje žádná data, server, který se přihlásíte, může mít jiné zásady.\n\nPokud nesouhlasíte se zásadami pro %s, můžete se vrátit a vybrat jiný server.</string>
|
||||
<string name="i_agree">Souhlasím</string>
|
||||
<string name="empty_list">Tento seznam je prázdný</string>
|
||||
<string name="instance_signup_closed">Tento server nepřijímá nové registrace.</string>
|
||||
@@ -421,12 +422,35 @@
|
||||
<string name="login_title">Vítejte zpět</string>
|
||||
<string name="login_subtitle">Přihlaste se pomocí serveru, kde jste vytvořili svůj účet.</string>
|
||||
<string name="server_url">URL serveru</string>
|
||||
<string name="welcome_page1_text">Představte si, že máte e-mailovou adresu, která končí @example.com.\n\nStále můžete od kohokoliv odesílat a přijímat e-maily, i když jejich e-mail končí na @gmail.com nebo @icloud.com nebo @example.com.</string>
|
||||
<string name="welcome_page2_title">Takový je Mastodon.</string>
|
||||
<string name="welcome_page2_text">Vaše uživatelské jméno může být @gothgirl654@example.social, ale stále můžete sledovat, boostovat a chatovat s @fallout5ever@example.online.</string>
|
||||
<string name="welcome_page3_title">Jak si vybrat server?</string>
|
||||
<string name="welcome_page3_text">Různí lidé si vybírají různé servery z různých důvodů. Art.example je skvělým místem pro umělce, zatímco glasgow.example může být dobrou volbou pro Skoty.\n\nS žádným z našich doporučených serverů nemůžete udělat chybu, takže bez ohledu na to, který z nich si vyberete (nebo pokud zadáte svůj vlastní do vyhledávacího řádku serveru), nikde neprohloupíte.</string>
|
||||
<string name="signup_random_server_explain">Pokud budete pokračovat bez výběru, vybereme server založený na vašem jazyce.</string>
|
||||
<string name="server_filter_any_language">Libovolný jazyk</string>
|
||||
<string name="server_filter_instant_signup">Okamžitá registrace</string>
|
||||
<string name="server_filter_manual_review">Ruční kontrola</string>
|
||||
<string name="server_filter_any_signup_speed">Jakákoliv rychlost registrace</string>
|
||||
<string name="server_filter_region_europe">Evropa</string>
|
||||
<string name="server_filter_region_north_america">Severní Amerika</string>
|
||||
<string name="server_filter_region_south_america">Jižní Amerika</string>
|
||||
<string name="server_filter_region_africa">Afrika</string>
|
||||
<string name="server_filter_region_asia">Asie</string>
|
||||
<string name="server_filter_region_oceania">Oceánie</string>
|
||||
<string name="not_accepting_new_members">Nepřijímá nové členy</string>
|
||||
<string name="category_special_interests">Speciální zájmy</string>
|
||||
<string name="signup_passwords_dont_match">Hesla se neshodují</string>
|
||||
<string name="pick_server_for_me">Vybrat pro mě</string>
|
||||
<string name="profile_add_row">Přidat řádek</string>
|
||||
<string name="profile_setup">Nastavení profilu</string>
|
||||
<string name="profile_setup_subtitle">Toto můžete vždy dokončit později v záložce Profil.</string>
|
||||
<string name="profile_setup_explanation">Můžete přidat až čtyři pole profilu pro cokoliv, co chcete. Umístění, odkazy, oslovení — limitem je obloha.</string>
|
||||
<string name="popular_on_mastodon">Populární na Mastodonu</string>
|
||||
<string name="follow_all">Sledovat všechny</string>
|
||||
<string name="server_rules_disagree">Nesouhlasit</string>
|
||||
<string name="privacy_policy_explanation">Zkráceně: nic nesbíráme a nezpracováváme.</string>
|
||||
<!-- %s is server domain -->
|
||||
<string name="server_policy_disagree">Nesouhlasit s %s</string>
|
||||
<string name="profile_bio">O vás</string>
|
||||
<!-- Shown in a progress dialog when you tap "follow all" -->
|
||||
<string name="sending_follows">Sledování uživatelů…</string>
|
||||
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
|
||||
<string name="signup_email_domain_blocked">%1$s neumožňuje registraci od %2$s. Zkuste jiný nebo <a>vyberte jiný server</a>.</string>
|
||||
<string name="signup_username_taken">Toto uživatelské jméno je obsazené.</string>
|
||||
</resources>
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
<string name="sk_no_update_available">Dim diweddariad ar gael</string>
|
||||
<string name="sk_check_for_update">Gwirio am ddiweddariad</string>
|
||||
<string name="sk_poll_allow_multiple">Caniatáu mwy nag un dewis</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_language_name">%1$s (%2$s)</string>
|
||||
<string name="sk_tabs_disable_swipe">Analluogi llusgo rhwng tabiau</string>
|
||||
<string name="sk_settings_posting">Dewisiadau postio</string>
|
||||
<string name="sk_settings_rules">Rheolau</string>
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
<string name="ok">Ok</string>
|
||||
<string name="preparing_auth">Forbereder godkendelse…</string>
|
||||
<string name="finishing_auth">Afslutter godkendelse…</string>
|
||||
<string name="user_boosted">%s boostede</string>
|
||||
<string name="user_boosted">%s fremhævede</string>
|
||||
<string name="in_reply_to">Som svar til %s</string>
|
||||
<string name="notifications">Meddelelser</string>
|
||||
<string name="user_followed_you">begyndte at følge dig</string>
|
||||
<string name="user_sent_follow_request">sendte dig en følgeanmodning</string>
|
||||
<string name="user_favorited">favoritmarkerede dit indlæg</string>
|
||||
<string name="notification_boosted">boostede dit indlæg</string>
|
||||
<string name="notification_boosted">fremhævede dit indlæg</string>
|
||||
<string name="poll_ended">afstemning afsluttet</string>
|
||||
<string name="time_seconds">%ds</string>
|
||||
<string name="time_minutes">%d m</string>
|
||||
@@ -166,7 +166,7 @@
|
||||
<string name="report_sent_subtitle">Mens dette gennemgås, kan du selv bortfiltrere indlæg fra %s.</string>
|
||||
<string name="unfollow_user">Følg ikke længere %s</string>
|
||||
<string name="unfollow">Følg ikke længere</string>
|
||||
<string name="mute_user_explain">Du vil ikke se den pågældendes indlæg eller boosts i din tidslinje. Vedkommende vil ikke få besked om dæmpningen.</string>
|
||||
<string name="mute_user_explain">Du vil ikke se den pågældendes indlæg eller fremhævninger i din tidslinje. Vedkommende vil ikke få besked om dæmpningen.</string>
|
||||
<string name="block_user_explain">Vedkommende vil ikke længere kunne følge dig eller se dine indlæg, men vedkommende kan se blokeringen.</string>
|
||||
<string name="report_personal_title">Ønsker du ikke at se dette?</string>
|
||||
<string name="report_personal_subtitle">Når du ser noget, du ikke kan lide på Mastodon, kan du fjerne personen fra din tidslinje.</string>
|
||||
@@ -223,7 +223,7 @@
|
||||
<string name="skip">Spring over</string>
|
||||
<string name="notification_type_follow">Nye følgere</string>
|
||||
<string name="notification_type_favorite">Favoritmarkeringer</string>
|
||||
<string name="notification_type_reblog">Boosts</string>
|
||||
<string name="notification_type_reblog">Fremhævninger</string>
|
||||
<string name="notification_type_mention">Omtaler</string>
|
||||
<string name="notification_type_poll">Afstemninger</string>
|
||||
<string name="choose_account">Vælg konto</string>
|
||||
@@ -250,7 +250,7 @@
|
||||
<string name="notify_none">ingen</string>
|
||||
<string name="notify_favorites">Favoritmarkerede mit indlæg</string>
|
||||
<string name="notify_follow">Følger mig</string>
|
||||
<string name="notify_reblog">Booster mit indlæg</string>
|
||||
<string name="notify_reblog">Fremhæver mit indlæg</string>
|
||||
<string name="notify_mention">Nævner mig</string>
|
||||
<string name="settings_boring">Den kedelige zone</string>
|
||||
<string name="settings_account">Kontoindstillinger</string>
|
||||
@@ -271,7 +271,7 @@
|
||||
<string name="hide_content">Skjul indhold</string>
|
||||
<string name="new_post">Nyt indlæg</string>
|
||||
<string name="button_reply">Svar</string>
|
||||
<string name="button_reblog">Boost</string>
|
||||
<string name="button_reblog">Fremhæv</string>
|
||||
<string name="button_favorite">Favorit</string>
|
||||
<string name="button_share">Del</string>
|
||||
<string name="media_no_description">Medier uden beskrivelse</string>
|
||||
@@ -285,9 +285,10 @@
|
||||
<string name="follow_user">Følg %s</string>
|
||||
<string name="unfollowed_user">Følg ikke længere %s</string>
|
||||
<string name="followed_user">Du følger nu %s</string>
|
||||
<string name="following_user_requested">Anmodede om at følge %s</string>
|
||||
<string name="open_in_browser">Åbn i browser</string>
|
||||
<string name="hide_boosts_from_user">Skjul boosts fra %s</string>
|
||||
<string name="show_boosts_from_user">Vis boosts fra %s</string>
|
||||
<string name="hide_boosts_from_user">Skjul fremhævninger fra %s</string>
|
||||
<string name="show_boosts_from_user">Vis fremhævninger fra %s</string>
|
||||
<string name="signup_reason">Hvorfor ønsker du at tilmelde dig?</string>
|
||||
<string name="signup_reason_note">Dette hjælper os med at vurdere din ansøgning.</string>
|
||||
<string name="clear">Ryd</string>
|
||||
@@ -330,12 +331,12 @@
|
||||
<item quantity="other">%,d favoritmarkeringer</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">%,d boost</item>
|
||||
<item quantity="other">%,d boosts</item>
|
||||
<item quantity="one">%,d indlæg</item>
|
||||
<item quantity="other">%,d indlæg</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s via %2$s</string>
|
||||
<string name="time_now">nu</string>
|
||||
<string name="post_info_reblogs">Boosts</string>
|
||||
<string name="post_info_reblogs">Fremhævninger</string>
|
||||
<string name="post_info_favorites">Favoritmarkeringer</string>
|
||||
<string name="edit_history">Rediger historik</string>
|
||||
<string name="last_edit_at_x">Senest ændret: %s</string>
|
||||
@@ -382,6 +383,7 @@
|
||||
<string name="download_update">Download (%s)</string>
|
||||
<string name="install_update">Installer</string>
|
||||
<string name="privacy_policy_title">Dit privatliv</string>
|
||||
<string name="privacy_policy_subtitle">Selvom Mastodon-appen ikke indsamler data, kan den server du tilmelder dig gennem, have en anden politik.\n\nHvis du er uenig i politikken for %s, kan du gå tilbage og vælge en anden server.</string>
|
||||
<string name="i_agree">Jeg accepterer</string>
|
||||
<string name="empty_list">Denne liste er tom</string>
|
||||
<string name="instance_signup_closed">Denne server er ikke åben for nye tilmeldinger.</string>
|
||||
@@ -393,12 +395,6 @@
|
||||
<string name="login_title">Velkommen tilbage</string>
|
||||
<string name="login_subtitle">Log ind med serveren hvor du oprettede din bruger.</string>
|
||||
<string name="server_url">Server-URL</string>
|
||||
<string name="welcome_page1_title">Hvad er Mastodon?</string>
|
||||
<string name="welcome_page1_text">Det svarer til at du har en e-mailadresse, der slutter med @eksempel.dk.\n\nAlligevel kan du stadig både sende og modtage e-mails fra alle, selv om deres e-mail ender på @gmail.com eller @icloud.com eller @eksempel.dk.</string>
|
||||
<string name="welcome_page2_title">Mastodon er ligesådan.</string>
|
||||
<string name="welcome_page2_text">Dit brugernavn kan være @goth654@eksempel.social, men du kan stadig følge, booste, og chatte med @denanden@eksempel.online.</string>
|
||||
<string name="welcome_page3_title">Hvordan vælger jeg en server?</string>
|
||||
<string name="welcome_page3_text">Forskellige mennesker vælger forskellige servere af mange forskellige grunde. art.example er et godt sted for kunstnere, mens glasgow.example kan være et godt pluk for skotter.\n\nDu kan ikke gå galt i byen med en af vores anbefalingsservere, så uanset hvilken du vælger (eller hvis du indtaster din egen i serversøgelinjen), vil du aldrig gå glip af noget nogen steder.</string>
|
||||
<string name="signup_random_server_explain">Vi vælger en server baseret på dit sprog, hvis du fortsætter uden at foretage et valg.</string>
|
||||
<string name="server_filter_any_language">Hvilket som helst sprog</string>
|
||||
<string name="server_filter_instant_signup">Øjeblikkelig tilmelding</string>
|
||||
@@ -421,7 +417,31 @@
|
||||
<string name="popular_on_mastodon">Populært på Mastodon</string>
|
||||
<string name="follow_all">Følg alle</string>
|
||||
<string name="server_rules_disagree">Ikke enig</string>
|
||||
<string name="privacy_policy_explanation">TL;DR: Vi indsamler eller behandler ikke noget.</string>
|
||||
<!-- %s is server domain -->
|
||||
<string name="server_policy_disagree">Uenig med %s</string>
|
||||
<string name="profile_bio">Biografi</string>
|
||||
<!-- Shown in a progress dialog when you tap "follow all" -->
|
||||
<string name="sending_follows">Følger brugere …</string>
|
||||
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
|
||||
<string name="signup_email_domain_blocked">%1$s tillader ikke tilmeldinger fra %2$s. Prøv en anden eller <a>vælg en anden server</a>.</string>
|
||||
<string name="signup_username_taken">Brugernavnet er allerede i brug.</string>
|
||||
<string name="spoiler_show">Vis alligevel</string>
|
||||
<string name="spoiler_hide">Genskjul</string>
|
||||
<string name="poll_multiple_choice">Vælg en eller flere</string>
|
||||
<string name="save_changes">Gem ændringer</string>
|
||||
<string name="profile_featured">Fremhævet</string>
|
||||
<string name="profile_timeline">Tidslinje</string>
|
||||
<string name="view_all">Se alle</string>
|
||||
<string name="profile_endorsed_accounts">Konti</string>
|
||||
<string name="verified_link">Bekræftet link</string>
|
||||
<string name="show">Vis</string>
|
||||
<string name="hide">Skjul</string>
|
||||
<string name="join_default_server">Tilmeld dig %s</string>
|
||||
<string name="signup_or_login">eller</string>
|
||||
<string name="learn_more">Få mere at vide</string>
|
||||
<string name="welcome_to_mastodon">Velkommen til Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon er et decentraliseret socialt netværk, hvilket betyder at ingen enkelt virksomhed styrer det. Det består af mange uafhængige servere, alle forbundet sammen.</string>
|
||||
<string name="what_are_servers">Hvad er servere?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Alle Mastodon-konti har plads på en server. Hver server har sine egne værdier, regler og administratorer. Ligegyldigt hvilken server du vælger, kan du følge og interagere med folk på alle andre servere.]]></string>
|
||||
</resources>
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
<string name="ok">OK</string>
|
||||
<string name="preparing_auth">Authentifizierung wird vorbereitet …</string>
|
||||
<string name="finishing_auth">Authentifizierung wird abgeschlossen …</string>
|
||||
<string name="user_boosted">%s hat diesen Beitrag geteilt</string>
|
||||
<string name="user_boosted">%s hat geteilt</string>
|
||||
<string name="in_reply_to">Als Antwort auf %s</string>
|
||||
<string name="notifications">Benachrichtigungen</string>
|
||||
<string name="user_followed_you">folgt dir jetzt</string>
|
||||
<string name="user_sent_follow_request">hat dir eine Follower-Anfrage gesendet</string>
|
||||
<string name="user_favorited">favorisierte</string>
|
||||
<string name="notification_boosted">teilte</string>
|
||||
<string name="notification_boosted">teilte deinen Beitrag</string>
|
||||
<string name="poll_ended">Abstimmung beendet</string>
|
||||
<string name="time_seconds">vor %d Sekunden</string>
|
||||
<string name="time_minutes">vor %d Minuten</string>
|
||||
@@ -250,7 +250,7 @@
|
||||
<string name="notify_none">niemand</string>
|
||||
<string name="notify_favorites">meinen Beitrag favorisiert</string>
|
||||
<string name="notify_follow">mir folgt</string>
|
||||
<string name="notify_reblog">einen meiner Beiträge geteilt hat</string>
|
||||
<string name="notify_reblog">Teilte meinen Beitrag</string>
|
||||
<string name="notify_mention">mich erwähnt</string>
|
||||
<string name="settings_boring">Langweiliges</string>
|
||||
<string name="settings_account">Kontoeinstellungen</string>
|
||||
@@ -287,8 +287,8 @@
|
||||
<string name="followed_user">Du folgst nun %s</string>
|
||||
<string name="following_user_requested">Deine Follower-Anfrage an %s wurde gesendet</string>
|
||||
<string name="open_in_browser">Im Browser öffnen</string>
|
||||
<string name="hide_boosts_from_user">geteilte Beiträge von %s ausblenden</string>
|
||||
<string name="show_boosts_from_user">geteilte Beiträge von %s anzeigen</string>
|
||||
<string name="hide_boosts_from_user">Geteilte Beiträge von %s verstecken</string>
|
||||
<string name="show_boosts_from_user">Geteilte Beiträge von %s anzeigen</string>
|
||||
<string name="signup_reason">Warum möchtest du beitreten?</string>
|
||||
<string name="signup_reason_note">Das erleichtert uns die Prüfung deiner Anmeldung.</string>
|
||||
<string name="clear">Leeren</string>
|
||||
@@ -331,8 +331,8 @@
|
||||
<item quantity="other">%,d × favorisiert</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">%,d × geteilt</item>
|
||||
<item quantity="other">%,d × geteilt</item>
|
||||
<item quantity="one">%,d geteilter Beitrag</item>
|
||||
<item quantity="other">%,d geteilte Beiträge</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s via %2$s</string>
|
||||
<string name="time_now">jetzt</string>
|
||||
@@ -395,12 +395,6 @@
|
||||
<string name="login_title">Willkommen zurück</string>
|
||||
<string name="login_subtitle">Melde dich mit dem Server an, auf dem du dein Konto erstellt hast.</string>
|
||||
<string name="server_url">Serveradresse</string>
|
||||
<string name="welcome_page1_title">Was ist Mastodon?</string>
|
||||
<string name="welcome_page1_text">Angenommen, du hast eine E-Mail-Adresse, die mit @example.com endet.\n\nDu kannst immer noch E-Mails von allen empfangen, auch wenn deren E-Mail-Adresse mit @gmail.com, @icloud.com oder @example.com endet.</string>
|
||||
<string name="welcome_page2_title">Mastodon ist genau so.</string>
|
||||
<string name="welcome_page2_text">Dein Nutzer*innenname könnte @GothGirl654@example.social sein, aber du kannst trotzdem @fallout5ever@example.online folgen, deren Beiträge teilen und dich mit der Person unterhalten.</string>
|
||||
<string name="welcome_page3_title">Wie wähle ich einen Server aus?</string>
|
||||
<string name="welcome_page3_text">Unterschiedliche Menschen wählen aus verschiedenen Gründen unterschiedliche Server. art.example ist ein toller Ort für Künstler*innen, während glasgow.example eine gute Wahl für Schott*innen sein könnte.\n\nWähle nach Möglichkeit einen kleinen Server aus, mit dessen Regeln du dich wohl fühlst und der dir vertrauenswürdig erscheint (über die Server-Suchleiste kannst du dich direkt mit dem Server deines Vertrauens verbinden).</string>
|
||||
<string name="signup_random_server_explain">Wenn du ohne Auswahl fortfährst, wählen wir einen Server in deiner Sprache aus.</string>
|
||||
<string name="server_filter_any_language">Alle Sprachen</string>
|
||||
<string name="server_filter_instant_signup">Schnellregistrierung</string>
|
||||
@@ -432,4 +426,20 @@
|
||||
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
|
||||
<string name="signup_email_domain_blocked">%1$s lässt keine Anmeldungen von %2$s zu. Versuche einen anderen oder <a>wähle einen anderen Server</a>.</string>
|
||||
<string name="signup_username_taken">Dieser Benutzername ist bereits vergeben.</string>
|
||||
<string name="spoiler_show">Trotzdem anzeigen</string>
|
||||
<string name="spoiler_hide">Wieder verstecken</string>
|
||||
<string name="poll_multiple_choice">Wähle ein/e oder mehrere aus</string>
|
||||
<string name="save_changes">Änderungen speichern</string>
|
||||
<string name="profile_featured">Empfohlen</string>
|
||||
<string name="profile_timeline">Timeline</string>
|
||||
<string name="view_all">Alle anzeigen</string>
|
||||
<string name="profile_endorsed_accounts">Konten</string>
|
||||
<string name="verified_link">Verifizierter Link</string>
|
||||
<string name="show">Anzeigen</string>
|
||||
<string name="hide">Ausblenden</string>
|
||||
<string name="join_default_server">%s beitreten</string>
|
||||
<string name="signup_or_login">oder</string>
|
||||
<string name="learn_more">Mehr erfahren</string>
|
||||
<string name="welcome_to_mastodon">Willkommen auf Mastodon</string>
|
||||
<string name="what_are_servers">Was sind Server?</string>
|
||||
</resources>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<string name="sk_poll_allow_multiple">Mehrfachantworten erlauben</string>
|
||||
<string name="sk_translated_using">Übersetzt mit %s</string>
|
||||
<string name="sk_post_language">Sprache: %s</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_language_name">%1$s (%2$s)</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Sicher, dass du die Liste der zuletzt verwendeten Sprachen leeren willst\?</string>
|
||||
<string name="sk_translate_post">Übersetzen</string>
|
||||
<string name="sk_translate_show_original">Original anzeigen</string>
|
||||
@@ -82,8 +82,8 @@
|
||||
<string name="sk_settings_translation_availability_note_available">%s unterstützt Übersetzung!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s scheint keine Übersetzung zu unterstützen.</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Suche im Fediverse</string>
|
||||
<string name="sk_undo_reblog">Reblog rückgängig machen</string>
|
||||
<string name="sk_reblog_with_visibility">Rebloggen mit Sichtbarkeit</string>
|
||||
<string name="sk_undo_reblog">Teilen rückgängig machen</string>
|
||||
<string name="sk_reblog_with_visibility">Teilen mit Sichtbarkeit</string>
|
||||
<string name="sk_quote_post">Drüberkommentieren</string>
|
||||
<string name="sk_hashtags_you_follow">Hashtags, denen du folgst</string>
|
||||
<string name="sk_copy_link_to_post">Link zum Beitrag kopieren</string>
|
||||
@@ -96,9 +96,9 @@
|
||||
<string name="sk_favorite_as">Favorit mit anderem Konto</string>
|
||||
<string name="sk_favorited_as">Favorisiert als %s</string>
|
||||
<string name="sk_already_favorited">Bereits favorisiert</string>
|
||||
<string name="sk_reblog_as">Mit einem anderen Konto boosten</string>
|
||||
<string name="sk_reblogged_as">Geboostet als %s</string>
|
||||
<string name="sk_already_reblogged">Bereits geboostet</string>
|
||||
<string name="sk_reblog_as">Mit einem anderen Konto teilen</string>
|
||||
<string name="sk_reblogged_as">Geteilt als %s</string>
|
||||
<string name="sk_already_reblogged">Bereits geteilt</string>
|
||||
<string name="sk_reply_as">Antworten mit anderem Konto</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Einheitliches Icon für alle Benachrichtigungen</string>
|
||||
<string name="sk_forward_report_to">Weiterleiten zu %s</string>
|
||||
@@ -164,7 +164,7 @@
|
||||
<string name="sk_alt_text_missing_title">Fehlende Bildbeschreibung</string>
|
||||
<string name="sk_settings_disable_alt_text_reminder">Erinnerung zum Hinzufügen von Bildbeschreibungen ausschalten</string>
|
||||
<string name="sk_alt_button">ALT</string>
|
||||
<string name="sk_notify_update">Bearbeitet einen geteilten Beitrag</string>
|
||||
<string name="sk_notify_update">einen geteilten Beitrag bearbeitet</string>
|
||||
<string name="sk_timelines">Timelines</string>
|
||||
<string name="sk_timeline">Timeline</string>
|
||||
<string name="sk_hashtag">Hashtag</string>
|
||||
@@ -269,6 +269,9 @@
|
||||
<string name="sk_quoting_user">Zitiere %s</string>
|
||||
<string name="sk_notification_action_replied">Antwort an %s gesendet</string>
|
||||
<string name="sk_show_thread">Thread öffnen</string>
|
||||
<string name="sk_compact_reblog_reply_line">Kompakte Geteilt/Geantwortet-Zeile</string>
|
||||
<string name="sk_compact_reblog_reply_line">Kompakte Geteilt-/Geantwortet-Zeile</string>
|
||||
<string name="sk_reply_line_above_avatar">“Als Antwort auf”-Zeile über Profilbild</string>
|
||||
<string name="sk_settings_confirm_before_reblog">Vor dem Teilen bestätigen</string>
|
||||
<string name="sk_reacted">hat reagiert</string>
|
||||
<string name="sk_reacted_with">hat mit %s reagiert</string>
|
||||
</resources>
|
||||
@@ -1,11 +1,448 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="get_started">Δημιουργία λογαριασμού</string>
|
||||
<string name="already_have_account">Έχω ήδη λογαριασμό</string>
|
||||
<string name="log_in">Σύνδεση</string>
|
||||
<string name="next">Επόμενο</string>
|
||||
<string name="loading_instance">Ανάκτηση πληροφοριών διακομιστή…</string>
|
||||
<string name="error">Σφάλμα</string>
|
||||
<string name="not_a_mastodon_instance">Το %s δε φαίνεται να είναι διακομιστής Mastodon.</string>
|
||||
<string name="ok">ΟΚ</string>
|
||||
<string name="preparing_auth">Προετοιμασία για έλεγχο ταυτότητας…</string>
|
||||
<string name="finishing_auth">Ολοκλήρωση ταυτοποίησης…</string>
|
||||
<string name="user_boosted">Ο χρήστης %s ενίσχυσε</string>
|
||||
<string name="in_reply_to">Σε απάντηση στο %s</string>
|
||||
<string name="notifications">Ειδοποιήσεις</string>
|
||||
<string name="user_followed_you">σε ακολουθεί</string>
|
||||
<string name="user_sent_follow_request">σου έστειλε ένα αίτημα ακολούθησης</string>
|
||||
<string name="user_favorited">σημείωσε ως αγαπημένη την ανάρτησή σου</string>
|
||||
<string name="notification_boosted">ενίσχυσε την ανάρτησή σου</string>
|
||||
<string name="poll_ended">η δημοσκόπηση έληξε</string>
|
||||
<string name="time_seconds">%dδλ</string>
|
||||
<string name="time_minutes">%dλ</string>
|
||||
<string name="time_hours">%dω</string>
|
||||
<string name="time_days">%dημ</string>
|
||||
<string name="share_toot_title">Κοινοποίηση</string>
|
||||
<string name="settings">Ρυθμίσεις</string>
|
||||
<string name="publish">Δημοσίευση</string>
|
||||
<string name="discard_draft">Απόρριψη προχείρου;</string>
|
||||
<string name="discard">Απόρριψη</string>
|
||||
<string name="cancel">Άκυρο</string>
|
||||
<plurals name="followers">
|
||||
<item quantity="one">ακόλουθος</item>
|
||||
<item quantity="other">ακόλουθοι</item>
|
||||
</plurals>
|
||||
<plurals name="following">
|
||||
<item quantity="one">ακολουθεί</item>
|
||||
<item quantity="other">ακολουθούν</item>
|
||||
</plurals>
|
||||
<plurals name="posts">
|
||||
<item quantity="one">ανάρτηση</item>
|
||||
<item quantity="other">αναρτήσεις</item>
|
||||
</plurals>
|
||||
<string name="posts">Αναρτήσεις</string>
|
||||
<string name="posts_and_replies">Αναρτήσεις και Απαντήσεις</string>
|
||||
<string name="media">Πολυμέσα</string>
|
||||
<string name="profile_about">Σχετικά</string>
|
||||
<string name="button_follow">Ακολούθησε</string>
|
||||
<string name="button_following">Ακολουθείς</string>
|
||||
<string name="edit_profile">Επεξεργασία Προφίλ</string>
|
||||
<string name="mention_user">Ανάφερε τον @%s</string>
|
||||
<string name="share_user">Κοινοποίηση %s</string>
|
||||
<string name="mute_user">Σίγαση %s</string>
|
||||
<string name="unmute_user">Κατάργηση σίγασης %s</string>
|
||||
<string name="block_user">Αποκλεισμός %s</string>
|
||||
<string name="unblock_user">Άρση αποκλεισμού %s</string>
|
||||
<string name="report_user">Αναφορά %s</string>
|
||||
<string name="block_domain">Αποκλεισμός %s</string>
|
||||
<string name="unblock_domain">Άρση αποκλεισμού %s</string>
|
||||
<plurals name="x_posts">
|
||||
<item quantity="one">%,d ανάρτηση</item>
|
||||
<item quantity="other">%,d αναρτήσεις</item>
|
||||
</plurals>
|
||||
<string name="profile_joined">Έγινε μέλος</string>
|
||||
<string name="done">Έγινε</string>
|
||||
<string name="loading">Φόρτωση…</string>
|
||||
<string name="field_label">Περιγραφή</string>
|
||||
<string name="field_content">Περιεχόμενο</string>
|
||||
<string name="saving">Αποθήκευση…</string>
|
||||
<string name="post_from_user">Ανάρτηση από %s</string>
|
||||
<string name="poll_option_hint">Επιλογή %d</string>
|
||||
<plurals name="x_minutes">
|
||||
<item quantity="one">%d λεπτό</item>
|
||||
<item quantity="other">%d λεπτά</item>
|
||||
</plurals>
|
||||
<plurals name="x_hours">
|
||||
<item quantity="one">%d ώρα</item>
|
||||
<item quantity="other">%d ώρες</item>
|
||||
</plurals>
|
||||
<plurals name="x_days">
|
||||
<item quantity="one">%d ημέρα</item>
|
||||
<item quantity="other">%d ημέρες</item>
|
||||
</plurals>
|
||||
<string name="compose_poll_duration">Διάρκεια: %s</string>
|
||||
<plurals name="x_seconds_left">
|
||||
<item quantity="one">Απομένει %d δευτερόλεπτο</item>
|
||||
<item quantity="other">Απομένουν %d δευτερόλεπτα</item>
|
||||
</plurals>
|
||||
<plurals name="x_minutes_left">
|
||||
<item quantity="one">Απομένει %d λεπτό</item>
|
||||
<item quantity="other">Απομένουν %d λεπτά</item>
|
||||
</plurals>
|
||||
<plurals name="x_hours_left">
|
||||
<item quantity="one">απομένει %d ώρα</item>
|
||||
<item quantity="other">απομένουν %d ώρες</item>
|
||||
</plurals>
|
||||
<plurals name="x_days_left">
|
||||
<item quantity="one">Απομένει %d ημέρα</item>
|
||||
<item quantity="other">απομένουν %d ημέρες</item>
|
||||
</plurals>
|
||||
<plurals name="x_voters">
|
||||
<item quantity="one">%,d ψηφοφόρος</item>
|
||||
<item quantity="other">%,d ψηφοφόροι</item>
|
||||
</plurals>
|
||||
<string name="poll_closed">Κλειστό</string>
|
||||
<string name="confirm_mute_title">Σίγαση Λογαριασμού</string>
|
||||
<string name="confirm_mute">Επιβεβαίωσε για σίγαση %s</string>
|
||||
<string name="do_mute">Σίγαση</string>
|
||||
<string name="confirm_unmute_title">Κατάργηση Σίγασης Λογαριασμού</string>
|
||||
<string name="confirm_unmute">Επιβεβαίωσε για κατάργηση σίγασης %s</string>
|
||||
<string name="do_unmute">Κατάργηση σίγασης</string>
|
||||
<string name="confirm_block_title">Αποκλεισμός Λογαριασμού</string>
|
||||
<string name="confirm_block_domain_title">Αποκλεισμός Τομέα</string>
|
||||
<string name="confirm_block">Επιβεβαίωση αποκλεισμού %s</string>
|
||||
<string name="do_block">Αποκλεισμός</string>
|
||||
<string name="confirm_unblock_title">Άρση Αποκλεισμού Λογαριασμού</string>
|
||||
<string name="confirm_unblock_domain_title">Άρση αποκλεισμού Τομέα</string>
|
||||
<string name="confirm_unblock">Επιβεβαίωση άρσης αποκλεισμού %s</string>
|
||||
<string name="do_unblock">Άρση αποκλεισμού</string>
|
||||
<string name="button_muted">Σε Σίγαση</string>
|
||||
<string name="button_blocked">Αποκλείστηκε</string>
|
||||
<string name="action_vote">Ψήφισε</string>
|
||||
<string name="tap_to_reveal">Πάτα για εμφάνιση</string>
|
||||
<string name="delete">Διαγραφή</string>
|
||||
<string name="confirm_delete_title">Διαγραφή ανάρτησης</string>
|
||||
<string name="confirm_delete">Είσαι βέβαιος ότι θες να διαγράψεις την ανάρτηση;</string>
|
||||
<string name="deleting">Διαγραφή…</string>
|
||||
<string name="notification_channel_audio_player">Αναπαραγωγή ήχου</string>
|
||||
<string name="play">Αναπαραγωγή</string>
|
||||
<string name="pause">Παύση</string>
|
||||
<string name="log_out">Αποσύνδεση</string>
|
||||
<string name="add_account">Προσθήκη λογαριασμού</string>
|
||||
<string name="search_hint">Αναζήτηση</string>
|
||||
<string name="hashtags">Ετικέτες</string>
|
||||
<string name="news">Ειδήσεις</string>
|
||||
<string name="for_you">Για σένα</string>
|
||||
<string name="all_notifications">Όλα</string>
|
||||
<string name="mentions">Επισημάνσεις</string>
|
||||
<plurals name="x_people_talking">
|
||||
<item quantity="one">%d άτομο μιλάει</item>
|
||||
<item quantity="other">%d άτομα μιλάνε</item>
|
||||
</plurals>
|
||||
<plurals name="discussed_x_times">
|
||||
<item quantity="one">Συζητήθηκε %d φορά</item>
|
||||
<item quantity="other">Συζητήθηκε %d φορές</item>
|
||||
</plurals>
|
||||
<string name="report_title">Αναφορά %s</string>
|
||||
<string name="report_choose_reason">Τι πάει λάθος με αυτή την ανάρτηση;</string>
|
||||
<string name="report_choose_reason_account">Τι πάει λάθος με τον/την %s;</string>
|
||||
<string name="report_choose_reason_subtitle">Διάλεξε την καλύτερη αντιστοίχιση</string>
|
||||
<string name="report_reason_personal">Δεν μου αρέσει</string>
|
||||
<string name="report_reason_personal_subtitle">Δεν είναι κάτι που θα ήθελες να δεις</string>
|
||||
<string name="report_reason_spam">Είναι σπαμ</string>
|
||||
<string name="report_reason_spam_subtitle">Κακόβουλοι σύνδεσμοι, πλαστή αλληλεπίδραση ή επαναλαμβανόμενες απαντήσεις</string>
|
||||
<string name="report_reason_violation">Παραβαίνει τους κανόνες του διακομιστή</string>
|
||||
<string name="report_reason_violation_subtitle">Γνωρίζεις ότι παραβιάζει συγκεκριμένους κανόνες</string>
|
||||
<string name="report_reason_other">Είναι κάτι άλλο</string>
|
||||
<string name="report_reason_other_subtitle">Το ζήτημα δεν ταιριάζει σε άλλες κατηγορίες</string>
|
||||
<string name="report_choose_rule">Ποιοι κανόνες παραβιάζονται;</string>
|
||||
<string name="report_choose_rule_subtitle">Επίλεξε όλα όσα ισχύουν</string>
|
||||
<string name="report_choose_posts">Υπάρχουν αναρτήσεις που τεκμηριώνουν αυτή την αναφορά;</string>
|
||||
<string name="report_choose_posts_subtitle">Επίλεξε όλα όσα ισχύουν</string>
|
||||
<string name="report_comment_title">Υπάρχει κάτι άλλο που πρέπει να γνωρίζουμε;</string>
|
||||
<string name="report_comment_hint">Επιπρόσθετα σχόλια</string>
|
||||
<string name="sending_report">Αποστολή αναφοράς…</string>
|
||||
<string name="report_sent_title">Σε ευχαριστούμε για την αναφορά, θα το διερευνήσουμε.</string>
|
||||
<string name="report_sent_subtitle">Ενώ το εξετάζουμε αυτό, μπορείς να δράσεις εναντίον του %s.</string>
|
||||
<string name="unfollow_user">Κατάργηση ακολούθησης του %s</string>
|
||||
<string name="unfollow">Άρση ακολούθησης</string>
|
||||
<string name="mute_user_explain">Δε θα βλέπεις τις αναρτήσεις ή τις ενισχύσεις τους στην αρχική σελίδα σου. Δε θα ξέρουν ότι βρίσκονται σε σίγαση.</string>
|
||||
<string name="block_user_explain">Δε θα μπορούν πλέον να σε ακολουθούν ή να βλέπουν τις αναρτήσεις σου, αλλά μπορούν να δουν αν έχουν αποκλειστεί.</string>
|
||||
<string name="report_personal_title">Δε θες να το βλέπεις αυτό;</string>
|
||||
<string name="report_personal_subtitle">Όταν βλέπεις κάτι που δε σου αρέσει στο Mastodon, μπορείς να αφαιρέσεις το άτομο από την εμπειρία σου.</string>
|
||||
<string name="back">Πίσω</string>
|
||||
<string name="instance_catalog_title">Το Mastodon αποτελείται από χρήστες σε διαφορετικούς διακομιστές.</string>
|
||||
<string name="instance_catalog_subtitle">Διάλεξε ένα διακομιστή με βάση τα ενδιαφέροντά σου, την περιοχή ή έναν γενικού σκοπού. Μπορείς ακόμα να συνδεθείς με όλους, ανεξάρτητα από το διακομιστή.</string>
|
||||
<string name="search_communities">Όνομα διακομιστή ή διεύθυνση URL</string>
|
||||
<string name="instance_rules_title">Κανόνες Διακομιστή</string>
|
||||
<string name="instance_rules_subtitle">Συνεχίζοντας, συμφωνείς να τηρείς τους ακόλουθους κανόνες που έχουν οριστεί και επιβάλλονται από τους %s συντονιστές.</string>
|
||||
<string name="signup_title">Δημιουργία Λογαριασμού</string>
|
||||
<string name="edit_photo">επεξεργασία</string>
|
||||
<string name="display_name">Όνομα</string>
|
||||
<string name="username">Όνομα χρήστη</string>
|
||||
<string name="email">Email</string>
|
||||
<string name="password">Κωδικός πρόσβασης</string>
|
||||
<string name="confirm_password">Επιβεβαίωση κωδικού πρόσβασης</string>
|
||||
<string name="password_note">Να συμπεριλάβεις κεφαλαία γράμματα, ειδικούς χαρακτήρες και αριθμούς για να αυξήσεις την ισχύ του κωδικού πρόσβασης.</string>
|
||||
<string name="category_academia">Ακαδημία</string>
|
||||
<string name="category_activism">Ακτιβισμός</string>
|
||||
<string name="category_all">Όλα</string>
|
||||
<string name="category_art">Τέχνη</string>
|
||||
<string name="category_food">Φαγητό</string>
|
||||
<string name="category_furry">Γούνινη</string>
|
||||
<string name="category_games">Παιχνίδια</string>
|
||||
<string name="category_general">Γενικά</string>
|
||||
<string name="category_journalism">Δημοσιογραφία</string>
|
||||
<string name="category_lgbt">LGBT</string>
|
||||
<string name="category_music">Μουσική</string>
|
||||
<string name="category_regional">Τοπικό</string>
|
||||
<string name="category_tech">Τεχνολογία</string>
|
||||
<string name="confirm_email_title">Έλεγξε τα Εισερχόμενα σου</string>
|
||||
<!-- %s is the email address -->
|
||||
<string name="confirm_email_subtitle">Πάτησε το σύνδεσμο που σου στείλαμε για να επαληθεύσεις το %s. Θα σε περιμένουμε εδώ.</string>
|
||||
<string name="confirm_email_didnt_get">Δεν έλαβες τον σύνδεσμο;</string>
|
||||
<string name="resend">Επαναποστολή</string>
|
||||
<string name="open_email_app">Άνοιγμα εφαρμογής email</string>
|
||||
<string name="resent_email">Το email επιβεβαίωσης εστάλη</string>
|
||||
<string name="compose_hint">Πληκτρολόγησε ή επικόλλησε τί έχεις στο μυαλό σου</string>
|
||||
<string name="content_warning">Προειδοποίηση περιεχομένου</string>
|
||||
<string name="add_image_description">Προσθήκη περιγραφής εικόνας…</string>
|
||||
<string name="retry_upload">Επανάληψη μεταμόρφωσης</string>
|
||||
<string name="edit_image">Επεξεργασία εικόνας</string>
|
||||
<string name="save">Αποθήκευση</string>
|
||||
<string name="add_alt_text">Προσθήκη εναλλακτικού κειμένου</string>
|
||||
<string name="alt_text_subtitle">Το εναλλακτικό κείμενο περιγράφει τις φωτογραφίες σου για άτομα με χαμηλή ή καθόλου όραση. Προσπάθησε να συμπεριλάβεις μόνο όσες λεπτομέρειες χρειάζεται για να γίνει κατανοητό το περιεχόμενο.</string>
|
||||
<string name="alt_text_hint">πχ. Ένας σκύλος που κοιτάζει γύρω του ύποπτα με μισόκλειστα μάτια στην κάμερα.</string>
|
||||
<string name="visibility_public">Δημόσιο</string>
|
||||
<string name="visibility_followers_only">Μόνο ακόλουθοι</string>
|
||||
<string name="visibility_private">Μόνο άτομα που επισημαίνω</string>
|
||||
<string name="search_all">Όλα</string>
|
||||
<string name="search_people">Άτομα</string>
|
||||
<string name="recent_searches">Πρόσφατες αναζητήσεις</string>
|
||||
<string name="step_x_of_n">Βήμα %1$d από %2$d</string>
|
||||
<string name="skip">Παράλειψη</string>
|
||||
<string name="notification_type_follow">Νέοι ακόλουθοι</string>
|
||||
<string name="notification_type_favorite">Αγαπημένα</string>
|
||||
<string name="notification_type_reblog">Ενισχύσεις</string>
|
||||
<string name="notification_type_mention">Επισημάνσεις</string>
|
||||
<string name="notification_type_poll">Δημοσκοπήσεις</string>
|
||||
<string name="choose_account">Επιλογή λογαριασμού</string>
|
||||
<string name="err_not_logged_in">Παρακαλώ συνδέσου πρώτα στο Mastodon</string>
|
||||
<plurals name="cant_add_more_than_x_attachments">
|
||||
<item quantity="one">Δεν μπορείς να προσθέσεις περισσότερα από %d συνημμένο πολυμέσων</item>
|
||||
<item quantity="other">Δεν μπορείς να προσθέσεις περισσότερα από %d συνημμένα πολυμέσων</item>
|
||||
</plurals>
|
||||
<string name="media_attachment_unsupported_type">Το αρχείο %s είναι μη υποστηριζόμενου τύπου</string>
|
||||
<string name="media_attachment_too_big">Το αρχείο %1$s υπερβαίνει το όριο μεγέθους των %2$s MB</string>
|
||||
<string name="settings_theme">Οπτική εμφάνιση</string>
|
||||
<string name="theme_auto">Αυτόματο</string>
|
||||
<string name="theme_light">Φωτεινό</string>
|
||||
<string name="theme_dark">Σκοτεινό</string>
|
||||
<string name="theme_true_black">Λειτουργία απόλυτου μαύρου</string>
|
||||
<string name="settings_behavior">Συμπεριφορά</string>
|
||||
<string name="settings_gif">Αναπαραγωγή κινούμενων άβαταρ και εμότζι</string>
|
||||
<string name="settings_custom_tabs">Χρήση περιηγητή εντός εφαρμογής</string>
|
||||
<string name="settings_notifications">Ειδοποιήσεις</string>
|
||||
<string name="notify_me_when">Να ειδοποιούμαι όταν</string>
|
||||
<string name="notify_anyone">οποιοσδήποτε</string>
|
||||
<string name="notify_follower">ακόλουθος</string>
|
||||
<string name="notify_followed">κάποιος που ακολουθώ</string>
|
||||
<string name="notify_none">κανείς</string>
|
||||
<string name="notify_favorites">Προσθέτει στα αγαπημένα την ανάρτησή μου</string>
|
||||
<string name="notify_follow">Με ακολουθεί</string>
|
||||
<string name="notify_reblog">Ενισχύει την ανάρτησή μου</string>
|
||||
<string name="notify_mention">Με επισημαίνει</string>
|
||||
<string name="settings_boring">Η ζώνη της βαρεμάρας</string>
|
||||
<string name="settings_account">Ρυθμίσεις λογαριασμού</string>
|
||||
<string name="settings_contribute">Συνείσφερε στο Mastodon</string>
|
||||
<string name="settings_tos">Όροι χρήσης</string>
|
||||
<string name="settings_privacy_policy">Πολιτική απορρήτου</string>
|
||||
<string name="settings_spicy">Η πικάντικη ζώνη</string>
|
||||
<string name="settings_clear_cache">Εκκαθάριση προσωρινής μνήμης πολυμέσων</string>
|
||||
<string name="settings_app_version">Mastodon για Android v%1$s (%2$d)</string>
|
||||
<string name="media_cache_cleared">Η προσωρινή μνήμη πολυμέσων καθαρίστηκε</string>
|
||||
<string name="confirm_log_out">Είσαι βέβαιος ότι θες να αποσυνδεθείς;</string>
|
||||
<string name="sensitive_content">Ευαίσθητο περιεχόμενο</string>
|
||||
<string name="sensitive_content_explain">Ο συντάκτης σηματοδότησε αυτό το αρχείο πολυμέσων ως ευαίσθητο. Πάτησε για να το αποκαλύψεις.</string>
|
||||
<string name="media_hidden">Πάτα για εμφάνιση</string>
|
||||
<string name="avatar_description">Μετάβαση στο προφίλ του %s</string>
|
||||
<string name="more_options">Περισσότερες επιλογές</string>
|
||||
<string name="reveal_content">Αποκάλυψη περιεχομένου</string>
|
||||
<string name="hide_content">Απόκρυψη περιεχομένου</string>
|
||||
<string name="new_post">Νέα ανάρτηση</string>
|
||||
<string name="button_reply">Απάντηση</string>
|
||||
<string name="button_reblog">Ενίσχυση</string>
|
||||
<string name="button_favorite">Αγαπημένο</string>
|
||||
<string name="button_share">Κοινοποίηση</string>
|
||||
<string name="media_no_description">Πολυμέσα χωρίς περιγραφή</string>
|
||||
<string name="add_media">Προσθήκη πολυμέσων</string>
|
||||
<string name="add_poll">Προσθήκη δημοσκόπησης</string>
|
||||
<string name="emoji">Emoji</string>
|
||||
<string name="post_visibility">Ορατότητα ανάρτησης</string>
|
||||
<string name="home_timeline">Αρχική</string>
|
||||
<string name="my_profile">Το προφίλ μου</string>
|
||||
<string name="media_viewer">Αναπαραγωγέας πολυμέσων</string>
|
||||
<string name="follow_user">Ακολούθησε %s</string>
|
||||
<string name="unfollowed_user">Κατάργηση ακολούθησης του %s</string>
|
||||
<string name="followed_user">Ακολουθείς τον/την %s</string>
|
||||
<string name="following_user_requested">Έγινε αίτημα ακολούθησης του/της %s</string>
|
||||
<string name="open_in_browser">Άνοιξε στον περιηγητή</string>
|
||||
<string name="hide_boosts_from_user">Απόκρυψη ενισχύσεων από @%s</string>
|
||||
<string name="show_boosts_from_user">Εμφάνιση ενισχύσεων από @%s</string>
|
||||
<string name="signup_reason">Γιατί θέλεις να συμμετάσχεις;</string>
|
||||
<string name="signup_reason_note">Αυτό θα μας βοηθήσει να εξετάσουμε την αίτησή σου.</string>
|
||||
<string name="clear">Εκκαθάριση</string>
|
||||
<string name="profile_header">Εικόνα κεφαλίδας</string>
|
||||
<string name="profile_picture">Εικόνα προφίλ</string>
|
||||
<string name="reorder">Αναδιάταξη</string>
|
||||
<string name="download">Λήψη</string>
|
||||
<string name="permission_required">Απαιτούνται δικαιώματα</string>
|
||||
<string name="storage_permission_to_download">Η εφαρμογή χρειάζεται πρόσβαση στον αποθηκευτικό σου χώρο για να αποθηκεύσει αυτό το αρχείο.</string>
|
||||
<string name="open_settings">Άνοιγμα ρυθμίσεων</string>
|
||||
<string name="error_saving_file">Σφάλμα αποθήκευσης αρχείου</string>
|
||||
<string name="file_saved">Το αρχείο αποθηκεύτηκε</string>
|
||||
<string name="downloading">Λήψη…</string>
|
||||
<string name="no_app_to_handle_action">Δεν υπάρχει εφαρμογή για να χειριστεί αυτήν την ενέργεια</string>
|
||||
<string name="local_timeline">Κοινότητα</string>
|
||||
<string name="trending_posts_info_banner">Αυτές είναι οι αναρτήσεις που κερδίζουν την προσοχή στη δική σου γωνιά του Mastodon.</string>
|
||||
<string name="trending_hashtags_info_banner">Αυτές είναι οι ετικέτες που κερδίζουν την προσοχή στη δική σου γωνιά του Mastodon.</string>
|
||||
<string name="trending_links_info_banner">Αυτές είναι οι ειδήσεις που μοιράζονται περισσότερο στη δική σου γωνιά στο Mastodon.</string>
|
||||
<string name="local_timeline_info_banner">Αυτές είναι οι πιο πρόσφατες αναρτήσεις από τα άτομα που χρησιμοποιούν τον ίδιο διακομιστή Mastodon με εσένα.</string>
|
||||
<string name="dismiss">Παράβλεψη</string>
|
||||
<string name="see_new_posts">Δες νέες αναρτήσεις</string>
|
||||
<string name="load_missing_posts">Φόρτωση αναρτήσεων που λείπουν</string>
|
||||
<string name="follow_back">Ακολούθησε και εσύ</string>
|
||||
<string name="button_follow_pending">Εκκρεμεί</string>
|
||||
<string name="follows_you">Σε ακολουθεί</string>
|
||||
<string name="manually_approves_followers">Χειροκίνητη έγκριση ακολούθων</string>
|
||||
<string name="current_account">Τρέχων λογαριασμός</string>
|
||||
<string name="log_out_account">Αποσύνδεση %s</string>
|
||||
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
|
||||
<plurals name="x_followers">
|
||||
<item quantity="one">%,d ακόλουθος</item>
|
||||
<item quantity="other">%,d ακόλουθοι</item>
|
||||
</plurals>
|
||||
<plurals name="x_following">
|
||||
<item quantity="one">%,d ακολουθεί</item>
|
||||
<item quantity="other">%,d ακολουθούν</item>
|
||||
</plurals>
|
||||
<plurals name="x_favorites">
|
||||
<item quantity="one">%,d αγαπημένο</item>
|
||||
<item quantity="other">%,d αγαπημένα</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">%,d ενίσχυση</item>
|
||||
<item quantity="other">%,d ενισχύσεις</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s μέσω %2$s</string>
|
||||
<string name="time_now">τώρα</string>
|
||||
<string name="post_info_reblogs">Ενισχύσεις</string>
|
||||
<string name="post_info_favorites">Αγαπημένα</string>
|
||||
<string name="edit_history">Επεξεργασία ιστορικού</string>
|
||||
<string name="last_edit_at_x">Τελευταία επεξεργασία %s</string>
|
||||
<string name="time_just_now">μόλις τώρα</string>
|
||||
<plurals name="x_seconds_ago">
|
||||
<item quantity="one">%d δευτερόλεπτο πριν</item>
|
||||
<item quantity="other">%d δευτερόλεπτα πριν</item>
|
||||
</plurals>
|
||||
<plurals name="x_minutes_ago">
|
||||
<item quantity="one">%d λεπτό πριν</item>
|
||||
<item quantity="other">%d λεπτά πριν</item>
|
||||
</plurals>
|
||||
<string name="edited_timestamp">επεξεργάστηκε στις %s</string>
|
||||
<string name="edit_original_post">Αρχική ανάρτηση</string>
|
||||
<string name="edit_text_edited">Το κείμενο επεξεργάστηκε</string>
|
||||
<string name="edit_spoiler_added">Προστέθηκε προειδοποίηση περιεχομένου</string>
|
||||
<string name="edit_spoiler_edited">Επεξεργάστηκε η προειδοποίηση περιεχομένου</string>
|
||||
<string name="edit_spoiler_removed">Η προειδοποίηση περιεχομένου αφαιρέθηκε</string>
|
||||
<string name="edit_poll_added">Προστέθηκε δημοσκόπηση</string>
|
||||
<string name="edit_poll_edited">Η δημοσκόπηση επεξεργάστηκε</string>
|
||||
<string name="edit_poll_removed">Η δημοσκόπηση αφαιρέθηκε</string>
|
||||
<string name="edit_media_added">Προστέθηκε πολυμέσο</string>
|
||||
<string name="edit_media_removed">Το πολυμέσο αφαιρέθηκε</string>
|
||||
<string name="edit_media_reordered">Τα πολυμέσο ανακατατάχθηκε</string>
|
||||
<string name="edit_marked_sensitive">Επισημάνθηκε ως ευαίσθητο</string>
|
||||
<string name="edit_marked_not_sensitive">Επισημάνθηκε ως μη ευαίσθητο</string>
|
||||
<string name="edit_multiple_changed">Η ανάρτηση επεξεργάστηκε</string>
|
||||
<string name="edit">Επεξεργασία</string>
|
||||
<string name="discard_changes">Απόρριψη αλλαγών;</string>
|
||||
<string name="upload_failed">Αποτυχία μεταμόρφωσης</string>
|
||||
<string name="file_size_bytes">%d bytes</string>
|
||||
<string name="file_size_kb">%.2f KB</string>
|
||||
<string name="file_size_mb">%.2f MB</string>
|
||||
<string name="file_size_gb">%.2f GB</string>
|
||||
<string name="file_upload_progress">%1$s από %2$s</string>
|
||||
<string name="file_upload_time_remaining">%s απομένουν</string>
|
||||
<string name="upload_error_connection_lost">Η συσκευή σου έχασε τη σύνδεση με το διαδίκτυο</string>
|
||||
<string name="upload_processing">Επεξεργασία…</string>
|
||||
<!-- %s is version like 1.2.3 -->
|
||||
<string name="update_available">Το Mastodon για Android %s είναι έτοιμο για λήψη.</string>
|
||||
<!-- %s is version like 1.2.3 -->
|
||||
<string name="update_ready">Το Mastodon για Android %s ελήφθη και είναι έτοιμο για εγκατάσταση.</string>
|
||||
<!-- %s is file size -->
|
||||
<string name="download_update">Λήψη (%s)</string>
|
||||
<string name="install_update">Εγκατάσταση</string>
|
||||
<string name="privacy_policy_title">Το Απόρρητό σου</string>
|
||||
<string name="privacy_policy_subtitle">Αν και η εφαρμογή Mastodon δεν συλλέγει δεδομένα, ο διακομιστής που εγγράφεσαι μπορεί να έχει διαφορετική πολιτική.\n\nΕάν διαφωνείς με την πολιτική του %s, μπορείς να επιστρέψεις και να επιλέξεις διαφορετικό διακομιστή.</string>
|
||||
<string name="i_agree">Συμφωνώ</string>
|
||||
<string name="empty_list">Αυτή η λίστα είναι κενή</string>
|
||||
<string name="instance_signup_closed">Αυτός ο διακομιστής δεν δέχεται νέες εγγραφές.</string>
|
||||
<string name="text_copied">Αντιγράφηκε στο πρόχειρο</string>
|
||||
<string name="add_bookmark">Σελιδοδείκτης</string>
|
||||
<string name="remove_bookmark">Αφαίρεση σελιδοδείκτη</string>
|
||||
<string name="bookmarks">Σελιδοδείκτες</string>
|
||||
<string name="your_favorites">Τα Αγαπημένα σας</string>
|
||||
<string name="login_title">Καλώς Ήρθες Ξανά</string>
|
||||
<string name="login_subtitle">Συνδέσου με τον διακομιστή όπου δημιούργησες τον λογαριασμό σου.</string>
|
||||
<string name="server_url">URL διακομιστή</string>
|
||||
<string name="signup_random_server_explain">Θα διαλέξουμε ένα διακομιστή με βάση τη γλώσσα σας αν συνεχίσεις χωρίς να κάνεις μια επιλογή.</string>
|
||||
<string name="server_filter_any_language">Οποιαδήποτε Γλώσσα</string>
|
||||
<string name="server_filter_instant_signup">Άμεση Εγγραφή</string>
|
||||
<string name="server_filter_manual_review">Χειροκίνητη Αξιολόγηση</string>
|
||||
<string name="server_filter_any_signup_speed">Οποιαδήποτε Ταχύτητα Εγγραφής</string>
|
||||
<string name="server_filter_region_europe">Ευρώπη</string>
|
||||
<string name="server_filter_region_north_america">Βόρεια Αμερική</string>
|
||||
<string name="server_filter_region_south_america">Νότια Αμερική</string>
|
||||
<string name="server_filter_region_africa">Αφρική</string>
|
||||
<string name="server_filter_region_asia">Ασία</string>
|
||||
<string name="server_filter_region_oceania">Oceania</string>
|
||||
<string name="not_accepting_new_members">Δεν δέχεται νέα μέλη</string>
|
||||
<string name="category_special_interests">Ειδικά Ενδιαφέροντα</string>
|
||||
<string name="signup_passwords_dont_match">Οι κωδικοί πρόσβασης δεν ταιριάζουν</string>
|
||||
<string name="pick_server_for_me">Διάλεξε για μένα</string>
|
||||
<string name="profile_add_row">Προσθήκη γραμμής</string>
|
||||
<string name="profile_setup">Ρύθμιση προφίλ</string>
|
||||
<string name="profile_setup_subtitle">Μπορείς πάντα να το ολοκληρώσεις αργότερα στην καρτέλα Προφίλ.</string>
|
||||
<string name="profile_setup_explanation">Μπορείς να προσθέσεις έως και τέσσερα πεδία προφίλ για οτιδήποτε θες. Τοποθεσία, συνδέσμους, αντωνυμίες - δεν υπάρχουν όρια.</string>
|
||||
<string name="popular_on_mastodon">Δημοφιλή στο Mastodon</string>
|
||||
<string name="follow_all">Ακολούθησε όλους</string>
|
||||
<string name="server_rules_disagree">Διαφωνώ</string>
|
||||
<string name="privacy_policy_explanation">Σύνοψη: Δεν συλλέγουμε ή επεξεργαζόμαστε τίποτα.</string>
|
||||
<!-- %s is server domain -->
|
||||
<string name="server_policy_disagree">Διαφωνώ με %s</string>
|
||||
<string name="profile_bio">Βιογραφικό</string>
|
||||
<!-- Shown in a progress dialog when you tap "follow all" -->
|
||||
<string name="sending_follows">Ακολούθηση χρηστών…</string>
|
||||
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
|
||||
<string name="signup_email_domain_blocked">Ο %1$s δεν επιτρέπει εγγραφές από %2$s. Δοκιμάστε μια διαφορετική ή <a>επιλέξτε έναν διαφορετικό διακομιστή</a>.</string>
|
||||
<string name="signup_username_taken">Αυτό το όνομα χρήστη χρησιμοποιείται.</string>
|
||||
<string name="spoiler_show">Εμφάνιση ούτως ή άλλως</string>
|
||||
<string name="spoiler_hide">Απόκρυψη ξανά</string>
|
||||
<string name="poll_multiple_choice">Επίλεξε ένα ή περισσότερα</string>
|
||||
<string name="save_changes">Αποθήκευση αλλαγών</string>
|
||||
<string name="profile_featured">Προτεινόμενα</string>
|
||||
<string name="profile_timeline">Ροή</string>
|
||||
<string name="view_all">Εμφάνιση όλων</string>
|
||||
<string name="profile_endorsed_accounts">Λογαριασμοί</string>
|
||||
<string name="verified_link">Επαληθευμένος σύνδεσμος</string>
|
||||
<string name="show">Εμφάνιση</string>
|
||||
<string name="hide">Απόκρυψη</string>
|
||||
<string name="join_default_server">Συμμετοχή %s</string>
|
||||
<string name="pick_server">Διάλεξε άλλο διακομιστή</string>
|
||||
<string name="signup_or_login">ή</string>
|
||||
<string name="learn_more">Μάθε περισσότερα</string>
|
||||
<string name="welcome_to_mastodon">Καλώς ήρθες στο Mastodon</string>
|
||||
<string name="welcome_paragraph1">Το Mastodon είναι ένα αποκεντρωμένο κοινωνικό δίκτυο που σημαίνει ότι καμία εταιρεία δεν το ελέγχει. Αποτελείται από πολλούς ανεξάρτητους διακομιστές, όλοι συνδεδεμένοι μαζί.</string>
|
||||
<string name="what_are_servers">Τι είναι οι διακομιστές;</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Κάθε λογαριασμός Mastodon φιλοξενείται σε ένα διακομιστή - ο καθένας με τις δικές του αξίες, κανόνες και διαχειριστές. Ανεξάρτητα από το ποιον μπορεί να επιλέξεις, μπορείς να ακολουθήσεις και να αλληλεπιδράσεις με άτομα από οποιονδήποτε διακομιστή.]]></string>
|
||||
</resources>
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
<string name="ok">Aceptar</string>
|
||||
<string name="preparing_auth">Preparando para autenticación…</string>
|
||||
<string name="finishing_auth">Finalizando autenticación…</string>
|
||||
<string name="user_boosted">%s reblogueó</string>
|
||||
<string name="user_boosted">%s retooteó</string>
|
||||
<string name="in_reply_to">En respuesta a %s</string>
|
||||
<string name="notifications">Notificaciones</string>
|
||||
<string name="user_followed_you">ha empezado a seguirte</string>
|
||||
<string name="user_sent_follow_request">te envió una solicitud de seguimiento</string>
|
||||
<string name="user_favorited">marcó como favorita</string>
|
||||
<string name="notification_boosted">reblogueó</string>
|
||||
<string name="notification_boosted">retooteó tu publicación</string>
|
||||
<string name="poll_ended">encuesta finalizada</string>
|
||||
<string name="time_seconds">%ds</string>
|
||||
<string name="time_minutes">%dm</string>
|
||||
@@ -171,7 +171,7 @@
|
||||
<string name="report_personal_title">¿No quieres ver esto?</string>
|
||||
<string name="report_personal_subtitle">Cuando vea en Mastodon algo que no le agrada, puede sacar a la persona de su experiencia.</string>
|
||||
<string name="back">Atrás</string>
|
||||
<string name="instance_catalog_title">Mastodon está hecho por usuarios den diferentes servidores.</string>
|
||||
<string name="instance_catalog_title">Mastodon está hecho por usuarios de diferentes servidores.</string>
|
||||
<string name="instance_catalog_subtitle">Selecciona un servidor basado en tus intereses, región o un propósito general. Aun así puedes conectarte con todo el mundo, sin importar el servidor.</string>
|
||||
<string name="search_communities">Nombre del servidor o URL</string>
|
||||
<string name="instance_rules_title">Reglas del servidor</string>
|
||||
@@ -223,7 +223,7 @@
|
||||
<string name="skip">Saltar</string>
|
||||
<string name="notification_type_follow">Nuevos seguidores</string>
|
||||
<string name="notification_type_favorite">Favoritos</string>
|
||||
<string name="notification_type_reblog">Reblogueos</string>
|
||||
<string name="notification_type_reblog">Retoots</string>
|
||||
<string name="notification_type_mention">Menciones</string>
|
||||
<string name="notification_type_poll">Encuestas</string>
|
||||
<string name="choose_account">Elegir cuenta</string>
|
||||
@@ -250,7 +250,7 @@
|
||||
<string name="notify_none">nadie</string>
|
||||
<string name="notify_favorites">Marca mi post como favorito</string>
|
||||
<string name="notify_follow">Me sigue</string>
|
||||
<string name="notify_reblog">Impulsa mi post</string>
|
||||
<string name="notify_reblog">Retootearán mi publicación</string>
|
||||
<string name="notify_mention">Me menciona</string>
|
||||
<string name="settings_boring">La zona aburrida</string>
|
||||
<string name="settings_account">Ajustes de la cuenta</string>
|
||||
@@ -271,7 +271,7 @@
|
||||
<string name="hide_content">Ocultar contenido</string>
|
||||
<string name="new_post">Nuevo post</string>
|
||||
<string name="button_reply">Responder</string>
|
||||
<string name="button_reblog">Impulsar</string>
|
||||
<string name="button_reblog">Retootear</string>
|
||||
<string name="button_favorite">Favorito</string>
|
||||
<string name="button_share">Compartir</string>
|
||||
<string name="media_no_description">Medios sin descripción</string>
|
||||
@@ -285,9 +285,10 @@
|
||||
<string name="follow_user">Seguir a %s</string>
|
||||
<string name="unfollowed_user">No sigues a %s</string>
|
||||
<string name="followed_user">Ahora estás siguiendo a %s</string>
|
||||
<string name="following_user_requested">%s solicitó seguirte</string>
|
||||
<string name="open_in_browser">Abrir en el navegador</string>
|
||||
<string name="hide_boosts_from_user">Ocultar reblogueos de %s</string>
|
||||
<string name="show_boosts_from_user">Mostrar reblogueos de %s</string>
|
||||
<string name="hide_boosts_from_user">Ocultar retoots de %s</string>
|
||||
<string name="show_boosts_from_user">Mostrar retoots de %s</string>
|
||||
<string name="signup_reason">¿Por qué quieres unirte?</string>
|
||||
<string name="signup_reason_note">Esto nos ayudará a revisar su solicitud.</string>
|
||||
<string name="clear">Borrar</string>
|
||||
@@ -330,12 +331,12 @@
|
||||
<item quantity="other">%,d favoritos</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">%,d reblogueo</item>
|
||||
<item quantity="other">%,d reblogueos</item>
|
||||
<item quantity="one">%,d retooteo</item>
|
||||
<item quantity="other">%,d retooteos</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s a través de %2$s</string>
|
||||
<string name="time_now">ahora</string>
|
||||
<string name="post_info_reblogs">Reblogueos</string>
|
||||
<string name="post_info_reblogs">Retoots</string>
|
||||
<string name="post_info_favorites">Favoritos</string>
|
||||
<string name="edit_history">Editar historial</string>
|
||||
<string name="last_edit_at_x">Última edición: %s</string>
|
||||
@@ -394,12 +395,6 @@
|
||||
<string name="login_title">Qué bueno verle de nuevo</string>
|
||||
<string name="login_subtitle">Inicie sesión con el servidor donde creó su cuenta.</string>
|
||||
<string name="server_url">URL del servidor</string>
|
||||
<string name="welcome_page1_title">¿Qué es Mastodon?</string>
|
||||
<string name="welcome_page1_text">Imagina que tienes una dirección de correo electrónico que termina con @ejemplo.com.\n\nPuedes enviar y recibir correos electrónicos de cualquier persona, incluso si su correo electrónico termina en @gmail.com o @icloud.com o @ejemplo.com.</string>
|
||||
<string name="welcome_page2_title">Mastodon es parecido.</string>
|
||||
<string name="welcome_page2_text">Tu cuenta puede ser @gothgirl654@example.social, pero puedes seguir, rebloguear, y chatear con @fallout5ever@example.online.</string>
|
||||
<string name="welcome_page3_title">¿Cómo elijo un servidor?</string>
|
||||
<string name="welcome_page3_text">Diferentes personas eligen diferentes servidores por diferentes motivos. Por ejemplo, art.example es un buen lugar para artistas, mientras que madrid.example puede ser una buena elección para los madrileños.\n\nNo te equivocarás con ninguno de nuestros servidores recomendados, por lo que independientemente del que escojas (o si introduces tu propio servidor en la barra de búsqueda), no te perderás ni una en ningún lugar.</string>
|
||||
<string name="signup_random_server_explain">Seleccionaremos un servidor basado en tu idioma si continúas sin hacer una selección.</string>
|
||||
<string name="server_filter_any_language">Cualquier idioma</string>
|
||||
<string name="server_filter_instant_signup">Registro instantáneo</string>
|
||||
@@ -431,4 +426,23 @@
|
||||
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
|
||||
<string name="signup_email_domain_blocked">%1$s no permite registros desde %2$s. Prueba uno diferente o <a>elige un servidor diferente</a>.</string>
|
||||
<string name="signup_username_taken">Este nombre de usuario ya existe.</string>
|
||||
<string name="spoiler_show">Mostrar de todos modos</string>
|
||||
<string name="spoiler_hide">Volver a ocultar</string>
|
||||
<string name="poll_multiple_choice">Escoge una o más</string>
|
||||
<string name="save_changes">Guardar cambios</string>
|
||||
<string name="profile_featured">Destacado</string>
|
||||
<string name="profile_timeline">Línea de tiempo</string>
|
||||
<string name="view_all">Ver todo</string>
|
||||
<string name="profile_endorsed_accounts">Cuentas</string>
|
||||
<string name="verified_link">Enlace verificado</string>
|
||||
<string name="show">Mostrar</string>
|
||||
<string name="hide">Ocultar</string>
|
||||
<string name="join_default_server">Unirse a %s</string>
|
||||
<string name="pick_server">Elegir otro servidor</string>
|
||||
<string name="signup_or_login">o</string>
|
||||
<string name="learn_more">Saber más</string>
|
||||
<string name="welcome_to_mastodon">Bienvenido/da a Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon es una red social descentralizada, lo que significa que no la controla una sola compañía. Está formada por muchos servidores independientes, todos juntos conectados.</string>
|
||||
<string name="what_are_servers">¿Qué son los servidores?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Cada cuenta de Mastodon está alojada en un servidor — cada uno con sus propios valores, reglas y administradores. No importa cual elijas, puede seguir e interactuar con personas en cualquier servidor.]]></string>
|
||||
</resources>
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<string name="sk_translated_using">Traducido mediante %s</string>
|
||||
<string name="sk_post_language">Idioma: %s</string>
|
||||
<string name="sk_available_languages">Idiomas disponibles</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_language_name">%1$s (%2$s)</string>
|
||||
<string name="sk_confirm_clear_recent_languages">¿Seguro que quieres borrar los idiomas usados recientemente\?</string>
|
||||
<string name="sk_clear_recent_languages">Borrar idiomas usados recientemente</string>
|
||||
<string name="sk_welcome_text">¡El tiburón te saluda! Para empezar, introduce a continuación el nombre del dominio de tu instancia.</string>
|
||||
@@ -262,7 +262,7 @@
|
||||
<string name="sk_follow_as">Seguir desde otra cuenta</string>
|
||||
<string name="sk_followed_as">Seguido desde %s</string>
|
||||
<string name="sk_settings_hide_fab">Ocultar automáticamente el botón Redactar</string>
|
||||
<string name="sk_in_reply">Respondiendo a</string>
|
||||
<string name="sk_in_reply">En respuesta</string>
|
||||
<string name="sk_quoting_user">Citando %s</string>
|
||||
<string name="sk_settings_reply_visibility">Visibilidad de la respuesta</string>
|
||||
<string name="sk_settings_reply_visibility_all">Todas las respuestas</string>
|
||||
@@ -272,4 +272,5 @@
|
||||
<string name="sk_reply_line_above_avatar">\"En respuesta a\" línea sobre el avatar</string>
|
||||
<string name="sk_show_thread">Mostrar hilo</string>
|
||||
<string name="sk_compact_reblog_reply_line">Línea compacta de reblog/respuesta</string>
|
||||
<string name="sk_settings_confirm_before_reblog">Confirmar antes de volver a publicar</string>
|
||||
</resources>
|
||||
@@ -10,13 +10,11 @@
|
||||
<string name="ok">Ados</string>
|
||||
<string name="preparing_auth">Autentifikaziorako prestatzen…</string>
|
||||
<string name="finishing_auth">Autentikazioa bukatzen…</string>
|
||||
<string name="user_boosted">%s(e)k bultzatu du</string>
|
||||
<string name="in_reply_to">%s-(r)i erantzunez</string>
|
||||
<string name="notifications">Jakinarazpenak</string>
|
||||
<string name="user_followed_you">jarraitu zaitu</string>
|
||||
<string name="user_sent_follow_request">jarraitzeko eskaera bidali dizu</string>
|
||||
<string name="user_favorited">zure bidalketa gogoko du</string>
|
||||
<string name="notification_boosted">zure bidalketa bultzatu du</string>
|
||||
<string name="poll_ended">inkesta amaitu da</string>
|
||||
<string name="time_seconds">%ds</string>
|
||||
<string name="time_minutes">%dm</string>
|
||||
@@ -166,7 +164,6 @@
|
||||
<string name="report_sent_subtitle">Hau berrikusten dugun bitartean, %s erabiltzailearen aurkako neurriak hartu ditzakezu.</string>
|
||||
<string name="unfollow_user">%s jarraitzeari utzi</string>
|
||||
<string name="unfollow">Utzi jarraitzeari</string>
|
||||
<string name="mute_user_explain">Ez dituzu bere bidalketa eta birbidalketak zure hasierako jarioan ikusiko. Ez dute jakingo isilarazi dituztenik.</string>
|
||||
<string name="block_user_explain">Ezin izango dituzte zure bidalketak jarraitu edo ikusi, baina blokeatuta dauden ikusi ahal izango dute.</string>
|
||||
<string name="report_personal_title">Ez duzu hau ikusi nahi?</string>
|
||||
<string name="report_personal_subtitle">Mastodonen gustuko ez duzun zerbait ikusten duzunean, zure esperientziatik atera dezakezu pertsona hori.</string>
|
||||
@@ -220,7 +217,6 @@
|
||||
<string name="skip">Saltatu</string>
|
||||
<string name="notification_type_follow">Jarraitzaile berriak</string>
|
||||
<string name="notification_type_favorite">Gogokoak</string>
|
||||
<string name="notification_type_reblog">Bultzadak</string>
|
||||
<string name="notification_type_mention">Aipamenak</string>
|
||||
<string name="notification_type_poll">Inkestak</string>
|
||||
<string name="choose_account">Aukeratu kontua</string>
|
||||
@@ -247,7 +243,6 @@
|
||||
<string name="notify_none">inor ez</string>
|
||||
<string name="notify_favorites">Nire bidalketa gogoko egitean</string>
|
||||
<string name="notify_follow">Jarraitzen nau</string>
|
||||
<string name="notify_reblog">Nire bidalketa bultzatu du</string>
|
||||
<string name="notify_mention">Aipatu nau</string>
|
||||
<string name="settings_boring">Eremu aspergarria</string>
|
||||
<string name="settings_account">Kontuaren ezarpenak</string>
|
||||
@@ -268,7 +263,6 @@
|
||||
<string name="hide_content">Ezkutatu edukia</string>
|
||||
<string name="new_post">Bidalketa berria</string>
|
||||
<string name="button_reply">Erantzun</string>
|
||||
<string name="button_reblog">Bultzada</string>
|
||||
<string name="button_favorite">Gogokoa</string>
|
||||
<string name="button_share">Partekatu</string>
|
||||
<string name="media_no_description">Deskribapenik gabeko multimedia</string>
|
||||
@@ -283,8 +277,6 @@
|
||||
<string name="unfollowed_user">Utzi %s jarraitzeari</string>
|
||||
<string name="followed_user">%s jarraitzen ari zara</string>
|
||||
<string name="open_in_browser">Ireki nabigatzailean</string>
|
||||
<string name="hide_boosts_from_user">Ezkutatu %s(r)en bultzadak</string>
|
||||
<string name="show_boosts_from_user">Erakutsi %s(r)en bultzadak</string>
|
||||
<string name="signup_reason">Zergatik elkartu nahi duzu?</string>
|
||||
<string name="signup_reason_note">Honek zure eskaera berrikustean lagunduko digu.</string>
|
||||
<string name="clear">Garbitu</string>
|
||||
@@ -326,13 +318,8 @@
|
||||
<item quantity="one">Gogoko bat</item>
|
||||
<item quantity="other">%,d gogoko</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">Bultzada %,d</item>
|
||||
<item quantity="other">%,d bultzada</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s %2$s -en bidez</string>
|
||||
<string name="time_now">orain</string>
|
||||
<string name="post_info_reblogs">Bultzadak</string>
|
||||
<string name="post_info_favorites">Gogokoak</string>
|
||||
<string name="edit_history">Editatu historia</string>
|
||||
<string name="last_edit_at_x">Azken edizioa %s</string>
|
||||
@@ -390,12 +377,6 @@
|
||||
<string name="login_title">Ongi etorri berriro ere</string>
|
||||
<string name="login_subtitle">Hasi saioa kontua sortu zenuen zerbitzariarekin.</string>
|
||||
<string name="server_url">Zerbitzariaren URLa</string>
|
||||
<string name="welcome_page1_title">Zer da Mastodon?</string>
|
||||
<string name="welcome_page1_text">Imajinatu zure helbide elektronikoa adibidea.eus-en amaitzen dela. \n\n Oraindik edonoren mezu elektronikoak bidali eta jaso ditzakezu, baita posta elektronikoa @gmail.com edo @icloud.com edo @adibidea.eus helbideetan amaitzen bada ere.</string>
|
||||
<string name="welcome_page2_title">Mastodon antzekoa da.</string>
|
||||
<string name="welcome_page2_text">Zure kontua \"@pertsona1@mastodon.eus\" izan liteke, baina oraindik ere jarraitu, bultzatu edo txateatu dezakezu \"@pertsona2@mastodon.social\" edo bestelako edozein kontu.</string>
|
||||
<string name="welcome_page3_title">Nola aukeratzen dut zerbitzari bat?</string>
|
||||
<string name="welcome_page3_text">Hainbat pertsonak zerbitzari bat baino gehiago aukeratzen dituzte arrazoi ezberdinengatik. Adibidez, art.example leku ona da artistentzat eta mastodon.eus, berriz, euskaldunentzat. Gure gomendioetako zerbitzariekin, ez duzu hanka sartuko eta edozein dela ere zure aukera, beste zerbitzarietako kideekin harremana izan dezakezu (bilaketa-barran bilatuz).</string>
|
||||
<string name="server_filter_any_language">Edozein hizkuntza</string>
|
||||
<string name="server_filter_instant_signup">Berehalako erregistroa</string>
|
||||
<string name="server_filter_region_europe">Europa</string>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<string name="sk_settings_contribute">Lagundu Megalodon</string>
|
||||
<string name="sk_translated_using">%s-ekin itzulia</string>
|
||||
<string name="sk_post_language">Hizkuntza: %s</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_language_name">%1$s (%2$s)</string>
|
||||
<string name="sk_bookmark_as">Beste kontu baten laster-marka</string>
|
||||
<string name="sk_bookmarked_as">%s bezala laster-markara eramana</string>
|
||||
<string name="sk_already_bookmarked">Dagoeneko laster-marka da</string>
|
||||
@@ -261,4 +261,14 @@
|
||||
<string name="sk_follow_as">Jarraitu beste kontu batetik</string>
|
||||
<string name="sk_followed_as">%s-(d/t)ik jarraitua</string>
|
||||
<string name="sk_settings_hide_fab">Automatikoki ezkutatu Idatzi botoia</string>
|
||||
<string name="sk_in_reply">Erantzunez</string>
|
||||
<string name="sk_settings_reply_visibility">Erantzunaren ikusgarritasuna</string>
|
||||
<string name="sk_settings_reply_visibility_all">Erantzun guztiak</string>
|
||||
<string name="sk_settings_reply_visibility_following">Jarraitzen ditudanei eginiko erantzunak</string>
|
||||
<string name="sk_reply_line_above_avatar">\"Honi erantzunez\" abatarraren gaineko lerroa</string>
|
||||
<string name="sk_show_thread">Erakutsi haria</string>
|
||||
<string name="sk_compact_reblog_reply_line">Bultzada/erantzun lerro trinkoa</string>
|
||||
<string name="sk_quoting_user">%s aipatzen</string>
|
||||
<string name="sk_settings_reply_visibility_self">Niri eginiko erantzunak</string>
|
||||
<string name="sk_notification_action_replied">%s-(r)i erantzun</string>
|
||||
</resources>
|
||||
@@ -14,7 +14,6 @@
|
||||
<string name="user_followed_you">شما را دنبال میکند</string>
|
||||
<string name="user_sent_follow_request">یک درخواست دنبال کردن برای شما ارسال کرد</string>
|
||||
<string name="user_favorited"> فرستهتان را پسندید</string>
|
||||
<string name="notification_boosted">مطلب شما را بهاشتراک گذاشت</string>
|
||||
<string name="poll_ended">نظرسنجی به پایان رسید</string>
|
||||
<string name="time_seconds">%dثانیه</string>
|
||||
<string name="time_minutes">%dدقیقه</string>
|
||||
|
||||
@@ -10,13 +10,11 @@
|
||||
<string name="ok">OK</string>
|
||||
<string name="preparing_auth">Paghahanda para sa pagpapatunay…</string>
|
||||
<string name="finishing_auth">Natapos na ang pagpapatunay…</string>
|
||||
<string name="user_boosted">%s reblogged</string>
|
||||
<string name="in_reply_to">Bilang tugon kay %s</string>
|
||||
<string name="notifications">Mga abiso</string>
|
||||
<string name="user_followed_you">sinundan ka</string>
|
||||
<string name="user_sent_follow_request">may nagpadala sa iyo ng follow request</string>
|
||||
<string name="user_favorited">paborito ang iyong post</string>
|
||||
<string name="notification_boosted">na reblogged ang iyong post</string>
|
||||
<string name="poll_ended">natapos na ang poll</string>
|
||||
<string name="time_seconds">%ds</string>
|
||||
<string name="time_minutes">%dm</string>
|
||||
@@ -166,7 +164,6 @@
|
||||
<string name="report_sent_subtitle">Habang sinusuri namin ito, maaari kang gumawa ng aksyon laban sa %s.</string>
|
||||
<string name="unfollow_user">I-Unfollow %s</string>
|
||||
<string name="unfollow">I-unfollow</string>
|
||||
<string name="mute_user_explain">Hindi mo makikita ang kanilang mga post o reblogs sa iyong home feed. Hindi nila malalaman na sila ay na-mute.</string>
|
||||
<string name="block_user_explain">Hindi na nila magagawang sundin o makita ang iyong mga post, ngunit maaari nilang makita kung na-block sila.</string>
|
||||
<string name="report_personal_title">Ayaw mong makita ito?</string>
|
||||
<string name="report_personal_subtitle">Kapag nakakita ka ng mga bagay na hindi mo gusto sa Mastodon, maaari mong alisin ang tao mula sa iyong karanasan.</string>
|
||||
@@ -211,7 +208,6 @@
|
||||
<string name="skip">Laktawan</string>
|
||||
<string name="notification_type_follow">Mga Bagong Follower</string>
|
||||
<string name="notification_type_favorite">Mga Paborito</string>
|
||||
<string name="notification_type_reblog">Mga Reblog</string>
|
||||
<string name="notification_type_mention">Mga binangit</string>
|
||||
<string name="notification_type_poll">Mga botohan</string>
|
||||
<string name="choose_account">Pumili ng account</string>
|
||||
@@ -238,7 +234,6 @@
|
||||
<string name="notify_none">walang simuman</string>
|
||||
<string name="notify_favorites">Paborito Ang aking post</string>
|
||||
<string name="notify_follow">Sumusunod sa akin</string>
|
||||
<string name="notify_reblog">Reblogs ang aking post</string>
|
||||
<string name="notify_mention">Banggitin ako</string>
|
||||
<string name="settings_boring">Ang nakababagot na zone</string>
|
||||
<string name="settings_account">Mga setting ng Account</string>
|
||||
@@ -259,7 +254,6 @@
|
||||
<string name="hide_content">Itago ang nilalaman</string>
|
||||
<string name="new_post">Bagong post</string>
|
||||
<string name="button_reply">Tumugon</string>
|
||||
<string name="button_reblog">Reblog</string>
|
||||
<string name="button_favorite">Paborito</string>
|
||||
<string name="button_share">Ibahagi</string>
|
||||
<string name="media_no_description">Media nang walang paglalarawan</string>
|
||||
@@ -274,8 +268,6 @@
|
||||
<string name="unfollowed_user">I-Unfollow %s</string>
|
||||
<string name="followed_user">Sinusundan mo ngayon ang %s</string>
|
||||
<string name="open_in_browser">Buksan sa browser</string>
|
||||
<string name="hide_boosts_from_user">Itago ang mga reblog mula sa %s</string>
|
||||
<string name="show_boosts_from_user">Ipakita ang mga reblog mula sa %s</string>
|
||||
<string name="signup_reason_note">Makakatulong ito sa amin na suriin ang iyong aplikasyon.</string>
|
||||
<string name="clear">I-Clear</string>
|
||||
<string name="profile_header">Imahe ng Header</string>
|
||||
@@ -316,13 +308,8 @@
|
||||
<item quantity="one">%, d Paborito</item>
|
||||
<item quantity="other">%, d paborito</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">%, d reblog</item>
|
||||
<item quantity="other">%, d reblog</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s sa pamamagitan ng %2$s</string>
|
||||
<string name="time_now">ngayon</string>
|
||||
<string name="post_info_reblogs">Mga Reblog</string>
|
||||
<string name="post_info_favorites">Mga Paborito</string>
|
||||
<string name="edit_history">I-Edit ang kasaysayan</string>
|
||||
<string name="last_edit_at_x">Huling edit %s</string>
|
||||
@@ -379,11 +366,6 @@
|
||||
<string name="login_title">Maligayang pagbalik,</string>
|
||||
<string name="login_subtitle">Mag-Log in gamit ang server kung saan mo nilikha ang iyong account.</string>
|
||||
<string name="server_url">Ang URL ng server</string>
|
||||
<string name="welcome_page1_text">Isipin na mayroon kang isang email address na nagtatapos sa @example. com. \n \nMaaari ka pa ring magpadala at tumanggap ng mga email mula sa sinuman, kahit na ang kanilang email ay nagtatapos sa @gmail.com o @icloud.com o @example.com.</string>
|
||||
<string name="welcome_page2_title">Mastodon ay tulad na.</string>
|
||||
<string name="welcome_page2_text">Ang iyong hawakan ay maaaring @gothgirl654@example.social, ngunit maaari mo pa ring sundin, reblog, at makipag-chat sa @fallout5ever@example.online.</string>
|
||||
<string name="welcome_page3_title">Paano ako pumili ng server?</string>
|
||||
<string name="welcome_page3_text">Ang iba \'t ibang mga tao ay pumili ng iba\' t ibang mga server para sa anumang bilang ng mga kadahilanan. sining.ang halimbawa ay isang magandang lugar para sa mga artista, habang ang glasgow.halimbawa ay maaaring maging isang mahusay na pick para sa Scots.\n \nhindi ka maaaring magkamali sa alinman sa aming mga inirekumendang server, kaya anuman ang pipiliin mo (o kung ipinasok mo ang iyong sarili sa search bar ng server), hindi ka makaligtaan ng isang matalo kahit saan.</string>
|
||||
<!-- %s is server domain -->
|
||||
<!-- Shown in a progress dialog when you tap "follow all" -->
|
||||
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
|
||||
|
||||
@@ -10,13 +10,11 @@
|
||||
<string name="ok">OK</string>
|
||||
<string name="preparing_auth">Préparation à l’authentification…</string>
|
||||
<string name="finishing_auth">Fin de l’authentification…</string>
|
||||
<string name="user_boosted">%s a partagé</string>
|
||||
<string name="in_reply_to">En réponse à %s</string>
|
||||
<string name="notifications">Notifications</string>
|
||||
<string name="user_followed_you">s’est abonné à vous</string>
|
||||
<string name="user_sent_follow_request">vous a envoyé une demande de suivi</string>
|
||||
<string name="user_favorited">a ajouté votre message à ses favoris</string>
|
||||
<string name="notification_boosted">a partagé votre message</string>
|
||||
<string name="poll_ended">sondage terminé</string>
|
||||
<string name="time_seconds">%d s</string>
|
||||
<string name="time_minutes">%d m</string>
|
||||
@@ -166,7 +164,6 @@
|
||||
<string name="report_sent_subtitle">Pendant que nous étudions votre requête, vous pouvez prendre des mesures contre %s.</string>
|
||||
<string name="unfollow_user">Ne plus suivre %s</string>
|
||||
<string name="unfollow">Ne plus suivre</string>
|
||||
<string name="mute_user_explain">Vous ne verrez pas leurs messages ou leurs partages dans votre flux personnel. Ils ne sauront pas qu’ils ont été mis en sourdine.</string>
|
||||
<string name="block_user_explain">Ils ne seront plus en mesure de suivre ou de voir vos messages, mais ils peuvent voir s’ils ont été bloqués.</string>
|
||||
<string name="report_personal_title">Vous ne voulez pas voir cela ?</string>
|
||||
<string name="report_personal_subtitle">Quand vous voyez quelque chose que vous n’aimez pas sur Mastodon, vous pouvez retirer la personne de votre expérience.</string>
|
||||
@@ -223,7 +220,6 @@
|
||||
<string name="skip">Passer</string>
|
||||
<string name="notification_type_follow">Nouveaux⋅elles abonné⋅e⋅s</string>
|
||||
<string name="notification_type_favorite">Favoris</string>
|
||||
<string name="notification_type_reblog">Partages</string>
|
||||
<string name="notification_type_mention">Mentions</string>
|
||||
<string name="notification_type_poll">Sondages</string>
|
||||
<string name="choose_account">Choisir un compte</string>
|
||||
@@ -250,7 +246,6 @@
|
||||
<string name="notify_none">personne</string>
|
||||
<string name="notify_favorites">Ajoute un de mes messages à ses favoris</string>
|
||||
<string name="notify_follow">Me suit</string>
|
||||
<string name="notify_reblog">Partage mon message</string>
|
||||
<string name="notify_mention">Me mentionne</string>
|
||||
<string name="settings_boring">Zone ennuyeuse</string>
|
||||
<string name="settings_account">Paramètres du compte</string>
|
||||
@@ -271,7 +266,6 @@
|
||||
<string name="hide_content">Masquer le contenu</string>
|
||||
<string name="new_post">Nouveau message</string>
|
||||
<string name="button_reply">Répondre</string>
|
||||
<string name="button_reblog">Partager</string>
|
||||
<string name="button_favorite">Ajouter aux favoris</string>
|
||||
<string name="button_share">Partager</string>
|
||||
<string name="media_no_description">Média sans description</string>
|
||||
@@ -286,8 +280,6 @@
|
||||
<string name="unfollowed_user">Vous ne suivez plus %s</string>
|
||||
<string name="followed_user">Vous suivez maintenant %s</string>
|
||||
<string name="open_in_browser">Ouvrir dans le navigateur</string>
|
||||
<string name="hide_boosts_from_user">Masquer les partages de %s</string>
|
||||
<string name="show_boosts_from_user">Afficher les partages de %s</string>
|
||||
<string name="signup_reason">Pourquoi voulez-vous vous inscrire ?</string>
|
||||
<string name="signup_reason_note">Cela nous aidera à examiner votre demande.</string>
|
||||
<string name="clear">Effacer</string>
|
||||
@@ -329,13 +321,8 @@
|
||||
<item quantity="one">%,d favori</item>
|
||||
<item quantity="other">%,d favoris</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="one">%,d partage</item>
|
||||
<item quantity="other">%,d partages</item>
|
||||
</plurals>
|
||||
<string name="timestamp_via_app">%1$s via %2$s</string>
|
||||
<string name="time_now">à l’instant</string>
|
||||
<string name="post_info_reblogs">Partages</string>
|
||||
<string name="post_info_favorites">Favoris</string>
|
||||
<string name="edit_history">Historique des modifications</string>
|
||||
<string name="last_edit_at_x">Dernière modification %s</string>
|
||||
@@ -394,12 +381,6 @@
|
||||
<string name="login_title">Content de vous revoir</string>
|
||||
<string name="login_subtitle">Connectez-vous avec le serveur sur lequel vous avez créé votre compte.</string>
|
||||
<string name="server_url">URL du serveur</string>
|
||||
<string name="welcome_page1_title">Qu’est-ce que Mastodon ?</string>
|
||||
<string name="welcome_page1_text">Imaginez que vous ayez une adresse e-mail qui se termine par @example.com.\n\nVous pouvez toujours envoyer et recevoir des e-mails de n\'importe qui, même si leur e-mail se termine par @gmail.com ou @icloud.com ou @example.com.</string>
|
||||
<string name="welcome_page2_title">Mastodon est comme ça.</string>
|
||||
<string name="welcome_page2_text">Votre identifiant devrait être @gothgirl654@example.social, mais vous pouvez toujours suivre, rebloguer et discuter avec @fallout5ever@example.online.</string>
|
||||
<string name="welcome_page3_title">Comment choisir un serveur?</string>
|
||||
<string name="welcome_page3_text">Différentes personnes choisissent différents serveurs pour un certain nombre de raisons. art.example est un lieu idéal pour les artistes, tandis que glasgow.example pourrait être un bon choix pour les Écossais.\n\nVous ne pouvez pas vous tromper avec l\'un de nos serveurs recommandés et ainsi, quel que soit celui que vous choisissez (ou si vous entrez le vôtre dans la barre de recherche du serveur), vous ne manquerez jamais une info quelque part.</string>
|
||||
<string name="signup_random_server_explain">Nous choisirons un serveur basé sur votre langue si vous continuez sans faire de sélection.</string>
|
||||
<string name="server_filter_any_language">N\'importe quelle langue</string>
|
||||
<string name="server_filter_instant_signup">Inscription instantanée</string>
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<string name="sk_translated_using">Traduit en utilisant %s</string>
|
||||
<string name="sk_post_language">Langue : %s</string>
|
||||
<string name="sk_available_languages">Langues disponibles</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_language_name">%1$s (%2$s)</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Êtes-vous sûr de vouloir effacer vos langues récemment utilisées \?</string>
|
||||
<string name="sk_clear_recent_languages">Effacer les langues récemment utilisées</string>
|
||||
<string name="sk_example_domain">exemple.social</string>
|
||||
@@ -82,8 +82,8 @@
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s ne semble pas prendre en charge la traduction.</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Voulez-vous vraiment supprimer toutes les notifications \?</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Rechercher sur le Fediverse</string>
|
||||
<string name="sk_reblog_with_visibility">Reposter avec la visibilité</string>
|
||||
<string name="sk_undo_reblog">Annuler le repost</string>
|
||||
<string name="sk_reblog_with_visibility">Booster avec la visibilité</string>
|
||||
<string name="sk_undo_reblog">Annuler le boost</string>
|
||||
<string name="sk_quote_post">Poster à ce sujet</string>
|
||||
<string name="sk_hashtags_you_follow">Hashtags que vous suivez</string>
|
||||
<string name="sk_open_in_account">Ouvrir dans un autre compte</string>
|
||||
@@ -94,13 +94,13 @@
|
||||
<string name="sk_favorite_as">Mettre en favoris avec un autre compte</string>
|
||||
<string name="sk_already_bookmarked">Déjà mis en signet</string>
|
||||
<string name="sk_already_favorited">Déjà mis en favori</string>
|
||||
<string name="sk_reblogged_as">Reposté en tant que %s</string>
|
||||
<string name="sk_already_reblogged">Déjà reposté</string>
|
||||
<string name="sk_reblogged_as">Boosté en tant que %s</string>
|
||||
<string name="sk_already_reblogged">Déjà boosté</string>
|
||||
<string name="sk_bookmarked_as">Ajouté aux signets en tant que %s</string>
|
||||
<string name="sk_favorited_as">Ajouté aux favoris en tant que %s</string>
|
||||
<string name="sk_reply_as">Répondre avec un autre compte</string>
|
||||
<string name="sk_bookmark_as">Mettre en signet avec un autre compte</string>
|
||||
<string name="sk_reblog_as">Reposter avec un autre compte</string>
|
||||
<string name="sk_reblog_as">Booster avec un autre compte</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Icône uniforme pour toutes les notifications</string>
|
||||
<string name="sk_forward_report_to">Transférer à %s</string>
|
||||
<string name="sk_unsent_posts">Messages non envoyés</string>
|
||||
@@ -171,7 +171,7 @@
|
||||
<string name="sk_alt_button">ALT</string>
|
||||
<string name="sk_post_edited">édité</string>
|
||||
<string name="sk_edit_timeline">Modifier la timeline</string>
|
||||
<string name="sk_notify_update">Modifie un article reposté</string>
|
||||
<string name="sk_notify_update">Modifier un article boosté</string>
|
||||
<string name="sk_settings_disable_alt_text_reminder">Désactiver le rappel pour ajouter du texte alternatif</string>
|
||||
<string name="sk_notification_type_update">Messages modifiés</string>
|
||||
<string name="sk_icon_code">Code</string>
|
||||
@@ -271,6 +271,7 @@
|
||||
<string name="sk_settings_reply_visibility_self">Me répond</string>
|
||||
<string name="sk_notification_action_replied">Réponse envoyée à %s</string>
|
||||
<string name="sk_show_thread">Afficher le fil</string>
|
||||
<string name="sk_compact_reblog_reply_line">Ligne de repost/réponse compacte</string>
|
||||
<string name="sk_compact_reblog_reply_line">Ligne boost/réponse compacte</string>
|
||||
<string name="sk_reply_line_above_avatar">Ligne \"En réponse à\" au-dessus de l\'avatar</string>
|
||||
<string name="sk_settings_confirm_before_reblog">Confirmer avant de booster</string>
|
||||
</resources>
|
||||
@@ -1,8 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="get_started">Cruthaich cunntas</string>
|
||||
<string name="already_have_account">Tha cunntas agam mu thràth</string>
|
||||
<string name="log_in">Clàraich a-steach</string>
|
||||
<string name="next">Air adhart</string>
|
||||
<string name="loading_instance">A’ faighinn fiosrachadh an fhrithealaiche…</string>
|
||||
<string name="error">Mearachd</string>
|
||||
<string name="not_a_mastodon_instance">Tha coltas nach eil %s ’na fhrithealaiche Mastodon.</string>
|
||||
<string name="ok">Ceart ma-thà</string>
|
||||
<string name="preparing_auth">Ag ullachadh an dearbhaidh…</string>
|
||||
<string name="finishing_auth">A’ crìochnachadh an dearbhaidh…</string>
|
||||
@@ -12,7 +16,7 @@
|
||||
<string name="user_followed_you">– ’s iad ’gad leantainn a-nis</string>
|
||||
<string name="user_sent_follow_request">– ’s iad air iarrtas leantainn a chur thugad</string>
|
||||
<string name="user_favorited">– ’s iad air am post agad a chur ris na h-annsachdan aca</string>
|
||||
<string name="notification_boosted">– ’s iad air am post agad a bhrosnachadh</string>
|
||||
<string name="notification_boosted">– ’s iad air a’ phost agad a bhrosnachadh</string>
|
||||
<string name="poll_ended">Thàinig cunntas-bheachd gu crìoch</string>
|
||||
<string name="time_seconds">%dd</string>
|
||||
<string name="time_minutes">%dm</string>
|
||||
@@ -190,14 +194,23 @@
|
||||
<string name="report_sent_subtitle">Fhad ’s a bhios sinn a’ toirt sùil air, seo nas urrainn dhut dèanamh an aghaidh %s.</string>
|
||||
<string name="unfollow_user">Na lean %s tuilleadh</string>
|
||||
<string name="unfollow">Na lean tuilleadh</string>
|
||||
<string name="mute_user_explain">Chan fhaic thu na postaichean aca is dè a bhrosnaich iad air inbhir na dachaigh agad tuilleadh. Cha bhi fios aca gun do mhùch thu iad.</string>
|
||||
<string name="mute_user_explain">Chan fhaic thu na postaichean aca is na bhrosnaich iad ’nad dachaigh tuilleadh. Cha bhi fios aca gun do mhùch thu iad.</string>
|
||||
<string name="block_user_explain">Chan urrainn dhaibh ’gad leantainn is chan fhaic iad na postaichean agad tuilleadh ach chì iad gun deach am bacadh.</string>
|
||||
<string name="report_personal_title">Nach eil thu airson seo fhaicinn?</string>
|
||||
<string name="report_personal_subtitle">Nuair a chì thu rudeigin nach toigh leat air Mastodon, ’s urrainn dhut an neach a chumail fad air falbh uat.</string>
|
||||
<string name="back">Air ais</string>
|
||||
<string name="instance_catalog_title">Tha cleachdaichean Mhastodon air iomadh frithealaiche eadar-dhealaichte.</string>
|
||||
<string name="instance_catalog_subtitle">Tagh frithealaiche stèidhichte air d’ ùidhean, air far a bheil thu no fear coitcheann. ’S urrainn dhut conaltradh leis a h-uile duine fhathast ge b’ e am frithealaiche.</string>
|
||||
<string name="search_communities">Ainm no URL an fhrithealaiche</string>
|
||||
<string name="instance_rules_title">Riaghailtean an fhrithealaiche</string>
|
||||
<string name="instance_rules_subtitle">Ma leanas tu air adhart, aontaichidh tu ris na riaghailtean a tha ’gan suidheachadh is èigneachadh leis na maoir aig %s.</string>
|
||||
<string name="signup_title">Cruthaich cunntas</string>
|
||||
<string name="edit_photo">deasaich</string>
|
||||
<string name="display_name">Ainm</string>
|
||||
<string name="username">Ainm-cleachdaiche</string>
|
||||
<string name="email">Post-d</string>
|
||||
<string name="password">Facal-faire</string>
|
||||
<string name="confirm_password">Dearbh am facal-faire</string>
|
||||
<string name="password_note">Gabh a-steach litrichean mòra, caractaran sònraichte agus àireamhan airson am facal-faire agad a dhèanamh nas treasa.</string>
|
||||
<string name="category_academia">Sgoilearachd</string>
|
||||
<string name="category_activism">Iomairteachd</string>
|
||||
@@ -212,7 +225,10 @@
|
||||
<string name="category_music">Ceòl</string>
|
||||
<string name="category_regional">Sgìreil</string>
|
||||
<string name="category_tech">Teicneolas</string>
|
||||
<string name="confirm_email_title">Thoir sùil air a’ bhogsa a-steach agad</string>
|
||||
<!-- %s is the email address -->
|
||||
<string name="confirm_email_subtitle">Thoir gnogag air a’ cheangal a chuir sinn thugad a dhearbhadh %s. Fuirichidh sinn ort an-seo.</string>
|
||||
<string name="confirm_email_didnt_get">Nach d’fhuair thu ceangal?</string>
|
||||
<string name="resend">Cuir a-rithist</string>
|
||||
<string name="open_email_app">Fosgail aplacaid a’ phuist-d</string>
|
||||
<string name="resent_email">Chaidh post-d dearbhaidh a chur</string>
|
||||
@@ -264,7 +280,7 @@
|
||||
<string name="notify_none">nach bi duine sam bith</string>
|
||||
<string name="notify_favorites">air post uam a chur ris na h-annsachdan</string>
|
||||
<string name="notify_follow">air mo leantainn</string>
|
||||
<string name="notify_reblog">air post uam a bhrosnachadh</string>
|
||||
<string name="notify_reblog">air post agam a bhrosnachadh</string>
|
||||
<string name="notify_mention">air iomradh a thoirt orm</string>
|
||||
<string name="settings_boring">An earrann ràsanach</string>
|
||||
<string name="settings_account">Roghainnean a’ chunntais</string>
|
||||
@@ -299,9 +315,11 @@
|
||||
<string name="follow_user">Lean %s</string>
|
||||
<string name="unfollowed_user">Chan eil thu a’ leantainn %s tuilleadh</string>
|
||||
<string name="followed_user">Tha thu a’ leantainn %s a-nis</string>
|
||||
<string name="following_user_requested">Dh’iarr thu %s a leantainn</string>
|
||||
<string name="open_in_browser">Fosgail sa bhrabhsair</string>
|
||||
<string name="hide_boosts_from_user">Falaich na brosnachaidhean o %s</string>
|
||||
<string name="show_boosts_from_user">Seall na brosnachaidhean o %s</string>
|
||||
<string name="signup_reason">Carson a bu mhiann leat ballrachd fhaighinn?</string>
|
||||
<string name="signup_reason_note">Bidh e nas fhasa dhuinn lèirmheas a dhèanamh air d’ iarrtas.</string>
|
||||
<string name="clear">Falamhaich</string>
|
||||
<string name="profile_header">Dealbh a’ bhanna-chinn</string>
|
||||
@@ -406,9 +424,67 @@
|
||||
<!-- %s is file size -->
|
||||
<string name="download_update">Luchdaich a-nuas (%s)</string>
|
||||
<string name="install_update">Stàlaich</string>
|
||||
<string name="privacy_policy_title">Do phrìobhaideachd</string>
|
||||
<string name="privacy_policy_subtitle">Ged nach cruinnich aplacaid Mastodon fhèin dàta sam bith, dh’fhaoidte gu bheil poileasaidh eadar-dhealaichte aig an fhrithealaiche leis a chlàraicheas tu.\n\nMur aontaich thu ris a’ phoileasaidh aig %s, rach air ais is tagh frithealaiche eile.</string>
|
||||
<string name="i_agree">Gabhaidh mi ris</string>
|
||||
<string name="empty_list">Tha an liosta seo falamh</string>
|
||||
<string name="instance_signup_closed">Chan eil am frithealaiche seo a’ gabhail ri clàraidhean ùra.</string>
|
||||
<string name="text_copied">Chaidh lethbhreac dheth a chur air an stòr-bhòrd</string>
|
||||
<string name="add_bookmark">Cruthaich comharra-lìn</string>
|
||||
<string name="remove_bookmark">Thoir an comharra-lìn air falbh</string>
|
||||
<string name="bookmarks">Comharran-lìn</string>
|
||||
<string name="your_favorites">Na h-annsachdan agad</string>
|
||||
<string name="login_title">Fàilte air ais</string>
|
||||
<string name="login_subtitle">Clàraich a-steach leis an fhrithealaiche far an do chruthaich thu an cunntas agad.</string>
|
||||
<string name="server_url">URL an fhrithealaiche</string>
|
||||
<string name="signup_random_server_explain">Taghaidh sinn frithealaiche dhut stèidhichte air a’ chànan agad ma leanas tu air adhart gun taghadh.</string>
|
||||
<string name="server_filter_any_language">Cànan sam bith</string>
|
||||
<string name="server_filter_instant_signup">Clàradh sa bhad</string>
|
||||
<string name="server_filter_manual_review">Lèirmheas a làimh</string>
|
||||
<string name="server_filter_any_signup_speed">Luaths clàraidh sam bith</string>
|
||||
<string name="server_filter_region_europe">An Roinn-Eòrpa</string>
|
||||
<string name="server_filter_region_north_america">Aimeireaga a Tuath</string>
|
||||
<string name="server_filter_region_south_america">Aimeireaga a Deas</string>
|
||||
<string name="server_filter_region_africa">Afraga</string>
|
||||
<string name="server_filter_region_asia">Àisia</string>
|
||||
<string name="server_filter_region_oceania">Roinn a’ Chuain Sèimh</string>
|
||||
<string name="not_accepting_new_members">Gun ghabhail ri buill ùra</string>
|
||||
<string name="category_special_interests">Ùidhean sònraichte</string>
|
||||
<string name="signup_passwords_dont_match">Chan eil an dà fhacal-faire co-ionnann</string>
|
||||
<string name="pick_server_for_me">Taghaibh fear dhomh</string>
|
||||
<string name="profile_add_row">Cuir ràgh ris</string>
|
||||
<string name="profile_setup">Suidheachadh na pròifile</string>
|
||||
<string name="profile_setup_subtitle">’S urrainn dhut seo a choileanadh air taba na Pròifile uair sam bith.</string>
|
||||
<string name="profile_setup_explanation">’S urrainn dhut suas ri ceithir raointean a chur ris a’ phròifil agad airson rud sam bith a thogras tu. Ionad, ceanglaichean, roimhearan no ge b’ e dè eile.</string>
|
||||
<string name="popular_on_mastodon">Fèillmhor air Mastodon</string>
|
||||
<string name="follow_all">Lean na h-uile</string>
|
||||
<string name="server_rules_disagree">Diùlt</string>
|
||||
<string name="privacy_policy_explanation">Gu goirid: Cha chruinnich is cha dèan sinn pròiseasadh air dad sam bith.</string>
|
||||
<!-- %s is server domain -->
|
||||
<string name="server_policy_disagree">Diùlt %s</string>
|
||||
<string name="profile_bio">Cunntas-beatha</string>
|
||||
<!-- Shown in a progress dialog when you tap "follow all" -->
|
||||
<string name="sending_follows">A’ leantainn cleachdaichean…</string>
|
||||
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
|
||||
<string name="signup_email_domain_blocked">Cha cheadaich %1$s clàradh o %2$s. Feuch fear eile no <a>tagh frithealaiche eile</a>.</string>
|
||||
<string name="signup_username_taken">Tha an t-ainm-cleachdaiche seo aig cuideigin eile.</string>
|
||||
<string name="spoiler_show">Seall e co-dhiù</string>
|
||||
<string name="spoiler_hide">Falaich a-rithist</string>
|
||||
<string name="poll_multiple_choice">Tagh co-dhiù aonan</string>
|
||||
<string name="save_changes">Sàbhail na h-atharraichean</string>
|
||||
<string name="profile_featured">’Ga bhrosnachadh</string>
|
||||
<string name="profile_timeline">Loidhne-ama</string>
|
||||
<string name="view_all">Seall a h-uile</string>
|
||||
<string name="profile_endorsed_accounts">Cunntasan</string>
|
||||
<string name="verified_link">Ceangal dearbhte</string>
|
||||
<string name="show">Seall</string>
|
||||
<string name="hide">Falaich</string>
|
||||
<string name="join_default_server">Faigh ballrachd aig %s</string>
|
||||
<string name="pick_server">Tagh frithealaiche eile</string>
|
||||
<string name="signup_or_login">no</string>
|
||||
<string name="learn_more">Barrachd fiosrachaidh</string>
|
||||
<string name="welcome_to_mastodon">Fàilte gu Mastodon</string>
|
||||
<string name="welcome_paragraph1">’S e lìonra sòisealta sgaoilte a th’ ann am Mastodon agus is ciall dha seo nach eil e fo smachd aon chompanaidh a-mhàin. Tha e dèanta de ghrunn fhrithealaichean a tha ’gan ruith gu neo-eisimeileach ach ceangailte ri chèile.</string>
|
||||
<string name="what_are_servers">Dè th’ anns na frithealaichean?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Tha gach cunntas Mastodon ’ga òstadh air frithealaiche – tha luachan, riaghailtean ⁊ rianairean sònraichte aig gach fear. Ge b’ e dè am frithealaiche a thaghas tu, ’s urrainn dhut daoine air frithealaiche sam bith a leantainn is bruidhinn riutha.]]></string>
|
||||
</resources>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user