Compare commits

..

41 Commits

Author SHA1 Message Date
Grishka
1ad2d08e27 Merge branch 'l10n_master' 2024-10-10 04:09:47 +03:00
Grishka
42658add38 Fix opening links in non-browser apps 2024-10-10 04:09:20 +03:00
Grishka
b211789847 Fix colors for quotes and code blocks 2024-10-10 01:29:21 +03:00
Eugen Rochko
9c88183366 New translations strings.xml (Russian) 2024-10-09 20:16:06 +02:00
Eugen Rochko
c76dba3a8c New translations strings.xml (Basque) 2024-10-09 18:07:53 +02:00
Eugen Rochko
29bee87f2a New translations strings.xml (Basque) 2024-10-09 16:54:04 +02:00
Grishka
c139f85b99 Fix wrong unread notification count for some accounts on 4.3 2024-10-09 06:09:53 +03:00
Grishka
3247d4f2f5 Fix notifications loading on pre-4.3 servers
fixes #897
2024-10-09 05:28:01 +03:00
Grishka
77b2f98f17 Quotes in text formatting (AND-222) 2024-10-09 05:20:58 +03:00
Grishka
82c6c8076a Lists in text formatting (AND-221) 2024-10-09 03:00:37 +03:00
Grishka
4177faa553 Monospace text formatting (AND-223) 2024-10-09 01:21:50 +03:00
Eugen Rochko
92ec125661 New translations strings.xml (Indonesian) 2024-10-08 12:59:00 +02:00
Grishka
513a57663b Display bold, italic, and strikethrough formatting (AND-220, AND-224) 2024-10-07 18:48:06 +03:00
Eugen Rochko
20e7f716f1 New translations strings.xml (Chinese Simplified) 2024-10-07 08:00:50 +02:00
Grishka
71f92cb66c Bump version 2024-10-06 01:25:21 +03:00
Grishka
77b2abd0cb Merge branch 'l10n_master' 2024-10-06 01:24:29 +03:00
Grishka
15385dd924 Make fastlane create draft releases 2024-10-06 01:22:25 +03:00
Grishka
08847ec641 Always reset notifications marker on "mark as read"
fixes #897
2024-10-06 01:11:21 +03:00
Grishka
805fc5d8c7 Crash fix 2024-10-06 01:06:45 +03:00
Eugen Rochko
3d7a95d336 New translations strings.xml (German) 2024-10-05 09:01:18 +02:00
Eugen Rochko
c1869386ff New translations strings.xml (German) 2024-10-05 07:34:09 +02:00
Eugen Rochko
7a728c52cf New translations strings.xml (German) 2024-10-04 21:23:57 +02:00
Eugen Rochko
22f3aad538 New translations strings.xml (Frisian) 2024-10-04 18:40:52 +02:00
Eugen Rochko
42da6dcf48 New translations strings.xml (Dutch) 2024-10-04 18:40:50 +02:00
Eugen Rochko
c0f18b1f61 New translations strings.xml (Frisian) 2024-10-04 17:34:12 +02:00
Grishka
492d851d89 Merge branch 'l10n_master' 2024-10-04 00:26:56 +03:00
Grishka
853f9dc8e4 Assorted crash fixes
fixes #896
2024-10-04 00:26:23 +03:00
Eugen Rochko
0e2ae4d3c0 New translations strings.xml (Italian) 2024-10-03 23:12:01 +02:00
Eugen Rochko
3ea1412faa New translations full_description.txt (Persian) 2024-10-02 21:38:56 +02:00
Eugen Rochko
e83f0749ee New translations full_description.txt (Persian) 2024-10-02 19:59:42 +02:00
Eugen Rochko
343d958677 New translations strings.xml (Persian) 2024-10-02 19:59:41 +02:00
Eugen Rochko
2f32378978 New translations strings.xml (Dutch) 2024-10-02 19:59:40 +02:00
Eugen Rochko
cfc5683f75 New translations strings.xml (Dutch) 2024-10-02 18:41:01 +02:00
Eugen Rochko
823e2f6ac6 New translations short_description.txt (Turkish) 2024-10-02 15:19:46 +02:00
Eugen Rochko
5f5fcdde46 New translations full_description.txt (Turkish) 2024-10-02 15:19:45 +02:00
Eugen Rochko
cf74e252ce New translations strings.xml (Turkish) 2024-10-02 15:19:44 +02:00
Eugen Rochko
010ca587d2 New translations strings.xml (Turkish) 2024-10-02 13:21:57 +02:00
Eugen Rochko
2957ac813f New translations full_description.txt (Turkish) 2024-10-02 12:08:45 +02:00
Eugen Rochko
5aa117e2e3 New translations strings.xml (Turkish) 2024-10-02 12:08:44 +02:00
Eugen Rochko
f1df4e72d2 New translations strings.xml (Turkish) 2024-10-02 09:45:42 +02:00
Eugen Rochko
afee257211 New translations strings.xml (Turkish) 2024-10-02 08:32:27 +02:00
56 changed files with 817 additions and 187 deletions

View File

@@ -28,7 +28,7 @@ platform :android do
build_type: "release",
)
upload_to_play_store(
changes_not_sent_for_review: true,
release_status: "draft",
skip_upload_images: true,
skip_upload_screenshots: true
)

View File

@@ -1,6 +1,6 @@
ماستودون بهترین راه برای پیگیری اتفاقات است. Follow anyone across the fediverse and see it all in chronological order. No algorithms, ads, or clickbait in sight.
این کاره رسمی اندروید برای ماستودون است. It is blazing fast and stunningly beautiful, designed to be not just powerful but also easy to use. In our app, you can:
این کاره رسمی اندروید برای ماستودون است. It is blazing fast and stunningly beautiful, designed to be not just powerful but also easy to use. در کاره ما، شما می‌توانید:
گشت و گذار
@@ -32,7 +32,7 @@ CURATE
یک سکوی انتشار قدرتمند
You no longer have to try and appease an opaque algorithm that decides if your friends are going to see what you posted. If they follow you, theyll see it.
You no longer have to try and appease an opaque algorithm that decides if your friends are going to see what you posted. اگر آنها شما را پی بگیرند، آن را خواهند دید.
If you publish it to the open web, its accessible on the open web. You can safely share links to Mastodon in the knowledge that anyone will be able to read them without logging in.
@@ -44,7 +44,7 @@ Between threads, polls, high quality images, videos, audio, and content warnings
به لطف خوراک زمانی خانه، تشخیص اینکه چه زمانی از همه به‌روزرسانی‌ها مطلع شده‌اید و می‌توانید به چیز دیگری بروید، آسان است.
No need to worry that a misclick will ruin your recommendations forever. ما حدس نمی‌زنیم که چه چیزی می‌خواهید ببینید، به شما اجازه می‌دهیم آن را کنترل کنید.
لازم نیست نگران باشید که یک کلیک اشتباه توصیه های شما را برای همیشه خراب می کند. ما حدس نمی‌زنیم که چه چیزی می‌خواهید ببینید، به شما اجازه می‌دهیم آن را کنترل کنید.
شیوه‌نامه‌ها، بدون سکوها

View File

@@ -1,16 +1,16 @@
Mastodon is the best way to keep up with whats happening. Follow anyone across the fediverse and see it all in chronological order. No algorithms, ads, or clickbait in sight.
Olan biteni takip etmenin en iyi yolu. Herhangi birini federe ağında takip edin ve her şeyi kronolojik sırayla görün. Görünürde algoritma, reklam veya tıklama tuzağı yok.
This is the official Android app for Mastodon. It is blazing fast and stunningly beautiful, designed to be not just powerful but also easy to use. In our app, you can:
Bu, aşağıdakiler için resmi uygulamasıdır. Sadece güçlü değil aynı zamanda kullanımı kolay olacak şekilde tasarlanmış, son derece hızlı ve şaşırtıcı derecede güzel. Uygulamamızda şunları yapabilirsiniz:
EXPLORE
KEŞFET
Discover new writers, journalists, artists, photographers, scientists and more
See whats happening in the world
Yeni yazarlar, gazeteciler, sanatçılar, fotoğraılar, bilim insanları ve daha fazlasını keşfedin
Dünyada neler olup bittiğini görün
READ
OKU
Keep up with people you care about in a chronological feed with no interruptions
Follow hashtags to keep up with specific topics in real time
Önem verdiğiniz kişileri kesintisiz bir kronolojik akışta takip edin
Belirli konuları gerçek zamanlı olarak takip etmek için etiketleri takip edin
CREATE
@@ -25,37 +25,37 @@ CURATE
AND MORE!
■ A beautiful theme that adapts to your personalized color scheme, light or dark
Share and scan QR codes to quickly exchange Mastodon profiles with others
Login and switch between multiple accounts
Get notified when a specific person posts with the bell button
No spoilers! You can put your posts behind content warnings
Profillerini başkalarıyla hızlıca paylaşmak için QR kodlarını paylaşın ve tarayın
Giriş yapın ve birden fazla hesap arasında geçiş yapın
Zil butonu ile belirli bir kişi paylaşım yaptığında bildirim alın
İpucu yok! Yayınlarınızı içerik uyarılarının arkasına koyabilirsiniz
A POWERFUL PUBLISHING PLATFORM
GÜÇLÜ BIR YAYINCILIK PLATFORMU
You no longer have to try and appease an opaque algorithm that decides if your friends are going to see what you posted. If they follow you, theyll see it.
Artık arkadaşlarınızın paylaştıklarını görüp görmeyeceğine karar veren şeffaf olmayan bir algoritmayı yatıştırmaya çalışmak zorunda değilsiniz. Sizi takip ederlerse görürler.
If you publish it to the open web, its accessible on the open web. You can safely share links to Mastodon in the knowledge that anyone will be able to read them without logging in.
Eğer bunu açık olarak yayınlarsanız, herkese açık olarak erişilebilir olur. Herkesin giriş yapmadan okuyabileceğinden emin olarak bağlantılarını güvenle paylaşabilirsiniz.
Between threads, polls, high quality images, videos, audio, and content warnings, Mastodon offers plenty of ways to express yourself in a way that suits you.
Başlıklar, anketler, yüksek kaliteli görüntüler, videolar, sesler ve içerik uyarıları arasında, kendinizi size uygun bir şekilde ifade etmenin birçok yolunu sunar.
A POWERFUL READING PLATFORM
GÜÇLÜ BİR OKUMA PLATFORMU
We dont need to show you ads, so we dont need to keep you in our app. Mastodon has the richest selection of 3rd party apps and integrations so you can choose the experience that fits you best.
Size reklam göstermemize gerek yok, bu yüzden sizi uygulamamızda tutmamıza da gerek yok. Sosyal ağımız, size en uygun deneyimi seçebileceğiniz en zengin 3. parti uygulama ve entegrasyon seçeneklerine sahiptir.
Thanks to the chronological home feed, its easy to tell when youve caught up on all updates and can move on to something else.
Kronolojik ana sayfa akışı sayesinde, tüm güncellemeleri ne zaman yakaladığınızı ve başka bir şeye geçebileceğinizi anlamak kolaydır.
No need to worry that a misclick will ruin your recommendations forever. We dont guess what you want to see, we let you control it.
Yanlış bir tıklamanın önerilerinizi sonsuza dek mahvedeceğinden endişelenmenize gerek yok. Ne görmek istediğinizi tahmin etmiyoruz, sizin kontrol etmenize izin veriyoruz.
PROTOCOLS, NOT PLATFORMS
PLATFORMLAR DEĞİL, PROTOKOLLER
Mastodon is not like a traditional social media platform, but is built on a decentralized protocol. You can sign up on our official server, or choose a 3rd party to host your data and moderate your experience.
Sosyal ağımız geleneksel bir sosyal medya platformu gibi değil, merkezi olmayan bir protokol üzerine inşa edilmiştir. Resmi sunucumuza kayıt olabilir veya verilerinizi barındırmak ve deneyiminizi denetlemek için 3. bir taraf seçebilirsiniz.
Thanks to the common protocol, no matter what you choose, you can communicate seamlessly with people on other Mastodon servers. But theres more: With just one account, you can communicate with people from other fediverse platforms.
Ortak protokol sayesinde, neyi seçerseniz seçin, diğer sunucularındaki kişilerle sorunsuz bir şekilde iletişim kurabilirsiniz. Ama dahası da var: Sadece tek bir hesapla, diğer federe platformlarındaki kişilerle iletişim kurabilirsiniz.
Not happy with your choice? You can always switch to a different Mastodon server while taking your followers with you. For advanced users, you can even host your data on your own infrastructure, since Mastodon is open-source.
Seçimden memnun değil misiniz? Takipçilerini yanınızda götürürken her zaman farklı bir sunucusuna geçebilirsiniz. İleri düzey kullanıcılar için, Açık kaynaklı olduğundan verilerinizi kendi altyapınızda bile barındırabilir.
NON-PROFIT IN NATURE
KÂR AMACI GÜTMEYEN NİTELİKTE
Mastodon is a registered non-profit in the US and Germany. We are not motivated by extracting monetary value from the platform, but by whats best for the platform.
Mastıdon,ABD ve Almanya'da kâr amacı gütmeyen kayıtlı bir kuruluştur. Platformdan parasal değer elde etmek için değil, platform için en iyi olanı yapmak için motive oluyoruz.
AS FEATURED IN: TIME, Forbes, Wired, The Guardian, CNN, The Verge, TechCrunch, Financial Times, Gizmodo, PCMAG.com, and more.
YER ALDIĞI GİBİ: TIME, Forbes, Wired, The Guardian, CNN, The Verge, TechCrunch, Financial Times, Gizmodo, PCMAG.com, ve dahası.

View File

@@ -1 +1 @@
Where conversations happen
Konuşmaların gerçekleştiği yer

View File

@@ -13,8 +13,8 @@ android {
applicationId "org.joinmastodon.android"
minSdk 23
targetSdk 34
versionCode 119
versionName "2.7.0"
versionCode 123
versionName "2.7.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -90,7 +90,7 @@ dependencies {
implementation 'me.grishka.litex:viewpager:1.0.0'
implementation 'me.grishka.litex:viewpager2:1.0.0'
implementation 'me.grishka.litex:palette:1.0.0'
implementation 'me.grishka.appkit:appkit:1.4.0'
implementation 'me.grishka.appkit:appkit:1.4.3'
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'org.jsoup:jsoup:1.14.3'
implementation 'com.squareup:otto:1.3.8'

View File

@@ -23,7 +23,11 @@
</intent>
<intent>
<action android:name="android.intent.action.VIEW"/>
<data android:scheme="http"/>
<data android:scheme="http" android:host="*"/>
</intent>
<intent>
<action android:name="android.intent.action.VIEW"/>
<data android:scheme="https" android:host="*"/>
</intent>
</queries>

View File

@@ -295,6 +295,15 @@ public class CacheController{
.collect(Collectors.toList());
PaginatedResponse<List<NotificationViewModel>> res=new PaginatedResponse<>(converted, result.isEmpty() ? null : result.get(result.size()-1).id);
callback.onSuccess(res);
if(!onlyMentions){
loadingNotifications=false;
synchronized(pendingNotificationsCallbacks){
for(Callback<PaginatedResponse<List<NotificationViewModel>>> cb:pendingNotificationsCallbacks){
cb.onSuccess(res);
}
pendingNotificationsCallbacks.clear();
}
}
databaseThread.postRunnable(()->putNotifications(converted.stream().map(nvm->nvm.notification).collect(Collectors.toList()), accounts, statuses, onlyMentions, maxID==null), 0);
}

View File

@@ -1,10 +1,27 @@
package org.joinmastodon.android.api.requests.notifications;
import org.joinmastodon.android.api.ApiUtils;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.NotificationType;
import java.util.EnumSet;
public class GetUnreadNotificationsCount extends MastodonAPIRequest<GetUnreadNotificationsCount.Response>{
public GetUnreadNotificationsCount(){
public GetUnreadNotificationsCount(EnumSet<NotificationType> includeTypes, EnumSet<NotificationType> groupedTypes){
super(HttpMethod.GET, "/notifications/unread_count", Response.class);
if(includeTypes!=null){
for(String type: ApiUtils.enumSetToStrings(includeTypes, NotificationType.class)){
addQueryParameter("types[]", type);
}
for(String type:ApiUtils.enumSetToStrings(EnumSet.complementOf(includeTypes), NotificationType.class)){
addQueryParameter("exclude_types[]", type);
}
}
if(groupedTypes!=null){
for(String type:ApiUtils.enumSetToStrings(groupedTypes, NotificationType.class)){
addQueryParameter("grouped_types[]", type);
}
}
}
@Override

View File

@@ -119,9 +119,11 @@ public class AccountSession{
activated=(flags & FLAG_ACTIVATED)==FLAG_ACTIVATED;
needUpdatePushSettings=(flags & FLAG_NEED_UPDATE_PUSH_SETTINGS)==FLAG_NEED_UPDATE_PUSH_SETTINGS;
JsonObject pushKeys=JsonParser.parseString(values.getAsString("push_keys")).getAsJsonObject();
pushAuthKey=pushKeys.get("auth").getAsString();
pushPrivateKey=pushKeys.get("private").getAsString();
pushPublicKey=pushKeys.get("public").getAsString();
if(!pushKeys.get("auth").isJsonNull() && !pushKeys.get("private").isJsonNull() && !pushKeys.get("public").isJsonNull()){
pushAuthKey=pushKeys.get("auth").getAsString();
pushPrivateKey=pushKeys.get("private").getAsString();
pushPublicKey=pushKeys.get("public").getAsString();
}
pushSubscription=MastodonAPIController.gson.fromJson(values.getAsString("push_subscription"), PushSubscription.class);
JsonObject legacyFilters=JsonParser.parseString(values.getAsString("legacy_filters")).getAsJsonObject();
wordFilters=MastodonAPIController.gson.fromJson(legacyFilters.getAsJsonArray("filters"), new TypeToken<List<LegacyFilter>>(){}.getType());

View File

@@ -714,8 +714,7 @@ public class AccountSessionManager{
File file=new File(MastodonApp.context.getFilesDir(), "instance_"+domain.replace('.', '_')+".json");
try(FileInputStream in=new FileInputStream(file)){
JsonObject jobj=JsonParser.parseReader(new InputStreamReader(in, StandardCharsets.UTF_8)).getAsJsonObject();
insertInstanceIntoDatabase(db, domain, MastodonAPIController.gson.fromJson(jobj.get("instance"), Instance.class),
insertInstanceIntoDatabase(db, domain, MastodonAPIController.gson.fromJson(jobj.get(jobj.has("instance") ? "instance" : "a"), Instance.class),
MastodonAPIController.gson.fromJson(jobj.get("emojis"), new TypeToken<>(){}.getType()), jobj.get("last_updated").getAsLong());
}catch(Exception x){
Log.w(TAG, "Error reading instance info file for "+domain, x);

View File

@@ -84,7 +84,7 @@ public class CreateListAddMembersFragment extends BaseAccountListFragment implem
public void onSuccess(HeaderPaginationList<Account> result){
for(Account acc:result)
accountIDsInList.add(acc.id);
onDataLoaded(result.stream().map(a->new AccountViewModel(a, accountID)).collect(Collectors.toList()));
onDataLoaded(result.stream().map(a->new AccountViewModel(a, accountID, getActivity())).collect(Collectors.toList()));
}
})
.exec(accountID);

View File

@@ -296,7 +296,7 @@ public class HomeFragment extends AppKitFragment{
if(instance==null)
return;
if(instance.getApiVersion()>=2){
new GetUnreadNotificationsCount()
new GetUnreadNotificationsCount(EnumSet.allOf(NotificationType.class), NotificationType.getGroupableTypes())
.setCallback(new Callback<>(){
@Override
public void onSuccess(GetUnreadNotificationsCount.Response result){

View File

@@ -190,7 +190,7 @@ public class ListMembersFragment extends PaginatedAccountListFragment implements
@Subscribe
public void onAccountAddedToList(AccountAddedToListEvent ev){
if(ev.accountID.equals(accountID) && ev.listID.equals(followList.id)){
data.add(new AccountViewModel(ev.account, accountID));
data.add(new AccountViewModel(ev.account, accountID, getActivity()));
list.getAdapter().notifyItemInserted(data.size()-1);
}
}
@@ -337,7 +337,7 @@ public class ListMembersFragment extends PaginatedAccountListFragment implements
onDone.run();
for(Account acc:accounts){
accountIDsInList.add(acc.id);
data.add(new AccountViewModel(acc, accountID));
data.add(new AccountViewModel(acc, accountID, getActivity()));
}
list.getAdapter().notifyItemRangeInserted(data.size()-accounts.size(), accounts.size());
}

View File

@@ -80,7 +80,7 @@ public class NotificationRequestsFragment extends MastodonRecyclerFragment<Notif
accountViewModels.clear();
maxID=result.getNextPageMaxID();
for(NotificationRequest req:result){
accountViewModels.put(req.account.id, new AccountViewModel(req.account, accountID, false));
accountViewModels.put(req.account.id, new AccountViewModel(req.account, accountID, false, getActivity()));
}
onDataLoaded(result, !TextUtils.isEmpty(maxID));
endMark.setVisibility(TextUtils.isEmpty(maxID) ? View.VISIBLE : View.GONE);

View File

@@ -241,7 +241,7 @@ public class NotificationsListFragment extends BaseNotificationsListFragment{
public boolean onOptionsItemSelected(MenuItem item){
int id=item.getItemId();
if(id==R.id.mark_all_read){
markAsRead();
markAsRead(true);
resetUnreadBackground();
}else if(id==R.id.filters){
showFiltersAlert();
@@ -257,11 +257,11 @@ public class NotificationsListFragment extends BaseNotificationsListFragment{
return mergeAdapter;
}
private void markAsRead(){
private void markAsRead(boolean force){
if(data.isEmpty())
return;
String id=data.get(0).notification.pageMaxId;
if(ObjectIdComparator.INSTANCE.compare(id, realUnreadMarker)>0){
if(force || ObjectIdComparator.INSTANCE.compare(id, realUnreadMarker)>0){
new SaveMarkers(null, id).exec(accountID);
AccountSessionManager.get(accountID).setNotificationsMarker(id, true);
realUnreadMarker=id;
@@ -290,7 +290,7 @@ public class NotificationsListFragment extends BaseNotificationsListFragment{
return;
for(NotificationViewModel n:items){
if(ObjectIdComparator.INSTANCE.compare(n.notification.pageMinId, realUnreadMarker)<=0){
markAsRead();
markAsRead(false);
break;
}
}

View File

@@ -580,7 +580,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop{
domain=AccountSessionManager.get(accountID).domain;
usernameDomain.setText(domain);
CharSequence parsedBio=HtmlParser.parse(account.note, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID, account);
CharSequence parsedBio=HtmlParser.parse(account.note, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID, account, getActivity());
if(TextUtils.isEmpty(parsedBio)){
bio.setVisibility(View.GONE);
}else{
@@ -615,7 +615,7 @@ public class ProfileFragment extends LoaderFragment implements ScrollableToTop{
fields.add(joined);
for(AccountField field:account.fields){
field.parsedValue=ssb=HtmlParser.parse(field.value, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID, account);
field.parsedValue=ssb=HtmlParser.parse(field.value, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID, account, getActivity());
field.valueEmojis=ssb.getSpans(0, ssb.length(), CustomEmojiSpan.class);
ssb=new SpannableStringBuilder(field.name);
HtmlParser.parseCustomEmoji(ssb, account.emojis);

View File

@@ -236,6 +236,8 @@ public class ThreadFragment extends StatusListFragment{
protected void drawDivider(View child, View bottomSibling, RecyclerView.ViewHolder holder, RecyclerView.ViewHolder siblingHolder, RecyclerView parent, Canvas c, Paint paint){
if(holder instanceof StatusDisplayItem.Holder<?> statusHolder && siblingHolder instanceof StatusDisplayItem.Holder<?> siblingStatusHolder){
Status siblingStatus=getStatusByID(siblingStatusHolder.getItemID());
if(siblingStatus==null)
return;
if(statusHolder.getItemID().equals(siblingStatus.inReplyToId) && siblingStatus!=mainStatus && !statusHolder.getItemID().equals(mainStatus.id))
return;
}
@@ -291,6 +293,7 @@ public class ThreadFragment extends StatusListFragment{
continue;
float lineX=V.dp(36);
paint.setAlpha(Math.round(255*child.getAlpha()));
c.save();
c.clipRect(child.getX(), child.getY(), child.getX()+child.getWidth(), child.getY()+child.getHeight());
if(holder instanceof HeaderStatusDisplayItem.Holder){

View File

@@ -61,7 +61,7 @@ public class AccountSearchFragment extends BaseAccountListFragment{
protected void onSuccess(List<Account> result){
setEmptyText(R.string.no_search_results);
onDataLoaded(result.stream().map(a->new AccountViewModel(a, accountID)).collect(Collectors.toList()), false);
onDataLoaded(result.stream().map(a->new AccountViewModel(a, accountID, getActivity())).collect(Collectors.toList()), false);
}
protected String getSearchViewPlaceholder(){

View File

@@ -44,7 +44,7 @@ public class AddNewListMembersFragment extends AccountSearchFragment{
@Override
public void onSuccess(HeaderPaginationList<Account> result){
setEmptyText("");
onDataLoaded(result.stream().map(a->new AccountViewModel(a, accountID)).collect(Collectors.toList()), result.nextPageUri!=null);
onDataLoaded(result.stream().map(a->new AccountViewModel(a, accountID, getActivity())).collect(Collectors.toList()), result.nextPageUri!=null);
maxID=result.getNextPageMaxID();
}
})

View File

@@ -24,7 +24,7 @@ public abstract class PaginatedAccountListFragment extends BaseAccountListFragme
nextMaxID=result.nextPageUri.getQueryParameter("max_id");
else
nextMaxID=null;
onDataLoaded(result.stream().map(a->new AccountViewModel(a, accountID)).collect(Collectors.toList()), nextMaxID!=null);
onDataLoaded(result.stream().map(a->new AccountViewModel(a, accountID, getActivity())).collect(Collectors.toList()), nextMaxID!=null);
}
})
.exec(accountID);

View File

@@ -31,7 +31,7 @@ public class DiscoverAccountsFragment extends BaseAccountListFragment implements
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(List<FollowSuggestion> result){
List<AccountViewModel> accounts=result.stream().map(fs->new AccountViewModel(fs.account, accountID)).collect(Collectors.toList());
List<AccountViewModel> accounts=result.stream().map(fs->new AccountViewModel(fs.account, accountID, getActivity())).collect(Collectors.toList());
onDataLoaded(accounts, false);
bannerHelper.onBannerBecameVisible();
}

View File

@@ -109,7 +109,7 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
return;
onDataLoaded(results.stream().map(sr->{
SearchResultViewModel vm=new SearchResultViewModel(sr, accountID, true);
SearchResultViewModel vm=new SearchResultViewModel(sr, accountID, true, getActivity());
if(sr.type==SearchResult.Type.HASHTAG){
vm.hashtagItem.setOnClick(i->openHashtag(sr));
}
@@ -126,7 +126,7 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
onDataLoaded(Stream.of(result.hashtags.stream().map(SearchResult::new), result.accounts.stream().map(SearchResult::new))
.flatMap(Function.identity())
.map(sr->{
SearchResultViewModel vm=new SearchResultViewModel(sr, accountID, false);
SearchResultViewModel vm=new SearchResultViewModel(sr, accountID, false, getActivity());
if(sr.type==SearchResult.Type.HASHTAG){
vm.hashtagItem.setOnClick(i->openHashtag(sr));
}

View File

@@ -70,7 +70,7 @@ public class OnboardingFollowSuggestionsFragment extends BaseAccountListFragment
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(List<FollowSuggestion> result){
onDataLoaded(result.stream().map(fs->new AccountViewModel(fs.account, accountID).stripLinksFromBio()).collect(Collectors.toList()), false);
onDataLoaded(result.stream().map(fs->new AccountViewModel(fs.account, accountID, getActivity()).stripLinksFromBio()).collect(Collectors.toList()), false);
}
})
.exec(accountID);

View File

@@ -42,6 +42,7 @@ import org.jsoup.nodes.TextNode;
import org.jsoup.select.NodeVisitor;
import org.parceler.Parcels;
import java.time.Instant;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.HashSet;
@@ -237,6 +238,11 @@ public class SignupFragment extends ToolbarFragment{
fakeAccount.acct=fakeAccount.username=username;
fakeAccount.id="tmp"+System.currentTimeMillis();
fakeAccount.displayName=displayName.getText().toString();
fakeAccount.createdAt=Instant.now();
fakeAccount.username=username;
fakeAccount.acct=username;
fakeAccount.url="https://"+instance.getDomain()+"/@"+username;
fakeAccount.avatar=fakeAccount.avatarStatic=fakeAccount.headerStatic=fakeAccount.header=fakeAccount.note="";
AccountSessionManager.getInstance().addAccount(instance, result, fakeAccount, apiApplication, new AccountActivationInfo(email, System.currentTimeMillis()));
Bundle args=new Bundle();
args.putString("account", AccountSessionManager.getInstance().getLastActiveAccountID());

View File

@@ -128,7 +128,7 @@ public class SettingsServerAboutFragment extends LoaderFragment{
hlp.leftMargin=hlp.rightMargin=V.dp(16);
scrollingLayout.addView(heading, hlp);
AccountViewModel model=new AccountViewModel(instance.getContactAccount(), accountID);
AccountViewModel model=new AccountViewModel(instance.getContactAccount(), accountID, getActivity());
AccountViewHolder holder=new AccountViewHolder(this, scrollingLayout, null);
holder.setStyle(AccountViewHolder.AccessoryType.NONE, false);
holder.bind(model);

View File

@@ -1,5 +1,6 @@
package org.joinmastodon.android.model.viewmodel;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
@@ -24,11 +25,11 @@ public class AccountViewModel{
public final CharSequence parsedName, parsedBio;
public final String verifiedLink;
public AccountViewModel(Account account, String accountID){
this(account, accountID, true);
public AccountViewModel(Account account, String accountID, Context context){
this(account, accountID, true, context);
}
public AccountViewModel(Account account, String accountID, boolean needBio){
public AccountViewModel(Account account, String accountID, boolean needBio, Context context){
this.account=account;
avaRequest=new UrlImageLoaderRequest(GlobalUserPreferences.playGifs ? account.avatar : account.avatarStatic, V.dp(50), V.dp(50));
emojiHelper=new CustomEmojiHelper();
@@ -38,7 +39,7 @@ public class AccountViewModel{
parsedName=account.displayName;
SpannableStringBuilder ssb=new SpannableStringBuilder(parsedName);
if(needBio){
parsedBio=HtmlParser.parse(account.note, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID, account);
parsedBio=HtmlParser.parse(account.note, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID, account, context);
ssb.append(parsedBio);
}else{
parsedBio=null;

View File

@@ -11,10 +11,10 @@ public class SearchResultViewModel{
public AccountViewModel account;
public ListItem<Hashtag> hashtagItem;
public SearchResultViewModel(SearchResult result, String accountID, boolean isRecents){
public SearchResultViewModel(SearchResult result, String accountID, boolean isRecents, Context context){
this.result=result;
switch(result.type){
case ACCOUNT -> account=new AccountViewModel(result.account, accountID);
case ACCOUNT -> account=new AccountViewModel(result.account, accountID, context);
case HASHTAG -> {
hashtagItem=new ListItem<>((isRecents ? "#" : "")+result.hashtag.name, null, isRecents ? R.drawable.ic_history_24px : R.drawable.ic_tag_24px, null, result.hashtag);
hashtagItem.isEnabled=true;

View File

@@ -15,7 +15,7 @@ public class AccountStatusDisplayItem extends StatusDisplayItem{
public AccountStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, Account account){
super(parentID, parentFragment);
this.account=new AccountViewModel(account, parentFragment.getAccountID());
this.account=new AccountViewModel(account, parentFragment.getAccountID(), parentFragment.getActivity());
}
@Override

View File

@@ -39,7 +39,7 @@ public class InlineStatusStatusDisplayItem extends StatusDisplayItem{
if(AccountSessionManager.get(parentFragment.getAccountID()).getLocalPreferences().customEmojiInNames)
HtmlParser.parseCustomEmoji(parsedName, status.account.emojis);
parsedPostText=HtmlParser.parse(status.content, status.emojis, status.mentions, status.tags, parentFragment.getAccountID(), status.getContentStatus());
parsedPostText=HtmlParser.parse(status.content, status.emojis, status.mentions, status.tags, parentFragment.getAccountID(), status.getContentStatus(), parentFragment.getActivity());
for(Object span:parsedPostText.getSpans(0, parsedPostText.length(), Object.class)){
if(!(span instanceof CustomEmojiSpan))
parsedPostText.removeSpan(span);

View File

@@ -141,7 +141,7 @@ public abstract class StatusDisplayItem{
}
if(!TextUtils.isEmpty(statusForContent.content)){
SpannableStringBuilder parsedText=HtmlParser.parse(statusForContent.content, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, accountID, statusForContent);
SpannableStringBuilder parsedText=HtmlParser.parse(statusForContent.content, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, accountID, statusForContent, fragment.getActivity());
if(filtered){
HtmlParser.applyFilterHighlights(fragment.getActivity(), parsedText, status.filtered);
}

View File

@@ -58,7 +58,7 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
public void setTranslatedText(String text){
Status statusForContent=status.getContentStatus();
translatedText=HtmlParser.parse(text, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, parentFragment.getAccountID(), statusForContent);
translatedText=HtmlParser.parse(text, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, parentFragment.getAccountID(), statusForContent, parentFragment.getActivity());
translationEmojiHelper.setText(translatedText);
}

View File

@@ -0,0 +1,35 @@
package org.joinmastodon.android.ui.text;
import android.content.Context;
import android.text.TextPaint;
import android.text.style.TypefaceSpan;
import org.joinmastodon.android.R;
import org.joinmastodon.android.ui.utils.UiUtils;
import androidx.annotation.NonNull;
import me.grishka.appkit.utils.V;
public abstract class BaseMonospaceSpan extends TypefaceSpan{
private final Context context;
public BaseMonospaceSpan(Context context){
super("monospace");
this.context=context;
}
@Override
public void updateDrawState(@NonNull TextPaint paint){
super.updateDrawState(paint);
paint.setColor(UiUtils.getThemeColor(context, R.attr.colorRichTextText));
paint.setTextSize(paint.getTextSize()*0.9375f);
paint.baselineShift=V.dp(-1);
}
@Override
public void updateMeasureState(@NonNull TextPaint paint){
super.updateMeasureState(paint);
paint.setTextSize(paint.getTextSize()*0.9375f);
paint.baselineShift=V.dp(-1);
}
}

View File

@@ -0,0 +1,83 @@
package org.joinmastodon.android.ui.text;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.Layout;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.style.CharacterStyle;
import android.text.style.LeadingMarginSpan;
import org.joinmastodon.android.R;
import org.joinmastodon.android.ui.utils.UiUtils;
import androidx.annotation.NonNull;
import me.grishka.appkit.utils.V;
public class BlockQuoteSpan extends CharacterStyle implements LeadingMarginSpan{
private final Context context;
private Drawable icon;
private boolean firstLevel;
private Paint paint=new Paint();
public BlockQuoteSpan(Context context, boolean firstLevel){
this.context=context;
icon=context.getResources().getDrawable(R.drawable.quote, context.getTheme()).mutate();
this.firstLevel=firstLevel;
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(V.dp(3));
}
@Override
public int getLeadingMargin(boolean first){
return V.dp(firstLevel ? 32 : 18);
}
@Override
public void drawLeadingMargin(@NonNull Canvas c, @NonNull Paint p, int x, int dir, int top, int baseline, int bottom, @NonNull CharSequence text, int start, int end, boolean first, @NonNull Layout layout){
if(text instanceof Spanned s && s.getSpanStart(this)==start){
int color;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.S && UiUtils.isDarkTheme()){
color=UiUtils.alphaBlendColors(
context.getColor(android.R.color.system_accent3_700),
context.getColor(android.R.color.system_accent3_800),
0.5f
);
}else{
color=UiUtils.getThemeColor(context, R.attr.colorRichTextDecorations);
}
int level=s.getSpans(start, end, LeadingMarginSpan.class).length-1;
if(dir<0){ // RTL
if(level==0){
icon.setColorFilter(color, PorterDuff.Mode.SRC_IN);
icon.setBounds(layout.getWidth()-icon.getIntrinsicWidth(), top, layout.getWidth(), top+icon.getIntrinsicHeight());
icon.draw(c);
}else{
paint.setColor(color);
float xOffset=layout.getWidth()-V.dp(32+18*(level-1)+1.5f);
c.drawLine(xOffset, top, xOffset, layout.getLineBottom(layout.getLineForOffset(s.getSpanEnd(this))), paint);
}
}else{
if(level==0){
icon.setColorFilter(color, PorterDuff.Mode.SRC_IN);
icon.setBounds(x, top, x+icon.getIntrinsicWidth(), top+icon.getIntrinsicHeight());
icon.draw(c);
}else{
paint.setColor(color);
float xOffset=x+V.dp(32+18*(level-1)+1.5f);
c.drawLine(xOffset, top, xOffset, layout.getLineBottom(layout.getLineForOffset(s.getSpanEnd(this))), paint);
}
}
}
}
@Override
public void updateDrawState(TextPaint tp){
tp.setColor(UiUtils.getThemeColor(context, R.attr.colorRichTextText));
}
}

View File

@@ -0,0 +1,9 @@
package org.joinmastodon.android.ui.text;
import android.content.Context;
public class CodeBlockSpan extends BaseMonospaceSpan{
public CodeBlockSpan(Context context){
super(context);
}
}

View File

@@ -1,11 +1,17 @@
package org.joinmastodon.android.ui.text;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Typeface;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.LineHeightSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.widget.TextView;
import com.twitter.twittertext.Regex;
@@ -34,6 +40,7 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors;
import androidx.annotation.NonNull;
import me.grishka.appkit.utils.V;
public class HtmlParser{
private static final String TAG="HtmlParser";
@@ -69,7 +76,7 @@ public class HtmlParser{
* @param emojis Custom emojis that are present in source as <code>:code:</code>
* @return a spanned string
*/
public static SpannableStringBuilder parse(String source, List<Emoji> emojis, List<Mention> mentions, List<Hashtag> tags, String accountID, Object parentObject){
public static SpannableStringBuilder parse(String source, List<Emoji> emojis, List<Mention> mentions, List<Hashtag> tags, String accountID, Object parentObject, Context context){
class SpanInfo{
public Object span;
public int start;
@@ -92,10 +99,34 @@ public class HtmlParser{
Jsoup.parseBodyFragment(source).body().traverse(new NodeVisitor(){
private final ArrayList<SpanInfo> openSpans=new ArrayList<>();
private boolean isInsidePre(){
for(SpanInfo si:openSpans){
if(si.span instanceof CodeBlockSpan)
return true;
}
return false;
}
private boolean isInsideBlockquote(){
for(SpanInfo si:openSpans){
if(si.span instanceof BlockQuoteSpan)
return true;
}
return false;
}
@SuppressLint("DefaultLocale")
@Override
public void head(@NonNull Node node, int depth){
if(node instanceof TextNode textNode){
ssb.append(textNode.text());
if(isInsidePre()){
ssb.append(textNode.getWholeText().stripTrailing());
}else{
String text=textNode.text();
if(ssb.length()==0 || ssb.charAt(ssb.length()-1)=='\n')
text=text.stripLeading();
ssb.append(text);
}
}else if(node instanceof Element el){
switch(el.nodeName()){
case "a" -> {
@@ -131,6 +162,44 @@ public class HtmlParser{
openSpans.add(new SpanInfo(new InvisibleSpan(), ssb.length(), el));
}
}
case "b", "strong" -> openSpans.add(new SpanInfo(new StyleSpan(Typeface.BOLD), ssb.length(), el));
case "i", "em" -> openSpans.add(new SpanInfo(new StyleSpan(Typeface.ITALIC), ssb.length(), el));
case "s", "del" -> openSpans.add(new SpanInfo(new StrikethroughSpan(), ssb.length(), el));
case "code" -> {
if(!isInsidePre()){
openSpans.add(new SpanInfo(new MonospaceSpan(context), ssb.length(), el));
ssb.append(" ", new SpacerSpan(V.dp(4), 0), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
case "pre" -> openSpans.add(new SpanInfo(new CodeBlockSpan(context), ssb.length(), el));
case "li" -> {
Element parent=el.parent();
if(parent==null)
return;
if(ssb.length()>0 && ssb.charAt(ssb.length()-1)!='\n')
ssb.append('\n');
String markerText;
if("ol".equals(parent.nodeName())){
markerText=String.format("%d.", (parent.hasAttr("start") ? safeParseInt(parent.attr("start")) : 1)+el.elementSiblingIndex());
}else{
markerText="";
}
openSpans.add(new SpanInfo(new ListItemMarkerSpan(markerText), ssb.length(), el));
StringBuilder copyableText=new StringBuilder();
for(SpanInfo si:openSpans){
if(si.span instanceof ListItemMarkerSpan ims){
copyableText.append(ims.text);
}
}
copyableText.append(' ');
ssb.append(copyableText.toString(), new InvisibleSpan(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
case "blockquote" -> {
if(ssb.length()>0 && ssb.charAt(ssb.length()-1)!='\n')
ssb.append('\n');
openSpans.add(new SpanInfo(new BlockQuoteSpan(context, !isInsideBlockquote()), ssb.length(), el));
}
}
}
}
@@ -138,15 +207,27 @@ public class HtmlParser{
@Override
public void tail(@NonNull Node node, int depth){
if(node instanceof Element el){
if("span".equals(el.nodeName()) && el.hasClass("ellipsis")){
String name=el.nodeName();
if("span".equals(name) && el.hasClass("ellipsis")){
ssb.append("", new DeleteWhenCopiedSpan(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}else if("p".equals(el.nodeName())){
}else if("p".equals(name) || "ol".equals(name) || "ul".equals(name)){
if(node.nextSibling()!=null && "body".equals(node.parent().nodeName())){
ssb.append('\n');
ssb.append("\n", new SpacerSpan(1, V.dp(8)), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}else if("pre".equals(name)){
if(node.nextSibling()!=null)
ssb.append("\n\n");
}else if(!openSpans.isEmpty()){
ssb.append("\n");
}
if(!openSpans.isEmpty()){
SpanInfo si=openSpans.get(openSpans.size()-1);
if(si.element==el){
ssb.setSpan(si.span, si.start, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
if(si.span!=null){
if(si.span instanceof MonospaceSpan){
ssb.append(" ", new SpacerSpan(V.dp(4), 0), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
ssb.setSpan(si.span, si.start, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
openSpans.remove(openSpans.size()-1);
}
}
@@ -158,6 +239,14 @@ public class HtmlParser{
return ssb;
}
private static int safeParseInt(String s){
try{
return Integer.parseInt(s);
}catch(NumberFormatException x){
return 0;
}
}
public static void parseCustomEmoji(SpannableStringBuilder ssb, List<Emoji> emojis){
Map<String, Emoji> emojiByCode =
emojis.stream()

View File

@@ -0,0 +1,34 @@
package org.joinmastodon.android.ui.text;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.Layout;
import android.text.Spanned;
import android.text.style.LeadingMarginSpan;
import me.grishka.appkit.utils.V;
public class ListItemMarkerSpan implements LeadingMarginSpan{
public String text;
public ListItemMarkerSpan(String text){
this.text=text;
}
@Override
public int getLeadingMargin(boolean first){
return V.dp(32);
}
@Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean first, Layout layout){
if(text instanceof Spanned s && s.getSpanStart(this)==start){
int level=s.getSpans(start, end, LeadingMarginSpan.class).length-1;
if(dir<0){ // RTL
c.drawText(this.text, layout.getWidth()-V.dp(32*level)-p.measureText(this.text), baseline, p);
}else{
c.drawText(this.text, x+V.dp(32*level), baseline, p);
}
}
}
}

View File

@@ -0,0 +1,9 @@
package org.joinmastodon.android.ui.text;
import android.content.Context;
public class MonospaceSpan extends BaseMonospaceSpan{
public MonospaceSpan(Context context){
super(context);
}
}

View File

@@ -17,7 +17,12 @@ public class SpacerSpan extends ReplacementSpan{
@Override
public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm){
// TODO height
if(fm!=null && height>0){
fm.ascent=-height;
fm.descent=0;
fm.top=fm.ascent;
fm.bottom=0;
}
return width;
}

View File

@@ -713,8 +713,8 @@ public class UiUtils{
item.setIcon(icon);
SpannableStringBuilder ssb=new SpannableStringBuilder(item.getTitle());
ssb.insert(0, " ");
ssb.setSpan(new SpacerSpan(V.dp(24), 1), 0, 1, 0);
ssb.append(" ", new SpacerSpan(V.dp(8), 1), 0);
ssb.setSpan(new SpacerSpan(V.dp(24), 0), 0, 1, 0);
ssb.append(" ", new SpacerSpan(V.dp(8), 0), 0);
item.setTitle(ssb);
}
}

View File

@@ -244,7 +244,7 @@ public class ComposeAutocompleteViewController{
if(mode!=Mode.USERS)
return;
List<AccountViewModel> oldList=users;
users=result.accounts.stream().map(a->new AccountViewModel(a, accountID)).collect(Collectors.toList());
users=result.accounts.stream().map(a->new AccountViewModel(a, accountID, activity)).collect(Collectors.toList());
if(isLoading){
isLoading=false;
if(users.size()>=LOADING_FAKE_USER_COUNT){

View File

@@ -4,6 +4,10 @@ import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.CornerPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.text.Layout;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.util.AttributeSet;
@@ -14,14 +18,22 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.widget.TextView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.ui.text.ClickableLinksDelegate;
import org.joinmastodon.android.ui.text.CodeBlockSpan;
import org.joinmastodon.android.ui.text.DeleteWhenCopiedSpan;
import org.joinmastodon.android.ui.text.MonospaceSpan;
import org.joinmastodon.android.ui.utils.UiUtils;
import me.grishka.appkit.utils.V;
public class LinkedTextView extends TextView{
private ClickableLinksDelegate delegate=new ClickableLinksDelegate(this);
private boolean needInvalidate;
private ActionMode currentActionMode;
private Paint bgPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
private Path tmpPath=new Path();
public LinkedTextView(Context context){
this(context, null);
@@ -56,6 +68,8 @@ public class LinkedTextView extends TextView{
currentActionMode=null;
}
});
bgPaint.setColor(UiUtils.getThemeColor(context, R.attr.colorRichTextContainer));
bgPaint.setPathEffect(new CornerPathEffect(V.dp(2)));
}
public boolean onTouchEvent(MotionEvent ev){
@@ -64,6 +78,22 @@ public class LinkedTextView extends TextView{
}
public void onDraw(Canvas c){
if(getText() instanceof Spanned spanned){
c.save();
c.translate(getTotalPaddingLeft(), getTotalPaddingTop());
Layout layout=getLayout();
MonospaceSpan[] monospaceSpans=spanned.getSpans(0, spanned.length(), MonospaceSpan.class);
for(MonospaceSpan span:monospaceSpans){
layout.getSelectionPath(spanned.getSpanStart(span), spanned.getSpanEnd(span), tmpPath);
c.drawPath(tmpPath, bgPaint);
}
CodeBlockSpan[] blockSpans=spanned.getSpans(0, spanned.length(), CodeBlockSpan.class);
for(CodeBlockSpan span:blockSpans){
c.drawRoundRect(V.dp(-4), layout.getLineTop(layout.getLineForOffset(spanned.getSpanStart(span)))-V.dp(8), layout.getWidth()+V.dp(4),
layout.getLineBottom(layout.getLineForOffset(spanned.getSpanEnd(span)))+V.dp(4), V.dp(2), V.dp(2), bgPaint);
}
c.restore();
}
super.onDraw(c);
delegate.onDraw(c);
if(needInvalidate)

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="20dp"
android:viewportWidth="24"
android:viewportHeight="20">
<path
android:fillColor="#000"
android:pathData="M23.933,2.824C22.324,4.079 21.073,5.357 20.179,6.657C19.33,7.912 18.905,9.1 18.905,10.221C19.084,10.131 19.307,10.086 19.575,10.086C19.888,10.041 20.156,10.019 20.38,10.019C21.408,10.019 22.257,10.445 22.927,11.297C23.642,12.103 24,13.112 24,14.322C24,15.802 23.508,17.035 22.525,18.021C21.542,19.007 20.313,19.5 18.838,19.5C17.274,19.5 16.045,18.94 15.151,17.819C14.257,16.653 13.81,15.107 13.81,13.179C13.81,10.893 14.503,8.629 15.888,6.388C17.274,4.147 19.307,2.017 21.989,0L23.933,2.824ZM10.123,2.824C8.514,4.079 7.263,5.357 6.369,6.657C5.52,7.912 5.095,9.1 5.095,10.221C5.274,10.131 5.497,10.086 5.765,10.086C6.078,10.041 6.346,10.019 6.57,10.019C7.598,10.019 8.447,10.445 9.117,11.297C9.832,12.103 10.19,13.112 10.19,14.322C10.19,15.802 9.698,17.035 8.715,18.021C7.732,19.007 6.503,19.5 5.028,19.5C3.464,19.5 2.235,18.94 1.341,17.819C0.447,16.653 0,15.107 0,13.179C0,10.893 0.693,8.629 2.078,6.388C3.464,4.147 5.497,2.017 8.179,0L10.123,2.824Z"/>
</vector>

View File

@@ -13,8 +13,8 @@
<string name="notifications">Benachrichtigungen</string>
<string name="user_followed_you">%s folgt dir jetzt</string>
<string name="user_sent_follow_request">%s hat dir eine Folgeanfrage gesendet</string>
<string name="user_favorited">%s als Favorit markiert:</string>
<string name="notification_boosted">%s verstärkt:</string>
<string name="user_favorited">%s favorisierte:</string>
<string name="notification_boosted">%s teilte deinen Beitrag:</string>
<string name="share_toot_title">Teilen</string>
<string name="settings">Einstellungen</string>
<string name="publish">Veröffentlichen</string>
@@ -216,8 +216,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">Boosts ausblenden</string>
<string name="show_boosts_from_user">Boosts anzeigen</string>
<string name="hide_boosts_from_user">Geteilte Beiträge ausblenden</string>
<string name="show_boosts_from_user">Geteilte Beiträge 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>
@@ -769,7 +769,41 @@
<string name="cant_load_image">Bild konnte nicht geladen werden</string>
<string name="poll_see_results">Ergebnisse anzeigen</string>
<string name="poll_hide_results">Ergebnisse verstecken</string>
<plurals name="x_attachments">
<item quantity="one">%d Anhang</item>
<item quantity="other">%d Anhänge</item>
</plurals>
<plurals name="user_and_x_more_favorited">
<item quantity="one">%1$s und %2$,d weitere Person favorisierten:</item>
<item quantity="other">%1$s und %2$,d weitere Personen favorisierten:</item>
</plurals>
<plurals name="user_and_x_more_boosted">
<item quantity="one">%1$s und %2$,d weitere Person haben geteilt:</item>
<item quantity="other">%1$s und %2$,d weitere Personen haben geteilt:</item>
</plurals>
<plurals name="poll_ended_x_voters">
<item quantity="one">%1$s hat eine Umfrage durchgeführt, an der du und %2$,d weitere Person teilgenommen haben</item>
<item quantity="other">%1$s hat eine Umfrage durchgeführt, an der du und %2$,d weitere Personen teilgenommen haben</item>
</plurals>
<string name="own_poll_ended">Ihre Umfrage ist beendet</string>
<string name="user_just_posted">%s hat gerade gepostet</string>
<string name="user_edited_post">%s hat einen Beitrag bearbeitet, mit dem du interagiert hast</string>
<string name="relationship_severance_account_suspension">Ein Admin von %1$s hat %2$s gesperrt. Du wirst von diesem Profil keine Updates mehr erhalten und auch nicht mit ihm interagieren können.</string>
<!-- %1$s is your server domain, %2$s is the domain that was blocked, %3$,d is the follower count, %4$s is the `x_accounts` plural string -->
<string name="relationship_severance_domain_block">Ein Admin von %1$s hat %2$s blockiert darunter %3$,d deiner Follower und %4$s Konten, denen du folgst.</string>
<plurals name="x_accounts">
<item quantity="one">%,d Konto</item>
<item quantity="other">%,d Konten</item>
</plurals>
<!-- %1$s is the domain that was blocked, %2$,d is the follower count, %3$s is the `x_accounts` plural string -->
<string name="relationship_severance_user_domain_block">Du hast %1$s blockiert. %2$,d deiner Follower und %3$s Konten, denen du folgst, wurden entfernt.</string>
<string name="relationship_severance_learn_more">Mehr erfahren</string>
<string name="moderation_warning_action_none">Dein Konto ist von den Moderator*innen verwarnt worden.</string>
<string name="moderation_warning_action_disable">Dein Konto wurde eingeschränkt.</string>
<string name="moderation_warning_action_mark_statuses_as_sensitive">Einige deiner Beiträge wurden mit einer Inhaltswarnung versehen.</string>
<string name="moderation_warning_action_delete_statuses">Einige deiner Beiträge sind entfernt worden.</string>
<string name="moderation_warning_action_sensitive">Deine zukünftigen Beiträge werden mit einer Inhaltswarnung versehen.</string>
<string name="moderation_warning_action_silence">Dein Konto wurde eingeschränkt.</string>
<string name="moderation_warning_action_suspend">Dein Konto wurde gesperrt.</string>
<string name="moderation_warning_learn_more">Mehr erfahren</string>
</resources>

View File

@@ -774,8 +774,14 @@ Zenbat eta jende gehiago jarraitu, orduan eta aktiboagoa eta interesgarriagoa iz
<item quantity="one">Erantsitako fitxategi %d</item>
<item quantity="other">%d erantsitako fitxategi</item>
</plurals>
<plurals name="poll_ended_x_voters">
<item quantity="one">%1$s erabiltzaileak inkesta bat egin zuen eta zuk eta beste erabiltzaile %2$,d bozkatu duzue</item>
<item quantity="other">%1$s erabiltzaileak inkesta bat egin zuen eta zuk eta beste %2$,d erabiltzailek bozkatu duzue</item>
</plurals>
<string name="own_poll_ended">Zure inkesta amaitu da</string>
<string name="user_just_posted">%s erabiltzaileak bidalketa egin berri du</string>
<string name="user_edited_post">%s(e)k interaktuatu zenuen argitalpen bat editatu du</string>
<string name="relationship_severance_account_suspension">%1$s zerbitzariko administratzaile batek %2$s bertan behera utzi du, hau da, ezin izango dituzu jaso hango eguneratzerik edo hangoekin elkarreragin.</string>
<!-- %1$s is your server domain, %2$s is the domain that was blocked, %3$,d is the follower count, %4$s is the `x_accounts` plural string -->
<plurals name="x_accounts">
<item quantity="one">kontu %,d</item>
@@ -789,5 +795,6 @@ Zenbat eta jende gehiago jarraitu, orduan eta aktiboagoa eta interesgarriagoa iz
<string name="moderation_warning_action_delete_statuses">Zure argitalpen batzuk kendu dira.</string>
<string name="moderation_warning_action_sensitive">Zure bidalketak hunkigarri gisa markatuko dira aurrerantzean.</string>
<string name="moderation_warning_action_silence">Zure kontuari mugak jarri zaizkio.</string>
<string name="moderation_warning_action_suspend">Zure kontua behin-behinean egotzi da.</string>
<string name="moderation_warning_learn_more">Informazio gehiago</string>
</resources>

View File

@@ -651,6 +651,7 @@
<string name="user_wont_know_muted">آنها نخواهند دانست که خموش شده‌اند.</string>
<string name="user_can_still_see_your_posts">آنها هنوز می‌توانند فرسته‌هایتان را ببینند، ولی فرسته‌هایشان را نمی‌بینید.</string>
<string name="you_wont_see_user_mentions">فرسته‌هایی که به او اشاره کرده‌اند را نخواهید دید.</string>
<string name="user_can_mention_and_follow_you">آنها می توانند شما را ذکر کنند و پی بگیرند، اما شما آنها را نخواهید دید.</string>
<string name="unmuted_user_x">خموشی %s رفع شد</string>
<string name="block_user_confirm_title">کاربر مسدود شود؟</string>
<string name="user_can_see_blocked">آنها می‌توانند ببینند که مسدود شده اند.</string>

View File

@@ -13,6 +13,8 @@
<string name="notifications">Meldingen</string>
<string name="user_followed_you">%s folget jo no</string>
<string name="user_sent_follow_request">%s wol jo graach folgje</string>
<string name="user_favorited">%s markearre as favoryt:</string>
<string name="notification_boosted">%s boostte:</string>
<string name="share_toot_title">Diele</string>
<string name="settings">Ynstellingen</string>
<string name="publish">Publisearje</string>
@@ -382,6 +384,12 @@
<string name="alt_text">Alternative tekst</string>
<string name="help">Help</string>
<string name="what_is_alt_text">Wat is alternative tekst?</string>
<string name="alt_text_help">Alt-tekst biedt ôfbyldingsbeskriuwingen foar minsken mei in fisuele beheining en ferbiningen mei in lege bânbreedte of foar minsken dyt nei ekstra kontekst sykje.\n\nJo kinne de tagonklikheid en de begryplikheid foar elkenien ferbetterje troch dúdlik, koart en objektyf te skriuwen.\n\n<ul><li>Beskriuw wichtige eleminten</li>\n<li>Fetsje tekst yn ôfbyldingen gear</li>\n<li>Brûk in normale sinsbou</li>\n<li>Mij oertallige ynformaasje</li>\n<li>Fokusje op trends en wichtige befiningen yn komplekse bylden (lykas diagrammen of kaarten)</li></ul> \n</string>
<string name="edit_post">Berjocht bewurkje</string>
<string name="no_verified_link">Gjin ferifiearre keppeling</string>
<string name="compose_autocomplete_emoji_empty">Emoji trochsykje</string>
<string name="compose_autocomplete_users_empty">Fyn wat jo sykje</string>
<string name="no_search_results">Dizze syktermen leverje gjin resultaat op</string>
<string name="language">Taal</string>
<string name="language_default">Standert</string>
<string name="language_system">Systeem</string>
@@ -391,21 +399,78 @@
<string name="media_hidden">Media ferstoppe</string>
<string name="post_hidden">Berjocht ferstoppe</string>
<string name="report_title_post">Berjocht rapportearje</string>
<string name="forward_report_explanation">De account stiet op in oare server. Wolle jo dêr ek in anonimisearre kopy fan dit rapport nei ta stjoere?</string>
<!-- %s is the server domain -->
<string name="forward_report_to_server">Nei %s trochstjoere</string>
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
<string name="reported">Rapportearre</string>
<string name="report_unfollow_explanation">As jo harren berjochten net mear op jo starttiidline sjen wolle, moatte jo dizze persoan net mear folgje.</string>
<string name="muted_user">%s negearje</string>
<string name="report_sent_already_blocked">Jo hawwe dizze brûker al blokkearre, dus jo hoege neat mear te dwaan wylst wy jo rapport beoardiele.</string>
<string name="report_personal_already_blocked">Jo hawwe dizze brûker al blokkearre, dus der is neat oars dat jo hoege te dwaan.\n\nTank foar jo help om Mastodon foar elkenien feilich te hâlden!</string>
<string name="blocked_user">%s blokkearre</string>
<string name="mark_all_notifications_read">Alles as lêzen markearje</string>
<string name="settings_display">Werjefte</string>
<string name="settings_filters">Filters</string>
<string name="settings_server_explanation">Oersjoch, rigels, moderators</string>
<!-- %s is the app name (Mastodon, key app_name). I made it a placeholder so everything Just Works™ with forks -->
<string name="about_app">Oer %s</string>
<string name="default_post_language">Standert taal foar berjochten</string>
<string name="settings_alt_text_reminders">Alt-tekst-omtinken tafoegje</string>
<string name="settings_confirm_unfollow">Eardat jo ien ûntfolgje om befêstiging freegje</string>
<string name="settings_confirm_boost">Eardat jo in berjocht booste om befêstiging freegje</string>
<string name="settings_confirm_delete_post">Eardat jo in berjocht fuortsmite om befêstiging freegje</string>
<string name="pause_all_notifications">Alles pauzearje</string>
<string name="pause_notifications_off">Ut</string>
<string name="notifications_policy_anyone">Elkenien</string>
<string name="notifications_policy_followed">Minsken dyt jo folgje</string>
<string name="notifications_policy_follower">Minsken dyt josels folgje</string>
<string name="notifications_policy_no_one">Net ien</string>
<string name="settings_notifications_policy">Meldingen ûntfange fan</string>
<string name="notification_type_mentions_and_replies">Fermeldingen en reaksjes</string>
<string name="pause_all_notifications_title">Alle meldingen pauzearje</string>
<plurals name="x_weeks">
<item quantity="one">%d wike</item>
<item quantity="other">%d wiken</item>
</plurals>
<!-- %1$s is the date (may be relative, e.g. "today" or "yesterday"), %2$s is the time. You can reorder these placeholders if that works better for your language -->
<string name="date_at_time">%1$s om %2$s</string>
<string name="today">hjoed</string>
<string name="yesterday">juster</string>
<string name="tomorrow">moarn</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_ends">Einiget om %s</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_banner">Meldingen wurde om %s ferfette.</string>
<string name="resume_notifications_now">No ferfetsje</string>
<string name="open_system_notification_settings">Gean nei meldingsynstellingen</string>
<string name="about_server">Oer</string>
<string name="server_rules">Regels</string>
<string name="server_administrator">Behearder</string>
<string name="send_email_to_server_admin">Berjocht oan behearder</string>
<string name="notifications_disabled_in_system">Meldingen yn jo apparaatynstellingen ynskeakelje om oeral fernijingen sjen te kinnen.</string>
<string name="settings_even_more">Noch mear ynstellingen</string>
<string name="settings_show_cws">Ynhâldswarskôgingen toane</string>
<string name="settings_hide_sensitive_media">As gefoelich markearre media ferstopje</string>
<string name="settings_show_interaction_counts">Oantal berjochtynteraksjes</string>
<string name="settings_show_emoji_in_names">Oanpaste emoji yn werjeftenammen</string>
<plurals name="in_x_seconds">
<item quantity="one">yn %d sekonde</item>
<item quantity="other">yn %d sekonden</item>
</plurals>
<plurals name="in_x_minutes">
<item quantity="one">yn %d minút</item>
<item quantity="other">yn %d minuten</item>
</plurals>
<plurals name="in_x_hours">
<item quantity="one">yn %d oere</item>
<item quantity="other">yn %d oeren</item>
</plurals>
<plurals name="x_hours_ago">
<item quantity="one">%d oere lyn</item>
<item quantity="other">%d oeren lyn</item>
</plurals>
<string name="alt_text_reminder_title">Media sûnder alt-tekst</string>
<string name="count_one">Ien</string>
<string name="count_two">Twa</string>
<string name="count_three">Trije</string>

View File

@@ -13,6 +13,8 @@
<string name="notifications">Notifikasi</string>
<string name="user_followed_you">%s mengikuti Anda</string>
<string name="user_sent_follow_request">%s mengirim Anda permintaan pengikut</string>
<string name="user_favorited">%s memfavorit:</string>
<string name="notification_boosted">%s membagikan ulang:</string>
<string name="share_toot_title">Bagikan</string>
<string name="settings">Pengaturan</string>
<string name="publish">Terbitkan</string>
@@ -730,6 +732,39 @@
<string name="donation_server_error">Maafkan kami, kesalahan telah terjadi dan kami belum bisa memproses donasi anda.\n\nMohon ulang kembali beberapa menit lagi.</string>
<string name="settings_donate">Donasi ke Mastodon</string>
<string name="settings_manage_donations">Kelola donasi</string>
<string name="cant_load_image">Tidak dapat memuat gambar</string>
<string name="poll_see_results">Lihat hasil</string>
<string name="poll_hide_results">Sembunyikan hasil</string>
<plurals name="x_attachments">
<item quantity="other">%d lampiran</item>
</plurals>
<plurals name="user_and_x_more_favorited">
<item quantity="other">%1$s dan %2$,d lainnya memfavorit:</item>
</plurals>
<plurals name="user_and_x_more_boosted">
<item quantity="other">%1$s dan %2$,d lainnya membagikan ulang:</item>
</plurals>
<plurals name="poll_ended_x_voters">
<item quantity="other">%1$s memulai japat yang Anda dan %2$,d lainnya beri suara</item>
</plurals>
<string name="own_poll_ended">Japat Anda telah berakhir</string>
<string name="user_just_posted">%s baru saja mengirim</string>
<string name="user_edited_post">%s menyunting kiriman yang Anda interaksi</string>
<string name="relationship_severance_account_suspension">Seorang admin dari %1$s telah menangguhkan %2$s, yang berarti Anda tidak dapat lagi menerima pembaruan atau berinteraksi.</string>
<!-- %1$s is your server domain, %2$s is the domain that was blocked, %3$,d is the follower count, %4$s is the `x_accounts` plural string -->
<string name="relationship_severance_domain_block">Seorang admin dari %1$s telah memblokir %2$s, termasuk %3$,d dari pengikut Anda dan %4$s lain yang Anda ikuti.</string>
<plurals name="x_accounts">
<item quantity="other">%,d akun</item>
</plurals>
<!-- %1$s is the domain that was blocked, %2$,d is the follower count, %3$s is the `x_accounts` plural string -->
<string name="relationship_severance_user_domain_block">Anda telah memblokir %1$s, menghapus %2$,d dari pengikut Anda dan %3$s lain yang Anda ikuti.</string>
<string name="relationship_severance_learn_more">Pelajari lebih lanjut</string>
<string name="moderation_warning_action_none">Akun Anda telah menerima peringatan moderasi.</string>
<string name="moderation_warning_action_disable">Akun Anda telah dinonaktifkan.</string>
<string name="moderation_warning_action_mark_statuses_as_sensitive">Beberapa kiriman Anda telah ditandai sebagai sensitif.</string>
<string name="moderation_warning_action_delete_statuses">Beberapa kiriman Anda telah dihapus.</string>
<string name="moderation_warning_action_sensitive">Kiriman Anda akan ditandai sebagai sensitif mulai dari sekarang.</string>
<string name="moderation_warning_action_silence">Akun Anda telah dibatasi.</string>
<string name="moderation_warning_action_suspend">Akun Anda telah ditangguhkan.</string>
<string name="moderation_warning_learn_more">Pelajari lebih lanjut</string>
</resources>

View File

@@ -775,16 +775,16 @@ Più persone segui, più sarà attivo e interessante.</string>
<item quantity="other">%d allegati</item>
</plurals>
<plurals name="user_and_x_more_favorited">
<item quantity="one">%1$s e %2 altro utente hanno aggiunto ai preferiti:</item>
<item quantity="other">%1$s e %2 altri utenti hanno aggiunto ai preferiti:</item>
<item quantity="one">%1$s e %2$,d altro utente hanno aggiunto ai preferiti:</item>
<item quantity="other">%1$s e %2$,d altri utenti hanno aggiunto ai preferiti:</item>
</plurals>
<plurals name="user_and_x_more_boosted">
<item quantity="one">%1$s e %2 altro utente hanno condiviso:</item>
<item quantity="other">%1$s e %2 altri utenti hanno condiviso:</item>
<item quantity="one">%1$s e %2$,d altro utente hanno condiviso:</item>
<item quantity="other">%1$s e %2$,d altri utenti hanno condiviso:</item>
</plurals>
<plurals name="poll_ended_x_voters">
<item quantity="one">%1$s ha condotto un sondaggio a cui hanno votato tu e %2 altro utente</item>
<item quantity="other">%1$s ha condotto un sondaggio a cui hanno votato tu e %2 altri utenti</item>
<item quantity="one">%1$s ha condotto un sondaggio a cui hanno votato tu e %2$,d altro utente</item>
<item quantity="other">%1$s ha condotto un sondaggio a cui hanno votato tu e %2$,d altri utenti</item>
</plurals>
<string name="own_poll_ended">Il tuo sondaggio è terminato</string>
<string name="user_just_posted">%s ha appena pubblicato un post</string>

View File

@@ -13,6 +13,8 @@
<string name="notifications">Meldingen</string>
<string name="user_followed_you">%s volgt jou nu</string>
<string name="user_sent_follow_request">%s wil jou graag volgen</string>
<string name="user_favorited">%s markeerde als favoriet:</string>
<string name="notification_boosted">%s boostte:</string>
<string name="share_toot_title">Delen</string>
<string name="settings">Instellingen</string>
<string name="publish">Toot</string>
@@ -230,11 +232,11 @@
<string name="file_saved">Bestand opgeslagen</string>
<string name="downloading">Downloaden…</string>
<string name="no_app_to_handle_action">Kon geen app vinden om deze actie uit te voeren</string>
<string name="local_timeline">Livefeed</string>
<string name="local_timeline">Lokale tijdlijn</string>
<string name="trending_posts_info_banner">Dit zijn berichten die populair zijn op Mastodon.</string>
<string name="trending_links_info_banner">Dit zijn de nieuwsverhalen waarover op Mastodon wordt gesproken.</string>
<!-- %s is the server domain -->
<string name="local_timeline_info_banner">Dit zijn alle berichten van alle gebruikers op uw server (%s).</string>
<string name="local_timeline_info_banner">Dit zijn alle berichten van alle gebruikers op jouw server (%s).</string>
<string name="recommended_accounts_info_banner">Mogelijk vind je deze accounts leuk op basis van andere accounts die je volgt.</string>
<string name="see_new_posts">Nieuwe berichten</string>
<string name="load_missing_posts">Resterende berichten laden</string>
@@ -723,7 +725,7 @@
<string name="notification_filter_new_accounts">Nieuwe accounts</string>
<string name="notification_filter_new_accounts_explanation">In de afgelopen 30 dagen geregistreerd</string>
<string name="notification_filter_mentions">Ongevraagde privéberichten</string>
<string name="notification_filter_mentions_explanation">Onzichtbaar tenzij het een antwoord is op een privébericht van jou of wanneer je de afzender volgt</string>
<string name="notification_filter_mentions_explanation">Onzichtbaar tenzij het een reactie is op een privébericht van jou of wanneer je de afzender volgt</string>
<string name="allow_notifications">Meldingen toestaan</string>
<string name="mute_notifications">Meldingen afwijzen</string>
<plurals name="x_people_you_may_know">
@@ -764,6 +766,44 @@
<string name="donation_server_error">Het spijt ons, er is een fout opgetreden en we zijn niet in staat om je donatie te verwerken.\n\nProbeer het over een paar minuten opnieuw.</string>
<string name="settings_donate">Aan Mastodon doneren</string>
<string name="settings_manage_donations">Donaties beheren</string>
<string name="cant_load_image">Kon afbeelding niet laden</string>
<string name="poll_see_results">Resultaten bekijken</string>
<string name="poll_hide_results">Resultaten verbergen</string>
<plurals name="x_attachments">
<item quantity="one">%d bijlage</item>
<item quantity="other">%d bijlagen</item>
</plurals>
<plurals name="user_and_x_more_favorited">
<item quantity="one">%1$s en %2$,d ander persoon markeerde als favoriet:</item>
<item quantity="other">%1$s en %2$,d andere personen markeerde als favoriet:</item>
</plurals>
<plurals name="user_and_x_more_boosted">
<item quantity="one">%1$s en %2$,d ander persoon boostte:</item>
<item quantity="other">%1$s en %2$,d andere personen boostte:</item>
</plurals>
<plurals name="poll_ended_x_voters">
<item quantity="one">%1$s hield een peiling, waaraan jij en %2$,d ander persoon hebben meegedaan</item>
<item quantity="other">%1$s hield een peiling, waaraan jij en %2$,d andere personen hebben meegedaan</item>
</plurals>
<string name="own_poll_ended">Jouw peiling is beëindigd</string>
<string name="user_just_posted">%s heeft zojuist een bericht geplaatst</string>
<string name="user_edited_post">%s bewerkte een bericht waarmee je interactie had</string>
<string name="relationship_severance_account_suspension">Een beheerder van %1$s heeft %2$s geschorst, wat betekent dat je geen updates meer van hen kunt ontvangen of met hen kunt communiceren.</string>
<!-- %1$s is your server domain, %2$s is the domain that was blocked, %3$,d is the follower count, %4$s is the `x_accounts` plural string -->
<string name="relationship_severance_domain_block">Een beheerder van %1$s heeft %2$s geblokkeerd, inclusief %3$,d van jouw volgers en %4$s account(s) die je volgt.</string>
<plurals name="x_accounts">
<item quantity="one">%,d account</item>
<item quantity="other">%,d accounts</item>
</plurals>
<!-- %1$s is the domain that was blocked, %2$,d is the follower count, %3$s is the `x_accounts` plural string -->
<string name="relationship_severance_user_domain_block">Je hebt %1$s geblokkeerd, waarmee je %2$,d van je volgers en %3$s account(s) die je volgt, bent verloren.</string>
<string name="relationship_severance_learn_more">Meer informatie</string>
<string name="moderation_warning_action_none">Jouw account heeft een moderatie-waarschuwing ontvangen.</string>
<string name="moderation_warning_action_disable">Jouw account is uitgeschakeld.</string>
<string name="moderation_warning_action_mark_statuses_as_sensitive">Sommige van je berichten zijn gemarkeerd als gevoelig.</string>
<string name="moderation_warning_action_delete_statuses">Sommige van je berichten zijn verwijderd.</string>
<string name="moderation_warning_action_sensitive">Je berichten worden vanaf nu als gevoelig gemarkeerd.</string>
<string name="moderation_warning_action_silence">Jouw account is beperkt.</string>
<string name="moderation_warning_action_suspend">Jouw account is opgeschort.</string>
<string name="moderation_warning_learn_more">Meer informatie</string>
</resources>

View File

@@ -464,7 +464,7 @@
<string name="notifications_policy_no_one">Никого</string>
<string name="settings_notifications_policy">Получать уведомления от</string>
<string name="notification_type_mentions_and_replies">Упоминания и ответы</string>
<string name="pause_all_notifications_title">Просмотреть все уведомления</string>
<string name="pause_all_notifications_title">Приостановить все уведомления</string>
<plurals name="x_weeks">
<item quantity="one">%d неделя</item>
<item quantity="few">%d недели</item>

View File

@@ -9,10 +9,12 @@
<string name="preparing_auth">Kimlik doğrulama için hazırlanıyor…</string>
<string name="finishing_auth">Kimlik doğrulama tamamlanıyor…</string>
<string name="user_boosted">%s yineledi</string>
<string name="in_reply_to">için %s yanıt</string>
<string name="in_reply_to">%s yanıt olarak</string>
<string name="notifications">Bildirimler</string>
<string name="user_followed_you">%s seni takip etti</string>
<string name="user_sent_follow_request">%s size bir takip isteği gönderdi</string>
<string name="user_favorited">%s favoriler:</string>
<string name="notification_boosted">%s yükseltilen:</string>
<string name="share_toot_title">Paylaş</string>
<string name="settings">Ayarlar</string>
<string name="publish">Yayınla</string>
@@ -40,8 +42,8 @@
<string name="block_user">%s Engelle</string>
<string name="unblock_user">%s Engeli kaldır</string>
<string name="report_user">%s Raporla</string>
<string name="block_domain">%s kişisini engelle</string>
<string name="unblock_domain">%s kişisinin engelini kaldır</string>
<string name="block_domain">%s Kişisini engelle</string>
<string name="unblock_domain">%s Kişisinin engelini kaldır</string>
<plurals name="x_posts">
<item quantity="one">%,d gönderi</item>
<item quantity="other">%,d gönderi</item>
@@ -52,7 +54,7 @@
<string name="field_label">Etiket</string>
<string name="field_content">İçerik</string>
<string name="saving">Kaydediliyor…</string>
<string name="post_from_user">%s kullanıcına ait gönderi</string>
<string name="post_from_user">%s Gönderen</string>
<string name="poll_option_hint">Seçenek %d</string>
<plurals name="x_minutes">
<item quantity="one">%d dakika</item>
@@ -96,7 +98,7 @@
<string name="delete">Sil</string>
<string name="confirm_delete_title">Gönderiyi sil</string>
<string name="confirm_delete">Bu gönderiyi silmek istediğinizden emin misiniz?</string>
<string name="deleting">Siliniyor</string>
<string name="deleting">Siliniyor</string>
<string name="notification_channel_audio_player">Ses çal</string>
<string name="play">Oynat</string>
<string name="pause">Durdur</string>
@@ -135,10 +137,10 @@
<string name="report_sent_subtitle">Biz bunu incelerken siz %s hesabına karşı önlem alabilirsiniz:</string>
<string name="unfollow_user">Takipten çık %s</string>
<string name="unfollow">Takipten çık</string>
<string name="mute_user_explain">Gönderilerini görmeyeceksiniz. Sizi takip etmeye devam edebilir ve gönderilerinizi görebilirler ama sessize alındığını anlamayacaktır.</string>
<string name="block_user_explain">Gönderilerini göremeyeceksiniz. Gönderilerinizi göremez veya sizi takip edemez. Engelli olduğunu anlayabilir.</string>
<string name="mute_user_explain">Onların gönderilerini göremezsiniz. Sizi takip etmeye ve yayınını görmeye devam edebilirler ve sessize alındıklarını bilmezler.</string>
<string name="block_user_explain">Onların gönderilerini göremezsiniz. Sizin yayınlarınızı göremezler veya sizi takip edemezler. Engellendiklerini anlayabilecekler.</string>
<string name="report_personal_title">Bunu görmek istemiyor musunuz?</string>
<string name="report_personal_subtitle">Mastodon\'da görebileceklerinizi kontrol etmek için seçenekleriniz şunlardır:</string>
<string name="report_personal_subtitle">Gördüklerinizi kontrol etmek için seçenekleriniz şunlardır:</string>
<string name="back">Geri</string>
<string name="search_communities">Sunucu adı veya bağlantısı</string>
<string name="instance_rules_title">Sunucu kuralları</string>
@@ -146,7 +148,7 @@
<string name="signup_title">Hesap oluştur</string>
<string name="display_name">Ad</string>
<string name="username">Kullanıcı adı</string>
<string name="email">E-Posta</string>
<string name="email">Posta</string>
<string name="password">Parola</string>
<string name="confirm_password">Parolayı doğrula</string>
<string name="category_general">Genel</string>
@@ -155,8 +157,8 @@
<string name="confirm_email_subtitle">%s adresini doğrulamak için size gönderdiğimiz bağlantıya dokunun. Hemen burada bekleyeceğiz.</string>
<string name="confirm_email_didnt_get">Bağlantı gelmedi mi?</string>
<string name="resend">Yeniden gönder</string>
<string name="open_email_app">E-Posta uygulamasını</string>
<string name="resent_email">Onay epostası gönderildi</string>
<string name="open_email_app">Mail uygulamasını</string>
<string name="resent_email">Onay mail gönderildi</string>
<string name="compose_hint">Aklınızdan geçenleri yazın veya yapıştırın</string>
<string name="content_warning">İçerik uyarısı</string>
<string name="save">Kaydet</string>
@@ -172,27 +174,27 @@
<string name="notification_type_mention">Bahsetmeler</string>
<string name="notification_type_poll">Anketler</string>
<string name="choose_account">Hesap seç</string>
<string name="err_not_logged_in">Lütfen önce Mastodonda oturum açın</string>
<string name="err_not_logged_in">Lütfen önce oturum açın</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">%d adetten fazla medya ekleyemezsiniz</item>
<item quantity="other">%d adetten fazla medya ekleyemezsiniz</item>
</plurals>
<string name="media_attachment_unsupported_type">%s dosyası desteklenmeyen türde</string>
<string name="media_attachment_too_big">%1$s dosyası, %2$s MB\'lik boyut sınırınııyor</string>
<string name="media_attachment_too_big">%1$s dosyası, %2$s MB boyut sınırınııyor</string>
<string name="settings_theme">Görünüm</string>
<string name="theme_auto">Cihaz görünümünü kullan</string>
<string name="theme_light">Aydınlık</string>
<string name="theme_dark">Karanlık</string>
<string name="settings_behavior">Ayarlar</string>
<string name="settings_gif">Animasyonlu avatarları ve emojileri oynat</string>
<string name="settings_gif">Animasyonlu görsel ve simgeleri oynat</string>
<string name="settings_custom_tabs">Bağlantıyı</string>
<string name="settings_notifications">Bildirimler</string>
<string name="settings_contribute">Mastodon\'a katkıda bulunun</string>
<string name="settings_tos">Kullanım şartları</string>
<string name="settings_privacy_policy">Gizlilik politikası</string>
<string name="settings_clear_cache">Medya önbelleğini temizle</string>
<string name="settings_app_version">Android için Mastodon v%1$s (%2$d)</string>
<string name="media_cache_cleared">Medya önbelleği temizlendi</string>
<string name="settings_clear_cache">Temizle medya önbellek</string>
<string name="settings_app_version">Uygulama için %1$s (%2$d)</string>
<string name="media_cache_cleared">Medya önbellek temizlendi</string>
<string name="confirm_log_out">%s oturumu kapatılsın mı?</string>
<string name="sensitive_content_explain">Medya, gönderi sahibi tarafından hassas olarak işaretlendi.</string>
<string name="avatar_description">%s kullanıcısının profiline git</string>
@@ -205,12 +207,12 @@
<string name="media_no_description">ıklamasız medya</string>
<string name="add_media">Medya ekle</string>
<string name="add_poll">Anket ekle</string>
<string name="emoji">Emoji</string>
<string name="home_timeline">Anasayfa</string>
<string name="emoji">Simge</string>
<string name="home_timeline">Ev akışı</string>
<string name="my_profile">Profilim</string>
<string name="media_viewer">Medya görüntüleyici</string>
<string name="follow_user">%s takip et</string>
<string name="unfollowed_user">%s takipden çıkıldı</string>
<string name="follow_user">%s Takip et</string>
<string name="unfollowed_user">%s Takip edilmiyor</string>
<string name="followed_user">Artık %s kullanıcısını takip ediyorsun</string>
<string name="following_user_requested">%s takip isteği gönderdi</string>
<string name="open_in_browser">Tarayıcıda aç</string>
@@ -219,7 +221,7 @@
<string name="signup_reason">Neden katılmak istiyorsunuz?</string>
<string name="signup_reason_note">Bu, başvurunuzu incelememize yardımcı olacaktır.</string>
<string name="clear">Temizle</string>
<string name="profile_header">Üstbaşlık görseli</string>
<string name="profile_header">Başlık görseli</string>
<string name="profile_picture">Profil fotoğrafı</string>
<string name="reorder">Sırala</string>
<string name="download">İndir</string>
@@ -230,10 +232,11 @@
<string name="file_saved">Dosya kaydedildi</string>
<string name="downloading">İndiriliyor…</string>
<string name="no_app_to_handle_action">Bu eylemi gerçekleştirebilecek bir uygulama bulunmuyor</string>
<string name="trending_posts_info_banner">Bunlar, Mastodon\'da ilgi gören gönderiler.</string>
<string name="trending_links_info_banner">Bunlar Mastodon\'da konuşulan haberler.</string>
<string name="local_timeline">Canlı yayın</string>
<string name="trending_posts_info_banner">Bunlar, Ağda ilgi gören gönderiler.</string>
<string name="trending_links_info_banner">Bunlar Ağda konuşulan haberler.</string>
<!-- %s is the server domain -->
<string name="local_timeline_info_banner">Bunlar, sunucunuzdaki (%s) tüm kullanıcıların gönderileri.</string>
<string name="local_timeline_info_banner">Bunlar, ağlardaki (%s) tüm kullanıcıların gönderileri.</string>
<string name="recommended_accounts_info_banner">Takip ettiğiniz hesaplara göre bu hesapları beğenebilirsiniz.</string>
<string name="see_new_posts">Yeni gönderiler</string>
<string name="load_missing_posts">Daha fazlası</string>
@@ -297,20 +300,22 @@
<string name="download_update">İndir (%s)</string>
<string name="install_update">Kur</string>
<string name="privacy_policy_title">Gizlilik</string>
<string name="privacy_policy_subtitle">Mastodon uygulaması herhangi bir veri toplamasa da, kaydolduğunuz sunucunun farklı bir politikası olabilir.\n\nlf için politikayı kabul etmiyorsanız %s, geri dönüp farklı bir sunucu seçebilirsiniz.</string>
<string name="privacy_policy_subtitle"> uygulaması herhangi bir veri toplamasa da, kayıt olduğunuz sunucunun farklı bir politikası olabilir.\n\n için politikayı kabul etmiyorsanız, %s geri dönerek farklı bir sunucu tercih edebilirsiniz.</string>
<string name="i_agree">Kabul ediyorum</string>
<string name="empty_list">Bu liste boş</string>
<string name="instance_signup_closed">Bu sunucu yeni kayıtları kabul etmemektedir.</string>
<string name="text_copied">Panoya kopyalandı</string>
<string name="add_bookmark">Yer imlerine ekle</string>
<string name="remove_bookmark">Yerimini kaldır</string>
<string name="remove_bookmark">Yer imini kaldır</string>
<string name="bookmarks">Yer imleri</string>
<string name="your_favorites">Gözdeler</string>
<string name="login_title">Tekrar hoşgeldiniz</string>
<string name="login_title">Tekrar hoş geldiniz</string>
<string name="login_subtitle">Hesabınızı oluşturduğunuz sunucuya giriş yapın.</string>
<string name="server_url">Sunucu bağlantısı</string>
<string name="server_filter_any_language">Herhangi bir dil</string>
<string name="server_filter_instant_signup">Anında kayıt</string>
<string name="server_filter_manual_review">Elle inceleme</string>
<string name="server_filter_any_signup_speed">Herhangi bir kayıt hızı</string>
<string name="server_filter_region_europe">Avrupa</string>
<string name="server_filter_region_north_america">Kuzey Amerika</string>
<string name="server_filter_region_south_america">Güney Amerika</string>
@@ -322,17 +327,17 @@
<string name="signup_passwords_dont_match">Parolalar eşleşmiyor</string>
<string name="profile_add_row">Satır ekle</string>
<string name="profile_setup">Profilini ayarla</string>
<string name="profile_setup_subtitle">Bunu istediğin zaman Profil sekmesinden tamamlayabilirsin.</string>
<string name="profile_setup_subtitle">Bunu istediğin zaman Profil sekmesinden tamamla.</string>
<string name="follow_all">Hepsini takip et</string>
<string name="server_rules_disagree">Reddet</string>
<string name="privacy_policy_explanation">Kısacası: Hiçbir şey toplamıyoruz veya işlemiyoruz.</string>
<!-- %s is server domain -->
<string name="server_policy_disagree">%s\'nı reddet</string>
<string name="server_policy_disagree">%s Katılmıyorum</string>
<string name="profile_bio">Hakkımda</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">Hesaplar takip ediliyor…</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 tarafından kayıt yapılmasına izin vermiyor. Farklı bir e-posta adresi deneyin veya &lt;a&gt;farklı bir sunucu seçin&lt;/a&gt;.</string>
<string name="signup_email_domain_blocked">%1$s, tarafından kayıt yapılmasına izin vermiyor. %2$s Farklı bir mail adresi deneyin veya &lt;a&gt;farklı bir sunucu seçin&lt;/a&gt;.</string>
<string name="spoiler_show">Yine de göster</string>
<string name="spoiler_hide">Yeniden gizle</string>
<string name="poll_multiple_choice">Bir ya da daha fazla seçim yapın</string>
@@ -348,10 +353,10 @@
<string name="pick_server">Başka sunucu seç</string>
<string name="signup_or_login">veya</string>
<string name="learn_more">Daha fazlası</string>
<string name="welcome_to_mastodon">Mastodon\'a hoş geldiniz</string>
<string name="welcome_paragraph1">Mastodon merkezi olmayan bir sosyal ağdır, yani onu tek bir şirket kontrol etmiyor. Hepsi birbirine bağlı, bağımsız olarak çalışan birçok sunucudan oluşur.</string>
<string name="welcome_to_mastodon">Hoş geldiniz</string>
<string name="welcome_paragraph1">Merkezi olmayan bir sosyal ağdır, yani onu tek bir şirket kontrol etmiyor. Hepsi birbirine bağlı, bağımsız olarak çalışan birçok sunucudan oluşur.</string>
<string name="what_are_servers">Sunucular nedir?</string>
<string name="welcome_paragraph2">Her Mastodon hesabı bir sunucuda barındırılır - her birinin kendi değerleri, kuralları ve yöneticileri vardır. Hangisini seçerseniz seçin, herhangi bir sunucudaki insanları takip edebilir ve onlarla etkileşime geçebilirsiniz.</string>
<string name="welcome_paragraph2">Her hesabı bir sunucuda barındırılır - her birinin kendi değerleri, kuralları ve &amp; yöneticileri vardır. Hangisini seçerseniz seçin, herhangi bir sunucudaki insanları takip edebilir ve onlarla etkileşime geçebilirsiniz.</string>
<string name="opening_link">Bağlantıılıyor…</string>
<string name="link_not_supported">Bu bağlantı uygulamada desteklenmiyor</string>
<string name="log_out_all_accounts">Tüm hesaplardan çıkış yap</string>
@@ -379,10 +384,10 @@
<string name="alt_text">Alternatif metin</string>
<string name="help">Yardım</string>
<string name="what_is_alt_text">Alternatif metin nedir?</string>
<string name="alt_text_help">Alternatif metin, görme bozukluğu olan, düşük bant genişliğine sahip bağlantıları olan veya ekstra bağlam arayan kişiler için görsel açıklamaları sağlar.\n\n Net, sade ve nesnel alternatif metin yazarak herkes için erişilebilirliği ve anlaşılabilirliği iyileştirebilirsiniz.\n\n<ul><li>Önemli öğeleri yakalayın</li>\n<li>Resimlerdeki metni özetleyin</li>\n<li>Düzenli cümle yapısı kullanın</li>\n<li>Gereksiz bilgilerden kaçının</li>\n<li>Karmaşık görsellerde (şemalar veya haritalar gibi) trendlere ve temel bulgulara odaklanın</li></ul></string>
<string name="alt_text_help">Alternatif metin, görme bozukluğu olan, düşük bant genişliğine sahip bağlantıları olan veya ekstra bağlam arayan kişiler için görsel açıklamaları sağlar.\n\n Net, sade ve nesnel alternatif metin yazarak herkes için erişilebilirliği ve anlaşılabilirliği iyileştirebilirsiniz.\n\n<ul><li>Önemlileri yakalayın</li>\n<li>Resimlerdeki metni özetleyin</li>\n<li>Düzenli cümle yapısı kullanın</li>\n<li>Gereksiz bilgilerden kaçının</li>\n<li>Karmaşık görsellerde (şemalar veya haritalar gibi) trendlere ve temel bulgulara odaklanın</li></ul></string>
<string name="edit_post">Gönderiyi düzenle</string>
<string name="no_verified_link">Doğrulanmamış bağlantı</string>
<string name="compose_autocomplete_emoji_empty">Emoji bul</string>
<string name="compose_autocomplete_emoji_empty">Simge bul</string>
<string name="compose_autocomplete_users_empty">Kimi aradığınızı bulun</string>
<string name="no_search_results">Bu arama terimleri için hiçbir şey bulunamadı</string>
<string name="language">Dil</string>
@@ -394,20 +399,20 @@
<string name="media_hidden">Medya gizlendi</string>
<string name="post_hidden">Gönderi gizlendi</string>
<string name="report_title_post">Gönderiyi bildir</string>
<string name="forward_report_explanation">Hesap başka bir sunucudan. Bu raporun anonimleştirilmiş bir kopyası oraya da gönderilsin mi?</string>
<string name="forward_report_explanation">Hesap başka bir sunucudan. Bu raporun anonim bir kopyası oraya da gönderilsin mi?</string>
<!-- %s is the server domain -->
<string name="forward_report_to_server">İlet %s</string>
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
<string name="reported">Bildirildi</string>
<string name="report_unfollow_explanation">Gönderilerini artık ana sayfa akışınızda görmemek için takibi bırakın.</string>
<string name="muted_user">sessize alındı %s</string>
<string name="report_unfollow_explanation">Gönderilerini artık ana sayfa akışında görmemek için takibi bırakın.</string>
<string name="muted_user">%s Sessize alındı</string>
<string name="report_sent_already_blocked">Bu kullanıcıyı zaten engellediniz. Biz raporunuzu incelerken yapmanız gereken başka bir şey yok.</string>
<string name="report_personal_already_blocked">Bu kullanıcıyı zaten engellediniz, yani yapmanız gereken başka bir şey yok.\n\nMastodon\'u herkes için güvenli bir yer olarak tutmaya yardımcı olduğunuz için teşekkürler!</string>
<string name="blocked_user">%s engellendi</string>
<string name="mark_all_notifications_read">Tümünü okundu olarak işaretle</string>
<string name="settings_display">Görünüm</string>
<string name="settings_filters">Süzgeçler</string>
<string name="settings_server_explanation">Genel bakış, kurallar, moderatörler</string>
<string name="settings_server_explanation">Genel bakış, kurallar, ler</string>
<!-- %s is the app name (Mastodon, key app_name). I made it a placeholder so everything Just Works™ with forks -->
<string name="about_app">%s Hakkında</string>
<string name="default_post_language">Varsayılan gönderi dili</string>
@@ -448,7 +453,7 @@
<string name="settings_show_cws">İçerik uyarılarını göster</string>
<string name="settings_hide_sensitive_media">Hassas olarak işaretlenen medyayı gizle</string>
<string name="settings_show_interaction_counts">Gönderi etkileşim sayısı</string>
<string name="settings_show_emoji_in_names">Görünen adlarda özel emoji</string>
<string name="settings_show_emoji_in_names">Görünen adlarda özel simge</string>
<plurals name="in_x_seconds">
<item quantity="one">%d saniye içinde</item>
<item quantity="other">%d saniye içinde</item>
@@ -501,19 +506,19 @@
<string name="selection_2_options">%1$s ve %2$s</string>
<string name="selection_3_options">%1$s, %2$s ve %3$s</string>
<string name="selection_4_or_more">%1$s, %2$s ve %3$d daha fazlası</string>
<string name="filter_context_home_lists">Anasayfa ve listeler</string>
<string name="filter_context_home_lists">Ev &amp; listeler</string>
<string name="filter_context_notifications">Bildirimler</string>
<string name="filter_context_public_timelines">Herkese açık zaman çizelgeleri</string>
<string name="filter_context_threads_replies">Konular &amp; cevaplar</string>
<string name="filter_context_profiles">Profiller</string>
<string name="settings_filter_title">Başlık</string>
<string name="settings_delete_filter_title">“%s” süzgeci silinsin mi?</string>
<string name="settings_delete_filter_confirmation">Bu süzgeç, tüm cihazlarınızdaki hesabınızdan silinecek.</string>
<string name="settings_delete_filter_confirmation">Bu süzgeç tüm cihaz hesabınızdan silinecektir.</string>
<string name="add_muted_word">Sessize alınacak kelime ekle</string>
<string name="edit_muted_word">Sessize alınmış kelimeyi düzenle</string>
<string name="add">Ekle</string>
<string name="filter_word_or_phrase">Kelime veya kelime grubu</string>
<string name="filter_add_word_help">Kelimeler büyük/küçük harfe duyarlı değildir ve yalnızca tam sözcüklerle eşleşir.\n\n\"Elma\" anahtar kelimesini filtrelerseniz, \"elma\" veya \"eLlMa\" içeren gönderileri gizler ancak \"elmacı\" içeren gönderileri gizlemez.</string>
<string name="filter_add_word_help">Kelimeler büyük-küçük harfe duyarlı değildir ve yalnızca tam kelimelerle eşleşir.\n\nIf anahtar kelimeyi süzgeç işleminde “Nar,” içeren gönderileri gizleyecektir. Ama “nar” “Tanesi” “Suyu.” değil</string>
<string name="settings_delete_filter_word">“%s” kelimesi silinsin mi?</string>
<string name="enter_selection_mode">Seç</string>
<string name="select_all">Tümünü seç</string>
@@ -524,8 +529,8 @@
<item quantity="other">%d kelime silinsin mi?</item>
</plurals>
<plurals name="x_items_selected">
<item quantity="one">%d öğe seçildi</item>
<item quantity="other">%d öğe seçildi</item>
<item quantity="one">%d seçildi</item>
<item quantity="other">%d seçildiler</item>
</plurals>
<string name="required_form_field_blank">Boş bırakılamaz</string>
<string name="filter_word_already_in_list">Zaten listede</string>
@@ -534,9 +539,9 @@
<string name="downloading_update">İndiriliyor (%d%%)</string>
<!-- Shown like a content warning, %s is the name of the filter -->
<string name="post_matches_filter_x">“%s” süzgeciyle eşleşiyor</string>
<string name="search_mastodon">Mastodon\'da ara</string>
<string name="search_mastodon">Ara</string>
<string name="clear_all">Tümünü temizle</string>
<string name="search_open_url">Bağlantıyı Mastodon\'da</string>
<string name="search_open_url">Bağlantıyı ağ içinde</string>
<string name="posts_matching_hashtag">“%s” içeren gönderiler</string>
<string name="search_go_to_account">Git %s</string>
<string name="posts_matching_string">“%s” içeren gönderiler</string>
@@ -551,9 +556,9 @@
<!-- %1$s is the language, %2$s is the name of the translation service -->
<string name="post_translated">%2$s kullanılarak %1$s dilinden çevrildi</string>
<string name="translation_show_original">Özgün içeriği göster</string>
<string name="translation_failed">Çeviri başarısız oldu. Yönetici bu sunucuda çevirileri etkinleştirmemiş olabilir veya bu sunucu çevirilerin henüz desteklenmediği eski bir Mastodon sürümünü çalıştırıyor olabilir.</string>
<string name="translation_failed">Çeviri başarısız oldu. Yönetici bu sunucuda çevirileri etkin olmayabilir veya bu sunucu çevirilerin henüz desteklenmediği eski bir sürümünü çalıştırıyor olabilir.</string>
<string name="settings_privacy">Gizlilik ve erişim</string>
<string name="settings_discoverable">Profil ve gönderileri keşif algoritmalarında kullan</string>
<string name="settings_discoverable">Keşif aracında profil ve gönderileri öne çıkar</string>
<string name="settings_indexable">Herkese açık gönderileri arama sonuçlarına ekle</string>
<plurals name="x_participants">
<item quantity="one">%d katılımcılar</item>
@@ -564,7 +569,7 @@
<item quantity="other">%,d bunları gönder</item>
</plurals>
<string name="error_playing_video">Video oynatılırken hata oluştu</string>
<string name="timeline_following">Anasayfa</string>
<string name="timeline_following">Ev</string>
<string name="lists">Listeler</string>
<string name="followed_hashtags">Takip edilen etiketler</string>
<string name="manage_lists">Listeleri yönetin</string>
@@ -577,7 +582,7 @@
<!-- %s is the name of the list -->
<string name="delete_list_confirm">Sil “%s”?</string>
<string name="list_exclusive">Takip edilen üyeleri gizle</string>
<string name="list_exclusive_subtitle">Birisi bu listede yer alıyorsa, gönderilerini iki kez görmekten kaçınmak için onu Takip Edenleri zaman akışınızdan gizleyin.</string>
<string name="list_exclusive_subtitle">Birisi bu listede yer alıyorsa, gönderilerini iki kez görmekten kaçınmak için onu Takip edenleri zaman akışta gizleyin.</string>
<string name="list_name">Liste ismi</string>
<string name="list_show_replies_to">Yanıtları göster</string>
<string name="list_replies_no_one">Hiç kimse</string>
@@ -587,7 +592,7 @@
<string name="remove">Kaldır</string>
<string name="add_list_member">Üye ekle</string>
<string name="search_among_people_you_follow">Takip ettiğiniz kişiler arasında arama yapın</string>
<string name="add_user_to_list">Listelere ekle/kaldır...</string>
<string name="add_user_to_list">Listelerden ekle/kaldır</string>
<string name="add_user_to_list_title">Listeye ekle</string>
<!-- %s is a username -->
<string name="manage_user_lists">Listeleri yönet %s şurada görünür</string>
@@ -600,41 +605,41 @@
<string name="manage_accounts">Hesap ekleme veya değiştirme</string>
<plurals name="x_posts_recently">
<item quantity="one">%,d son zamanlardaki yayın</item>
<item quantity="other">%,d yakın zamanda gönderilerim</item>
<item quantity="other">%,d yakın zamanda yayınlarım</item>
</plurals>
<string name="create_list">Liste oluştur</string>
<string name="step_x_of_y">Step %1$d ile %2$d</string>
<string name="create">Oluştur</string>
<string name="manage_list_members">Liste üyelerini yönet</string>
<string name="list_no_members">Henüz üye yok.</string>
<string name="list_no_members">Henüz üye yok</string>
<string name="list_find_users">Eklenecek kullanıcıları bul</string>
<string name="reply_to_user"> %s Yanıtla</string>
<string name="reply_to_user">%s Yanıtla</string>
<string name="posted_at">%s tarafından gönderildi</string>
<string name="non_mutual_sheet_title">Merhaba, yeni bağlantı!</string>
<string name="non_mutual_sheet_text">Görünüşe göre henüz ortak bağlantınız olmayan birine yanıt vermek üzeresiniz. Harika bir ilk izlenim bırakınız.</string>
<string name="got_it">Anladım</string>
<string name="dont_remind_again">Bana tekrar hatırlatmayınız.</string>
<string name="dont_remind_again">Bana bir daha hatırlatma</string>
<!-- %s is a time interval ("5 months") -->
<string name="old_post_sheet_title">Bu gönderi %s eski</string>
<string name="old_post_sheet_text">Hâlâ yanıt verebilirsiniz, ancak konuyla ilgili olmayabilir.</string>
<string name="old_post_sheet_text">Hala yanıt verebilirsiniz, ancak artık konuyla ilgili olmayabilir.</string>
<plurals name="x_months">
<item quantity="one">%,d ay</item>
<item quantity="other">%,d aylar</item>
</plurals>
<string name="more_than_two_years">2 yıldan fazla süredir</string>
<string name="non_mutual_title1">Saygılı ve ilgili olunuz</string>
<string name="non_mutual_title1">Saygılı &amp; ilgili olunuz</string>
<string name="non_mutual_text1">Yanıtınızın nazik ve konuyla ilgili olduğundan emin olunuz.</string>
<string name="non_mutual_title2">Nezaketle sarıl</string>
<string name="non_mutual_text2">Olumlu bir yaklaşım her zaman takdir edilir.</string>
<string name="non_mutual_title3">ık olunuz</string>
<string name="non_mutual_text3">Herkesin konuşma tarzı kendine özgüdür. Uyum sağlamaya hazır olunuz.</string>
<string name="make_profile_discoverable">Profilimi keşfedilebilir hale getiriniz</string>
<string name="discoverability">Keşfedebilirlik</string>
<string name="discoverability_help">Mastodon\'da keşfedilebilirliği tercih ettiğinizde, gönderileriniz arama sonuçlarında ve trendlerde görünebilir.\n\nProfiliniz sizinle benzer ilgi alanlarına sahip kişilere önerilebilir.\n\nBirisi sizi isminizle ararsa, devre dışı bırakma işlemi profilinizi gizlemez.</string>
<string name="make_profile_discoverable">Profil sayfamı keşfedilebilir hale getiriniz</string>
<string name="discoverability">Keşfet</string>
<string name="discoverability_help">Ağ da keşfet tercih ettiğinizde, yayınlarınız arama sonuçlarında ve trendlerde görünebilir.\n\nProfiliniz sizinle benzer ilgi alanlarına sahip kişilere önerilebilir.\n\nBirisi sizi isminizle ararsa, devre dışı bırakma işlemi profilinizi gizlemez.</string>
<string name="app_version_copied">Sürüm numarası panoya kopyalandı</string>
<string name="onboarding_recommendations_intro">Kendi ana akışınızı düzenlersiniz.
Ne kadar çok kişiyi takip ederseniz, o kadar aktif ve ilginç olacaktır.</string>
<string name="onboarding_recommendations_title">Anasayfa akışınızı kişiselleştirin</string>
<string name="onboarding_recommendations_title">Ev akışınızı kişiselleştirin</string>
<string name="article_by_author">Yazan %s</string>
<string name="info">Bilgi</string>
<string name="button_reblogged">Yeniden paylaştı</string>
@@ -642,9 +647,9 @@ Ne kadar çok kişiyi takip ederseniz, o kadar aktif ve ilginç olacaktır.</str
<string name="bookmarked">Yer işareti</string>
<string name="join_server_x_with_invite">Davetiye ile %s \'ye katılınız</string>
<string name="expired_invite_link">Süresi dolmuş davet bağlantısı</string>
<string name="expired_clipboard_invite_link_alert">Panonuzdaki %1$s davet bağlantısının süresi doldu ve kaydolmak için kullanılamıyor.\n\nMevcut bir kullanıcıdan yeni bir bağlantı talep edebilir, %2$s, üzerinden kaydolabilir veya kaydolmak için başka bir sunucu seçebilirsiniz.</string>
<string name="expired_clipboard_invite_link_alert">Pano %1$s davet bağlantısının süresi doldu ve kaydolmak için kullanılamıyor.\n\nMevcut bir kullanıcıdan yeni bir bağlantı talep edebilir, %2$s, üzerinden kayıt olabilir veya kayıt olmak için başka bir sunucu seçebilirsiniz.</string>
<string name="invalid_invite_link">Geçersiz davet bağlantısı</string>
<string name="invalid_clipboard_invite_link_alert">Panonuzdaki %1$s davet bağlantısının süresi doldu ve kaydolmak için kullanılamıyor.\n\nMevcut bir kullanıcıdan yeni bir bağlantı talep edebilir, %2$s, üzerinden kaydolabilir veya kaydolmak için başka bir sunucu seçebilirsiniz.</string>
<string name="invalid_clipboard_invite_link_alert">Pano %1$s davet bağlantısının süresi doldu ve kaydolmak için kullanılamıyor.\n\nMevcut bir kullanıcıdan yeni bir bağlantı talep edebilir, %2$s, üzerinden kayıt olabilir veya kayıt olmak için başka bir sunucu seçebilirsiniz.</string>
<string name="use_invite_link">Davet bağlantısını kullan</string>
<string name="enter_invite_link">Davet bağlantısı gir</string>
<string name="this_invite_is_invalid">Bu davet bağlantısı geçerli değil.</string>
@@ -653,57 +658,57 @@ Ne kadar çok kişiyi takip ederseniz, o kadar aktif ve ilginç olacaktır.</str
<string name="need_invite_to_join_server">Katılmak %s için mevcut bir kullanıcıdan davet bağlantısı almanız gerekir.</string>
<string name="mute_user_confirm_title">Kullanıcıyı sustur?</string>
<string name="user_wont_know_muted">Susturulduklarını bilmeyecekler.</string>
<string name="user_can_still_see_your_posts">Onlar sizin gönderilerinizi görmeye devam edebilir, ancak siz onlarınkini göremezsiniz.</string>
<string name="user_can_still_see_your_posts">Onlar sizin yayınlarınızı görmeye devam edebilir, ancak siz onlarınkini göremezsiniz.</string>
<string name="you_wont_see_user_mentions">Onlardan bahseden gönderiler göremezsiniz.</string>
<string name="user_can_mention_and_follow_you">Sizden bahsedebilir ve sizi takip edebilirler, ancak siz onları göremezsiniz.</string>
<string name="unmuted_user_x">%s Sesini aç</string>
<string name="block_user_confirm_title">Kullanıcıyı Engelle?</string>
<string name="user_can_see_blocked">Engellendiklerini görebiliyorlar.</string>
<string name="user_cant_see_each_other_posts">Onlar sizin gönderilerinizi görmeye devam edebilir, ancak siz onlarınkini göremezsiniz.</string>
<string name="user_cant_see_each_other_posts">Onlar sizin yayınlarınızı görmeye devam edebilir, ancak siz onlarınkini göremezsiniz.</string>
<string name="user_cant_mention_or_follow_you">Sizden bahsedemez veya sizi takip edemezler.</string>
<string name="unblocked_user_x">%s İçin Engel Kaldırılsın</string>
<string name="block_domain_confirm_title">Alan adını engelle?</string>
<string name="do_block_server">Sunucuyu engelle</string>
<string name="block_user_x_instead">Bunun yerine %s\'yi engelle</string>
<string name="block_user_x_instead">Bunun yerine %s engelle</string>
<string name="users_cant_see_blocked">Bu sunucudaki kullanıcılardan gelen gönderileri veya bildirimleri göremezsiniz.</string>
<string name="you_wont_see_server_posts">Bu sunucudaki kullanıcılardan gelen gönderileri veya bildirimleri göremezsiniz.</string>
<string name="server_followers_will_be_removed">Bu sunucudaki takipçileriniz kaldırılacaktır.</string>
<string name="server_followers_will_be_removed">Bu sunucudaki takipçilerin kaldırılacaktır.</string>
<string name="server_cant_mention_or_follow_you">Bu sunucudan kimse sizi takip edemez.</string>
<string name="server_can_interact_with_older">Bu sunucudaki kişiler eski gönderileriniz ile etkileşime geçebilir.</string>
<string name="server_can_interact_with_older">Bu sunucudaki kişiler eski yayınlarınız ile etkileşime geçebilir.</string>
<string name="unblocked_domain_x">Engellenmemiş alan %s</string>
<string name="handle_help_title">Tanıtıcı nedir?</string>
<string name="handle_title"></string>
<string name="handle_username_explanation">Sunucularındaki benzersiz tanımlayıcıları. Aynı kullanıcı adına sahip kullanıcıları farklı sunucularda bulmak mümkündür.</string>
<string name="handle_title_own">Tanıtıcınız</string>
<string name="handle_username_explanation_own">Sunucularındaki benzersiz tanımlayıcıları. Aynı kullanıcı adına sahip kullanıcıları farklı sunucularda bulmak mümkündür.</string>
<string name="handle_title">Onların adı</string>
<string name="handle_username_explanation">Sunucularındaki benzersiz tanımlama. Aynı kullanıcı adına sahip kullanıcıları farklı sunucularda bulmak mümkündür.</string>
<string name="handle_title_own">Takma adınız</string>
<string name="handle_username_explanation_own">Sunucularındaki benzersiz tanımlama. Aynı kullanıcı adına sahip kullanıcıları farklı sunucularda bulmak mümkündür.</string>
<string name="server">Sunucu</string>
<string name="handle_server_explanation">Tüm paylaşımlarının yer aldığı dijital anasayfalar.</string>
<string name="handle_explanation">Tanıtıcılar bir kişinin kim olduğunu ve nerede olduğunu söylediği için, &lt;a&gt;ActivityPub destekli platformların&lt;/a&gt; sosyal ağındaki insanlarla etkileşime geçebilirsiniz.</string>
<string name="handle_server_explanation_own">Tüm gönderilerinizin yer aldığı dijital anasayfanız. Bunu beğenmediniz mi? İstediğiniz zaman sunucularınızı değiştirin ve takipçilerinizi de getirin.</string>
<string name="handle_explanation_own">Tanıtıcılar bir kişinin kim olduğunu ve nerede olduğunu söylediği için, &lt;a&gt;ActivityPub destekli platformların&lt;/a&gt; sosyal ağındaki insanlarla etkileşime geçebilirsiniz.</string>
<string name="what_is_activitypub_title">ActivityPub nedir?</string>
<string name="what_is_activitypub">ActivityPub, Mastodon\'un diğer sosyal ağlarla konuştuğu bir dil gibidir.\n\nSadece Mastodon\'da değil, farklı sosyal uygulamalarda da insanlarla bağlantı kurmanızı ve etkileşimde bulunmanızı sağlar.</string>
<string name="handle_server_explanation">Tüm gönderilerinin bulunduğu dijital evleri.</string>
<string name="handle_explanation">Tanım bir kişinin kim olduğunu ve nerede olduğunu söylediği için, &lt;a&gt;Etkin destekli platformların&lt;/a&gt; sosyal ağındaki insanlarla etkileşime geçebilirsiniz.</string>
<string name="handle_server_explanation_own">Tüm yayının yer aldığı dijital eviniz. Bunu beğenmediniz mi? İstediğiniz zaman sunucularınızı değiştirin ve takipçilerinizi de, getirin.</string>
<string name="handle_explanation_own">Tanım bir kişinin kim olduğunu ve nerede olduğunu söylediği için, &lt;a&gt;Etnik destekli platformların&lt;/a&gt; sosyal ağındaki insanlarla etkileşime geçebilirsiniz.</string>
<string name="what_is_activitypub_title">Etkin nedir?</string>
<string name="what_is_activitypub">ActivityPub nedir?, Mastodon\'un diğer sosyal ağlarla konuştuğu bir dil gibidir.\n\nSadece Mastodon\'da değil, farklı sosyal uygulamalarda da insanlarla bağlantı kurmanızı ve etkileşimde bulunmanızı sağlar.</string>
<string name="handle_copied">Panoya kopyalanan tutamaç.</string>
<string name="qr_code">Karekod kodu</string>
<string name="scan_qr_code">Karekodunu tarayın</string>
<string name="qr_code">QR kod</string>
<string name="scan_qr_code">QR kodu tarayın</string>
<!-- Shown on a button that saves a file, after it was successfully saved -->
<string name="saved">Kaydet</string>
<string name="image_saved">Görsel katdet.</string>
<string name="image_saved">Görsel kaydet.</string>
<string name="video_saved">Video kaydet seçeneğini.</string>
<string name="view_file">Görüntüle</string>
<string name="share_sheet_preview_profile">Mastodon\'da %s</string>
<string name="share_sheet_preview_post">%1$s Mastodon\'da: “%2$s”</string>
<string name="share_sheet_preview_profile">%s üzerinden</string>
<string name="share_sheet_preview_post">%1$s üzerinden: “%2$s”</string>
<string name="copy_profile_link">Bağlantıyı profile kopyala</string>
<string name="in_app_browser">Uygulama içi tarayıcı</string>
<string name="system_browser">Sistem tarayıcısı</string>
<string name="add_muted_word_short">Kelime ekle</string>
<string name="tab_home">Anasayfa</string>
<string name="tab_home">Ev</string>
<string name="tab_search">Keşfet</string>
<string name="tab_profile">Profil</string>
<string name="pin_post">Profile sabitle</string>
<string name="unpin_post">Profilden sabitlemeyi kaldır</string>
<string name="post_pinned">Gönderi sabitlendi</string>
<string name="post_unpinned">Gönderi sabitlenemedi</string>
<string name="post_unpinned">Gönderi sabitlenme hatası</string>
<!-- %s is the username -->
<string name="enable_new_post_notifications">Yayınlandığında %s bana bildir</string>
<string name="disable_new_post_notifications">%s Kişisinin gönderi bildirimlerini kapat</string>
@@ -713,17 +718,93 @@ Ne kadar çok kişiyi takip ederseniz, o kadar aktif ve ilginç olacaktır.</str
<string name="unmute_conversation">Konuşmanın sesini aç</string>
<string name="visibility_unlisted">Sessizce herkese açık</string>
<string name="filtered_notifications">Bildirimleri süzgeçle</string>
<string name="filter_notifications">Şundan bildirimleri süzgeçle...</string>
<string name="filter_notifications">Gelen bildirimleri süzgeçle...</string>
<string name="notification_filter_following">Takip etmediğin kullanıcılar</string>
<string name="notification_filter_following_explanation">Onları manuel olarak onaylayana kadar</string>
<string name="notification_filter_following_explanation">Siz elle onaylayana kadar</string>
<string name="notification_filter_followers">Seni takip etmeyen kullanıcılar</string>
<string name="notification_filter_followers_explanation">Sizi 3 günden daha az süredir takip eden kullanıcılar dahil</string>
<string name="notification_filter_new_accounts">Yeni hesaplar</string>
<string name="notification_filter_new_accounts_explanation">Son 30 gün içinde oluşturuldu</string>
<string name="notification_filter_mentions">İstenmeyen özel değinmeler</string>
<string name="notification_filter_mentions_explanation">Kendi değinmenize yanıt veya takip ettiğiniz kullanıcıdan değilse süzgeçlenir</string>
<string name="notification_filter_mentions_explanation">Kendi yayınınıza yanıt olarak veya göndereni takip ediyorsanız süzgeç işlemi yapmaz</string>
<string name="allow_notifications">Bildirimlere izin ver</string>
<string name="mute_notifications">Bildirim talebini reddet</string>
<plurals name="x_people_you_may_know">
<item quantity="one">tanıyabi̇leceği̇ni̇z %,d insan</item>
<item quantity="other">tanıyor olabileceğiniz %,d insanlar</item>
</plurals>
<string name="notifications_from_user">%s Gelen bildirimler</string>
<string name="notifications_muted">%s gelen bildirimler reddedildi.</string>
<string name="notifications_allowed">%s artık bildirim listenizde görünecek.</string>
<string name="visibility_subtitle_public">Ağdaki herkes</string>
<string name="visibility_subtitle_unlisted">Daha az tantana</string>
<string name="visibility_subtitle_followers">Sadece senin takipçilerin</string>
<string name="visibility_subtitle_private">Yazıda adı geçen herkes</string>
<string name="view_boosts">Destekleri görüntüle</string>
<string name="view_favorites">Favorileri görüntüle</string>
<string name="undo_reblog">Güçlendirmeyi geri al</string>
<string name="undo_favorite">Favoriyi geri al</string>
<string name="could_not_reach_server">Sunucuya ulaşılamadı. Bağlantınızı kontrol edin ve tekrar deneyin?</string>
<string name="connection_timed_out">İstek zaman aşımına uğradı. Bağlantınızı kontrol edin ve tekrar deneyin?</string>
<string name="server_error">Sunucunuz ile konuşurken bir şeyler ters gitti. Muhtemelen senin hatan değildir. Tekrar deneyelim mi?</string>
<string name="not_found">Silinmiş ya da belki de hiç var olmamış olabilir.</string>
<string name="no_servers_found">\"%s\" için sunucu bulunamadı</string>
<string name="signup_username_taken">Bu kullanıcı adı alınmış. Farklı bir tane deneyin veya &lt;a&gt;farklı bir sunucu seçin&lt;/a&gt;.</string>
<string name="signup_email_invalid">Bu geçerli bir mail adresine benzemiyor.</string>
<string name="signup_email_taken">Mail adresi zaten kullanımda. Sen &lt;a&gt; parola unuttun &lt;/a&gt;?</string>
<plurals name="x_new_notifications">
<item quantity="one">%,d yeni bildirim</item>
<item quantity="other">%,d yeni bildirimler</item>
</plurals>
<string name="dismiss">Reddet</string>
<string name="donation_once">Sadece bir kez</string>
<string name="donation_monthly">Aylık</string>
<string name="donation_yearly">Yıllık</string>
<string name="currency">Para birimi</string>
<string name="donation_success_share">Kelimeyi yay</string>
<string name="donation_success_title">Katkılarınız için teşekkür ederiz!</string>
<string name="donation_success_subtitle">Yakında size bağışınızı onaylayan bir onaylayan mail almış olmanız gerekir.</string>
<string name="donation_server_error">Üzgünüz, bir hata oluştu ve bağışınızı işleme koyamadık.\n\nLütfen birkaç dakika içinde tekrar deneyiniz.</string>
<string name="settings_donate">Bağış yapınız</string>
<string name="settings_manage_donations">Bağışları yönetin</string>
<string name="cant_load_image">Görsel yüklenemedi</string>
<string name="poll_see_results">Sonuçları görün</string>
<string name="poll_hide_results">Sonuçları gizle</string>
<plurals name="x_attachments">
<item quantity="one">%d ek</item>
<item quantity="other">%d ekler</item>
</plurals>
<plurals name="user_and_x_more_favorited">
<item quantity="one">%1$s ve %2$,d diğer favori:</item>
<item quantity="other">%1$s ve %2$,d diğer favoriler:</item>
</plurals>
<plurals name="user_and_x_more_boosted">
<item quantity="one">%1$s ve %2$,d diğer yükseltme:</item>
<item quantity="other">%1$s ve %2$,d diğer yükseltmeler:</item>
</plurals>
<plurals name="poll_ended_x_voters">
<item quantity="one">%1$s sizin ve %2$,d diğerinin oy verdiği bir anket düzenledi</item>
<item quantity="other">%1$s sizin ve %2$,d diğerinin oy verdiği bir anket düzenlediler</item>
</plurals>
<string name="own_poll_ended">Senin anketin sona erdi</string>
<string name="user_just_posted">%s birazdan gönderildi</string>
<string name="user_edited_post">%s etkileşimde bulunduğunuz bir gönderiyi düzenlediniz</string>
<string name="relationship_severance_account_suspension">%1$s bir yönetici %2$s askıya aldı, bu da artık onlardan güncelleme alamayacağınız veya onlarla etkileşime geçemeyeceğiniz anlamına geliyor.</string>
<!-- %1$s is your server domain, %2$s is the domain that was blocked, %3$,d is the follower count, %4$s is the `x_accounts` plural string -->
<string name="relationship_severance_domain_block">%1$s\'den bir yönetici, takipçilerin %3$,d\'si ve takip ettiğiniz %4$s dahil olmak üzere %2$s engelledi.</string>
<plurals name="x_accounts">
<item quantity="one">%,d hesap</item>
<item quantity="other">%,d hesaplar</item>
</plurals>
<!-- %1$s is the domain that was blocked, %2$,d is the follower count, %3$s is the `x_accounts` plural string -->
<string name="relationship_severance_user_domain_block">%1$s engellediniz, takipçilerin %2$,d ve takip ettiğiniz %3$s kaldırdınız.</string>
<string name="relationship_severance_learn_more">Daha fazlası</string>
<string name="moderation_warning_action_none">Hesabınız bir uyarı aldı.</string>
<string name="moderation_warning_action_disable">Hesabınız devre dışı bırakıldı.</string>
<string name="moderation_warning_action_mark_statuses_as_sensitive">Bazı yayınlarınız hassas olarak işaretlendi.</string>
<string name="moderation_warning_action_delete_statuses">Bazı yayınlarınız kaldırıldı.</string>
<string name="moderation_warning_action_sensitive">Yayınlarınız bundan sonra hassas olarak işaretlenecektir.</string>
<string name="moderation_warning_action_silence">Hesabınız sınırlandırıldı.</string>
<string name="moderation_warning_action_suspend">Hesabınız askıya alındı.</string>
<string name="moderation_warning_learn_more">Daha fazlası</string>
</resources>

View File

@@ -45,4 +45,11 @@
<color name="m3_sys_dark_on_surface_variant">@android:color/system_neutral2_200</color>
<color name="m3_sys_dark_outline">@android:color/system_neutral2_400</color>
<color name="m3_sys_dark_outline_variant">@android:color/system_neutral2_700</color>
<color name="ext_rich_text_text_light">@android:color/system_accent3_700</color>
<color name="ext_rich_text_container_light">@android:color/system_accent3_100</color>
<color name="ext_rich_text_decoration_light">@android:color/system_accent3_200</color>
<color name="ext_rich_text_text_dark">@android:color/system_accent3_200</color>
<color name="ext_rich_text_container_dark">@android:color/system_accent3_800</color>
<color name="ext_rich_text_decoration_dark">#0f0</color> <!-- it's "tertiary 35" but oh well -->
</resources>

View File

@@ -276,7 +276,7 @@
<string name="file_size_gb">%.2f GB</string>
<string name="upload_processing">正在处理…</string>
<!-- %s is file size -->
<string name="download_update">下载(%s)</string>
<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>

View File

@@ -33,6 +33,9 @@
<attr name="colorWhite" format="color"/>
<attr name="colorFavorite" format="color" />
<attr name="colorBoost" format="color" />
<attr name="colorRichTextText" format="color"/>
<attr name="colorRichTextContainer" format="color"/>
<attr name="colorRichTextDecorations" format="color"/>
<declare-styleable name="MaxWidthFrameLayout">
<attr name="android:maxWidth" format="dimension"/>

View File

@@ -104,5 +104,12 @@
<color name="ext_on_bookmark_container_light_medium_contrast">#FFFFFF</color>
<color name="ext_on_bookmark_container_dark">#FFFFFF</color>
<color name="ext_rich_text_text_light">#6C3646</color>
<color name="ext_rich_text_container_light">#FFD9E1</color>
<color name="ext_rich_text_decoration_light">#FDB2C5</color>
<color name="ext_rich_text_text_dark">#FDB2C5</color>
<color name="ext_rich_text_container_dark">#512030</color>
<color name="ext_rich_text_decoration_dark">#7A4152</color>
<item name="overlay_ripple_alpha" format="float" type="dimen">0.12</item>
</resources>

View File

@@ -58,6 +58,9 @@
<item name="colorWhite">#FFF</item>
<item name="colorFavorite">@color/ext_favorite_light</item>
<item name="colorBoost">@color/ext_boost_light</item>
<item name="colorRichTextText">@color/ext_rich_text_text_light</item>
<item name="colorRichTextContainer">@color/ext_rich_text_container_light</item>
<item name="colorRichTextDecorations">@color/ext_rich_text_decoration_light</item>
<item name="android:statusBarColor">?colorM3Background</item>
<item name="android:navigationBarColor">@color/navigation_bar_bg_light</item>
@@ -126,6 +129,9 @@
<item name="colorWhite">#000</item>
<item name="colorFavorite">@color/ext_favorite_dark</item>
<item name="colorBoost">@color/ext_boost_dark</item>
<item name="colorRichTextText">@color/ext_rich_text_text_dark</item>
<item name="colorRichTextContainer">@color/ext_rich_text_container_dark</item>
<item name="colorRichTextDecorations">@color/ext_rich_text_decoration_dark</item>
<item name="android:statusBarColor">?colorM3Background</item>
<item name="android:navigationBarColor">?colorM3Background</item>